Skip to content

scenario: signup/onboarding ships ready (data-collection)#18

Merged
ryandmonk merged 1 commit into
mainfrom
feat/onboarding
Jul 21, 2026
Merged

scenario: signup/onboarding ships ready (data-collection)#18
ryandmonk merged 1 commit into
mainfrom
feat/onboarding

Conversation

@ryandmonk

Copy link
Copy Markdown
Contributor

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-label is universal — so the scenario's old "Labeled inputs, enforced" tagline over-claimed and is rewritten. What the new data-collection intent 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-menu for 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-repair attempt — 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 main inconsistency from #17: the lockfile carried specifier: ^0.1.2 while apps/agent/package.json said ^0.1.1 (pnpm -r up rewrote 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:

5 failed
  onboarding is a ready, selectable scenario on the shelf
  clean replay: a live run straight through the gates to a labeled form
  repair replay: a text-only ask caught by the form rule, repaired surface ships
  refusal replay: a non-signup ask meets the vocabulary's honest limit
  permalink: an onboarding deep link resolves

studio-shell.spec.ts's planned-reveal test retargets scenario-hotel-reservations (the last planned entry) — a retarget that passes on both builds, not a new assertion.

Gates

  • pnpm -r typecheck / pnpm -r test green; contracts build:catalogs + drift-check clean.
  • Local Playwright: 102 passed, 4 skipped (97 + 5 new).
  • Production config against the local deploy artifact: 82 passed.
  • One live agent run on the published package: clean first pass — card, two labeled inputs, primary button; audit passed.

🤖 Generated with Claude Code

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>
Copilot AI review requested due to automatic review settings July 21, 2026 21:27

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-collection intent + rule.data-collection-requires-input-and-action and a worked example to astryx.dspack.json.
  • Promote onboarding to ready with fixtures 012/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 thread pnpm-lock.yaml
Comment on lines +52 to 53
specifier: ^0.1.1
version: 0.1.2(zod@4.4.3)
@ryandmonk
ryandmonk merged commit 01f935d into main Jul 21, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants