Skip to content

Gate check:package-naming: every packages/services/ package is @objectstack/service-*, and the @objectstack/plugin-* set is a ratchet frozen at today's ten #29710

Closed

Description

@objectstack-fleet

domain:server#2 · os-warren · session_01JQwxbXKRzgnVvjzxaYxLUf

立卡门类别: ③ 维护者直派. 出处: Warren, project thread "Decide push channel package name", 2026-11-03T02:11:43Z 「应该用 service-*,包括如何制定仓库规则,避免类似的问题」 and 02:12:01Z 「plugin- 太笼统,是不是建议逐渐退役这个名字。」; decision card answered 02:14:54Z "coordinator dispatches a seat"; dispatched by domain:server#2 at the coordinator's routing (02:16Z).
业务理由: ③ — the maintainer's words above. Without a written rule and a gate, the next package an ADR names gets the generic plugin- prefix again (ADR-0012 §4 still says plugin-notification-push), and a published name cannot be taken back without a major.
动手的读者: a domain:devx card thread dispatched by domain:server#2: one new gate scripts/check-package-naming.mjs wired like its siblings. Suggested-grade: p2 · the mechanical half of the maintainer-directed rule.
查重 (gh api search/issues, includes closed, 2026-11-03T02:17Z): title "package name" ADR precedent 0, naming rule packages 0, plugin prefix naming 0, package naming gate 3 (all closed, dispatch-gates / lock-family findings, unrelated), "service-" prefix 4 (service-storage / service-sms behaviour, unrelated). Nearest open neighbour #29663 (pm-dispatch: a new key or export NAME settled by precedent is the seat's call) covers authorable keys and exports, not package names; 0 duplicates. #29041 is the consumer (service-push).

Context

  • Push channel: build the device registry routes (/notifications/devices) and the APNs + FCM transport that ADR-0012 marks "MUST ship M1" #29041 asked for the push channel. ADR-0012 §4 names it plugin-notification-push; os-zhuang asked on the card (6592963202) whether a kernel service should be service--prefixed. Warren ruled service-push + amend ADR-0012 (fable thread, 2026-11-03T02:11Z) and then: 「应该用 service-*,包括如何制定仓库规则,避免类似的问题」, 「plugin- 太笼统,是不是建议逐渐退役这个名字」.
  • Measured at 3d5933a9: no plugin-notification-* package exists; ADR-0012's inbox/email/webhook names were never built either. The channels that shipped are sms-channel.ts / email-channel.ts in service-messaging delegating to @objectstack/service-sms / @objectstack/plugin-email. packages/plugins already holds kind-named packages with no plugin- prefix (embedder-openai, knowledge-memory, knowledge-ragflow, organizations). The only written placement rule is the AGENTS.md roles table (packages/plugins/** | Implements spec contracts, packages/services/** | Kernel-managed services), which does not say how a new package is named or what wins when an ADR and the tree disagree.
  • The ten plugin-* packages are published names with 15–392 references each outside their own directory (plugin-security 392, plugin-auth 259, plugin-hono-server 183, plugin-audit 157, plugin-sharing 126, plugin-approvals 93, plugin-email 79, plugin-webhooks 48, plugin-dev 22, plugin-pinyin-search 15). Renaming any of them is a public break (ADR-0087 tombstone, check-changeset-no-major), so the prefix is retired for NEW names only.

Wanted (the gate; the rule text is #29709)

  1. check:package-naming (scripts/check-package-naming.mjs, on scripts/workspace-enumerator.mjs), wired into check:all / CI like check:workspace-manifest-cycles:
    • every package under packages/services/ is named @objectstack/service-* and its directory basename equals the unscoped name;
    • the set of @objectstack/plugin-* names is a ratchet frozen at today's ten (pattern: scripts/check-skills-token-ratchet.mjs); a new one fails with the remedy "name it by its kind";
    • a --self-test arm like the sibling gates.
  2. Not wanted: renaming any existing plugin-* package or moving its directory.

Acceptance

Activity

  1. added
    enhancementNew feature or request
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 3, 2026
  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-warren · session_01JQwxbXKRzgnVvjzxaYxLUf

    Claim: PM loop round 1 · card thread · 2026-11-03T02:22Z
    Session: session_01JQwxbXKRzgnVvjzxaYxLUf (the seat); the card thread is session_01JQwxbXkaL8RZJzfDDK793u
    Account: os-warren
    Branch: claude/project-thread-jvai6t
    Worktree: the card thread's own container checkout
    Domain: domain:devx (maintainer-directed ③, routed to domain:server#2 by the coordinator)
    Seat: domain:server#2
    File surface: new scripts/check-package-naming.mjs (+ self-test), its package.json script, one step in .github/workflows/lint.yml beside check:workspace-manifest-cycles (Tier H: the maintainer lands)
    Container & model: card thread, mode:thread, model: TIER_DEFAULT (--tier names no path mandate), effort: project default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: repo gates (devx) | nothing stops a new package from being named plugin-* or a service from leaving the service-* form | every future package author; reachable today (#29041)
    Thread-read: none
    Premise: holds (thread measured on origin/main c9636f1e: ten @objectstack/plugin-*, 18 packages/services/* all @objectstack/service-<dir>)
    Serial constraints cleared: none owed; sibling rule-text card #29709 runs in parallel and must name the same ten

    Order: project file pm-orders/server/seat2/order-29710.md.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:devx kept · pm:dispatched kept · gate held on #29725 · 2026-11-03T02:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: gate hold lifted · decision #29725 ruled A · 2026-11-03T03:04Z

    ⛔ Not a claim. The maintainer approved the gate (「同意29725」, record 6594381402). This card's PR proceeds on its own review path. p2 kept.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-warren · session_01JQwxbXkaL8RZJzfDDK793u
    os-dev-report

    {
      "issue": 29710,
      "status": "done",
      "branch": "claude/project-thread-jvai6t",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29739",
      "session": "session_01JQwxbXkaL8RZJzfDDK793u",
      "premise_still_valid": true,
      "summary": "New gate scripts/check-package-naming.mjs on scripts/workspace-enumerator.mjs: every packages/services/ package is @objectstack/service-NAME with a matching directory basename, and the @objectstack/plugin-* set is a shrink-only ratchet FROZEN_PLUGIN_NAMES at the ten measured names (approvals, audit, auth, dev, email, hono-server, pinyin-search, security, sharing, webhooks); a new plugin- name reds with the remedy to name it by its kind, growing the set is refused outright, a frozen name the tree no longer carries reds as stale-row. Lit control exits 2 on a thin enumeration; --root judges another checkout; --self-test has 15 table-driven cases with the battery floor. Wired as check:package-naming in root package.json and one lint.yml step after check:workspace-manifest-cycles (seat ruling A; no check:all exists, so the PR is Tier H). @object-ui/plugin-* (18) is out of scope per the seat; no package renamed or moved.",
      "tests": "node scripts/check-package-naming.mjs --self-test exit 0 (15 cases pass); the gate on head 4d2af80c exit 0 (129 packages, 18 services conform, exactly 10 frozen names); red-first on the real tree with packages/services/plugin-x (@objectstack/plugin-x) and packages/plugins/plugin-notification-push written into the worktree: exit 1, findings [services-prefix] plugin-x, [plugin-prefix] plugin-notification-push, [plugin-prefix] plugin-x; fixtures removed, git status clean. #29041 service-push branch: NOT MEASURED, reason: no such branch or PR on the remote yet. No ablation: the diff is a new gate script, config and a workflow step.",
      "gates": "head 4d2af80c rebased on origin/main 9b4fa6cc: dispatch-gates --commands derived 65 families; all 65 run with exit codes captured before any pipe, every one exit 0 (check:pm-dispatch-gates 1945 fast-tier cases pass, check:package-naming, check:entry-guard, check:self-test-wired, check:ratchet-remedy-authority, check:watch-hint-literal, check:declared-population-live, check:step-collectors, check:workflow-step-name-quoting and the rest); dispatch-gates --ran: 65 derived, 65 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. pnpm lint exit 0. A first run on the earlier head red check:entry-guard (top-level main() in an exporting script) and the second commit fixed it. CI check-runs on the PR: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-② is no",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (POST pulls, then the labels leg skip-changeset) via fleet-write dispatch, and this os-dev-report comment via post-stamped (POST issues/29710/comments); git push is not a REST write",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — a @objectstack/service-* package outside packages/services/ is not judged by this gate (0 today); left out to keep the card's scope",
        "carrier: none · noted, not filed — the 18 @object-ui/plugin-* packages under ui/packages are out of the ratchet by seat ruling"
      ],
      "deviations": "the order said wire into check:all; no such script exists, the seat ruled option A (own lint.yml step, Tier H)"
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#2 · os-warren · session_01JQwxbXKRzgnVvjzxaYxLUf

    Landing record · #29710 · 2026-11-03T04:35Z


    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

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions