Skip to content

feat: enforce and verify Goal main publication rules - #137

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
goal/ticket-095
Sep 8, 2026
Merged

feat: enforce and verify Goal main publication rules#137
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
goal/ticket-095

Conversation

@tom-sapletta-com

@tom-sapletta-com tom-sapletta-com commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Goal main previously had no server-side protection. Version and activate two separate GitHub rulesets: mandatory current-base Python 3.12/3.13 and governance checks, current independent PR approval, resolved review threads, and no force-push/deletion or gate bypass; a separate update rule admits only the protected Validator App, which cannot bypass those gates.

Add 14 tests and a read-only verifier. Both existing CI jobs verify the publicly visible live rules; bypass actors require administrator visibility and are verified separately during deployment. Matrix check names are expanded from the existing workflow rather than requiring the non-existent bare test context.

Validation: 743 product tests passed, 2 existing skips; 14 protection tests passed; governance, Compose and full live GitHub readback passed. Rulesets 22551288 and 22551290 are active. The independent publication path was verified by Goal PR #136 after approved Validator registry 1.3.58 (Validator PR #380). This PR adds ongoing drift detection. Independent exact-head approval and merge succeeded; post-merge CI passed on Python 3.12/3.13, including all 14 protection tests and live public-rule verification: https://github.com/semcod/goal/actions/runs/34239831172. Administrator readback confirmed the declared bypass actors. GitHub rule suite 3988892004 records pass for all four gate rules; the publisher exception applies only to its separate update restriction. Ticket: ticket-095.

@tom-sapletta-com tom-sapletta-com changed the title [ticket-095] feat: enforce main publication with GitHub rulesets feat: enforce and verify Goal main publication rules Sep 8, 2026

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

Deterministic Validator approval for exact head 8e4466267e1528e53b1457cf95853e2706cab289.

Ticket: ticket-095
Correlation ID: goal-pr-137-ticket-095
Model: zai/glm-5.3
Reviewed diff chunks: 2
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 2 diff chunk(s). Chunk adds a declarative main-protection policy, a read-only verifier, and unit tests. The policy enforces deletion/non-fast-forward protection, independent PR review with stale dismissal and last-push approval, strict required status checks matching the CI matrix, and a narrowly scoped update-rule bypass for the Validator App integration only. The verifier performs no writes and includes pagination refusal guards and drift detection against live GitHub rulesets. All CI checks in test_results_data pass. | Chunk 2 adds protection test coverage (drift, bypass, ordering, API failure cases), a CI step running the read-only verifier with the scoped github.token, and ticket documentation. No dangerous workflow changes: the token is used only for read-only live rule verification, no secrets are exposed or exfiltrated, and tests assert failures on drift rather than suppressing them.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.

Actual PR impact radar

Exact range: aeb032d9fb3db2e70f5bf090b82575ecc2b599a0...8e4466267e1528e53b1457cf95853e2706cab289
Change digest: bf21d0037edaff01143e6739320aae024a7bfbd492d79af58f4d7da3d37e16e1
Score: 72/100 (L), estimated 74 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":442,"base_sha":"aeb032d9fb3db2e70f5bf090b82575ecc2b599a0","binary_files":0,"categories":{"code":1,"configuration":3,"docs":1,"tests":1},"change_digest":"bf21d0037edaff01143e6739320aae024a7bfbd492d79af58f4d7da3d37e16e1","comparison":"aeb032d9fb3db2e70f5bf090b82575ecc2b599a0...8e4466267e1528e53b1457cf95853e2706cab289","deletions":0,"file_count":6,"files":["github/main-protection.json","github/scripts/check_main_protection.py","github/tests/test_main_protection.py","github/workflows/ci.yml","project/ticket-095/README.md","project/ticket-095/intent.json"],"head_sha":"8e4466267e1528e53b1457cf95853e2706cab289","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":4,"scope":4,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":74,"within_budget":false},"impact":{"components":["3.12","force-push","github","project"],"files":["3.12/3.13","force-push/deletion","github/main-protection.json","github/scripts/check_main_protection.py","github/tests/test_main_protection.py","github/workflows/ci.yml","project/ticket-095/README.md","project/ticket-095/intent.json"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":72,"split":{"parts":[{"estimated_minutes":16,"name":"Implement 3.12","scope":["3.12"]},{"estimated_minutes":16,"name":"Implement force-push","scope":["force-push"]},{"estimated_minutes":16,"name":"Implement github","scope":["github"]},{"estimated_minutes":16,"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-095"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-095: feat: enforce and verify Goal main publication rules</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,30 105,51 79,85 54,78 31,53" 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 · 74m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-095-2933
TICKET ticket-095
HEAD_SHA 8e4466267e1528e53b1457cf95853e2706cab289
CORRELATION_ID goal-pr-137-ticket-095
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / enforce=PASS","test (3.13)=PASS","governance / remote lifecycle=PASS","test (3.12)=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 superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"aeb032d9fb3db2e70f5bf090b82575ecc2b599a0","head_sha":"8e4466267e1528e53b1457cf95853e2706cab289","change_digest":"bf21d0037edaff01143e6739320aae024a7bfbd492d79af58f4d7da3d37e16e1","score":72,"complexity":"L","estimated_minutes":74,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "zai/glm-5.3"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit 64e433b into main Sep 8, 2026
4 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the goal/ticket-095 branch September 8, 2026 14:40
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