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 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · tooling · priority:p2 · domain:devx · area:devpath · needs-user-decision · pm:awaiting-maintainer · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T12:05Z

    ⛔ Not a claim, ⛔ not a dispatch. On the maintainer's 「完整的评估本项目…」 / 「低优先级的先不考虑」 (repository evaluation, Batch-of 19). Low priorities were excluded at filing, so the execution cards grade p2.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from the README / brand evaluation the maintainer asked for on 2026-10-26 (「评估 objectstack readme该如何改进」, 「objectui 是否建议去掉」, then 「同意,派卡处理」) · written 2026-10-26T13:07Z · session_01FMuBZmssbfQkVrKRtxNvng. ⛔ Not a claim, not a ruling.

    Item ① ui/README.md is more than a nested duplicate of a top-level doc: it is still Object UI's product README, so it carries a second brand inside this repository. Read at main 679fc7c:

    • Title line "The Universal Schema-Driven UI Engine"; a license-MIT badge and a CI badge that points at the archived repository's workflow (objectstack-ai/objectui/workflows/CI), which will never run again.
    • A Documentation | Quick Start | Examples | Changelog | Roadmap nav pointing at ui/ROADMAP.md / ui/CHANGELOG.md (the same files this card lists).
    • A three-product narrative — Describe → ObjectStack / Render → Object UI / Operate → ObjectOS — that the organisation profile and the root README no longer use (two brands, not three).
    • 5 links back to github.com/objectstack-ai/objectui (archived; grep -c 'github.com/objectstack-ai/objectui' ui/README.md → 5).

    Whatever letter is ruled, the UI text that survives should read as a workspace README rather than a product one: first sentence along the lines of "ui/ is the view layer of ObjectStack: a schema-driven React renderer, usable on its own through @object-ui/*"; keep the Quick Start table, the package table and the screenshots; drop the badge row and the three-product block; links go to ui/… paths, not to the archived repo. @object-ui/* package names and the objectui.org docs site (ui/apps/site) stay — they name a package and a site, not a brand.

    This supports A for item ①. The root README itself is a separate maintainer-directed card (slimming + three stale lines), filed today by this session; the organisation profile and pinned repositories are the maintainer's own action.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Brief-claimed-by: session_01KrKXQVvgYk2AJ4VkqMobyb · batch #398 · 2026-10-26T13:30Z

    Director seat, summon #51 continuation (ledger objectstack#12708). Presented to the maintainer in batch #398 (the docs family of the 2026-10-26 repository review) as item 4 of 5. Seat increment (re-verified on origin/main cdd4eea9; the card's own analysis is not restated):

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #398 item 4 · letter A · maintainer 「其他同意」 2026-10-26T13:42Z

    Recorded by the director seat (summon #51 continuation, session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708). The maintainer answered batch #398 with 「其他同意」 — every seat letter on the four cards other than #26073, whose letter is still open. Brief 6417246253. Letter A: fold the six ui/ top-level documents into their root equivalents (README, ROADMAP, CONTRIBUTING, QUICK_REFERENCE; ui/CHANGELOG.md kept as frozen history or moved under releases; ui/LICENSE and ui/LICENSE-THIRD-PARTY.md stay — the ui packages are MIT); delete ui/.claude/hooks/* (never loaded; the root hooks guard every repository path per their headers); register ui/docs/adr/ in the root index under a ui- prefix without renaming files (Prime Directive 13), riding #26076's index PR; delete ui/.github/dependabot.yml (GitHub reads only the root file), ui/lychee.toml and ui/turbo.objectui.json after scripts/ui-import/README.md, their only reader on origin/main, is updated. Not B (two CONTRIBUTINGs and two ROADMAPs would remain) and not C.

    Serialization: after #25712's PR 2 lands (it owns ui/AGENTS.md and the nested workflows); the dispatching seat re-reads #25712's PR file lists first.

    Workload of the chosen letter (card column): devx + skills · 3 PRs — docs fold (devx), ui/.claude/hooks deletion (the tier the GOVERNED_SURFACES row for ui/.claude/** carries; the landing seat reads the register, not this ruling), dependabot/config deletion (not .github/workflows/**, so not governed) with the ADR prefix on #26076's PR.

    Execution: needs-user-decision → pm:queue in this act (domain:devx, p2); pm:awaiting-maintainer removed in the same stroke. Ruling-ref: names this comment; Clause-②: no, Metadata-protocol: none.

  5. 22 remaining items

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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