diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6689b99..95c13c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,20 +38,21 @@ jobs: - name: GroundAtlas package dogfood id: groundatlas - uses: SylphxAI/groundatlas@v0.1.2 + uses: SylphxAI/groundatlas@v0.1.3 with: - package-spec: groundatlas@0.1.2 + package-spec: groundatlas@0.1.3 output-dir: .groundatlas-pilot require-atlas: "true" strict: "true" - name: Assert GroundAtlas truth boundary run: | - node - "${{ steps.groundatlas.outputs.manifest-report-path }}" "${{ steps.groundatlas.outputs.fleet-report-path }}" <<'NODE' - const [manifestPath, fleetPath] = process.argv.slice(2); + node - "${{ steps.groundatlas.outputs.manifest-report-path }}" "${{ steps.groundatlas.outputs.fleet-report-path }}" "${{ steps.groundatlas.outputs.fleet-markdown-report-path }}" <<'NODE' + const [manifestPath, fleetPath, fleetMarkdownPath] = process.argv.slice(2); const { readFileSync } = require("node:fs"); const manifest = JSON.parse(readFileSync(manifestPath, "utf8")); const fleet = JSON.parse(readFileSync(fleetPath, "utf8")); + const fleetMarkdown = readFileSync(fleetMarkdownPath, "utf8"); const project = fleet.projects?.[0]; function assert(condition, message) { @@ -66,6 +67,8 @@ jobs: assert(project?.status === "adopted", "This repository must be adopted in the GroundAtlas fleet report."); assert(project?.manifest?.path === "project.manifest.json", "Fleet report must select project.manifest.json."); assert(project?.manifestAdapters?.some((item) => item.path === ".doctrine/project.json" && item.adapter === true), "Fleet report must keep .doctrine/project.json as an adapter."); + assert(fleetMarkdown.includes("# GroundAtlas fleet adoption report"), "Markdown fleet scorecard must include the report title."); + assert(fleetMarkdown.includes("Summary: 1 adopted, 0 warning, 0 blocked, 1 total."), "Markdown fleet scorecard must include the adopted summary."); NODE - name: Upload GroundAtlas reports @@ -76,3 +79,4 @@ jobs: path: | ${{ steps.groundatlas.outputs.manifest-report-path }} ${{ steps.groundatlas.outputs.fleet-report-path }} + ${{ steps.groundatlas.outputs.fleet-markdown-report-path }} diff --git a/PROJECT.md b/PROJECT.md index eb83b8b..e365e74 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -41,4 +41,4 @@ This repository owns the codec/conversion package monorepo, media format impleme ## Delivery -Pull requests and merge groups run package build/test validation, project-control boundary tests, and GroundAtlas package dogfooding in `.github/workflows/ci.yml`. Production proof is package tests, build for changed packages, codec fixture validation for affected formats, release workflow evidence, and package-registry readback for published versions. Generated `.groundatlas*` reports are evidence/navigation only, not source of truth. The current Biome/lint backlog is tracked as a separate adoption gap before lint becomes a required context. +Pull requests and merge groups run package build/test validation, project-control boundary tests, and GroundAtlas package dogfooding in `.github/workflows/ci.yml`. Production proof is package tests, build for changed packages, codec fixture validation for affected formats, release workflow evidence, and package-registry readback for published versions. Generated `.groundatlas*` files plus GroundAtlas JSON/Markdown reports are evidence/navigation only, not source of truth. The current Biome/lint backlog is tracked as a separate adoption gap before lint becomes a required context. diff --git a/README.md b/README.md index ad9d78a..6de8e99 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,14 @@ Codec owns generic codec/conversion package code, tests, progress tracking, and bun install --frozen-lockfile bun run validate node --test test/project-control.node-test.mjs -npm exec --yes --package groundatlas@0.1.2 -- ga fleet . --out .groundatlas-pilot --require-atlas --strict --json +npm exec --yes --package groundatlas@0.1.3 -- ga fleet . --out .groundatlas-pilot --require-atlas --strict --json ``` `bun run validate` runs the current release-critical package build and all-workspace package test baseline. The existing Biome/lint backlog is tracked in `.doctrine/project.json` as `lint-baseline` and should be fixed in a dedicated package-quality slice before lint becomes required CI. The all-workspace build backlog is tracked separately as `workspace-build-baseline`; CI preserves the existing release-critical build while running all workspace tests. ## Project Control and Release Proof -This repository dogfoods [GroundAtlas](https://github.com/SylphxAI/groundatlas) through CI. The vendor-neutral project facts live in `project.manifest.json`; Sylphx-specific governance facts stay in `.doctrine/project.json`; generated `.groundatlas*` reports are evidence/navigation only, not source of truth. +This repository dogfoods [GroundAtlas](https://github.com/SylphxAI/groundatlas) through CI. The vendor-neutral project facts live in `project.manifest.json`; Sylphx-specific governance facts stay in `.doctrine/project.json`; generated `.groundatlas*` files plus GroundAtlas JSON/Markdown reports are evidence/navigation only, not source of truth. Package releases run through the shared Sylphx release workflow and are complete only after CI, the Release workflow, and npm registry readback for changed codec packages. Codec behavior changes additionally require package tests, fixture evidence, and consumer smoke evidence for affected codec contracts. diff --git a/docs/adr/0001-groundatlas-project-control-gate.md b/docs/adr/0001-groundatlas-project-control-gate.md index d581821..ea20830 100644 --- a/docs/adr/0001-groundatlas-project-control-gate.md +++ b/docs/adr/0001-groundatlas-project-control-gate.md @@ -8,7 +8,7 @@ Accepted Codec is a public foundation package monorepo for media codec and conversion packages. It already had a main-branch Release workflow with trusted publish identity, but it did not expose a vendor-neutral project manifest, did not run PR/merge-group validation, and did not dogfood the released GroundAtlas package/action. -The project-control surface must not make `.doctrine/project.json` a public default and must not make generated `.groundatlas*` reports authoritative. This change must not alter codec behavior, WASM behavior, package versions, external codec licensing posture, or downstream media workflows. +The project-control surface must not make `.doctrine/project.json` a public default and must not make generated `.groundatlas*` files or GroundAtlas JSON/Markdown reports authoritative. This change must not alter codec behavior, WASM behavior, package versions, external codec licensing posture, or downstream media workflows. The current `bun run lint`/Biome baseline has a broad pre-existing backlog. Blocking this adoption slice on a repo-wide lint cleanup would hide the actual delivery boundary, so lint is recorded as a separate adoption gap and the CI gate uses the current release-critical build plus all-workspace test baseline. @@ -18,7 +18,7 @@ Add: - a vendor-neutral `project.manifest.json`; - a CI workflow that runs `bun run validate` and project-control tests; -- a CI step using `SylphxAI/groundatlas@v0.1.2` with `groundatlas@0.1.2`; +- a CI step using `SylphxAI/groundatlas@v0.1.3` with `groundatlas@0.1.3`; - assertions that GroundAtlas selects `project.manifest.json`, reports `.doctrine/project.json` only as an adapter, and has zero strict fleet warnings/blockers; - a small Node project-control boundary test; - README/PROJECT/AGENTS updates that clarify GroundAtlas as evidence/navigation, not SSOT; @@ -29,5 +29,5 @@ Add: - Pull requests and merge groups now get package build/test validation plus GroundAtlas package/action dogfooding. - `.doctrine/project.json` remains the Sylphx Doctrine adapter and local governance catalog. - Release proof remains a successful main Release workflow plus npm registry readback for changed packages. -- Generated `.groundatlas*` reports remain evidence/navigation only. +- Generated `.groundatlas*` files plus GroundAtlas JSON/Markdown reports remain evidence/navigation only. - Lint is not falsely presented as green; it is a separate cleanup slice before it can become a required context. diff --git a/docs/specs/project-control-gate.md b/docs/specs/project-control-gate.md index a28668d..9db1bc4 100644 --- a/docs/specs/project-control-gate.md +++ b/docs/specs/project-control-gate.md @@ -10,7 +10,7 @@ The gate validates repository control-plane facts only: - neutral identity and truth homes live in `project.manifest.json`; - Sylphx-specific governance facts remain in `.doctrine/project.json`; -- generated `.groundatlas*` outputs are evidence/navigation only; +- generated `.groundatlas*` files plus GroundAtlas JSON/Markdown reports are evidence/navigation only; - package validation for this slice is `bun run validate`, which runs the current release-critical package build and all-workspace package test baseline; - the existing `bun run lint`/Biome backlog is tracked as an adoption gap and must be fixed in a dedicated package-quality slice before lint becomes a required context; - package release proof remains the Release workflow plus npm registry/readback when versions change. @@ -25,9 +25,10 @@ It does not own application-specific media workflows, media storage/CDN behavior 2. install dependencies with `bun install --frozen-lockfile`; 3. run `bun run validate`; 4. run `node --test test/project-control.node-test.mjs`; -5. run `SylphxAI/groundatlas@v0.1.2` with `package-spec: groundatlas@0.1.2`, `require-atlas: "true"`, and `strict: "true"`; +5. run `SylphxAI/groundatlas@v0.1.3` with `package-spec: groundatlas@0.1.3`, `require-atlas: "true"`, and `strict: "true"`; 6. assert that GroundAtlas selects `project.manifest.json` and treats `.doctrine/project.json` only as an adapter; -7. upload the manifest and fleet reports as `groundatlas-package-dogfood`. +7. assert the Markdown fleet scorecard title and adopted summary; +8. upload the manifest, JSON fleet, and Markdown fleet reports as `groundatlas-package-dogfood`. ## Acceptance @@ -36,4 +37,5 @@ It does not own application-specific media workflows, media storage/CDN behavior - `ga audit` passes after `ga update`. - `ga manifest --json` selects `project.manifest.json`. - `ga fleet --require-atlas --strict --json` reports one adopted project with zero warnings and zero blockers. +- the Markdown fleet report contains the adopted summary. - The release workflow caller keeps `id-token: write`. diff --git a/project.manifest.json b/project.manifest.json index e114560..3c542fb 100644 --- a/project.manifest.json +++ b/project.manifest.json @@ -101,12 +101,12 @@ }, { "name": "groundatlas:fleet", - "command": "npm exec --yes --package groundatlas@0.1.2 -- ga fleet . --out .groundatlas-pilot --require-atlas --strict --json", - "purpose": "Prove the vendor-neutral manifest is selected and generated GroundAtlas files are navigation-only." + "command": "npm exec --yes --package groundatlas@0.1.3 -- ga fleet . --out .groundatlas-pilot --require-atlas --strict --json", + "purpose": "Prove the vendor-neutral manifest is selected and generated GroundAtlas JSON/Markdown reports are evidence-only." } ], "adoption": { "status": "adopted", - "notes": "Vendor-neutral GroundAtlas manifest for package/action dogfooding. .doctrine/project.json remains the Sylphx Doctrine adapter and local governance catalog. Generated .groundatlas* reports are evidence/navigation only, not source of truth. Existing lint baseline is tracked as a repo-local adoption gap and is not hidden by this gate." + "notes": "Vendor-neutral GroundAtlas manifest for package/action dogfooding. .doctrine/project.json remains the Sylphx Doctrine adapter and local governance catalog. Generated .groundatlas* files plus GroundAtlas JSON/Markdown reports are evidence/navigation only, not source of truth. Existing lint baseline is tracked as a repo-local adoption gap and is not hidden by this gate." } } diff --git a/test/project-control.node-test.mjs b/test/project-control.node-test.mjs index e293e5d..173490e 100644 --- a/test/project-control.node-test.mjs +++ b/test/project-control.node-test.mjs @@ -43,10 +43,12 @@ test('CI runs package validation and dogfoods the released GroundAtlas package/a assert.ok(workflow.includes('bun install --frozen-lockfile')) assert.ok(workflow.includes('bun run validate')) - assert.ok(workflow.includes('uses: SylphxAI/groundatlas@v0.1.2')) - assert.ok(workflow.includes('package-spec: groundatlas@0.1.2')) + assert.ok(workflow.includes('uses: SylphxAI/groundatlas@v0.1.3')) + assert.ok(workflow.includes('package-spec: groundatlas@0.1.3')) assert.ok(workflow.includes('require-atlas: "true"')) assert.ok(workflow.includes('strict: "true"')) + assert.ok(workflow.includes('fleet-markdown-report-path')) + assert.ok(workflow.includes('Summary: 1 adopted, 0 warning, 0 blocked, 1 total.')) assert.ok(workflow.includes('project.manifest.json')) assert.ok(workflow.includes('.doctrine/project.json')) })