Repository navigation
Description
The defect
The 2026-09-09 maintainer ruling put 各段时长, per-type 「超 SLA」 and 各台阶平均停留 outside the V1.0 surface, and PR #40 (296fab8) wrote that into DESIGN.md §09. Six comments in src/ still describe the world as it was before that ruling — either quoting a §09 list that has since changed, or framing a limitation as a demand from §09 that the code cannot meet when §09 no longer makes the demand.
Their substance is correct. Every one of them explains something true about why a number is not delivered, and §09 now cites the same reasons. It is the framing that inverted: 「§09 要 X,我们做不到」 became false at the moment §09 stopped asking. That is why this is a reframe and ⛔ never a deletion.
| # | location | what is stale |
|---|---|---|
| 1 | src/dashboards/executive.dashboard.ts:4–5 |
the header quotes §09's 管理层 list including 「审批瓶颈(各台阶平均停留)」. §09 replaced that brick with 各台阶路由量 and then explicitly declined the dwell-time metric. The file below already implements the routing bricks (route_legal_head · route_finance · route_executive · route_gm), so the header advertises something its own file does not build. |
| 2 | src/dashboards/executive.dashboard.ts:139 |
framed as §09 asking for 各台阶平均停留 |
| 3 | src/dashboards/executive.dashboard.ts:141 |
same |
| 4 | src/dashboards/legal.dashboard.ts:143 |
framed as §09 asking for 超 SLA |
| 5 | src/dashboards/legal.dashboard.ts:182 |
framed as §09 asking for 平均周转 |
| 6 | src/datasets/cycle-time.dataset.ts:7 |
framed as §09 asking for 各段时长 |
What to change
Reframe each so it describes what the code delivers and why that is the right thing to deliver, citing §09 as the authority that says so — rather than as a demand being failed.
- Item 1 is the one with a concrete reader cost: a header that names a brick the file does not build. Prefer removing the quoted list and leaving a pointer, which is what PR Two app-source comments quote a
DESIGN.md§09 that no longer says any of it — the stale-pointer pattern, pointing the other way #74 did forlegal.dashboard.ts's header and for the same reason — a copy drifts, a pointer cannot. Read that header onmainfirst and follow its shape. - Items 2–6 keep every measurement and every technical reason (
ADR-0021, the semantic layer taking no SQL or expressions,Field.datetimestored as ISO text soAVG()returns an average year,sys_approval_requestbeing empty under the standard demo data so F5's dwell times have no source at all). ⛔ Do not delete any of it — §09 itself now carries these arguments, so the comments and the document should read as agreeing, not as one complaining about the other. - Where a comment cites a platform tracker (
objectstack-ai/objectstack#16737), keep it.⚠️ And keep the point §09 makes and the comments should too: the platform's in-flight fix refuses the wrong path rather than providing date arithmetic, so durations remain uncomputable afterwards — they merely stop producing a plausible fake number.
Constraints
- ⛔ Comments only. No metadata key, no widget, no dataset field or dimension, no
type,filteroroptions. If an edit touches one, stop. - ⛔ Do not touch
DESIGN.md— §09 is correct; this card brings the code's framing into line with it, never the reverse. - ⛔ Do not re-promise an authored stage order anywhere (
objectstack-ai/objectstack#17344), and ⛔ do not reopen thestage_funnelid (settled in PR Draw 「Pipeline by Stage」 as a ranked bar, not a funnel #57, reaffirmed in Plot 「Pipeline by Stage」 over the six in-flight stages, not seven #62). ⚠️ These files ARE inside the gates' surface —src/**/*is intsconfig's include and in the metadata graph. ⛔ Do not copy the "no gate reads this file" framing from §06 F14 says an archived contract stays editable 「除 notes 外」, butclm_contracthas nonotesfield — §03 gives itsummary#44/docs: the position census disagrees with itself in three places — README says seven over a table of six, DESIGN.md §11 says both 7 and 8 #58/DESIGN.md§09 still specifies 各阶段合同数**漏斗** — the app stopped shipping a funnel in #48 and narrowed what it plots in #59 #63; it would be false. If you want an ablation, the honest one is PR Two app-source comments quote aDESIGN.md§09 that no longer says any of it — the stale-pointer pattern, pointing the other way #74's shape: prove a syntax error in one of these files is caught, and note that comments are invisible totsc, which is exactly why this drift went unnoticed.
Acceptance
- All four gates 0, exit codes captured before any pipe — and say plainly that they do cover these files.
- Every claim in the rewritten comments traced to §09 as merged (
main, post-30fd863) and to the code beside it, in a claim → reading table. - Verify the edits landed by before/after spelling counts — ⛔ never by an editor's exit code.
- Re-run the sweep. PR Two app-source comments quote a
DESIGN.md§09 that no longer says any of it — the stale-pointer pattern, pointing the other way #74 found these six by greppingsrc/for comments quoting aDESIGN.md§ list rather than pointing at one. Run it again on your tree and report what it returns, including anything the six above missed. - No changeset (this repo has no changeset gate). No browser run owed.
Explicitly out of scope, decided and recorded
PR #74 also found six comments that quote §09 or §05 accurately today: finance.dashboard.ts:4–5 · dashboards/index.ts:1 · contract.dataset.ts:4 · obligation.dataset.ts:4 · payment.dataset.ts:4 · pages/contract_detail.page.ts:132. Each was re-checked and each still matches word for word.
⛔ Do not convert them. They are the same latent trap, but rewriting six correct comments is churn, and the argument for a pointer is strongest exactly where a copy has already lost the race. If one of them drifts, that is a card then. Named here so the decision is on the record and the next dev does not re-discover them as unfiled work.
Provenance
Found by the dev on #71 while running the sweep PR #74's card mandated, reported as out-of-scope with the stale/accurate split already drawn, and correctly not ridden into that PR — a reframe of six comments is not a rider on a two-comment card. The split and the reasoning above are the dev's; the decision to file the first group and decline the second is the PM seat's.
Related
#71 / PR #74 (where this was found; the same fix applied to legal.dashboard.ts's header) · #63 / PR #70 (§09's own correction) · PR #40 / 296fab8 (the ruling that inverted the framing) · #31 (pm:blocked on objectstack#16737) · #26 · #54
Activity
DESIGN.md§09 asks for the metrics its 2026-09-09 ruling placed outside V1.0 #75