feat(compose-agent): write-mode acceptance evals + CI validation (4.4.0)#13
Conversation
Closes the last 4.3.1-cross-review follow-up: compose-agent had no evals of its own, so its authoring rules were only exercised via the audit's acceptance cases. - skills/compose-agent/evals/evals.json: 5 write-mode cases that ask the skill to WRITE Compose and grade the result. Cases 0-2 mirror the 4.3.x audit rules (cross-phase back-write, Strong Skipping false leads, snapshot self-invalidation); 3-4 cover phase-correct reads and lifecycle-aware Flow collection. - bin/ci: structurally validates every skills/<name>/evals/evals.json (JSON, unique numeric ids, required fields, non-empty expectations) and asserts the compose-agent suite keeps covering the three authoring rules, so the authoring path can't drift from the audit scoring path. Negative-tested. - SKILL.md: new Acceptance Evals section. - Versions: compose-agent -> 4.4.0; jetpack-compose-audit unchanged at 4.3.2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ysskXsKpwEbs1n9CX1ScY
🟠 Antigravity review (automated cross-review)This PR does a great job adding write-mode acceptance evals and structurally validating them in CI. The Compose guidance is spot-on. However, the CI checks meant to prevent rule drift are overly permissive and easily bypassed. Should-fix
Nit
via pr-review-relay · author: claude |
…etry Round-1 cross-review (Cursor, Antigravity; no blockers): - CI enforcement was cosmetic (Cursor + Antigravity): the coverage regexes ran on the whole file text, so the suite description alone satisfied them and cases could be deleted. Now parse the JSON and require at least one eval CASE to match each rule. Negative-tested: dropping case 0/1/2 each fails CI; 3/4 don't (foundational, not locked — matches docs). Tightened the false-lead needle to `memoiz` (the distinctive token) so case 3's incidental "Strong Skipping"+"remember" no longer satisfies it. - Structural validator now rejects empty-string expectations. - Removed the redundant post-loop re-read (reuse the parsed suite map). - Eval case 0: fixed the SubcomposeLayout contradiction — SubcomposeLayout / custom Layout measuring the label are valid; only BoxWithConstraints is called out (it exposes parent constraints, not a sibling's measured size). - Softened the parity claim: cases 0-2 mirror the audit 1:1 and are CI-locked; 3-4 are foundational, no audit counterpart. Cross-referenced audit cases 12-14 by id. - Symmetry: jetpack-compose-audit SKILL.md gains an Acceptance Evals section too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ysskXsKpwEbs1n9CX1ScY
🟢 Codex review (automated cross-review)Blocker: None. Should-fix:
Nit: None. Validation: read via pr-review-relay · author: claude |
Round-2 cross-review (Codex, Cursor; no blockers): - Codex: the false-lead gate only locked the auto-memoized-lambda subcase, not the remember(index) pure-expression subcase that case 1 also mirrors. Added an explicit subcase check (the false-lead case must contain both `memoiz` and remember(index)). - Cursor: "lockstep" was one-way and one stuffed case could fake coverage. Now (a) each of the 3 rules must be covered by a DISTINCT case (usedIds), and (b) the audit suite must retain cases 12-14 — bidirectional. Negative-tested: dropping compose 0/1/2, stripping the remember(index) token, stuffing all keywords in one case, or dropping audit case 12 each fail CI; 3/4 stay unlocked (foundational). - Cursor: release-notes-4.3.1 "tracked follow-up" note now marked delivered in 4.4.0. - Cursor: audit evals.json description now mentions the 4.4.0 write-mode mirror. - Cursor nit: case 3 expectation no longer assumes Animatable — allows a scroll-only (LazyListState + lambda modifier) solution. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ysskXsKpwEbs1n9CX1ScY
🔵 Cursor review (automated cross-review)PR #13 Review —
|
… caveat Round-3 cross-review (Cursor; Codex empty; no blockers — hardening only): - Audit-side lockstep is now content-based, not id-only: audit cases 12/13/14 must still match the cross-phase / false-lead / self-invalidation needles, so hollowing them out fails CI (negative-tested). - The remember(index) subcase check now reuses the case matched for the Strong Skipping rule (matchedByRule map) instead of a fresh /memoiz/ lookup. - Case 1 gains an expectation mirroring audit case 13's last bullet: the manual- remember lever, if mentioned, must be scoped to SSM-off / @DontMemoize, never the default SSM track. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ysskXsKpwEbs1n9CX1ScY
What
Adds
compose-agent's own write-mode acceptance evals — the last follow-up flagged across the 4.3.x cross-reviews. Until now the authoring skill had no evals; its new rules were only exercised throughjetpack-compose-audit's cases, which grade an audit of existing code, not code the skill writes.Changes
skills/compose-agent/evals/evals.jsonbin/ciskills/<name>/evals/evals.json(JSON, unique numeric ids, required fields, non-empty expectations) + asserts the compose-agent suite keeps covering the three authoring rulesskills/compose-agent/SKILL.mdcompose-agent→ 4.4.0;jetpack-compose-auditunchanged at 4.3.2CHANGELOG.md,README.md,docs/release-notes-4.4.0.mdWhy the CI hook
The point of these evals is to keep the authoring path in lockstep with the audit path. The CI assertion (cross-phase / Strong-Skipping-false-lead / self-invalidation coverage) makes that guarantee mechanical — a future edit can't quietly drop a rule from the suite. Negative-tested:
bin/cirejects an eval with emptyexpectations.Note
Evals are acceptance data, not a runner (same model as the audit suite) — run a model with the skill loaded against each prompt and check every expectation.
Validation
bin/ci✅ (incl. the new validator, README link check, version match).🤖 Generated with Claude Code
https://claude.ai/code/session_016ysskXsKpwEbs1n9CX1ScY