Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: GitHub Pages

on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:

permissions:
contents: read

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
name: Build static web distribution
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install content-validation dependencies
run: python -m pip install --disable-pip-version-check PyYAML jsonschema

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
components: rustfmt, clippy

- name: Cache Rust build state
uses: Swatinem/rust-cache@v2

- name: Install pinned Trunk
run: cargo install trunk --version 0.21.14 --locked

- name: Validate source and simulation boundary
run: |
make check
python3 scripts/static_rust_sanity.py
python3 scripts/build_course_pack.py
python3 scripts/verify_manifest.py

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Generate the content pack before verifying the manifest

In a clean GitHub Actions checkout, this command always fails because MANIFEST.sha256 requires dist/DGX_Lab_SLURM_Fundamentals_v1.0.0.dgxlabpack, while /dist/ is ignored and the file is not tracked; neither make check nor static_rust_sanity.py generates it. Consequently every Pages run exits here before the static build, upload, or deployment. Generate the pack first or exclude generated artifacts from manifest verification.

Useful? React with 👍 / 👎.


- name: Set GitHub project-site base path
run: echo "PAGES_BASE_PATH=/${GITHUB_REPOSITORY#*/}/" >> "$GITHUB_ENV"

- name: Build static Pages artifact
run: |
cargo metadata --locked --format-version 1 >/dev/null
cd crates/web-ui
trunk build --release --public-url "$PAGES_BASE_PATH"

- name: Validate static Pages artifact
run: python3 scripts/validate_pages_dist.py crates/web-ui/dist "$PAGES_BASE_PATH"

- name: Upload Pages artifact
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
uses: actions/upload-pages-artifact@v5
with:
path: crates/web-ui/dist

deploy:
name: Deploy public web distribution
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
needs: build
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
3 changes: 3 additions & 0 deletions .github/workflows/security-boundary.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ on:
- 'src-tauri/**'
- 'prototype/**'
- 'scripts/check_forbidden_apis.py'
- 'scripts/validate_pages_dist.py'
- '.github/workflows/pages.yml'
pull_request:
permissions:
contents: read
Expand All @@ -18,6 +20,7 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: python -m pip install --disable-pip-version-check PyYAML jsonschema
- run: python3 scripts/check_forbidden_apis.py
- name: Assert CSP and capability allowlist
run: python3 scripts/validate_all.py
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## Unreleased

- Added GitHub Pages as the public static web distribution.
- Added a repository-path-aware Trunk build, generated-artifact validation, and deployment workflow.
- Added public independence, local-execution, and browser-storage notices.
- Documented repository setup, trust boundaries, custom-domain migration, and rollback.

## 0.1.0-dev-pack — 2026-08-05

- Added DGX Lab PRD v1.0 and requirements traceability.
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ version = "0.1.0"
edition = "2024"
license = "Apache-2.0"
authors = ["DGX Lab contributors"]
repository = "https://example.invalid/dgx-lab"
repository = "https://github.com/sidataplus/DGX_Lab"
rust-version = "1.88"

