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
12 changes: 8 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
Expand All @@ -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 }}
2 changes: 1 addition & 1 deletion PROJECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
6 changes: 3 additions & 3 deletions docs/adr/0001-groundatlas-project-control-gate.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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;
Expand All @@ -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.
8 changes: 5 additions & 3 deletions docs/specs/project-control-gate.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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

Expand All @@ -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`.
6 changes: 3 additions & 3 deletions project.manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
}
6 changes: 4 additions & 2 deletions test/project-control.node-test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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'))
})
Expand Down