chore: adopt wellmanifest new-project 0.20.25 - #139
Conversation
05415e5 to
3c111ff
Compare
There was a problem hiding this comment.
Validator approval after policy checks for exact head 3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd.
Ticket: ticket-099
Correlation ID: local-semcod-goal-pr-139-ticket-099
Model: openrouter/z-ai/glm-5.3-flash
Package advisory authority: ADVISORY (promotion FORBIDDEN)
Package digest: 4f618bdc3e03daae7660ac7cb71d629cc8f34bcb322725a778487e224b535753
Package evidence digest: 5fef5a5c5615434282581ca6ca67b91a07a0bbfd38ed6711887e9a6ba262bc04
Package files: 35; high-risk samples: .githooks/pre-commit, .governance/branch_lifecycle_check.py, .governance/change_lease_check.py
Reviewed diff chunks: 22
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 22 diff chunk(s). This chunk of a governance standard-pack adoption (new-project 0.20.25) makes four coherent changes: (1) ticket identifiers widened from exactly three digits to three-or-more, consistently in the pre-commit branch regex and the approval-evidence schema pattern; (2) SQLite ticket-storage support in .githooks/pre-commit with a fail-closed 'unknown ticket storage mode' branch and an early return so SQLite transitions skip the Git carrier-commit check; (3) agent_host_check.py gains a tomllib/tomli fallback that degrades to tomllib=None on interpreters without either reader, with targeted skips for the Python ecosystem check so 3.11+ jobs still enforce the declaration; (4) two behavior-preserving refactors: reconcile_criterion_disposition extracted from reconcile in branch_intent_reconciliation.py (disposition rules for implemented/partial/superseded/missing/unknown are unchanged) and parse_snapshot_pulls extracted from parse_snapshot in branch_lifecycle_check.py (PR number validation, dedup, and field checks are unchanged). All required checks pass per test_results_data (test 3.12, test 3.13, governance/enforce, governance/remote lifecycle), so approval is permitted. | Chunk 2 of 22: (1) relaxes the change-evaluation ticket pattern from exactly 3 digits to 3+ digits, consistent with the ticket-099 adoption; (2) refactors change_lease_check.py by extracting validate_publication_lease_fields, transition_identity_error, transition_phase_error, transition_receipt, and replacement_receipt_error — extracted logic is behavior-preserving relative to the removed inline code; (3) refactors check_required_checks.py by extracting bound_check_pairs and introducing an own_identity helper (regex-based remote-URL parsing plus os/subprocess usage, whose body falls into the next chunk). All protected required checks (test 3.12, test 3.13, governance / remote lifecycle, governance / enforce) report PASS, and the reported test run shows 743 passed, 2 skipped with no failures. | Chunk 3 of 22 refactors .governance/check_required_checks.py: extracts source_for_check and print_check_success helpers and adds a new check_instance_identity gate that rejects required-checks instances declaring another repository (including the unadapted template identity), preserving prior exit codes (1 for identity errors, 2 for missing source). generate_required_checks.py mechanically extracts inspect_declaration; governance_check.py extracts delivery_classes_valid/delivery_profiles_valid helpers with unchanged logic. The decision-record schema relaxes the ticket pattern from ^ticket-[0-9]{3}$ to ^ticket-[0-9]{3,}$, consistent with ticket-099. All four protected required checks pass. | Chunk 4 refactors delivery/intent validation into reusable helpers (standard_adoption_header_error, validate_intent_value, parse_ticket_state_text, adoption_path_list_valid) and adds external ticket-record loading (sqlite/snapshot support via ticket_input.py). Refactors preserve original validation semantics: the standardAdoption takeover check now correctly uses value['fromRevision'] post-header-validation, and regex list validation was extracted without behavior change. All protected required checks pass (test 3.12/3.13, governance/remote lifecycle, governance/enforce), and the PR reports 743 passed / 2 skipped tests. No security issues in the visible code. | Chunk 5 of a governance tooling adoption (wellmanifest 0.20.25). Changes are behavior-preserving refactors of .governance/governance_check.py: extraction of dependency_is_terminal, unowned_scope_files, and decomposition of validate_domain_contract_graph into focused helpers (validate_domain_source, validate_domain_operation_header, validate_domain_models, validate_domain_commands, validate_domain_projections, validate_domain_queries, validate_domain_events, validate_domain_errors, validate_domain_error_status). Validation logic and error messages appear unchanged; composition in validate_domain_contract_graph preserves original ordering and data flow (models/commands/projections/event_index threaded correctly). All required checks pass (test 3.12, test 3.13, governance/enforce, governance/remote lifecycle) and the reported test run shows 743 passed, 2 skipped. | This chunk refactors existing governance checks (check_ticket_content split into virtual/file variants; check_delivery_base decomposed into observe/check helpers) with no behavioral regressions visible in the moved code. It adds support for database-backed virtual tickets, widens the ticket identifier regex to ticket-[0-9]{3,}, and extends the package manifest's allowlisted extendable mappings to include the required-checks template source with a documented backward-compatibility rationale. New verify_managed_base logic for managed-strategy takeover/restoration digests is coherent. All protected required checks (test 3.12/3.13, governance/enforce, governance/remote lifecycle) pass. | Chunk 7 of a standard-pack adoption (wellmanifest/new-project 0.20.25). Changes are largely behavior-preserving refactors: managed-base verification extracted into verify_managed_base, adoption-transition checks extracted into verify_adoption_transitions, and ticket-record scoping extracted into change_scoped_records. New functionality: CLI flags for external ticket snapshot validation (--ticket-database/--ticket-snapshot/--ticket-snapshot-sha256) with CI/local mode distinction, and published_adoption_validation_base to bound implicit adoption validation in fresh clones using origin remote refs. Error handling on load_external_ticket_records routes exceptions to a GOV-INTENT-002 report entry and returns None rather than raising, which changes behavior from fail-loud to fail-reported — appears intentional per the help text. All required protected checks pass (test 3.12/3.13, governance enforce, remote lifecycle); the extra onedev/local-verify pass is informational. | Chunk 8 of a standard-upgrade PR (wellmanifest/new-project 0.20.16 → 0.20.25). Changes are consistent: ticket-ID regexes relaxed from ^ticket-[0-9]{3}$ to ^ticket-[0-9]{3,}$ in intent.schema.json and both manifests, matching the new ticket-099; manifest.lock.json hashes updated for all corresponding managed files including the new ticket-activity-override.schema.json. All protected required checks (test 3.12/3.13, governance/enforce, governance/remote-lifecycle) pass, plus onedev/local-verify. | This chunk (9 of 22) of the wellmanifest/new-project 0.20.25 adoption contains manifest digest refreshes for updated managed files, package-manifest entries for new managed components (ticket_input.py, ticket_storage.py, ticket-activity-override schema), a required-checks source path change to the template file, a remediation-intent ticket regex widened from exactly-3 to 3+ digits, and new logic in precommit_standard_update.py that distinguishes staleness (newer published standard) from drift (managed files no longer matching the pinned lock). The staleness-only bypass is fail-closed: it requires the stable DIAGNOSTIC marker in Goal's output AND staged_managed_drift() to return an empty tuple, while None (unreadable evidence) or any drift keeps the commit refused. The git cat-file --batch parsing also fails closed on malformed output. All protected required checks (test 3.12, test 3.13, governance/remote lifecycle, governance/enforce) and onedev/local-verify pass. | This chunk of the remediation_intent.py changes is primarily a behavior-preserving refactor: evidence, applicability, and diagnostic-transition validation blocks were extracted into helper functions (_validate_finding_evidence, _validate_finding_applicability, _validate_finding_transition) and called from _validate_findings with identical logic and error codes. New helpers for action verification coverage, path scope checks, risk rules, and dependency cycle detection are consistent with existing validation patterns. The TICKET_ID regex loosening to ticket-[0-9]{3,} is a minor compatible widening. All protected required checks (test 3.12/3.13, governance / remote lifecycle, governance / enforce) and the local-verify check pass; PR cites 743 passed tests and governance validation runs. | Chunk 11 is a behavior-preserving refactor of the governance intent validator: large inline validation logic in _validate_actions is extracted into _validate_action_verifications, _validate_action_paths, _validate_action_risk, and _validate_action_dependencies, and the criteria/guidance/t2c checks are split into _validate_planning_guidance, _validate_todo2code_contract, and _validate_finding_criteria. The extracted logic matches the removed inline code (verification coverage, path scope/forbidden checks, DESTRUCTIVE/STATE_RISK risk rules, dependency graph with unknown-dep and cycle errors, and transitive P0/P1 RELEASE dependency enforcement). One duplicate empty line after _validate_planning_guidance is cosmetic. Required checks (test 3.12/3.13, governance/enforce, governance/remote lifecycle) all PASS with no failed checks reported. | This chunk primarily refactors existing governance validation logic in remediation_intent.py: the finding affectedPaths validation is extracted into _validate_finding_paths and unresolved-path detection into _validate_unresolved_paths, both preserving prior semantics (including status-dependent error/warning routing and 'unresolved:agent' sentinel handling). New functionality adds acceptance-criteria validation (non-empty array, exact fields, ID pattern, dedup, cross-references to findings/verifications, and verification coverage of findings) plus calls to _validate_finding_criteria, _validate_planning_guidance, and _validate_todo2code_contract. Cross-reference coverage checks are deterministic and add stricter consistency enforcement. No security concerns; no secrets, workflow changes, or privilege escalation in this chunk. All protected required checks pass (test 3.12/3.13, governance enforce, remote lifecycle), so approval is consistent with branch policy. | Chunk 13 is a behavior-preserving refactor of .governance/remediation_intent.py: monolithic render_llm and analyze_todo2code functions split into focused helpers (_render_findings, _projected_plan_items, _analyze_plan_scope, _analyze_finding_coverage, _analyze_criterion_coverage, _analyze_diagnostics) and CLI command bodies extracted into _write_todo2code_projection/_verify_todo2code_command. The reassembled analyze_todo2code call sequence (scope → finding coverage → criterion coverage → diagnostics) matches the original inlined logic, and validation logic in _projected_plan_items is unchanged. A partial start of standard_pack_check.py catalog_findings refactor is visible at the chunk edge but assessed within its own chunk. All protected required checks (test 3.12, test 3.13, governance/enforce, governance/remote lifecycle) PASS. | Chunk 14 of a governance standard upgrade (wellmanifest 0.20.25). Main change in .governance/standard_pack_check.py is a behavior-preserving refactor: catalog_findings and adoption_findings decomposed into helper functions (catalog_ownership_findings, catalog_profile_findings, adoption_record_findings, adoption_record_index) with identical validation logic, findings IDs, and ordering. Also relaxes terminal-receipt ticket pattern from exactly 3 digits to 3+ digits and introduces a new ticket-activity-override schema with a missingPolicy enum extension. Schema tightening (path pattern, additionalProperties) is reasonable. All protected required checks (test 3.12, test 3.13, governance/remote lifecycle, governance/enforce) pass. | Chunk 15 of 22 modifies .governance/ticket_activity.py: refactors terminal receipt validation into _validate_terminal_receipt (behavior-preserving), adds an opt-in override mechanism for the missing-registry policy, and introduces git-ancestry delivery verification (delivery_landed / _unmerged_ticket_branch) for tickets whose receipt registry is absent. Default remains the conservative status-projection policy; git-ancestry is strictly opt-in via a strictly-validated override file. Refactors maintain field validation, SHA/timestamp/branch regex checks, and receiptRef uniqueness. All required protected checks (test 3.12/3.13, governance enforce, remote lifecycle) pass, as does local verification. | Chunk 16 shows refactoring and a new ticket-input module with strong defensive validation: symlink/hardlink rejection, digest binding of documents and files, strict JSON key uniqueness, path traversal rejection, SQLite read-only/query-only/trusted_schema=OFF access, bounded sizes, private DB mode enforcement, and snapshot-outside-git-checkout enforcement. The validate_receipt_lifetime extraction in ticket_allocation.py is a behavior-preserving refactor. All protected required checks (test 3.12/3.13, governance/enforce, governance/remote lifecycle) passed, plus local verify. | Chunk 17 refactors work_continuity.py by extracting checkpoint progress/effect validation into helper functions with equivalent constraints (bounded arrays, unique idempotency keys, non-overlapping criteria, nextAction must remain unfinished). New ticket_storage.py bridges to a digest-pinned Registry runtime with strict validation: SHA-256 pin format and digest match, 1MB bounded runtime files, symlink checks, subprocess timeout, ticket identity regex, single-line title enforcement, and generic error output that avoids echoing inputs or stderr. ticket_input.py snapshot decoding enforces exact key sets, binding equality, execution/merge authorization false, duplicate ticket rejection, and bounded snapshot size. All protected required checks (test 3.12, test 3.13, governance/enforce, governance/remote lifecycle) pass. | Chunk 18 of the ticket-099 standard adoption PR contains mostly mechanical refactors in .governance/work_continuity.py, workspace_lifecycle_check.py, and worktree_overlap_check.py: checkpoint validation extracted into validate_checkpoint_progress, adoption-pin validation extracted into validate_adoption_pin, workspace repository discovery extracted into discover_workspace_repositories, and the shared-default-branch contested-path logic extracted into changes_against_shared_default with the existing conservative rename-handling comment preserved. intent_state gains a sqlite/files storage-mode switch loading ticket_input.py via importlib. All protected required checks (test 3.12/3.13, governance/enforce, governance/remote lifecycle) pass. | Chunk 19 of 22 refactors worktree_overlap_check.py by extracting behavior-preserving helpers (virtual_ticket_files, ticket_status_override, scope_intent, ticket_scope_record, ticket_pair_findings, checkout_pair_findings, activity_findings) from ticket_scopes, discover_checkouts, and overlap_findings. The overlap detection logic (GOV-WORKTREE-OVERLAP-001/002), evidence payloads, and conservative rename-conflict path model are preserved. New SQLite-backed virtual ticket storage integrates cleanly with explicit AuditError propagation on invalid storage mode, missing status, or invalid intent, while file-based storage retains its tolerant intent parsing. All four protected required checks passed. | Chunk 20 contains behavior-preserving refactors: overlap_findings logic extracted into checkout_pair_findings with an added inventory_by_path lookup and activity_findings call; worktree_path_check.py extracts _legacy_v1_stem, _classify_location, and _mark_duplicate_deliveries helpers with unchanged classification logic; worktrees.lock.json bumps the wellmanifest/worktrees dependency 0.5.2→0.5.3 with updated revision and SHA; AGENTS.md documents the opt-in SQLite ticket storage mode (explicitly noting local config/DB grants no protected-CI approval); TICKETS.md index addition. All protected required checks (test 3.12/3.13, remote lifecycle, enforce) and local-verify pass, and PR reports 743 passed / 2 skipped. | Chunk covers ticket index updates, extended new-ticket.sh (new --storage/--ticket-store options plus SQLite bridge path), and the new ticket-099 README/intent for the 0.20.25 standard adoption. All protected required checks (test 3.12/3.13, governance/remote lifecycle, governance/enforce) pass. The new-ticket.sh changes are coherent: storage mode validation, digest-pinned Registry writer verification before use, and a database-aware highest-ticket counter with the legacy 3-digit regex extended to {3,}. SQLite mode intentionally exits before file-based ticket scaffolding, which matches the stated storage contract. | Chunk 22 of 22 is the tail of a wellmanifest standard adoption (0.20.16 to 0.20.25 at revision d54878a105a20d84dd554f205bc177dcacc8730a). Visible changes: pyproject.toml [tool.wellmanifest] pin updated to standard 0.20.25 / revision d54878a, matching the intent delivery.standardAdoption range and the PR outcome; intent/package-manifest registration of shared instance paths (.governance manifests, pyproject.toml, project/**) with sensible forbiddenPaths (.env, per-ticket user-*.md); and a regex relaxation in scripts/runtime.sh from /^ticket-[0-9]{3}$/ to /^ticket-[0-9]{3,}$/ to accommodate 3+ digit ticket IDs (ticket-099). The regex change is the only code-level behavioral change; it loosens validation slightly but remains anchored to a strict ticket-NNN+ shape and is consistent with the ticket naming convention used by new-ticket.sh. All required checks reported PASS (test 3.12, test 3.13, governance/enforce, governance/remote lifecycle) plus onedev/local-verify; PR reports 743 passed, 2 skipped, no failures. No behavior change beyond the ticket-ID validator, consistent with the declared non-goals.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.
Semantic review prerequisite: satisfied; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.
Actual PR impact radar
Exact range: 1360d7ef6b02b233708933af83edaf9f53d8840d...3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd
Change digest: ddbd2d31a605f78829105dce526b28e33550fd98f64bba4af63a2b096ae9b639
Score: 72/100 (L), estimated 240 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":2686,"base_sha":"1360d7ef6b02b233708933af83edaf9f53d8840d","binary_files":0,"categories":{"code":21,"configuration":15,"docs":3},"change_digest":"ddbd2d31a605f78829105dce526b28e33550fd98f64bba4af63a2b096ae9b639","comparison":"1360d7ef6b02b233708933af83edaf9f53d8840d...3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd","deletions":1205,"file_count":39,"files":["githooks/pre-commit","governance/agent_host_check.py","governance/approval-evidence.schema.json","governance/branch_intent_reconciliation.py","governance/branch_lifecycle_check.py","governance/change-evaluation.schema.json","governance/change_lease_check.py","governance/check_required_checks.py","governance/decision-record.schema.json","governance/generate_required_checks.py","governance/governance_check.py","governance/intent.schema.json","governance/manifest.base.json","governance/manifest.json","governance/manifest.lock.json","governance/package-manifest.json","governance/precommit_standard_update.py","governance/remediation-intent.schema.json","governance/remediation_intent.py","governance/standard_pack_check.py","governance/terminal-receipt-registry.schema.json","governance/ticket-activity-override.schema.json","governance/ticket-activity.schema.json","governance/ticket_activity.py","governance/ticket_allocation.py","governance/ticket_input.py","governance/ticket_storage.py","governance/work_continuity.py","governance/workspace_lifecycle_check.py","governance/worktree_overlap_check.py","governance/worktree_path_check.py","governance/worktrees.lock.json","AGENTS.md","project/TICKETS.md","project/new-ticket.sh","project/ticket-099/README.md","project/ticket-099/intent.json","pyproject.toml","scripts/runtime.sh"],"head_sha":"3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":3,"scope":5,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":240,"within_budget":false},"impact":{"components":["githooks","governance","origin","project","repository-root"],"files":["AGENTS.md","githooks/pre-commit","governance/agent_host_check.py","governance/approval-evidence.schema.json","governance/branch_intent_reconciliation.py","governance/branch_lifecycle_check.py","governance/change-evaluation.schema.json","governance/change_lease_check.py","governance/check_required_checks.py","governance/decision-record.schema.json","governance/generate_required_checks.py","governance/governance_check.py","governance/intent.schema.json","governance/manifest.base.json","governance/manifest.json","governance/manifest.lock.json","governance/package-manifest.json","governance/precommit_standard_update.py","governance/remediation-intent.schema.json","governance/remediation_intent.py","governance/standard_pack_check.py","governance/terminal-receipt-registry.schema.json","governance/ticket-activity-override.schema.json","governance/ticket-activity.schema.json","governance/ticket_activity.py","governance/ticket_allocation.py","governance/ticket_input.py","governance/ticket_storage.py","governance/work_continuity.py","governance/workspace_lifecycle_check.py","governance/worktree_overlap_check.py","governance/worktree_path_check.py","governance/worktrees.lock.json","origin/main","project/TICKETS.md","project/governance-check.sh","project/new-ticket.sh","project/ticket-099/README.md","project/ticket-099/intent.json","pyproject.toml"],"public_interfaces":["governance/approval-evidence.schema.json","governance/change-evaluation.schema.json","governance/decision-record.schema.json","governance/intent.schema.json","governance/remediation-intent.schema.json","governance/terminal-receipt-registry.schema.json","governance/ticket-activity-override.schema.json","governance/ticket-activity.schema.json"],"runtime_dependencies":1},"schema":"subactor.ticket-radar/v1","score":72,"split":{"parts":[{"estimated_minutes":20,"name":"Define contract and acceptance boundary","scope":["governance/approval-evidence.schema.json","governance/change-evaluation.schema.json","governance/decision-record.schema.json","governance/intent.schema.json","governance/remediation-intent.schema.json","governance/terminal-receipt-registry.schema.json","governance/ticket-activity-override.schema.json","governance/ticket-activity.schema.json"]},{"estimated_minutes":30,"name":"Implement githooks","scope":["githooks"]},{"estimated_minutes":30,"name":"Implement governance","scope":["governance"]},{"estimated_minutes":30,"name":"Implement origin","scope":["origin"]},{"estimated_minutes":30,"name":"Implement project","scope":["project"]},{"estimated_minutes":30,"name":"Implement repository-root","scope":["repository-root"]},{"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-099"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-099: chore: adopt wellmanifest new-project 0.20.25</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 54,78 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 · 240m</text></svg>DECISION D-099-6948
TICKET ticket-099
HEAD_SHA 3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd
CORRELATION_ID local-semcod-goal-pr-139-ticket-099
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT advisory_package_receipt = {"binding":{"repository":"semcod/goal","pull_request":139,"base_branch":"main","base_sha":"1360d7ef6b02b233708933af83edaf9f53d8840d","head_sha":"3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd","policy_digest":"9dd446855325af22db66ceb38f9ef9991bb8d565c09850dcf3bba7d451a207b2","registry_digest":"42092d5b6c0174bc0d0546d80da79661ebac122f4494e0fac3d40def16b70412"},"package_digest":"4f618bdc3e03daae7660ac7cb71d629cc8f34bcb322725a778487e224b535753","evidence_digest":"5fef5a5c5615434282581ca6ca67b91a07a0bbfd38ed6711887e9a6ba262bc04","package_file_count":35,"samples":[{"path":".githooks/pre-commit","risk":"executable,git-hook","diff_digest":"88b272afcca4b8f16d2331a40e9964650a31ac993565fbc3c94b26ad1c38746d","sample_digest":"e963ba5dc620eafc91a566036565ecfb03530985414015e32a05f009552bf6f7"},{"path":".governance/branch_lifecycle_check.py","risk":"executable,code","diff_digest":"c35195662a9c8f33cd5a821062dcf826ca8f9f6ad31e491a9fd553d6a015d475","sample_digest":"884b9e7d10303463a3fff995781872f64ec0d5272894b0f19a5ff00f1423dee9"},{"path":".governance/change_lease_check.py","risk":"executable,code","diff_digest":"5d6272d5f6032270fa3fcfc8803fd50b64e1d64f74670ca594105e989612b490","sample_digest":"1469273cc7fbba8b68e6e1fb8526f79e9158c67e98e6f176e24e96f93b2dddb6"}],"authority":"ADVISORY","promotion":"FORBIDDEN"}
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["test (3.12)=PASS","test (3.13)=PASS","governance / enforce=PASS","governance / remote lifecycle=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":139,"head_sha":"3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd","base_sha":"1360d7ef6b02b233708933af83edaf9f53d8840d","diff_sha256":"e531898b3cf5776a50c4f34488c8d938cfd37745e41206e62159ba26f10f41c8"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":true,"critical_paths":[".governance/agent_host_check.py",".governance/approval-evidence.schema.json",".governance/branch_intent_reconciliation.py",".governance/branch_lifecycle_check.py",".governance/change-evaluation.schema.json",".governance/change_lease_check.py",".governance/check_required_checks.py",".governance/decision-record.schema.json",".governance/generate_required_checks.py",".governance/governance_check.py",".governance/intent.schema.json",".governance/manifest.base.json",".governance/manifest.json",".governance/manifest.lock.json",".governance/package-manifest.json",".governance/precommit_standard_update.py",".governance/remediation-intent.schema.json",".governance/remediation_intent.py",".governance/standard_pack_check.py",".governance/terminal-receipt-registry.schema.json",".governance/ticket-activity-override.schema.json",".governance/ticket-activity.schema.json",".governance/ticket_activity.py",".governance/ticket_allocation.py",".governance/ticket_input.py",".governance/ticket_storage.py",".governance/work_continuity.py",".governance/workspace_lifecycle_check.py",".governance/worktree_overlap_check.py",".governance/worktree_path_check.py",".governance/worktrees.lock.json"],"observed_paths":[".githooks/pre-commit",".governance/agent_host_check.py",".governance/approval-evidence.schema.json",".governance/branch_intent_reconciliation.py",".governance/branch_lifecycle_check.py",".governance/change-evaluation.schema.json",".governance/change_lease_check.py",".governance/check_required_checks.py",".governance/decision-record.schema.json",".governance/generate_required_checks.py",".governance/governance_check.py",".governance/intent.schema.json",".governance/manifest.base.json",".governance/manifest.json",".governance/manifest.lock.json",".governance/package-manifest.json",".governance/precommit_standard_update.py",".governance/remediation-intent.schema.json",".governance/remediation_intent.py",".governance/standard_pack_check.py",".governance/terminal-receipt-registry.schema.json",".governance/ticket-activity-override.schema.json",".governance/ticket-activity.schema.json",".governance/ticket_activity.py",".governance/ticket_allocation.py",".governance/ticket_input.py",".governance/ticket_storage.py",".governance/work_continuity.py",".governance/workspace_lifecycle_check.py",".governance/worktree_overlap_check.py",".governance/worktree_path_check.py",".governance/worktrees.lock.json","AGENTS.md","project/TICKETS.md","project/new-ticket.sh","project/ticket-099/README.md","project/ticket-099/intent.json","pyproject.toml","scripts/runtime.sh"]},"grounding":"full-diff-not-per-finding-proof","execution_authority":false,"status":"satisfied","reason":null,"review_sha256":"568a53ee818547fc5d3287148bf927e75ca54e97eddd1768d6e1800c66df0e39","unresolved":[]}
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"1360d7ef6b02b233708933af83edaf9f53d8840d","head_sha":"3c111ffd0c731625a0d2151cb7fdd2c0ac9be9dd","change_digest":"ddbd2d31a605f78829105dce526b28e33550fd98f64bba4af63a2b096ae9b639","score":72,"complexity":"L","estimated_minutes":240,"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 "openrouter/z-ai/glm-5.3-flash"
ASSERT VERDICT_AUTHORITY != "ADVISORY"
Summary
Validation
Ticket: ticket-099