session-orchestrator 4.2.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/.agents/skills/session-start/SKILL.md +1 -1
  2. package/.agents/skills/ux-grill/SKILL.md +22 -0
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/.claude-plugin/plugin.json +3 -2
  5. package/.codex-plugin/plugin.json +1 -1
  6. package/.codex-plugin/skills/session-start/SKILL.md +1 -1
  7. package/.codex-plugin/skills/ux-grill/SKILL.md +21 -0
  8. package/.codex-plugin/skills/ux-grill/agents/openai.yaml +5 -0
  9. package/.cursor/commands/ux-grill.md +14 -0
  10. package/.cursor/skills/session-start/SKILL.md +1 -1
  11. package/.cursor/skills/ux-grill/SKILL.md +13 -0
  12. package/.cursor-plugin/plugin.json +1 -1
  13. package/AGENTS.md +2 -1
  14. package/CHANGELOG.md +94 -1
  15. package/README.md +98 -86
  16. package/agents/dialectic-deriver.md +11 -0
  17. package/commands/ux-grill.md +51 -0
  18. package/docs/USER-GUIDE.md +2 -2
  19. package/docs/codex-setup.md +8 -0
  20. package/docs/components.md +7 -7
  21. package/docs/events-schema.md +9 -5
  22. package/docs/github-mirror-protection.md +61 -20
  23. package/docs/migration-v5.md +62 -0
  24. package/docs/scope-collision-guard.md +14 -0
  25. package/hooks/_lib/hook-import-set.json +44 -2
  26. package/hooks/_lib/lock-bootstrap.mjs +84 -1
  27. package/hooks/_lib/vcs-create-matcher.mjs +190 -3
  28. package/hooks/enforce-scope.mjs +201 -0
  29. package/hooks/hooks-codex.json +1 -1
  30. package/hooks/hooks-cursor.json +5 -0
  31. package/hooks/hooks.json +7 -2
  32. package/hooks/on-session-start.mjs +171 -49
  33. package/hooks/post-bash-issue-budget-refund.mjs +375 -0
  34. package/hooks/pre-auq-clarity.mjs +70 -18
  35. package/hooks/pre-bash-issue-budget.mjs +51 -4
  36. package/package.json +2 -1
  37. package/pi/prompts/ux-grill.md +12 -0
  38. package/scripts/ci/assert-vitest-green.mjs +4 -2
  39. package/scripts/dialectic-deriver.mjs +32 -8
  40. package/scripts/emit-session.mjs +72 -1
  41. package/scripts/lib/agent-status.mjs +441 -9
  42. package/scripts/lib/auq/schema.mjs +10 -3
  43. package/scripts/lib/ci-status-banner.mjs +29 -6
  44. package/scripts/lib/claude-md-budget-lint.mjs +52 -2
  45. package/scripts/lib/config.mjs +12 -1
  46. package/scripts/lib/eval/engine.mjs +7 -1
  47. package/scripts/lib/file-lock.mjs +114 -13
  48. package/scripts/lib/git-porcelain.mjs +113 -0
  49. package/scripts/lib/instruction-budget-guard.mjs +415 -47
  50. package/scripts/lib/io.mjs +29 -4
  51. package/scripts/lib/issue-budget.mjs +336 -6
  52. package/scripts/lib/learnings/sizing-subject.mjs +44 -0
  53. package/scripts/lib/locks/staging-fence-lock.mjs +19 -38
  54. package/scripts/lib/locks/state-md-lock.mjs +19 -41
  55. package/scripts/lib/maintenance-due-banner.mjs +11 -1
  56. package/scripts/lib/peer-cards/merger.mjs +143 -0
  57. package/scripts/lib/pre-dispatch-check.mjs +20 -14
  58. package/scripts/lib/project-hygiene.mjs +81 -30
  59. package/scripts/lib/quality-gate.mjs +14 -65
  60. package/scripts/lib/reconcile/engine.mjs +19 -1
  61. package/scripts/lib/reconcile/writer.mjs +278 -11
  62. package/scripts/lib/scope-echo.mjs +346 -0
  63. package/scripts/lib/session-lock.mjs +62 -2
  64. package/scripts/lib/session-record-repair.mjs +91 -0
  65. package/scripts/lib/session-schema/filters.mjs +26 -1
  66. package/scripts/lib/session-start-probes.mjs +419 -53
  67. package/scripts/lib/test-runner/artifact-paths.mjs +30 -5
  68. package/scripts/lib/test-runner/issue-reconcile.mjs +45 -8
  69. package/scripts/lib/tmux-layout/layouts.mjs +62 -4
  70. package/scripts/lib/ux-grill/collect.mjs +1163 -0
  71. package/scripts/lib/ux-grill/compare.mjs +285 -0
  72. package/scripts/lib/ux-grill/manifest.mjs +618 -0
  73. package/scripts/lib/ux-grill/measures.mjs +431 -0
  74. package/scripts/lib/ux-grill/paths.mjs +224 -0
  75. package/scripts/lib/ux-grill/pencil-coverage.mjs +284 -0
  76. package/scripts/lib/ux-grill/reconcile.mjs +344 -0
  77. package/scripts/lib/ux-grill/run-record.mjs +316 -0
  78. package/scripts/lib/ux-grill/schema.mjs +321 -0
  79. package/scripts/lib/validate/check-untracked-test-deps.mjs +33 -19
  80. package/scripts/lib/validate/check-unwired-features.mjs +48 -20
  81. package/scripts/lib/vault-status/board-lock.mjs +18 -0
  82. package/scripts/lib/vault-status/board-writer.mjs +8 -0
  83. package/scripts/mcp-server.sh +16 -1
  84. package/scripts/release.mjs +7 -2
  85. package/skills/bootstrap/SKILL.md +12 -209
  86. package/skills/bootstrap/references/bootstrap-ecosystem-health-flow.md +48 -0
  87. package/skills/bootstrap/references/bootstrap-refresh-lock-flow.md +37 -0
  88. package/skills/bootstrap/references/bootstrap-retroactive-flow.md +108 -0
  89. package/skills/bootstrap/references/bootstrap-rules-fetch-bridge.md +64 -0
  90. package/skills/claude-md-drift-check/SKILL.md +9 -2
  91. package/skills/claude-md-drift-check/checker.mjs +213 -21
  92. package/skills/discovery/SKILL.md +6 -173
  93. package/skills/discovery/probes/vault-staleness.mjs +35 -5
  94. package/skills/discovery/probes-docs.md +8 -4
  95. package/skills/discovery/probes-supply-chain.md +4 -2
  96. package/skills/discovery/probes-ui.md +7 -3
  97. package/skills/discovery/probes-vault.md +12 -4
  98. package/skills/discovery/references/discovery-interactive-triage.md +139 -0
  99. package/skills/discovery/references/discovery-triage-state.md +54 -0
  100. package/skills/eval/rubric-v1.md +13 -0
  101. package/skills/evolve/SKILL.md +2 -458
  102. package/skills/evolve/references/evolve-analyze-mode.md +360 -0
  103. package/skills/evolve/references/evolve-dialectic-mode.md +139 -0
  104. package/skills/plan/mode-retro.md +4 -3
  105. package/skills/reconcile/SKILL.md +10 -0
  106. package/skills/session-end/drift-operations.md +20 -5
  107. package/skills/session-end/metrics-collection.md +1 -0
  108. package/skills/session-end/phase-3-6-tail.md +4 -2
  109. package/skills/session-end/references/phase-2-quality-gate.md +3 -3
  110. package/skills/session-end/references/phase-5-issue-cleanup.md +6 -1
  111. package/skills/session-end/session-metrics-write.md +2 -0
  112. package/skills/session-plan/SKILL.md +2 -144
  113. package/skills/session-plan/references/session-plan-task-classification.md +152 -0
  114. package/skills/session-start/SKILL.md +24 -6
  115. package/skills/session-start/references/operations-contract.md +114 -0
  116. package/skills/session-start/references/phase-4-ssot-environment-check.md +22 -20
  117. package/skills/session-start/soul.md +2 -2
  118. package/skills/test-runner/SKILL.md +1 -1
  119. package/skills/tmux-layout/SKILL.md +3 -1
  120. package/skills/ux-grill/SKILL.md +211 -0
  121. package/skills/ux-grill/rubric-v2.md +201 -0
  122. package/skills/ux-grill/soul.md +76 -0
  123. package/skills/wave-executor/SKILL.md +3 -128
  124. package/skills/wave-executor/references/wave-executor-quality-gate.md +61 -0
  125. package/skills/wave-executor/references/wave-executor-state-init.md +86 -0
  126. package/skills/wave-executor/references/wave-loop-dispatch.md +8 -0
  127. package/skills/wave-executor/references/wave-loop-review.md +18 -5
  128. package/templates/_shared/ux-manifest.template.md +149 -0
  129. package/templates/_shared/journey-manifest.md +0 -114
@@ -119,6 +119,19 @@ Log every non-`pass` result as an event to `.orchestrator/metrics/events.jsonl`
119
119
 
120
120
  Cross-reference `.claude/rules/verification-before-completion.md` § VBC-004 Exception 2: a subagent's `STATUS: done` is a claim that needs its own verification — this step is that verification for the file-write side effect. `$WAVE_PREDISPATCH_HEAD` is the HEAD snapshot captured before this wave dispatched (same snapshot used by `### 3c. File-level grounding`). When `persistence: false` (no STATE.md), still perform the check and surface any violation in the wave progress update; only the deviation-write is skipped.
121
121
 
122
+ 3d-bis. **Scope-echo check (#1092)** (per agent, INFORMATIONAL — never blocks): the send-side `orchestrator.wave_dispatch.scope_checked` record says what the guard saw in the prompt the coordinator handed to the dispatch tool; nothing observes the receive side. This step collects the one signal that is available — the agent's own echo of the digest injected in `wave-loop-dispatch.md` § Pre-Dispatch: File-Scope Injection.
123
+
124
+ For each agent that reported, write its final report text to a file and run:
125
+
126
+ ```bash
127
+ node scripts/lib/scope-echo.mjs --scope-file "<state-dir>/filescopes/wave-<N>/<agent-id>.json" \
128
+ --report-file "<report.txt>" --wave <N> --agent-id "<agent-id>" --emit
129
+ ```
130
+
131
+ `checkScopeEcho` prints the verdict as JSON and `--emit` appends one `orchestrator.wave_dispatch.scope_echo_checked` record (payload: `docs/events-schema.md`; counts, digests and closed enums only — no path, no prompt text). `match: false` or `echoed: false` is logged in the wave progress update as `scope-echo: <agent> missing|mismatch` and changes NOTHING else — no re-dispatch, no deviation write, no gate.
132
+
133
+ **What it proves:** the agent's final report carried the digest the coordinator handed it, i.e. the injected line survived the round trip into the agent's context and back. **What it does not prove:** that the model read the `FILE-SCOPE` block, understood it, or obeyed it — the digest is in the prompt, so it can be copied without ever looking at the paths (BV-004 ceiling, `docs/scope-collision-guard.md` § 4.2). Obedience is still measured at write time (`enforce-scope.mjs`) and by the W5 verification pass.
134
+
122
135
  3e. **Collect Open Questions** (Close Handover-Alignment-Gate, PRD 2026-07-07): scan every completed agent's report from this wave for an optional `OPEN-QUESTIONS:` line (see the report-line convention in `wave-loop-dispatch.md` `#### Agent-Type Resolution` — an agent MAY emit `OPEN-QUESTIONS: <question> | context: <...> | candidates: <opt A / opt B>`; most agents emit none). For each such line found:
123
136
 
124
137
  - Parse the question text (portion before the first ` | `).
@@ -317,9 +330,9 @@ If the commit itself fails (e.g., nothing to commit, pre-commit hook rejects), d
317
330
  - **Discovery** and **Finalization** waves: skip session-reviewer dispatch — Discovery is read-only and Finalization is a final git status check only.
318
331
  - This is complementary to the incremental verification in step 4 — the session-reviewer provides deeper analysis (security, silent failures, test depth, type design) that automated checks do not cover.
319
332
  6. **Pencil design review** (after Impl-Core and Impl-Polish roles only, if `pencil` configured in Session Config):
320
- a. Check Pencil editor state: `get_editor_state({ include_schema: false })`. If no editor active, open the configured `.pen` file via `open_document({ filePathOrTemplate: "<pencil-path>" })`. If that also fails → skip with note "Pencil review skipped — .pen file unavailable."
321
- b. Get design structure: `batch_get({ filePath: "<pencil-path>", patterns: [{ type: "frame" }], readDepth: 2, searchDepth: 2 })` — find frames relevant to this wave's UI work.
322
- c. Screenshot relevant frames: `get_screenshot({ filePath: "<pencil-path>", nodeId: "<frame-id>" })` for each frame matching the wave's UI tasks.
333
+ a. Check Pencil app state: `mcp__pencil__get_app_state`. If the configured `.pen` file is not open, open it through the `mcp__pencil__execute` surface (an Open/activate call on `filePath` — `.pen` files are encrypted, so never `Read`/`Grep` them; follow the tool's own input schema, which the Pencil MCP server instructions describe as "be aware of the .pen schema and the instructions for the execute tool"). If that also fails → skip with note "Pencil review skipped — .pen file unavailable."
334
+ b. Get design structure: `mcp__pencil__execute` with a **Get visitor** scoped to `filePath: "<pencil-path>"` at depth 1 (top-level frames) or depth 2 (frame children) — find frames relevant to this wave's UI work. Read the execute tool's input schema for the exact visitor shape before calling; do not guess it.
335
+ c. Render relevant frames: there is no direct screenshot tool on the current surface — use `mcp__pencil__browser` to view/capture each frame matching the wave's UI tasks (`filePath` plus the frame's node id).
323
336
  d. Read the actual UI files changed in this wave (from agent outputs).
324
337
  e. **Compare**: layout structure, component hierarchy, visual elements (headings, buttons, inputs, cards), responsive behavior.
325
338
  f. **Report** in wave progress:
@@ -334,7 +347,7 @@ If the commit itself fails (e.g., nothing to commit, pre-commit hook rejects), d
334
347
  3. If "Revise" → re-run session-plan for remaining waves only
335
348
  4. If "Abort" → mark remaining waves as DEFERRED, proceed to session-end
336
349
 
337
- Always use the `filePath` parameter on Pencil MCP calls. Only review frames relevant to the current wave, not the entire file.
350
+ Always use the `filePath` parameter on Pencil MCP calls. Only review frames relevant to the current wave, not the entire file. The live tool names (`mcp__pencil__get_app_state`, `mcp__pencil__execute`, `mcp__pencil__browser`) have one definition in code — `PENCIL_TOOL_NAMES` in `scripts/lib/ux-grill/pencil-coverage.mjs`; the pre-2026 tool surface it replaced no longer exists (dead names enumerated in that module's JSDoc).
338
351
 
339
352
  7. **Capture wave metrics**: If `persistence` is enabled in Session Config, record for this wave after all agents complete and quality checks run. If `persistence` is `false`, skip metrics capture entirely — do not accumulate in-memory metrics. Record:
340
353
  - `wave_number`, `role`, `started_at` (when agents were dispatched), `completed_at` (when all finished)
@@ -462,7 +475,7 @@ After each wave completes and before the progress update, update `<state-dir>/ST
462
475
 
463
476
  **Gate:** `persistence: true` in Session Config. When `persistence: false`, skip every push below — there is no runtime side-channel to feed.
464
477
 
465
- The helper is `scripts/lib/agent-status.mjs`. Its exports (`setStatus`, `setProgress`, `readCurrentStatus`) are all no-throw and return `{ ok: true } | { ok: false, reason }`; the coordinator ignores the return value (best-effort). Push at **three anchors** in the wave loop:
478
+ The helper is `scripts/lib/agent-status.mjs`. The writers (`setStatus`, `setProgress`) are no-throw and return `{ ok: true } | { ok: false, reason }`; the coordinator ignores the return value (best-effort). The reader `readCurrentStatus()` returns `{ entries, source: 'live-map'|'rebuilt-log'|'stale-cache', at, degraded? }` — the ledger `agent-status.jsonl` is the source of truth and the current-map is a rebuildable cache (#1342), so a consumer must SHOW `source`/`at`; `readCurrentStatusEntries()` is the bare-map accessor. Push at **three anchors** in the wave loop:
466
479
 
467
480
  1. **dispatch** — in `### 1. Dispatch Agents`, as each agent is dispatched, push its status. Use `setProgress` when the wave's per-agent ordinal is meaningful, else `setStatus`:
468
481
 
@@ -0,0 +1,149 @@
1
+ <!-- source: session-orchestrator plugin (canonical: templates/_shared/ux-manifest.template.md) -->
2
+ ---
3
+ # ux-grill manifest — copy to `.orchestrator/ux-manifest.md` in the target repo.
4
+ #
5
+ # Every value below is a PLACEHOLDER. Replace them; never paste a credential,
6
+ # a token or a production host into this file — it is tracked by git.
7
+
8
+ # REQUIRED. Must be loopback (127.0.0.1 / localhost / [::1]). A non-loopback
9
+ # base-url aborts the mechanical run with "base-url must be loopback".
10
+ base-url: http://127.0.0.1:3100
11
+
12
+ # REQUIRED. `dev` or `prod`. A dev build is not a geometry measurement basis,
13
+ # so target-size findings from it are marked `provisional: true`.
14
+ build: dev
15
+
16
+ # Filename (relative to the target repo root) of the GITIGNORED env file that
17
+ # holds the VALUES for every env NAME named below. Omit it if no run needs
18
+ # credentials or guarded endpoints.
19
+ env-file: .env.e2e.local
20
+
21
+ # Env NAMES whose values must point at loopback. Use this for every endpoint
22
+ # the app talks to (API base, database URL, storage) so a stray production
23
+ # value cannot be written to by a seed or a journey. The value is checked but
24
+ # never printed.
25
+ guarded-url-envs:
26
+ - APP_API_BASE_URL
27
+ - APP_DATABASE_URL
28
+
29
+ # Optional command that seeds deterministic test data before the run.
30
+ seed-command: npm run seed:e2e
31
+
32
+ # Evaluation personas. Credentials are env NAMES only — the values live in
33
+ # `env-file`. Use `personas: []` for an app that needs no login.
34
+ personas:
35
+ - name: solo-operator
36
+ login-env-email: LOGIN_EMAIL_SOLO
37
+ login-env-password: LOGIN_PASSWORD_SOLO
38
+ goal: Get from the dashboard to a finished document without help.
39
+ - name: accountant
40
+ login-env-email: LOGIN_EMAIL_ACCOUNTANT
41
+ login-env-password: LOGIN_PASSWORD_ACCOUNTANT
42
+ goal: Review a client's numbers and export them.
43
+
44
+ # Routes to measure. `title-pattern` is a regular expression matched against
45
+ # the page title. `frame` is optional and only used by the Pencil coverage
46
+ # step (`desktop` | `mobile` | `both` | `none`).
47
+ routes:
48
+ - path: /dashboard
49
+ title-pattern: ^Dashboard
50
+ persona: solo-operator
51
+ frame: both
52
+ - path: /documents/new
53
+ title-pattern: ^New document
54
+ persona: solo-operator
55
+
56
+ # Journeys are replayed verbatim: every entry of `steps` is one agent-browser
57
+ # command line, so the mechanical stage can count them without judging them.
58
+ #
59
+ # TRUST: each step line is split into an argv array and handed to the
60
+ # `agent-browser` binary (never to a shell) — but NOT verbatim: the first token
61
+ # must be one of the ALLOWLISTED UI verbs below, anything else aborts the run
62
+ # with `step-verb-not-allowed`.
63
+ #
64
+ # back check click dblclick drag fill find focus forward get
65
+ # hover is keyboard open press reload scroll scrollintoview
66
+ # select snapshot type uncheck wait
67
+ #
68
+ # The denied half of the CLI is what the allowlist exists for: `upload` and
69
+ # `cookies set --curl` read arbitrary HOST FILES into the page, `download` and
70
+ # `pdf` write arbitrary host paths, `eval` can exfiltrate off-origin, `connect`
71
+ # retargets a foreign browser, and `close --all` kills every other agent's
72
+ # session on the machine. So the trust model is "allowlisted UI verbs", not
73
+ # "anything the CLI accepts" — whoever can commit this file can drive the
74
+ # BROWSER, not the host.
75
+ #
76
+ # An `open` step must resolve to the same origin as `base-url`, else
77
+ # `step-open-off-origin`. A step may not carry `--session`: the run owns its
78
+ # session, and a step that retargets it aborts with `step-session-override`.
79
+ #
80
+ # `start` must resolve to the SAME ORIGIN as `base-url` (a path is the normal
81
+ # form). An off-origin `start` aborts with `journey-start-off-origin` — with a
82
+ # persona attached, an absolute foreign URL would type real credentials into a
83
+ # foreign page. The same rule holds for every `routes[].path`.
84
+ journeys:
85
+ - name: create-first-document
86
+ persona: solo-operator
87
+ start: /dashboard
88
+ steps:
89
+ - click "New document"
90
+ - type "#title" "Placeholder title"
91
+ - click "Save"
92
+ success: /documents/
93
+ max-steps: 6
94
+
95
+ # Viewports. Defaults to exactly these two when the key is absent.
96
+ #
97
+ # Every viewport is VERIFIED after it is applied: `window.innerWidth` must equal
98
+ # the expectation, else the viewport is skipped as `device-mismatch` rather than
99
+ # captured under a wrong label. The expectation is the `viewport:` width, the
100
+ # built-in width of a known `device:` name (iPhone 15/16 393, iPhone 16 Pro 402,
101
+ # iPhone 17 402, iPad 820, iPad Pro 1024, Pixel 9 412, Galaxy S25 360 — measured
102
+ # against agent-browser 0.37.1), or an explicit `expected-width:`. A `device:`
103
+ # outside that list NEEDS `expected-width:`, otherwise the viewport is skipped:
104
+ # an unknown device name leaves the previous device in place, so an unverified
105
+ # width is exactly how desktop captures end up labelled `mobile`.
106
+ viewports:
107
+ - name: desktop
108
+ viewport: 1440x900
109
+ - name: mobile
110
+ device: iPhone 15
111
+
112
+ # Optional design-coverage source.
113
+ pencil:
114
+ file: design/app.pen
115
+ ---
116
+
117
+ # UX Manifest — <REPO NAME>
118
+
119
+ > Per-repo UX truth: what a real user walks through, and what the mechanical
120
+ > stage is allowed to touch. Last verified: <YYYY-MM-DD> by <operator>
121
+
122
+ ## Notes
123
+
124
+ Free-form notes below the frontmatter. They are preserved verbatim and are not
125
+ parsed — use them for context the fields cannot carry.
126
+
127
+ **Credentials never go in this file.** The frontmatter names env VARIABLES
128
+ (`login-env-email`, `login-env-password`, `guarded-url-envs`); their values are
129
+ read at run time from the gitignored file named by `env-file`. A value pasted
130
+ here is a secret in a tracked file, and the run itself will never print one:
131
+ guarded-env and persona errors name the variable, never its content. `env-file`
132
+ must resolve INSIDE the repo (`env-file-outside-repo` otherwise) — it names a
133
+ file of this repo, never a host-wide secrets file.
134
+
135
+ **Run artefacts can carry a credential even though findings cannot.** Three
136
+ classes: journey step screenshots (one is taken after EVERY step, including the
137
+ one right after `fill #pw ${LOGIN_PASSWORD}`), the text of `errors --json`, and
138
+ the `html` snippets inside axe JSON. They all live under
139
+ `.orchestrator/metrics/ux-grill/`, which `/ux-grill` adds to this repo's
140
+ `.gitignore` on bootstrap — keep that line, and never commit a run directory.
141
+
142
+ ## Known exceptions
143
+
144
+ Findings that are known and deliberately accepted — with the reason and a
145
+ revisit trigger, so they are not re-filed every run.
146
+
147
+ | Finding | Why accepted | Revisit trigger |
148
+ |---------|--------------|-----------------|
149
+ | <…> | <…> | <…> |
@@ -1,114 +0,0 @@
1
- <!-- source: session-orchestrator plugin (canonical: templates/_shared/journey-manifest.md) -->
2
- <!--
3
- Retired with /journey-audit in 4.0.0 — kept as a template for a per-repo
4
- product-truth manifest; no command consumes it.
5
-
6
- Copy to `.orchestrator/journey-manifest.md` in the target repo and fill in every
7
- section. While `/journey-audit` existed, it refused to run without this file;
8
- with the command removed, filling this in is optional documentation only.
9
-
10
- The `## SAFETY` block described what gated R5 (the real end-to-end run against
11
- production with a real account) when the skill still ran. Kept below for
12
- reference in case a future consumer re-adopts the same manifest shape.
13
-
14
- Credentials: env-var NAMES only, never values. A value pasted here is a secret
15
- in a tracked file.
16
- -->
17
-
18
- # Journey Manifest — <REPO NAME>
19
-
20
- > Per-repo product-truth manifest, not code structure.
21
- > Retired with `/journey-audit` in 4.0.0 — no command consumes this file today.
22
- > Last verified: <YYYY-MM-DD> by <operator>
23
-
24
- ## Personas & Einstiegspunkte
25
-
26
- | Persona | Ziel | Einstiegspunkt (URL/Route) | Erfolg heißt |
27
- |---------|------|---------------------------|--------------|
28
- | <anonymer Besucher> | <was er will> | `<https://…/>` | <messbarer Endzustand> |
29
- | <zahlender Kunde> | | | |
30
- | <Owner/Admin> | | | |
31
-
32
- List every entry point a real user can reach — including the ones marketing links
33
- to but the app never surfaces. A feature with no entry point is exactly the defect
34
- class this audit exists to find.
35
-
36
- ## Wahrheits-SSOTs
37
-
38
- Where the truth about the product lives in code. R3 compares every claim against
39
- THESE files, not against other prose.
40
-
41
- | Gegenstand | SSOT-Datei/Konstante |
42
- |-----------|----------------------|
43
- | Preise / Pläne / Limits | `<src/config/plans.ts>` |
44
- | Feature-Flags | `<…>` |
45
- | Währung / Steuer / Region | `<…>` |
46
- | Quota / Kontingente | `<…>` |
47
- | i18n-Namespaces (Marketing, FAQ, Mail) | `<…>` |
48
- | Chat-/Bot-Faktenquelle | `<…>` |
49
-
50
- ## Outbound-Touchpoints (Input für R1/R2)
51
-
52
- - Template-Verzeichnis: `<…>`
53
- - Send-Pfad / Provider-Adapter: `<…>`
54
- - Cron-/Scheduler-Quellen: `<…>`
55
- - Render-Idiom + Beispiel-Props für R2: `<z. B. react-email, props aus …>`
56
-
57
- ## Chat-Interview (Frage → Soll-Antwort)
58
-
59
- R4 asks these verbatim and scores the answer against the expected one. The expected
60
- answer must be derivable from a Wahrheits-SSOT above — otherwise it is a second
61
- claim, not a truth key.
62
-
63
- | # | Frage (wörtlich) | Soll-Antwort (Kern-Fakt) | SSOT |
64
- |---|------------------|--------------------------|------|
65
- | 1 | <"Was kostet …?"> | <"…"> | `<datei>` |
66
- | 2 | | | |
67
- | 3 | | | |
68
-
69
- ## SAFETY
70
-
71
- **MANDATORY for R5. Without this block filled in, R5 is not dispatched.**
72
-
73
- - **Erlaubte Konten:** `<test-account@…>` — and no other. Never a real customer account.
74
- - **Erlaubte Events/Objekte:** `<z. B. nur Events mit Präfix AUDIT-…>`
75
- - **No-Go-Aktionen:** <Löschen fremder Daten · Mailversand an echte Empfänger · Plan-Downgrade · Refunds · Webhook-Replays gegen Prod>
76
- - **Checkout-Grenze:** `<max. EUR X, Testkarte …, Live-Zahlungen verboten>`
77
- - **Cleanup-Regel:** <was nach dem Durchstich wieder entfernt wird, von wem, woran man erkennt dass es weg ist>
78
- - **Abbruchbedingung:** <woran R5 sofort stoppt und meldet statt weiterzumachen>
79
-
80
- ## Credential-Quellen (env-Namen, NIE Werte)
81
-
82
- | Zweck | Env-Variable | Bezugsquelle |
83
- |-------|--------------|--------------|
84
- | Prod-Login R5 | `<AUDIT_TEST_ACCOUNT_EMAIL>` | `<1Password-Item / .env.local>` |
85
- | DB read-only R6 | `<AUDIT_DB_READONLY_URL>` | `<…>` |
86
- | Mail-Provider-API R6 | `<…>` | `<…>` |
87
- | Plattform-CLI R7 | `<…>` | `<…>` |
88
-
89
- ## Realdaten-Queries (R6, read-only)
90
-
91
- Only `SELECT`. A query that writes does not belong in this file.
92
-
93
- ```sql
94
- -- Funnel: Registrierung → Aktivierung → Zahlung
95
- SELECT …;
96
- ```
97
-
98
- - Identitäts-Regeln: <wie ein Nutzer über Tabellen hinweg identifiziert wird>
99
- - Nicht messbar (bewusst benennen): <was die Daten NICHT hergeben>
100
-
101
- ## Plattform-Erwartung (R7)
102
-
103
- - CLI-Logins: `<vercel · supabase · cloudflare · …>`
104
- - Erwarteter Plan/Tier je Dienst: `<…>`
105
- - Offene Perf-/Kosten-Issues: `<#…>`
106
-
107
- ## Bekannte Ausnahmen
108
-
109
- Findings that are known and deliberately accepted — with the reason and a revisit
110
- trigger. R1–R7 report them as `known-exception`, never as new findings.
111
-
112
- | Befund | Warum akzeptiert | Revisit-Trigger |
113
- |--------|------------------|-----------------|
114
- | <…> | <…> | <…> |