Skip to content

Five comments in three files still say DESIGN.md §09 asks for the metrics its 2026-09-09 ruling placed outside V1.0 - #79

Merged
zhuangjianguo merged 2 commits into
mainfrom
claude/issue-75-reframe-design-09-comments
Sep 10, 2026
Merged

Five comments in three files still say DESIGN.md §09 asks for the metrics its 2026-09-09 ruling placed outside V1.0#79
zhuangjianguo merged 2 commits into
mainfrom
claude/issue-75-reframe-design-09-comments

Conversation

@claude

@claude claude Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Fixes #75

DESIGN.md §09 changed direction on 2026-09-09 — 1127e52 (PR #40) recorded the maintainer ruling
that 各段时长 and the per-type「超 SLA」 are not in the V1.0 delivery surface, and PR #70
(30fd863) is §09's current state. Five comments under src/ still described the §09 that existed
before that ruling. They read as "§09 asks for X and we cannot deliver it", while §09 now declines
X for the very reasons those comments give. The authority ran backwards: the source file was
presented as falling short of the design, when it is what the design settled on.

Each of the five now states what the code delivers and why that is right, citing §09 as the authority
that agrees. Comments only — no type, filter, options, dataset field, dimension or widget id,
and no changed line outside comment syntax (checked mechanically, below).

The five, line numbers re-derived on this branch's base

The card read its line numbers on 96e83ad; the PM warned 9ba4d78 may have moved them. Re-derived
against git show 9ba4d78:FILEall five are unmoved, so the card's table needed no correction.

# file before (9ba4d78) after (f42dea1) the reframe
1 src/dashboards/executive.dashboard.ts 4–5 header copies §09's 管理层 list, incl. 审批瓶颈(各台阶平均停留) 4–13 #71's remedy: the copied list is gone, a pointer replaces it, and it names the one brick it advertised that this file never built so nobody pastes the list back
2 src/dashboards/executive.dashboard.ts 139–141 §09's 审批瓶颈 · §09 asks for 各台阶平均停留 147–179 the four route_* tiles are §09's brick at this position; the dwell measurements stay, as §09's own reasons for declining
3 src/dashboards/legal.dashboard.ts 143 §09's 超 SLA tile 143–171 the fixed 30-day threshold written into the title is what §09 prescribes; the per-type breach is outside V1.0
4 src/dashboards/legal.dashboard.ts 182 §09 asks for 平均周转(本月 vs 上月) 196–225 this tile is §09's 审批吞吐 brick, not a substitute for a missing one
5 src/datasets/cycle-time.dataset.ts 7 ⚠️ §09 asks for 各段时长 7–15 §09's bullet for this dataset asks for stage-reached counts and rules out a duration measure — which is what is declared

No measurement was deleted. Field.datetime persisted as ISO text so AVG() answers an average
year (2025.9166…), the -0.849999999999909 that is the difference of two average years, ADR-0021
leaving the semantic layer no SQL and no expressions, and sys_approval_request holding zero rows on a
stock pnpm demo are all still there — with their framing changed from "why we fall short" to "the
measurement §09 cites", because §09 cites exactly these.

Claim → reading

Every claim the rewritten comments make, traced to §09 as merged and to the code beside it.

claim in the comment §09 as merged (30fd863) the code beside it
the four tiles are §09's brick here; it is traffic, not dwell DESIGN.md:303 管理层 row: 各台阶路由量(四级台阶各一块砖,读 F2 盖的 route_* 标志;是流量,不是停留) executive.dashboard.ts four metric widgets route_legal_head · route_finance · route_executive · route_gm, values route_*_count
the per-rung dwell is not deliverable and no longer asked for DESIGN.md:308 「§09 原列的「审批瓶颈(各台阶平均停留)」同样不交付」 no dwell measure exists in src/datasets/; cycle-time.dataset.ts declares 6 aggregate: 'count' measures and nothing else
there is no dwell to read at all DESIGN.md:308 审批台阶的起止无处可读——sys_approval_request 在标准演示数据下零行,审批阶梯(F5)从未运行 the seed stamps approval_status directly (src/data/plan-contracts.ts:57), so F5 never runs on a stock demo
the 30-day threshold in the title is what §09 prescribes DESIGN.md:302 法务工作台 row: 审查超 30 天(固定阈值,写进砖的标题); :308 SLA 以固定 30 天阈值呈现且阈值写进砖的标题 legal.dashboard.ts review_ageing, title In Review Over 30 Days, filter review_started_at: { $lt: '{30_days_ago}' }
the per-type「超 SLA」 is outside V1.0 DESIGN.md:308 各段时长与按类型的「超 SLA」不在 V1.0 交付面内(维护者裁定,2026-09-09) no per-type comparison anywhere; the nine seeded SLAs are 2/3/5/10 days on clm_contract_type.review_sla_days
the daily-job stamped column is forbidden, not merely unbuilt DESIGN.md:308 ⛔ 不得用应用侧日任务盖戳字段把各段时长与「超 SLA」补出来 —— 那是在应用里复刻平台规则 no review_due_at field exists; legal-review-sla.flow.ts:19 already recorded the same ruling (decision #31, 1C + 2B)
this tile is §09's 审批吞吐 brick, compared with the platform primitive DESIGN.md:302 审批吞吐(本月 vs 上月,用平台 compareTo legal.dashboard.ts approval_throughput, compareTo: { kind: 'previousPeriod' } on a { $gte, $lte } window
a duration is not computable in the semantic layer DESIGN.md:308 语义层不收 SQL 也不收表达式(ADR-0021)… Field.datetime 在 SQLite 上存 ISO 文本,AVG() 打在其上会静默返回平均年份 the measurement block in cycle-time.dataset.ts:17-31, unchanged
this dataset carries no duration measure, and §09 asks for none DESIGN.md:297 contract_cycle_time — 各阶段到达数 …;不含任何时长度量 six count measures, five of them { STAMP: { $ne: null } } coverage counts
⚠️ the metric does not arrive when the upstream tracker closes DESIGN.md:308 两项都等平台的日期能力,跟踪于 objectstack-ai/objectstack#16737 legal-review-sla.flow.ts:36 states the unlock criterion in this repo's own words: "this repo upgrades to a version where the wrong path actually errors" — not "the upstream PR merged"
no title or description on the executive board says "bottleneck" or "dwell" — (a claim about the code only) grep -rniE '^\s*(title|description|label):.*(bottleneck|dwell|停留|瓶颈)' src/ returns nothing (exit 1)

The upstream qualifier, kept everywhere the tracker is cited

All three files cite objectstack-ai/objectstack#16737, and all three now carry the qualifier the PM
asked for: the in-flight platform fix makes the wrong path ERROR rather than adding date arithmetic,
so a duration stays uncomputable after it lands — it merely stops rendering a plausible fake number.
Verified mechanically (comment prefixes and line wraps normalised away):

src/dashboards/executive.dashboard.ts    wrong-path-ERROR=1  #16737=1
src/dashboards/legal.dashboard.ts        wrong-path-ERROR=1  #16737=1
src/datasets/cycle-time.dataset.ts       wrong-path-ERROR=1  #16737=1

Three stale forward-promises removed with the framing

Found while rewriting the five; each is a promise §09 now forbids or a claim the code does not support.
All three sit inside the comments this PR was already rewriting.

  1. legal.dashboard.ts:150 said a persisted review_due_at stamped by the daily job "belongs to card
    09, not here". §09 forbids that route for this metric, and legal-review-sla.flow.ts:19 already
    said so on the notification side. Now stated as closed, with both citations.
  2. cycle-time.dataset.ts closed with "a daily job stamping clm_contract. That field does not exist
    and creating it is a schema change… Raised on the PR" — the same forbidden route, phrased as
    pending. Now stated as forbidden, with §09's reason (replicating a platform rule in the app).
  3. executive.dashboard.ts:152 said 'the group title says "Routing Load"'. There is no group title on
    a dashboard widget list and no such string in the repo; the four tiles are titled Routes: ….

Header latitude (PM triage, item 1)

The PM allowed a copied §-list dashboard header in the two files this card already opens.
legal.dashboard.ts's header is already a pointer (PR #74). executive.dashboard.ts's was a copied
§-list and is taken here — item 1 above. ⛔ The other six accurate copies are untouched, as instructed.

Gates — they DO cover these files

All four gates, each exit code captured before any pipe (cmd > log 2>&1; EXIT=$?), on f42dea1:

validate exit=0
lint exit=0
typecheck exit=0
lint:i18n-gate exit=0
> tsc --noEmit                       (no output)
✓ i18n gate
  REACH    : 12 surface classes walked — … dashboard=6 · widget=38 · dataset=70 · page=2
  COVERAGE : 0 missing keys across 2 locale(s)
  lint: 21 warning(s), 5 suggestion(s) (991ms)      ← pre-existing, unchanged by this diff

⛔ The "no gate reads this file" framing of #44/#58/#63 would be false here, so this PR proves the
honest inverse the way PR #74 did — with an ablation, both legs restored from HEAD and verified.

Leg A — a syntax error in one of these files IS caught. Appended one broken statement to
executive.dashboard.ts; on-disk proof was a marker count of 0 → 1 plus a blob hash that no longer
matched HEAD, not an editor's exit code:

disk=07b99331…  HEAD=3785ae12…
typecheck exit=2 · validate exit=1 · lint exit=1 · lint:i18n-gate exit=1
src/dashboards/executive.dashboard.ts(262,33): error TS1110: Type expected.
✘ [ERROR] Unexpected "="   262 │ const OS_ABLATION_SYNTAX_ERROR: = ;

All four gates read this file, and they name it and the line.

Leg B — the comment CONTENT is invisible to all four. Put the three files back to their pre-fix
state (git checkout 9ba4d78 -- …; on-disk proof: each stale spelling back at count 1, git diff HEAD
non-empty) and re-ran the gates:

[stale comments in place] validate exit=0
[stale comments in place] lint exit=0
[stale comments in place] typecheck exit=0
[stale comments in place] lint:i18n-gate exit=0

That is exactly why the drift went unnoticed for two days: tsc parses comments and reads nothing in
them, and neither validator walks them. The gate on this defect class is the sweep below, not CI.

Both legs restored with git checkout HEAD -- ABSOLUTE_PATH under an EXIT INT TERM trap, and the
restore verified by an empty git diff HEAD and blob-hash equality against HEAD — never by the
restore command's exit code.

Sweep re-run

The sweep is four patterns over src/**/*.ts (a § reference on a line carrying the · list
separator; a § with verbatim design text quoted beside it; a § framed as demanding something;
a § possessively owning a brick), plus a fifth over the vocabulary the 2026-09-09 ruling retired.
What it returns after this change:

  • P1 (copied §-lists): 3 hits, all in the PM's declined setdashboards/index.ts:1,
    finance.dashboard.ts:4, pages/contract_detail.page.ts:132. executive.dashboard.ts:4 is gone.
    I re-checked all six declined copies against 30fd863 myself: still word-for-word correct,
    including contract_detail.page.ts:132 against §05's highlights:编号 · 相对方 · 金额 · 到期日 · 当前轮次 (DESIGN.md:218). None converted, per the triage.
  • P3 (§ framed as demanding): the §09 hits are gone. What remains is §05/§10 "asks for" in
    places where the code does deliver what is asked (views/obligation.view.ts:6,
    views/payment-plan.view.ts:6, views/contract.view.ts:295, data/plan.ts:40, six more) — the
    framing is only wrong when the section stopped asking, which is not the case for any of them.
  • P5 (retired vocabulary): every remaining occurrence of 各段时长 / 平均停留 / 审批瓶颈 / 超 SLA /
    平均周转 now sits inside the "ruled out on 2026-09-09, and here is why" framing. None is a promise.
  • Nothing the five missed. One borderline hit is legal.dashboard.ts:34, which quotes §09's
    「所有看板筛选字段都是持久化字段」 verbatim — accurate today, same class as the six declined copies,
    left alone (it is not a header §-list, so the latitude does not reach it either).

Not done, deliberately

  • ⛔ No DESIGN.md change. §09 is correct as merged; this PR moves the source files to agree with it.
  • ⛔ Nothing re-promises per-stage durations, per-type SLA breach, approval dwell, or an authored stage
    order (objectstack-ai/objectstack#17344); the stage_funnel widget id is untouched.
  • No changeset (this repo has no changeset gate).
  • No browser run owed: the diff is comment-only, so no surface a human touches changed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR


Generated by Claude Code

09 changed direction on 2026-09-09 (1127e52, PR #40; final state 30fd863,
PR #70): per-stage durations and the per-type "over SLA" are outside the V1.0
delivery surface, the legal bricks are 30-day review ageing and approval
throughput, the executive position carries per-rung routing volume, and the
cycle-time dataset carries stage-reached counts with no duration measure.

Five comments under src/ still described the 09 that existed before that
ruling, reading as "09 asks for X and we cannot deliver it" when 09 now
declines X for the very reasons those comments give. The authority ran
backwards: the source file was presented as falling short of the design while
it is in fact what the design settled on.

Each is now written as what the code delivers and why that is right, citing 09
as the authority that agrees. No measurement is deleted — Field.datetime stored
as ISO text so AVG() answers an average year, the -0.85 that is the difference
of two average years, ADR-0021 leaving the semantic layer no SQL and no
expressions, sys_approval_request holding zero rows on a stock demo — because
09 now cites those same measurements as its reasons, and they were taken here.

executive.dashboard.ts's header took #71's remedy: the copied 09 brick list is
gone and a pointer replaces it, naming the one brick it advertised that this
file never built so nobody pastes the list back.

Three stale forward-promises went with the framing, all of them things 09 now
forbids or the code does not have:

  - "a persisted review_due_at stamped by the daily job belongs to card 09" —
    09 forbids filling the per-type breach from an application-side job, and
    decision #31 ruled the same way on the notification side (legal-review-sla
    .flow.ts already said so).
  - "a daily job stamping clm_contract ... Raised on the PR" for durations —
    same prohibition.
  - 'the group title says "Routing Load"' — there is no group title and no such
    string; the four tiles are titled "Routes: <rung>".

Every citation of objectstack#16737 now carries the qualifier: the in-flight
platform fix makes the wrong path ERROR rather than adding date arithmetic, so
a duration stays uncomputable after it lands. It merely stops rendering a
plausible fake number.

Comments only: no type, filter, options, dataset field, dimension or widget id,
and no line outside comment syntax changed. These three files are inside all
four gates' surface and the gates pass — but comments are invisible to tsc,
which is exactly why the drift went unnoticed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR
…riptions

The sentence claimed no string on the executive board says "bottleneck" or
"dwell". The comment it sits in contains both words, so read literally it
falsified itself. The claim that is true and checkable is about the strings a
user sees: no widget title or description here or in either translation bundle
carries either word, verified by grep over title/description/label lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Five comments in three files still say DESIGN.md §09 asks for the metrics its 2026-09-09 ruling placed outside V1.0

2 participants