Skip to content

[Decision] ui/ merge leftovers that no aftercare card names: six nested top-level docs, a second copy of four .claude hooks, an independently numbered ui/docs/adr, and a dead ui/.github/dependabot.yml #26080

Open

Description

@objectstack-fleet

Ruled: 6417494426 · letter A · 2026-10-26T13:42Z

Filing gate ②: a maintainer-only decision. Maintainer, 2026-10-26, verbatim: 「完整的评估本项目, 还有哪些可以优化的地方。包括 ci 和文档」 then 「使用 pm-dispatch 技能创建 issue,需要决策的立为决策卡。」 and 「低优先级的先不考虑」. Batch-of: 19 (repository evaluation 2026-10-26, session_019a9XCWsbMFp75REzthE6cs; 9 decision cards + 10 execution cards). Reader: the director seat presents this card in a decision batch; after the ruling the lane named under "After the ruling" dispatches. ⛔ Not a claim. Dedupe: REST list (439 issues), grep ui/\.github|ui/AGENTS|ui/\.claude|nested → 3 hits: #25880 (closed, ruled A: port the 19 repo gates), #25728 (closed), #25712 (open, dispatched: AGENTS.md / ui/AGENTS.md nesting, the 18 governance workflows, pm scripts, liveness evidence). Read #25712's scope in full: it names ui/AGENTS.md, the workflows under ui/.github/, and the two .githooks trees; it does not name the files below. #25831 (ui changesets) and #25832 (ui skill bundle) cover those two. New for the remainder.

维护者速读

objectui 合入 ui/ 两天,#25712 / #25831 / #25832 / #25880 已经在收 AGENTS.md、治理 workflow、changeset、skills 和 repo-gates。还剩一组没人点名的重复面:① ui/ 下六份顶层文档 README.md(470 行)、CHANGELOG.md(807 行)、ROADMAP.md、CONTRIBUTING.md、QUICK_REFERENCE.md、LICENSE + LICENSE-THIRD-PARTY.md——根目录各有一份同名文件,两份 CONTRIBUTING 两套入门步骤、两份 ROADMAP 两条方向;② ui/.claude/hooks/ 与根 .claude/hooks/ 同名的四组守卫(guard-main-checkout、guard-main-checkout-bash、guard-shared-stash、guard-tree-enum 各带 selftest),Claude Code 只读根 .claude/,嵌套的一份永不执行;③ ui/docs/adr/ 11 份 ADR 独立编号(0001 起),与根 docs/adr/ 的 0001 重号,而 AGENTS.md 第 13 条说编号永不重分配、check-adr-anchors.mjs 只认根注册表;④ ui/.github/dependabot.yml Dependabot 只读根配置,这份是死文件;ui/lychee.toml、ui/turbo.objectui.json 同类。请裁:A 六份顶层文档并入根(README 的 UI 段落、CHANGELOG 作为 @object-ui 历史移到 content/docs/releases/ 或保留为 ui/CHANGELOG.md 只读历史、ROADMAP/CONTRIBUTING/QUICK_REFERENCE 删除并在根文档加 UI 小节、LICENSE 保留因 MIT≠Apache),删重复 hooks,ui/docs/adr 以 ui-NNNN 前缀登入根注册表索引(文件不动、不改号),删死配置;B 只删死文件(hooks、dependabot、lychee、turbo.objectui),文档与 ADR 不动;C 全部保留,作为 ui/ 子树自治的一部分。选 A / B / C?

Governing text

Premises

  • P1 — ls ui shows README.md, CHANGELOG.md, ROADMAP.md, CONTRIBUTING.md, QUICK_REFERENCE.md, LICENSE, LICENSE-THIRD-PARTY.md, lychee.toml, turbo.objectui.json; ls ui/.github shows dependabot.yml and workflows.
  • P2 — ls ui/.claude/hooks → eight files, four of them byte-different copies of root hooks: diff .claude/hooks/guard-shared-stash.sh ui/.claude/hooks/guard-shared-stash.sh.
  • P3 — ls ui/docs/adr | wc -l → 11; ls ui/docs/adr | head -1 starts at 0001.
  • P4 — Dependabot reads only the root .github/dependabot.yml (GitHub docs); the root file has no directory: /ui entry.
  • P5 — licence: ui/package.json "license": "MIT", root packages Apache-2.0 — the ui LICENSE file must stay.

One-sentence problem

Two days after the merge the tree still tells a reader two ways to contribute, two roadmaps, two hook sets of which one never runs, and two ADR 0001s.

Options

Option What Consequence Workload
A Fold the six docs into the root equivalents (keep ui/LICENSE*; keep ui/CHANGELOG.md as frozen history or move it under releases); delete ui/.claude/hooks/* (root hooks already guard every repo path per their headers); register ui/docs/adr in the root index under a ui- prefix without renaming files; delete ui/.github/dependabot.yml, ui/lychee.toml, ui/turbo.objectui.json after confirming nothing reads them. One contributor story; the governed register shrinks by the dead hook tree; the anchor checker learns one more registry prefix (an edit to check-adr-anchors.mjs). devx + skills (hooks are .claude/**) · 3 PRs (docs; hooks Tier S; ADR index + dependabot Tier H for .github) · precedent: #25880 (closed)
B Dead files only. Quick; two CONTRIBUTINGs and two ROADMAPs remain. 1–2 PRs
C Keep. The subtree stays a repository-in-a-repository. 0

Business meaning

  • A: one repository.
  • B: one repository with a spare instruction manual in a drawer.
  • C: two repositories sharing a lockfile.

四维分析

Recommendation

A, serialized after #25712's PR 2 lands (same directories). 只看①选 A;②③④ 是否翻转:否。

Confidence gaps: whether ui/turbo.objectui.json or ui/lychee.toml is read by any root script or workflow (grep -rn 'turbo.objectui\|ui/lychee' .github scripts package.json before deleting); whether #25712's dev already removed any of these in flight — the dispatching seat re-reads #25712's PR file lists first.

After the ruling

  • A: devx seat for docs and dependabot; skills seat for ui/.claude/hooks (Tier S); ADR prefix rides D5's index PR if that is ruled A, else its own small PR.
  • B: devx seat, one PR plus the Tier S hooks PR.

os-decision-facets
① 项目长远合理性:一个仓一套治理(#25677 的目的);ADR 不改号只登前缀,守第 13 条。
② 实际业务拉动:ui/CONTRIBUTING.md 讲的是独立仓流程,照做即错;两份 ROADMAP 两条方向。
③ 防 AI 犯错:永不执行的 hooks 是「声明而未兑现」的治理面,删除优于保留。
④ 创业阶段不扩散:删重复零新门禁;索引前缀复用 D5 的脚本。
Prior rulings read: ui merge,nested,aftercare,hooks → 3 hits (#25880 A, #25712, #25728); none; thread: none; repo: objectstack-ai/objectstack

Related

#25677 (epic), #25712 (open, dispatched), #25831, #25832, #25880 (closed, ruled A).

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 10 · 2026-10-27T22:39Z
    Session: session_01JQwxba7P2phAaUWi6JeQzw (card thread cmsg_01U5RdnAAmkSQmZbqh6FtqZ8V6Qkss9Sw7tWYCVASV1heJ, dispatched by seat session session_01JQwxbaFpnMwgpCgneKe2qS)
    Account: os-warren (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-dguv94 (the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: slice 1 of ruling 6417494426 (letter A), the non-governed half. Fold ui/README.md, ui/ROADMAP.md, ui/CONTRIBUTING.md and ui/QUICK_REFERENCE.md into the root README.md / ROADMAP.md / CONTRIBUTING.md and delete the four. ui/CHANGELOG.md stays as frozen history with a one-line header. ui/LICENSE and ui/LICENSE-THIRD-PARTY.md stay. Delete ui/lychee.toml and ui/turbo.objectui.json after scripts/ui-import/README.md (their only reader) is updated. Every reference to a moved or deleted file is repointed. ui/.github/dependabot.yml is already absent on main. ⛔ Not ui/.claude/** (governed; its own slice), not the ui/docs/adr index prefix (rides #26076), not ui/AGENTS.md, AGENTS.md, .github/** or .claude/** (stop on breach: check-governed-merges --test before the PR). PR says Part of #26080
    Container & model: M, mode:thread (Warren's 「opus 很多,并发5」, 2026-10-27), model: default (opus), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: maintainer ruling 6417494426 (「其他同意」, batch #398 item 4)
    Thread-read: 6417494426
    Premise: holds on origin/main 5ec398dccb: the six ui/ top-level documents exist, as do ui/lychee.toml and ui/turbo.objectui.json. The ruling's serial blocker, #25712 PR 2 (PR #26343), merged 2026-10-27T02:29Z, and #25712 is closed (read by the seat)
    Serial constraints cleared: #26343 merged. ⚠️ Open draft PR #26365 (domain:ui, retire plugin-ai) also edits ui/README.md and ui/QUICK_REFERENCE.md: merge origin/main right before the PR. #25910 (vscode-extension removal, ruled B) waits behind this slice and edits the folded result. No other devx seat is seated

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim released · domain:devx#1 · session_01JQwxbaFpnMwgpCgneKe2qS · 2026-10-27T22:43Z · ⛔ not a claim

    Claim 6455344783 is withdrawn before any edit. The maintainer told the devx seat to finish the work already in flight and stop (「当前任务处理完,合并后就下班」), and devx seat 2 takes the queue next. Back to pm:queue with no assignee.

    The card thread's read-only premise reading, at origin/main 5ec398dc. Start here, because two of the ruling's conditions do not hold as written:

    • scripts/ui-import/README.md no longer exists; it was retired with its splice tool in aftercare(ui-merge): the first joint 18.x release from the merged repo — both scopes at one version, @object-ui published, docs site deployed — then close #25556 as superseded and the epic (parent #25677, 6/6) #25753 (pnpm-workspace.yaml:713). It is not "their only reader".
    • ui/turbo.objectui.json is live input. ui/scripts/workspace-root.mjs reads it (PARKED_TURBO_CONFIG / uiTurboConfigPath()), and so do 8 ui/scripts tests (check-dist-completeness, e2e-type-check, helpers/turbo-inputs, select-type-check-scope, turbo-build-outputs-cover-published-entries, turbo-lint-inputs, turbo-task-guard-coverage, workspace-root.test). Deleting it turns Test UI red.
    • ui/lychee.toml is read by ui/scripts/__tests__/check-links-workflow.test.ts. The ruling said delete only after confirming nothing reads them, so both stay. Whether those tests should read the scoped root turbo.json instead is a follow-up card.
    • The four docs are pinned: ui/scripts/check-doc-links.mjs SCAN_ROOTS has a row for each, and check-doc-links.test.ts pins them; quick-reference-commands-4149.test.ts reads ui/QUICK_REFERENCE.md; markdown-test-inputs.mjs records it. Four tests read the ui/README.md fences (Basic Usage, Kanban Board): page-body-single-node-8310, page-body-arity-8310, readme-kanban-example-8256 and object-calendar-container-by-reference-6152. check:doc-types reads its json fences too.
    • The thread's proposed route:
      • The root README gains a short "ObjectUI (ui/)" section.
      • The pinned code examples move to ui/content/docs/guide/quick-start.md, so the pins retarget inside ui/.
      • QUICK_REFERENCE's cheat sheet becomes a "UI workspace" section of root CONTRIBUTING, with the 4149 pin retargeted.
      • The four SCAN_ROOTS rows are dropped.
      • Relative links in ui/apps/console/README.md and ui/.changeset/README.md are repointed.

    Still open on the card beyond slice 1: the ui/.claude/hooks deletion (governed), and the ui/docs/adr index prefix (rides #26076).

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · slice 1 (non-governed docs fold) · 2026-10-27T22:53Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW
    Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-26080-ui-docs-fold
    Worktree: objectstack-issue-26080
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: slice 1 of ruling A (6417494426), the docs fold only. Fold ui/README.md, ui/ROADMAP.md, ui/CONTRIBUTING.md and ui/QUICK_REFERENCE.md into the root README.md / ROADMAP.md / CONTRIBUTING.md and delete the four; ui/CHANGELOG.md stays as frozen history with a one-line header; ui/LICENSE and ui/LICENSE-THIRD-PARTY.md stay. Retarget what reads the four files on main (seat 1's premise reading 6455414069 names ui/scripts/check-doc-links.mjs SCAN_ROOTS and its test, quick-reference-commands-4149.test.ts, markdown-test-inputs.mjs, the four tests that read ui/README.md fences, check:doc-types, and relative links in ui/apps/console/README.md and ui/.changeset/README.md); pinned code examples may move to ui/content/docs/guide/** so their pins stay inside ui/. PR says Part of #26080. ⛔ Not ui/lychee.toml or ui/turbo.objectui.json: the ruling deletes them only once nothing reads them, and 6455414069 measured live readers, so they stay on this card. ⛔ Not ui/.claude/**, not the ui/docs/adr index prefix (rides #26076), not ui/AGENTS.md, AGENTS.md, .github/** or .claude/** (stop on breach: check-governed-merges --test before the PR)
    Container & model: M, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier on the surface: "no path-derived mandate"), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Ruling-ref: 6417494426
    Thread-read: 6455414069
    Premise: corrected 6455414069. The fold holds: the four ui/ documents exist on main. The ruling's condition for deleting ui/lychee.toml / ui/turbo.objectui.json fails (scripts/ui-import/README.md is gone and both files have live readers), so slice 1 leaves them, and the card keeps that item open.
    Serial constraints cleared: the ruling's blocker #25712 PR 2 (PR #26343) is merged. Open PR #26365 (draft, retires @object-ui/plugin-ai) touches ui/README.md and ui/QUICK_REFERENCE.md, so whichever lands second merges main and re-derives. #26073 (this round, this seat) edits root README.md L270, ROADMAP.md:4 and CONTRIBUTING.md:114 in other regions; whichever lands second merges main. #25910 (move ui/packages/vscode-extension out, ruling B) names ui/README.md / ui/QUICK_REFERENCE.md and goes after this card.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26080,
      "status": "done",
      "branch": "claude/issue-26080-ui-docs-fold",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27001",
      "session": "session_01QSeKYmTYfaPbLQD4BJfomW",
      "premise_still_valid": true,
      "summary": "Slice 1 of ruling A (6417494426): ui/README.md, ui/ROADMAP.md, ui/CONTRIBUTING.md and ui/QUICK_REFERENCE.md are folded into the root README (ObjectUI section), CONTRIBUTING (UI Workspace section + @object-ui package directory + MIT clause) and ROADMAP (ObjectUI pointer, sibling-repo lines corrected), then deleted; the README code examples moved to ui/content/docs/guide/quick-start.md; ui/CHANGELOG.md got a one-line frozen-history header. Measurement went beyond the PM's assumption list: ROOT_PAGES in three doc gates (check-doc-component-types / snippet-types / fence-languages) named ui/README.md, check-doc-json-fences had a root-README leg with an anchor, and 71 links in 36 files to the archived objectui repo's CONTRIBUTING.md/ROADMAP.md were resolved by the link gate against the deleted files; all retargeted (ROOT_PAGES emptied with its guard kept, json-fences leg removed, links repointed to objectstack root docs, pins moved to the quick-start page, ledger re-adjudicated, three judged-link floors lowered by measured amounts with reasons). Moving Basic Usage into content/docs exposed it to the objectui#11436 walk (a page with title and no pageType draws no heading), so the example now says pageType: \"app\". 33 published @object-ui package READMEs changed (links only) so a patch changeset is included in ui/.changeset. ui/lychee.toml and ui/turbo.objectui.json untouched (live readers re-confirmed).",
      "tests": "Head 70e7d98027, under os-verify-lock: `cd ui && pnpm exec vitest run --maxWorkers=2 scripts/` plus page-body-single-node-8310, page-body-arity-8310, readme-kanban-example-8256, object-calendar-container-by-reference-6152, page-node-headings-drawn-11436, registered-types-validate-ratchet-10859 and the ledger's readers of the edited pages → 'Test Files 187 passed | 2 skipped (189) / Tests 5349 passed | 2 skipped (5351)', 'VERDICT command-exit 0'. Earlier runs on the way: 36 failed (spec dist not built in the fresh worktree, plus the real retarget set), then 16, 14, then 5 (markdown-test-inputs floors + 11436 example), then 0. `pnpm --dir ui run type-check:scripts` exit 0. No ablation: no tested runtime behaviour changed (docs, gate tables, pins retargeted).",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 27 families; --ran reconciliation: '27 derived famil(ies) accounted for — 27 run, 0 NOT-MEASURED (a DERIVED zero — all 27 recorded an exit code and none of them is 3)'. All 27 exit 0 (check:* on 657dff26f1, type-check-debt rerun to completion detached after a 500s local timeout → exit 0; nul-bytes, doc-anchors, cross-package-test-inputs re-run on 70e7d98027 exit 0; ui scripts vitest on 70e7d98027 exit 0). Extra on 70e7d98027, exit 0: ui check:doc-types, check:doc-fences, docs:check-links ('Links are valid across 13 scan roots.'), markdown-test-inputs --audit, check-doc-expression-carriage, ui changeset gates (fixed, no-major, claims, pending-changeset-literals); check-governed-merges --test: 0 of 71 paths governed, 2447 changed lines. NOT MEASURED locally: ui check:doc-json, check:doc-snippets (need ui package builds) → CI. PR check-runs at report time: success = Check Documentation Links, Check PR Size, Governed Surface Queue Guard, PR-body guards, filter; in_progress = Lint (all lanes), Type Check (all lanes), Test Core, Check Changeset, Build UI Deps, Auto Label, Dogfood Regression Gate; UI jobs not yet reported.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 relay strokes — (1) pr_create: POST /repos/objectstack-ai/objectstack/pulls + POST /repos/objectstack-ai/objectstack/issues/27001/assignees (os-justin); (2) os-dev-report comment: POST /repos/objectstack-ai/objectstack/issues/26080/comments. Plus git pushes (not REST).",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: #26080 (remaining dead-config item) · ui/.gitattributes routes a nonexistent ui/pnpm-lock.yaml through an undefined pnpm-merge driver and its comment cites the deleted CONTRIBUTING section; ui/content/docs/guide/ci-cd-pipeline.md Lockfile Merge Driver passage still describes that instruction · noted in PR acceptance notes, not filed",
        "carrier: none · ui/scripts/setup.sh advertises pnpm build / pnpm lint / pnpm create-plugin that ui/package.json does not declare · observation, acceptance notes only",
        "carrier: none · ui/.changeset/README.md cites ui/.github/workflows/changeset-release.yml, gone from ui/ · observation, acceptance notes only",
        "carrier: #26365 · it removes @object-ui/plugin-ai; the plugin-ai row now lives in the root CONTRIBUTING ObjectUI package directory, so whichever lands second removes it there · coordination note in PR body",
        "carrier: none · fixed in place, not filed: the root README's Basic Usage page node taught title with no pageType (objectui#11436 class, never drawn); surfaced only because the move put it under the 11436 walk"
      ],
      "deviations": "Claim/dispatch said skip-changeset unless published files change; they do (33 package READMEs, link-only), so a patch changeset was added instead of the label. PM assumption list was incomplete (ROOT_PAGES in three gates, the json-fences root leg, 71 archived-repo self-URLs, the 11436 walk); handled on the producer side inside ui/scripts as listed. The 4149 pin keeps its file name; it now reads the root CONTRIBUTING UI section. Three anti-vacuity floors lowered to measured values (check-doc-links package-README decidable hrefs 150→135, packages/apps tree decidable 4→2, root-markdown file floors 8→4 in two suites, markdown-test-inputs scripts candidates 40→35). Container restarted mid-task once; resumed on the surviving worktree, no work redone.",
      "files_changed": "71 files, +839 / -1623 vs origin/main (git diff --shortstat origin/main...HEAD at 70e7d98027)"
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26080,
      "status": "done",
      "branch": "claude/issue-26080-ui-docs-fold",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27001",
      "session": "session_01QSeKYmTYfaPbLQD4BJfomW",
      "premise_still_valid": true,
      "summary": "Rework delta (PR comment 6457694530): I moved the README-links changeset from ui/.changeset/26080-readme-contributing-links.md to the root .changeset/26080-readme-contributing-links.md with git mv, so the frontmatter and body are byte-identical, then merged origin/main. Nothing else changed. skip-changeset is not applied. New head 81b8d0a919.",
      "tests": "Not re-run. This delta is a rename of a changeset file plus a merge of main; the earlier ui test readings stand at 70e7d98027.",
      "gates": "dispatch-gates on 81b8d0a919 derived 37 families. The 11 new ones all exited 0 on 81b8d0a919: check-adr-0087-registration --base origin/main ('this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)') and --self-test; check-changeset-no-major --base origin/main; check-empty-changeset --base origin/main and --self-test; check:changeset-gate-self-tests; check:pm-changeset-deadline-census; check:closed-ceremony-text; release-rehearsal-clone --self-test; release-pending-publish --self-test. The extra I added, check:changeset-fixed, also exited 0. The other 26 families keep their exit-0 readings from 657dff26f1/70e7d98027. --ran: '37 derived famil(ies) accounted for — 37 run, 0 NOT-MEASURED (a DERIVED zero — all 37 recorded an exit code and none of them is 3)'. CI's Check Changeset on the new head: not read yet.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "1 — this comment: POST /repos/objectstack-ai/objectstack/issues/26080/comments (relay). Plus git push.",
      "open_questions": [],
      "out_of_scope_findings": [],
      "deviations": "I re-ran pnpm install in the re-created worktree. The 26 families that were not re-run carry their readings from the earlier heads.",
      "files_changed": "71 files, +839 / -1623 vs origin/main at 81b8d0a919 (the changeset path is now .changeset/26080-readme-contributing-links.md)"
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #27001 comment 6458056219 · 2026-10-28T01:19Z · ready + auto-merge armed (REWORK 6457694530 closed: the changeset moved to the root .changeset/).


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed (partial): slice 1, the docs fold, via PR #27001, merged as 4daad78fb3 · 2026-10-28T01:57Z
    Release: session_01QSeKYmTYfaPbLQD4BJfomW (domain:devx#2) · partial landing, so the card goes back to pm:queue with no assignee · landed: ui/README.md, ui/ROADMAP.md, ui/CONTRIBUTING.md and ui/QUICK_REFERENCE.md folded into the root documents and deleted; ui/CHANGELOG.md frozen with a header; every reader repointed · remaining: (1) the ui/.claude/hooks/* deletion (8 files on main, governed; whose lane it is waits on decision card #26997); (2) the ui/docs/adr index prefix, riding #26076; (3) ui/lychee.toml and ui/turbo.objectui.json, which the ruling deletes only once nothing reads them

    The merged diff matches the reviewed head 81b8d0a919 (sorted +/− lines hash-identical; 71 files, +839/−1623). ACCEPT → PR #27001 comment 6458056219. The first queue run went red on a load timeout in check-i18n-dead-keys.test.ts (triage 6458415242); the one re-queue landed it, so it reads as a flake.

    On (3): both files have live readers on main (ui/scripts/workspace-root.mjs plus helpers/turbo-inputs.ts / workspace-root.test.ts read ui/turbo.objectui.json; check-links-workflow.test.ts reads ui/lychee.toml). The ruling's delete condition does not hold, so these stay until a card retargets those readers (for example to the root turbo.json). That retargeting is a new piece of work, not a delete. ui/.github/dependabot.yml is already gone from main.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 7 · slice 2 · 2026-10-28T13:13Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW (the dispatching seat; the dispatch note under this claim names the cloud session)
    Account: os-justin (the seat's linked user, as GET /user answers it; the card's assignee)
    Branch: claude/issue-26080-parked-configs
    Worktree: the cloud session's own container
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: remaining item (3) of the slice-1 landing 6458593211, and item (2) checked. MEASURE FIRST whether ui/turbo.objectui.json and ui/lychee.toml are read by any real run on main: a turbo invocation, check-links.yml (root, --config lychee.toml = the ROOT file) or any workflow. If a file is dead config, retarget each reader to the live file and delete the dead one. The readers are ui/scripts/workspace-root.mjs (PARKED_TURBO_CONFIG) and its test, ui/scripts/__tests__/helpers/turbo-inputs.ts and the turbo-config tests that use it, and ui/scripts/__tests__/check-links-workflow.test.ts. The live files are the root turbo.json and the root lychee.toml. Each test keeps asserting the same property against the config that actually runs, ⛔ never loosened or dropped. A test whose property has no live counterpart goes into the report, not into a deletion. If either file is LIVE, leave it and report. Item (2): confirm on main whether ui/docs/adr's index prefix is settled by #26076 (PR #26503), and report it, with no edit unless it is a one-line pointer. ⛔ ui/.claude/hooks/* (item 1) is domain:skills per #26997 ruling B, out of scope. ⛔ No .github/workflows/** edit (stop on breach; explain in the report)
    Container & model: M, mode:cloud, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate"), effort: high (p2; tests that may be pinning a dead config)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Ruling-ref: the card's ruling A, as cited in slice 1's claim
    Thread-read: 6458593211
    Premise: holds at origin/main 4d3a077f66. Both files exist. workspace-root.mjs:119 exports PARKED_TURBO_CONFIG = 'turbo.objectui.json'. Nine ui/scripts/__tests__ files read the parked turbo config through turbo-inputs.ts/workspace-root.mjs. check-links-workflow.test.ts:55 reads lychee.toml under the ui root. Root check-links.yml passes --config lychee.toml from the repo root.
    Serial constraints cleared: no open PR touches ui/scripts/workspace-root.mjs, ui/scripts/__tests__/helpers/turbo-inputs.ts, ui/turbo.objectui.json or ui/lychee.toml.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatched under claim 6469923805 · 2026-10-28T13:16Z: cloud session session_01QSeKYm6a7FAA3rBWrMCCij (mode:cloud, TIER_DEFAULT), branch claude/issue-26080-parked-configs. The report comes back here as os-dev-report.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26080,
      "status": "done",
      "branch": "claude/issue-26080-parked-configs",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27281",
      "session": "session_01QSeKYm6a7FAA3rBWrMCCij (cloud session; dispatched by seat session_01QSeKYmTYfaPbLQD4BJfomW, claim 6469923805, which names this branch)",
      "premise_still_valid": true,
      "summary": "Measured on main: no real run reads ui/turbo.objectui.json or ui/lychee.toml. Every turbo invocation (workflows, root package.json scripts, turbo's own resolution) reads the root turbo.json plus ui/apps/console/turbo.json; no --root-turbo-json is passed; ui/package.json has no turbo script; ui/.github is gone. check-links.yml passes the root lychee.toml. So both files are dead config. Retargeted to the live config, with no assertion dropped (338/338 before and after): turbo-type-check-inputs (via a new liveTurboConfig() in helpers/turbo-inputs.ts, which is uiScopedTurboConfig), the package-lint describe of turbo-lint-inputs, and check-links-workflow's no-remap pin (now on the root lychee.toml). Neither dead file is deleted. A probe that substitutes the live config for the parked one turns 147 assertions red in 8 files, and their properties have no live counterpart. So those guards stay on the parked copy unchanged, per the never-loosen rule; see open_questions. Item (2): settled on main. PR #26503 merged as 79cd9ef8 (merge-base --is-ancestor exit 0), and docs/adr/README.md:215 indexes ui/docs/adr under the ui- prefix. No edit made.",
      "tests": "Head 6bee0fba (after the origin/main merge): pnpm --dir ui exec vitest run --maxWorkers=2 scripts/ under os-verify-lock gave 'Test Files 174 passed | 2 skipped (176) / Tests 5003 passed | 2 skipped (5005)', 'VERDICT command-exit 0'. The 11 reader files (check-dist-completeness, e2e-type-check, select-type-check-scope, turbo-build-outputs-cover-published-entries, turbo-lint-inputs, turbo-task-guard-coverage, workspace-root, turbo-build-inputs, turbo-test-inputs, turbo-type-check-inputs, check-links-workflow): baseline 11 passed / 338, after the change 11 passed / 338. pnpm --dir ui run type-check:scripts exit 0. A first full run had 16 red files from unbuilt @objectstack/spec and @objectstack/formula dist; I built the ui_consumers set (spec, client, core, formula, lint, sdui-parser, types; VERDICT command-exit 0) and the 16 went green. Teeth: (1) node scripts/ablation-replace.mjs --file turbo.json --anchor the ui/tsconfig.json type-check input --delete (anchor 1 to 0, blob 6d3dece1ae49 to 5b5820c9f5f8) turned turbo-type-check-inputs 38 failed; restored, hash equal to the HEAD blob, git status clean. (2) appending a remap line to the root lychee.toml (grep -c remap 0 to 1) made 'carries no remap pretending to resolve fumadocs routes' fail; restored by hash. A first type-check mutation (removing ui/scripts/markdown-fence-scan.mjs) was a no-op for the guard, because that entry is in INPUTS_NOT_DERIVABLE; I re-ran with a derived entry. No ablation of runtime behaviour: tests and config readers only.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on 6bee0fba derived 18 families. Each was run with its exit captured before any pipe, and all 18 exit 0: check-closing-keyword-parity (scan and --self-test), check-comment-mask-corpus, ui vitest scripts/, check:cross-package-test-inputs, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher. --ran reconciliation: '18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)'. The PR's CI check-runs have not been read yet (in_progress at report time).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 relay writes plus git push. (1) pr_create via fleet-write dispatch: POST /repos/objectstack-ai/objectstack/dispatches, run 40704995766, which opened PR #27281 as a draft with assignees [os-justin] and labels [skip-changeset]; read-back: body 13707 bytes identical, labels [skip-changeset], assignee os-justin. (2) this report comment: POST /repos/objectstack-ai/objectstack/issues/26080/comments via scripts/pm/post-stamped.mjs.",
      "open_questions": [
        {
          "question": "The live root turbo.json build and test tasks hash none of the ui tree's root files that the parked copy declares (ui/tsconfig.json, ui/scripts/vite-*.ts, build-plugin-stylesheet.mjs, check-dist-completeness.mjs, invoked-as.mjs, vitest-invocation-guard.mjs; the vitest config and setup set for test). turbo run build --filter=@object-ui/components --dry=json lists only scripts/check-dts-emitted.mjs, scripts/invoked-as.mjs and scripts/tsup-drop-sources-content.mjs as root-anchored inputs, while ui/packages/components/vite.config.ts:14-15 imports ui/scripts/vite-dts-*.ts. The guards that would catch it (turbo-build-inputs 38, turbo-test-inputs 41, check-dist-completeness 1) stay green only because they read the dead copy. Should the root config carry these entries?",
          "options": [
            "A: port the ui entries into the root build/test inputs. This edits every @objectstack/* package's cache key too. Then retarget those guards and delete ui/turbo.objectui.json",
            "B: package-level turbo.json files in the ui packages, extending the root, carrying the ui inputs",
            "C: keep the status quo, and the parked file with it"
          ],
          "recommendation": "A, on its own card, because it closes a stale-build replay path and is the only route that makes the parked file deletable. It is a behaviour change to the real cache keys, outside this slice's file surface."
        },
        {
          "question": "Properties with no live counterpart by construction: //#lint:root and //#type-check:e2e are root tasks of objectui's own manifest. In the root config, // is the objectstack package, and CI runs them as plain steps (pnpm --dir ui run type-check:e2e). Their guards (turbo-lint-inputs //#lint:root describe 5, e2e-type-check wiring 4, select-type-check-scope 2, and part of turbo-task-guard-coverage's 55) can only read the parked copy. What happens to them?",
          "options": [
            "A: rewrite each against the CI step that runs the task",
            "B: retire each one that has a named duplicate at an equal or closer layer, per the test-deletion rule",
            "C: leave them on the parked copy"
          ],
          "recommendation": "A where a step exists, then B for the residue. Until then the parked file stays."
        },
        {
          "question": "check-links-workflow's root_dir sentinel pin (site-absolute routes skipped into a non-existent namespace) has no root counterpart: the root lane RESOLVES site routes with --root-dir plus --fallback-extensions. Keep the pin on the dead ui/lychee.toml, retire it, or restate it against the root workflow's argv?",
          "options": [
            "A: restate it against check-links.yml's LYCHEE_ARGS (--root-dir is present and points at content)",
            "B: retire it with ui/lychee.toml, naming check-links.yml as the owner",
            "C: keep it"
          ],
          "recommendation": "A, because it pins the live mechanism by path, after which ui/lychee.toml becomes deletable. A test read of the workflow is not a workflow edit."
        }
      ],
      "out_of_scope_findings": [
        "class: a · reach: named producer: root pnpm build (turbo run build over @object-ui/* packages) hashes no ui/scripts/vite-*.ts or ui/tsconfig.json, measured by turbo --dry=json on @object-ui/components#build · evidence: the probe (turbo-build-inputs 38 red against uiScopedTurboConfig) and the dry-run input list · dedupe words: turbo build inputs ui scripts, stale cache object-ui build, TURBO_ROOT ui vite · carrier: open question 1 on this card",
        "noted, not filed: select-type-check-scope.test.ts drives the selector with the parked config, while the production selector (select-type-check-scope.mjs:324) reads uiScopedTurboConfig. The test and production disagree on e2e widening (2 cases red against live). In PR Acceptance notes · carrier: open question 2",
        "noted, not filed: ui/apps/console/turbo.json restates the parked build.outputs rather than the root's (it lacks json-schema/** and !.next/cache/**). Console emits neither path · carrier: none"
      ],
      "deviations": "Worked in place on the harness-pinned outcome branch in the cloud container, not in a separate worktree: the branch was already checked out there, and the container is this session's alone. The first commit carried a model-named co-author trailer; the push hook refused it, and I amended the unpublished commit to the model-free pair before the first push. pnpm install needed one retry: better-sqlite3's node-gyp header download aborted mid-TLS, and the second install exited 0. The PR body's 维护者速读 is six lines in Chinese, as required.",
      "files_changed": "4 files, +43 / -17 vs origin/main at 6bee0fba: ui/scripts/__tests__/helpers/turbo-inputs.ts, turbo-type-check-inputs.test.ts, turbo-lint-inputs.test.ts, check-links-workflow.test.ts"
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYm6a7FAA3rBWrMCCij

    os-dev-report

    {
      "issue": 26080,
      "status": "done",
      "branch": "claude/issue-26080-parked-configs",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27281",
      "session": "session_01QSeKYm6a7FAA3rBWrMCCij (cloud session; dispatched by seat session_01QSeKYmTYfaPbLQD4BJfomW, claim 6469923805)",
      "premise_still_valid": true,
      "summary": "Addendum to report 6471544589, patch round on the seat's OQ3 answer (A). The check-links-workflow site-route pin now reads the lychee argv the live lane runs: `.github/workflows/check-links.yml` `env.LYCHEE_ARGS`, a test READ with no workflow edit. It asserts `--config lychee.toml`, an absolute `--root-dir` anchored on the workspace whose tree holds `docs/`, and `--fallback-extensions` carrying mdx and md. That is the same both-halves-or-neither property the root_dir-sentinel pin held, restated for the mechanism that runs. Its last reader retargeted, `ui/lychee.toml` is deleted. git grep finds no other reader, only prose naming the lychee tool in `ui/scripts/check-doc-links.mjs` and its test. `ui/turbo.objectui.json` and its 147 parked-copy assertions are untouched, per the seat's OQ1/OQ2 answer. Merged origin/main (0d45c0e7) with no rebase and no force-push. Head 88bd2bb7.",
      "tests": "Head 88bd2bb7: `pnpm --dir ui exec vitest run --maxWorkers=2 scripts/` under os-verify-lock gave 'Test Files 174 passed | 2 skipped (176) / Tests 5003 passed | 2 skipped (5005)', 'VERDICT command-exit 0'. check-links-workflow.test.ts 4/4. Teeth, via `node scripts/ablation-replace.mjs` on the on-disk `.github/workflows/check-links.yml` (local mutation only, never committed; blob fd75bd9ccaee restored both times, verified by hash, git status clean): leg 1, deleting the `--root-dir ${{ github.workspace }}/content` line (anchor 1 to 0), turned the pin red with 'check-links.yml must pass --root-dir, or site-absolute links are hard errors'; leg 2, deleting `--fallback-extensions mdx,md`, turned it red with '--root-dir alone leaves every extension-less route unresolved'. A first green run of the new pin was red: a whitespace split broke the `${{ github.workspace }}` expression into three tokens. Fixed in 88bd2bb7 by collapsing each expression to one token before splitting; both legs re-run after the fix.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack on 88bd2bb7 (5 paths vs merge base 0d45c0e71) derived the same 18 families. All 18 exit 0, each captured before any pipe: check-closing-keyword-parity (scan and --self-test), check-comment-mask-corpus, ui vitest scripts/, check:cross-package-test-inputs, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher. --ran: '18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)'. PR check-runs on 88bd2bb7: not read (in_progress).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "1 this round: this addendum comment, POST /repos/objectstack-ai/objectstack/issues/26080/comments via scripts/pm/post-stamped.mjs (relay); a first attempt was refused locally with zero writes (missing signature line). Plus git push (6bee0fba..e98b58a6 merge, ..9a1075c3, ..88bd2bb7). The PR body was not patched.",
      "pr_body_changes_for_the_seat": [
        "Title: replace '...; both parked configs stay' with 'test(ui/scripts): the inputs guards and the lychee pins read the configs that run; ui/lychee.toml is deleted, ui/turbo.objectui.json stays'",
        "维护者速读 改了什么: append '另把 lychee 的站内路由守卫改为读 check-links.yml 的 lychee 参数(只读不改 workflow),`ui/lychee.toml` 已无读者,删除。'",
        "维护者速读 风险与回滚: replace '两份死文件这次**不删**' with '`ui/lychee.toml` 已删;`ui/turbo.objectui.json` 这次**不删**', and '4 个测试文件' with '4 个测试文件与 1 份死配置'",
        "维护者速读 需要你做的: replace with '无,席位落地(根 turbo.json 的 ui 输入缺口由席位另立卡)。'",
        "What changes table: the row 'check-links-workflow.test.ts, root_dir sentinel | no ... | unchanged, ui copy' becomes 'check-links-workflow.test.ts, site-route pin | yes: restated against check-links.yml LYCHEE_ARGS (--config lychee.toml, absolute --root-dir over the docs tree, --fallback-extensions mdx,md) | reads the workflow argv', plus a new sentence: '`ui/lychee.toml` has no reader left and is deleted.'",
        "What changes: 'Neither dead file is deleted.' becomes '`ui/turbo.objectui.json` is not deleted.'",
        "Tests, teeth: add '(3) deleting --root-dir, then --fallback-extensions, from the on-disk check-links.yml (ablation-replace, blob fd75bd9ccaee restored by hash, never committed) turns the site-route pin red with its own message each time.' Update the head and suite line to 88bd2bb7: 174 passed | 2 skipped (176), 5003 passed | 2 skipped.",
        "Acceptance notes item 3: replace with 'Resolved in this PR (seat answer A): the pin is restated against the live argv and `ui/lychee.toml` is deleted.' Items 1-2: append 'Seat: a separate card carries the root turbo.json ui-input gap, with these guards riding it.'",
        "Reading 4: head 6bee0fba becomes 88bd2bb7. Same 18 commands, all exit 0, same --ran line."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "unchanged from report 6471544589; the seat carries open questions 1-2 on its own card"
      ],
      "deviations": "The seat's patch instructions arrived as a cross-session message from the dispatching seat session (data from a peer). I acted on them because they answer this report's own OQ3 within the claim's file surface. No workflow file was committed: the teeth mutated the working copy only, and it was restored by hash. post-stamped now requires a signature first line (landed on main in #27263 during this round), so this comment opens with it, and the os-dev-report marker is the second line.",
      "files_changed": "vs origin/main at 88bd2bb7: 5 files, +99 / -148: ui/lychee.toml deleted; ui/scripts/__tests__/check-links-workflow.test.ts, helpers/turbo-inputs.ts, turbo-type-check-inputs.test.ts, turbo-lint-inputs.test.ts"
    }

    Generated by Claude Code

  12. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    ACCEPT → PR #27281 comment 6472392906 · 2026-10-28T14:57Z · ready + auto-merge armed (slice 2). Dev OQ3 → A, done in the PR (ui/lychee.toml deleted). OQ1/OQ2 → #27283 (root turbo.json ui-input gap; deletes ui/turbo.objectui.json). Item (1) → #27260 (domain:skills).


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Landed (partial): slice 2, via PR #27281, merged as 0e205feaff through the merge queue · 2026-10-28T15:42Z

    Release: session_01QSeKYmTYfaPbLQD4BJfomW (domain:devx#2) · partial landing, and the seat stands down on the maintainer's word 「当前任务处理完,合并后就下班」 · next: the card moves to pm:blocked on its two carriers, with no assignee.

    Merged = reviewed. The merged diff matches the reviewed head 88bd2bb7e1: the sorted +/− lines are hash-identical, 5 files, +99/−148. ACCEPT → PR #27281 comment 6472392906. Cloud session session_01QSeKYm6a7FAA3rBWrMCCij is archived in this act.

    Landed: ui/lychee.toml is deleted, since no run read it. The type-check inputs guard, the package-lint inputs guard and both lychee pins now read the configs that run: the root turbo.json (ui scope), the root lychee.toml, and check-links.yml's LYCHEE_ARGS. Item (2), the ui/docs/adr index prefix, was checked and is settled on main by PR #26503. No edit was needed.

    Still open, each with its own card:

    Blocked-by: #27260
    Blocked-by: #27283


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:devxpm:blockedpriority:p2Medium: important, M3tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions