Repository navigation
Add unified-session contract checks (U1–U3) to smoke assertions - #70294
Conversation
Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
There was a problem hiding this comment.
💥 [THE END] — Illustrated by Smoke Claude · claude · sonnet46 · 73 AIC · ⌖ 6.24 AIC · ⊞ 922
Comment /smoke-claude to run again
|
End-to-end verification at
CI is green (JS shards 1–4, typecheck, lint, stale lock files). Ready to finish. |
|
✅ Design Decision Gate 🏗️ completed the design decision gate check. See the comment below for the result and any generated ADR draft. Design Decision Gate 🏗️Outcome: The agent completed and reported no action. A no-op output alone does not verify that all required work was completed or that publication was possible. Agent messages are omitted from this comment. The category uses structured run status, not interpretation of agent prose.
|
|
🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅
|
|
✅ Test Quality Sentinel completed test quality analysis. Test Quality SentinelOutcome: The agent completed and reported no action. A no-op output alone does not verify that all required work was completed or that publication was possible. Agent messages are omitted from this comment. The category uses structured run status, not interpretation of agent prose.
|
|
✅ Ponytail Reviewer completed successfully!
|
|
…ontract-checks Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
There was a problem hiding this comment.
L814: shrink: duplicated result reporter. Extract the shared reporter.
net: -10 lines possible.
Generated by ✂️ Ponytail Reviewer for #70294 · codex · gpt56 · 15.4 AIC · ⌖ 5.4 AIC · ⊞ 14.7K
Comment /ponytail to run again
Comment MemoryPeek at saved memory (pr-code-quality-reviewer)Note This comment is managed by comment memory.Expand the saved memory block to view or edit the persistent context for this thread.
|
There was a problem hiding this comment.
🔵 Needs a closer look
Live U1–U3 checks passed for Smoke Claude, but end-to-end validation of the other 13 smoke variants remains unverified.
1 open issue
What changed in this PR
Adds unified-session contract checks to gh-aw smoke workflows, addressing #70288 without changing the collector, harnesses, or session format.
Changes:
- Adds U1–U3 checks and a session-only assertion entry point.
- Configures explicit expectations across 14 smokes and regenerates their lock files.
- Adds recorded-session regression fixtures, tests, and documentation.
| File | Description |
|---|---|
DEVGUIDE.md |
Documents U1–U3 and unrouted checks. |
actions/setup/js/smoke_model_routing_assertions.test.cjs |
Tests contract checks and entry points. |
actions/setup/js/smoke_model_routing_assertions.cjs |
Implements session-contract assertions. |
actions/setup/js/fixtures/session-contract/smoke-pi-routed-run-39178909557.jsonl |
Records Pi sub-agent resolution evidence. |
actions/setup/js/fixtures/session-contract/smoke-copilot-run-39181772988.jsonl |
Records pre-fix collection failure evidence. |
actions/setup/js/fixtures/session-contract/smoke-copilot-run-39176941475.jsonl |
Records successful inventory and resolution evidence. |
actions/setup/js/fixtures/session-contract/smoke-copilot-routed-run-39176939097.jsonl |
Records successful routed inventory evidence. |
actions/setup/js/fixtures/session_contract_sessions.cjs |
Loads fixtures and cites source runs. |
.github/workflows/smoke-pi.md |
Adds standalone Pi contract checks. |
.github/workflows/smoke-pi.lock.yml |
Generates Pi contract-check step. |
.github/workflows/smoke-pi-routed.md |
Requires inventory and both sub-agent resolutions. |
.github/workflows/smoke-pi-routed.lock.yml |
Generates routed Pi expectations. |
.github/workflows/smoke-pi-routed-claude.md |
Adds routed inventory expectations. |
.github/workflows/smoke-pi-routed-claude.lock.yml |
Generates Claude-pool Pi expectations. |
.github/workflows/smoke-copilot.md |
Adds standalone Copilot contract checks. |
.github/workflows/smoke-copilot.lock.yml |
Generates Copilot contract-check step. |
.github/workflows/smoke-copilot-sdk.md |
Adds standalone SDK contract checks. |
.github/workflows/smoke-copilot-sdk.lock.yml |
Generates SDK contract-check step. |
.github/workflows/smoke-copilot-sdk-routed.md |
Adds routed SDK inventory expectations. |
.github/workflows/smoke-copilot-sdk-routed.lock.yml |
Generates routed SDK expectations. |
.github/workflows/smoke-copilot-sdk-routed-claude.md |
Adds Claude-pool SDK inventory expectations. |
.github/workflows/smoke-copilot-sdk-routed-claude.lock.yml |
Generates Claude-pool SDK expectations. |
.github/workflows/smoke-copilot-routed.md |
Adds routed Copilot inventory expectations. |
.github/workflows/smoke-copilot-routed.lock.yml |
Generates routed Copilot expectations. |
.github/workflows/smoke-copilot-routed-steering.md |
Enables contract checks alongside steering checks. |
.github/workflows/smoke-copilot-routed-steering.lock.yml |
Generates steering-smoke expectations. |
.github/workflows/smoke-copilot-routed-claude.md |
Adds Claude-pool Copilot inventory expectations. |
.github/workflows/smoke-copilot-routed-claude.lock.yml |
Generates Claude-pool Copilot expectations. |
.github/workflows/smoke-codex.md |
Adds inventory checks without required resolutions. |
.github/workflows/smoke-codex.lock.yml |
Generates Codex contract-check step. |
.github/workflows/smoke-claude.md |
Adds inventory and main-resolution checks. |
.github/workflows/smoke-claude.lock.yml |
Generates Claude contract-check step. |
.github/workflows/smoke-claude-routed.md |
Adds Copilot-backed inventory expectations. |
.github/workflows/smoke-claude-routed.lock.yml |
Generates routed Claude expectations. |
.github/workflows/smoke-claude-on-copilot.md |
Adds Copilot inventory and main-resolution checks. |
.github/workflows/smoke-claude-on-copilot.lock.yml |
Generates Claude-on-Copilot contract step. |
Review effort: Max
There was a problem hiding this comment.
Skills-Based Review 🧠
Applied /tdd and /grill-with-docs to the new unified-session contract logic (evaluateSessionContract, U1–U3). Two targeted comments posted inline; nothing blocking.
📋 Key Themes & Highlights
Key Themes
- Branch coverage gap (
/tdd): the duplicate-role (forRole.length > 1) and empty-resolved_modelbranches in U3 aren’t exercised by any test, even though the PR adds thorough coverage for most other paths (missing role, failed status, missing session, two inventories, unconfigured endpoint). - Silent-skip ambiguity (
/grill-with-docs): when a smoke sets onlyresolutionRoles(noexpectModelInventory/copilotInventory), U2 is gated off with no log line at all — worth an explicitINFOnote or a DEVGUIDE callout so a quiet U2 isn’t mistaken for a passing one.
Positive Highlights
- ✅ Real, cited fixture sessions (
fixtures/session_contract_sessions.cjs) trace each JSONL back to an actual run — strong grounding for the assertion logic, not synthetic guesses. - ✅ Explicit per-smoke
resolutionRoles/copilotInventoryconfig avoids inferring expectations fromsubAgents, which the PR body correctly notes would be unsound (only Pi records sub-agent resolutions). - ✅ Clean separation between the routed
main()path (U1–U3 folded into existing checks) and the newsessionContractMainfor unrouted smokes, with consistentE2/U1–U3messaging on both. - ✅ DEVGUIDE.md and the module header check-ID list were both updated alongside the code — no doc drift.
Scope note
As the PR itself flags, no smoke has been E2E-dispatched on this branch yet (reviewer notes section). That’s out of scope for this review but worth confirming before merge given the per-smoke copy-pasted expectations (copilotInventory, resolutionRoles) are easy to get subtly wrong without a live run.
🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · copilot · sonnet50 · 120.5 AIC · ⌖ 15 AIC · ⊞ 10.1K
Comment /matt to run again
|
@copilot address the following outstanding work in one pass:
Push the necessary fixes, reply to each listed review thread and resolve it when addressed. Ignore feedback already answered or resolved. Use the pr-finisher skill and stop when only human review or CI remains; do not trigger CI. Sous-chef head: 796c4d3
|
…ontract-checks Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Merged latest main with make merge-main (f6dae34) and pushed all six review fixes in e18885d. All 112 focused tests, typecheck, make lint, make agent-report-progress, and workflow compilation passed; no CI was triggered. Replied to every linked thread. Thread resolution is not exposed by the available PR tools, so the addressed threads still need marking resolved. Independent review found no significant issues; the standard review backend was unavailable and CodeQL timed out. CI on the new head remains unverified. |
|
@copilot address the following outstanding work in one pass:
Push the necessary fixes, reply to each listed review thread and resolve it when addressed. Ignore feedback already answered or resolved. Use the pr-finisher skill and stop when only human review or CI remains; do not trigger CI. Sous-chef head: e18885d
|
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Fixed in 95ac4cd. The two CI failures came from a stale nano-whoami/gpt-5-nano fixture; it now matches mini54-whoami/gpt-5.4-mini in the workflow without weakening assertions. |
Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
…NER_TEMP wrapper Co-authored-by: SivaKesava1 <11771739+SivaKesava1@users.noreply.github.com>
|
Re-verification at
smoke-pi-routed. Pi refused to start because the
U3 still passed, because Pi records All review threads are answered and resolved. JS shards 1–4, typecheck, lint and the stale lock-file check pass. Ready to merge. |
|
🎉 This pull request is included in a new release. Release: |

Smokes passed even when the unified session (
usage/aw_session.jsonl) silently dropped data. On every smoke run on 19 Oct 2026 before #70013 merged, the collector rejected AWF's whole model inventory (#69754). The routed post-step logged the warning and still passed, and the six unrouted engine smokes had no assertion step. This PR adds explicit, per-smoke session-contract checks. It does not change the collector, the harnesses or the session format.Checks (
smoke_model_routing_assertions.cjs)session.collection_warningand lists eachcode in path. There is no allowlist.expectModelInventoryis set): requires exactly onemodel.inventorywithprovenance.phase === "agent". Detection-phase inventories are ignored. WithcopilotInventory, thecopilotendpoint must beconfigured: truewith a non-emptymodelslist; on failure the message lists every observed endpoint.resolutionRolesneeds exactly onemodel.resolutionwith statusexactorresolvedand a resolved model. Afailedrecord prints itscause, and a missing role is named. Roles are never derived fromsubAgents, because only Pi records sub-agent resolutions.main(): U1–U3 run only when one of the new fields is set, so existing callers and their output are unchanged. They run before T4, so the steering smoke also reports U failures under T4.sessionContractMain: builds the session the same way asmain(), then runs only E2 (session present) and U1–U3.FAIL E2 evidence: missing usage/aw_session.jsonl, logU1–U3 not evaluated: …, and don't throw.Per-smoke expectations (all set
expectModelInventory: true)copilotInventoryresolutionRoles[][]["haiku-whoami","mini-whoami"]["main"]["main"][]main({...})calls get only the three new fields.if: always()post-step that callssessionContractMain. Lock files are recompiled.smoke-codex: treated as intended, not a harness gap. With no configured model, gh-aw passes no model and Codex uses its own default, so there is nothing to resolve. Copilot differs because it always requests
auto.Fixtures and tests
fixtures/session-contract/*.jsonlholds verbatimsession.format,session.collection_warning,model.inventoryandmodel.resolutionrecords from the published sessions of runs 39181772988, 39176941475, 39176939097 and 39178909557.fixtures/session_contract_sessions.cjscites each source run.sessionContractMainpass case and a test that T4 counts U1/U2 failures.Docs
DEVGUIDE.mdnow include U1–U3.Reviewer notes
agent/awf-reflect.jsonandsandbox/firewall/awf-reflect.json. On a build without Preserve AWF model inventories with null endpoints and live reasoning metadata (G-7) #70013, U1 therefore lists two warnings.sandbox/firewall/models.jsonin the agent job, the collector adds a second agent-phase inventory and U2 fails. The failure lists both paths. Nothing in this repo writes that file, so this is unverified.gh workflow run <smoke>.lock.yml --ref <branch>), with the run URLs added here.Out of scope (to file separately)
file-summarizersub-agent starts with an unexpanded${{ experiments.subagent_model }}and fails silently.model.resolution.✨ PR Review Safe Output Test - Run 39294456721