scenario: signup/onboarding ships ready (data-collection)#18
Merged
Conversation
Fifth ready scenario, on the support-triage template: replay-first, zero per-scenario code, shipped atomically. The honesty split is the headline: labels were ALWAYS enforced (the universal rule.input-carries-label), so the old "Labeled inputs, enforced" tagline over-claimed and is rewritten. What the new intent adds is structural — rule.data-collection-requires-input-and-action (component-choice, must): an ask without a field is not a form, and a form that cannot be submitted does not ship. Deliberately no layout, field-count, or form-shape mandates: data collection is not equivalent to signup forms. Rationales quote the Astryx TextInput and Button docs verbatim. Durability check (owner requirement): a non-signup probe — workspace access request: name, work email, team — produced an honest form under the same intent and rules, and, unforced, the scenario's refusal story: the model picked dropdown-menu for the team select, which lints clean but the astryx profile cannot project. The intent generalizes; the select gap is a component-vocabulary limit (the hotel-reservations blocker class), not an intent flaw. Fixtures (Spark, ollama:gpt-oss:latest, published dspack-gen 0.1.2): - fixture-013 argues-back: first --require-repair attempt — a text-only welcome card, S3 fails on the new rule, repair ships a labeled email field and a "Join now" action. - fixture-012 clean: first pass to a labeled name+email form with one primary action (close to the worked example's shape; noted honestly). - fixture-014 refusal: the access-request recording, reproduced on the second roll (the first was a clean pass, discarded). Also fixes a main inconsistency this session introduced: the #17 lockfile carried specifier ^0.1.2 while apps/agent/package.json said ^0.1.1 (pnpm -r up rewrote the specifier; only the lockfile was committed). The agent dep floor is now an explicit ^0.1.2 — which it behaviorally requires — with the lockfile matching. Fail-first: pre-contract recording failed with "intent 'data-collection' is not registered"; all five onboarding.spec.ts tests failed on the old registry. studio-shell's planned-reveal test retargets hotel-reservations (the last planned entry) — a retarget that passes on both builds, not a new assertion. Gates: pnpm -r typecheck/test green; contracts build+drift clean; local Playwright 102 passed / 4 skipped; production config vs the local deploy artifact 82 passed; one live agent run on published 0.1.2 produced a clean labeled form. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Ships the signup/onboarding scenario as a “ready” scenario by introducing a new data-collection intent (with governance), adding three replay fixtures, wiring the scenario into the registry/break conditions, and covering it with e2e + production Playwright configuration.
Changes:
- Add
data-collectionintent +rule.data-collection-requires-input-and-actionand a worked example toastryx.dspack.json. - Promote
onboardingto ready with fixtures012/013/014, add a break condition, and add new e2e coverage (e2e/onboarding.spec.ts). - Dependency/lockfile housekeeping + include onboarding in production Playwright runs; update docs to reflect the scenario’s new status.
Reviewed changes
Copilot reviewed 13 out of 14 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| pnpm-lock.yaml | Adjusts importer specifier for @aestheticfunction/dspack-gen (apps/web section). |
| playwright.production.config.ts | Adds onboarding.spec.ts to production testMatch. |
| packages/scenarios/src/registry.ts | Promotes onboarding to ready; adds prompts, break-it prompt, and fixture wiring. |
| packages/scenarios/src/break-conditions.ts | Extends scenarioId union; adds onboarding break condition entry. |
| packages/replay/fixtures/fixture-012.json | Adds “clean first pass” live replay fixture for onboarding. |
| packages/replay/fixtures/fixture-013.json | Adds governed-repair (“argues back”) live replay fixture for onboarding. |
| packages/replay/fixtures/fixture-014.json | Adds emitter refusal live replay fixture documenting profile mapping limits. |
| packages/contracts/astryx.dspack.json | Adds data-collection intent, a new governance rule, and ex.signup-basic example. |
| e2e/studio-shell.spec.ts | Retargets planned-scenarios reveal test to the last planned scenario. |
| e2e/onboarding.spec.ts | New e2e spec validating shelf readiness, replays, refusal, and permalink behavior. |
| docs/NAV-REFACTOR.md | Updates scenario taxonomy (onboarding now ready; hotel-reservations planned). |
| docs/IMPLEMENTATION_LOG.md | Logs the onboarding scenario shipment and rationale. |
| docs/AUDIT.md | Updates audit status summary to include onboarding as ready. |
| apps/agent/package.json | Bumps @aestheticfunction/dspack-gen dependency to ^0.1.2. |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "props": { | ||
| "type": "body" | ||
| }, | ||
| "text": "Name and email is all it takes. You can add the rest later." |
Comment on lines
+52
to
53
| specifier: ^0.1.1 | ||
| version: 0.1.2(zod@4.4.3) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The fifth ready scenario, on the support-triage template: replay-first, zero per-scenario code, shipped atomically (contract + fixtures + registry + break condition + spec + docs).
The honest story
Labels were always enforced —
rule.input-carries-labelis universal — so the scenario's old "Labeled inputs, enforced" tagline over-claimed and is rewritten. What the newdata-collectionintent adds is structural:rule.data-collection-requires-input-and-action(component-choice, must, require["text-input","button"]) — an ask without a field isn't a form, and a form that can't be submitted doesn't ship. Deliberately no layout, field-count, or form-shape mandates: data collection is not equivalent to signup forms. Rationales quote the Astryx TextInput and Button docs verbatim (pulled via the astryx CLI).Durability check (the owner's guard)
A non-signup probe — "request access to a private workspace: name, work email, team" — produced an honest form under the same intent and rules. It also produced, unforced, the scenario's refusal story: the model chose
dropdown-menufor the team select, which lints clean but the astryx profile cannot project. Conclusion: the intent generalizes beyond signup; the select gap is a component-vocabulary limit (the hotel-reservations blocker class), not an intent-design flaw. That recording ships as the third fixture because it emerged from the durability probe — not for fixture-count symmetry.Fixtures (Spark Ollama,
ollama:gpt-oss:latest, published dspack-gen 0.1.2 — no linked checkout)fixture-013"the interface argues back": first--require-repairattempt — the model obeys the text-only prompt (card + welcome text, nothing to fill in), S3 fails on the new rule, and the repair ships a labeled email field + a "Join now" action.fixture-012"clean first pass": labeled name+email form with one primary action. It hews close to the worked example's shape — the few-shot steers hard; noted honestly.fixture-014"the emitter refuses": the access-request ask; reproduced on the second roll (the first roll was a clean pass and was discarded, not massaged).Deps housekeeping
Fixes a
maininconsistency from #17: the lockfile carriedspecifier: ^0.1.2whileapps/agent/package.jsonsaid^0.1.1(pnpm -r uprewrote the specifier but only the lockfile was committed) — a frozen-lockfile install would trip on it. The agent dep floor is now an explicit^0.1.2, which it behaviorally requires, with the lockfile matching.Fail-first evidence
Pre-contract:
Error: intent 'data-collection' is not registered in the contract (known: destructive-action, scheduling, structured-editing, record-collection). Against the old registry:studio-shell.spec.ts's planned-reveal test retargetsscenario-hotel-reservations(the last planned entry) — a retarget that passes on both builds, not a new assertion.Gates
pnpm -r typecheck/pnpm -r testgreen; contractsbuild:catalogs+drift-checkclean.🤖 Generated with Claude Code