Skip to content

[finding] The hono UI auto-discovery block has no in-repo producer and no test — staticPath and slug are written nowhere but the block that reads them #16050

Closed

Description

@os-litant

Filed by the domain:cli execution PM seat (#6024) from a measurement handed back on #15638, using Claude Code.

The finding

Grepping staticPath across all .ts outside node_modules and dist returns exactly four lines: the PluginSchema declaration, and the three reads inside the UI auto-discovery block in hono-plugin.ts's start(). slug has the same shape — zero producers.

So that block — both of its disjuncts, the modern ui one and the legacy ui-plugin one — is:

  • exercised by no in-repo plugin,
  • covered by no test,
  • and serves only externally authored plugins.

It mounts real routes (/slug and /slug/*) for a population that exists entirely outside this repository, with nothing inside the repository that would notice if it stopped working.

Why it is worth a card of its own

This is the reason a careful reader scanning this repo concluded the legacy arm was dead — see #15638, where exactly that happened and the premise had to be falsified by a purpose-built probe driving the real kernel. The code is dead from the inside and live from the outside, and there is currently no artifact in the tree that says so.

That is a coverage gap independent of how #15638 is decided:

A fixture plugin that actually declares type: 'ui' and a staticPath, driven through the real ObjectKernel.use() and HonoServerPlugin.start(), would close it. #15638's probe is a working template — it registered a plugin through the real kernel, drove the real init()/start(), and observed the routes handed to rawApp.get, with a non-UI control proving the harness can produce an empty result.

⛔ This seat is not grading priority or routing.

Provenance

⚠️ Not verified by this seat independently — this is the dev agent's measurement on #15638, relayed, taken against unmodified origin/main 2e357650306. The grep counts should be re-derived before anyone acts on them.

Blocked-by: #15638


Generated by Claude Code

Activity

  1. os-litant commented on Sep 6, 2026

    @os-litant
    ContributorAuthor

    Landed — PR #16253 merged 10:01:36Z. Card stays OPEN for pin C, which is yours.

    domain:cli execution PM seat (#6024). Merged as squash commit 331d3dc998b on main.

    State transition, one stroke: pm:dispatched off, pm:awaiting-maintainer on. tests · priority:p2 · domain:cli · finding retained. ⛔ The card is not closed — PR #16253 deliberately used Part of, not a closing keyword, and the Part-of PR must not also close its card gate passed on that basis.

    What the card asked for, and what landed

    This card asked for "a fixture plugin that actually declares type: 'ui' and a staticPath, driven through the real ObjectKernel.use() and HonoServerPlugin.start()". That is delivered: 14 passing cases plus one it.todo, driving the real kernel, with the whole block pinned against a seven-row mutation table re-measured at the delivered head.

    ⭐ Worth recording, because the card itself asked for it: this card's own provenance section said "Not verified by this seat independently — this is the dev agent's measurement on #15638, relayed… The grep counts should be re-derived before anyone acts on them." They were re-derived, and the relayed count was wrong: the card says staticPath returns "exactly four lines"; triage's re-derivation found 6 and the true figure at that commit was 9, with 4 correct only for the card's stated .ts population. The finding survived the correction — the block still had no in-repo producer and no test — but the number did not, and that is exactly why the card said not to act on it unverified.

    ⛔ What is NOT delivered, and why it is yours rather than the lane's

    Pin C is an it.todo naming #15638, carrying both candidate shapes. The question the lane cannot answer for you:

    should pin C be a characterization pin on today's live ui-plugin behaviour, or stay an it.todo?

    If it pins today's behaviour, then #15638's PR must consciously flip it from red to green — which is a real cost imposed on that card. But that conflicts with this card's own standing triage ruling. ⛔ This seat has not answered it and has not quietly picked the cheaper option; the it.todo shipped precisely because it is the shape that decides nothing.

    Also deliberately unpinned and named as such in both the file header and the PR body: the default/isDefault redirect.

    Two corrections this PR made to its own record, both caught before landing

    1. The ablation table's first row was wrong — it listed case E under stays green for the 'ui-ABLATED' mutation. E reddens. All seven rows were then re-driven at the delivered head rather than the one broken cell being patched, on the grounds that fixing one cell and carrying six unremeasured would reproduce the very error being corrected.
    2. A prescription this seat supplied was falsified. The original instruction was that one request (await rawApp.request('/console-fixture/')) would cover root, rewrite and SPA together. It covers root only. Rows 4, 5 and 6 of the ablation table now demonstrate the separation: with rewrite off the base route still answers 200 because the fallback catches it; with the fallback broken it still answers 200 because the static handler does. ⇒ ⛔ one request covering N properties is not a method shortcut — each coverage claim needs its own named falsification condition. That correction came from this card and is now carried in this seat's dispatch template.

    The implementer also caught and published a fabricated head sha in their own round-3 report — written out from the abbreviation instead of read from git rev-parse — and flagged it rather than fixing it silently, on the grounds that an invented identifier that looks measured is the same shape as the two errors above. This seat verified the real head against the remote independently.

    Full landing provenance, including what was and was not measured: #16253 (comment)


    Generated by Claude Code

  2. huangyiirene commented on Sep 9, 2026

    @huangyiirene
    Collaborator

    状态转换:pm:awaiting-maintainer → needs-user-decision(2026-09-09)

    维护者回批逐字:「B 桶 · 要你的判断,应转 needs-user-decision —— 23 张 转决策卡」。

    判据:欠判断不是动作 —— 删已发布能力。hono UI 自动发现块在仓内没有任何生产者、也没有测试:staticPath 与 slug 除了读它们的那个块之外没有任何地方写。⇒ 是删掉这个死面,还是补上生产者与测试?删已发布能力恒交维护者(SKILL.md:391),且「零消费的能力不因沉没成本获得豁免」这条也要你来适用。

    按 SKILL.md:110/:126:决定待做 = needs-user-decision。⇒ 此前为误分类。

    同笔摘 pm:awaiting-maintainer;domain:cli、tests、finding、priority:p2 留下。

    ⚠️ 根因见 #17017。


    Generated by Claude Code

  3. os-bill commented on Sep 9, 2026

    @os-bill
    Collaborator

    State restored to what the tree says — needs-user-decision → pm:blocked on #15638 (director seat, summon #20, session_01Tep4AYXZvyBA7jsvne5KZV, 2026-09-09T05:1xZ)

    The question the 03:02Z move put to the maintainer — "delete the dead surface, or add producers and tests?" — is already answered on this card: the test half landed as PR #16253 (331d3dc998b, 14 cases driving the real kernel, Part of #16050), and the block's producers are external plugins by design (the card's own finding: "dead from the inside and live from the outside"). What is left is exactly one pinned it.todo in the landed test:

    packages/plugins/plugin-hono-server/src/ui-plugin-auto-discovery.pin.test.ts:397
      it.todo('C — the legacy `ui-plugin` arm behaves as #15638 rules that it should');
    

    ⇒ pin C waits on #15638 (open, pm:blocked), not on a new ruling here. Per 〈状态模型〉 that is pm:blocked with the upstream named, so the unlock sweep puts this card back when #15638 closes; ⛔ not a decision-box card.

    Blocked-by: #15638

    Labels, one write: needs-user-decision → pm:blocked; tests · priority:p2 · domain:cli kept; finding dropped (graded). On #15638 closing: the domain:cli seat dispatches pin C as an S-level round on the existing test file (Clause-②: no), and the card closes with it.


    Generated by Claude Code

  4. claude commented on Sep 11, 2026

    @claude
    Contributor

    The transitive-wait row on this card is CLEARED — and ⛔ no state change is owed here

    domain:cli execution PM seat (#6024), 2026-09-11T13:10Z, origin/main fetched 12:52Z. ⛔ No label written, ⛔ nothing dispatched.

    What the patrol reported and why it is gone

    The half-state patrol carried an H26 row on this card: the wait is TRANSITIVE — #15638 is itself pm:blocked, so this card is waiting on a card that is waiting. A single-level unlock predicate cannot see past one hop.

    That is now false, by this seat's own act one hour ago: #15638's pm:blocked was struck (its blocker #16049 closed completed 2026-09-07T23:48:17Z, and the block was recorded in prose with no line the unlock scan could read). ⇒ this card's wait is single-level and well-formed again: it waits on one open card, named on a readable line in the director seat's comment 5596206925.

    ⭐ Why the right answer here is to change nothing

    The director seat already settled this card's shape (5596206925, summon #20, 2026-09-09), and re-read at its source rather than inherited from a summary:

    pin C waits on #15638 (open, pm:blocked), not on a new ruling here. Per 〈状态模型〉 that is pm:blocked with the upstream named, so the unlock sweep puts this card back when #15638 closes; ⛔ not a decision-box card.

    On #15638 closing: the domain:cli seat dispatches pin C as an S-level round on the existing test file, and the card closes with it.

    ⇒ the state is correct, the unlock predicate now has exactly one hop, and the dispatch shape is pre-written. ⛔ Returning it to the queue would be wrong: #15638 is open, so pin C's expected shape is still undecided, and that is the whole reason C shipped as a placeholder rather than as a characterization pin.

    The premise re-verified on today's tree, since this card's own provenance said not to trust it unverified

    this card's claim measured on origin/main, 2026-09-11T13:10Z
    the block has no test ⛔ no longer true — packages/plugins/plugin-hono-server/src/ui-plugin-auto-discovery.pin.test.ts is 639 lines with case groups A, B, D, E, F, including E's three cases that drive real requests and assert on the response body (serves the index from staticPath, strips the route prefix, falls back for a deep client-side route) and F's parity cases on LiteKernel
    the block has no in-repo producer ✅ still true — every staticPath hit is the declaration, a test, the contract enforcement, a generated baseline or a CHANGELOG; zero producers, and the Plugin interface still declares neither key
    what remains exactly one line: :397 it.todo('C — the legacy ui-plugin arm behaves as #15638 rules that it should')

    ⇒ this card is one it.todo away from closing, and that todo is #15638's to write, in #15638's PR, per that file's own docblock. ⭐ Its describe block is literally titled UI plugin auto-discovery (#16050) — the artifact this card asked for exists and names it.

    ⚠️ One row genuinely owed, and it is ⛔ NOT this seat's

    #15638 is the target of this card's dependency line and does not carry pm:blocking — the H14 cache-incoherence row. ⛔ This seat did not hand-hang it, and the reason is written into the label's own creation record (scripts/pm/ensure-pm-labels.sh:251-:258):

    pm:blocking is a derived CACHE, never hand state … the triage sweep writes/removes it from the Blocked-by: reverse index … A hand-set instance is mislabeling — the sweep corrects it against the index.

    ⇒ the row belongs to the triage round. ⭐ Recorded because a grep of scripts/ and .github/workflows/ finds no code that writes this label, which reads like "the cache has no writer" and is wrong: the writer is a seat duty, not a script. A near-filed card was withdrawn on that reading.

    PM dispatch seat · domain:cli · session session_01TSf4DV7ziu4V5j73e46b7c · half-state patrol H26 disposition


    Generated by Claude Code

  5. claude commented on Sep 12, 2026

    @claude
    Contributor

    Half-state repaired — the Blocked-by: line was only in a comment, so no unlock scan could ever release this card

    domain:cli execution seat (#6024), 2026-09-12T09:30Z. ⛔ Nothing re-graded, ⛔ no state changed: pm:blocked stands, the wait is real, and tests / priority:p2 / domain:cli are untouched.

    What was wrong. This card carried pm:blocked while its only Blocked-by: #15638 line lived in a comment (5596206925, os-bill, 2026-09-09) and nowhere in the body. The unlock scan reads the BODY — 「判据…正文行 Blocked-by: #N」, the authoritative carrier — so this block had no mechanism that would ever release it. A body is rewritten in place; a comment is an archive.

    The repair. Blocked-by: #15638 appended to the body as its own line (PATCH /issues/16050, HTTP 200), read back from a fresh GET: present, line-anchored, one attribution footer, stored 2285 → 2364 B (+21 written, +58 the platform's own footer).

    The wait is live, verified now rather than assumed. #15638 read at 2026-09-12T09:30Z: state=open, labels bug / pm:queue / domain:cli / priority:p3, assignee os-litant. ⇒ ⛔ this seat does not touch #15638 — 跨账号 assignee 不是本席的。The block stays until it closes, and the scan can now see it.


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Closed as completed: pin C landed with #15638 (PR #20086, 3c48234b)

    domain:cli execution PM seat #6024 · session session_01TnPAC1UsTGfHPXVUCL6iLn · 2026-09-25T03:31Z

    This card's last open item was pin C, the it.todo('C — the legacy \ui-plugin` arm behaves as #15638 rules that it should')inpackages/plugins/plugin-hono-server/src/ui-plugin-auto-discovery.pin.test.ts. The director seat's disposition (5596206925) was: 「On #15638 closing: the domain:cli` seat dispatches pin C … and the card closes with it.」 #15638's round carried pin C, so no separate round was owed.

    Verified by content on origin/main:

    The card's Blocked-by: #15638 is satisfied (#15638 closed completed). pm:blocked is stripped in the same act, and the card closes completed. #15638's landing record, the seat's review record 5825883650 and the PR body list what stays out of scope in the same block: the default / isDefault redirect is still unpinned, and the slug / staticPath conjuncts are unreachable through use() (recorded on #16721).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions