Skip to content

docs(qa): qa-media-constraints and qa-feeds-disabled declare namespaces their object names carry - #26907

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/project-thread-w4r8ig
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/project-thread-w4r8ig

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Warren · project thread
Fixes #26876

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:两个 QA 配方的第 1 步安装清单各自声明命名空间(qa-media-constraints → qamedia,qa-feeds-disabled → qafeeds),对象随之改名 qa_media → qamedia_media、qa_nofeeds → qafeeds_nofeeds;用到它们的两个条目 revision 各升一级(6、9)并加一行 history。
  • 为什么改:照原文重放,安装从包 id 推出命名空间 media / feeds,第 2 步建对象 422 NAMESPACE_PREFIX,条目只能记 blocked(fixture)。不能也声明 qa:qa 已归 qa-scratch-authz 的包所有,同机第二个 qa 包实测 422 NAMESPACE_CONFLICT。
  • 风险与回滚:只改 QA 台账两个 JSON 文件,不动产品代码;只换对象名,子句断言、步骤顺序和 oracle 不变;回滚即 revert 本 PR。
  • 先看:两个文件顶部配方的 step 1 与 provenance,再看两个条目 history 的最新一行。
  • 两分钟验证:node scripts/check-platform-checklist.mjs,预期 OK。
  • 需要你做的:无,席位落地。

What changes

Why

The only namespace qa_media and qa_nofeeds already carry is qa, and PR #26875 gave qa to com.objectstack.qa.attachments. A namespace has one owner per boot, so a rename was the only fix that keeps all three recipes installable together. Each recipe now declares a namespace instead of relying on the id-derived default, and the object keeps its old stem after the new prefix (qa_X → qaNS_X), following the qasub precedent in areas/automation.json. The package ids are unchanged, so each teardown DELETE still names the same package.

Recipe sweep (triage 6452130965)

