Skip to content

feat(issue-ci): add read-only review readiness receipts - #76

Merged
chrischeng-c4 merged 3 commits into
mainfrom
codex/review-readiness-v1-20261024
Oct 24, 2026
Merged

chrischeng-c4 merged 3 commits into
mainfrom
codex/review-readiness-v1-20261024

Conversation

@chrischeng-c4

@chrischeng-c4 chrischeng-c4 commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

References #75.

Repeated review polling reconstructs deterministic CI prerequisites, while the existing qualifier also mixes those prerequisites with done-label authority. Add one shared read-only readiness result and authenticated receipt interface for later thin consumers, without six controller forks.

Behavior

  • Reuse qualification v1 selection and exact latest-attempt snapshots. Extract label-independent evidence without changing valid legacy lifecycle evaluation, failure journals, coding epochs, AGY reclaim or legacy review receipts.
  • Add readiness/verify-readiness shared action operations and a separate read-only issue-review verifier entry. Return versioned ready/wait/fail with stable reasons and links. Failure-only does not itself block objective readiness; real qualification blockers still do. Readiness does not grant done, semantic review acceptance or merge authority.
  • Bind repo/PR/head/base, complete normalized file inventory, PR description, frozen default-branch policy source/hash, evaluator revision, required checks, workflow/run/attempt/jobs, transitive source pins and nonzero assertion rosters. Authenticate receipts through the configured successful default-branch producer's exact job log, then revalidate current evidence, producer, policy and final PR identity. A hash alone is not authentication.
  • One strict JSON object-pairs hook rejects duplicate keys at every depth in metadata, policy/config, wake events, assertion/producer logs and receipt files, including equal values and escape-equivalent names.
  • Discover YAML uses from complete PyYAML scanner tokens and BaseLoader representation nodes, including flow mappings. Reject explicit/split/complex/escaped/dynamic/duplicate keys, aliases, tags, directives, multiple documents and resource overflow. No YAML object constructors run. Mutable or undeclared references fail closed; literal block script text is not an action reference.

New parser dependency / execution supply

Readiness only: PyYAML==6.0.3, official release https://pypi.org/project/PyYAML/6.0.3/ . scripts/readiness-requirements.txt locks all 72 official wheel SHA256 values from the release's PyPI JSON metadata; no source builds or transitive packages are accepted. Lock SHA256: eef6794465b73b5dc4ef909500bf5bcc56761b93bb1521a05a97746d1f7f298d.

Only readiness/verify-readiness create a run-local venv below RUNNER_TEMP, install from https://pypi.org/simple using isolated pip, --no-deps --only-binary=:all: --require-hashes, and execute the evaluator in Python isolated mode. The immutable aw reference binds action/code/lockfile. Legacy validate/qualify/handoff skip that bootstrap; main aw package dependencies/uv.lock and permissions are unchanged. No global package or credential change. Missing or different parser versions refuse readiness.

Validation

  • Fresh isolated Python 3.13 environment installed PyYAML 6.0.3 through the hash-lock. python -B -m unittest discover -s plugins/faberline/skills/issue-ci/tests -p 'test*.py' -q: 135 passed (89 existing lifecycle/qualification cases plus 46 readiness/distribution/parser cases). Final runtime-scope fixture also passed under -I.
  • The flow-adjacent explicit split-key fixture first reproduced the independent review finding, then passed both parser and produce refusal checks. Other negatives cover duplicate JSON, zero/missing assertions, unknown applicability, mutable transitive refs, fake receipts, stale/foreign attempts, producer failure, head/base/policy movement and collection races.
  • AST/action-YAML/diff static checks pass. Receipt schema ready/wait/fail fixtures were previously validated and the schema is unchanged by the parser correction.
  • Only affected isolated local unit/static fixtures ran. No GitHub workflow, aw cloud check, GKE/e2e/performance execution or manual dispatch was added or run. GitHub runner acceptance of the special YAML forms and runner bootstrap were not exercised; local parser/package-supply checks are not that evidence.

Deliberate first-phase limits

No live consumer/prompt/frequency changes, readiness index publisher, dispatcher/session lease, completion-ledger v2, native webhook/pre-model hook or done activation. Tape #40/#35 still owns the first actual consumer gate; its docs validator is not reimplemented here. Missing index remains an integration blocker, never an empty queue.

Assertion enforcement and actual executed head/base must be established in reviewed real consumer CI; mocked fixtures are not pilot evidence. Pin proof covers declared action/workflow references and enforcement sources, not arbitrary-language imports or a hermetic build. External local-uses checkout context remains unsupported. Verification currently recollects bounded evidence for one named PR; no receipt-only cache or zero-token desktop polling is promised. GitHub has no cross-resource CAS, so consumers must reverify immediately before review/findings.

Draft for independent re-review at 7d5aa3facaa1461c7d22263499a2e2e15b8e9a0e. Do not merge or deploy consumers in this scope.

Reuse trusted applicability and current-attempt snapshots for ready/wait/fail
review prerequisites, independently from lifecycle label authority. Bind exact
head/base/policy, recursive source pins and nonzero assertion contracts; verify
receipts against their successful trusted producer and fresh GitHub evidence.

Preserve failure-only handoffs and legacy review receipts. Leave consumer
activation, readiness index publication and reviewer session leases separate.

References #75
Reject explicit and multiline YAML mapping keys rather than overlooking
hidden uses references. Reject multiline quoted keys in the narrow subset;
GitHub runner acceptance of those special forms remains untested.

Use one strict JSON object-pairs hook for metadata, policy, wake events,
assertion and producer logs, and receipt files. Refuse duplicate keys at
any depth, including equal values and escape-equivalent names.

Add regressions for both review findings; preserve identity, freshness and
legacy lifecycle behavior. Affected isolated suite: 130 passed.
Replace line-oriented key discovery with PyYAML 6.0.3 scanner tokens and
BaseLoader representation nodes. Reject explicit/split/complex keys in
block and flow contexts, aliases, tags, duplicate keys and bounded resource
overflow without constructing YAML objects.

Pin all official PyPI wheel hashes. Only readiness operations bootstrap a
run-local isolated venv; legacy operations and aw package dependencies stay
unchanged. Missing or different parser versions refuse readiness.

Reproduce the flow-adjacent split-key bypass with scanner and producer
fixtures. Affected isolated suite: 135 passed, including unchanged JSON,
identity, freshness, journal and reclaim regressions. No workflow executed.
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