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.
- package/.agents/skills/session-start/SKILL.md +1 -1
- package/.agents/skills/ux-grill/SKILL.md +22 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +3 -2
- package/.codex-plugin/plugin.json +1 -1
- package/.codex-plugin/skills/session-start/SKILL.md +1 -1
- package/.codex-plugin/skills/ux-grill/SKILL.md +21 -0
- package/.codex-plugin/skills/ux-grill/agents/openai.yaml +5 -0
- package/.cursor/commands/ux-grill.md +14 -0
- package/.cursor/skills/session-start/SKILL.md +1 -1
- package/.cursor/skills/ux-grill/SKILL.md +13 -0
- package/.cursor-plugin/plugin.json +1 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +94 -1
- package/README.md +98 -86
- package/agents/dialectic-deriver.md +11 -0
- package/commands/ux-grill.md +51 -0
- package/docs/USER-GUIDE.md +2 -2
- package/docs/codex-setup.md +8 -0
- package/docs/components.md +7 -7
- package/docs/events-schema.md +9 -5
- package/docs/github-mirror-protection.md +61 -20
- package/docs/migration-v5.md +62 -0
- package/docs/scope-collision-guard.md +14 -0
- package/hooks/_lib/hook-import-set.json +44 -2
- package/hooks/_lib/lock-bootstrap.mjs +84 -1
- package/hooks/_lib/vcs-create-matcher.mjs +190 -3
- package/hooks/enforce-scope.mjs +201 -0
- package/hooks/hooks-codex.json +1 -1
- package/hooks/hooks-cursor.json +5 -0
- package/hooks/hooks.json +7 -2
- package/hooks/on-session-start.mjs +171 -49
- package/hooks/post-bash-issue-budget-refund.mjs +375 -0
- package/hooks/pre-auq-clarity.mjs +70 -18
- package/hooks/pre-bash-issue-budget.mjs +51 -4
- package/package.json +2 -1
- package/pi/prompts/ux-grill.md +12 -0
- package/scripts/ci/assert-vitest-green.mjs +4 -2
- package/scripts/dialectic-deriver.mjs +32 -8
- package/scripts/emit-session.mjs +72 -1
- package/scripts/lib/agent-status.mjs +441 -9
- package/scripts/lib/auq/schema.mjs +10 -3
- package/scripts/lib/ci-status-banner.mjs +29 -6
- package/scripts/lib/claude-md-budget-lint.mjs +52 -2
- package/scripts/lib/config.mjs +12 -1
- package/scripts/lib/eval/engine.mjs +7 -1
- package/scripts/lib/file-lock.mjs +114 -13
- package/scripts/lib/git-porcelain.mjs +113 -0
- package/scripts/lib/instruction-budget-guard.mjs +415 -47
- package/scripts/lib/io.mjs +29 -4
- package/scripts/lib/issue-budget.mjs +336 -6
- package/scripts/lib/learnings/sizing-subject.mjs +44 -0
- package/scripts/lib/locks/staging-fence-lock.mjs +19 -38
- package/scripts/lib/locks/state-md-lock.mjs +19 -41
- package/scripts/lib/maintenance-due-banner.mjs +11 -1
- package/scripts/lib/peer-cards/merger.mjs +143 -0
- package/scripts/lib/pre-dispatch-check.mjs +20 -14
- package/scripts/lib/project-hygiene.mjs +81 -30
- package/scripts/lib/quality-gate.mjs +14 -65
- package/scripts/lib/reconcile/engine.mjs +19 -1
- package/scripts/lib/reconcile/writer.mjs +278 -11
- package/scripts/lib/scope-echo.mjs +346 -0
- package/scripts/lib/session-lock.mjs +62 -2
- package/scripts/lib/session-record-repair.mjs +91 -0
- package/scripts/lib/session-schema/filters.mjs +26 -1
- package/scripts/lib/session-start-probes.mjs +419 -53
- package/scripts/lib/test-runner/artifact-paths.mjs +30 -5
- package/scripts/lib/test-runner/issue-reconcile.mjs +45 -8
- package/scripts/lib/tmux-layout/layouts.mjs +62 -4
- package/scripts/lib/ux-grill/collect.mjs +1163 -0
- package/scripts/lib/ux-grill/compare.mjs +285 -0
- package/scripts/lib/ux-grill/manifest.mjs +618 -0
- package/scripts/lib/ux-grill/measures.mjs +431 -0
- package/scripts/lib/ux-grill/paths.mjs +224 -0
- package/scripts/lib/ux-grill/pencil-coverage.mjs +284 -0
- package/scripts/lib/ux-grill/reconcile.mjs +344 -0
- package/scripts/lib/ux-grill/run-record.mjs +316 -0
- package/scripts/lib/ux-grill/schema.mjs +321 -0
- package/scripts/lib/validate/check-untracked-test-deps.mjs +33 -19
- package/scripts/lib/validate/check-unwired-features.mjs +48 -20
- package/scripts/lib/vault-status/board-lock.mjs +18 -0
- package/scripts/lib/vault-status/board-writer.mjs +8 -0
- package/scripts/mcp-server.sh +16 -1
- package/scripts/release.mjs +7 -2
- package/skills/bootstrap/SKILL.md +12 -209
- package/skills/bootstrap/references/bootstrap-ecosystem-health-flow.md +48 -0
- package/skills/bootstrap/references/bootstrap-refresh-lock-flow.md +37 -0
- package/skills/bootstrap/references/bootstrap-retroactive-flow.md +108 -0
- package/skills/bootstrap/references/bootstrap-rules-fetch-bridge.md +64 -0
- package/skills/claude-md-drift-check/SKILL.md +9 -2
- package/skills/claude-md-drift-check/checker.mjs +213 -21
- package/skills/discovery/SKILL.md +6 -173
- package/skills/discovery/probes/vault-staleness.mjs +35 -5
- package/skills/discovery/probes-docs.md +8 -4
- package/skills/discovery/probes-supply-chain.md +4 -2
- package/skills/discovery/probes-ui.md +7 -3
- package/skills/discovery/probes-vault.md +12 -4
- package/skills/discovery/references/discovery-interactive-triage.md +139 -0
- package/skills/discovery/references/discovery-triage-state.md +54 -0
- package/skills/eval/rubric-v1.md +13 -0
- package/skills/evolve/SKILL.md +2 -458
- package/skills/evolve/references/evolve-analyze-mode.md +360 -0
- package/skills/evolve/references/evolve-dialectic-mode.md +139 -0
- package/skills/plan/mode-retro.md +4 -3
- package/skills/reconcile/SKILL.md +10 -0
- package/skills/session-end/drift-operations.md +20 -5
- package/skills/session-end/metrics-collection.md +1 -0
- package/skills/session-end/phase-3-6-tail.md +4 -2
- package/skills/session-end/references/phase-2-quality-gate.md +3 -3
- package/skills/session-end/references/phase-5-issue-cleanup.md +6 -1
- package/skills/session-end/session-metrics-write.md +2 -0
- package/skills/session-plan/SKILL.md +2 -144
- package/skills/session-plan/references/session-plan-task-classification.md +152 -0
- package/skills/session-start/SKILL.md +24 -6
- package/skills/session-start/references/operations-contract.md +114 -0
- package/skills/session-start/references/phase-4-ssot-environment-check.md +22 -20
- package/skills/session-start/soul.md +2 -2
- package/skills/test-runner/SKILL.md +1 -1
- package/skills/tmux-layout/SKILL.md +3 -1
- package/skills/ux-grill/SKILL.md +211 -0
- package/skills/ux-grill/rubric-v2.md +201 -0
- package/skills/ux-grill/soul.md +76 -0
- package/skills/wave-executor/SKILL.md +3 -128
- package/skills/wave-executor/references/wave-executor-quality-gate.md +61 -0
- package/skills/wave-executor/references/wave-executor-state-init.md +86 -0
- package/skills/wave-executor/references/wave-loop-dispatch.md +8 -0
- package/skills/wave-executor/references/wave-loop-review.md +18 -5
- package/templates/_shared/ux-manifest.template.md +149 -0
- 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
|
|
321
|
-
b. Get design structure: `
|
|
322
|
-
c.
|
|
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`.
|
|
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
|
-
| <…> | <…> | <…> |
|