Every area recipe in docs/qa/platform-checklist/areas/*.json was read for the same shape: a step-1 manifest with no namespace whose objects carry another prefix. 8 recipes:

recipe installs a package result
attachments qa-scratch-authz yes, declares qa cleared (#26875); replayed steps 1–4 here, 201/200/200/200
attachments qa-media-constraints yes, no namespace fixed here
records-forms qa-feeds-disabled yes, no namespace fixed here
automation qa-flow-status-doors yes, derived automation cleared: it saves flows, and the prefix judge asks only object saves (protocol.ts, singularType === 'object'); replayed steps 1–3 on the same boot, 201/200/200
automation qa-second-packaged-caller yes, declares qasub, flow qasub_* cleared by reading (not replayed: install-local writes into the project tree)
approvals qa-cross-org-request no cleared
cli cli-18-prerelease-db no cleared
search qa-contributor-bound-member no cleared

Verification

No code changed. Both recipes were replayed REST only on one fresh stock showcase boot built from main a51ba63 (full turbo run build, then pnpm dev -- --fresh -p 4876, no env posture). The script read each recipe's JSON from the file and sent it literally: the "before" leg from origin/main's text, the "after" leg from this branch.

Replay transcript
== A. AS WRITTEN (origin/main text) ==
[old qa-media-constraints] step 1 POST /api/v1/packages -> 201   manifest.namespace "media"
[old qa-media-constraints] step 2 PUT /api/v1/meta/object/qa_media?package=com.objectstack.qa.media -> 422 NAMESPACE_PREFIX Object 'qa_media' is missing the package namespace prefix. Rename it to 'media_qa_media' (namespace = 'media').
[old qa-media-constraints] teardown DELETE /api/v1/packages/com.objectstack.qa.media -> 200
[old qa-feeds-disabled] step 1 POST /api/v1/packages -> 201   manifest.namespace "feeds"
[old qa-feeds-disabled] step 2 PUT /api/v1/meta/object/qa_nofeeds?package=com.objectstack.qa.feeds -> 422 NAMESPACE_PREFIX Object 'qa_nofeeds' is missing the package namespace prefix. Rename it to 'feeds_qa_nofeeds' (namespace = 'feeds').
[old qa-feeds-disabled] teardown DELETE /api/v1/packages/com.objectstack.qa.feeds -> 200

== B. FIXED, all co-installed on one boot ==
[qa-scratch-authz] step 1 POST /api/v1/packages -> 201   manifest.namespace "qa"
[qa-scratch-authz] step 2-4 PUT qa_vault / qa_shared / qa_nofiles -> 200 each
[qa-media-constraints] step 1 POST /api/v1/packages -> 201   manifest.namespace "qamedia"
[qa-media-constraints] step 2 PUT /api/v1/meta/object/qamedia_media?package=com.objectstack.qa.media -> 200  Saved object 'qamedia_media' (state=active)
[qa-feeds-disabled] step 1 POST /api/v1/packages -> 201   manifest.namespace "qafeeds"
[qa-feeds-disabled] step 2 PUT /api/v1/meta/object/qafeeds_nofeeds?package=com.objectstack.qa.feeds -> 200  Saved object 'qafeeds_nofeeds' (state=active)
[qa-flow-status-doors] step 1 POST /api/v1/packages -> 201   manifest.namespace "automation"
[qa-flow-status-doors] step 2-3 PUT flow qa_no_start_node / qa_always_fails -> 200 each

== C. the constraint: a second package declaring qa ==
POST /api/v1/packages {id com.objectstack.qa.nsprobe, namespace qa} -> 422 NAMESPACE_CONFLICT Namespace conflict: namespace "qa" is already owned by package "com.objectstack.qa.attachments" …

== D. the fixtures do their job ==
GET meta/object/qamedia_media -> poster {"type":"image","accept":["image/png","image/jpeg"],"maxSize":1048576} doc {"type":"file","accept":[".pdf"]}
POST data/qafeeds_nofeeds {name:'qa-nofeeds-probe'} -> 201
POST data/sys_comment {thread_id:'qafeeds_nofeeds:<id>'} -> 403 FEEDS_DISABLED Comments are disabled for object 'qafeeds_nofeeds' (enable.feeds: false)

== E. teardown ==
DELETE /api/v1/packages/com.objectstack.qa.media | .feeds | .attachments | .automation -> 200 each
GET meta/object/qamedia_media | qafeeds_nofeeds -> 404 each

Local gates on head 40d6c4f (main c4a4aef), derived by node scripts/pm/dispatch-gates.mjs --commands: 16 families, all exit 0; --ran reconciles 16 derived, 16 run, 0 NOT-MEASURED. check:platform-checklist prints OK — 16 areas, 329 items … provisioning: 8 area recipes, 13 item references resolved … 8/8 recipes referenced.

Gate run
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:platform-checklist :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:watch-hint-literal :: exit 0

CI families outside the derived list are left to the PR's check-runs.

Acceptance notes

  • Out of scope, reported to the seat: item records-forms.field-group-visible-when authors qa_group_gate inline ("install a scratch package, then PUT /api/v1/meta/object/qa_group_gate?package=", reusing this recipe's pattern) with no namespace named. Under any scratch id other than one ending in qa it meets the same 422, and declaring qa collides with qa-scratch-authz. It is an item step, not an area recipe, so the sweep did not touch it.
  • packages/rest/src/rest-declared-client-refusal-log.test.ts still mocks an object named qa_media. It is a unit-test stand-in that never reads this recipe, so it is left alone.
  • ⚠️ The qa(checklist): records-forms — pin the Tier 1 clauses the 18.2.0 sweep scored partial at the layer their oracle names (21 items) #26573 thread also edits records-forms.json (other items). Whichever PR lands second merges origin/main and re-runs check-platform-checklist.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes. (no linted file touched)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (publishes nothing: skip-changeset)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (not touched)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JQwxbWktv4mkt4CV6quMSp

…es their object names carry

Both recipes installed a package with no manifest.namespace, so the
install derived 'media' / 'feeds' from the id and the object save
answered 422 NAMESPACE_PREFIX. Neither may declare 'qa' (owned by
qa-scratch-authz's package; a second owner answers NAMESPACE_CONFLICT),
so each declares its own namespace and its object is renamed:
qa_media -> qamedia_media ('qamedia'), qa_nofeeds -> qafeeds_nofeeds
('qafeeds'). The two opting-in items take a revision and a history row.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQwxbWktv4mkt4CV6quMSp
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 27, 2026
…for its carrier

The item authored qa_group_gate inline under a scratch package that named
no namespace, so the install derived one from the id and the object save
answered 422 NAMESPACE_PREFIX. steps[1] now names the package id and
declares namespace 'qagroup' (not 'qa', which qa-scratch-authz owns), and
the object is renamed qagroup_group_gate. Revision 7 -> 8 with a history
row recording the replay.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQwxbWktv4mkt4CV6quMSp
…-w4r8ig

# Conflicts:
#	docs/qa/platform-checklist/areas/records-forms.json
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

席位核对

ACCEPT · domain:devx#1 · session_01JQwxbaFpnMwgpCgneKe2qS · head 9df273fc49 · 2026-10-27T21:48Z

  1. Shape: 2 files, +55/−41: docs/qa/platform-checklist/areas/attachments-storage.json and docs/qa/platform-checklist/areas/records-forms.json. Not governed (check-governed-merges --pr 26907). File surface as in claim 6452171221; Fixes #26876.
  2. Read by the seat: the whole diff. qa-media-constraints declares namespace qamedia and its object becomes qamedia_media; qa-feeds-disabled declares qafeeds and qafeeds_nofeeds; field-group-visible-when moves to package com.objectstack.qa.group with namespace qagroup and object qagroup_group_gate (revision 7→8). Every step, acceptance clause and ref naming the old objects is rewritten. field-accept-maxsize-server-enforced goes to revision 6. record-discussion-mentions goes to revision 10, with history rows 9 (qa(checklist): records-forms — pin the Tier 1 clauses the 18.2.0 sweep scored partial at the layer their oracle names (21 items) #26573, landed by PR test(dogfood): pin the last records-forms checklist api clauses and name the live legs (slice 4) #26908) and 10 (qa(checklist): two more package-authored QA recipes (qa-media-constraints, qa-feeds-disabled) answer 422 NAMESPACE_PREFIX at their first object save, and neither may declare the namespace qa #26876). The thread's sweep of every area file found no other borrowed namespace.
  3. Gates: head check-runs on 9df273fc49: 26 success, 13 skipped, 0 failing; check-expected-skips --pr 26907: OK; mergeable clean against main 5ce3404a. Report 6453401661.
  4. Accepted deviations: the field-group item was folded in at the seat's request rather than carded separately, since it is the same defect on the same surface. The PR body was amended to record that, the new head and the 8→10 renumber.
  5. Out of scope: none found by the sweep. Skills-docs: not owed.
  6. Landing: not governed, CI green on this head, mergeable clean ⇒ the seat readies it and arms auto-merge through the relay. At merge qa(checklist): two more package-authored QA recipes (qa-media-constraints, qa-feeds-disabled) answer 422 NAMESPACE_PREFIX at their first object save, and neither may declare the namespace qa #26876 closes and leaves pm:dispatched.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 27, 2026 21:50
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 27, 2026 21:50
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit 8bbdb0b Oct 27, 2026
40 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-w4r8ig branch October 27, 2026 22:08
os-warren pushed a commit that referenced this pull request Oct 27, 2026
…discussion-mentions and fold the seat-requested stale texts

main's #26907 landed record-discussion-mentions revision 10, so this
branch's row becomes revision 11 after it. At the seat's request the
same commit retires the text the recipes made stale:
record-discussion-mentions automated.ref no longer says the walled leg
waits on this card; action-location-matrix steps[6] and
acceptance[4].verify name the qaact-placement-specimen recipe and the
surfaces that count; import-job-undo-cancel fixtures.requires[2] and
steps[0] name the qa-crm-import-console route, keeping the showcase
scratch-copy route as the alternative. The three history rows say so.

Claude-Session: https://claude.ai/code/session_01JQwxbXyxFGYMNdVd5maF1e
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants