Skip to content

fix(bootstrap): preserve trusted sources during governed publication - #186

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/184-read-only-publication-bootstrap
Oct 7, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/184-read-only-publication-bootstrap

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

SDK publication using goal -a --delivery-mode publish-only appended costs configuration and env templates and wrote uv.lock, then failed its own clean-source guard. Governed bootstrap now installs Python dependencies into the environment without writing configuration/locks or scaffolding tests; diagnostics remain read only and an installer failure cannot fall back to a mutating manager. Ungoverned bootstrap retains its existing behavior.

Validation: 985 passed, 2 skipped in the full Python suite; 84 focused bootstrap tests; managed governance passed with zero errors/warnings. Regression fixtures preserve source bytes and verify marker restoration on failure. Required for Willman PLF-112/GH172 publication. Exact HEAD remains frozen for OneDev and independent Validator.

@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 ba05b8649d93ea39875e5672419e39d8b1435b45.

Ticket: ticket-184
Correlation ID: local-semcod-goal-pr-186-ticket-184
Model: openai/cursor-auto
Reviewed diff chunks: 2
Advisory LLM verdict: REQUEST_CHANGES
Advisory summary: Reviewed all 2 diff chunk(s). Required checks pass, and the marker restoration and suppression of explicit configuration, diagnostics, and test-scaffolding writes are sound. However, the new read-only installation path does not reliably preserve the source tree. | The visible chunk adds regression tests confirming governed bootstrap uses the existing Python environment without invoking the mutating package manager, preserves the accepted lockfile, and does not fall back to a mutating installer after failure. No unresolved code or security defects are evident in this chunk. All protected required checks passed.
Advisory findings: goal/project_bootstrap.py: The GOAL_BOOTSTRAP_READ_ONLY path runs pip install -e .[...] directly in the project checkout. Editable pip/setuptools installations can create or update source-tree metadata such as *.egg-info, so this operation can still dirty the trusted checkout and trigger the clean-source guard it is intended to protect. Use an installation approach that cannot write into the checkout, or install from an isolated copy/build artifact and verify source-tree preservation.
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: c7512688912a01d18757442f75cdb8d3687ecb2d...ba05b8649d93ea39875e5672419e39d8b1435b45
Change digest: 30dcc1d5d83f0884be0afed6757ce57adb96a14774bff40876b9754338cd68d3
Score: 68/100 (L), estimated 84 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":213,"base_sha":"c7512688912a01d18757442f75cdb8d3687ecb2d","binary_files":0,"categories":{"code":2,"configuration":1,"docs":2,"tests":2},"change_digest":"30dcc1d5d83f0884be0afed6757ce57adb96a14774bff40876b9754338cd68d3","comparison":"c7512688912a01d18757442f75cdb8d3687ecb2d...ba05b8649d93ea39875e5672419e39d8b1435b45","deletions":9,"file_count":7,"files":["goal/project_bootstrap.py","goal/push/core.py","project/TICKETS.md","project/ticket-184/README.md","project/ticket-184/intent.json","tests/test_governed_cli_bootstrap.py","tests/test_project_bootstrap.py"],"head_sha":"ba05b8649d93ea39875e5672419e39d8b1435b45","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":3,"scope":5,"uncertainty":3,"validation":1},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":84,"within_budget":false},"impact":{"components":["PLF-112","configuration","errors","goal","project","tests"],"files":["PLF-112/GH172","configuration/locks","errors/warnings","goal/project_bootstrap.py","goal/push/core.py","project/TICKETS.md","project/ticket-184/README.md","project/ticket-184/intent.json","tests/test_governed_cli_bootstrap.py","tests/test_project_bootstrap.py"],"public_interfaces":[],"runtime_dependencies":1},"schema":"subactor.ticket-radar/v1","score":68,"split":{"parts":[{"estimated_minutes":13,"name":"Implement PLF-112","scope":["PLF-112"]},{"estimated_minutes":13,"name":"Implement configuration","scope":["configuration"]},{"estimated_minutes":13,"name":"Implement errors","scope":["errors"]},{"estimated_minutes":13,"name":"Implement goal","scope":["goal"]},{"estimated_minutes":13,"name":"Implement project","scope":["project"]},{"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-184"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-184: fix(bootstrap): preserve trusted sources during governed publication</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 39,56" 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 · 84m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-184-9425
TICKET ticket-184
HEAD_SHA ba05b8649d93ea39875e5672419e39d8b1435b45
CORRELATION_ID local-semcod-goal-pr-186-ticket-184
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["test (3.13)=PASS","test (3.12)=PASS","governance / remote lifecycle=PASS","governance / enforce=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["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":186,"head_sha":"ba05b8649d93ea39875e5672419e39d8b1435b45","base_sha":"c7512688912a01d18757442f75cdb8d3687ecb2d","diff_sha256":"8cba3d91a97f1c45c88870b992a039c78a68b8a09e70e0d661ed8c8b0634fbe6"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["goal/project_bootstrap.py","goal/push/core.py","project/TICKETS.md","project/ticket-184/README.md","project/ticket-184/intent.json","tests/test_governed_cli_bootstrap.py","tests/test_project_bootstrap.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":"c7512688912a01d18757442f75cdb8d3687ecb2d","head_sha":"ba05b8649d93ea39875e5672419e39d8b1435b45","change_digest":"30dcc1d5d83f0884be0afed6757ce57adb96a14774bff40876b9754338cd68d3","score":68,"complexity":"L","estimated_minutes":84,"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 ce911b7 into main Oct 7, 2026
5 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/184-read-only-publication-bootstrap branch October 7, 2026 19:54
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