Repository navigation
Description
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Filing-gate category: ② maintainer-directed task. Maintainer, verbatim (Claude Code session, 2026-11-06), answering the seat's proposals (the card code field and the demo + code namespace; gallery apps prefix every item name, not only objects): 「同意,裸名的问题立决策卡」. Epic: objectstack-ai/cloud#3600.
Blocked-by: #30770
(Serial: both edit docs/qa/scenarios/crm_account_with_contacts.json.)
Problem
The runner (#30746, merged) reads cards namespace-relative against whatever namespace the scaffold declares, so a scored build's names differ between runs and machines, and nothing stops a build from shipping bare non-object names that collide when two gallery apps share an environment. The gallery needs stable, readable, collision-free names.
Ask
- Card field
code: 2–8 lowercase letters, no underscore, unique across all cards. The loader refuses a missing, malformed or duplicate code. Add it to every card underdocs/qa/scenarios/, including cards the devx mid-tier lane lands meanwhile (Scenario library: mid-tier card — 订单到收款 order-to-cash (8–10 问数 + 4–6 write operations, row-scoped personas) #30477, Scenario library: mid-tier card — 请假与假期余额 leave & balances (8–10 问数 + 4–6 write operations, row-scoped personas) #30479, Scenario library: mid-tier card — 资产全生命周期 asset lifecycle (8–10 问数 + 4–6 write operations, row-scoped personas) #30481: coordinate withdomain:devx#1throughNotify: serial). - Namespace
demo+code(e.g.democrm): the runner scaffolds every project with it, in scratch and template modes, and the gallery exporter (Scenario library T8: export verified scenario apps to a new gallery repository — source, run record, auto screenshots and the 8–10 问数 transcripts, rebuilt per release #30349) uses the same namespace. - Every item name carries the namespace prefix, not only objects: the build prompt states the rule, and the scorer reports a bare non-object item name as a Build finding (named per item), so a gallery candidate with one fails the Build half.
- Keep the namespace-relative reading (ruling A on Scenario library T3/T4: local Claude Code runner — Build, Run (问数 + operations per persona over the app's MCP), Iterate — writing run records, zero cloud-billed tokens #30292) for card object names; it now always resolves against
demo<code>.
Out of scope: install-time re-namespacing (framework card filed with this one) and the platform-wide bare-name question (decision card).
Reader: the epic PM of objectstack-ai/cloud#3600 dispatches it after #30770 lands.
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 6, 2026
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Handed to the
domain:devxlane. Maintainer, verbatim (Claude Code session, 2026-11-06): 「能交给车队开发的你不要自己开发」.pm:epicis removed so the lane seat claims it from the queue; the epic PM no longer dispatches it. State stayspm:blockedonBlocked-by: #30770; when that card closes, it moves topm:queue(the epic PM sendsNotify: unblocked). The epic PM still answers rulings and cross-repo questions on objectstack-ai/cloud#3600.objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p1 kept ·
domain:devx·pm:blocked· 2026-11-06T04:58Z⛔ Not a claim.
demo<code>namespace. A scenario-library card, p1 as filed.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Blocked-by: #30770closed (PR #30801 merged as974209d6).pm:blocked→pm:queuefor thedomain:devxlane.objectstack-fleet commentedon Nov 6, 2026
domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw
Claim: PM loop round 6
Session:
session_016WV4cymvo9YoyLwKCXXBNwAccount:
os-elon-muskBranch:
claude/project-thread-qy6pqp(the card thread's platform-assigned branch; a measured platform exception toclaude/issue-<n>-<slug>) · card thread sessionsession_016WV4cyKDwJet4nwPKBn5KPWorktree:
objectstack-issue-30795Domain:
domain:devxSeat:
domain:devx#1File surface:
packages/qa/scenarios/src/schema.tsandsrc/loader.ts(thecodefield and its refusals),src/runner/namespace.ts/project.ts/prompts.ts(thedemo<code>namespace and the build prompt's prefix rule),src/score/**(a bare non-object item name as a Build finding), their tests, and thecodeline in every card underdocs/qa/scenarios/.Container & model:
M,mode:thread,model: default tier,effort: xhigh(p1)Clause-②: no — a devx instrument (
@objectstack/scenariosis private, "not a protocol"); no platform door changes.Metadata-protocol: none
Responsibility: n/a — maintainer-directed task (「同意,裸名的问题立决策卡」), handed to this lane by the epic PM (comment 6676503726).
Thread-read: 6677572495
Premise: holds —
Blocked-by: #30770closed (PR #30801 merged as974209d6); the runner (#30746, merged) still reads cards namespace-relative against the scaffold's own namespace.Serial constraints cleared: no open PR touches
packages/qa/scenarios/**ordocs/qa/scenarios/**(checked 2026-11-06T05:19Z). #30802 (claimed by devx seat 3, claim 6677601301) edits the loader and three cards: this card lands AFTER #30802 and merges main before its PR. The mid-tier cards #30477 / #30479 / #30481 named in the body have all landed, so there is noNotify: serialto send.objectstack-fleet commentedon Nov 6, 2026
domain:devx#1 · os-elon-musk · session_016WV4cyKDwJet4nwPKBn5KP
os-dev-report
Draft PR #30837 at f8d3de9. Every card carries an app code; each scenario app is built in the demo+code namespace; a bare non-object item name is one failing Build check.
asset_lifecycleassetdemoassetcrm_account_with_contactscrmdemocrminvoice_with_line_itemsinvoicedemoinvoiceleave_balancesleavedemoleaveorder_to_cashorderdemoorderproject_with_tasksprojectdemoprojectrequisition_to_receiptpurchasedemopurchaseservice_deskhelpdeskdemohelpdesktravel_expensetraveldemotravel{ "issue": 30795, "status": "pr_open_draft", "pr": 30837, "head": "f8d3de9a357b80cfa15aae603c6c764fefd3f0db", "base": "c17719dd", "codes": [ { "card": "asset_lifecycle", "code": "asset", "namespace": "demoasset" }, { "card": "crm_account_with_contacts", "code": "crm", "namespace": "democrm" }, { "card": "invoice_with_line_items", "code": "invoice", "namespace": "demoinvoice" }, { "card": "leave_balances", "code": "leave", "namespace": "demoleave" }, { "card": "order_to_cash", "code": "order", "namespace": "demoorder" }, { "card": "project_with_tasks", "code": "project", "namespace": "demoproject" }, { "card": "requisition_to_receipt", "code": "purchase", "namespace": "demopurchase" }, { "card": "service_desk", "code": "helpdesk", "namespace": "demohelpdesk" }, { "card": "travel_expense", "code": "travel", "namespace": "demotravel" } ], "tests": { "command": "pnpm --filter @objectstack/scenarios typecheck && pnpm --filter @objectstack/scenarios test", "exit": 0, "test_files": "18/18", "tests": "238/238", "at": "f8d3de9a" }, "gates": { "derive": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack", "derived": 52, "ran": 52, "not_measured": 0, "ran_check_exit": 0, "note": "pnpm check:dual-build-cjs-loads exited 3 on the first pass (prerequisite: built output); after turbo run build --filter='@objectstack/dogfood^...' --filter='@objectstack/runtime^...' it exited 0", "results": [ { "command": "node scripts/check-adr-links.mjs", "exit": 0 }, { "command": "node scripts/check-adr-links.mjs --self-test", "exit": 0 }, { "command": "node scripts/check-closing-keyword-parity.mjs", "exit": 0 }, { "command": "node scripts/check-closing-keyword-parity.mjs --self-test", "exit": 0 }, { "command": "node scripts/check-comment-mask-adoption.mjs", "exit": 0 }, { "command": "node scripts/check-comment-mask-adoption.mjs --self-test", "exit": 0 }, { "command": "node scripts/check-comment-mask-corpus.mjs", "exit": 0 }, { "command": "node scripts/check-dts-emitted.mjs --self-test", "exit": 0 }, { "command": "node scripts/check-issue-citations.mjs", "exit": 0 }, { "command": "node scripts/check-plugin-teardown-shape.mjs", "exit": 0 }, { "command": "node scripts/check-plugin-teardown-shape.mjs --self-test", "exit": 0 }, { "command": "node scripts/ci/assert-turbo-remote-cache.mjs --self-test", "exit": 0 }, { "command": "node scripts/ci/plan-test-core-shards.mjs --self-test", "exit": 0 }, { "command": "node scripts/ci/prune-turbo-cache.mjs --self-test", "exit": 0 }, { "command": "node scripts/docs-audit/check-affected-docs.mjs", "exit": 0 }, { "command": "node scripts/docs-audit/check-drift-comment.mjs", "exit": 0 }, { "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "exit": 0 }, { "command": "pnpm --filter @objectstack/spec run check:duration-unit-keys", "exit": 0 }, { "command": "pnpm check:ci-filter-parity", "exit": 0 }, { "command": "pnpm check:closed-ceremony-text", "exit": 0 }, { "command": "pnpm check:cross-package-test-inputs", "exit": 0 }, { "command": "pnpm check:dispatcher-error-vocabulary", "exit": 0 }, { "command": "pnpm check:doc-authoring", "exit": 0 }, { "command": "pnpm check:driver-memory-census", "exit": 0 }, { "command": "pnpm check:dts-closure", "exit": 0 }, { "command": "pnpm check:dual-build-cjs-loads", "exit": 0 }, { "command": "pnpm check:engine-double-contract", "exit": 0 }, { "command": "pnpm check:gitlink-declared", "exit": 0 }, { "command": "pnpm check:issue-citations", "exit": 0 }, { "command": "pnpm check:keyed-text-bounds", "exit": 0 }, { "command": "pnpm check:lean-entry-closure", "exit": 0 }, { "command": "pnpm check:logger-receiver-detach", "exit": 0 }, { "command": "pnpm check:nul-bytes", "exit": 0 }, { "command": "pnpm check:objectql-double-limit", "exit": 0 }, { "command": "pnpm check:org-identifier", "exit": 0 }, { "command": "pnpm check:page-declaration-shape", "exit": 0 }, { "command": "pnpm check:platform-object-tenancy-census", "exit": 0 }, { "command": "pnpm check:published-files", "exit": 0 }, { "command": "pnpm check:query-options-erasure", "exit": 0 }, { "command": "pnpm check:refd-timer-probe", "exit": 0 }, { "command": "pnpm check:registry-log-declared", "exit": 0 }, { "command": "pnpm check:rest-log-spy-declared", "exit": 0 }, { "command": "pnpm check:slot-lookup", "exit": 0 }, { "command": "pnpm check:sourcemap-no-sources-content", "exit": 0 }, { "command": "pnpm check:system-context-census", "exit": 0 }, { "command": "pnpm check:test-source-alias", "exit": 0 }, { "command": "pnpm check:tier-file-adoption", "exit": 0 }, { "command": "pnpm check:type-check-coverage", "exit": 0 }, { "command": "pnpm check:type-check-debt", "exit": 0 }, { "command": "pnpm check:undeclared-dep-imports", "exit": 0 }, { "command": "pnpm check:watch-hint-literal", "exit": 0 }, { "command": "pnpm check:where-matcher", "exit": 0 } ] }, "line_budget": { "order_budget": "none set (the card touches no skills/**)", "changed_lines": 641, "added": 518, "deleted": 123, "files": 26, "size_threshold": 3000 }, "deviations": [ "Template-mode host is host+code (hostcrm), not demo+code. Measured on create-objectstack@18.3.0 with objectstack dev --fresh: installing a democrm package unmanaged into a host scaffolded as democrm answers 409 RESOURCE_CONFLICT (namespace already owned; import verb step 6, packages/metadata-protocol/src/protocol-package-commits.ts); into a host scaffolded as hostcrm it answers 200, targetPackageId com.example.democrm-copy, namespace democrm. The scored app is demo+code in both modes. Accepted by the seat 06:04Z.", "Template-mode scoring subtracts the items the environment served before the install (withoutItems). A blank env serves unprefixed platform items (app setup, dashboard system_overview, permission sets such as admin_full_access, positions, datasource default), which would otherwise be bare-name findings.", "Namespace-relative reading extended beyond objects to the other names a card states: expected dashboards, nav targets, agent action names, and persona permission sets (democrm_sdr, was sdr). Leaving them bare would contradict the prefix rule.", "The order said 10 cards; docs/qa/scenarios holds 9 cards on c17719dd (the 10 counted README.md).", "The PR is opened as a draft before #30802 merges, by the seat's 06:04Z call. After #30802 merges this branch merges origin/main, re-runs the package suite and gates, and the seat gets the new head." ], "files_changed": [ { "path": "docs/qa/scenarios/README.md", "added": 7, "deleted": 5 }, { "path": "docs/qa/scenarios/asset_lifecycle.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/crm_account_with_contacts.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/invoice_with_line_items.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/leave_balances.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/order_to_cash.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/project_with_tasks.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/requisition_to_receipt.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/service_desk.json", "added": 1, "deleted": 0 }, { "path": "docs/qa/scenarios/travel_expense.json", "added": 1, "deleted": 0 }, { "path": "packages/qa/scenarios/README.md", "added": 8, "deleted": 4 }, { "path": "packages/qa/scenarios/src/loader.ts", "added": 37, "deleted": 7 }, { "path": "packages/qa/scenarios/src/runner/app.ts", "added": 5, "deleted": 5 }, { "path": "packages/qa/scenarios/src/runner/cli.ts", "added": 5, "deleted": 1 }, { "path": "packages/qa/scenarios/src/runner/namespace.ts", "added": 41, "deleted": 14 }, { "path": "packages/qa/scenarios/src/runner/orchestrate.ts", "added": 55, "deleted": 17 }, { "path": "packages/qa/scenarios/src/runner/prompts.ts", "added": 34, "deleted": 13 }, { "path": "packages/qa/scenarios/src/runner/scorecard.ts", "added": 11, "deleted": 5 }, { "path": "packages/qa/scenarios/src/schema.ts", "added": 26, "deleted": 0 }, { "path": "packages/qa/scenarios/src/score/index.ts", "added": 8, "deleted": 2 }, { "path": "packages/qa/scenarios/src/score/scenario-naming.ts", "added": 40, "deleted": 0 }, { "path": "packages/qa/scenarios/src/score/scenario-tags.ts", "added": 12, "deleted": 4 }, { "path": "packages/qa/scenarios/test/refusals.test.ts", "added": 40, "deleted": 0 }, { "path": "packages/qa/scenarios/test/runner/orchestrate.test.ts", "added": 80, "deleted": 27 }, { "path": "packages/qa/scenarios/test/runner/units.test.ts", "added": 56, "deleted": 18 }, { "path": "packages/qa/scenarios/test/score/entry.test.ts", "added": 44, "deleted": 1 } ], "liveness_ledger_check": "packages/spec/liveness/** cites no file of @objectstack/scenarios (grep, 0 hits)", "security_findings": "none", "out_of_scope_findings": [], "open_questions": [] }objectstack-fleet commentedon Nov 6, 2026
domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw
Landed · PR #30837 merged as
c1f311f8e5· 2026-11-06T07:06Z. The card closed throughFixes, and this stroke removespm:dispatched. #30846 (#30802) now merges main: its card edits (invoice, project, travel) carry the newcodeline.