Skip to content

create-objectstack: the scaffolded AGENTS.md "Project Structure" lists src/reports, src/agents, src/i18n and src/handlers, which the config never loads, so metadata an agent puts there is silently ignored and still passes validate #28954

Closed

Description

@objectstack-fleet

domain:devx#1 · os-warren · session_01JQwxbYVchZUzHRyGz9MiQM

立卡门: ① 产品缺陷,具名落点 + 复现(reach: 公开入口 os validate 实测一次错误结果:无效的 report 放在 AGENTS.md 指的目录里,validate 仍然通过)
业务理由: 按官网「Build with Claude Code」走的新手,第一件事是让 coding agent 读 AGENTS.md 再写元数据。AGENTS.md 的目录树告诉 agent 报表放 src/reports/、AI agent 放 src/agents/、翻译放 src/i18n/、钩子放 src/handlers/,但脚手架的 objectstack.config.ts 不读这四个目录。agent 照做后元数据不加载、npm run validate 不检查也不报错,用户在 Console 里找不到东西还以为 AI 写坏了。不修,AI-first 路径的第一份说明书就在把 agent 往死目录里引。
动手的读者: domain:devx 席(create-objectstack),packages/create-objectstack/src/templates/AGENTS.md 的 Project Structure 块(main ff88105 第 62–76 行):改成模板真正接线的目录(objects/views/actions/flows/dashboards/apps/skills/picklists),并说一句「新目录要在 config 里接线」;可加一条 pin,把这个块和 templates/blank/objectstack.config.ts 的 barrel 列表对齐。
查重: is:issue AGENTS.md "Project Structure" 3 命中、is:issue scaffold AGENTS.md directory not wired 40、is:issue create-objectstack AGENTS.md handlers 114(均含已关)。最近邻 #20333(config 只接 objects,已关并修好)、#21018(picklists 接线,已关),都修了 config,没碰 AGENTS.md 的目录树。

QA-source: 18.3.0 wave 4 newcomer first-visit walkthrough (W4-NEWCOMER), path 2 "Build with Claude Code", anchor #27377

What happens

npm create objectstack@latest support-desk (create-objectstack 18.2.0, npm 10.9.9, Node 22.23.4) writes AGENTS.md whose "Project Structure" block reads:

├── src/
│   ├── objects/ … views/ … apps/ … flows/ … actions/ … dashboards/
│   ├── reports/              # Analytics reports
│   ├── agents/               # AI agent definitions
│   ├── i18n/                 # Translation bundles
│   └── handlers/             # Runtime hook handlers

The generated objectstack.config.ts imports exactly eight barrels: objects, views, actions, flows, dashboards, apps, skills, picklists. Its own comment says "A directory that is not wired here is never loaded, and objectstack validate neither counts nor checks what it holds." So four of the ten listed directories are dead, and two that are wired (skills, picklists) are missing from the list.

Reproduction

  1. npm create objectstack@latest support-desk && cd support-desk
  2. mkdir src/reports and write src/reports/ticket.report.ts exporting { name: 'tickets_by_status', type: 'nonsense_type', bogus: true }, plus src/reports/index.ts re-exporting it.
  3. npm run validate

Expected: the report is loaded and refused, or AGENTS.md does not send an agent to src/reports/.
Actual: ✓ Validation passed, counts unchanged (UI: 1 Apps 1 Views 1 Actions); the report is never loaded.

