diff --git a/.claude/launch.json b/.claude/launch.json index f2ec1bcf393..88bbab3b4a5 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -18,6 +18,52 @@ "file:/tmp/showcase-dogfood-3777/data.db" ], "port": 3777 + }, + { + "name": "showcase-scheduled-work-3778", + "runtimeExecutable": "env", + "runtimeArgs": [ + "OS_PORT=3778", + "OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1", + "pnpm", + "-C", + "examples/app-showcase", + "exec", + "objectstack", + "dev", + "--ui", + "--seed-admin", + "--no-compile", + "--no-watch", + "-p", + "3778", + "-d", + "file:/tmp/showcase-scheduled-work-3778/data.db" + ], + "port": 3778 + }, + { + "name": "showcase-react-pages-off-3779", + "runtimeExecutable": "env", + "runtimeArgs": [ + "OS_PORT=3779", + "OS_PAGE_REACT_ENABLED=false", + "pnpm", + "-C", + "examples/app-showcase", + "exec", + "objectstack", + "dev", + "--ui", + "--seed-admin", + "--no-compile", + "--no-watch", + "-p", + "3779", + "-d", + "file:/tmp/showcase-react-pages-off-3779/data.db" + ], + "port": 3779 } ] } diff --git a/docs/qa/platform-checklist/areas/studio-authoring.json b/docs/qa/platform-checklist/areas/studio-authoring.json index 4f9d1196c2d..3bdd4baf304 100644 --- a/docs/qa/platform-checklist/areas/studio-authoring.json +++ b/docs/qa/platform-checklist/areas/studio-authoring.json @@ -1282,7 +1282,7 @@ "title": "Source-authored page tiers render by the RIGHT path: kind:'html' source is PARSED-never-executed (static, in-browser sdui-parser compile), kind:'react' source is EXECUTED behind its capability gate (live data + interactivity) — command-center-jsx / capability-map (html) vs crm-workbench (react)", "since": "v16", "status": "active", - "revision": 5, + "revision": 6, "priority": "P2", "surface": "mixed", "personas": ["admin (seeded admin@objectos.ai) driving the published showcase app as an end user"], @@ -1290,7 +1290,7 @@ "app": "showcase", "requires": [ "seeded showcase_project rows (the react page's live KPI + read them)", - "the react-pages capability ON — CAP_REACT_PAGES defaults OFF and the showcase turns it on in its committed .env (OS_PAGE_REACT_ENABLED=true); a boot with OS_PAGE_REACT_ENABLED=false flips it OFF (the both-sides gate check)" + "the react-pages capability ON — CAP_REACT_PAGES defaults OFF and the showcase turns it on in its committed .env (OS_PAGE_REACT_ENABLED=true); a boot with OS_PAGE_REACT_ENABLED=false flips it OFF (the both-sides gate check): the .claude/launch.json entry showcase-react-pages-off-3779 boots the showcase that way, on its own port and DB with OS_PORT exported. The exported value beats the .env one, because dotenv-flow skips a variable the process already has" ], "knownGaps": [ "NO manual build step is needed to VIEW either tier in the running showcase (contra the task's guess): a kind:'html' page compiles IN-BROWSER via @object-ui/sdui-parser compile(source, manifest) at render, against a whitelist manifest built from the LIVE ComponentRegistry (packages/components/src/renderers/layout/page.tsx); a kind:'react' page is transpiled IN-BROWSER by a lazily-loaded Sucrase @object-ui/react-runtime chunk. The only build-shaped risk is the vendored /_console bundle being stale (stale-console-bundle) — a stale sdui-parser/react-runtime mis-compiles a page that is fine on a fresh build. ⚠ A FAULTING html source never reaches the RENDERED page on a stock boot: the metadata save door compiles an html page's source against the deployment's manifest with the same compiler `os validate` uses (packages/metadata-protocol/src/runtime-authoring-gate.ts#HTML_PAGE_SOURCE_COMPILE), so an active save or a publish of a faulting html page answers 422 INVALID_METADATA carrying the compile diagnostics, and nothing is served. The 'HTML page failed to compile (N)' panel is therefore reachable only in the page designer's DRAFT preview, where a ?mode=draft save of the faulting source is admitted and rendered (QA run #23166)", @@ -1304,7 +1304,7 @@ "crm-workbench (kind:'react'): open /_console/apps/showcase_app/page/showcase_crm_workbench; screenshot the workbench — the KPI strip (Total / Active) + the real and master/detail over showcase_project", "prove the react tier is EXECUTED against LIVE data: the 'Total projects' KPI equals GET /api/v1/data/showcase_project's count (the page computes it via useAdapter().find('showcase_project'), reading the QueryResult .data envelope), and a showcase_project find query fires on the network — the number is computed at render, not authored", "prove react interactivity (executed handlers, not a parsed tree): click a ListView row → the ObjectForm binds THAT record (React useState); click '+ New project' → the form switches to create mode", - "both-sides gate: on a boot with OS_PAGE_REACT_ENABLED=false, re-open crm-workbench — it must render the NAMED 'React pages are disabled on this deployment' notice (CapabilityDisabledNotice), never a blank and never an executed page; the html pages still render (html is not gated). If the env toggle cannot be flipped on the stock fixture, record this clause blocked(environment)", + "both-sides gate: boot the launch entry showcase-react-pages-off-3779 (OS_PAGE_REACT_ENABLED=false), sign in as the seeded admin and re-open crm-workbench — it must render the NAMED 'React pages are disabled on this deployment' notice (CapabilityDisabledNotice), never a blank and never an executed page; the html pages still render (html is not gated). If that entry cannot boot, record this clause blocked(environment)", "degradation: (a) html — save a faulting html source at the ACTIVE door (or publish one) and capture the 422 INVALID_METADATA with its compile diagnostics; then save the same source as a ?mode=draft draft IN A WRITABLE PACKAGE (?package=PKG) that also holds an app whose navigation references the page, and open it in Studio at /_console/studio/PKG/interfaces?surface=page:NAME, where the draft preview's 'HTML page failed to compile (N)' panel renders with the diagnostic messages. An env-wide (package-less) draft has no Studio surface, and the save gate keeps a faulting html page off the rendered route, so the panel cannot be met anywhere else (knownGaps[0]); (b) react — a react runtime error shows the 'React page error' fallback on the rendered page. Neither may be a blank page" ], "acceptance": [ @@ -1369,7 +1369,8 @@ { "revision": 2, "date": "2026-10-13", "change": "acceptance[5] (clause and verify), steps[7] and knownGaps[0] name where an html compile error is observable (assertion defect, minor, #23166 A5; parked on #23121, carried by #23169). The save door compiles an html page's source against the deployment's manifest (runtime-authoring-gate.ts HTML_PAGE_SOURCE_COMPILE), so a faulting html page is refused 422 INVALID_METADATA at save / publish and never publishes, and the compile-error panel is reachable only in the designer's draft preview. QA run #23166 met the 422 and the draft-preview panel. The react half is unchanged", "ref": "#23169" }, { "revision": 3, "date": "2026-10-16", "change": "steps[7](a) names how to reach the draft preview (checklist-accuracy finding 8 of QA run #23942, wave #23878). The compile panel is reachable only for a page staged in a writable package that an app's navigation references, opened at /_console/studio/PKG/interfaces?surface=page:NAME; an env-wide draft has no Studio surface, which is what #23942 met. The clause is unchanged", "ref": "#24036" }, { "revision": 4, "date": "2026-10-25", "change": "the react-pages tier defaults OFF (ADR-0081 amendment): fixtures.requires names the showcase's committed .env opt-in OS_PAGE_REACT_ENABLED=true, and the both-sides gate's off-state is a boot with OS_PAGE_REACT_ENABLED=false (steps[6], acceptance[4], negative[1], source rows). The clauses are unchanged", "ref": "claude/project-thread-80dotk" }, - { "revision": 5, "date": "2026-10-28", "change": "knownGaps/source re-pointed from ui/e2e/live/showcase-smoke.spec.ts, deleted by the triage of the live specs that ran in no CI lane (ruling Q3 B) as a duplicate: every surface it swept and each of its four assertions are in examples/app-showcase/e2e/showcase-smoke.spec.ts, which Nightly Tiers runs, with a wider surface list and stricter waits. That sweep includes the three html/react pages, which the old note said it did not; it pins render-clean only, so the item stays browser-driven. No clause changed", "ref": "#25914" } + { "revision": 5, "date": "2026-10-28", "change": "knownGaps/source re-pointed from ui/e2e/live/showcase-smoke.spec.ts, deleted by the triage of the live specs that ran in no CI lane (ruling Q3 B) as a duplicate: every surface it swept and each of its four assertions are in examples/app-showcase/e2e/showcase-smoke.spec.ts, which Nightly Tiers runs, with a wider surface list and stricter waits. That sweep includes the three html/react pages, which the old note said it did not; it pins render-clean only, so the item stays browser-driven. No clause changed", "ref": "#25914" }, + { "revision": 6, "date": "2026-11-04", "change": "fixtures.requires[1] and steps[6] name the .claude/launch.json entry showcase-react-pages-off-3779 as the off-state boot of the both-sides gate. QA run #29672 could not flip the env, because a runner that starts servers only from launch.json had no such entry. No clause changed", "ref": "#29819" } ] }, { @@ -2651,7 +2652,7 @@ "title": "The flow state Studio shows is the state the deployment runs: the rail dot and the header read what GET /api/v1/automation/_status reports — Switched on, Switched off, Not running here with the platform's reason — and an enabled record-triggered flow actually runs", "since": "v18", "status": "active", - "revision": 4, + "revision": 5, "priority": "P1", "surface": "mixed", "personas": [ @@ -2662,7 +2663,7 @@ "requires": [ "a fresh boot of the showcase on its own port and DB (dogfood §0) with OS_PORT exported, signed in as the seeded admin, and a console built from this tree with `pnpm console:build` — the root `pnpm build` does not refresh packages/console/dist (QA run #26715 needed the console build on every card)", "a writable package with a published object, a record-triggered flow on it (created Off), a manual flow, and a schedule flow", - "TWO boots for the schedule leg, named in the run record: a default boot (package-authored scheduled work OFF) and a boot with OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1 exported (RUNNER.md environment facts)" + "TWO boots for the schedule leg, named in the run record: a default boot (package-authored scheduled work OFF) and a boot with OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1 exported (RUNNER.md environment facts), which is the .claude/launch.json entry showcase-scheduled-work-3778 (its own port and DB, OS_PORT exported). Its DB starts fresh, so author the writable package and its schedule flow again on that boot" ] }, "steps": [ @@ -2670,8 +2671,8 @@ "enable the record-triggered flow with the header switch (it was Off by default); read the toast ('Switched on — publish to apply', engine.studio.auto.enabledToast); publish; re-read the rail, the header and _status", "create a record of the watched object (POST /api/v1/data/OBJ) and read the flow's runs for it", "read the schedule flow on the default boot: its dot and header read 'Not running here', titled with the platform's reason, and Problems carries a note (not counted as a problem); _status answers bound: false with that same reason", - "reboot with OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1 exported; re-read the schedule flow in Studio and _status, and wait for its first run", - "disable the record-triggered flow; publish; create another record and confirm no new run" + "boot the launch entry showcase-scheduled-work-3778 (OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1) beside the default boot and author the schedule flow there; re-read the schedule flow in Studio and _status, and wait for its first run", + "on the default boot, disable the record-triggered flow; publish; create another record and confirm no new run" ], "acceptance": [ { @@ -2693,7 +2694,7 @@ "evidence": "the run reads" }, { - "clause": "on the boot that enables scheduled work, the same schedule flow reads 'Switched on', _status reports bound: true, and it runs", + "clause": "on the boot that enables scheduled work, a schedule flow authored the same way reads 'Switched on', _status reports bound: true, and it runs", "oracle": "api", "verify": "Studio's words and _status agree on the second boot; a run with trigger type schedule completes within the schedule window", "evidence": "the second-boot pairing + the run" @@ -2741,6 +2742,12 @@ "date": "2026-11-04", "change": "title, steps[1], acceptance[0].clause and acceptance[3].clause respelled from QA run #29893 (W5-STUDIO, at 589049b0): rail sr-text and header Status read 'Switched on' / 'Switched off', and the toasts 'Switched on — publish to apply' / 'Switched off — publish to apply' (#29784 / #29841). Read at base f68b47ca", "ref": "#29906" + }, + { + "revision": 5, + "date": "2026-11-04", + "change": "fixtures.requires[2] and steps[4] name the .claude/launch.json entry showcase-scheduled-work-3778 as the schedule leg's second boot. QA run #29672 could not reboot with the switch, because a runner that starts servers only from launch.json had no such entry. That entry has its own port and DB, so it runs beside the default boot, the step authors the schedule flow again there, and steps[5] stays on the default boot. acceptance[3].clause now reads 'a schedule flow authored the same way' instead of 'the same schedule flow', since that boot holds a re-authored copy; what it asserts is unchanged", + "ref": "#29819" } ] },