diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8f983b..3de662f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,9 +28,9 @@ jobs: permissions: contents: read pull-requests: read - uses: wellmanifest/new-project/.github/workflows/governance.yml@d1f35ed1b8be60f50a6739984c947a30379ead5b + uses: wellmanifest/new-project/.github/workflows/governance.yml@dc2240c22d49391845fef07f32664f37b904504f with: - standard-ref: d1f35ed1b8be60f50a6739984c947a30379ead5b + standard-ref: dc2240c22d49391845fef07f32664f37b904504f trusted-reviewers: ${{ vars.TRUSTED_REVIEWERS }} trusted-validator-apps: ${{ vars.TRUSTED_VALIDATOR_APPS }} diff --git a/.governance/governance_check.py b/.governance/governance_check.py index 416f45c..a1ceaea 100755 --- a/.governance/governance_check.py +++ b/.governance/governance_check.py @@ -4062,12 +4062,19 @@ def resolve_validation_base( return supplied_base active = active_ticket_records(root, config, records) adoption_records = standard_adoption_records(active) - if len(adoption_records) != 1: + deliveries = [record.intent["delivery"] for record in adoption_records if record.intent is not None] + if not deliveries: return None - record = adoption_records[0] - assert record.intent is not None - delivery = record.intent["delivery"] - return published_adoption_validation_base(root, delivery, head) or delivery["acceptedBaseSha"] + # Fresh published clones retain historical adoption prose but not external + # terminal receipts. Establish the latest integration's range before its + # changed-ticket filter decides ownership; do not declare tickets terminal. + if len({delivery["targetBranch"] for delivery in deliveries}) == 1: + published_base = published_adoption_validation_base(root, deliveries[0], head) + if published_base is not None: + return published_base + if len(deliveries) != 1: + return None + return deliveries[0]["acceptedBaseSha"] def check_change_lease(root: Path, report: Report) -> None: diff --git a/.governance/manifest.base.json b/.governance/manifest.base.json index e27bbc4..22a7dbe 100644 --- a/.governance/manifest.base.json +++ b/.governance/manifest.base.json @@ -110,7 +110,7 @@ "stacks": [], "standard": { "id": "wellmanifest/new-project", - "version": "0.20.21" + "version": "0.20.22" }, "ticket": { "activeStatuses": [ diff --git a/.governance/manifest.json b/.governance/manifest.json index c88bff5..8c4c74d 100644 --- a/.governance/manifest.json +++ b/.governance/manifest.json @@ -274,7 +274,7 @@ ], "standard": { "id": "wellmanifest/new-project", - "version": "0.20.21" + "version": "0.20.22" }, "ticket": { "activeStatuses": [ diff --git a/.governance/manifest.lock.json b/.governance/manifest.lock.json index 04053d4..362139d 100644 --- a/.governance/manifest.lock.json +++ b/.governance/manifest.lock.json @@ -39,10 +39,10 @@ ".governance/error/GOV-WORKTREE-OVERLAP.md": "65a2533f13e63d6ebeeb63c07adc0794ea9e04075a91e873eff2d79910239b0e", ".governance/error/README.md": "e8486dd29f52ca3fee96ed6881a62c38141864cde5aa1adea2b16d22b2feefaa", ".governance/generate_required_checks.py": "a017f06203e3c186dd97bc3c3a183e0352f5f11b2f49701e61cac98e86c00cba", - ".governance/governance_check.py": "5336377d54ab8239cf1b1c7ee576523cc6e134d3f817be940c4248d88bbff01d", + ".governance/governance_check.py": "48a1cf1231031e6f1216ae556a4ca5434c1e3e775c246990e16d78708fe2176d", ".governance/intent.schema.json": "7baa32440e3ae5bf1ada32359154b35038134ba2dee4dbf25d9435a12f62ab0c", ".governance/lock.schema.json": "ad80c98f800a4a3310870336dcdaf0aa689cc4988f71084d25d76bea2df1242f", - ".governance/manifest.base.json": "986b581a686cd526eca602fcc0ec25042e0c21f907f24e60cce415490481461b", + ".governance/manifest.base.json": "be9de0a7709e973bd59fdbc4191291054cb8a001e1338450d660f3e398b54095", ".governance/manifest.schema.json": "5aa2ccd3f6898834d4e39a78342448145490be56aa132e16ac7c9d64acef8f73", ".governance/package-manifest.json": "a06a0b84d9b4f9f9c30b5523e40db50f33de3490b1006c29cd03cd1e2b58b1b2", ".governance/precommit_standard_update.py": "c91e2bf9ae9d6ccc77bce0e61450c818a5961edee5bfde3b60426da88e296b0f", @@ -94,7 +94,7 @@ "id": "wellmanifest/new-project", "publicationStatus": "published", "sourceRepository": "wellmanifest/new-project", - "sourceRevision": "d1f35ed1b8be60f50a6739984c947a30379ead5b", - "version": "0.20.21" + "sourceRevision": "dc2240c22d49391845fef07f32664f37b904504f", + "version": "0.20.22" } } diff --git a/package.json b/package.json index 3173132..9ed728d 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "email": "tom@sapletta.com" }, "wellmanifest": { - "standard": "0.20.21", - "revision": "d1f35ed1b8be60f50a6739984c947a30379ead5b", + "standard": "0.20.22", + "revision": "dc2240c22d49391845fef07f32664f37b904504f", "gate": "project/governance-check.sh" } } diff --git a/project/ticket-103/README.md b/project/ticket-103/README.md new file mode 100644 index 0000000..062863c --- /dev/null +++ b/project/ticket-103/README.md @@ -0,0 +1,35 @@ +# Ticket 103: Adopt repeated published adoption validation + +- **ID**: ticket-103 +- **Owner**: unresolved:human +- **Status**: IN_PROGRESS +- **Workflow state**: PUBLICATION +- **Created**: 2026-09-10 + +## Goal and scope + +Adopt published wellmanifest/new-project 0.20.22 at +`dc2240c22d49391845fef07f32664f37b904504f`, independently merged in source PR 320. +The previous main run failed governance because a fresh published clone retained +multiple historical adoption tickets without local terminal receipts. The +upstream regression covers repeated adoptions while preserving explicit bases, +clean-published-head checks and conservative handling of ambiguous targets. + +SESSION_EXECUTION_AUTHORIZATION: the user authorized the isolated 0.20.22 release +and continuation through green CI. This authorizes the bounded adoption, tests, +ticket-branch push and independent protected review/merge; it is not a review +receipt or permission to bypass a required check. + +Change only the generated adoption payload and exact workflow/package bindings. +Preserve runtime features, historical ticket prose, generated reports and other +sessions' dirty changes. Raw logs and receipts remain outside Git. + +## Acceptance criteria + +- [x] AC-01: The immutable 0.20.22 adoption and target-owned revision bindings pass the managed gate. +- [ ] AC-02: Local verify, smoke and Docker smoke pass; independent exact-head review/merge and fresh main CI succeed. + +## 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-103/intent.json b/project/ticket-103/intent.json new file mode 100644 index 0000000..1763615 --- /dev/null +++ b/project/ticket-103/intent.json @@ -0,0 +1,85 @@ +{ + "schema": "new-project.intent/v3", + "ticket": "ticket-103", + "summary": "Adopt repeated published adoption validation", + "workstream": "governance", + "classification": { + "kind": "BUG", + "priority": "P1", + "origin": "health" + }, + "allowedPaths": [ + "project/ticket-103/**", + ".governance/governance_check.py", + ".governance/manifest.base.json", + ".governance/manifest.json", + ".governance/manifest.lock.json", + ".github/workflows/ci.yml", + "package.json", + "pyproject.toml" + ], + "forbiddenPaths": ["project/ticket-*/user-*.md"], + "stacks": ["node", "docker"], + "dependsOn": [], + "conflictsWith": [], + "integrationTicket": null, + "delivery": { + "acceptedBaseSha": "78b1e854be01e12c80dd529cb08213cdf81ad064", + "targetBranch": "main", + "outcome": "Fresh published main validates the latest integration even after repeated standard adoptions, without weakening protected tests or independent approval.", + "nonGoals": [ + "No runtime or extractor changes.", + "No historical ticket, TODO or generated-report rewrites.", + "No required-check, Docker or independent publication bypass." + ], + "complexity": "M", + "estimatedMinutes": 25, + "budgets": { + "maxImplementationFiles": 9, + "maxAffectedComponents": 3, + "maxPublicInterfaceChanges": 0, + "maxRuntimeDependencies": 0 + }, + "architecture": { + "status": "accepted", + "decision": "Adopt the immutable standard revision independently merged in wellmanifest/new-project PR 320 after its final annotated release. Preserve target-owned customization and change only exact workflow and package revision bindings.", + "components": [ + {"name": "managed-governance", "paths": [".governance/**", ".github/workflows/ci.yml"]}, + {"name": "package-bindings", "paths": ["package.json", "pyproject.toml"]} + ], + "responsibilityChanges": false, + "interfaceChanges": [], + "dataChanges": [], + "ui": {"impact": "none", "states": [], "evidence": []}, + "rollback": "Adopt prior immutable d1f35ed1b8be60f50a6739984c947a30379ead5b through a separately validated material change." + }, + "runtimeDependencies": [], + "validation": [ + { + "criterion": "AC-01", + "commands": [ + "./project/governance-check.sh --base 78b1e854be01e12c80dd529cb08213cdf81ad064", + "goal governance adopt --check --source-revision dc2240c22d49391845fef07f32664f37b904504f" + ], + "evidence": "Published immutable adoption and exact-base governance receipts; fresh merged clone also passes without an explicit base or local terminal receipts." + }, + { + "criterion": "AC-02", + "commands": ["make verify", "make smoke", "make docker-smoke"], + "evidence": "Local test receipts, independent exact-head Validator receipt and observed fresh main CI." + } + ], + "standardAdoption": { + "sourceRepository": "wellmanifest/new-project", + "fromRevision": "d1f35ed1b8be60f50a6739984c947a30379ead5b", + "toRevision": "dc2240c22d49391845fef07f32664f37b904504f", + "targetOwnedTransitions": [ + { + "path": ".github/workflows/ci.yml", + "baseDigest": "d48855bdf01fe75700f207a9912c25549014e1e1b7891ef89884ba85eea37aca", + "headDigest": "1df26e17643da8770264c54a4f2380bfabff1b57bd7356cf7c229c4643010790" + } + ] + } + } +} diff --git a/pyproject.toml b/pyproject.toml index 8dc0efd..e2615d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,8 +18,8 @@ packages = ["todo2code"] py-modules = ["todo2code_sdk"] [tool.wellmanifest] -standard = "0.20.21" -revision = "d1f35ed1b8be60f50a6739984c947a30379ead5b" +standard = "0.20.22" +revision = "dc2240c22d49391845fef07f32664f37b904504f" gate = "project/governance-check.sh" [tool.pytest.ini_options]