Repository navigation
Description
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 itplugin-notification-push; os-zhuang asked on the card (6592963202) whether a kernel service should beservice--prefixed. Warren ruledservice-push+ amend ADR-0012 (fable thread, 2026-11-03T02:11Z) and then: 「应该用 service-*,包括如何制定仓库规则,避免类似的问题」, 「plugin- 太笼统,是不是建议逐渐退役这个名字」. - Measured at
3d5933a9: noplugin-notification-*package exists; ADR-0012's inbox/email/webhook names were never built either. The channels that shipped aresms-channel.ts/email-channel.tsinservice-messagingdelegating to@objectstack/service-sms/@objectstack/plugin-email.packages/pluginsalready holds kind-named packages with noplugin-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-security392,plugin-auth259,plugin-hono-server183,plugin-audit157,plugin-sharing126,plugin-approvals93,plugin-email79,plugin-webhooks48,plugin-dev22,plugin-pinyin-search15). 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)
check:package-naming(scripts/check-package-naming.mjs, onscripts/workspace-enumerator.mjs), wired intocheck:all/ CI likecheck: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-testarm like the sibling gates.
- every package under
- Not wanted: renaming any existing
plugin-*package or moving its directory.
Acceptance
- The gate reds on a fixture package
packages/services/plugin-xand on an eleventh@objectstack/plugin-*, and is green onmain. - The Push channel: build the device registry routes (
/notifications/devices) and the APNs + FCM transport that ADR-0012 marks "MUST ship M1" #29041 PR (service-push) passes the new gate unchanged. - The frozen set equals the ten named in Package naming rule: name a new package by its kind (
service-*,connector-*, ...) and freeze theplugin-prefix at today's ten (AGENTS.md roles rows + pm-dispatch order line) #29709's rule text.
Activity
objectstack-fleet commentedon Nov 3, 2026
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 issession_01JQwxbXkaL8RZJzfDDK793uAccount:
os-warrenBranch:
claude/project-thread-jvai6tWorktree: the card thread's own container checkout
Domain:
domain:devx(maintainer-directed ③, routed todomain:server#2by the coordinator)Seat:
domain:server#2File surface: new
scripts/check-package-naming.mjs(+ self-test), itspackage.jsonscript, one step in.github/workflows/lint.ymlbesidecheck:workspace-manifest-cycles(Tier H: the maintainer lands)Container & model: card thread,
mode:thread,model: TIER_DEFAULT(--tiernames no path mandate),effort: project defaultClause-②: 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/mainc9636f1e: ten@objectstack/plugin-*, 18packages/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
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:devxkept ·pm:dispatchedkept · gate held on #29725 · 2026-11-03T02:55Z⛔ Not a claim.
check:package-naming). The standing rule is 「新增门禁默认否」. The maintainer's words ask for a repo rule but do not name a gate, so the gate goes to the maintainer as decision card [Decision] New gatecheck:package-naming(#29710): the maintainer asked for a repo rule against generic package names — is a CI gate part of that, or the rule text (#29709) alone? #29725 (lean A, approve).check:package-naming(#29710): the maintainer asked for a repo rule against generic package names — is a CI gate part of that, or the rule text (#29709) alone? #29725, this card's PR may stay a draft but does not go ready or into the queue. p2.Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
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
objectstack-fleet commentedon Nov 3, 2026
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
objectstack-fleet commentedon Nov 3, 2026
domain:server#2 · os-warren · session_01JQwxbXKRzgnVvjzxaYxLUf
Landing record · #29710 · 2026-11-03T04:35Z
.github/workflows/lint.yml); merge commit50c4ec0396acd4ddeb83eb3bde05e23d765ede49; head4d2af80c; this card closed byFixes.4d2af80c→pr_ready+ reviewers hotlong / os-zhuang requested by the seat → maintainer enqueued. Triage ruling A on [Decision] New gatecheck:package-naming(#29710): the maintainer asked for a repo rule against generic package names — is a CI gate part of that, or the rule text (#29709) alone? #29725 (Warren 「同意29725」) approved the gate as written.check-package-naminggate (a lint.yml step) enforcing the Package naming rule: name a new package by its kind (service-*,connector-*, ...) and freeze theplugin-prefix at today's ten (AGENTS.md roles rows + pm-dispatch order line) #29709 rule: new packages take a role prefix such asservice-*; the ten existingplugin-*names are frozen, not renamed.node scripts/check-package-naming.mjs --root DIRon the Push channel: build the device registry routes (/notifications/devices) and the APNs + FCM transport that ADR-0012 marks "MUST ship M1" #29041packages/services/service-pushcheckout when it exists (seat 4).pm:dispatchedremoved in the same stroke as this record.Generated by Claude Code