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
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #75
DESIGN.md§09 changed direction on 2026-09-09 —1127e52(PR #40) recorded the maintainer rulingthat 各段时长 and the per-type「超 SLA」 are not in the V1.0 delivery surface, and PR #70
(
30fd863) is §09's current state. Five comments undersrc/still described the §09 that existedbefore 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 warned9ba4d78may have moved them. Re-derivedagainst
git show 9ba4d78:FILE— all five are unmoved, so the card's table needed no correction.9ba4d78)f42dea1)src/dashboards/executive.dashboard.ts审批瓶颈(各台阶平均停留)src/dashboards/executive.dashboard.ts§09's 审批瓶颈·§09 asks for 各台阶平均停留route_*tiles are §09's brick at this position; the dwell measurements stay, as §09's own reasons for decliningsrc/dashboards/legal.dashboard.ts§09's 超 SLA tilesrc/dashboards/legal.dashboard.ts§09 asks for 平均周转(本月 vs 上月)src/datasets/cycle-time.dataset.ts⚠️ §09 asks for 各段时长⛔ No measurement was deleted.
Field.datetimepersisted as ISO text soAVG()answers an averageyear (
2025.9166…), the-0.849999999999909that is the difference of two average years, ADR-0021leaving the semantic layer no SQL and no expressions, and
sys_approval_requestholding zero rows on astock
pnpm demoare all still there — with their framing changed from "why we fall short" to "themeasurement §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.
30fd863)DESIGN.md:303管理层 row: 各台阶路由量(四级台阶各一块砖,读 F2 盖的route_*标志;是流量,不是停留)executive.dashboard.tsfourmetricwidgetsroute_legal_head·route_finance·route_executive·route_gm, valuesroute_*_countDESIGN.md:308「§09 原列的「审批瓶颈(各台阶平均停留)」同样不交付」src/datasets/;cycle-time.dataset.tsdeclares 6aggregate: 'count'measures and nothing elseDESIGN.md:308审批台阶的起止无处可读——sys_approval_request在标准演示数据下零行,审批阶梯(F5)从未运行approval_statusdirectly (src/data/plan-contracts.ts:57), so F5 never runs on a stock demoDESIGN.md:302法务工作台 row: 审查超 30 天(固定阈值,写进砖的标题);:308SLA 以固定 30 天阈值呈现且阈值写进砖的标题legal.dashboard.tsreview_ageing, titleIn Review Over 30 Days, filterreview_started_at: { $lt: '{30_days_ago}' }DESIGN.md:308各段时长与按类型的「超 SLA」不在 V1.0 交付面内(维护者裁定,2026-09-09)clm_contract_type.review_sla_daysDESIGN.md:308⛔ 不得用应用侧日任务盖戳字段把各段时长与「超 SLA」补出来 —— 那是在应用里复刻平台规则review_due_atfield exists;legal-review-sla.flow.ts:19already recorded the same ruling (decision #31, 1C + 2B)DESIGN.md:302审批吞吐(本月 vs 上月,用平台compareTo)legal.dashboard.tsapproval_throughput,compareTo: { kind: 'previousPeriod' }on a{ $gte, $lte }windowDESIGN.md:308语义层不收 SQL 也不收表达式(ADR-0021)…Field.datetime在 SQLite 上存 ISO 文本,AVG()打在其上会静默返回平均年份cycle-time.dataset.ts:17-31, unchangedDESIGN.md:297contract_cycle_time— 各阶段到达数 …;不含任何时长度量countmeasures, five of them{ STAMP: { $ne: null } }coverage countsDESIGN.md:308两项都等平台的日期能力,跟踪于objectstack-ai/objectstack#16737legal-review-sla.flow.ts:36states 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"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 PMasked 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):
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.
legal.dashboard.ts:150said a persistedreview_due_atstamped by the daily job "belongs to card09, not here". §09 forbids that route for this metric, and
legal-review-sla.flow.ts:19alreadysaid so on the notification side. Now stated as closed, with both citations.
cycle-time.dataset.tsclosed with "a daily job stampingclm_contract. That field does not existand 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).
executive.dashboard.ts:152said 'the group title says "Routing Load"'. There is no group title ona 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=$?), onf42dea1:⛔ 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
HEADand 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 longermatched
HEAD, not an editor's exit code: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 HEADnon-empty) and re-ran the gates:
That is exactly why the drift went unnoticed for two days:
tscparses comments and reads nothing inthem, 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_PATHunder anEXIT INT TERMtrap, and therestore verified by an empty
git diff HEADand blob-hash equality againstHEAD— never by therestore command's exit code.
Sweep re-run
The sweep is four patterns over
src/**/*.ts(a§reference on a line carrying the·listseparator; 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:
dashboards/index.ts:1,finance.dashboard.ts:4,pages/contract_detail.page.ts:132.executive.dashboard.ts:4is gone.I re-checked all six declined copies against
30fd863myself: still word-for-word correct,including
contract_detail.page.ts:132against §05'shighlights:编号 · 相对方 · 金额 · 到期日 · 当前轮次(DESIGN.md:218). None converted, per the triage.§05/§10"asks for" inplaces 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) — theframing is only wrong when the section stopped asking, which is not the case for any of them.
平均周转 now sits inside the "ruled out on 2026-09-09, and here is why" framing. None is a promise.
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
DESIGN.mdchange. §09 is correct as merged; this PR moves the source files to agree with it.order (
objectstack-ai/objectstack#17344); thestage_funnelwidget id is untouched.🤖 Generated with Claude Code
https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR
Generated by Claude Code