diff --git a/.crumb b/.crumb index 969eba4..da1e058 100644 --- a/.crumb +++ b/.crumb @@ -3,14 +3,14 @@ "generated": { "children": [], "children_root": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "compiled_at": "2026-10-30T02:45:42Z", + "compiled_at": "2026-10-31T11:06:08Z", "compiler": "crumb-compile/1", - "digest": "sha256:3608cd20218bfba79866fec8aec75e5d75483f9708acc1c8c5765fb803d8fcc4", + "digest": "sha256:afd6980ce178bd547afeec7e8ae8dda3b9be098ceaf14ea6a38f3e19ca533290", "evidence_files": 63, "evidence_root": "sha256:490153d15f32b2c3a501ec7777f3acbd024889e03f4062026743b10306bd20de", - "files": 80, - "generated_at_commit": "90bfb601224738481e363b8da7f0f65b2b6dd79a", - "source_tree": "sha256:f98eb4b192f71039b6feb39a31d453c863ddc543c81cec110ac0d81494c2fb03" + "files": 84, + "generated_at_commit": "6b38a9d1264de1f71543fcc8b1346059719e8d30", + "source_tree": "sha256:142fb1c9c8dd2e9ac9df9bb8f1ee4b9213a667f6f1b08e51528892eacde97fe7" } }, "invariants": [ diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..c0337ff --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +# Dependabot: monthly version updates for the pinned GitHub Actions and the Cargo lockfile. +# Pull requests only; nothing merges itself. Security advisories are handled by GitHub +# Dependabot security updates on the repository settings. +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + - package-ecosystem: cargo + directory: / + schedule: + interval: monthly + versioning-strategy: lockfile-only diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3af3eb5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +# CI: build and test with the committed Cargo.lock (--locked refuses any silent dependency +# drift) on a GitHub-hosted runner, with pinned actions and read-only token permissions. +# A second job writes an SPDX SBOM of the tree so auditors can diff what a commit contains. +name: CI +on: + pull_request: + push: + branches: [main] +permissions: + contents: read +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable + - name: Toolchain record + run: rustc --version && cargo --version + - name: Build + run: cargo build --locked --all-targets + - name: Test + run: cargo test --locked + sbom: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: anchore/sbom-action@66cbf4bc1f1c0d2edc94016e65bc221b6bb0ad6c # v0.24.3 + with: + path: . + format: spdx-json + artifact-name: sbom-${{ github.sha }}.spdx.json diff --git a/AUDIT_SCOPE.md b/AUDIT_SCOPE.md new file mode 100644 index 0000000..b591105 --- /dev/null +++ b/AUDIT_SCOPE.md @@ -0,0 +1,108 @@ +# Audit scope + +Written for an outside, independent security audit. Revision described: +`c0e11da06565a812c7384982a2a14d8352325993` on `main`, 2026-10-31. Everything below is taken from the repository's own files at +that revision; items marked NOT_RUN were not executed while writing this document. + +## What this repository is + +The source of the INTERPLANE website. A Cargo workspace with one crate, `crates/site-builder` +(version 0.2.0, `publish = false`): `facts.rs` (488 lines) reads the protocol repository through +`gh api`, `page.rs` (397) holds the copy and the Maud markup, `routes.rs` (67) names the six +routes (Overview, Quick Start, Concepts, Adapter, Conformance, Status), `discovery.rs` (168) +writes the JSON-LD block, `robots.txt`, `sitemap.xml` and `llms.txt` and checks them, and +`main.rs` (362) has the `facts`, `build` and `verify` commands and tests. `public/` holds +`style.css` and `hero.webp`. `scripts/sync-to-hub.sh` (71 lines) is the deploy job. `dist/` and +`facts.json` are generated and ignored. Licence AGPL-3.0-or-later. + +## What to review, in priority order + +1. `crates/site-builder/src/page.rs`: every place a fact string is placed into markup. Maud + escapes `(expr)` by default. The one `PreEscaped` (`page.rs:74`) inserts + `discovery::script`: JSON-LD built with `serde_json`, with `&`, `<`, `>`, U+2028 and U+2029 + written as `\u` escapes, inside one `