Same text on main ff88105 (packages/create-objectstack/src/templates/AGENTS.md).

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:server · area:devpath · pm:queue · 2026-11-02T05:21Z

    ⛔ Not a claim.

    • Read fresh. The scaffolded AGENTS.md (packages/create-objectstack/src/templates/AGENTS.md, Project Structure) sends an agent to src/reports, src/agents, src/i18n and src/handlers. The template's objectstack.config.ts never loads those directories, so metadata written there is silently ignored, and validate still passes. create-objectstack is domain:server (lanes/server.md), p2.

    Generated by Claude Code

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 2, 2026
  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

    Claim: PM loop round 1 · card thread · 2026-11-02T06:45Z
    Session: session_01R1q2xdtYgU6FKrZ7LgjPCC (the seat); the card thread is session_01FEkQ5nNCtq276yJtjqKq8B (the #28932 card thread, continuing; restarted from main after PR #29005)
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-4yqy8a (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
    Worktree: the card thread's own container checkout
    Domain: domain:server
    Seat: domain:server#1
    Ruling-ref: triage#1 graded the card p2 domain:server (05:21Z; create-objectstack is this lane). Route (the dispatching seat's call): the scaffolded AGENTS.md Project Structure lists exactly the directories the template's config wires, says a new directory must be wired in the config, and a package test pins the list to the config's barrels. Dispatched in the seat-1 split of the server queue under 「队列进了很多任务,抓紧派发」 (Leehom, 2026-11-02T05:15Z).
    File surface: packages/create-objectstack/src/templates/AGENTS.md (Project Structure) and a test in packages/create-objectstack reading it beside the template configs; changesets. ⛔ No packages/spec/**, no change to what the config loads, no new gate.
    Container & model: S, mode:thread, model and effort as the thread was opened
    Clause-②: no (expected: scaffold prose; the dev measures)
    Metadata-protocol: none (expected)
    Responsibility: the code is the scaffolded AGENTS.md of create-objectstack · the platform path is a coding agent told to write reports, agents, i18n and handlers into directories the config never loads, with validate still passing · reached by every newcomer on the "Build with Claude Code" path
    Thread-read: none
    Premise: holds on main ff881050 (the card's walkthrough)
    Serial constraints cleared: seat 2's #28992 (create-objectstack namespace length) edits the same package; merge origin/main once if it lands first.
    Resume-from: none — fresh from origin/main

    State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01FEkQ5nNCtq276yJtjqKq8B

    os-dev-report
    {
    "issue": 28954,
    "status": "done",
    "branch": "claude/project-thread-4yqy8a",
    "pr": "#29091",
    "session": "session_01FEkQ5nNCtq276yJtjqKq8B",
    "premise_still_valid": true,
    "summary": "The Project Structure block of packages/create-objectstack/src/templates/AGENTS.md now lists exactly the eight src/ directories blank/objectstack.config.ts imports (objects, views, actions, flows, dashboards, apps, skills, picklists), drops reports/agents/i18n/handlers, and says a new src/ directory is never loaded or validated until its barrel is imported in the config. New package test src/agents-project-structure.test.ts pins the block to each bundled template's barrel imports, both ways. Measurement: one bundled template (blank), one shared AGENTS.md; blank/README.md already named the eight. What the config loads is unchanged; patch changeset on create-objectstack.",
    "tests": "Head 499412e, base ee7518f. New test: AGENTS.md from base 2 failed / 1 passed (received agents, handlers, i18n, reports; lacked picklists, skills), green 3/3 on head; restore porcelain empty, blob 8f0801f4fac0 = HEAD. Ablation via scripts/ablation-replace.mjs re-adding src/reports/ (anchor 1 to 0, blob 8f0801f4fac0 to fad5dd511c4f, marker counted once): 1 failed / 2 passed (+ reports); tool restored, blob = HEAD, git diff HEAD empty. pnpm --filter create-objectstack test: 20 files, 304 passed. typecheck exit 0 (new file in --listFiles). eslint --no-inline-config packages/create-objectstack exit 0. Scaffold-and-validate run not done (optional).",
    "gates": "dispatch-gates --commands at 499412e: 59. Partial record because Leehom asked the lane to wrap up mid-run (record /mnt/project-files/pm-orders/server/28954-gates-ran.txt): 55 ran, 53 exit 0; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (full build), NOT MEASURED; check:lean-entry-closure exit 3 in the loop, exit 0 after building objectql. NOT MEASURED, run stopped before them: check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher. --ran reconciliation not run for the same reason. CI check-runs on the PR: 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 1 git push: git push of claude/project-thread-4yqy8a; fleet-write pr_create (run 41405035660, PR #29091, no assignees, no labels); this os-dev-report comment via post-stamped",
    "open_questions": [],
    "out_of_scope_findings": [
    "none filed. Whether the starter should also wire reports, agents, translations or hooks is a product choice the order kept out of scope; no carrier"
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC

    Release: server seat 1 shift close · 2026-11-02T07:40Z
    Session: session_01R1q2xdtYgU6FKrZ7LgjPCC (the seat that claimed this card); card thread session_01FEkQ5nNCtq276yJtjqKq8B (paused)
    Who / what / where: Leehom (os-project-manager) in the server-lane project chat — 「进展中的开发先提交代码然后暂停,先确保已有的pr都合并」 (2026-11-02T07:11Z), 「自动合并中的也交给下一任跟进」 (2026-11-02T07:23Z), 「我说的是pm-dispatch 中车道下班的流程,都要走完」 (2026-11-02T07:33Z). Shift close returns every claim to the queue (seat-post-protocol.md 交接收尾清单 step 2); no stay-behind.
    Resume-from: claude/project-thread-4yqy8a@499412ef6f4b08d8eaa8086b6816a371847183ca — PR #29091, ACCEPTed by the seat on this head. ACCEPT 6571397068; enqueued at handoff, auto-merge not armed at release time — re-arm if it left the queue.
    Successor: read the handoff 6571543819 on seat post #6367 first; land PR #29091 on green, write the landing record, close this card. ⛔ Do not re-dispatch the card from scratch.

    State: pm:dispatched → pm:queue, assignee os-project-manager cleared, recorded by this release.


    Generated by Claude Code

  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-steve · session_01ADHkmQjPiXgNoSaEpqeGvY

    Claim: PM loop round 1 · takeover of a released card · 2026-11-02T08:17Z
    Session: session_01ADHkmQjPiXgNoSaEpqeGvY
    Account: os-steve (the card's assignee, set in the same round)
    Branch: claude/project-thread-4yqy8a
    Worktree: the predecessor card thread's (paused); no new dev is dispatched
    Domain: domain:server
    Seat: domain:server#1
    File surface: unchanged from the predecessor's claim 6570928385 (packages/create-objectstack/src/templates/AGENTS.md and its test); the open PR #29091 is the surface.
    Container & model: S, mode:thread, landing only (no new build)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: as in the predecessor's claim (unchanged)
    Thread-read: 6571768260
    Premise: holds (PR #29091 ACCEPTed by the predecessor seat)
    Serial constraints cleared: none new; the seven PRs this seat inherited are its only in-flight surface.
    Resume-from: claude/project-thread-4yqy8a@499412ef6f4b08d8eaa8086b6816a371847183ca

    Takeover record: the predecessor (os-project-manager, session_01R1q2xdtYgU6FKrZ7LgjPCC) released this card in 6571768260 at its shift close (Leehom: 「自动合并中的也交给下一任跟进」). This seat takes it on the maintainer's summons in the Claude Code project "objectstack spec" (「server 1 号座位你也接手开席位」), seat 2 (#20966) having left it to seat 1. Last pushed head: 499412ef6f (PR #29091). In the merge queue since 2026-11-02T07:29Z; follow to MERGED.

  7. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-steve · session_01ADHkmQjPiXgNoSaEpqeGvY

    Landed · 2026-11-02T09:17Z

    Probe Reading
    PR #29091 MERGED 2026-11-02T08:44Z, merge commit 0a46a26cc7, through the merge queue
    #28954 closed completed by Fixes #28954

    pm:dispatched is removed. Seat records: ACCEPT 6571397068 (predecessor); this seat took the card over to land it.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions