Skip to content

fix(governance): forward --bootstrap-native-adoption from goal adopt (ticket-191) - #193

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/191-bootstrap-native-adoption
Oct 23, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/191-bootstrap-native-adoption

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Fixes the goal side of wellmanifest/new-project#499.

Problem

After goal governance adopt in a committed repository without governance, the first ./project/new-ticket.sh fails:

  • without a digest: GOV-WORK-START-001 / pending-delta;
  • with --bootstrap-adoption-digest: RECONCILE, because .subactor/receipts/bootstrap-adoption.json does not exist.

Since 0.20.84, create_adoption_lock.py --bootstrap-native-adoption writes exactly that receipt (bootstrapKind: fresh). goal never forwarded the flag.

Reproduction of the fix (new-project v0.20.101 f784fae, scratch repository)

  1. A committed README.md/.gitignore, plus prerequisites.
  2. Generator with --bootstrap-native-adoption --upgrade → adopted … 0.20.101, receipt written (fresh, 123 files, bound to HEAD).
  3. work_start_check.py --bootstrap-adoption-digest <dirtyDigest> → NEW_TICKET_CANDIDATE.
  4. new-ticket.sh … --bootstrap-adoption-digest <dirtyDigest> allocates ticket-001 with its canonical worktree.

Change

  • goal governance adopt --bootstrap-native-adoption is forwarded to the pinned generator and rejected together with --pre-commit.
  • After a successful non---check adoption where HEAD has no .governance/manifest.json, and without the flag, goal prints the first-ticket route on stderr.
  • No automatic bootstrap: the standard requires an explicit operator decision.

Validation

  • 5 new tests in tests/test_governance_cmd.py: forwarding, the note for a fresh repository, no note with committed governance or --check, and the --pre-commit conflict. Negative control: 3 fail on main; the other 2 assert that the note is absent.
  • Full suite: 999 passed, 2 skipped. ruff clean. ./project/governance-check.sh: PASS.

🤖 Generated with Claude Code

…(ticket-191)