[workspace.dependencies]
Expand Down
44 changes: 25 additions & 19 deletions MANIFEST.sha256
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@
aeac9b3ef812a24f379f8516078ed9fec8e9aea30d3052bc82571f4ef14d7a00 .github/dependabot.yml
949193274bb5b66db38744ae0475a272e784682bda5dcceefbe6974f67225c5c .github/pull_request_template.md
c2343e3bcbca8163fc5094fa749106ac62ab7060a6cc608e2ffd59f54b81d5ac .github/workflows/ci.yml
5d36d462e0ac613808e1120a502a6e66b2336850e1950c93f63f02e48d228315 .github/workflows/pages.yml
02d523396c0582dc194050eeec1bdd75c39dc85f8bea0f2b69cf873ce1431394 .github/workflows/release-blueprint.yml
7c0d8206830526e398531bb684dc1878a3f5c693ce1d666bd5ca6c743c847be0 .github/workflows/security-boundary.yml
579a7e86ad5341d706725aa48b61e1bdff8bbe6685b835a6f053968db3f4a5f8 .github/workflows/security-boundary.yml
c6c44e5d4675a1644e3324dc17c5795d09d5055c6a5d99577d4f28e7ed055db6 .gitignore
32b6e864cb51587c020d103b93f5c104b8a0fbc7ad9c60658c757ec9f496c272 CHANGELOG.md
f88e2b610dfad2b93d81394afa44ecd8add5d633271dfa74574b07d559b4892f CHANGELOG.md
334744126cf33bc893e29a5dec5bf491e81be97978878119b53c17e531e24cd3 CONTENT-LICENSE.md
33b25f921344c2db05aa21018320342c2a2e76d100b92400b0cef1cc9f8c3a66 CONTRIBUTING.md
8b50db4f2f2594d574fda3413fa179ac5bf493989e01cc16875e963f99e12335 Cargo.lock
583559e02128faf10af9464268132289d4e189d2b76facda9fd5d49b48ae9a2d Cargo.lock.NOT_GENERATED.md
f8c44a7fa9c8b3004b5e93a31c63db994626119c25ce40f099743c12e2a476da Cargo.toml
70b4ee55c0bc6f6c560d70c0656dbfbfdd2d74315ed01aa3a545b5329dbd2d22 Cargo.toml
a033dd6ee3b1aef3ba39126b6fc2c3002c266d60698f5a9db4fc8145ca2555af LICENSE
81252f4048abbf280f8b9977c67a56942d3d3970f58573970883dc10c4e7f6a3 Makefile
d4403145f55007dd77041ba93bc60265e6140c898372349040608ce9a8e76ee6 Makefile
bfd07db590fab27034c1f2640fe45718781e3c7a8bf6ede74b0df5cb1dab9f03 NOTICE
5b958cd6222dadaa62d816164b9eee540b4e12a8e82d4a00c62912c9761227cc README.md
8f656fec7315c089c97566a1417631b19645b7b51c97d36805b9f08ab570aaeb README.md
3dbbdf4a5a3ba3b6de3da1f673368274ee00982b7beae5912297e5e0b06aae6c SECURITY.md
eadf2458f40e72f62a6080f0e846aada57efea8fa7558b03eb3cba0fa1046947 TRADEMARKS.md
5c9c112fc83af1a2f8c196a676c8f81d1a28aab1ffe9bacd0e8265a150e2e20e VERSION
Expand Down Expand Up @@ -55,41 +56,41 @@ f8936fb38469507a87f308297fe6ad95260ab59495777ee4600b7b2c2338d355 course-src/slu
ad280cfc64e5efbbfe8247c79ca0349e14582452fb0f7e123189cc36d8599c15 course-src/slurm-fundamentals/labs/12-capstone/guide.md
9ec4d731d0d58ab410b7adc4c24f195d3924b2fae8203183a5fcfb175fde0cd9 course-src/slurm-fundamentals/labs/12-capstone/lab.yaml
89a29b259bcc39510a79ec44c1cb13c7778f868e4bda25c7f9c196ff7b1554eb crates/actors/Cargo.toml
1fe626a409f9d6ba161932ee5657f327e66d15b7bbba07f40e29188e0bd8c587 crates/actors/src/lib.rs
3caef511d560135c2deaefe32134ceafc146584d9d25ba35c3647783d0acd61a crates/actors/src/lib.rs
118f56b9a2c624a56d3b9109b2ed0cb8207384305cc9156db3f0ea23b6824696 crates/assessment/Cargo.toml
865a4477573fad7ec1065ce69805016678ec508b1c6b27262f83a7ca1b4e9c20 crates/assessment/src/lib.rs
efb1663a61c9f5a4e109c4999e292167ea87755ffd946d78f71481c186536334 crates/assessment/src/lib.rs
e946283b56852e6c07119d1ba527339c26c04d72483b49a22cd232bb37a97c6b crates/dgxlab-contracts/Cargo.toml
1eb0e589640963a2bea35f6554abf3f83e2c8b27b2a0eb1de9fad2ee8ea9b8e4 crates/dgxlab-contracts/src/lib.rs
ec6cbfd444800dc5366126a9e873d504e1d23dc59cacd9a7dbe8df6c14e5c7d5 crates/dgxlab-contracts/src/lib.rs
617caa968c63bc9f4b7df4db9091329d6a088ed948285384432de09f45c698f0 crates/grading/Cargo.toml
848533e6e6c98a4f7380f7dfaf8ad50426306f5f43defbde8ace5b37b3ceac3e crates/grading/src/lib.rs
5627c656d3cbb5c09bd2f6d2ace1888d1d6852f7bc0633bd78f0581352acf708 crates/persistence-codec/Cargo.toml
049f9a95ca3aca76309c33b9bf02371169713c71f1c191e57fdbf37c677be5e3 crates/persistence-codec/src/lib.rs
356a127397e0a1e12fd97f0e1d8412bc3f9e94d9f089efc92d839377c5049469 crates/persistence-codec/src/lib.rs
2f8eb73acea0c815efa978660285b9d318cb756ebc4b197731cb724158a24d4f crates/report-renderer/Cargo.toml
9b26e9cdea14a3ce081da6e20cc830dea1e9a8e3c267bffbb31b689144b1b174 crates/report-renderer/src/lib.rs
57f2590c1edc88330bdc18a29472ca015989f1d241a0c4d18aa3b140dc8cc19e crates/scenario-compiler/Cargo.toml
99e166afcfde1edf1dee53f6aa389ac8c85f3ac7a55e447fa8a6a7dc73e63744 crates/scenario-compiler/src/main.rs
2ad1f505ca29396b24a0ee5a0759b171993f060570de29fa64ae534f25060172 crates/scenario-compiler/src/main.rs
8f7009ecef5968aeac1351fd4e60f7ff8d5376f20e10f2f6b31e0e57231578a1 crates/scenarios/Cargo.toml
b8d93f66e4580e5654e795d18d0fcb2949a968b5e8902b923ace6be31a512c89 crates/scenarios/src/lib.rs
25a92f9fe5fec8196232935a40179315e83bddcd8ee90ce8962d41f3d8d53434 crates/scheduler/Cargo.toml
0237222e3ef66c774223399123df5f4e492c55ce26f6169865a879a3555bea21 crates/scheduler/src/lib.rs
68be5548b90ceb284a21cadfdd2879a653090552d6939dce78e8b4218e032188 crates/scheduler/src/lib.rs
39ef4cfd4efab902f36d60832884b019b3d309bd6ef82295cf1b25fb1eb78602 crates/sim-core/Cargo.toml
96bfec9f21f1e2eeee464675c192360231e5623f3429cdafd94ea7426dc22c42 crates/sim-core/src/lib.rs
ff9ff77bd1bd31aad5ea856517e9f808b8622ecfe50dda4d9c49eff9644a8fab crates/sim-core/src/lib.rs
77d893e04f6a96d0c661133467822e52f8f5dcaa045e8f45a2f93405084d884e crates/sim-session/Cargo.toml
455f1d0b262a7e07257154ce4b09584f8601a75a633c09bc92d93bf6cd72bc79 crates/sim-session/src/cert_bank.rs
b087188477ff15b30f0195eba1327be4eb588bd4e2fb34b8103eeaef3bf3376e crates/sim-session/src/cert_bank.rs
846313974edf90391f8101a60b2a3f2d13c4e364cf3b12454d2d2214c1efbcab crates/sim-session/src/course.rs
39ea64bacfff0cf59c3cd71c757377692d5591d592194bf7e3d8a4b97155ea2c crates/sim-session/src/lab04.rs
b7c9181b07949ce5017832fd979412670bec1907ff64a8e0c2c88b54935280ad crates/sim-session/src/lab06.rs
6cd8e3134e4e382b9116ed13695024d8b0301388c0aa6a23b2f4a0519c0caed0 crates/sim-session/src/lab07.rs
f054391eb8d2e3fb8c1c7d67bb025f5f8a544f482d30e696b6daca9c6e9d7d4b crates/sim-session/src/lab09.rs
9dc94626f08ad2149b32d359787ddf32e484a1f6c5bc35b3dc31b9fefc47dff3 crates/sim-session/src/lib.rs
74ae9b8a62aa2bc85e690fd36abf25791dd80a5b8c6634fa878d45127786261d crates/sim-session/src/lib.rs
3c34f048ae5f2e63512ebb43c2a75dbe5d8974d81aa04cd21776995cacec9fdc crates/sim-session/src/pending.rs
f99f340de1a64508e9bfc3ced2b2364c88fae2786c5e66990b5adef59d2676c6 crates/sim-session/tests/parity_lab04_scaffold.rs
b76911e8cc3364eec84fa5644f87034fba84d1a94925ee37f84ff68bf3d5ce2d crates/sim-worker-wasm/Cargo.toml
cfacf3663fae72602685f48b1eb3173d918643a81d5618996f12daec0eb90bdd crates/sim-worker-wasm/src/lib.rs
39825da597080d3abe7e125844d719c434157f906207c57df78143e4db8c2786 crates/sim-worker-wasm/src/lib.rs
edc8616d7e2ad9670925ccfa7c02d16af7246511d83b34f1a8357efcc796622f crates/slurm-model/Cargo.toml
d1192629701b0ca2727a68150389e6a6fbe6c86b3a43c42b14ce64c3c9012691 crates/slurm-model/src/lib.rs
6cfa761c803c6f7a25b1df9e3a8aaf38e5af7f8e0760e3c2a24c5cdb171b26e4 crates/slurm-model/src/lib.rs
8d2693b53ef0bcdb7ccdb2e607248e217697bfa4b1564123b6bbbfdffff5c05b crates/virtual-fs/Cargo.toml
d018f4abd3b1f24119c5c60403be8fde1e828c8d9d831848c526170bd112db64 crates/virtual-fs/src/lib.rs
22ca0e6dc2d423f719ed1fc6ea4d9cec48d5aab9afcedd7e0da828bf7617b218 crates/virtual-fs/src/lib.rs
2fe6720a03a0a3a8bd2c1bf58f1091d2bf84da68ed66d857a725ff633b6ba55b crates/virtual-shell/Cargo.toml
a9da58111f629154b5979e9aa7d759c06123ff0c83f51511ba1a14f1c3bbf24b crates/virtual-shell/src/lib.rs
94199e2c4266508d91b7e36c95d5dbf9ad5781e886fe37399abca64f19e8b6e1 crates/web-ui/Cargo.toml
Expand All @@ -98,15 +99,16 @@ ef7dda1ff1f3af1332f63bfb33f2b01389c2d74b93ce9d5c93aa34f9399ef613 crates/web-ui/
1d9506a4155489dc2d52df2e8bc0cecd39371b9f51f0db09cc3ec110596ad95d crates/web-ui/dist/style-86b3632c245ac7f3.css
3f1840337eea92ef4e86697fb59589ce28d88df04b1c435887c5249b8ee2ad1a crates/web-ui/dist/web-ui-f961d7fae81dd101.js
f8986ca86a1f7aec7a1e6c6649cae9e63264bbba4d9cf742de42687a1a3edb46 crates/web-ui/dist/web-ui-f961d7fae81dd101_bg.wasm
0161ac66f9db29b1afde173fce2490fa8da279e727584b7533bd7832b40fc27f crates/web-ui/index.html
e986746ec40461a295774409ea8bb54fd6d766708834aaaf190da9e000c4e778 crates/web-ui/index.html
24bd1baa53f6c906097dfb2c924e0204f5ed13bc9dc08dc5fd1ede87a92900ae crates/web-ui/public.css
8d074f16804980915bb73756da6de904bd3bc63916685a4e0cb597cd5b3ba7c0 crates/web-ui/src/app.rs
9277c64111bff9e1924f4444d8e8a61519b38db5b27d500b7ed8020d1306ff4b crates/web-ui/src/bridge.rs
5af2a554eeddf75943aa6c2c3208f3be3c719fb84a8c70826bea65c395042d4a crates/web-ui/src/learning.rs
e8d1a2cd11f5ae98a9f0f5fbf035910c7cbaa9e6061283efccf0c349bbf8140e crates/web-ui/src/lib.rs
0a1c112d8ff274d0c0deac304c545acefe3f793e8deed90f465d3da23aff67d2 crates/web-ui/src/persist.rs
1d9506a4155489dc2d52df2e8bc0cecd39371b9f51f0db09cc3ec110596ad95d crates/web-ui/style.css
2b618a4324404a17f7bb1dfb70d0c9cd38ba83e1ccdde0654dd4f1372afa6b75 crates/workloads/Cargo.toml
d4aea514115c9263d3f8270083b835ee8dcedac6be1c97720fa5ac523b8defc9 crates/workloads/src/lib.rs
e7c87f5c171418cad33876e39d216bcc02a3536c307b27065f8c18ed739e453a crates/workloads/src/lib.rs
c0e1427d6c9dadeba65b1670323eecff1e7fcbb13e54dd75d6de0b6813eebd01 deny.toml
9f0102e019911c46b20936ff5c1ade57be1c331c9217bcc1dd755058f3e75e25 dist/DGX_Lab_SLURM_Fundamentals_v1.0.0.dgxlabpack
7b4fc7385dd518a21d149f14578a0b03cf948ebad862ff4baf0240d938b9438b docs/ARCHITECTURE.md
Expand All @@ -131,6 +133,7 @@ d0324894185571d86acc5f3ebff0b8a7a0f9cd12c6c4866816359856ef6b6efc docs/adr/0007-
6e96d816955eefc39968aaa9e0b01e98dcdcd7f8c3592adede1b1a49c3b9a638 docs/adr/0008-local-certification-trust.md
77c2a84ade2af1fa3155bc0d6077555f2238a01f460b6c078562b9d200754848 docs/adr/0009-generic-dgx-profile.md
b4262ba40d4414b15f2d32350236c203b6d8ba2f65ef08cb6b056dd2b2a1c7c8 docs/adr/0010-leptos-csr-and-worker-boundary.md
e168776cc57b98954e5d5ec79db423ac3c274ee58d11593f89bf3d66bea8a81b docs/adr/0011-github-pages-public-web.md
78941fa25d4db13efe0a795f5b338a409d9f8b720569af1daca575e643dd0027 docs/adr/README.md
45c18bff9bb4f434a4f8a6bd1f98ca14aa7c101f8985b5c31d1c225e4a8e7413 docs/content/COURSE_MAP.md
3efaa66539e495e8e53a58c4a1f355403aa4b73ed81935c1fdc134bdabe6b496 docs/design/MOCKUP_INDEX.md
Expand All @@ -148,6 +151,7 @@ dcc83ee211acee6853acd6b46af6bba96a7f1195872da41836a6108aed44da01 docs/reference
b0beb26021d265c7d5302007e8d6223f9e2b6f5ea980077bcd10135f7714e902 docs/reference/SLURM_COMMAND_MATRIX.md
48e0334673a3788f41db112988e7aad421e1b474c2f0c7b25eafc0f2fb864790 docs/runbooks/BUILD_RELEASE.md
8bba389584e3f36f4805f7fdff27d2aa6fa737dd119504fef39bae31941abe18 docs/runbooks/CONTENT_AUTHORING.md
0b63a97dabdb2db218ea66684324d74a46002d234a2bdff885a84525c8570574 docs/runbooks/GITHUB_PAGES.md
a990ecfc1d38f9f1242e9f10334aa71da1b5994ae2f79f467e3347448a566ad5 docs/runbooks/LOCAL_DEVELOPMENT.md
603ddd2430b5d6d62b47eae86672ca1a01ae2c9d739850363c6f69c4e81bbf57 docs/runbooks/SECURITY_REVIEW.md
3dc23d49b57c3ba4707aa41603f62e6f719d059bd25184098d4aeb86170d2c1c prototype/README.md
Expand Down Expand Up @@ -178,6 +182,7 @@ a9dafa68b579d2b57bc7328a9c9c9d4ab42cd0d0b67e2b25f89766c3356f6497 scripts/genera
ae68d98a2ff824e173a691e87817894c5c3fb91b20caa52c1fbeabc143a6deed scripts/run_static_checks.sh
34a6b2bcd10fc232c3f45378cbeec898ebbb4f3cc0a5d67b18ffb7e9a2e73f14 scripts/static_rust_sanity.py
4f5ca1e0af1685ea961f841d003139822d326fd73f6a0889bac1b2f213fc82e6 scripts/validate_all.py
327a088d5e952418db42517d2510649a1c99a03e2ac92097af9eea043474768e scripts/validate_pages_dist.py
ab7f73ff37df0ef8c6233b87bf3bea041c266bae8bd7e3ddd9dbb97f298674ef scripts/verify_manifest.py
b3d82a8e468e482bc507c6fdb90c136dcecefb5e7a81267059faa20eb1532a4d src-tauri/Cargo.toml
30e44cbd5a7e4c0378934d1f6f173b416fdcbf5ff74e54d228e2ae2dfa918913 src-tauri/README.md
Expand All @@ -200,3 +205,4 @@ fd6f96ec6ed1f7e677f621bdc7c89d640793a56090f4b1fa20d2cfb00e315b59 tests/replay/c
935907e7269a3737ebad49efcc52f15d791a70588e88bd658ffbb2f6e8e9a159 tests/replay/canonical_lab04_digest_test.rs
ac33d6653d2ce2a690dca5d86fced47822c35557424728ba2c95481006461940 tests/security/hostile-inputs.txt
1c43c0e95e7038dfc64b8eec4aa37b4ca05aec10124525202cf414c80d6451d8 tests/security/pack-cases.yaml
a0d7babc9662e6209a7e3dc88432469cded1dbc1fd3f29faa6f1d945e441e050 tests/test_validate_pages_dist.py
13 changes: 12 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
.PHONY: validate check test web tauri prototype clean
.PHONY: validate check test web web-release web-pages tauri prototype clean

# Prefer real toolchain binaries if ~/.cargo/bin rustup proxies are broken:
# export PATH="$HOME/.rustup/toolchains/stable-aarch64-apple-darwin/bin:$HOME/.cargo/bin:$PATH"

PYTHON ?= python3
PAGES_BASE ?= /DGX_Lab/

validate:
$(PYTHON) scripts/validate_all.py
$(PYTHON) scripts/check_forbidden_apis.py
$(PYTHON) -m unittest discover -s tests -p 'test_*.py'

check: validate
cargo fmt --all -- --check
Expand All @@ -21,6 +23,15 @@ test:
web:
cd crates/web-ui && trunk serve --port 1420 --address 127.0.0.1

web-release:
cargo metadata --locked --format-version 1 >/dev/null
cd crates/web-ui && trunk build --release

web-pages:
cargo metadata --locked --format-version 1 >/dev/null
cd crates/web-ui && trunk build --release --public-url "$(PAGES_BASE)"
$(PYTHON) scripts/validate_pages_dist.py crates/web-ui/dist "$(PAGES_BASE)"

# Desktop app: Tauri shell + Leptos CSR UI (Trunk on port 1420).
tauri:
cargo tauri dev
Expand Down
Loading
Loading