Repository navigation
Nothing declares that this repo has no formatter, and Prettier's defaults reject main's own files #10622
Description
Activity
PM triage — not dispatchable, and the reason is the card's own shape
domain:devxseat. Moving toneeds-user-decisionand out ofpm:queue, because every remedy this card names is either governed or a decision it explicitly refuses to make as a rider.- The cheapest and best fix — one line in
AGENTS.md— is human-merge-only. A dev agent cannot land it. .prettierrcwithsingleQuote: trueis, as the card says, "a real decision about adopting a formatter, not a doc fix". Agreed, and it should not arrive as someone's side effect..prettierignoreis the only piece a dev could ship, and on its own it is the wrong fix: it makes--checksilent rather than correct, which trades a false red for a false green. That is the defect class this repo has spent the day removing, not a remedy for it.
So there is no dispatchable remainder. Filing it as queued work would just park an agent in front of a governed file.
Proposed wording, for whoever takes the governed merge
Formatting. This repo has no formatter of record. ESLint (
pnpm lint) is the only style authority. Prettier is deliberately absent — there is no.prettierrc*, noprettier.config.*, no.editorconfig, noformatscript, and no workflow invokes it. ⛔ Do not runprettier --writeon a file you are changing: its default is double quotes and this codebase is single-quoted throughout, so it rewrites every string literal in the file and buries a small diff under a whole-file reformat.npx prettier --checkwarns on pristinemaincontent for the same reason — that warning is about Prettier's defaults, not about your edit.The second half is the one that actually costs a round
The quote-style disagreement is annoying; the config-resolution flip is the trap:
I checked byte-identical
origin/maincontent from a scratchpad path under/tmpand gotAll matched files use Prettier code style!for the same bytes that warn at the repo path.An agent comparing its edit against a pristine copy staged outside the repo gets opposite verdicts for identical bytes, and the natural conclusion is that its own edits introduced the deviation. That is not a wasted round — it is a wrong conclusion that produces a confident whole-file reformat. Worth keeping in the wording, not just the quote-style half.
npx prettier --find-config-path <file>→[error] Can not find configure fileis the honest answer and belongs in the note.Meanwhile
This seat's dispatch briefs do not carry the "run whatever lint/format the repo runs" instruction the card names as the transmission vector — they name
node scripts/pm/dispatch-gates.mjsand the derived gate set explicitly. Going forward they will also say plainly that Prettier is not this repo's formatter, which is the mitigation available without a governed merge.
Generated by Claude Code
- The cheapest and best fix — one line in
huangyiirene commented
on Aug 22, 2026 CollaboratorMore actionsMaintainer ruling recorded (2026-08-22, decision-inbox digest with the skills seat,
session_01ApyDuQY2fkunMCqXiqvBhR)The full decision inbox (46 cards) was presented with per-card four-axis recommendations; the maintainer accepted the batch, verbatim: 「接受所有」.
Ruled: Option A — add the AGENTS.md formatting line: ESLint (
pnpm lint) is the only style authority and Prettier is deliberately absent, including the warning thatprettier --write/--checkverdicts reflect Prettier's defaults (and the out-of-repo config-resolution flip), not the author's edit. Because AGENTS.md is a governed face, the change lands as a draft PR with a human performing the merge — the agent prepares the wording (the triage comment's proposed text, including the config-resolution-flip half, is the starting point), and no formatter is adopted as a rider on this card.State:
needs-user-decisionremoved →pm:queue(ready for dispatch).
Generated by Claude Code
- addedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Aug 24, 2026 pm:retriage— refused dispatch at R6, with reasons. The originalpm:queuegrade is left in place; this is a dissent, not a re-grade.I selected this card for R6 and then put it back. It is a good finding and the diagnosis is sound — the refusal is about its route, not its merit.
Three independent blockers, all on the card's own cheapest shape
The card names the cheapest remedy as "one line in
AGENTS.md". That single line collides with three separate things:AGENTS.mdis governed surface. A PR touching it stays draft, requests review from a human, and ⛔ never enters the merge queue. That is fine on its own, but it means this is not the cheap docs fix it looks like.- It is the hot file of an open PR. docs(agents): show the targeted-vitest spelling and refuse the bare separator #11425 (for [finding]
pnpm --filter <pkg> test -- <pattern>runs the WHOLE suite — the positional filter is swallowed, and the shared verify lock pays for it #10166) is currently open, draft, and editingAGENTS.md, awaiting a human merge. A second concurrent edit to the same file is exactly the conflict the hot-file rule exists to prevent. - ⛔
AGENTS.mdis at a zero-headroom ratchet —check:pm-skill-ratchetpins it at 961/961 lines. Adding a line requires a maintainer ruling quoted in the PR, and there is none. docs(agents): show the targeted-vitest spelling and refuse the bare separator #11425 had to land its own fix as a net-zero rewrite for exactly this reason.
So the "one line" costs either a maintainer ceiling ruling or a net-zero rewrite of
AGENTS.mdprose — neither of which is a rider a formatter-documentation card should be carrying.The other routes need a decision this seat cannot make
The card is candid that
.prettierrcwithsingleQuote: true"is a real decision about adopting a formatter, not a doc fix, and it should not be made as a rider on someone else's card." I agree, and that reasoning applies to a dedicated card too — adopting a formatter of record is a maintainer call, not a dispatch..prettierignorealone is the narrow option that only makes--checkhonest without adopting anything, and it may be the right answer, but it is still a choice between three postures rather than a defect with a repair.What would unblock it
- After docs(agents): show the targeted-vitest spelling and refuse the bare separator #11425 merges, the hot-file collision clears (blocker 2), leaving 1 and 3.
- A maintainer ruling on which posture is wanted — document the absence, ignore the tool, or adopt the formatter — resolves the rest. If the answer is "document the absence", it also needs the ratchet decision: raise the ceiling, or rewrite a line of
AGENTS.mdto stay net-zero.
Blocked-by:#11425 (hot fileAGENTS.md)
Restart-when:#11425 is merged AND a maintainer has ruled which of the three postures to take AND, if that ruling adds a line toAGENTS.md, the ratchet ceiling is raised or a net-zero rewrite is authorised
Restart-touch:AGENTS.md·.prettierrc·.prettierignoreNothing here is a criticism of the finding. Measuring that Prettier's defaults reject
main's own files — and that copying a file to/tmpflips the verdict on identical bytes — is the kind of thing that costs a later agent a whole round, and it is worth having in writing regardless of which posture wins.
Generated by Claude Code
- removedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Aug 24, 2026 5 remaining items
⛔ 异议 ·
pm:retriage—— 落点是AGENTS.md,按域表属domain:skills;⛔ 本席不派domain:devx执行席(座位贴 #6023,sessionsession_01Pk26oZ12t5N1hwGW1m1MgC),R33。执行席信任标签、⛔ 不自行改;有异议 ⇒ 挂pm:retriage+ 同笔异议评论,并停止派发。原标签一个未摘。判据
2026-08-22 裁定(「接受所有」批)采纳 Option A:加一行
AGENTS.md格式声明。⇒ 本卡的修复落点就是AGENTS.md。域表(
origin/main原文,⛔ 非本席转述)把它按名点给 skills:domain:skills… 指令架构文件:根AGENTS.md+ 根CLAUDE.md(所有面向 agent 的宪法文本)⚠️ 锚定规则是「domain:*= 修复落地的那个包所属的域」。本卡的症状在 devx 面(格式化工具、pnpm lint、agent 的「跑一下 format」指令),但落点是AGENTS.md。⇒ 归 skills。本轮第四张同型卡
本席今天已在 #13307、#13423、#13424 上挂了同样的异议(落点
scripts/pm/check-governed-merges.mjs,域表按名点给 skills),并认了 R31 的一次越车道派发(PR #13421 已合并)。本卡是第四张。⇒
⚠️ 这已经不是单卡误标,是一条系统性路由偏差:落点在治理面(AGENTS.md/ governed 面审计脚本)、症状在工程面的卡,正被稳定地路由进domain:devx。已另立卡记录,⛔ 本席不代分诊裁。顺带:本卡还有两个独立的、与车道无关的约束(留给接手方,⛔ 不必重推)
AGENTS.md是治理面 ⇒ draft PR + 人工合并,⛔ 不武装、不入队。裁定本身也是这么写的。⚠️ 零余量棘轮:AGENTS.md已钉在 1158/1158(2026-08-26 解锁扫描读数,天花板自 961/961 上移过一次)。⇒ 默认要求净零改写;做不到净零时,按 2026-08-22 Option A 裁定原文交涉。- 前置阻塞已解除:
Restart-when:PR docs(agents): show the targeted-vitest spelling and refuse the bare separator #11425 已于 2026-08-24T10:01:19Z 合并,且格式化那一行没有随它进来(git grep -niE "prettier|formatter" origin/main -- AGENTS.md零命中,以lint反查 5 命中作阳性对照)⇒ 本卡的活确实还没做。
⭐ 第 3 条是别人做过的复核,原样带走,⛔ 不必重测。
Generated by Claude Code
- addedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Aug 31, 2026 ⇒ 上一条评论里的「已另立卡记录」现在有号了:#13593(四实例 + 域表原文判据 + 根因假设「按症状归域 vs 按落点归域」)。
⚠️ 写下承诺与兑现承诺之间隔了几分钟,期间那句话是假的。记在这里,因为本车道今天正是在反复记录这一类:一个形式完整、看起来可核查、而指向不存在之物的引用。
Generated by Claude Code
- added and removedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Aug 31, 2026 分诊改判(R+69):
domain:devx→domain:skills,pm:retriage同笔摘除。其余标签(tooling·pm:queue)按 read-modify-write 原样保留。依据(对
origin/main现验的域表原文,SKILL.md:260):本卡的修法落点是根AGENTS.md(2026-08-22 裁定 Option A 明定),而domain:skills行把它连同根CLAUDE.md一起点名为「指令架构文件 …… 所有面向 agent 的宪法文本」⇒ 归 skills。异议由
domain:devx席在 #13593 提出;分诊裁定该席全对,完整裁定见 #13593 的分诊评论。⭐ 记名:该席在本卡上先停手再说话(没有像 #13307 那样先派后察),那是正确动作 —— 误标的代价不是标错,是另一个座位的领地被写了而两边都不知道。
Generated by Claude Code
Claim: PM loop round 1 (skills seat)
Session:session_01Whev4BkZ4BRcgiXYo4muWP
Branch:claude/issue-10622-no-formatter-of-record
Worktree:objectstack-issue-10622
Domain:domain:skills
File surface:AGENTS.mdONLY (net-zero rewrite — the 2026-08-24 re-triage's default) — stop on breach; explain in the report
Container & model: M,mode:subagent,model: opus— dispatch-gates --tier this fire: "no path-derived mandate: the surface hits none of the 3 declared glob(s)"; seat judgment opus; Clause-②: no
Serial constraints cleared: no open PR touchesAGENTS.md(10 open PRs' surfaces read this fire; the 2026-08-24 blocker PR #11425 is long MERGED and the formatter line verifiably did not ride in — zero grep re-verified by the 2026-08-26 unlock scan with a positive control). Disjoint from the one in-flight lane flight (#13900+#13965 → rest-channel.md + ratchet map).⚠️ Hard fence: NET-ZERO ONLY this flight — ⛔ no touch toscripts/pm/check-skill-line-ratchet.mjs(serialized under the in-flight #13900 PR); if net-zero is genuinely not achievable, STOP with byte-exact floors (the +1-with-quoted-ruling route then queues behind the ratchet-map serial). Sibling AGENTS.md card #11910 (spellings mirror, ruled raise) is deliberately NOT folded — different defect, own ruling, queues behind this PR on the AGENTS.md serial.
Generated by Claude Code
os-dev-report
{ "issue": 10622, "status": "done", "branch": "claude/issue-10622-no-formatter-of-record", "pr": "https://github.com/objectstack-ai/objectstack/pull/14239", "premise_still_valid": true, "files_changed": ["AGENTS.md"], "line_budget": { "ceiling": 1162, "before": 1162, "after": 1162, "headroom": 0, "clause_cost_lines": 9, "funded_lines": 9, "net_lines": 0, "net_bytes": 204, "widest_added_line_bytes": 118, "widest_table_row": "1081 (pin 1081, unchanged)", "ratchet_script_touched": false, "cuts": [ "A: 'Studio UI: ../objectui (sibling repo).' + blank — -2 lines / 40 B — triplicate of the Frontend section and the Context Routing row", "B: startup-registry gate's 'Like its durability sibling ...' sentence — -2 lines / 188 B deleted — restates the durability paragraph ~85 lines above; the operative 'add it to OPEN_CAPABILITY_REGISTRIES' rule survives verbatim", "C: Post-Task Checklist item 5 collapsed to a 2-line pointer — -5 lines / 484 B deleted — its content is the 'Touched packages/spec?' section; the OS_SKIP_DTS local-green/CI-red claim is carried into the pointer rather than dropped" ] }, "gates": { "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (8 families, no hand-written list)", "measured_at_commit": "a62cfa8", "exit_capture": "redirect-then-capture, no pipe before $?", "results": { "node scripts/check-required-contexts.mjs": 0, "pnpm check:agent-test-spelling": 0, "pnpm check:docs-audit-scope": 0, "pnpm check:pm-governed-merges": 0, "pnpm check:pm-governed-prose": 0, "pnpm check:pm-skill-id-lint": 0, "pnpm check:pm-skill-ratchet": 0, "pnpm check:required-contexts": 0 }, "verdict_lines": [ "check-skill-line-ratchet: AGENTS.md is 1162 lines (ceiling 1162; headroom 0).", "check-skill-line-ratchet: AGENTS.md: widest table row is 1081 bytes (pin 1081; headroom 0)." ], "pnpm_lint": "MEASURED NO-OP, not skipped: eslint's own config answers 'File ignored because no matching configuration was supplied' for AGENTS.md; eslint.config.mjs declares no markdown processing; diff is 1 file, 0 in eslint's population; no type-aware linting, so no untouched file's verdict can move.", "not_measured": "none — the first run of check:required-contexts exited 3 (PREREQUISITE NOT MET, no node_modules in a fresh worktree). That is NOT a red; pnpm install was run and the family then measured green." }, "deviations": [ "WORDING (ruling substance intact, casing forced): the ruling's sentence is 'ESLint (pnpm lint) is the only style authority'. Writing the literal 'ESLint' into AGENTS.md is RED — RETIRED_CONTEXT_NAMES holds it as a standing ban on the dead check-run name (replaced by 'Lint & Repo Gates'), budgeted 0. The gate's own docblock says matching is exact and case-sensitive precisely so prose about 'the eslint tool' stays legal. The clause therefore reads 'pnpm lint is the only style authority (eslint, eslint.config.mjs)'. Raising a budget in the gate script was the alternative and was rejected: out of this card's one-file surface, and origin/main's AGENTS.md carries zero occurrences of 'eslint' in any casing, so lowercase is the file's own convention.", "MECHANISM CORRECTED (measured, not carried): the card attributes the out-of-repo flip to config resolution. It is not that. --find-config-path reports no config for EITHER path, --no-editorconfig changes nothing, and no .editorconfig exists above either path. The out-of-repo answer is 'ignored: true' — the green is a pass over ZERO files. Control: a deliberately mangled file gets the same 'All matched files use Prettier code style!' out of repo and [warn] for the same bytes in repo. The clause states the measured mechanism; the ruled substance (identical bytes, opposite verdicts, about Prettier and not your edit) is unchanged and sharper.", "BYTES DISCLOSED: net-zero on lines (what the ratchet enforces) but +204 bytes, since the added prose wraps at ~102 B/line against the ~86-100 B/line it replaces. Every added line is inside the 120-byte cap." ], "summary": "Added one paragraph to AGENTS.md's Build & Test section declaring that this repo has no formatter of record: pnpm lint is the only style authority, Prettier is deliberately absent, prettier --write buries a small diff under a whole-file quote rewrite, and an out-of-repo --check 'pass' is a pass over zero files. Premise re-verified on today's origin/main before coding: zero hits for prettier|formatter in AGENTS.md against a positive control of 5 for lint, and no .prettierrc*, no format script, no workflow invocation, no installed copy anywhere in the tree. Net-zero at the zero-headroom ratchet, funded by three deletions whose content each keeps a canonical home; the ratchet script was not touched. All three of the card's measurements were re-run first-hand (prettier 3.8.1, byte identity proved by git hash-object), which confirmed the observable and falsified one stated mechanism.", "tests": "Gate union (8 families) derived from dispatch-gates and run under the shared verify lock at commit a62cfa8 with a clean worktree, exits captured by redirect before any pipe: all 8 EXIT=0. Gate-printed verdicts: 'AGENTS.md is 1162 lines (ceiling 1162; headroom 0)' and 'AGENTS.md: widest table row is 1081 bytes (pin 1081; headroom 0)'. Prettier evidence, re-measured rather than quoted: repo path 'prettier --check' exit 1 with [warn] per file, byte-identical copy (identical git hash-object blobs) at an out-of-repo path exit 0 with 'All matched files use Prettier code style!'; 'prettier --file-info' answers 'ignored: false, inferredParser: babel' in repo and 'ignored: true, inferredParser: null' out of repo; control mangled file greens out of repo and [warn]s in repo; --find-config-path answers '[error] Can not find configure file' at BOTH paths. No ablation applies (documentation-only diff). Control-character self-scan on AGENTS.md: no matches.", "mcp_calls": "9", "open_questions": [], "out_of_scope_findings": [] }Notes for the PM, outside the JSON:
- Draft, governed, unarmed.
AGENTS.mdis a governed surface: PR docs(agents): declare that this repo has no formatter of record #14239 is draft, auto-merge
was never armed, and it must not enter the merge queue. Human merge. skip-changesetis applied and verified by a comparative read-back (size/s+
skip-changeset; the union of the read set and the target, nothing stripped by the size labeler).- The card's body is intact, but one sanitizer casualty is visible in the 2026-08-21 triage
comment: itsnpx prettier --find-config-pathline lost its file argument to the angle-bracket
eater. It changed no decision here. - Not folded, deliberately: the sibling AGENTS.md card the claim comment names queues behind
this PR on the AGENTS.md serial, as dispatched.
Generated by Claude Code
- Draft, governed, unarmed.
ACCEPT — awaiting a human merge (skills-lane PM, session
session_01Whev4BkZ4BRcgiXYo4muWP; verified against GitHub).PR: #14239 — draft, base
main, single fileAGENTS.md, +13/−13 NET-ZERO at the 1162/1162 ceiling, ratchet script untouched (the hard fence held),Fixesline present, the 2026-08-22 Option A ruling quoted, gates 8/8 green by their own verdict lines.Spot-checks first-hand, beyond the report:
- The added clause carries BOTH ruled halves (the
--writewhole-file-rewrite hazard and the out-of-repo--checkflip), dated with the tool version, no issue numbers, and spellspnpm lint/lowercaseeslint— correctly avoiding the retired check-run name thatcheck:required-contextsbans in exact casing. - The three funding cuts each keep a canonical home, verified on origin/main: the Studio-UI pointer line was one of 24
objectuireferences (triplicate); the startup-registry "durability sibling" sentence was rationale prose with the operativeOPEN_CAPABILITY_REGISTRIESrule surviving verbatim; checklist item 5's content lives in full at the 「Touchedpackages/spec? Regenerate its artifacts BEFORE pushing」 section (:723, with the per-surface gate table), and the one trap worth inline survival —OS_SKIP_DTS=1greens locally / reds in CI — is carried in the pointer. - A mechanism correction, accepted as a falsification done right: the card (and this seat's dispatch) attributed the out-of-repo flip to config resolution; the dev measured it instead — the out-of-repo "pass" is a pass over ZERO files (
--file-infoanswersignored: true; a deliberately mangled control file greens identically;--find-config-patherrors at BOTH paths). The ruled substance (identical bytes, opposite verdicts, the warning is about Prettier and never about your edit) is unchanged and now stated with the true mechanism. The card's premise stands; only its explanatory clause was corrected by measurement.
Governed face terminal state: PR stays draft, review requested from os-zhuang + hotlong, listed under "awaiting a human merge" in the round report. Card closes by
Fixesat merge. The AGENTS.md serial releases to #11910 once this PR merges.
Generated by Claude Code
- The added clause carries BOTH ruled halves (the
Observation found while implementing #10595 (a
scripts/**-only diff). Filed unassigned, not fixed there — it is a different surface from that card and may well be deliberate.What I measured
The repo has no formatter of record: no
.prettierrc*, noprettier.config.*, no.editorconfig, noformat/prettierentry in rootpackage.jsonscripts, and no reference toprettierin any.github/workflows/*.yml.AGENTS.mdsays nothing about formatting either (grep -niE "prettier|formatter|format on|code style" AGENTS.md→ no hits). The linter of record is ESLint (pnpm lint).That is a coherent design. The trap is what happens to an agent told to "run whatever lint/format the repo runs on changed files" — the standing instruction in dispatch briefs. Reaching for the obvious tool gives a false signal in both directions:
Prettier's defaults reject files nobody touched. Run against pristine
origin/maincontent at its repo path:The disagreement is quote style — the codebase is single-quoted throughout, Prettier's default is double. So
prettier --writeon a changed file rewrites every string literal in it, burying a small diff under a whole-file reformat. On a PR that is reviewer-hostile and, in a gate script, actively dangerous.Copying a file out of the repo to compare against flips the verdict. I checked byte-identical
origin/maincontent from a scratchpad path under/tmpand gotAll matched files use Prettier code style!for the same bytes that warn at the repo path — Prettier resolved some config outside the repo for the/tmpcopy and none for the repo copy. An agent doing exactly that comparison concludes their own edits introduced the deviation, and "fixes" it.npx prettier --find-config-path scripts/console-spec-probes.mjs→[error] Can not find configure file, which is the honest answer and the one worth having in writing.Why it is a
findingand not a queued bugNothing is broken. CI never runs Prettier, so no PR has ever failed on this, and every file in the tree is internally consistent. The cost is one agent-round each time someone reaches for the tool — and the worst case is not a wasted round but a merged whole-file reformat riding on an unrelated fix.
Shape if it is taken
Cheapest is one line in
AGENTS.mdnaming ESLint as the only style authority and saying Prettier is deliberately absent. A.prettierignorecovering the repo would also make--checkhonest, and a.prettierrcwithsingleQuote: truewould make the tool usable rather than merely silent — but that is a real decision about adopting a formatter, not a doc fix, and it should not be made as a rider on someone else's card.Refs: #10595 (the card this surfaced under)