A committed repository adopted with goal governance adopt could not allocate
its first ticket: the adoption delta is pending on main and no
bootstrap-adoption receipt existed (wellmanifest/new-project#499). The pinned
generator has supported --bootstrap-native-adoption since 0.20.84, but goal
never forwarded it.

goal governance adopt now forwards an explicit --bootstrap-native-adoption,
rejects it with --pre-commit, and after adopting a repository whose HEAD has
no .governance/manifest.json prints the first-ticket route instead of leaving
the operator at pending-delta.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@ifuri-validator-agent ifuri-validator-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validator approval after policy checks for exact head 58137137af4b671fd8f816c5ccd98563f1e83c4c.

Ticket: ticket-191
Correlation ID: local-semcod-goal-pr-193-ticket-191
Model: openai/cursor-auto
Reviewed diff chunks: 1
Advisory LLM verdict: REQUEST_CHANGES
Advisory summary: Reviewed all 1 diff chunk(s). Required checks pass, and the forwarding, bootstrap guidance, committed-governance, and pre-commit paths are covered. However, the new mutating bootstrap option remains combinable with check mode.
Advisory findings: --bootstrap-native-adoption is forwarded even when --check is set. Bootstrap adoption writes a receipt, so this combination can mutate the target during a command expected to perform a read-only check. The test generator visibly writes .bootstrap-native before processing --check, demonstrating the unsafe combination. Reject --check with --bootstrap-native-adoption (or otherwise guarantee non-mutation) and add a regression test.
The LLM output above is advisory and was not used as the approval trust root.
Semantic review prerequisite: not_required; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.

Actual PR impact radar

Exact range: 297279a030a3182baa634c0b6bc7ea8ce34e48c2...58137137af4b671fd8f816c5ccd98563f1e83c4c
Change digest: 4a107d4f79d5893bd51be7abcb98e149e96bd7fd82ed8048473b23c777a6503b
Score: 64/100 (L), estimated 83 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":245,"base_sha":"297279a030a3182baa634c0b6bc7ea8ce34e48c2","binary_files":0,"categories":{"code":1,"configuration":1,"docs":2,"tests":1},"change_digest":"4a107d4f79d5893bd51be7abcb98e149e96bd7fd82ed8048473b23c777a6503b","comparison":"297279a030a3182baa634c0b6bc7ea8ce34e48c2...58137137af4b671fd8f816c5ccd98563f1e83c4c","deletions":3,"file_count":5,"files":["goal/cli/governance_cmd.py","project/TICKETS.md","project/ticket-191/README.md","project/ticket-191/intent.json","tests/test_governance_cmd.py"],"head_sha":"58137137af4b671fd8f816c5ccd98563f1e83c4c","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":2,"scope":5,"uncertainty":3,"validation":1},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":83,"within_budget":false},"impact":{"components":["claude.com","goal","governance","project","subactor","tests","wellmanifest"],"files":["claude.com/claude-code","goal/cli/governance_cmd.py","governance/manifest.json","project/TICKETS.md","project/governance-check.sh","project/new-ticket.sh","project/ticket-191/README.md","project/ticket-191/intent.json","subactor/receipts/bootstrap-adoption.json","tests/test_governance_cmd.py","wellmanifest/new-project"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":64,"split":{"parts":[{"estimated_minutes":11,"name":"Implement claude.com","scope":["claude.com"]},{"estimated_minutes":11,"name":"Implement goal","scope":["goal"]},{"estimated_minutes":11,"name":"Implement governance","scope":["governance"]},{"estimated_minutes":11,"name":"Implement project","scope":["project"]},{"estimated_minutes":11,"name":"Implement subactor","scope":["subactor"]},{"estimated_minutes":15,"name":"Validate and project to trackers","scope":["tests","planfile","github/gitlab/jira projections"]}],"reason":"estimated_minutes_exceed_budget","recommended":true},"standards":[{"id":"wellmanifest/dsl","revision":"6c60fc4e0dd1f1bb74f46a7745e28019908d1203","version":"0.1.0-dev"},{"id":"wellmanifest/ticket-lifecycle","revision":"5bf581907a87b46a13a73e6c033d3abe4d9a306f","version":"0.1.0-dev"},{"id":"wellmanifest/git-lifecycle","revision":"7d77d4b7af57e69bc75c3a0290b3a4805c5c4438","version":"0.2.0-dev"},{"id":"wellmanifest/logs","revision":"48c284ef7a069055c0bcb6b900147ce5e65f8b43","version":"0.3.0"}],"ticket_ref":"ticket-191"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-191: fix(governance): forward --bootstrap-native-adoption from goal adopt (ticket-191)</title><rect width="128" height="128" rx="12" fill="#f8fafc"/><g stroke-width="1"><polygon points="64,55 72,61 69,71 59,71 56,61" fill="none" stroke="#d7dde5"/><polygon points="64,47 80,59 74,78 54,78 48,59" fill="none" stroke="#d7dde5"/><polygon points="64,38 89,56 79,85 49,85 39,56" fill="none" stroke="#d7dde5"/><polygon points="64,30 97,53 84,92 44,92 31,53" fill="none" stroke="#d7dde5"/><polygon points="64,21 105,51 89,99 39,99 23,51" fill="none" stroke="#d7dde5"/><line x1="64" y1="64" x2="64" y2="21" stroke="#aab4c0"/><line x1="64" y1="64" x2="105" y2="51" stroke="#aab4c0"/><line x1="64" y1="64" x2="89" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="39" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="23" y2="51" stroke="#aab4c0"/></g><polygon points="64,21 105,51 79,85 59,71 48,59" fill="#fb923c" fill-opacity="0.45" stroke="#c2410c" stroke-width="2"/><circle cx="64" cy="64" r="3" fill="#c2410c"/><g font-family="sans-serif" font-size="7" fill="#334155"><text x="64" y="11" text-anchor="middle">SCO</text><text x="114" y="48" text-anchor="middle">COU</text><text x="95" y="107" text-anchor="middle">UNC</text><text x="33" y="107" text-anchor="middle">VAL</text><text x="14" y="48" text-anchor="middle">DEL</text></g><text x="64" y="124" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#0f172a">L · 83m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-191-1792
TICKET ticket-191
HEAD_SHA 58137137af4b671fd8f816c5ccd98563f1e83c4c
CORRELATION_ID local-semcod-goal-pr-193-ticket-191
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / remote lifecycle=PASS","test (3.12)=PASS","governance / enforce=PASS","test (3.13)=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["onedev/local-verify","test (3.12)","test (3.13)","governance / remote lifecycle","governance / enforce"]
INPUT required_checks_source = "protected registry + GitHub applied rules (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/goal","pull_request":193,"head_sha":"58137137af4b671fd8f816c5ccd98563f1e83c4c","base_sha":"297279a030a3182baa634c0b6bc7ea8ce34e48c2","diff_sha256":"6f5be50a877149913f404ef191451be032acc38a9956e0b3ae29d76694198513"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["goal/cli/governance_cmd.py","project/TICKETS.md","project/ticket-191/README.md","project/ticket-191/intent.json","tests/test_governance_cmd.py"]},"grounding":"full-diff-not-per-finding-proof","execution_authority":false,"status":"not_required","reason":null,"review_sha256":null,"unresolved":[]}
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"297279a030a3182baa634c0b6bc7ea8ce34e48c2","head_sha":"58137137af4b671fd8f816c5ccd98563f1e83c4c","change_digest":"4a107d4f79d5893bd51be7abcb98e149e96bd7fd82ed8048473b23c777a6503b","score":64,"complexity":"L","estimated_minutes":83,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "REQUEST_CHANGES" MODEL "openai/cursor-auto"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit d3ebb26 into main Oct 23, 2026
5 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/191-bootstrap-native-adoption branch October 23, 2026 08:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant