Skip to content

Commit 2eaa2bc

Browse files
authored
Publish portable PortfolioTruth consumer contract (#210)
* feat(contract): publish portable PCC fixture * fix: align contract fixture envelopes * fix(contract): validate portable producer envelope * fix(demo): refresh canonical truth fixtures * fix(contract): fully validate fixture snapshots * fix(contract): verify serialized fixture fidelity * fix(demo): align canonical security risk count * fix(demo): make stale receipt age canonical * fix(contract): preserve stale provider envelopes * fix(contract): validate provider and category semantics * fix(contract): validate normalized evidence envelopes * fix(contract): validate repository state fidelity * fix(contract): honor evidence boundaries * fix(contract): close residual validation gaps * fix(contract): share producer coverage envelope * fix(contract): bind portfolio metadata decisions * fix(contract): remove obsolete attention alias * Pin portable evidence reason domains * Enforce producer evidence reachability * fix: bind portable fixtures to production contracts * fix: preserve exact upstream branch identity * fix: bind upstream displays to configured remotes * fix: stabilize portfolio publication clocks * fix: bind live normalized security evidence * fix: order final publication revalidation * fix: normalize unborn worktree heads
1 parent 2418f1e commit 2eaa2bc

37 files changed

Lines changed: 118885 additions & 31519 deletions

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ jobs:
2525
run: |
2626
python -m pip install --upgrade pip
2727
pip install -e ".[dev,serve,semantic]"
28+
- name: Verify portable PortfolioTruth consumer contract
29+
run: python scripts/generate_portfolio_truth_contract_fixture.py --check
2830
- name: Run tests
2931
run: python -m pytest tests/ -v --tb=short
3032
- name: Lint with ruff

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ Treat campaign/writeback, GitHub Projects, Notion sync, catalog overrides, score
113113
- Public-safe recording plan: [DEMO-PLAN.md](DEMO-PLAN.md)
114114
- Product brief: [docs/product/operator-os-product-brief.md](docs/product/operator-os-product-brief.md)
115115
- Public fixture proof package: [docs/demo-proof/public-fixture/README.md](docs/demo-proof/public-fixture/README.md)
116+
- Portable PCC contract: [fixtures/contracts/portfolio-command-center-v1/manifest.json](fixtures/contracts/portfolio-command-center-v1/manifest.json)
116117
- proof-pr dogfood: [docs/proof-pr-dogfood.md](docs/proof-pr-dogfood.md)
117118
- Product modes: [docs/modes.md](docs/modes.md)
118119
- Web UI operator guide: [docs/audit-serve.md](docs/audit-serve.md)
@@ -226,6 +227,19 @@ audit serve --output-dir output/demo
226227
To record the Portfolio Command Center wedge from the same fixture, follow
227228
[DEMO-PLAN.md](DEMO-PLAN.md) and point the desktop app at `output/demo/`.
228229

230+
The smaller PCC compatibility fixture is fixed-clock and deterministic. GHRA
231+
owns its manifest, schema identity, generator, and digest; PCC pins the exact
232+
producer commit separately so the artifact never needs a self-referential Git
233+
hash. Because the synthetic fixture is not emitted by an attested producer
234+
checkout, its canonical `producer` evidence is intentionally empty; partial or
235+
invented producer evidence fails the same validation gate used for publication.
236+
Regenerate or verify it with:
237+
238+
```bash
239+
python scripts/generate_portfolio_truth_contract_fixture.py
240+
python scripts/generate_portfolio_truth_contract_fixture.py --check
241+
```
242+
229243
### Quick start (subcommand form)
230244

231245
```bash
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"consumer": {
3+
"compatibility_policy": "additive-0.x",
4+
"repository": "saagpatel/PortfolioCommandCenter"
5+
},
6+
"contract_version": "ghra-pcc-portfolio-truth.v1",
7+
"fixture": {
8+
"additive_canary_paths": [
9+
"contract_fixture",
10+
"projects[0].additive_contract_canary"
11+
],
12+
"coverage_states": [
13+
"complete",
14+
"partial",
15+
"stale",
16+
"unknown"
17+
],
18+
"evaluation_time": "2026-08-01T06:00:00+00:00",
19+
"generated_at": "2026-08-01T00:00:00+00:00",
20+
"producer_evidence": "absent",
21+
"project_count": 4,
22+
"security_evidence_semantics": "synthetic-cross-receipt-state-matrix"
23+
},
24+
"portfolio_truth_schema_version": "0.11.0",
25+
"producer": {
26+
"artifact_path": "fixtures/contracts/portfolio-command-center-v1/portfolio-truth.json",
27+
"artifact_sha256": "ba3000833f1cd9c89442948ebe51f7e405e7832333a69c6f7347fb2fbfae254a",
28+
"generator": "src.portfolio_truth_contract_fixture:build_contract_fixture",
29+
"manifest_path": "fixtures/contracts/portfolio-command-center-v1/manifest.json",
30+
"repository": "saagpatel/GithubRepoAuditor"
31+
}
32+
}

0 commit comments

Comments
 (0)