@@ -32,8 +32,8 @@ both templates (no org claims) and the webhook subscribes only to `user.*` (and
3232is optional — ` users.ensure ` syncs on first login). Both templates ship the
3333` /admin ` panel; in live2 the FIRST user to sign in becomes super-admin, and the
3434CLI additionally sets ` SUPERADMIN_EMAILS ` in Convex with the Clerk account
35- email during installation (extra bootstrap). Spec/roadmap:
36- [ docs/live2-spec.md ] ( ./docs/live2-spec.md ) .
35+ email during installation (extra bootstrap). Spec/roadmap: ` live2-spec.md `
36+ in the private ` impactus-internal-docs ` repo .
3737
3838### Install modes and stack paths
3939
@@ -156,7 +156,8 @@ its own groups without requiring a CLI release. Without those fields, the
156156CLI's built-in catalog applies (current live1/live2 behavior).
157157
158158To ADD a template: an entry in ` TEMPLATES ` + repo on the community backend's
159- allowlist (` docs/cli-paid-gate.md ` ) + ` TEMPLATE_GITHUB_TOKEN ` scope.
159+ allowlist (` cli-paid-gate.md ` , private ` impactus-internal-docs ` repo) +
160+ ` TEMPLATE_GITHUB_TOKEN ` scope.
160161
161162### 2.5 Post-install audit (` --verify ` )
162163
@@ -500,19 +501,27 @@ provider without login/key). The switch is logged and traced as
500501- ** Agent phases retry once by default** (` retries: 1 ` ) before failing the run.
501502- ** One FDA at a time per project** : a best-effort ` imp/data/.fda.lock `
502503 (pid + fda_id + runner + started_at) blocks a second concurrent run — the
503- permission gates of two parallel runs would revert each other's work. If a
504- crash leaves a stale lock, deleting the file is the recovery.
504+ permission gates of two parallel runs would revert each other's work.
505+ Acquisition is atomic (create-exclusive with a stale-retry), so two runs
506+ started in the same instant cannot both pass the liveness probe; a pid that
507+ answers EPERM counts as ALIVE (it exists under another user), and elapsed
508+ time alone never discards a lock — only a dead pid does. If a crash leaves
509+ a stale lock, deleting the file is the recovery.
505510- ** Interactive sessions go read-only while an FDA runs** : the same lock has
506511 a reader side (` imp/scripts/fda-lock.mjs ` , also ` npm run fda:status ` ). A
507512 Claude session opened in the project during a run gets a READ-ONLY
508513 notice at session start (SessionStart hook) and a PreToolUse hook blocks
509514 file edits and write-shaped bash commands (incl. ` git commit ` /` add ` /…)
510515 aimed inside the repo — an external write mid-run would be attributed to
511516 the phase agent and rolled back. Interactive Pi gets the same guard via the
512- ` .pi/extensions/fda-lock.ts ` extension. The FDA's own child agents are
513- exempt (the runner exports ` FIA_FDA_RUN ` into their environment), writes
514- outside the repo stay allowed, everything fails open, and the block lifts
515- the moment the run ends.
517+ ` .pi/extensions/fda-lock.ts ` extension, and Cursor via the
518+ ` .cursor/hooks.json ` ` beforeShellExecution ` hook
519+ (` .cursor/hooks/fda-lock-cursor.mjs ` — Cursor has no before-edit hook, so
520+ shell commands are the guarded surface; stray agent edits are still swept
521+ by the run's own gate). The FDA's own child agents are exempt (the runner
522+ exports ` FIA_FDA_RUN ` into their environment), writes outside the repo stay
523+ allowed, everything fails open, and the block lifts the moment the run
524+ ends.
516525- ** Envelopes must declare artifacts** : ` artifactsExist ` /` filesNonEmpty ` gates
517526 now fail on an empty ` artifacts ` list — an agent that produced nothing can
518527 no longer count as a success.
@@ -546,7 +555,12 @@ provider without login/key). The switch is logged and traced as
546555 the brief FROM DISK (` checkAcceptanceChecklist ` in ` imp/modules/gates.mjs ` ;
547556 the file path survives ` --resume ` via a session marker), one ` fix_checklist `
548557 builder round repairs a forgotten checklist, and ` checklist_2 ` fails the run
549- if any ` - [ ] ` survives — the gate refuses, it never ticks a box itself. In
558+ if any ` - [ ] ` survives — the gate refuses, it never ticks a box itself.
559+ The second pass also compares box IDENTITIES against the first
560+ (` checklistDrift ` ): rewording, moving or swapping a box for a trivial
561+ ticked one is refused the same as deleting it — only the tick and the
562+ ` — N/A (<reason>) ` annotation are legal edits, and an N/A tick without a
563+ parenthesized reason fails on its own. In
550564 ` fda_sdlc ` this happens BEFORE review, so the reviewer audits the ticks
551565 against the diff (a false tick is grounds for rejection). Prompts that are
552566 not brief files, and briefs without checkboxes, skip the gate. The ticked
@@ -810,7 +824,7 @@ Services
810824 --tenancy <value> single (Live 1, default) | multi (Live 2: your app's
811825 own organizations in Convex — per-organization
812826 data/billing, roles/permissions, /admin with org
813- management; spec history in docs/live2-spec.md )
827+ management)
814828 --skip-webhook No Clerk → Convex webhook
815829 --storage <value> convex | r2
816830 --skip-storage Stays on Convex Storage without asking
0 commit comments