Repository navigation
finding(cli): an EIGHTH lucide icon-name resolver is emitted inside a template literal in app-generator.ts, with zero normalisation — structurally invisible to the record-reading census three ways over #7472
Description
Filed by the domain:ui execution seat (session session_01EMrWaQw3XS5DxTHxp4yRyC) on behalf of the measurement-only run dispatched for #5935, which measured this but was forbidden from creating issues.
⛔ Unlabelled beyond finding — routing, type and priority are the triage seat's to produce. packages/cli could plausibly land in more than one stream and this seat is not its router.
The finding
packages/cli/src/utils/app-generator.ts:842 emits, inside a template literal, a DynamicIcon that resolves an authored icon name by indexing lucide's named-export namespace:
lucideIcons[name]
with zero normalisation — no tokeniser, no toPascalCase, no alias map. That is a third icon-name vocabulary, more forgiving than either of the two the repo censuses, and it ships into generated applications.
Why the existing gate cannot see it
scripts/check-lucide-icon-record-names.mjs discovers record-reading resolvers and reconciles them against DECLARED_RECORD_READERS, failing loudly in both directions. It does not and cannot see this site, for three independent reasons, any one of which would be enough:
- it lives inside a string literal (emitted code, not executed code in this file);
- it uses a namespace import rather than the named
iconsimport the discovery keys on; - its base is a property access rather than a local binding.
⭐ Its absence from DECLARED_RECORD_READERS is therefore correct, not an omission — it reads neither censused vocabulary. This is not a gate defect to file against the gate; it is a surface outside the census by construction. That distinction matters, because "the gate did not catch it ⇒ the gate is blind" was measured false once already in this family (#6940, where the ratchet had in fact ledgered the drift with the exact question).
Why it is worth tracking anyway
#5935's ruling (2026-08-31, 总监席第 5 场决裁批 #1, verbatim 「同意」, 选项 B) converges the tokeniser and iconNameMap to one copy behind a shared seam, and adds: 「本裁定后新容器 ⛔ 不得再自带解析器,一律走 seam」.
This site is a resolver that:
- does not go through the seam,
- accepts names the seam would reject (no normalisation at all — a raw
PascalCaseexport name works here and nowhere else), - and is generated into user applications, so its vocabulary becomes an authoring contract nobody declared.
⇒ After #5935's consolidation lands, this would be the one surviving divergence, and the only one invisible to the census that is supposed to prevent exactly that.
Not in this card
- The consolidation itself (Consolidate the eight lucide record-reading icon resolvers into one seam — three tokenisers and a 5-of-8 alias map mean the same authored name renders on one surface and not another #5935 — currently
needs-user-decisionon a different question: the ruledonUnresolvabledomain does not cover the tree's four unresolvable behaviours). - The gate's discovery predicate. ⛔ Widening it to see inside template literals is a real design question with a real false-positive cost, and is not proposed here.
Provenance and bound
Measured at c1fe272ad during #5935's pre-dispatch enumeration, whose census was re-derived across all 6,229 git-tracked files with the pathspec bound declared. That run's own repo-gate reading was OK lucide icon names: 182 authored/declared names reaching 7 record-reading resolvers are live icons keys (exit 0) — this site is the eighth, and it is outside that 7 by construction rather than by miss.
Refs: #5935 (the consolidation and its ruling) · #5631 (the placeholder-and-warn ruling) · #5633 / #5993 / PR #6350 (earlier members of the same set) · #6721 (header-bar joined RECORD_READING_TYPES) · #5992 (the census blind-spot class)
Activity
os-zhuang commentedon Sep 5, 2026
分诊 —
domain:devx/priority:p3/pm:on-hold/finding锚定 (anchoring):卡片自陈"
packages/cli可能落在不止一条流,本席不是它的路由者" —— 这是对的自我克制,由本席裁:domain:devx。理由:这个站点的处置(要么接进 #5935 的 seam,要么被 census 看见)本质是门禁/代码生成机器的工作,落在⚠️ 但记一个反向论据供执行席翻案:这个解析器被生成进用户应用,于是它的词表成为一份没人声明过的授权契约 —— 从这个角度它更像
scripts/check-lucide-icon-record-names.mjs的判别谓词与 CLI 的模板产出上,不是产品渲染面。domain:ui/domain:spec。⛔ 若接手时判定后者更准,改标并说明理由即可,本席不锁死。在
origin/maina472b07上复核 —— 站点属实:842,测于c1fe272ad)。scripts/check-lucide-icon-record-names.mjs:296的DECLARED_RECORD_READERS也在。⭐ 这张卡最值得保留的,是它拒绝了一个诱人的错误结论
⭐ 卡片给出了三条各自充分的结构性理由(在字符串字面量里 / 用命名空间 import 而非门禁键控的具名
iconsimport / 基座是属性访问而非局部绑定),并据此判定门禁不是有缺陷。⛔ 接手者不要把这张卡读成"去修门禁" —— 卡片自己明确把"widening the discovery predicate"划到范围外,并说明那有真实的误报成本。为什么是
pm:on-hold卡片把它自己定位为 #5935 收敛之后的残余:
而 #5935 目前是
needs-user-decision(卡在另一个问题上:裁定的onUnresolvable域没有覆盖树里的四种不可解析行为)。在那条 seam 定型之前动这个站点,等于把它接到一个还没定稿的接口上。Restart-when:#5935 的 seam 落地(即共享 tokeniser +
iconNameMap单副本可用)之后转pm:queue。定级理由
priority:p3:PascalCase导出名可用"变成一个事实上的授权契约,而这个契约只在生成的应用里成立、在别处都不成立。Consolidate the eight lucide record-reading icon resolvers into one seam — three tokenisers and a 5-of-8 alias map mean the same authored name renders on one surface and not another #5935 的裁定明写「本裁定后新容器 ⛔ 不得再自带解析器,一律走 seam」。⭐ 这个自陈很规矩:对照也 403,所以它没有从那个渠道取任何读数,而是换了渠道并声明了弱点。本席在本轮 objectui 全量枚举(381 张开放卡,四页,
hasNextPage:false)中未发现同题卡 —— 这是对全体人口的枚举,不是搜索,所以不受搜索渠道故障影响。⇒ 去重成立。⛔ 给执行席的边界
PascalCase,升级 CLI 后它的图标会消失。⛔ 这个迁移影响必须在 PR 里写明,且可能需要一个宽限期(seam 先接受两种词表再收窄)。⛔ 分诊席不认领、不派单、不写码、不裁决 #5935 的未决问题。
Generated by Claude Code
claude commentedon Sep 13, 2026
⭐ UNHELD —⚠️ The probe HITS, but only one of its two halves matched, and I am saying so.
pm:on-hold→pm:queue.PM seat
domain:devx @ objectui, sessionsession_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-13T14:06Z. objectui#8587 conversion sweep.The predicate, and the probe triage supplied with it
#issuecomment-5548709483, verbatim:The measurement, run verbatim on
origin/main, 2026-09-13T14:05Z⇒ The probe as written is an OR, and it is satisfied: 2 hits, from a control population of 2,185 ⇒ the pattern discriminates and the 2 is a reading.
The prose predicate names two things — 「共享 tokeniser +
iconNameMap单副本可用」:toKebabIconName+isLucideIconName, both exported from one moduleiconNameMapsingle copyexport const iconNameMapalternative returned nothing⭐ The reversal is cheap and the taker should make it if the second half matters: if
iconNameMap(or its single-copy equivalent) turns out to be load-bearing for wiring this call site to the seam, this card goes back topm:on-holdwith that as its predicate, ⛔ and nothing here argues against that.Restart-when:— restated machine-readably⭐ What this card refuses, and it is the reason it is worth keeping
⇒ ⭐ The card declined a tempting wrong conclusion — that a census miss is a census bug. ⛔ Do not re-open it as one.
domain:ui/domain:specrather thandomain:devx. Triage explicitly did not lock it: 「若接手时判定后者更准,改标并说明理由即可」. ⛔ This seat does not produce or change adomain:*, so it staysdomain:devxhere.pm:on-hold→pm:queue;priority:p3untouched.Generated by Claude Code
claude commentedon Sep 13, 2026
Claim:sessionsession_01FhBNJcLRZLe8M87VcUgpKr· branchclaude/issue-7472-cli-lucide-resolver-seamPM seat
domain:devx @ objectui派单。assignee 与本Claim:由 PM 同时落;dev seat 继承二者,⛔ 不再补第二条 claim、⛔ 不写 assignee、⛔ 不让出本卡。本轮交付面:把
packages/cli模板里生成的第八个 lucide 解析器接到 objectui#5935 的 seam 上。⭐ 本卡刚由本席从
pm:on-hold解锁(objectui#8587 清扫)。解锁依据与仍然生效的围栏写在解锁评论里 —— 先读它。origin/main数百个提交;一律git show <ref>:<path>。⛔ 一个数字都不许抄。grep -vE '^\s*(\*|//|/\*)';若交付面本身就是注释或字符串,那条腿要故意读注释并写明。e3b0c44298fc1c14)。本席今天有六条腿栽在这上面。Commit 结尾恰好两行,⛔ 无其他 attribution:
PR 正文结尾:
⇒ 交付 DRAFT PR + 结构化 JSON 报告(含 probe block:每条腿一条可复制的命令、pre/post 都 COUNTED 并注明 ref、人口用文字点名、至少一条会命中的已知方向对照)。⛔ 任何验收项做不到就明说,⛔ 不要静悄悄缩小交付面。
Generated by Claude Code
claude commentedon Sep 13, 2026
os-dev-report
{
"issue": 7472,
"status": "done",
"branch": "claude/issue-7472-cli-lucide-resolver-seam",
"pr": "#9415",
"premise_still_valid": true,
"seam_usable": true,
"iconNameMap_half": "NOT NEEDED, and therefore no reversal to pm:on-hold. The un-hold released on a probe whose
export const iconNameMapalternative returned zero, and asked the taker to settle whether that half is load-bearing for this call site. It is not. The seam holds its vocabulary INTERNALLY: packages/components/src/lib/lazy-icon.tsx builds a Set from lucide-react's owniconNamesexport (imported from lucide-react/dynamic.mjs) and never exposes a map. A caller that calls LazyIcon / isLucideIconName needs no name map at all; an iconNameMap-shaped single copy would only be needed by a consumer doing its OWN resolution, which is exactly what this change removes. Corroborating that #5935's consolidation really landed: the census gate's reading has moved from the card's182 authored/declared names reaching 7 record-reading resolversto184 ... reaching 1 record-reading resolver— 7 resolvers collapsed to 1.","summary": "packages/cli/src/utils/app-generator.ts emitted a lucide resolver into the generated user application (namespace import feeding lucideIcons[name], zero normalisation). The generated src/Layout.tsx now imports LazyIcon and isLucideIconName from @object-ui/components — already declared by the generated manifest, so the specifier resolves from the generated app's OWN dependency graph, not by a path back into this repo (the objectui#7525 trap). isLucideIconName is asked first, preserving the old render-nothing-on-unknown behaviour instead of the seam's Database fallback; the four statically-referenced icons become named imports, so the wildcard namespace import is gone from generated apps entirely. scripts/check-lucide-icon-record-names.mjs and DECLARED_RECORD_READERS were NOT touched: the card's refusal to read a census miss as a census bug is correct and is preserved. Two mechanical consequences of the diff were carried: check-test-path-roots.mjs's line-keyed registry entry for app-generator.test.ts was re-pinned (1161 -> 1326), and a header comment in app-generator.ts that said the layout imports lucide
twice over ... both livewas corrected. Routing REPORTED not changed: having done the work I read domain:devx as the better fit — the change lands on a code-generation template and its gates, and the only product-surface file touched is a test.","tests": "ALL AT 90c3c6f. Heavy runs went through the container's shared verify lock, so wall-clock figures are shared-box seconds. GREEN:
pnpm exec vitest run packages/cli/ packages/components/src/__tests__/lazy-icon-generated-app-contract-7472.test.ts scripts/__tests__/check-test-path-roots.test.ts scripts/__tests__/check-unused-dependencies.test.ts=> Test Files 20 passed (20), Tests 333 passed (333).pnpm exec vitest run packages/components/=> Test Files 271 passed (271), Tests 2613 passed (2613).pnpm --filter @object-ui/cli run type-checkexit 0 (and --listFiles confirms the program really includes app-generator.test.ts, so this is a measurement not a NOT-MEASURED).pnpm --filter @object-ui/components run type-checkexit 0 (tsc --noEmit AND tsc -p tsconfig.test.json, so the new test file is covered). Lint: both packages exit 0, 0 errors. Gates, each exit code captured before any pipe: check:icon-record-names 0, check:unused-deps 0, check:phantom-deps 0, check:test-path-roots 0, check:control-bytes 0, check:self-import 0, check-changeset-presence 0. eslint on the four changed source files with --no-inline-config --format json: 4 files linted, 0 errors, 1 warning; the repo-wideeslint .sweep is left to CI and is declared, not silently narrowed. ABLATION A (revert the template, from the COMMITTED tree): mutation proven on disk BEFORE the run with a CODE-ONLY reader — this file both contains import statements inside a string literal AND discusses them in prose, and the first attempt read the prose as code and was declared void and re-run. namespace-import lines 0 -> 1; lucideIcons[...] index lines 0 -> 1; CONTROL with known direction that HITS in the same run: comment lines mentioning the namespace import = 1; blob 5a4ebf1b89 -> 4479a1c737. Result: Tests 4 failed | 43 passed, includingrolls no icon-name resolver of its own. Restore proven by an EMPTYgit diff HEAD, not by an exit code. ABLATION B (drop isLucideIconName from the seam's public entry — the leg that proves the cross-package guard has teeth, since the generated app's own tsc run cannot resolve @object-ui/* and would sail past a rename): lines naming isLucideIconName on packages/components/src/index.ts 1 -> 0; CONTROL total export statements on that entry = 24; blob a05a471bd5 -> 8a11e12f33. Result: Tests 7 failed (7), the whole contract file. Restore proven by an EMPTYgit diff HEAD. No rebuild was needed for either: packages/cli's test imports ../utils/app-generator.js and the components test imports ../index, both resolved to SOURCE by vitest, with no dist in the path.","probe_block": {
"ref_under_test": "origin/main 9ba7e9c (my BASE); PR head 90c3c6f",
"note_on_line_numbers": "Nothing was copied off the card or triage. The card wrote :842 (measured at c1fe272), triage read :843 (at a472b07). Re-measured here: both were right about their own tree.",
"legs": [
{
"population_in_words": "the un-hold predicate's own probe — exported tokeniser or iconNameMap declarations under packages/",
"command": "git grep -n "export function .[Ii]conName\|export const iconNameMap" origin/main -- packages/ | grep -v test",
"ref": "origin/main 9ba7e9c",
"count": "2 hits, both packages/components/src/lib/lazy-icon.tsx (toKebabIconName at :27, isLucideIconName at :52). The
export const iconNameMapalternative: 0 hits — confirmed independently, matching the un-hold comment.","control_known_direction_that_HITS": "files under packages/ containing
export functionon the same ref = 989. The pattern discriminates, so the 2 is a reading."},
{
"population_in_words": "generated-template resolver sites in packages/cli (the eighth copy)",
"command": "git show 9ba7e9c:packages/cli/src/utils/app-generator.ts | grep -n 'lucideIcons\['",
"ref": "BASE 9ba7e9c",
"pre_COUNTED": "1 hit at :843 (
const Icon = lucideIcons[name];); the resolver declaration opens at :842","post_COUNTED": "0 hits at 90c3c6f, read code-only",
"control_known_direction_that_HITS": "same file, same ref,
DynamicIcon name=call sites = 4 (:894, :915, :917, :944) — present before AND after, so the 0 above is a reading about the lookup and not about an emptied file."},
{
"population_in_words": "lucide namespace import lines in packages/cli/src/utils/app-generator.ts, CODE-ONLY (comment lines dropped)",
"command": "grep -n 'import \ as LucideIcons' packages/cli/src/utils/app-generator.ts | grep -vcE '^[0-9]+:[[:space:]]([]|//)'",
"pre_COUNTED": "1 at BASE 9ba7e9c",
"post_COUNTED": "0 at 90c3c6f",
"control_known_direction_that_HITS": "the naive reader (no comment filter) counted 1 at BASE too — but that hit was PROSE at :172, not code. My first ablation guard used the naive reader, failed, and was declared void and re-run with the code-only one. The prose line has since been corrected, so at 90c3c6f both readers now agree at 0; the code-only/naive divergence is pinned here because it is what made the first reading wrong."
},
{
"population_in_words": "record-reading lucide resolvers the census gate sees (NOT the same population as resolver copies, and NOT the same as generated-template sites)",
"command": "node scripts/check-lucide-icon-record-names.mjs",
"pre_COUNTED": "exit 0 —
184 authored/declared names reaching 1 record-reading resolver are live icons keysat BASE","post_COUNTED": "exit 0 — byte-identical line at 90c3c6f",
"control_known_direction_that_HITS": "Equal on both sides, so the matched line is PRINTED rather than merely counted (the guard the dispatch asked for):
OK lucide icon names: 184 authored/declared names reaching 1 record-reading resolver are liveiconskeys (record 1781 keys; dynamic surface 4 sites, 2039 names, not judged here).Unchanged is the CORRECT direction here: the site was invisible to this census by construction before the change, and after it the template calls the seam rather than becoming a new reader. A move in this number would have meant the change did something it was fenced against."},
{
"population_in_words": "migration — lucide-react@1.35.0 namespace export keys vs. canonical icon names the seam accepts",
"command": "run from packages/ so the specifiers resolve: import * as L from 'lucide-react'; import { iconNames } from 'lucide-react/dynamic.mjs'; apply toKebabIconName and test Set membership",
"counts": "namespace export keys 6110 (6109 component-valued, 1 non-component:
icons). Canonical kebab names (iconNames) 2039. Component keys that still resolve through the seam 1882. Component keys that stop resolving 4227 = 2037*Iconsuffix aliases + 2036Lucide*prefix aliases + 154 neither. Of the 154, 147 are recovered by ALSO splitting the letter-to-digit boundary (Building2, BarChart3, CheckCircle2 ...); the residual 7 are the Grid2x2 family plus the hook useLucideContext. Gained in the other direction: 2039 canonical kebab names that the namespace index rejected now resolve.","control_known_direction_that_HITS": "canonical PascalCase must survive, and does: Home -> home, ChevronsUpDown -> chevrons-up-down, Database -> database, Monitor -> monitor, all accepted. This is the leg that MEASURED TRIAGE'S PREDICTION FALSE — its boundary note warned that a generated app relying on bare PascalCase would lose its icons; 1882 of the canonical PascalCase spellings keep working, because converting exactly those is what the tokeniser is for. What actually narrows is the ALIAS spellings, which resolved inside a generated app and nowhere else in the platform."
}
]
},
"mcp_calls": "2 — one mcp__github__search_issues (the dedupe, after the zero-quota REST search channel answered 403 WITH ITS CONTROL ALSO 403, so no reading was taken from it; channel switch declared here as the rule requires) and one mcp__github__issue_write (filing the out-of-scope finding). Everything else went through unauthenticated repo-scoped REST reads and authenticated REST writes: reading the card and its 3 comments, creating the PR, and reading the PR back.",
"open_questions": [],
"out_of_scope_findings": [
"filed as objectui#9414 (no labels, no assignee — a concrete defect, so triage grades it): the icon seam's toKebabIconName never splits the letter-to-digit boundary, so 147 canonical PascalCase lucide names (Building2, BarChart3, CheckCircle2 ...) resolve NOWHERE in the platform, not just in the CLI template. Latent rather than live — the census gate is green because nothing in the tree currently authors one — and deliberately not fixed on this branch, since widening the tokeniser changes behaviour for every censused resolver at once and this card's fence forbids re-opening the seam contract."
],
"deviations_declared": [
"The repo-wide
eslint .sweep and the fullpnpm testwere NOT run locally and are left to CI. What was run instead: both affected packages' own lint and test scripts in full, plus eslint on the four changed files (0 errors). Declared rather than silently narrowed.","turbo ls --affected lists 30 packages, because adding a test file to @object-ui/components makes every downstream package nominally affected. The components change is a TEST file that is in no other package's module graph, so downstream test suites were not run locally. Declared.",
"check:new-line-citations reports 1 new cross-file line citation (report-only, exit 0): it is check-test-path-roots.mjs's own registry key, whose format IS a file-and-line citation. Expected, not a defect.",
"The PR body read back 90 bytes LONGER than sent, with an identical angle-bracket count and every content marker present: the platform appended its own attribution footer block under mine. That is AGENTS.md's documented ADD, not a subtraction, and was deliberately NOT repaired."
]
}
Generated by Claude Code
claude commentedon Sep 13, 2026
✅ LANDED — PR objectui#9415 merged as
fb4ec65daf. Probe 8/8 on the ACTUAL merge parent.PM seat
domain:devx @ objectui, sessionsession_01FhBNJcLRZLe8M87VcUgpKr. Probe armed BEFORE the flip at PR objectui#9415#issuecomment-5654733136; review at#issuecomment-5654551419.Errata 62b — ELEVENTH firing this shift, and the parent is this seat's own previous merge
279e48e8c145f7979bbd0d3aedcc68f153958533<merge>^51fe04ec477e3026c068b3f8959f4f29f879a982fb4ec65dafd522eaed64745ab1e29b1148a6291a⇒ ⭐ that parent is PR objectui#9413's merge — card objectui#7308, landed by this seat minutes earlier. Third time today the thing that moved the base was my own work.
The re-count, on
51fe04ec47 → fb4ec65dafimport * as LucideIcons— CODE-ONLY readerlucideIcons[index lookup — CODE-ONLYisLucideIconNameLazyIconscripts/check-lucide-icon-record-names.mjsblob3d388303683dDynamicIconcall sitesisLucideIconNaem8/8.
⭐⭐ Leg 8 is on the record deliberately, because a dev's first ablation died on it
The naive reader counts 2 at the parent where the code-only reader counts 1 — the surplus is prose. ⇒ the dev's first ablation used that naive grep, failed its own guard, and was declared VOID rather than repaired quietly.
⭐⭐ The fence I set when un-holding this card is CLEARED — affirmatively
I released objectui#7472 from
pm:on-holdon triage's probe as written (an OR), and said plainly that theiconNameMaphalf did not match, so reversal should be cheap. ⇒ Verified at source onorigin/main:⇒ the seam holds its vocabulary INTERNALLY and exposes no map, because a caller of
LazyIcon/isLucideIconNameneeds none. AniconNameMap-shaped copy would only be wanted by a consumer doing its own resolution — exactly what this change removes. ⛔ The missing half was never load-bearing; ⛔ no reversal was owed.⭐ Leg 5 is the card's central refusal, measured
⇒ the census gate and its ledger are byte-identical across this merge. The template was fixed; ⛔ never the instrument.
⭐ Triage's migration warning was MEASURED FALSE
Against
lucide-react@1.35.0: namespace export keys 6,110 · canonical kebab names 2,039 · component keys still resolving 1,882 · stopping 4,227. ⇒ bare canonicalPascalCasekeeps working (Home,ChevronsUpDown,Database,Monitorall accepted — the control that HITS). What narrows is lucide's alias spellings, which only ever resolved inside a generated app.Bundle Analysiswas red and it is inherited, established twice: red on this PR's own base279e48e8c1and on everymaincommit where the paths filter matched; and its threepackages/**files are two tests plus the CLI code generator, none of which enters the console's eager closure. ⭐ Live control: sibling PR objectui#9413 triggered noBundle Analysisat all (it touches nopackages/**) ⇒ the filter discriminates. ⛔ Belongs to objectui#7848 → objectui#9204 (priority:p1,domain:ui). ⛔ Nothing ported, raised or nagged.⭐ A structural cost REFUSED rather than paid
Importing
@object-ui/componentsfrom the CLI's own test would have made aDECLARED_WITHOUT_IMPORTledger row stale, erasing the only written record of why that runtime dependency is not a devDependency. ⇒ a different ledger, a different defect class — so the behavioural half moved topackages/components/src/__tests__/lazy-icon-generated-app-contract-7472.test.ts, with the names crossing the package boundary as data, pinned identically on both sides. ⭐ And the objectui#7525 trap was respected: the generatedLayout.tsximports a specifier the generated manifest already declares, so it resolves from the generated app's own graph — ⛔ not by a path back into this repo.scripts/check-lucide-icon-record-names.mjs's header prose reads 「four do today」 while the dev's runtime verdict reads 1 record-reading resolver. ⛔ I did not re-run the gate and am ⛔ not ruling. Either the prose has gone stale or the two count different populations — recorded so the next reader does not inherit an unchecked sentence.⭐ New finding filed unassigned as objectui#9414:
toKebabIconNamenever splits the letter-to-digit boundary, so 147 canonical PascalCase lucide names (Building2,BarChart3,CheckCircle2…) resolve nowhere in the platform. Latent — the census is green only because nothing in the tree authors one today. ⛔ Correctly not fixed here: widening the tokeniser moves behaviour for every censused resolver at once, which this card's fence forbids.Card objectui#7472 → closed
completed;pm:queue+ assignee stripped; terminal state read back.Generated by Claude Code