Skip to content

Bare-name phase 1: refuse a second package holding a non-object name whose consumers resolve without package context (ruling C on #30798) #30803

Closed

Description

@objectstack-fleet

epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

Filing-gate category: ② execution of a maintainer ruling. Decision #30798 ruled C, maintainer verbatim (Claude Code session, 2026-11-06): 「同意 c」: every package-authored metadata name carries its namespace, phased. Routing, verbatim: 「能交给车队开发的你不要自己开发」.

Phase 1 of 3. Siblings: phase 2 lint and templates, phase 2 authoring skills, phase 3 rule and migration (filed together).

Problem (customer-visible)

When two installed packages ship a non-object item with the same bare name, many runtime consumers serve only one of them, usually silently and in install order. Measured per type in the audit table on #30798: the kernel metadata service, object-less action dispatch, AI tool names, function handlers behind hooks, picklists, mappings, datasets/cubes, email templates, webhooks, declared connectors, and flows (one armed, with a warning).

Ask

  1. Measure first. Boot one environment with two packages sharing one bare name for each type in that table, and record which resolve wrongly. The table is a code reading, not a booted measurement.
  2. Extend the one-name-one-holder registration refusal (the security catalog's rule, packages/objectql/src/security-catalog-namespace.ts; precedent feat(objectql)!: positions, permission sets and capabilities hold one name per deployment — a second holder is refused at registration, naming both #22197 +1080/−103 and feat(objectql)!: a cold boot refuses a package-held position or permission-set name the environment catalog already holds, as a hot install does (ADR-0048 N.3) #22365 +705/−43) to every type the measurement shows resolving without package context. The refusal applies at managed install, at package registration and at cold boot (as [decision] cold boot admits a package whose permission set or position name the environment catalog already holds (package registration runs before sys_metadata hydration), while a hot install of the same package is refused #22307 did), names both holders, and carries the rename in the message.
  3. Keep what already works: same-name actions on different objects (keyed objectName:name), job scheduling under appId:jobName, and the unmanaged import's all-type refusal.
  4. Record the narrowing on ADR-0048 §3.4. This refusal stays after phase 3 only as the backstop for packages without a namespace, the shared base/system/sys namespaces, and third-party packages in the deprecation window.

Out of scope: the types a separate security item covers. The security seat routes those; do not add them here unless that seat says so.

Reader: the domain:engine lane seat, from pm:queue.


Generated by Claude Code

Activity

  1. added
    priority:p1High: required for production / M2
    pm:queueReady for the PM dispatch loop
    domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they land
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · domain:engine → domain:server · p1 kept · 2026-11-06T04:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they land
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4cytQjG9X1CrCgytUM5

    Claim: PM loop round 1 · 2026-11-06T05:21Z · seat 3's pick in the live server split
    Session: session_016WV4cytQjG9X1CrCgytUM5
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-crfe5o
    Worktree: the card thread's own checkout of claude/project-thread-crfe5o
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/objectql/src/ (the one-name-one-holder module security-catalog-namespace.ts, or a sibling generalising it, + the registry / managed-install / cold-boot call sites it already uses, + tests); the per-type registrars the stage-1 measurement implicates, each reported to the seat before it is touched; pin files under packages/qa/dogfood/test/; docs/adr/0048-* §3.4 + its scripts/adr-anchors/ anchor (Tier H); the ledgers Metadata-protocol: narrowed requires (regenerated with repo tooling); root .changeset/ files. ⛔ lint / templates / examples (#30804), skills (#30805), the save door / defineStack (#30806), spec schema, ui, and any type the security seat's item covers (stop on breach; explain in the report)
    Container & model: L, mode:thread, model: default, effort: xhigh
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed (provisional: confirmed or revised by the stage-1 measurement)
    Responsibility: n/a — ADR-0048 §3.4's coexistence predates the programme; this card executes ruling C on #30798 (6676670839), phase 1
    Thread-read: 6677272063
    Premise: holds on the code reading of #30798's audit table; stage 1 measures it on a booted two-package environment before any refusal code, and the seat confirms the type list before stage 2
    Serial constraints cleared: none at claim time. packages/objectql/src/protocol.ts / engine.ts are held by the facade programme (#30020, PR #30716): touched only if unavoidable, after telling the seat

    Staged: measurement first, then the seat's go. Contract review at CONTRACT_REVIEW_TIER owed before the queue (narrowing); docs/adr is Tier H.

  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4d1EuHiCqvh8VEz81QD
    os-dev-report

    {
      "issue": 30803,
      "status": "done",
      "branch": "claude/project-thread-crfe5o",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30836",
      "session": "session_016WV4d1EuHiCqvh8VEz81QD",
      "premise_still_valid": true,
      "summary": "PR 1 of 4 (Refs #30803): a picklist, mapping or dataset name holds one package. New module packages/objectql/src/bare-name-one-holder.ts (covered types, declared names incl. nested plugins, rename = namespace prefix, BARE_NAME_COLD_BOOT_MODE = 'warn'); SchemaRegistry.installPackage and registerItem refuse a second package holder with the ADR-0112 envelope (NAMESPACE_CONFLICT, 422), every conflict in one refusal, naming both holders and the rename; the engine plugin seals the registry at kernel:bootstrapped, and a boot that already holds a clash warns once (or refuses under 'refuse'). The environment catalog is never a holder (ADR-0005 overlay). ADR-0048 §3.4 narrowed + 2026-11-06 addendum (Tier H). One file outside the dispatch's file surface: packages/cli/test/package-install-local-jobs-pull.integration.test.ts — its five fixture packages, installed into one kernel, all declared the mapping orders_pull, so CI Test Core (4/8) went red at 75d1339f; each package now names <namespace>_orders_pull (test-only, d154c622). Open for the maintainer, already routed by the seat (not a new question): whether the cold boot of an existing clash should refuse instead of warn — PR1 ships 'warn' and the flip is one constant (BARE_NAME_COLD_BOOT_MODE).",
      "tests": "pnpm --filter @objectstack/objectql exec vitest run src/registry-bare-name-one-holder.test.ts → 40 passed; @objectstack/objectql full suite → 556 files / 11108 tests passed; pnpm --filter @objectstack/objectql typecheck (incl. test-typecheck ratchet) exit 0. Dogfood pin bare-name-one-holder.dogfood.test.ts → 4 passed. cli fixture fix: package-install-local-jobs-pull.integration.test.ts → 8 passed (was 4/8-shard red in CI); pnpm --filter @objectstack/cli typecheck: tsc --noEmit exit 0, check:test-typecheck OK (3 files / 28 errors / 6 pinned signatures held, unchanged; first attempt OOMed at the 2 GB default heap, rerun with --max-old-space-size=8192). Ablation (src): the plugin's seal call removed → 19 of 40 unit cells red (every door refusal + the cold-boot warning), 21 control cells green; restored. Ablation (dist): dogfood pin against the pre-change objectql dist → 3 of 4 red, the fresh-names CONTROL green; green after rebuilding dist.",
      "gates": "dispatch-gates --commands at d154c622: 82 derived (81 at 75d1339f + pnpm check:cli-test-child-env for the cli test path), all run, every exit 0; --ran reconciliation: '82 derived famil(ies) accounted for — 82 run, 0 NOT-MEASURED'. Two needed a rerun: node scripts/check-plugin-teardown-shape.mjs --self-test exit 3 on the shallow clone (pinned fixture commit 621a4876 unreachable) → fetched that one commit, exit 0; pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (no dist for 7 packages) → built them, exit 0 (116 entry points / 71 packages load). 5 extra families run beyond the derivation (error-code-provenance, changeset-fixed, error-code-casing, facade-delegation-only, published-readme-exports), all exit 0. CI at d154c622 (the PR's check-runs, not re-run locally): 50 check-runs, 37 success, 13 skipped, 0 failure — Test Core (1/8…8/8) success and the Test Core aggregate success (4/8 was red at 75d1339f, the cli fixture above), Build Core success, Type Check · workspace / consumer gates / source gates / debt ledger success, TypeScript Type Check success, Lint & Repo Gates success (ESLint, repo & tooling, docs & code guards, PM dispatch-gates, CI release & engine, scoped ×3); Lint UI / Type Check UI skipped (no ui path).",
      "dogfood_battery": "75d1339f · os-verify-lock: VERDICT command-exit 0 · Test Files 424 passed | 3 skipped (427) · Tests 3537 passed | 41 skipped (3578) · no failures. d154c622 changes only packages/cli/test/package-install-local-jobs-pull.integration.test.ts, which is not in the dogfood battery.",
      "mcp_calls": "5 — mcp__github__issue_read ×4, mcp__github__get_job_logs ×1; no write tool. Other reads were REST GETs through gh api (check-runs, PR, card).",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/pulls (relay pr_create, PR #30836); POST /repos/objectstack-ai/objectstack/issues/30803/comments (relay comment, this report). git push to the PR branch is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: cloud · noted, not filed — AI runtime consumers of agent/skill/tool names (service-ai agents, skills, action_NAME tool names, ToolRegistry) live in objectstack-ai/cloud; NOT MEASURED here (PR body Series section)",
        "carrier: seat · noted, not filed — analytics_cube: a non-host package's cube never reaches the analytics service (404 CUBE_NOT_FOUND in both orders), a reach gap, not a holder conflict; dedupe words: analytics cube non-host package CUBE_NOT_FOUND",
        "carrier: seat · noted, not filed — docs candidate: content/docs import-mappings page could state one package per mapping name (docs-drift bot found no contradicting doc); dedupe words: import mapping name one package"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4cytQjG9X1CrCgytUM5

    Progress · 2026-11-06T11:48Z · PR 1 of 4 landed: PR #30836 merged through the queue as 2a6a28db96 (Refs #30803; the card stays open and dispatched).

    Reading Value
    Landed the one-holder module, the package door + item seam refusal, the kernel:bootstrapped seal (BARE_NAME_COLD_BOOT_MODE = 'warn'), ADR-0048 §3.4 narrowing + 2026-11-06 addendum; types picklist, mapping, dataset
    Reviews contract review 6679538573 PASS, delta 6679688246 PASS; seat ACCEPT 6679952314 + addendum 6683678834; Tier H, armed by os-zhuang
    Next PR2–PR4 (api, object-less action, function registry, webhook, connector, flow, email_template, agent, skill) wait for the maintainer's answer on which of them the separately-held security subset of #30798 covers
    Open ruling cold-boot refuse vs warn (maintainer card in the seat thread); 'warn' ships, a refuse ruling is a one-constant follow-up
  7. added
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 6, 2026
  8. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4cytQjG9X1CrCgytUM5

    Ruling recorded · 2026-11-06T14:58Z · cold boot of an existing bare-name clash: the maintainer chose B, warn at boot and refuse new installs (decision card, 2026-11-06T14:57Z).

  9. 17 remaining items

  10. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
  11. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · sunhaolin · session_017xRBcTJTE7kSbcMoJQ4Txf

    Claim: PM loop round 1 · PR 3 of 4 (flow, webhook, connector, email_template) on seat 2's release 6701997408 · 2026-11-07T04:49Z
    Session: session_017xRBcTJTE7kSbcMoJQ4Txf
    Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-30803-bare-name-pr3-flow-family
    Worktree: objectstack-issue-30803
    Domain: domain:server
    Seat: domain:server#1
    File surface: packages/objectql/src/ (bare-name-one-holder.ts and the registry / package-door / item-seam / cold-boot call sites PR 1 and PR 2 use, plus a new registry-bare-name-one-holder-*.test.ts); the registrars of flow, webhook, connector and email_template that the dev's measurement shows serving a bare name without package context, wherever they live (each named in the report with the reason); packages/qa/dogfood/test/ (one dogfood pin, as PR 2); docs/adr/0048-cross-package-metadata-collision.md (the §3.4 note and the phase-1 addendum rows for these four types); scripts/adr-anchors/packages__objectql__src__bare-name-one-holder.ts.json; one changeset. ⛔ packages/spec/**, ⛔ skills/**, ⛔ agent and skill (PR 4). Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier: MANDATORY from docs/adr/**, no one-line exemption), effort: xhigh (the docs/adr/** floor)
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: n/a — not a defect card; this card executes ruling C on #30798, phase 1
    Thread-read: 6701997408
    Premise: holds (read on origin/main 24bc2593 at 2026-11-07T04:49Z: BARE_NAME_ONE_HOLDER_TYPES is picklist, mapping, dataset, api, action, function; none of the four PR 3 types is covered)
    Serial constraints cleared: PR 1 (#30836, 2a6a28db) and PR 2 (#31006, 902f162c) have merged; the dev works on the merged code. #29594 (seat 2, pm:dispatched) claims packages/objectql/src/registry.ts and service-automation/src/flow-precedence.ts: its only open PR is #31027 (docs/adr/0146 only) and its PR 3 has not started, so there is no live code overlap now. Whichever lands second merges main. #30806 and #30808 stay pm:blocked on this card.

    Rulings carried (binding, from this card's thread): cold boot B, warn at boot and refuse new installs (6687840782); all nine types stay in this card, in the series PR3 = flow + webhook + connector + email_template, PR4 = agent + skill with Fixes #30803 (6688041914). This PR carries Refs #30803 (PR 3 of 4), never Fixes. Tier H (ADR-0048): a human merges.

  12. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · sunhaolin · session_017xRBcTJTE7kSbcMoJQ4Txf

    os-dev-report

    {
      "issue": 30803,
      "status": "done",
      "branch": "claude/issue-30803-bare-name-pr3-flow-family",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31093",
      "session": "session_017xRBcTJTE7kSbcMoJQ4Txf",
      "premise_still_valid": true,
      "summary": "PR 3 of 4 (Refs #30803), the flow family, on PR 1's mechanism (#30836) as PR 2 extended it (#31006): a flow, a webhook, a connector and an email template hold one package. Measured first (card ask 1) on a booted showcase with two AppPlugin packages sharing one name per type, both orders: the automation engine arms ONE flow per name (the lexicographically-first package, alpha in both orders, with its precedence warning) while GET /meta/flow/NAME serves the first-registered declaration; the webhook dispatcher's declared reader keeps the first-registered webhook and never subscribes the other, silently; GET /meta/connector/NAME (the picker's read) serves the first-registered descriptor, silently, and two provider-bound instances already refuse the boot (ADR-0097 duplicate); a send's template resolves the first-registered email template, silently. A third package installed after the boot under any held name answered 200 and was shadowed. All four resolve without package context, so all four join BARE_NAME_REGISTRY_TYPES (bare-name-one-holder.ts, now the one ordered list of ten with BARE_NAME_REGISTRY_TYPES derived); SchemaRegistry.installPackage and registerItem refuse a second holder after the seal with PR 1's envelope (NAMESPACE_CONFLICT, 422, both holders, the rename), install-local answering 422 PLUGIN_REGISTER_FAILED. Two particulars: email_template is a bundled type (registry key pkg:name@locale), so the holder reading and the cold-boot seal strip the member through bundleBaseKey and the NAME holds the bundle; and the email service's built-in templates (com.objectstack.service.email) are an OVERRIDABLE BASELINE (new OVERRIDABLE_BASELINE_PACKAGES / isOverridableBaseline, exported) because plugin-email's loader serves any other package's same-named member over them by contract (ADR-0131 D6) — that package neither holds a template name nor is refused one, the first other package holds it and a second is refused naming the first. No registrar outside packages/objectql was touched: all four register through registerMetadataCollections → registerItem(..., ownerId), and their consumers (service-automation flow-precedence, plugin-webhooks declared reader, the /meta by-name door, plugin-email's loader) were read, not changed. Cold boot stays ruling B ('warn', BARE_NAME_COLD_BOOT_MODE untouched). ADR-0048: header, §3.4 note, P1.5, P1.6, new P1.8 (Tier H); anchor invariant updated; one changeset (objectql minor). PR4 (agent, skill, the closing line) not started, per the series.",
      "tests": "Measurement (card ask 1, temporary dogfood file, deleted): booted showcase + alpha/beta AppPlugins sharing qa_shared_flow / qa_shared_hook / qa_shared_conn / qa_shared_tpl, both orders — flow: getFlow().label = 'alpha flow' in BOTH orders with the precedence warning naming both; GET /meta/flow/NAME = alpha in alpha>beta, beta in beta>alpha; webhook: declaredWebhookNamed().packageId = first-registered, no warning; connector: GET /meta/connector/NAME = first-registered, listItems returns both; provider-bound instance under one name: boot REFUSED 'duplicate declarative connector instance name ... (ADR-0097)'; email_template: renderTemplate().subject = first-registered; GET /meta/email_template/NAME the same; install-local gamma declaring all four held names: 200 in both orders, every consumer unchanged. registry-bare-name-one-holder-flow-family.test.ts (new) → 54 passed; with the data- and request-family pins and hook-binder.test.ts → 4 files / 154 passed (152 before the two member-key cells). @objectstack/objectql full suite → 565 files / 11476 passed (VERDICT command-exit 0); @objectstack/runtime full suite → 553 files / 8882 passed, 19 skipped (VERDICT command-exit 0). pnpm --filter @objectstack/objectql typecheck exit 0 incl. check:test-typecheck (39 files / 233 errors / 64 pinned signatures held, unchanged); @objectstack/dogfood tsc --noEmit exit 0. Dogfood pin bare-name-one-holder-flow-family.dogfood.test.ts → 4 passed; the data and request families' dogfood files → 8 passed; email-template-materialization.dogfood.test.ts (a fixture app shipping auth.password_reset beside the built-in) → 4 passed. Ablations (src, each via ablation-replace.mjs, restored with blob == HEAD and git diff HEAD empty): the four types removed from BARE_NAME_ONE_HOLDER_TYPES → 39 of 54 red; the baseline exclusion removed from bareNamePackageHolders → 3 red (an app's override refused naming the baseline; the cold boot warns about it; two apps' warning names the baseline); bundleBaseKey no longer applied to the member key → 2 red (the member-key holder cell and the seal's bundled-clash cell). Ablation (dist): objectql built from the merge base's three sources (preflight --absent: marker absent from all 14 built files) → the dogfood pin 4 of 4 red (no bare-name warning line; gamma and delta install-local answered 200 and installed; the CONTROL's import undefined); rebuilt from HEAD (marker present in 8 built files, tree clean) → 4 of 4 green.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at e01df46c: 82 derived, all run with exit codes captured before any pipe; --ran reconciliation '82 derived famil(ies) accounted for — 82 run, 0 NOT-MEASURED' (exit 0). Two reruns after a prerequisite: pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (seven packages had no dist on the fresh worktree) → built them under the lock, rerun exit 0 (116 entry points / 71 packages load); pnpm check:type-check-debt exit 3 PREREQUISITE NOT MET (its closure build timed out on the verify lock behind the dogfood battery, exit 99) → rerun under the lock with the same slot, exit 0 (--re-measure OK, 0 raw tsc errors). pnpm lint at e01df46c: exit 0. CI on the PR: not yet read at report time (in_progress) — the PR's check-runs are the gates' CI reading.",
      "dogfood_battery": "e01df46c · os-verify-lock: VERDICT command-exit 0 · Test Files 435 passed | 3 skipped (438) · Tests 3600 passed | 41 skipped (3641) · no failures (held the lock 1189s on a shared box). Ran because the PR title carries `!` and Clause-② carries the (narrowing) arm.",
      "mcp_calls": "0 — no MCP GitHub tool was called; every GitHub read was a REST GET through `gh api` (the card, its comments, #30798, PR #31006) and every write went through the relay.",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/pulls (relay pr_create, PR #31093, read back identical: 15138 bytes sent, 15138 stored); POST /repos/objectstack-ai/objectstack/issues/30803/comments (relay comment via post-stamped, this report). No labels, assignees or reviewers written (none named by the order; the diff publishes objectql, so no skip-changeset). git push to the branch (2 pushes + the empty-branch probe) is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat · noted, not filed — `GET /connectors` answered 404 on the showcase composition during the measurement (the connector catalog route is not mounted on that composition; `/meta/connector/NAME` and the registry list were used instead). Observation only, no reach measured beyond the dogfood boot; dedupe words: GET /connectors 404 showcase composition route",
        "carrier: seat · noted, not filed — a first app's override of a built-in email template is served silently by design (plugin-email's loader contract, ADR-0131 D6); this PR refuses only a SECOND app's override. Whether the first override should be reported at boot is the email plugin's own question; dedupe words: email template built-in override silent boot report",
        "carrier: seat · noted, not filed — `pnpm check:type-check-debt` and `check:dual-build-cjs-loads` exit 3 (PREREQUISITE NOT MET) on a fresh worktree: the first needs the verify lock for its closure build (it timed out behind the dogfood battery and was rerun under the lock), the second needs seven dists a dogfood-closure build does not produce (built, rerun exit 0). Both are harness facts PR 1 also met, not findings; dedupe words: dual-build-cjs-loads prerequisite dist type-check-debt verify lock"
      ]
    }
  13. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: handover notice · 2026-11-07T22:07Z

    ⛔ Not a claim. Triage does not claim or designate seats.


    Generated by Claude Code

  14. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Claim: PM loop round 1 · take-over of PR 3 of 4 (#31093) on triage's hand-over 6713641758 on mailbox #31199 · 2026-11-07T22:09Z
    Session: session_01FEkQ5pr7Ua2kPRCMZNupZg (card thread, dev) · seat session_01FEkQ5o8PE7ZtVjcor51wBZ
    Account: os-project-manager (the card's assignee)
    Branch: claude/issue-30803-bare-name-pr3-flow-family (PR #31093's own branch, resumed; commits on top, one merge of origin/main, no force push)
    Worktree: objectstack-issue-30803
    Domain: domain:server
    Seat: domain:server#5
    File surface: exactly PR #31093's nine files (docs/adr/0048-cross-package-metadata-collision.md, packages/objectql/src/{bare-name-one-holder.ts,index.ts,plugin.ts,registry.ts,registry-bare-name-one-holder-flow-family.test.ts}, packages/qa/dogfood/test/bare-name-one-holder-flow-family.dogfood.test.ts, scripts/adr-anchors/packages__objectql__src__bare-name-one-holder.ts.json, one changeset); the merge commit's content is main's. PR 4 is not in this claim.
    Container & model: M, mode:thread, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier: MANDATORY from docs/adr/**), effort: xhigh floor; the thread opened at the coordinator's default effort (the coordinator sets effort only on the maintainer's word), recorded as a deviation.
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: as on the card and PRs 1–2 (#30836, #31006, merged); unchanged by this take-over.
    Thread-read: 6713649116
    Premise: holds. PR #31093 is open, draft, head e01df46cce, 2 ahead / 92 behind main, mergeable clean; os-dev report 6703300597; contract review 6703490135 PASS with should-fix 1 open.
    Serial constraints cleared: none new; PR 4 follows PR 3.
    Resume-from: claude/issue-30803-bare-name-pr3-flow-family@e01df46cce

    Scope: Refs #30803. Merge origin/main; close should-fix 1 by route (b) (the constant stays off the published index); refresh body and gates. Then a fresh contract review outside the dev's session, ACCEPT, pm:awaiting-merge and the Tier H hand-off. Order: /mnt/project-files/pm-orders/server/order-30803.md.

  15. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5pr7Ua2kPRCMZNupZg
    os-dev-report

    {
    "issue": 30803,
    "status": "done",
    "branch": "claude/issue-30803-bare-name-pr3-flow-family",
    "pr": "#31093",
    "session": "session_01FEkQ5pr7Ua2kPRCMZNupZg",
    "premise_still_valid": true,
    "summary": "Take-over of PR 3 of 4 (Refs #30803, the flow family) on claim 6713676993, resumed from e01df46. (1) Merged origin/main b3bd75d once as 6bbbb4a: 93 commits, no conflict; the only main change in this PR's files is registry.ts's ADR-0146 pair lookup (pairOf -> pairsOf), no shared hunk. (2) Should-fix 1 of contract review 6703490135 closed by route (b), commit c05d912: OVERRIDABLE_BASELINE_PACKAGES leaves packages/objectql/src/index.ts (now byte-identical to main, so the PR is 8 files, not 9), and the booted dogfood CONTROL holds the baseline's spelling by behaviour with no second copy of the constant: it reads the package the email plugin registered the built-ins under from the registry (as before) and requires an app's override of auth.password_reset to install, which it cannot if the engine's vocabulary spells that package any other way (ablation: misspelt constant -> CONTROL refused naming com.objectstack.service.email). The changeset now says the constant is private to the engine; Clause-2 no (narrowing) and Metadata-protocol narrowed unchanged. (3) The nit is fixed in the same reader line: declaredBareNames reads the baseline by artifactPackageId (id, else name), the identity the package door judges, plus its import; the vocabulary unit cell gained two expectations (still 54 cells). (4) PR body refreshed to c05d912 and handed to the seat as a relay actions file (see deviations).",
    "tests": "On c05d912. Unit: pnpm --filter @objectstack/objectql exec vitest run on registry-bare-name-one-holder-flow-family.test.ts, registry-bare-name-one-holder.test.ts, registry-bare-name-one-holder-request-family.test.ts, hook-binder.test.ts -> Test Files 4 passed (4), Tests 154 passed (154) (flow family 54, PR 1/PR 2 families + binder 100). Dogfood, after the dogfood^... closure build (VERDICT command-exit 0): bare-name-one-holder-flow-family, bare-name-one-holder, bare-name-one-holder-request-family, email-template-materialization dogfood files -> Test Files 4 passed (4), Tests 16 passed (16). pnpm --filter @objectstack/objectql typecheck exit 0 incl. check:test-typecheck (39 files / 233 errors / 64 pinned signatures held, unchanged); pnpm --filter @objectstack/dogfood exec tsc --noEmit exit 0. Ablations, each committed first, restored with blob == HEAD and git diff HEAD empty: A1 src (the nit) declaredBareNames reads manifest.id again -> unit file 1 failed | 53 passed (54), the vocabulary cell: 'AssertionError: expected [ { type: email_template, ...(1) } ] to deeply equal []'. A2 dist (should-fix 1) OVERRIDABLE_BASELINE_PACKAGES.email_template misspelt, objectql rebuilt, ablation-dist-preflight marker present in 4 built files -> dogfood flow-family 1 failed | 3 passed (4), the CONTROL: 'AssertionError: the package com.objectstack.service.email registered the built-ins under is the baseline, not a holder: {success:false, error:{code:PLUGIN_REGISTER_FAILED, message: ... package com.qa.bare.epsilon declares the email template auth.password_reset ...'; restored, rebuilt, preflight --absent: marker absent from all 14 built files, tree clean. A3 dist (re-run of round 1's base leg, the dogfood file moved) objectql bare-name-one-holder.ts, registry.ts, plugin.ts at the merge base b3bd75d, rebuilt (head marker isOverridableBaseline absent from all 14 built files) -> dogfood flow-family 3 failed | 1 passed (4): the cold-boot warning cell and both install-local refusal cells red, the CONTROL green (it no longer imports from objectql, so on the base it is a control; round 1 read 4 of 4 red because the import was undefined); trap restore, three blobs == HEAD, rebuilt from HEAD (marker back in 4 built files). Round 1's three src ablations (types removed 39/54, baseline exclusion removed 3/54, member not stripped 2/54) not re-run: those hunks are byte-identical after the merge and c05d912. Full objectql (565 files / 11476) and runtime (553 files / 8882) suites not re-run locally (round 1 at e01df46, both VERDICT command-exit 0); CI Test Core runs them on this head.",
    "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at c05d912 (merge base b3bd75d, 8 paths, 1051 changed lines): 84 derived families, every one run with stdin closed and its exit code captured before any pipe. 83 exit 0 on the first pass; pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (no packages/qa/scenarios/dist; the seven dists round 1 named were built beforehand under the lock) -> built @objectstack/scenarios... under the lock (VERDICT command-exit 0), rerun exit 0 (122 published require entry points across 72 packages load). check:type-check-debt exit 0 and check:dts-closure exit 0 on the first pass; check-plugin-teardown-shape --self-test exit 0 after fetching fixture commit 621a487. --ran reconciliation: '84 derived famil(ies) accounted for — 84 run, 0 NOT-MEASURED' (exit 0). Lint: the touched packages have no lint script (pnpm --filter objectql --filter dogfood lint -> ERR_PNPM_RECURSIVE_RUN_NO_SCRIPT, nothing measured), so eslint was run as pnpm lint spells it (node --stack-size=4000 node_modules/eslint/bin/eslint.js --no-inline-config) over packages/objectql/src and the dogfood file: exit 0. CI on c05d912, read once while the dogfood battery ran: 50 check-runs, 35 success, 13 skipped, 2 failure: Test Core (3/8) and its aggregate Test Core. The one red cell: @objectstack/scenarios test/runner/external-driver.test.ts 'a full crm run through the command ...' Error: Test timed out in 5000ms (5044ms; 572 of 573 passed, no assertion failed). Not this diff by reading and by measurement: the test arrived with #31265, runs a scripted CRM through a spawned command under vitest's 5000ms default; on c05d912 it passed 4 of 4 locally (2973ms when timed, Tests 8 passed (8) each run). Nothing pushed to re-run it; the seat judges. Every other family CI runs (Build Core, Type Check lanes, Lint and Repo Gates, Check Changeset, Dogfood Regression Gate, PR-body guards, the other Test Core shards) read success or skipped on this head.",
    "dogfood_battery": "c05d912a · os-verify-lock: VERDICT command-exit 0 · Test Files 436 passed | 3 skipped (439) · Tests 3614 passed | 41 skipped (3655) · no failures (held the lock 1567s on a shared box). Ran because the title carries ! and Clause-2 carries the (narrowing) arm.",
    "mcp_calls": "0 — no MCP GitHub tool called; every GitHub read was a REST GET through gh api (card + comments, PR + body + comments, check-runs, one job log, four PR bodies for the attribution shape).",
    "api_writes": "1 — POST /repos//issues/30803/comments (relay comment via post-stamped, this report). The PR body patch was dry-run only (dispatch.mjs --dry-run exit 0) and is handed to the seat. git push to the PR branch (1 push: 6bbbb4a + c05d912, fast-forward from e01df46) is not a REST write.",
    "files_changed": "8 vs merge base b3bd75d: .changeset/30803-bare-name-flow-family.md, docs/adr/0048-cross-package-metadata-collision.md, packages/objectql/src/bare-name-one-holder.ts, packages/objectql/src/plugin.ts, packages/objectql/src/registry.ts, packages/objectql/src/registry-bare-name-one-holder-flow-family.test.ts, packages/qa/dogfood/test/bare-name-one-holder-flow-family.dogfood.test.ts, scripts/adr-anchors/packages__objectql__src__bare-name-one-holder.ts.json. packages/objectql/src/index.ts left the diff (route b). This round's own commit c05d912: 5 files, +23/-21.",
    "line_budget": "+986 / -65 (1051 changed lines, 8 files) vs the human-merge threshold 3000: under.",
    "deviations": [
    "Effort: the order names an xhigh floor for docs/adr/**; this thread ran at the coordinator's default effort (the coordinator sets effort only on the maintainer's word). Model: the thread runs the session's configured model; CONTRACT_REVIEW_TIER is owed by the seat's fresh contract review, not by this dev run.",
    "PR body: order step 4 asks the dev to refresh it through relay issue_patch; os-dev.md rule 3 (dev writes a PR body only at pr_create, never PATCH; the seat rewrites) wins per the order's own preface, and dispatch.mjs's #29145 section assigns the rewrite to the seat. The refreshed body (attribution block + Refs line first, Verification stamped on c05d912, counts re-read, ablation table re-run where code moved, round-2 acceptance note, trailer-signed last line) is ready: /mnt/project-files/pm-orders/server/30803-pr3-body-patch.json (bare JSON array, one issue_patch on 31093), dispatch.mjs --dry-run exit 0 (the trailer target read answered a pull request); readable copy /mnt/project-files/pm-orders/server/30803-pr3-pr-body-v2.md. Send: node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file THAT_FILE.",
    "The order counted main 92 ahead at 22:10Z; the merge took 93 (one more landed before the fetch)."
    ],
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: seat · noted, not filed — CI Test Core (3/8) on c05d912: @objectstack/scenarios test/runner/external-driver.test.ts 'a full crm run through the command' timed out at 5044ms against vitest's 5000ms default (no assertion red); 2973ms locally, 4 of 4 green; a new test (#31265) with no explicit timeout sitting near the default on a loaded runner. dedupe words: scenarios external-driver full crm run timed out 5000ms"
    ]
    }


    Generated by Claude Code

  16. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    ACCEPT → PR #31093 comment 6715033122 (Head-sha 212583dd). PR 3 of 4. Tier H (docs/adr/**): pm:awaiting-merge, review requested from os-zhuang and hotlong. The card stays open for PR 4 (agent, skill, the closing line).

  17. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    Claim: PM loop round 1 · PR 4 of 4 (agent + skill, the series' closing change) after PR 3 #31093 MERGED 2026-11-08T02:47Z · 2026-11-08T03:08Z
    Session: session_01FEkQ5pr7Ua2kPRCMZNupZg (card thread, dev) · seat session_01FEkQ5o8PE7ZtVjcor51wBZ
    Account: os-project-manager
    Branch: claude/project-thread-373joq
    Worktree: objectstack-issue-30803
    Domain: domain:server
    Seat: domain:server#5
    File surface: packages/objectql/src/** (the one-holder list + tests), a dogfood test, docs/adr/0048-*.md (P1.5 → P1.9), root .changeset/
    Container & model: M, mode:thread, model: CONTRACT_REVIEW_TIER (dispatch-gates --tier: MANDATORY from docs/adr/**), effort: xhigh floor; the thread runs at the coordinator's default effort (the coordinator sets effort only on the maintainer's word), recorded as a deviation.
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: objectql registry one-holder list (objectstack) | agent and skill names resolve without package context (ADR-0048 P1.5) | two installed packages shipping one bare agent or skill name
    Thread-read: 6715046690
    Premise: holds by ADR-0048 P1.5 on origin/main (agent and skill "resolving without a package context", to follow in the series' last change); the dev measures both orders first and stops with needs_decision if either does not
    Serial constraints cleared: PR 3 #31093 merged; no open PR touches packages/objectql/src/bare-name-one-holder.ts or ADR-0048

    Scope: Fixes #30803 (the ruling 6688041914's PR order: PR4 agent + skill). tool / rag_pipeline measured only, reported out of scope. Order: /mnt/project-files/pm-orders/server/order-30803-pr4.md. Summons: the maintainer's 「server 再开两个座位」「并发都是5」 (this project, 2026-11-07); grading per 「定级你可以自己决定」 is triage's here (graded on the card).

  18. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5pr7Ua2kPRCMZNupZg
    os-dev-report

    {
    "issue": 30803,
    "status": "done",
    "branch": "claude/project-thread-373joq",
    "pr": "#31375",
    "head": "15ed46b6",
    "session": "session_01FEkQ5pr7Ua2kPRCMZNupZg",
    "premise_still_valid": true,
    "summary": "PR 4 of 4 (Fixes #30803, the AI family, the series' close) on claim 6716532253. Measured first on a booted showcase with two AppPlugin packages sharing one agent, one skill and one tool name, both registration orders, then install-local of a third package: /meta/agent/NAME, /meta/skill/NAME and the MCP skill prompt (listSkillPrompts keeps the first row per name) each served the first-registered package, silently; the third package installed 200 and was shadowed. Both ruled types resolve without package context, so both joined BARE_NAME_ONE_HOLDER_TYPES last (12 types): collection keys agents/skills, consumer clauses, nouns, empty built-in and baseline sets; doors and cold-boot seal are generic over the list, so no code change in registry.ts/plugin.ts beyond comments. PR 1's envelope (NAMESPACE_CONFLICT 422, install-local 422 PLUGIN_REGISTER_FAILED); cold boot stays ruling B (warn). ADR-0048 (Tier H): header Addenda and §3.4 note name twelve types and drop 'to follow', status line names P1.9 the last, P1.5 becomes 'The series, complete', new P1.9 (measurement, what is refused, tool and rag_pipeline not in the list, cold boot, the series' close). Anchor invariant updated. One changeset, @objectstack/objectql minor. Feat 55c7023, origin/main e735425 merged once as 15ed46b (6 commits, none in this PR's files, no conflict).",
    "tests": "On 15ed46b. Unit: registry-bare-name-one-holder-ai-family.test.ts (new, 26 cells) with the data, request and flow families' files and hook-binder.test.ts -> Test Files 5 passed (5), Tests 180 passed (180). Dogfood: bare-name-one-holder-ai-family.dogfood.test.ts (new, 4 cells) with the three earlier families' dogfood files, after the dogfood^... closure build (VERDICT command-exit 0) -> Test Files 4 passed (4), Tests 16 passed (16). On 55c7023: @objectstack/objectql full suite under os-verify-lock, 568 files / 11516 tests passed, VERDICT command-exit 0; pnpm --filter @objectstack/objectql typecheck exit 0 incl. check:test-typecheck (39 files / 233 errors / 64 pinned signatures held, unchanged); pnpm --filter @objectstack/dogfood exec tsc --noEmit exit 0. Ablation (committed first via ablation-replace.mjs, marker ABL4, restored with blob == HEAD and git diff HEAD empty): agent and skill filtered out of BARE_NAME_ONE_HOLDER_TYPES -> unit AI-family file 18 of 26 red (list and declaredBareNames cells, every refusal at both doors, each ABLATION cell's after-seal half, the cold-boot warn/reload/refuse cells, the reason and built-in cells; green: per type the same-package reload, uninstall release and environment CONTROL, plus the tool and agent-versus-skill CONTROLs); objectql rebuilt with the mutation, ablation-dist-preflight marker in 4 built files -> dogfood pin 3 of 4 red (no warning line; gamma and delta installed), CONTROL green. Restored, rebuilt, marker absent from all 14 built files -> 4 of 4 green.",
    "gates": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands at 15ed46b (merge base e735425, 9 paths, +646/-24): 90 derived families, every one run with stdin closed and its exit code captured before any pipe; all 90 exit 0 on the first pass (the check:dual-build-cjs-loads prerequisite dists were already built on this worktree). --ran: '90 derived famil(ies) accounted for — 90 run, 0 NOT-MEASURED' (exit 0). Lint: eslint as pnpm lint spells it (node --stack-size=4000 node_modules/eslint/bin/eslint.js --no-inline-config) over packages/objectql/src and the dogfood file: exit 0, no findings. CI on 15ed46b had just started when this report was written (19 in progress, 1 queued, 1 skipped): NOT MEASURED here, the seat reads it.",
    "dogfood_battery": "15ed46b6 · os-verify-lock: VERDICT command-exit 0 · Test Files 438 passed | 3 skipped (441) · Tests 3622 passed | 41 skipped (3663) · no failures (held the lock 1801s on a shared box). Ran because the title carries ! and Clause-2 carries the (narrowing) arm.",
    "mcp_calls": "0 — no MCP GitHub tool called; GitHub reads were REST GETs through gh api (card, PR 3 labels, the new PR's draft/assignee state, check-runs).",
    "api_writes": "2 — relay pr_create (fleet-write request fw-20261108T045507Z-5417f6, run 42448704061 success; read-back 12329 bytes sent, 12329 stored, identical; draft true, assignees none, no labels) and POST /repos//issues/30803/comments (this report, via post-stamped). git push of the branch (55c7023, then 15ed46b) is not a REST write.",
    "files_changed": "9 vs merge base e735425: .changeset/30803-bare-name-ai-family.md, docs/adr/0048-cross-package-metadata-collision.md, packages/objectql/src/bare-name-one-holder.ts, packages/objectql/src/plugin.ts, packages/objectql/src/registry.ts, packages/objectql/src/registry-bare-name-one-holder-ai-family.test.ts (new), packages/objectql/src/registry-bare-name-one-holder-flow-family.test.ts, packages/qa/dogfood/test/bare-name-one-holder-ai-family.dogfood.test.ts (new), scripts/adr-anchors/packages__objectql__src__bare-name-one-holder.ts.json.",
    "line_budget": "+646 / -24 (670 changed lines, 9 files) vs the human-merge threshold 3000: under.",
    "deviations": [
    "Effort: the order names an xhigh floor for docs/adr/**; this thread ran at the coordinator's default effort (already recorded on the Claim).",
    "scripts/adr-anchors/packages__objectql__src__bare-name-one-holder.ts.json is outside the claim's file surface; the order names the anchor update, so it is in the diff (one line, the invariant text).",
    "The flow family's unit list pin now reads BARE_NAME_ONE_HOLDER_TYPES.slice(0, 10) (it pinned the whole list, which grew); the AI family's file pins all twelve.",
    "Ablation dist leg: tsup's DTS step failed on the mutated literal's type (TS2322) after the JS bundles were written; ablation-dist-preflight found the marker in 4 built files, so the dogfood reading is of the mutated build. The restore leg rebuilt cleanly.",
    "Gates first started on 55c7023; origin/main moved during the run, so the loop was stopped, main merged once (15ed46b) and the whole derived list re-run there (same 90). The full objectql suite, the typechecks and the ablation were not re-run after the merge (the merge touched none of this PR's files); the pins, gates, eslint and battery are on 15ed46b.",
    "pr_create carries no labels key: the relay refuses an empty labels array and the order names no label."
    ],
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: seat · noted, not filed — tool: two packages' tools under one name, GET /meta/tool/NAME serves the first-registered package's tool in both orders, no warning, a third package installs 200 and is shadowed. Not in the ruling's nine, not added. dedupe words: bare name tool meta first-registered shadowed",
    "carrier: seat · noted, not filed — rag_pipeline: defineStack refuses ragPipelines as an unrecognised stack key (StackSchemaInvalidError), though the engine's collection loop and the manifest spelling table list it; nothing registered, nothing measured beyond that. dedupe words: ragPipelines stack key refused defineStack",
    "carrier: seat · noted, not filed — the kernel metadata service (get('agent', NAME), what MCP agent_prompt reads) lists no package agent at all on the composed runtime, in either order (ADR-0063 §2: agents are platform-owned); an MCP client cannot fetch a package agent's prompt there. dedupe words: agent_prompt metadata service package agent missing",
    "carrier: seat · NOT MEASURED — the objectstack-ai/cloud agent runtime that resolves an agent or a tool by name for chat; HotCRM not checked out for the producers count; deployed and marketplace packages."
    ]
    }


    Generated by Claude Code

  19. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-project-manager · session_01FEkQ5o8PE7ZtVjcor51wBZ

    ACCEPT → PR #31375 comment 6717837056 (Head-sha a9d8e397). PR 4 of 4 (agent + skill, Fixes #30803, phase 1's closing change). Tier H (docs/adr/**): pm:awaiting-merge, reviewers os-zhuang and hotlong requested. Contract review 6717571232 + delta 6717606625 PASS. · 2026-11-08T05:42Z

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

Metadata

Metadata

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:serverDomain lane — seat card indexed by label:pm:seatpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions