From e34c84c02509fda02e0a65b0ffc4b499cf909078 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Tue, 20 Oct 2026 23:56:07 +0200 Subject: [PATCH 1/2] fix(governance): re-pin adoption projection digest and guard it in pytest (ticket-092) ticket-089 added errors/** to .governance/manifest.json without updating the ten standard-adoption artifact digests, so governance / enforce has failed on main since 2026-10-19 with STD-ADOPTION-DRIFT. Re-pin only artifacts[] to the reviewed manifest; adoption levels and evidence records are unchanged. The local gate does not run standard_pack_check.py, which is why the drift passed locally. A unit test now runs it so the next manifest edit fails in pytest instead of only in CI. Co-Authored-By: Claude Opus 5.5 --- .governance/standard-adoption.json | 20 ++--- project/TICKETS.md | 1 + project/ticket-092/README.md | 20 +++++ project/ticket-092/intent.json | 83 +++++++++++++++++++ .../unit/test_standard_adoption_projection.py | 29 +++++++ 5 files changed, 143 insertions(+), 10 deletions(-) create mode 100644 project/ticket-092/README.md create mode 100644 project/ticket-092/intent.json create mode 100644 tests/unit/test_standard_adoption_projection.py diff --git a/.governance/standard-adoption.json b/.governance/standard-adoption.json index a3329c6..ebad986 100644 --- a/.governance/standard-adoption.json +++ b/.governance/standard-adoption.json @@ -19,7 +19,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -64,7 +64,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -109,7 +109,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -149,7 +149,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -194,7 +194,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -239,7 +239,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -279,7 +279,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -324,7 +324,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -359,7 +359,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ @@ -399,7 +399,7 @@ "artifacts": [ { "target": ".governance/manifest.json", - "sha256": "38aa1ec77db50246ad91443c949526c5b6d1797f7ea87bd9a6265794995ceb27" + "sha256": "e7310b392851e3d87935717ad165e5c3aef005769c058c29a1aa83060a5892c4" } ], "evidence": [ diff --git a/project/TICKETS.md b/project/TICKETS.md index cd09b39..2e8b3a4 100644 --- a/project/TICKETS.md +++ b/project/TICKETS.md @@ -92,4 +92,5 @@ This file indexes governance tickets without taking ownership of | **ticket-088** | [`README.md`](./ticket-088/README.md) | - | - | - | - | - | | **ticket-089** | [`README.md`](./ticket-089/README.md) | - | - | - | - | - | | **ticket-090** | [`README.md`](./ticket-090/README.md) | - | - | - | - | - | +| **ticket-091** | [`README.md`](./ticket-091/README.md) | - | - | - | - | - | diff --git a/project/ticket-092/README.md b/project/ticket-092/README.md new file mode 100644 index 0000000..c0b93bc --- /dev/null +++ b/project/ticket-092/README.md @@ -0,0 +1,20 @@ +# Ticket 092: Re-pin standard adoption projection digest after ticket-089 manifest change + +- **ID**: ticket-092 +- **Owner**: unresolved:human +- **Status**: IN_PROGRESS +- **Workflow state**: EDIT +- **Created**: 2026-10-20 + +## Goal and scope + +To be completed from human-owned input. + +## Acceptance criteria + +- [ ] AC-01: Scope is approved by a human owner. + +## Tracking boundary + +This directory contains the minimal reviewed intent. Optional participant prose +and raw command logs are not required delivery output. diff --git a/project/ticket-092/intent.json b/project/ticket-092/intent.json new file mode 100644 index 0000000..0cd5bde --- /dev/null +++ b/project/ticket-092/intent.json @@ -0,0 +1,83 @@ +{ + "schema": "new-project.intent/v3", + "ticket": "ticket-092", + "summary": "Re-pin standard adoption projection digest after ticket-089 manifest change", + "workstream": "application", + "classification": { + "kind": "BUG", + "priority": "P1", + "origin": "requested" + }, + "allowedPaths": [ + "project/ticket-092/**", + "TODO.md", + "project/TICKETS.md", + ".governance/standard-adoption.json", + "tests/unit/test_standard_adoption_projection.py" + ], + "forbiddenPaths": [ + "project/ticket-*/user-*.md" + ], + "stacks": [], + "dependsOn": [], + "conflictsWith": [], + "integrationTicket": null, + "delivery": { + "acceptedBaseSha": "75434327996a30b00080d5ea1e370d7b1c7014d8", + "targetBranch": "main", + "outcome": "The governance enforce job passes again: standard-adoption artifact digests pin the current reviewed .governance/manifest.json changed by ticket-089.", + "nonGoals": [ + "No change to adoption levels or evidence records", + "No standard upgrade or managed checker change", + "No change to .governance/manifest.json" + ], + "complexity": "S", + "estimatedMinutes": 15, + "budgets": { + "maxImplementationFiles": 2, + "maxAffectedComponents": 1, + "maxPublicInterfaceChanges": 0, + "maxRuntimeDependencies": 0 + }, + "architecture": { + "status": "accepted", + "decision": "Re-record only the artifacts[].sha256 projection digest for .governance/manifest.json in the ten adoption records. Evidence entries stay as historical observations; strengthening S3-S5 evidence is a separate adoption task.", + "components": [ + { + "name": "standard-adoption", + "paths": [ + ".governance/standard-adoption.json", + "tests/unit/test_standard_adoption_projection.py" + ] + } + ], + "responsibilityChanges": false, + "interfaceChanges": [], + "dataChanges": [], + "ui": { + "impact": "none", + "states": [], + "evidence": [] + }, + "rollback": "Revert the commit; enforce fails again with STD-ADOPTION-DRIFT." + }, + "runtimeDependencies": [], + "validation": [ + { + "criterion": "AC-01", + "commands": [ + "python3 .governance/standard_pack_check.py --root . --format json", + "python -m pytest tests/unit/test_standard_adoption_projection.py" + ], + "evidence": "project/ticket-092/README.md" + }, + { + "criterion": "AC-02", + "commands": [ + "./project/governance-check.sh" + ], + "evidence": "project/ticket-092/README.md" + } + ] + } +} diff --git a/tests/unit/test_standard_adoption_projection.py b/tests/unit/test_standard_adoption_projection.py new file mode 100644 index 0000000..e26a153 --- /dev/null +++ b/tests/unit/test_standard_adoption_projection.py @@ -0,0 +1,29 @@ +"""The adopted standard packs keep their managed projection digests current. + +CI ``governance / enforce`` runs ``standard_pack_check.py``; the local gate does +not. Running it here makes a manifest edit without a matching +``standard-adoption.json`` update fail in pytest instead of only in CI. +""" + +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] + + +def test_standard_pack_check_reports_no_findings(): + result = subprocess.run( + [sys.executable, ".governance/standard_pack_check.py", "--root", ".", "--format", "json"], + cwd=ROOT, + capture_output=True, + text=True, + timeout=120, + ) + report = json.loads(result.stdout) + assert report["findings"] == [], report["findings"] + assert report["ok"] is True + assert result.returncode == 0 From 9adb42ae6fa5c01c260fe332dece999f4dc2935c Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Tue, 20 Oct 2026 23:56:18 +0200 Subject: [PATCH 2/2] style(tests): explicit check=False in adoption projection test (ticket-092) Co-Authored-By: Claude Opus 5.5 --- tests/unit/test_standard_adoption_projection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/test_standard_adoption_projection.py b/tests/unit/test_standard_adoption_projection.py index e26a153..7b9256f 100644 --- a/tests/unit/test_standard_adoption_projection.py +++ b/tests/unit/test_standard_adoption_projection.py @@ -22,6 +22,7 @@ def test_standard_pack_check_reports_no_findings(): capture_output=True, text=True, timeout=120, + check=False, ) report = json.loads(result.stdout) assert report["findings"] == [], report["findings"]