calibration: week of 2026-07-20 - #80
Conversation
heskew
left a comment
There was a problem hiding this comment.
1. Duplicate fixes are counted as independent calibration evidence
File: CALIBRATION.md:39
What: The two points cited for the new type-only pattern are not independent. ai-review-log #1011 and #1040 map to Harper PRs #1853 and #1890, both by the same author, both changing resources/DatabaseTransaction.ts::recordCommitLatency, and both fixing the same TS2345 regression introduced by Harper #1688. PR #1853 merged; the later #1890 closed unmerged.
Why it matters: This does not meet CALIBRATION-SWEEP.md's requirement of at least two independent data points before changing a prompt layer.
Suggested fix: Treat these as one underlying signal, keep the pattern watch-listed, and remove the universal.md edit until a genuinely independent occurrence appears.
2. “No runtime effect” can still hide build and declaration regressions
File: universal.md:94
What: The new rule ignores widened or narrowed annotations on internal functions based on runtime behavior. Such a change can leave emitted JavaScript unchanged while breaking tsc, weakening type checking, or altering declarations through an inferred exported type. The cited PRs themselves changed build status by repairing a failing TypeScript build.
Why it matters: universal.md:97 would mark these diffs as having nothing to verify and suppress their review log even though build and public type-contract behavior can change.
Suggested fix: Apply this exemption only after confirming type-check/build status, emitted output or metadata, and externally observable declarations are unchanged. Phrase the carve-out around the public declaration surface, not only directly exported symbols.
3. oauth#192 is incorrectly recorded as unresolved
Files: CALIBRATION.md:45, CALIBRATION.md:51, universal.md:50
What: OAuth commit 160992d4 fixed the unresolved ${FLAG} normalization gap on 2026-07-22, and oauth#192 merged on 2026-07-23, before this calibration PR was created. The calibration still calls it unresolved, and the prompt says only two of the three examples were author-fixed.
Why it matters: The calibration record understates its supporting evidence and leaves the aggregate fixed-partial count stale.
Suggested fix: Record oauth#192 as author-fixed by 160992d4, change “two author-fixed” to “all three author-fixed,” and update the fixed-partial count from seven to eight.
Review feedback on #80, all three findings verified and applied: 1. #1011/#1040 are the same underlying fix (same author, same function, harper#1853 merged / #1890 closed) — one signal, below the >=2-independent bar. universal.md carve-out withdrawn; watch-listed with declaration-surface framing for the future edit. 2. The withdrawn carve-out's runtime-only framing was also too broad (type-only diffs can break tsc / shift inferred exported declarations) — folded into the watch-list note. 3. oauth#192 was author-fixed in 160992d4 and merged 07-23 before the sweep ran — entry and guard bullet now record all three producing-side points as author-fixed; fixed-partial count 7->8. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
All three review findings verified against the sources and applied in 0caeb33:
Net: the PR now ships one prompt edit (the producing-side guard bullet, now 3-for-3 author-fixed) instead of two. |
10/17 caught, 4 partial, 3 missed. Every fixture was a total miss at its original ref, so this is the offline measure of the #70..#80 calibration arc: 59% of historical misses now caught outright, 82% at least surfaced. Survivors (the next calibration targets): harper-1858 (config-mirroring gap), harper-1906 (test-validity race), oauth-170 (cleartext issuer + JTI replay). Two fixtures vote-split across runs (1770, 1956 — recorded at their best-evidenced verdict; flakiness noted in the PR). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Weekly calibration sweep for the PT week of 2026-07-20 (verdicts with
closed_atin[2026-07-20, 2026-07-27)), synthesized from the raw verdict-labeled issues in HarperFast/ai-review-log.The curated
Calibration log(#1046) andFalse-negative log(#1045) exist for this week but contain only their boilerplate headers — no daily comments — so they contributed nothing. 45verdict:pendingissues remain open (13 a week ago): triage is falling behind ingest, so the mix below is a partial read.Verdict mix
39 triaged: useful 22 · noise 7 · partial 10 (56% useful) — flat against last week's 53%. Verdicts arrived as one bulk batch (applied 2026-07-21/22, plus five late
usefulauto-applies on 07-24/25).9cf49d2(2026-06-29)82c9484(2026-07-21)Per repo:
harper24 (16/4/4) ·oauth10 (3/3/4) ·harper-pro5 (3/0/2).The prompt-ref split is the load-bearing fact.
9cf49d2predates #73 (merged asaa26ae2, 2026-07-17) and so carries neither the "Severity deflation on security / hardening paths" nor the "Fail-closed / validate-at-registration on new surfaces" bullet;82c9484carries both. Nine of the ten partials ran at9cf49d2— pre-text misses, not evidence the text failed. The post-text cell is 6 entries, far below the ~15 floor and unbalanced (5 of 6 areharpersonnet-5 clean runs from one day), so no before/after read is possible yet.The sonnet-5 canary cell (23) clears the floor at 70% useful / 13% partial; sonnet-4-6 (10) does not, and reads 40% / 60%. As last week that gap is confounded, not a model-quality signal — sonnet-5 drew
harpercore PRs, sonnet-4-6 drew theoauthsecurity work andharper-pro, where second-reviewer density is far higher.Recurring NOISE patterns
All 7 are the same family — a "no blockers" run (three with full run-notes) on a diff with no correctness or security surface — and all were human-confirmed by heskew. Four are already covered by the "Mechanical, no-logic diffs" bullet: #1032 (workflow matrix conditional), #1024 (CI-lane sync), #1027 / #1028 (release bumps).
New corroborated sub-shape — type-only diffs with no runtime effect (2 points, both
harper/sonnet-5, both heskew-confirmed):Promise<void>→Promise<unknown>widening to unblocktsc, which drew a four-bullet write-up over a behavior-neutral one-liner (#1040);Promise<void>→Promise<number | void>retype plus a removed redundant cast (#1011).Watch-listed at 1 point each: reviewer-tool config as a diff surface (
.gemini/config.yaml+ styleguide, #1026); a release PR whose run re-traced its sibling PRs' fixes rather than its own +12/-3 diff (#1028).Recurring PARTIAL / FALSE-NEGATIVE patterns
Every partial is the same shape: a clean run while a second reviewer — gemini inline, then a human (@kriszyp, heskew, cb1kenobi) who usually fixed it — caught a real defect. Corroboration is human/author-fixed rather than bot-only: seven of ten partials name the author commit that landed the fix.
1. Verified the enforcing side of a new guard, never the producing side — NEW (3 points, all
oauth, 2 author-fixed).sessionIdCSRF binding traced exhaustively and passed clean; the MCP initiation path never mintssessionId, so the new check silently no-ops for MCP flows. Author-fixed300b06bed.dcrEnabled()'s cases enumerated and declared "all three cases correct"; a bare YAMLdynamicClientRegistration:parses tonull, whichdcrConfig !== undefinedtreats as configured. Author-fixed01a6f428b."false""cannot activate the gate"; @kriszyp shows an unexpanded${VAR}placeholder survivescoerceConfigBooleanas a truthy string and switches on a documented default-off gate. Unresolved.Not covered by "Dispatch surfaces", "Fail-closed / validate-at-registration", or "Falsy vs nullish guards". → prompt edit.
2. Severity deflation on peer-flagged findings (5 points — but all pre-text). #987 (abort chain leaks native handles; @kriszyp-fixed
6be2c12d6/e0e78f003), #942 (Number(' ')→0on a function the run called "all correct"; heskew-fixedcb7de4825), #1035 (reprobe close-handling declared complete and "No gaps"; @kriszyp added theif (closed) returnguard), #1009 (real catch on the untestedgenerate: truebranch, butgenerate+keycalled benign where gemini rated HIGH, andexecFileSyncevent-loop block missed; both fixed ind30fb7f), #1017 (global prototype stub with noafterEachrestore; author-fixed8c622e764). All five at9cf49d2, i.e. before #73's language shipped; #987 and #942 are also re-adjudicated carry-overs. → reinforce, no new text.3. Concurrent peer review the run never saw (1 point, watch-listed). #1017 reported "no prior PR comments/threads to reconcile" while gemini had posted three findings — two high — 3.5 minutes earlier; the author confirmed both. A timing race against the existing "read the prior conversation" section, not a gap in it.
Covered / one-off: #978 (
await Promise.all(checkpointWrites)outside the toptrycan bypass the park path — @kriszyp, unresolved; adjacent to "Setup/teardown that leaks on partial failure", watch-listed). #1020 is gemini severity inflation (doc-only drift filed as two blockers) — provider-harness output, out of scope; the underlying drift is real and shipped, and the Claude run on the same PR missed it too, a second point for a class the blocker list already names.Changelist
CALIBRATION.md— prepended the## Week of 2026-07-20entry.universal.md(Security) — new bullet "A new guard is only as good as whatever populates the value it reads." Enumerate every path that produces the value an enforcement check keys on, including paths that never set it and shapes the config layer can emit. Cites oauth#183 / #184 / #192.universal.md(What to ignore) — added "type-only edits with no runtime effect" to the "Mechanical, no-logic diffs" enumeration, with an explicit carve-out that a type change on an exported symbol is still an API-contract change and does need review.No
harper/*.mdorrepo-type/*.mdedits — theoauthcluster is a plugin-agnostic guard-design shape.No other calibration PR is open (only #18, an unrelated workflow change), so nothing here duplicates or contradicts in-flight work; #73, #77 and #78 have all merged.
🤖 Generated with Claude Code