docs(agents): say how a return-delivered durability seam is declared - #19214
Conversation
The block on degradation log levels told the author of a durability seam to declare how the catch delivers the failure, offering only the two propagation maps of check-durability-degradation-log-level.mjs. Both key on the name of a callee the catch reaches, so a catch that delivers by returning an outcome object has nothing to put in either one, and the only two ways left to green the gate are the two that gate's own header rejects: a baseline entry for correct code, or a bolted-on logger.error. Split the declaration rule by how the failure leaves the catch. A call-delivered seam declares its callee as before. A return-delivered one has no callee to declare, is added to neither map and to no baseline, is pinned by its own file's test asserting the returned failure outcome, and has its population read from the census script. The invariant is untouched: silent data loss must be loud. Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk Co-authored-by: Claude <noreply@anthropic.com>
…ents-return-propagating-seams
The maintainer ruled letter A on this card's line budget (+10, 1099 -> 1109), recorded on #16233 as comment 5750261694, executing the standing letter-C ruling 5716260390 that named the text but not its lines. The raise is recorded in this map's own ruled-raise convention: the measured cost (+10, bought by content), the re-measured lossless-rewrap headroom with the widths it was measured at, and the ruling verbatim and untranslated. Claude-Session: https://claude.ai/code/session_019srGWGCBBCBHqcDoRZpQRh Co-authored-by: Claude <noreply@anthropic.com>
…ents-return-propagating-seams
|
os-dev-report { Generated by Claude Code |
Fixes #16233
What changed
One paragraph of
AGENTS.md— the "Degradation log levels" block that used to end at lines938-943 on
24d622b94.The old text told the author of a durability seam to "declare how it delivers instead —
FAILURE_PROPAGATION_CALLEES(repo-wide names) or the function-scopedFAILURE_PROPAGATION_SITES". Both maps key on the name of a callee thecatchreaches(
scripts/check-durability-degradation-log-level.mjs:505,:513), so acatchthat deliversits failure by returning an outcome object has nothing to put in either one — and the only
two remaining ways to green that gate are the two the gate's own header rejects: a baseline
entry for correct code, or a bolted-on
logger.error.The rewritten paragraph splits the declaration rule by how the failure leaves the
catch:DURABILITY_CRITICAL_CALLEESor eitherFAILURE_PROPAGATION_*map, never baselined, nevergiven a
logger.errorto satisfy the checker; pinned instead by its own file's testasserting the returned failure outcome (the
failed-receipt case is the reference shape),with its population read from
scripts/measure-return-propagating-durability-seams.mjs.The invariant is untouched: silent data loss must be loud. The gate is untouched — its fourth
honest limitation (
scripts/check-durability-degradation-log-level.mjs:79-99) already recordsthis boundary and already names the census script, so no line of that script needed to move.
Evidence
Census re-measured on this branch, reproducing the ruling's numbers exactly:
The instrument this paragraph governs:
node scripts/pm/dispatch-gates.mjs --commandsderives 14 families for this change set; all 14were run and reconciled with
--ran(14 derived, 14 run, 0 UNRUN). 13 green:✅ The line ceiling — ruled, raised, and green
The maintainer ruled the budget. His words, verbatim and untranslated:
Given as a live instruction to
session_019srGWGCBBCBHqcDoRZpQRhand recorded on card #16233 ascomment
5750261694; it rules the line budget that the standing letter-C ruling5716260390left unruled when it named the text. ⇒
scripts/pm/check-skill-line-ratchet.mjsnow carries['AGENTS.md', 1109], with the raise recorded above the entry in that file's own ruled-raiseconvention — measured cost, the re-measured rewrap headroom with its widths named, the ruling
verbatim, and the standing
CROSS_FILE_MOVESsentence.inherited:
21 / 20 / 20 — and as landed it has four lines above 88 bytes (89, 90, 89, 89; max 90), so it
sits at ≤90 B, not at 88 B. The conclusion is unchanged and if anything stronger: at 88 B a
rewrap would cost a line.
the gate's own
wrapLine, the paragraph reflows to 18 lines at 100 B and 15 at 120 B (the wholesection 88 → 69 at 120 B). ⇒ the honest justification for the raise is not that no width
saves lines, it is that re-wrap is not legal currency here: this file's 2026-08-17 rule
refuses re-wrap funding, and the 120-byte cap documents itself as codifying the corpus's
existing ≤91-byte ASCII wrap rather than mandating a reflow to it.
Clause-②: no — no published accept set, public export, enum member, error code or authorable
key moves; the surface is governance prose plus one shrink-only ratchet data value.
Landing is still the maintainer's hand
node scripts/pm/check-governed-merges.mjs --pr 19214→ exit 3, GOVERNED — a human merge isthe review record for this PR (#9495 regime),
AGENTS.md×1, landing tier H; the second path,scripts/pm/check-skill-line-ratchet.mjs, is not on the register and adds no governed path.⇒ This PR stays draft: ⛔ no ready flip, ⛔ no enqueue, ⛔ no auto-merge by any seat. A line
budget is a budget, not a landing permission.
Verified independently by the accepting seat on head
aa2e7408d(⛔ not taken from the dev'sreport): two files vs
origin/main—AGENTS.md+20/−10, byte-identical to the previous round, sothe ruled paragraph was not shrunk to buy lines — and
check-skill-line-ratchet.mjs+29/−1,one data value plus the comment block.
origin/mainwas merged in twice (32d6e4775,aa2e7408d); the previous headf2c3ebf6dis still an ancestor, so no history was rewritten onthis branch. 35 derived gate families, 35 run, 0 NOT-MEASURED, every one exit 0;
check:ratchet-remedy-authorityre-read and unmoved (this script classifiesexcluded).维护者速读(草稿)
改了什么
AGENTS.md里讲「降级日志等级」的那一段,重写了最后半段。原文要求:把失败交给调用方的catch,必须在门禁的两张表里声明「它是怎么交付的」。但那两张表的键都是被调函数的名字,而一个用
return { ok: false, error }把失败交还给调用方的catch根本没有可填的名字。新文字按「失败是怎么离开 catch 的」分成两种:靠调用交付的照旧声明被调者;靠返回交付的明确
写清「没有名字可声明」,不进任何名单、不进 baseline、也不准为了让门禁变绿而硬加一行
logger.error,改由该文件自己的测试钉住,并给出普查脚本作为「这类缝一共有多少」的唯一读数来源。⭐ 不变量本身没有动:静默的数据丢失必须吵。
为什么改
这是一条写在制度里却没人能照做的规则。今天不出事,只因为门禁当前看得见的那一类里这种缝是
0 个;树上真实存在的是 12 个(普查脚本现读,与裁决数字逐字一致),每一个都已由自己文件的
测试钉住,没有一个是未受保护的降级。真正的缺陷是那句话会把下一个开发者送进死路:正确的代码会
把门禁弄红,而唯二能弄绿的办法都是门禁自己明文拒绝的。本次改的是文字,仪器一行未动。
风险与代价(含回滚)
AGENTS.md这份受管文件的行数上限已经顶满(1099,余量 0),这一段净增 10 行。折行压缩买不来这 10 行(实测:旧段在 86/88/90 三种宽度下都是 10 行),所以要么由维护者裁一个
行数预算把上限抬到 1109,要么这段文字落不了地。开发席不自行抬上限。
pnpm check:durability-log-level在本分支现读仍是绿,36 条缝的判决一条没变。git revert即可,零运行时影响。席位意见
同意落地。⚠️ 本 PR 的卡归
domain:spec座位 5(session_019srGWGCBBCBHqcDoRZpQRh,座位贴 #19357)在维护者直派通道下复核并验收:上面每一条读数本席都在 head
aa2e7408d上独立重取过,⛔ 未采信 dev 的终报自述;棘轮只动了
:1466那一个数,AGENTS.md正文一字未改。domain:devx席(#6023),本席只做验收与记录,⛔ 不接管该卡、⛔ 不改它的标签或 assignee。
你要做的
条)。
裁一个行数预算—— 已裁:A,+10(1099→1109)。上限已按该裁定抬到 1109,pnpm check:pm-skill-ratchet由 exit 1 转 exit 0,裁决原话已写进棘轮注释块。此项无需再做。ready、不入队、不挂 auto-merge。这是本 PR 余下的唯一一步。
Authored by Claude Code, session
session_017ef78bLdybu3AffehKkhfk(domain:devxseat, PR #19214's own branch). Body last revised bydomain:specseat 5,session_019srGWGCBBCBHqcDoRZpQRh, under the maintainer's direct-dispatch channel — the ruling record above. ⛔ No seat flips this PR to ready.Generated by Claude Code