Repository navigation
Description
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Filing gate: ② follow-up of #30349 (scenario library T8), carrying out the maintainer's write-path ruling D2 of 2026-11-06 14:53Z. ⛔ Not a claim. Triage sets the grade and the lane.
Business reason. The gallery README promises the whole gallery is rebuilt after every ObjectStack release. The exporter (PR #30930, c571165dae) writes the gallery layout to a local directory, but nothing ever runs it. The maintainer ruled that the trigger is a scheduled Claude Code task in this project's cloud environment, not a person. The task runs the scenarios and the export, then opens a PR on objectstack-ai/gallery, which the maintainer merges with one click. After three clean runs he may switch it to pushing main directly (D1). The full analysis, including §8–9, is in the project files at issue-30349/decision-analysis.md.
What the ruling settled (not open here)
- Who runs it: a scheduled cloud Claude Code task, which uses the maintainer's subscription login. It is not API-billed, and it was measured in this project's cloud container:
claude2.1.318 is installed;auth statusreportsoauth_token/firstParty;- neither
ANTHROPIC_API_KEYnorANTHROPIC_AUTH_TOKENis set; - a nested
claude -pworks; - Chromium is preinstalled.
- Where it writes: a branch
export/<version>on objectstack-ai/gallery plus a PR. Gallery commits carry the maintainer's GitHub identity, not the fleet bot's. - How often: daily. It skips silently when the gallery's
index.jsonframework.versionalready equals npm's latest stable@objectstack/cli, the same shape as the ci(release): start thenextsnapshot preflight on a daily schedule, stopping at the maintainer approval (ADR-0125 amendment + release.yml) #30832 snapshot pre-check.
Where (origin/main)
packages/qa/scenarios/src/runner/driver.ts: the header says "a LOCAL Claude Code session …, never a cloud agent". That is the dev's reading of the cost ruling, and D2 supersedes it.ClaudeCodeDriver's API-key refusal stays exactly as it is.packages/qa/scenarios/src/runner/cli.ts: there is no--modelflag, so a run cannot pick a cheaper alias to save subscription quota.packages/qa/scenarios/src/export/(export-gallery): exports only from a local--runsdirectory, and refuses every card until Scenario cards: an explicit origin marker (generic / customer-derived / held-out) and a zh+en title, so the gallery exporter can export anything #30932 lands (NO_GENERIC_MARKER).- No entry point does the whole chain (version check → run → export → commit) in one deterministic step.
Wanted
- One deterministic entry point in
packages/qa/scenarios, for examplegallery-refresh --gallery DIR [--cards …] [--model ALIAS] [--debut]. It must:- read npm's latest stable
@objectstack/cliand the gallery checkout'sindex.jsonframework.version; - when they are equal, exit 0 with a one-line
skip: <reason>(a quiet skip); - otherwise run the scenarios against that released version, export with screenshots into the gallery checkout, and commit on the branch
export/<version>; - print the branch and a PR body.
It never pushes and never opens the PR; the scheduled task does that. Every refusal exits non-zero and says why.
- read npm's latest stable
--modelon the runner, passed through toclaude -p --model.- The
driver.tsheader names ruling D2. A local session or a scheduled cloud task on the maintainer's subscription login is allowed. An API-billed model is still never allowed. - Debut:
--debutexports one card (the gallery's first app) so the whole chain is proved once. After that, everystarteranddeliverycard is exported, nevercontrol(thetierrule, comment 6687463653). - A runbook in the package README: the exact prompt the scheduled task carries (clone the gallery, run
gallery-refresh, push the branch, open the PR, and on failure file or refresh one deduplicated card). The seat creates the scheduled task from that text once this lands.
Depends on
- Scenario cards: an explicit origin marker (generic / customer-derived / held-out) and a zh+en title, so the gallery exporter can export anything #30932: the
origin: genericmarker and the{zh, en}title. Until it lands, the exporter refuses every card and the debut exports nothing. - The maintainer adds objectstack-ai/gallery to this project's environment resources, so the cloud task can clone and push it.
Level: QA tooling. Clause-②: no, Metadata-protocol: none. Nothing here touches the published packages.
Dedupe (open and closed): "scheduled gallery routine", "gallery index.json framework.version" and "never a cloud agent" turned up only #30349 itself. New.
Related: #30349, PR #30930, #30932, #30832, #30970.
Reader: the domain:devx lane seat, from pm:queue, after #30932 lands.
Activity
objectstack-fleet commentedon Nov 7, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 kept ·
domain:devx· 2026-11-07T13:57Z⛔ Not a claim.
domain:devx,area:devpathandpm:queuekept. Serial with objectstack-ai/gallery: a read-only check workflow on every PR (index schema, complete app directories, no stray files) and a PR-only main, before the scheduled export writes there #31122: the PR the task opens is safe to merge in one click only once objectstack-ai/gallery: a read-only check workflow on every PR (index schema, complete app directories, no stray files) and a PR-only main, before the scheduled export writes there #31122's check exists.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Claim: PM loop round 1
Session:
session_01FEkQ5njkh3xbcDN6EtSfw7Account:
os-project-managerBranch:
claude/project-thread-3d8sgq(a project card thread,session_01FEkQ5pZeHgu9hYkeNdBNEA; the thread can push only its harness branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-31121Domain:
domain:devxSeat:
domain:devx#3File surface:
packages/qa/scenarios/**(gallery-refresh entry point, tests, README runbook), onepatchchangeset. ⛔ The objectstack-ai/gallery repo and the scheduled task itself are out of scope (#31122 is that half).Container & model:
M,mode:thread,model: default — read dispatch-gates --tier on the real diff,effort: mediumClause-②: yes — a new
gallery-refreshentry point on the published@objectstack/scenarioswidens its surface; the PR body carries the readingMetadata-protocol: none
Responsibility: n/a — internal tooling/test/docs defect, no user door
Thread-read: 6707847878
Premise: holds on main
7c523aa10. No gallery-refresh entry exists;--modelexists from PR #31204; #30932 is closed. Parallel with #30913 on the same package: merge on conflict.Ruling-ref: p2 by triage. Maintainer 「并发5」 (2026-11-07T23:53Z).
Order:
pm-orders/devx/order-31121.md(project files), handed to the card thread in its opening message.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5pZeHgu9hYkeNdBNEA
os-dev-report
{
"issue": 31121,
"status": "done",
"branch": "claude/project-thread-3d8sgq",
"pr": "#31313",
"head": "de7c89c59f",
"session": "session_01FEkQ5pZeHgu9hYkeNdBNEA",
"premise_still_valid": true,
"summary": "New gallery-refresh entry in @objectstack/scenarios (src/export/refresh.ts, CLI src/export/refresh-cli.ts, package script gallery-refresh): reads npm latest @objectstack/cli and every listed app framework.version in the gallery index.json; quiet one-line skip (exit 0) when every listed app is on it or a remote-tracking export/VERSION branch exists; otherwise runs every GALLERY_GUARD-eligible card (--debut: the first by id, only into an empty gallery) via run-scenarios --modes scratch --packages published --create-version VERSION, exports with screenshots into the checkout, commits apps/ and index.json on a new local export/VERSION and prints branch, commit and PR body. Never pushes. Every refusal exits 1 with its reason. driver.ts header names ruling D2; README gains the gallery-refresh section and the scheduled task runbook with its prompt verbatim; one patch changeset. Premise reading: index.json has no top-level framework.version (the strict schema carries it per app), so the skip reads every listed app; no index field added.",
"change": "packages/qa/scenarios: src/export/refresh.ts (new), src/export/refresh-cli.ts (new), src/export/index.ts (re-exports refresh.ts), src/export/cli.ts (liveScreenshots extracted, no behaviour change), src/runner/driver.ts (header only), package.json (script gallery-refresh), README.md (new section + runbook), test/export/refresh.test.ts (new, 17 cases); .changeset/31121-scenarios-gallery-refresh.md (patch).",
"files_changed": 9,
"line_budget": "+911 / -10 (921 changed lines, under the 3000 human-merge threshold; dispatch-gates --tier: no path-derived model mandate)",
"tests": "Head de7c89c. pnpm --filter @objectstack/scenarios test under the lock after the package build: Test Files 31 passed (31), Tests 608 passed (608), VERDICT command-exit 0. typecheck (tsc --noEmit, --listFiles includes test/export/refresh.test.ts) exit 0. New file refresh.test.ts 17/17: real git gallery checkout with a bare origin, stubbed npm reader, run step = real crm card through runCard with the fixture scripted model inside RecordingDriver. Ablations via scripts/ablation-replace.mjs on de7c89c (src imported directly, no dist leg), each 1 failed | 16 skipped then restored blob == HEAD, git diff HEAD empty: A1 framework-version check, A2 --debut over a listed app, A3 the skip rule, A4 change outside apps/ and index.json, A5 dirty checkout.",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 74 commands, all run on de7c89c, exit captured before any pipe; 72 exit 0 first pass; check-plugin-teardown-shape --self-test exit 3 (shallow) then exit 0 after git fetch --depth=1 of its pinned sha; pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET) then exit 0 after full turbo build under the lock. --ran: 74 derived famil(ies) accounted for, 74 run, 0 NOT-MEASURED. Extra: pnpm --filter @objectstack/spec run check:error-code-provenance exit 0; check-changeset-no-major against the PR body exit 0 (clause-2 yes, patch); eslint packages/qa/scenarios --no-inline-config exit 0. CI check-runs: in_progress at report time (read by the seat). Gate file: pm-orders/devx/31121-gates-ran.txt.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — relay pr_create (fleet-write run 42431177078 → PR #31313, body read back byte-identical, no labels, no assignees) and this os-dev-report comment via post-stamped.mjs; plus git push of the harness branch",
"deviations": [
"PR opened with no labels: the order names none and the diff carries a changeset (no skip-changeset); the relay refuses an empty labels list, so the key was omitted.",
"No assignees on pr_create, per the order and AGENTS.md; os-dev.md rule 2 reads the other way (known conflict, as on #31140)."
],
"open_questions": [
{
"question": "After a --debut the gallery lists one app on version V, so every later run skips until npm latest moves past V: the full gallery first appears with the next stable release. Keep that, or add a way to force a full refresh at the same version?",
"options": [
"A keep as is: no new flag, the full gallery comes with the next release",
"B add --force (skip check bypassed) for a one-off full run after the debut"
],
"recommendation": "A, because the ruling names no force flag, releases are frequent, and a flag that bypasses the skip is one more way for the scheduled task to spend hours of quota by mistake; B only if the maintainer wants the full gallery before the next release."
}
],
"security_findings": "none",
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:devx#3 · os-project-manager · session_01FEkQ5njkh3xbcDN6EtSfw7
Landed 2026-11-08T01:57Z · PR #31313 merged through the merge queue at 2026-11-08T01:55Z, as
518d1bddae16a418111c857efce2fce111198caa.merged: true, merge commit518d1bddae, head reviewedde7c89c59f(ACCEPT on the PR)Fixes #31121State change:
pm:dispatchedremoved. Still owed outside this card: #31122 (the gallery-repo half), and the maintainer addingobjectstack-ai/galleryto the environment before the scheduled task starts. Two README wording nits (the post-debut skip, a kept export branch holding the skip) are recorded on the PR for the next README edit.