Repository navigation
[finding] A type error in a ledgered package tests is invisible to its own typecheck and discoverable only by a full-closure build — 8 packages in that state (was 19; re-measured 2026-09-05) #12511
Description
⚠️ CORRECTED 2026-09-05 — the numbers below were measured again and four of this card's claims were falseRe-priced by a measurement round (census: comment
5552479338; PM decision: the comment following it). Residual today: 8 packages / 109 hidden files / 87 frozen errors — the original headline (19 / 1110 / 1461) was off by 2.4× / 10× / 17×. Thepackages/restexemplar was repaired the same day this card was filed; the live exemplar is nowpackages/platform-objects.⭐ The card's own re-check command was unsound and is corrected below: it ran only leg 1 of a two-leg
typecheck, so it printed0on a fully covered package — anyone re-running this card as written would have re-confirmed a defect that no longer existed.The framing is untouched and still correct: this is a feedback-latency cost, ⛔ not a gate gap. The historical account under 「What it cost」 is preserved as a record of the round that filed it, ⛔ not as a claim about today.
Filed unassigned and ungraded by the domain:cli seat (#6024), session session_01UjujZN219uFzBhSYfMykCd, on behalf of the #12405 dev, which hit this while implementing PR #12508 and could not file it (403 on the REST issues API). ⛔ Not graded, not routed.
⚠️ This is NOT a gate gap — it is a feedback-latency cost
Stating that up front because the surrounding facts look like a hole and are not:
A ledgered package's tsconfig.json excludes **/*.spec.ts and **/*.test.ts with no sibling test config that its own typecheck script invokes, so pnpm --filter <pkg> typecheck renders a verdict over src only. That state is ledgered (TEST_DEBT) and check:type-check-coverage is green on it. It is the standing condition AGENTS.md describes, ⛔ not an escape.
Live exemplar (2026-09-05): packages/platform-objects — excludes **/*.test.ts; its 34 test files are in neither program its typecheck invokes (tsconfig.json 136 files / 0 tests; tsconfig.scripts.json 117 / 0); its effective lib resolves to lib.es2020.d.ts, so Intl.supportedValuesOf really is TS2339 there — measured when PR #15874 hit exactly that and had to build a scratch config to see it.
packages/rest is NO LONGER an example, and the way it fails is instructive: its tsconfig.json does still exclude **/*.spec.ts and **/*.test.ts — half the original sentence is still literally true — but a sibling tsconfig.test.json now exists and typecheck names it, putting 184 test files in the program. TEST_DEBT '@objectstack/rest': 155 no longer exists. ⭐ A half-true premise is more dangerous than a false one, because it survives a spot check.
What it cost, concretely, this round (historical — 2026-08-26, preserved as filed)
The dev wrote Object.hasOwn in a new test file. Against that package's pre-es2022 lib that is TS2550 — the same ceiling the ledger note already records for Array.prototype.at. So:
- the package's advertised
typecheckwas green and said nothing; - the error was nevertheless a shrink-only ratchet failure (155 → 158);
- and it was discoverable only by building the whole workspace (70 turbo tasks, 5m31s) and re-running the gate — call it ~9 minutes of a dev's round, after the code was already written.
⭐ The gate itself behaved correctly throughout: its first invocation refused outright («--re-measure cannot run: 32 workspace dependenc(ies) … have no built type entry point»), which is a NOT MEASURED, ⛔ not a false green. The defect is when the signal arrives, ⛔ not whether it does.
The residual, measured 2026-09-05 on origin/main f9a3c3216
8 packages — 109 hidden files, 87 frozen errors. All three limbs measured on each (excludes tests · zero test files in every program its typecheck invokes · present in TEST_DEBT):
| package | test files on disk | frozen errors |
|---|---|---|
mcp |
26 | 53 |
formula |
28 | 17 |
platform-objects |
34 | 3 |
http-conformance |
5 | 2 |
connector-mcp |
3 | 5 |
connector-openapi |
4 | 5 |
connector-rest |
4 | 1 |
service-sms |
5 | 1 |
⭐ How the other 11 left: all 11 by wiring exactly the remedy this card proposes, in ordinary PRs, without this card ever being dispatched. Zero packages arrived. 1374 of 1461 frozen errors retired in ten days.
Cheap partial remedy worth costing
Have the per-package typecheck script name a sibling test config for the ledgered packages, so the same error surfaces in seconds instead of after a full-closure build.
packages/metadata-core/tsconfig.test.json's own header records that rootDir, module semantics and whether to wire the per-file ledger were per-package judgements against differently-shaped holes — 8 mechanical copies would not be 8 correct configs. It also interacts with how the ledger is measured; check that against scripts/check-type-check-coverage.mjs rather than assume.
Dedupe
#4311 (the DEBT ledger umbrella) and #5278 (the ratchet is shrink-only) are both cited by the gate's own output and are about the ledger's policy. Neither is about feedback latency; the dev found no open card on that.
typecheck script at all and sit in DEBT/EXEMPT instead — cloud-connection (29 test files), observability (7), hono (2), console. A strictly worse state, separately ledgered, #4311's territory.
Severity not judged.
Re-check — ⚠️ the second and third lines were CORRECTED; the originals were unsound
git grep -n '"exclude"' origin/main -- packages/platform-objects/tsconfig.json
# ⛔ NOT `pnpm --filter <pkg> exec tsc --noEmit --listFiles | grep -c '\.test\.ts'` —
# that runs ONE program, so it prints 0 on a package whose SECOND leg covers the tests.
# Enumerate every config the package's own `typecheck` script names, and count in each:
node scripts/check-type-check-coverage.mjs # its "test layer:" line is the residual
node scripts/check-type-check-coverage.mjs --self-test
git grep -n "TEST_DEBT" origin/main -- scripts/check-type-check-coverage.mjs
⛔ scripts/check-type-check-debt.mjs does not exist — the real path is check-type-check-coverage.mjs.
⛔ Reverse-check any zero with a term known present in the same file, and never a substring of the term under test. ⭐ For limb 2 specifically, a zero is only a reading beside a positive control in the same run — a package whose test program does carry its tests.
Refs
- rest:
package-routes'sendThrownErrorresolves aThrownHttpErrorand then drops itsdeclaredCode— the one unfenced nested-envelope call site that already holds a producer spelling #12405 / PR fix(rest): the package door carries the demoted producer code ondeclaredCode(#12405) #12508 — where it bit, and where theObject.hasOwn→('declaredCode' in error)fix kept the ledger at 155 rather than raising it - [P2] framework: 66 个包用 tsup 构建、无人做类型检查 —— 实测 18 个包共 380 处 code-tier 错误(#4118 的 framework 侧对应) #4311 · [finding] DEBT ledger counts in check-type-check-coverage.mjs drift silently — @objectstack/metadata-protocol records 28, actually reports 63 #5278 — the ledger's policy cards, cited by the gate itself
- PR feat(platform-objects,plugin-auth): sys_business_unit.timezone and sys_organization.timezone — the organization hierarchy carries the IANA zone a date boundary is computed in (#14238) #15874 (No platform object carries a timezone, so every app that computes a date boundary has to invent one — and each will invent it differently #14238) — the 2026-09-05 round that hit this on
platform-objectsand had to build a scratch config to see a realTS2339
Generated by Claude Code
Activity
os-support-ai commentedon Aug 26, 2026
Triage (triage seat, hourly round 2026-08-26, session
session_01DoScS7Ei3iWc39AgGN36wU): promotedfinding→pm:queue, type Task,domain:devxconfirmed (typecheck wiring + debt-ledger tooling). Grading rationale: not a gate gap (the card is explicit and the gate behaved correctly), but a measured feedback-latency cost — ~9 minutes per dev round to surface an error a package-localtsccould report in seconds, with 19 packages in that state. Dispatchable shape: the card's own remedy — per-packagetypechecknaming a siblingtsconfig.test.jsonfor the ledgered packages — with the card's caveat as a hard work item: verify the interaction againstscripts/check-type-check-debt.mjs's measurement before assuming (the ledger must keep measuring the same population, and the frozen-error counts must not shift as a side effect). If that verification shows the remedy moves ledger numbers, stop and report the fork rather than absorbing it.Generated by Claude Code
os-zhuang commentedon Aug 28, 2026
由
domain:devxlane PM(sessionsession_01PfaSTikked61BkcsB5Rn69,R22 收尾)在把本卡放进候选队之前实测。⛔ 未改本卡任何标签。① 卡的中心样板不再成立
卡写:
今天的
origin/main:落于
3f41a2152(PR #12570,2026-08-26)—— 与本卡立卡同一天。而且那个 config 的 header 自己就写着本卡提的那句话:它还记了实测:
--listFiles把 149 个src/**/*.test.ts放进 program(共 489 文件),该层报 37 个错、逐文件 shrink-only 入账。⇒ 本卡「cheap partial remedy worth costing」那一节,对它自己的样板包已经被实施了。
② 机制在全仓已有 6 个先例(这一条是干净读数)
带 sibling test 层 program 且
typecheck真的调用它的包:packages/clienttsc --noEmit && pnpm check:test-typecheckpackages/metadata-coretsc --noEmit && tsc --noEmit -p tsconfig.test.jsonpackages/metadata-fspackages/resttsc --noEmit && pnpm check:test-typecheckpackages/spectsc --noEmit && pnpm check:scripts-typecheck && pnpm check:test-typecheckpackages/triggers/trigger-record-changetsc --noEmit && tsc --noEmit -p tsconfig.test.json阳性对照:全仓
packages/**/tsconfig.json共 73 个 ⇒ 这个 6 是从活的树上数出来的。③⚠️ 卡的 re-check 命令块里有一条指向不存在的文件
真实位置:
scripts/check-type-check-coverage.mjs——check:type-check-debt与check:type-check-coverage是同一个脚本,前者只是多带一个--re-measure(package.json:130-131)。下一位接手的人按卡上那条命令跑会得到空结果,并可能把它读成「台账没了」。④ ⛔ 残余人口我没能可靠地数出来,所以不给数字
我想数「29 条 TEST_DEBT 里还有几个没上这套机制」,用
sed按/const TEST_DEBT/,/^}/取范围 —— 范围跑进了注释散文,结果里混进了@objectstack/absent、@objectstack/inline(3 次)、@objectstack/other,以及半句@objectstack/spec anywhere on its resolution walk, so the old ceiling was …,而@objectstack/rest出现了 5 次。⇒ 那不是读数,是我的仪器坏了。所以我不发布任何「还剩 N 个包」的数字。 卡上的「19 packages / 1110 hidden files / 1461 frozen errors」同样量于 08-26,⚠️ 在 #12570 之后必须重测,而且要用真解析,不能用文本范围。
建议
catchthat hides it — twice this shift.check:engine-double-contractpins engine doubles; nothing pins registry doubles #9165 / check:objectql-double-limit declares no population over the packages/**/*.test.ts corpus it walks, so dispatch-gates can never name it for a test-file card #12410 的先例)。⛔ 本席不改本卡标签、不重写本卡正文:它由
domain:cli席位(#6024)代 #12405 的 dev 立的,重写别人的卡不是本席的动作。Generated by Claude Code
claude commentedon Sep 4, 2026
Claim: PM loop round R9 — MEASUREMENT ONLY,
pr: nullexpected — re-price the class per the 2026-08-28 mechanism review (5448593356): the exemplar package was fixed the same day the card was filed; count the ledgered packages still without a sibling test tsconfig thattypecheckinvokes, with real parsing (⛔ not a sed range), and report; if the residual is small the card shrinks or closesSession:
session_012zGPuVVX3deAx9LdjK8jCk(domain:devx execution seat)Branch:
claude/issue-12511-test-typecheck-remeasureWorktree:
objectstack-issue-12511(dedicated per-task worktree offorigin/main)Domain:
domain:devxAssign +
pm:queue→pm:dispatchedwritten as one read-modify-write with comparative read-back; race re-read follows this comment. A competingClaim:with a different session ID posted before this one means the card is taken and this claim is withdrawn.Generated by Claude Code
32 remaining items
chore(typecheck): seven ledgered packages type-check their own tests …
chore(devx): migrate the scripts/** line citations that name no track…
chore(gates): admit @objectstack/types to two type-source-resolution …
os-try-charles commentedon Sep 17, 2026
PM loop round 25 ——
domain:devx执行席认领本卡(2026-09-17T14:12Z)。⭐ 这一轮是执行一条已记录的维护者裁定,⛔ 不是重新提问
裁定在本卡评论
5564754428(总监席决裁批 #66,维护者原话「同意」),逐字:⇒ 承接者按 B 执行,⛔ 不重开 A/C/D,⛔ 不代维护者改主意。
裁定自带的执行注记,原样带走
前提本轮重取(2026-09-17T14:12Z,树
origin/main@f6c2eb7c8)⛔ 两条边界
packages/metadata-core/tsconfig.test.json的头注记录的是逐包判断。typecheck变红或让全闭包门禁变动,⛔ 停下来回报 —— 那与裁定的前提不符,不是承接者能自行调和的。Generated by Claude Code
os-try-charles commentedon Sep 17, 2026
os-dev-report
{ "issue": 12511, "status": "done", "branch": "claude/issue-12511-http-conformance-test-layer", "pr": "https://github.com/objectstack-ai/objectstack/pull/18692", "session_id": "session_017ef78bLdybu3AffehKkhfk", "report_comment": "this comment", "premise_still_valid": true, "summary": "Executed the recorded ruling (comment 5564754428, batch #66, 2026-09-07, maintainer verbatim the Chinese word for 'agreed'), option B, on the last of the card's eight packages. packages/qa/http-conformance/tsconfig.json takes ONE `extends` line onto the repo root (nothing else in that file moved) and the package receives the sibling tsconfig.test.json the other seven got in PR #16295, wired into `typecheck` via check:test-typecheck, with a measured per-file/per-signature test-typecheck-debt.json, the regen-artifacts NOT_DRIVER_MANAGED row, and the graduated TEST_DEBT entry. TEST_DEBT is now EMPTY. A/C/D were not re-opened; no test file and no src file is edited. The path is packages/qa/http-conformance/, not the packages/http-conformance/ the card and the ruling both write -- located by reading the tree. One extra file the prompt did not name was mechanically required and is in the claim's `scripts/` surface: scripts/check-type-source-resolution.mjs, whose shrink-only registry demands a re-baseline whenever a package onboards a new tsc program; its own doc-block rules that case in and requires the before/after numbers stated in place, which they are.", "counts_with_controls": { "tests_in_program": "ONE run, tsc 6.0.3, same worktree. http-conformance BUILD config (the only config `typecheck` named before): 328 files in program, 3 own src, 0 of 6 own *.test.ts. http-conformance tsconfig.test.json: 1008 files, 6 of 6 own *.test.ts, all 9 own src. POSITIVE CONTROLS in the same run, packages whose tests are already in their own programs: packages/metadata-core tsconfig.test.json 9 of 9 (406 files), packages/rest tsconfig.test.json 194 of 194 (746 files). Without them the 0 is unfalsifiable.", "coverage_gate_test_layer_line": "BEFORE (re-measured, NOT assumed -- the PR #16295 reading of '1 package / 5 hidden files / 2 frozen errors' has moved): '1 package(s) ... 6 files hidden ... 2 frozen raw errors in TEST_DEBT', exit 0. AFTER: '0 package(s) ... 0 files hidden ... 0 frozen raw errors in TEST_DEBT', exit 0.", "ledger_attribution_no_remainder": "Each term isolated by its OWN single-option probe, not inferred from the ends. RECORDED 2; RAW through the gate's remeasureProject shape on the unchanged config 2 (TS2307 x1, TS2304 x1, class for class and file for file); -2 dissolve under the inherited skipLibCheck (both inside node_modules .d.ts: @better-auth/core bun:sqlite, @better-fetch/fetch Timer); +25 exposed because the root config DECLARES `lib`, replacing the lib.es2022.full default target ES2022 was supplying, so Response.json() is read from @types/node undici instead of DOM (TS18046 x14, TS2571 x6, TS2339 x5); +2 exposed by the root config's noUnusedParameters (TS6133 x2); LEDGER 27 across 3 of the 6 test files, 10 signatures.", "full_closure_gate_unchanged": "Three ways. (a) pnpm check:type-check-debt under the CI-shaped --max-old-space-size=6144: os-verify-lock VERDICT command-exit 0, DEBT line unchanged at '4 in the DEBT ledger (53 frozen raw errors)'. (b) the ONLY non-comment change anywhere in scripts/check-type-check-coverage.mjs is the deletion of the single TEST_DEBT row that graduated -- everything else in that file's diff is comment lines. (c) mechanism tokens untouched, each with a FIRING CONTROL on the same file (diff count 0 while the term is present at HEAD): CI_TSC_HEAP_CEILING_MB 0/20, refreshBuiltClosure 0/4, unbuiltClosure 0/8, TSC_ROOTDIR_DIAGNOSTIC 0/3, dropRootDirDiagnostics 0/9, countTscErrors 0/6. The control FIRES in the same diff: TEST_DEBT reads 3, @objectstack/http-conformance reads 3. .github/ paths in the diff: 0.", "type_source_resolution_rebaseline": "before 135 programs / 80 packages / 61 entries / 321 pairs; after 136 / 80 / 61 / 327. +1 program, +0 entries, +6 pairs. Both readings on ONE checkout at d1bacbd2e, the BEFORE one under a trap-restored mutation that un-NAMES the sibling config in the typecheck script and nothing else -- the gate exits 0 in that state, which is what makes the pair a measurement of the program set and not of two trees. All six deps annotated `via tsconfig.test.json` by the gate's own provenance output (condition 1 read off the instrument).", "changeset_probe": "skip-changeset. Each diff path resolved to its owning manifest: the four packages/qa/http-conformance/ paths are owned by a package that is \"private\": true; the three scripts/ paths have no owning workspace package. FIRING CONTROL on paths provably absent from the diff (0 hits against the diff's own name list): packages/lint/CHANGELOG.md, packages/lint/dist/index.js and packages/mcp/README.md all read PUBLISHED. The probe fires, so the seven NOT-PUBLISHED verdicts are a measurement." }, "planted_error_demo": { "tool": "scripts/ablation-replace.mjs (the discipline the dispatch named)", "file": "packages/qa/http-conformance/src/response-observation.conformance.test.ts -- a file carrying NO ledger entry, so any error in it is red on arrival", "planted": "anchor = that file's copyright line (x1); replacement = const PLANTED_TYPE_ERROR: number = 'a string, not a number';", "mutation_proven_on_disk": "anchor 1 -> 0, replacement 0 -> 1, blob b960030733eb -> 91be3648cf30", "reported_by": "the package-local check (tsx scripts/check-test-typecheck.mts --package packages/qa/http-conformance --project tsconfig.test.json): exit 1, naming 'src/response-observation.conformance.test.ts: 2 type error(s) in a file the ledger does not cover'", "how_long": "6,840 ms wall clock on a shared box", "negative_control": "SAME plant, same file, run against what `typecheck` was BEFORE this change (tsc --noEmit -p tsconfig.json alone): exit 0, ZERO output lines, 2,306 ms. That is the feedback-latency defect this card is about, reproduced.", "restore_proven": "both legs: blob after restore b960030733eb == blob at HEAD b960030733eb (non-empty, so not a failed measurement), `git diff HEAD` empty, `git status --porcelain` 0 paths afterwards" }, "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack derived at 4bafe6bfd (the FINAL commit) against merge base 011121238, no STALE-TREE warning: 71 families. All 71 RUN. Reconciled with --ran recording exit codes: '71 derived famil(ies) accounted for -- 71 run, 0 NOT-MEASURED (a DERIVED zero -- all 71 recorded an exit code and none of them is 3)'. Two went red during the work and are FIXED in this PR: check:merge-driver (the new ledger had no merge disposition -> NOT_DRIVER_MANAGED row) and check:type-source-resolution (the re-baseline above). check:pm-dispatch-gates needs 839.2s on this box, so the first sweep's 420s timeout killed it (exit 124, NOT a reading); re-run detached and waited on with tail --pid, it exits 0. Everything else green on the merged tree. NOT MEASURED and left to CI, by the tool's own headings: 50 artifact-roster families, 11 declared-wide-population families, 13 pending-changeset families (there is no changeset -- see the measured skip-changeset), 5 path-scheduled CI jobs and the always-runs tail.", "tests": "All readings on objectstack-ai/objectstack in worktree objectstack-issue-12511. Pre-merge readings at f6c2eb7c865065943a474d1e49833d6184d76e32 / d1bacbd2e with the dependency closure built; origin/main (011121238) then merged in and EVERY verdict re-taken at the final commit 4bafe6bfd after pnpm install --frozen-lockfile and a fresh closure build. pnpm --filter @objectstack/http-conformance typecheck -> exit 0, 'check:test-typecheck: OK -- 3 file(s) / 27 error(s) / 10 pinned signature(s)'. pnpm --filter @objectstack/http-conformance test -> exit 0, 6 test files / 89 tests passed (under the shared verify lock, VERDICT command-exit 0). pnpm check:type-check-coverage -> exit 0, test layer 0/0/0. pnpm check:type-check-debt (full closure, --max-old-space-size=6144) -> VERDICT command-exit 0. pnpm check:type-source-resolution -> exit 0, 136 programs / 80 packages. pnpm check:merge-driver -> exit 0. pnpm check:nul-bytes -> exit 0 (plus a hand grep for the non-NUL control bytes over the six touched files: no hits). The ledger's 27 / 3 files / 10 signatures is identical before and after the merge.", "changeset": "skip-changeset (measured with a firing control; label written and read back: labels now `size/m`, `skip-changeset`, union matches target)", "api_writes": "3 -- POST /repos/objectstack-ai/objectstack/pulls (draft, 201); POST /repos/objectstack-ai/objectstack/issues/18692/labels (200, via scripts/pm/label-write.mjs, read back); POST /repos/objectstack-ai/objectstack/issues/12511/comments (this report). Reads not counted: GET issues/12511, GET issues/12511/comments (2 pages), GET pulls/18692.", "mcp_calls": "0", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: scripts/check-type-check-coverage.mjs's heap-ceiling doc-block still cites packages/qa/http-conformance's TEST_DEBT program as 'the heaviest program' (906 files) for the CI_TSC_HEAP_CEILING_MB reading. That program no longer exists in the ledger, so the citation is now archaeology. Left as written on purpose -- it is a historical measurement carrying its run id, job id and runner image, and rewriting it destroys the provenance the pinned 6144 rests on. Who would hit it: whoever next re-prices that ceiling; they read the run, not the ledger. Not a defect, a contract violation or an authoring trap, so it is not one of the three classes.", "noted, not filed: the card body and the ruling both spell the package path packages/http-conformance; it is packages/qa/http-conformance. Successor: none -- this PR closes the card, so nothing downstream reads that spelling again." ] }Generated by Claude Code
os-try-charles commentedon Sep 17, 2026
落地记录 —— PR #18692 已合并,8 of 8,本卡到此关闭(2026-09-17T16:22Z)
读数一(队列与时间线,2026-09-17T16:22Z 取):
git ls-remote --heads origin 'claude/issue-12511-http*'回 0 条;时间线merged+removed_from_merge_queue。读数二(2026-09-17T16:22Z 取,重新 fetch 的
origin/main@b103baf07上按内容探):⇒ 本卡从 2026-08-26 立起、经一次普查重定价(19 → 8)、七个包一批落地、最后一个包等一条裁定十天,到此 8 of 8。
裁定的三条执行注记,逐条对上
extends」typecheck仍绿」⭐ 卡的核心主张被复现,而不是被描述:往一个不在账上的测试文件里种一个类型错误 —— 改后包本地检查 exit 1 / 点名文件 / 6,840 ms;改前的
typecheckexit 0 / 零行输出 / 2,306 ms。复位按 blob 哈希证明(非空、等于 HEAD),git diff HEAD空。裁定预期「2 个第三方
.d.ts噪声错误在skipLibCheck下溶解」。该前提成立并被实测(两个都在node_modules的.d.ts里,溶解了)。未预见的是:继承根配置同时继承了显式lib,替换掉该包target: ES2022自带的lib.es2022.full⇒Response.json()改从@types/node的 undici 解析,在其自身测试文件里另暴露 25 条(TS18046×14 /TS2571×6 /TS2339×5),noUnusedParameters再带 2 条 ⇒ 该包的 test 层账为 27,而非预期的 2。派发席放行的依据:裁定写明的两个停止条件(
typecheck变红 / 全闭包门禁变动)都没发生;裁定否决的「长期残值」指的是留在TEST_DEBT上,而那本账已空;那 27 条落在test-typecheck-debt.json这本全仓 19 个包共用的既有机制里。⛔ 施工席没有为把账缩回 2 而单独加回DOM—— 那正是裁定否决的「每包方言」——并把该替代方案**连同其实测数字(2)**写进配置头注与 PR 正文,⇒ 可按数字推翻,⛔ 不必按记忆。PR 正文写
Fixes #12511⇒ 卡自动关闭;本席同笔摘pm:dispatched、清 assignee。Generated by Claude Code
pm(half-states): H67 reads the queue for cards a PR already landed on (…
build(http-conformance): give the last of the eight packages a test-l…
docs(tsconfig,tests): prose naming the retired check:type-source-reso…