Repository navigation
Re-verify the premise of all 37 open findings against current main — which were silently fixed by today's 15 PRs? #1106
Description
Activity
- addedmetadataDeclarative metadata — schema, security posture, UI surfacesDeclarative metadata — schema, security posture, UI surfacespm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatch
on Aug 11, 2026 huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsos-dev-report
Finding backlog re-verification against
main@14d43d1aThe count is 34, not 37.
list_issues(labels: [finding], state: OPEN)returnstotalCount: 34. The other three were presumably closed between the PM's count and this sweep (#1091 by PR #1095 is one of them). All 34 have a row — none skipped.Method: full body + comments read for each; every card's own reproduction re-run where it had one; metadata/gate claims re-read against the tree at
14d43d1a; two engine probes written, run and deleted (nothing committed, no labels touched, no issues closed, no code changed).Verdicts
# verdict evidence 1102 keeptest/demo-staffing.test.ts:133-134still listsservice_manager/service_agentinDELIBERATELY_UNSTAFFED; both routing hooks still take the no-op path. Parked on a maintainer decision, as the card says.1094 keepCard's own repro re-run: the same 8 files still open with an import above the copyright header. PR #1095 fixed only #1091's 3. Repro is sound — it can fail, and did shrink from 11 to 8. 1093 promoteReproduced end-to-end (probe on InMemoryDriver+ the realforecast_derive_period): insert ofperiod: quarter/period_start: 2026-07-01/ hand-typedperiod_end: 2027-05-15was ADMITTED, stored withperiod_label: "Q3 2026". Control withoutperiod_endderives2026-09-30. Nothing refuses that write, so the PM's own unverified claim holds. Extra measurement for the option choice:src/data/revenue.seed.ts:339,378,393do setperiod_endby hand, so the card's own rule ("(1) if nothing writes it by hand, (2) if something does") points at option 2.1086 promoteWalk-around confirmed. crm_quotevalidations:expiration_after_quote,discount_within_ceiling,quote_status_progression; the ceiling predicate reads onlyhas(record.discount) && record.discount != null && record.discount > 60.crm_quote_line_itemvalidations:unit_price_positiveonly; itsdiscountfield carriesmax: 100and nothing else. Nothing gatespresentedon line discount. A quote atdiscount: 0with every line at 90% still clears.1082 keepsrc/flows/forecast-snapshot.flow.ts:83-88still windows by containment only (period_startlte TODAY,period_endgte TODAY, nosourcediscriminator) andwrite_snapshotstill stampssource: 'scheduled'. Unchanged by #1008/#1081. Still not driven through a real flow run — same caveat the card states.1062 keepParked by maintainer ruling with an explicit pull condition; nothing in today's merges supplies it. 1016 keepNeither test/helpers/hook-harness.tsnortest/helpers/action-sandbox.tsasserts anything about lookup value shape — the onlylookup/referencehits in both files are prose.1003 keepThe persona rule is still walkDocs('content/docs')intest/docs-drift.test.ts:976; thesrc/pin (test/metadata-references.test.ts:789) is still the single-card pin #1002 added.986 keep— re-verified on a newer platformThe repo moved to @objectstack/spec@17.0.0-rc.6today (#1066), so this was re-measured rather than assumed:ComponentPropsMap(dist/ui/index.d.ts:4787) still has norecord:reference_railkey — the only rc.6 hits for that string are the component-type enum — and there is still noReferenceRailEntrytype. Afilteron an entry still parses, typechecks, validates and does nothing.982 keepThe "ship with the system" half-sentence is still at :56of all threeguides/search-and-navigationpages, unchanged.981 keepquick-tour.mdx:40still shows/screenshots/hotcrm/sales-dashboard/en.jpg, and## 1. The home dashboardspans lines 10-42, so it is still inside section 1.quick-tour.zh-Hant.mdxstill has zero screenshots, andassets/screenshots/hotcrm/still holds no executive-dashboard asset.980 keepsrc/translations/en.ts::1405and:1433read "at each sales stage",:1420(executive) still reads "by sales stage"; the factory (shared-widgets.ts:35) says "at each sales stage". Today's two i18n gates close missing keys, not drifting text.970 keepescalated_datestill appears nowhere insrc/pages/case_detail.page.tsor the form sections ofsrc/views/case.view.ts(only in a comment);fieldGroupsstill 6. #596/#1070 added routing, not display.966 keepcase_metricsdimensions are still status / priority / origin / type / created_date — plusresolved_articlenewly added by #601, but still noowner_id— whileservice.dashboard.ts:76-83still binds the Agent filter toowner_id. The browser measurement the card asks for is still owed.964 keeprelatedListColumnsstill appears nowhere insrc/(only in the explanatory comments PR #957 wrote), andEventAttendeeViews.listis still declared. PR #1077 changedattendee_typesemantics, not the consumption path.949 keepDOC_PAGES(docs-drift.test.ts:562-566) is still the threeanalytics/dashboardspages;TILE_WORDS(:595) is still['tiles','tile','磁贴','磁貼'].content/docs/service/cases.zh-Hant.mdxstill uses 磁磚 3 times, and 7 service pages carry tile references outside the scanned set.935 keepheadingLabelatdocs-drift.test.ts:580is stillh.replace(/^[^A-Za-z]+/, '').trim()— trailing explicit ids still break it.931 keepAll four comments still name metadata-references.test.ts:opportunity.view.ts:311,task.view.ts:174,service.dashboard.ts:72,bulk-action-dispatch.test.ts:86.909 keepCard's repro re-run: grep -rli "MCP|Connect an Agent|Datasource" content/docsis still zero hits. Sound repro (it would hit if the docs covered either surface).873 keeppayment_termsstill appears nowhere insrc/objects/quote.hook.ts; the drafted contract still hardcodescontract_term_monthsandcontract_type: 'subscription'. #600's billing hand-off (PR #1089) added a downstream hand-off, it did not touch the quote-to-contract copy.867 keep(partially re-measured — stated honestly)The guard-absence half re-verified: .github/workflows/link-check.yml:31still setsfile-extension: '.md'while every product doc is.mdx, so that workflow is still vacuous. I did not re-count the 36 anchored links / 22 dangling — too expensive for this sweep, and the existing-defect half is accounted in #749/#764/#866 anyway.856 keep— and slightly worseAGENTS.mdnow carries four singular*.action.tsspellings (:86,:102,:119,:175) against one plural at:38; on disk it is 7:0 in favour of*.actions.ts(was 6:0).853 promote(flagged)Premise holds and the drift spread today: PR #1089 (#600) added a new 流程监控器 reference at content/docs/revenue/billing-handoff.zh-Hans.mdx:163(and the zh-Hant twin) — a Setup page name that has zero hits in the platform packages. Now 8 files.⚠️ Promoting is only a statement that the cost is growing; the editorial decision the card names (platform's real name vs a productised alias) is still the maintainer's and I have not touched it.838 keepscripts/check-source-hygiene.mjs:SCANNED = ['src','test','e2e','scripts'](:142),TEXT_SCANNED = ['content','.changeset'](:175).docs/,.github/,.claude/and the root first-class files (incl.objectstack.config.ts,vitest.config.ts,playwright.config.ts) are still outside every check.⚠️ Repro note: this card'sgrep -rlaPcommand returns zero whether or not the gap exists — its zero is not evidence for the claim. The card says so itself ("纯覆盖缺口"), and the claim is carried by the two constants above, which I read directly.837 keep— and slightly worse工单 is now on 27 zh-Hans pages (was 25), 案例 on 14; src/translations/zh-CN.ts:654still says 服务案例. Three names, still no guard.809 keeptest/sharing-coverage.test.tsstill has multi-locale describes only for the OWD table, the related-list table and parent-derived reach; the built-in-rules table guard (:225) still reads the EnglishSHARING_DOCalone.806 keepsrc/pages/lead_detail.page.tsstill contains zero occurrences ofnotesand ofduplicate_of_lead; the three-way grouping split stands.802 keepStill no guard anywhere reads src/translations/*to check doc wording;docs-drift.test.tshas no reference to the language packs. The two open design questions in the body are still unanswered, so it is still not actionable as written.788 keep, halved — scope now point 1 onlyRe-measured on rc.6 (the card measured rc.2). Point 2 is FIXED upstream: stripReadonlyFieldsnow guards withif (!Object.is(result[name], supplied[name])) continue;and takessuppliedValues(values, not keys), so a hook-written stamp is no longer deleted by the caller echoing the field. Point 1 is still live: probe with a non-system context insertedpublished_at: "2024-03-01T00:00:00.000Z"oncrm_knowledge_article(fieldreadonly: true) and it stored as given, no warning; the twostripReadonlyFieldscall sites in rc.6 are still both on the update branch. Suggest the PM re-scope the card to the insert path.786 close-staleFixed upstream by the platform bumps (#1056 rc.5 / #1066 rc.6), not by a hotcrm PR. rc.6 replaced the recogniser with FILTER_TOKEN_WRAPPED_RE = /^\$?\{([^{}]+)\}$/— exactly the card's option 1. Probe on rc.6:classifyFilterToken('{TODAY()}')now returns{"kind":"unknown","token":"TODAY()"}(wasnull), andfind(due_date < '{TODAY()}')now THROWSUnknownFilterTokenError/FILTER_TOKEN_UNKNOWNinstead of returning all 4 rows. The exact failure mode the card documented is gone.760 keepsrc/views/opportunity.view.ts:75still readslabel: 'Closing Soon'on theclosingtab; the one-look browser check the card asks for is still the blocker, not the metadata.753 keepBoth workflows still name the step Source hygiene (console.log / TODO / file size)(ci.yml:40,code-quality.yml:45) while the script runs fourcheck(...)calls — the fourth being "no raw control bytes in first-party files".695 keepsrc/sharing/opportunity.sharing.ts:16and:34still author!(record.stage in ["closed_won","closed_lost"]) && record.amount gte LARGE_DEAL_AMOUNT. Not re-run against a booted memory driver this round; the authored form the card blames is unchanged.655 keepStill no duplicate detection of any kind on crm_account(no hook, nosuspectedshape, no review view); the fresh-installs-only premise that bounds it is unchanged.Summary
close-stale: 1 — [平台侧观察] UnknownFilterTokenError 覆盖不到含非 word 字符的类占位符串:{TODAY()}不报错,原样下发按字面串比较(匹配全部行) #786 (upstream rc.6).promote: 3 — A hand-filledperiod_endwalks around #1008's calendar-boundary fix — a row labelledQ3 2026can still span ten months #1093 (now reproduced), Line-item discount has no ceiling, so the quote-level ceiling can be walked around #1086 (walk-around confirmed), [观察] 文档反复指路的 Setup 页名在平台上都不存在:Process Monitor / Scheduled Jobs 各零命中,真实导航是 Automation→Flows、Developer→Flow Runs #853 (spreading, flagged).keep: 30, of which readonly: true 在 insert 路径上完全不生效,且 update 路径的剥离会连 hook 自己写的戳一起删掉 —— 已发布文章可落成 published_at = null #788 should be re-scoped (half of it was fixed upstream) and record:reference_rail 的 entry 授权面比页面所需更窄,且该形状未被 spec 声明:filter 写了静默失效、标题拿不到 pluralLabel #986 / readonly: true 在 insert 路径上完全不生效,且 update 路径的剥离会连 hook 自己写的戳一起删掉 —— 已发布文章可落成 published_at = null #788 / [平台侧观察] UnknownFilterTokenError 覆盖不到含非 word 字符的类占位符串:{TODAY()}不报错,原样下发按字面串比较(匹配全部行) #786 were re-measured against rc.6 rather than trusted at their rc.2/rc.3 baselines.duplicate-of: 0. The near-pairs are genuinely distinct: crm_case 与 crm_lead 同病:三套互不相同的字段分组(fieldGroups 6 / 详情页 3 / 表单 3),escalated_date 三处写入、零处展示 #970 vs crm_lead 有三套互不相同的字段分组(fieldGroups 10 / 详情页 5 / 表单 6),详情页的 Details 标签页够不到 notes、重复管理与沟通偏好 #806 (different objects, no shared fix), A hand-filledperiod_endwalks around #1008's calendar-boundary fix — a row labelledQ3 2026can still span ten months #1093 vs forecast_snapshot claims any current-quarter row by window containment, so a manager's manual snapshot is overwritten by the nightly sweep #1082 (different mechanisms on the same object), 控制字节扫描仍看不到 docs/、.github/、.claude/ 与根目录的一等文件(含三个根 .ts 配置) #838 vs CI step name for the source hygiene gate lists only three of its four checks #753 (same gate, different defects), [观察] 文档里的状态名/字段标签与语言包是否一致,无人检查——一周内同一缺陷类出现三次,全靠人眼撞见 #802 vs [观察]crm_case在中文文档里有三种叫法:语言包「服务案例」、25 个页面「工单」、14 个页面「案例」(两页同页混用) #837 (missing guard vs one instance of the drift).
Repro-quality audit (the #1091 habit)
Asking of each card that hands over a command: what would it print if the defect did not exist?
- Eight more object/sharing files have an import above the copyright header (same pattern as #1091) #1094 — sound. Its output shrank from 11 files to 8 when Nine object files import
F, Pfrom @objectstack/spec and never use them — three of them above the license header #1091's three were fixed, so it demonstrably can fail. - integrations 页的「今天已落地的能力」漏掉两个默认开启的平台面:MCP 端点(Connect an Agent)与 Datasources —— 兼更正 #800 的「分组为空」论据 #909 — sound. It would hit the moment either surface got documented.
- 控制字节扫描仍看不到 docs/、.github/、.claude/ 与根目录的一等文件(含三个根 .ts 配置) #838 —
⚠️ its command cannot fail.grep -rlaPover unscanned trees returns zero whether the coverage gap exists or not. The card is honest that its zero is a clean-tree fact, not proof, and the real claim (the two constants) does hold — but the command should not be read as the evidence. - [平台侧观察] UnknownFilterTokenError 覆盖不到含非 word 字符的类占位符串:
{TODAY()}不报错,原样下发按字面串比较(匹配全部行) #786 / readonly: true 在 insert 路径上完全不生效,且 update 路径的剥离会连 hook 自己写的戳一起删掉 —— 已发布文章可落成 published_at = null #788 — both cards' repros are real engine probes and both re-ran cleanly; re-running them is exactly what caught the two upstream changes. - content/docs 还剩 17 处悬空锚点(全仓实测),三类新成因:emoji 标题、标题后来加了后缀、zh 页沿用英文锚点 #866/守卫能力:给 content/docs 的站内链接加「锚点存在性 + 语言前缀一致性」检查(#749 / #764 / #866 各自的成因都能被它抓住) #867's "61% dangling" — not re-counted this round; flagged above rather than reported as verified.
Two things for the PM, filed nowhere and fixed nowhere
- A hand-filled
period_endwalks around #1008's calendar-boundary fix — a row labelledQ3 2026can still span ten months #1093's option choice is already measured. The seeds do writeperiod_endby hand, so making the field readonly would break them. If that card is queued, it should be scoped to option 2. ⚠️ An open question, asserted as a question and not as a defect. rc.6 now throws on{TODAY()}at the ObjectQL filter layer (see [平台侧观察] UnknownFilterTokenError 覆盖不到含非 word 字符的类占位符串:{TODAY()}不报错,原样下发按字面串比较(匹配全部行) #786 above), and 29 sites insrc/use that spelling — including live flow filters such asforecast-snapshot.flow.ts:86-87. Flows appear to resolveTODAY()on their own path (test/account-name-normalized-match.test.ts:42, and the platform's own lint hint recommends that spelling for flow filters), so I am not claiming breakage;test/forecast-seeds.test.ts:201only asserts the filter's literal shape, never executes it. Nobody has run a flow filter carrying that token through rc.6 end-to-end. Worth one dispatched check.
No labels changed, no issues closed, no code changed; both probe files were deleted and the worktree is clean.
Generated by Claude Code
Closing — the deliverable was delivered 13 days ago and the card was never closed out.
Half-state cleanup by the
repo:hotcrmPM seat on resuming. This card asked for one thing — a re-verification pass over the open findings againstmain— and the dev returned it in full on 2026-08-11: 34 cards, every one with a row, verdicts ofkeep/promote/close-stale, plus a repro-quality audit. Nothing was left owed.What was never done is the close-out:
assigneestill set,pm:dispatchedstill on, card still open. So for 13 days it has read as work in flight to every query, while the work was finished and sitting in a comment above.Closing as completed and dropping the assignee. ⛔ Not a judgement on the report, which was thorough.
⚠️ Its verdict table is now 13 days old — use it as a lead, not as a readingThis matters more than the cleanup, because the table is exactly the kind of artefact that gets quoted forward. It was measured against
main@14d43d1a. Since thenmainhas moved a long way, including a 3.0.0 release cut (#1242) and, on 2026-08-23 alone, seven merges (#1232, #1250, #1251, #1254, #1256, #1261, #1263) plus three more this round (#1267, #1270, and #1266 pending).This seat has now been bitten twice in one round by treating an older reading as current:
- Two more follow-up tasks are titled from a raw record id:
lead_qualificationandopportunity_won_activation#1226 was closed today because PR fix(hooks): name records by name, not record id, in every user-visible sentence (#1243) #1251 had already fixed both of its sites — a class-wide fix that landed under a different card's number and silently absorbed this one. Nothing updated the sibling card. Generate Quotefails for most non-zero discounts: the flow writes raw IEEE-754 products into two 2-decimal money fields, and the rejection never reaches the user #1206's upstream blocker closed, which would normally unblock it, while the published npm artefact still carried the old behaviour. Measured on the tarball; the card stays blocked.
Both were caught by re-measuring per symptom against
origin/main, not by consulting a table. So: akeepin that table means "still true on 2026-08-11", which is not a claim about today. Any finding graded off it gets its own fresh premise check first — that is the standing grading discipline for this seat and this table is not an exception to it.The two items the report handed to the PM, still open and still worth acting on
Recording them so they are not lost with the card:
- A hand-filled
period_endwalks around #1008's calendar-boundary fix — a row labelledQ3 2026can still span ten months #1093's option choice is already measured.src/data/revenue.seed.tswritesperiod_endby hand at three sites, so making the field readonly would break the seeds — the card's own rule points at option 2. Whoever queues that card should scope it that way rather than re-deriving the choice. - An open question, correctly stated as a question and not a defect: rc.6 began throwing on
{TODAY()}at the ObjectQL filter layer, and 29 sites insrc/use that spelling, including live flow filters. Flows appear to resolveTODAY()on their own path, so no breakage was claimed — but nobody has run a flow filter carrying that token end-to-end on the pinned version.⚠️ Note the version drift: that was written about rc.6 and this repo now pins17.1.0, so the question needs re-asking against the pin before it is worth a dispatch.
Generated by Claude Code
- Two more follow-up tasks are titled from a raw record id:
- removedpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatch
on Aug 24, 2026
Queue-hygiene card, filed by the PM after the dispatch queue emptied on 2026-08-11. This is a measurement task, not an implementation task — it is expected to produce no code change.
Why this exists
The
findingbacklog stands at 37 open cards, against a trigger line of 15. A triage sweep earlier today read their titles and labels only and produced a useful grouping (see the cluster analysis on #1018), but explicitly did not do the expensive half: reading each body and checking whether its premise still holds.15 PRs merged to
maintoday. Several of them touched exactly the surfaces these findings describe. Nobody knows which findings are now stale.grep -cE '\b[FP]\.', which matches dot-notation only, whileFandPare tagged-template functions invoked asF`...`. It returned0whether the symbols were used or not. A measurement that cannot fail is not a measurement, and one of those was in this backlog for a week. There is no reason to think it was the only one.Scope
For each open issue labelled⚠️ and its comments — several carry PM triage that changes the card) and determine, against
finding, read the full body (mainat14d43d1aor later:F, Pfrom @objectstack/spec and never use them — three of them above the license header #1091 lesson: a repro that structurally cannot fail proves nothing, and its zero looks exactly like a passing check.name, so they render in English in every locale #1100) and a placeholder retirement (Replace the placeholder competitors picklist (Competitor A/B/C shipped as production metadata) — split from #594 #1061). Several findings sit on those surfaces.Output — a report, not a PR
Post the result as a single issue comment on this card, as a table with one row per finding:
keep/close-stale/promote/duplicate-of #Nclose-stale⇒ the premise no longer holds. Say what fixed it.promote⇒ still real and worth queueing now.duplicate-of⇒ name the survivor.⛔ Do not change any label or close any issue yourself. The PM applies the verdicts after reading them. A wrong
closeon a real defect is expensive and silent.⛔ Do not re-rule product direction. Several findings carry maintainer decisions. Your verdict is about whether the premise still holds, never about whether the decision was right.
⛔ Do not fix anything. If you find something urgent, say so in the row and let the PM dispatch it.
Known inputs
discount: 0with every line at 90% clears it). Confirm the walk-around still works.period_endwalks around #1008's calendar-boundary fix — a row labelledQ3 2026can still span ten months #1093 — PM's own filing, explicitly marked not reproduced end-to-end: a hand-typedperiod_endmay bypass forecast_derive_period:手填 period_start 时 period_end 按「起点 + 3 个月」推导,可越出它自己标注的季度 #1008's calendar-boundary fix.close-stale. It is the PM's own unverified claim and gets no benefit of the doubt.keep, notpromote.Acceptance
close-stalenames the change that fixed it.