forgetrail 0.4.20 → 0.5.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 (42) hide show
  1. package/CONTINUATION_PROMPT.md +5 -5
  2. package/INITIAL_PROMPT.md +15 -15
  3. package/README.md +5 -5
  4. package/TRACKING_SCHEMA.md +16 -7
  5. package/TRY_FORGETRAIL.md +3 -3
  6. package/WORKFLOW.md +50 -45
  7. package/content/AGENT_INTEGRATION_claude.md +1 -1
  8. package/content/AGENT_INTEGRATION_cursor.md +3 -3
  9. package/content/AGENT_INTEGRATION_generic.md +5 -5
  10. package/content/AGENT_INTEGRATION_grok.md +8 -8
  11. package/content/COMPANION_TOOLS.md +1 -1
  12. package/content/FORGETRAIL_LITE.md +72 -68
  13. package/content/FORGETRAIL_PROGRESS.md +3 -3
  14. package/content/GENESIS_SPEC_PROMPT.md +1 -1
  15. package/content/GENESIS_STUB.md +1 -1
  16. package/content/GREENFIELD_INTAKE.md +6 -6
  17. package/content/KICKOFF_WITHOUT_MCP.md +1 -1
  18. package/content/NEW_PROJECT_BOOTSTRAP.md +27 -27
  19. package/content/PLAN_MODE_PATTERNS.md +4 -4
  20. package/content/POST_BOOTSTRAP_USER_MESSAGE.md +1 -1
  21. package/content/SESSION_RESUME_MCP.md +7 -7
  22. package/content/companion-tools.json +1 -1
  23. package/content/cursor-rules/forgetrail-phase-status.mdc +8 -9
  24. package/content/examples/two-session-continuity.md +31 -67
  25. package/content/forgetrail-workspace-README.md +2 -2
  26. package/content/hooks/README.md +3 -3
  27. package/content/hooks/session-start.mjs +58 -63
  28. package/content/hooks/session-stop.mjs +49 -30
  29. package/content/hooks/validate-tracking-core.mjs +34 -1
  30. package/content/scripts/forgetrail-dev-launcher.mjs +12 -2
  31. package/content/skills/forgetrail/SKILL.md +21 -21
  32. package/content/skills/forgetrail/SKILL_FACTS.md +2 -2
  33. package/docs/CONTEXT_PROMPT.md +1 -1
  34. package/docs/NPM.md +8 -8
  35. package/docs/PHASE_1_BRIEF.md +7 -7
  36. package/package.json +69 -70
  37. package/scripts/forgetrail-cli.mjs +1 -1
  38. package/scripts/install-lib.mjs +1 -0
  39. package/scripts/install.mjs +6 -23
  40. package/scripts/publish-gate.mjs +6 -4
  41. package/scripts/tracking-cutover.test.mjs +109 -0
  42. package/scripts/workspace-index.mjs +9 -1
@@ -10,8 +10,8 @@ I'm continuing work on [APP NAME]. You are following ForgeTrail, a structured ph
10
10
  **Before doing anything else:**
11
11
 
12
12
  1. Call ForgeTrail MCP **`getResumeSessionInstructions`** and follow it.
13
- 2. Read **`.forgetrail/workflow_tracking.json`**. If phase is **1-architecture**, read **`docs/PHASE_1_BRIEF.md`**. Otherwise read **`CONTEXT_PROMPT.md`** (if Phase 2+ but CONTEXT is missing and the brief exists, **merge the brief into CONTEXT** first per the CONTEXT_PROMPT template).
14
- 3. Use **`getPhaseGuidance`** for the current phase, **`getTrackingSchema`** when updating tracking, and other ForgeTrail MCP tools as needed.
13
+ 2. Read **`appledger/profiles/forgetrail.yaml`** and the latest session record. If the phase is **plan**, read **`docs/PHASE_1_BRIEF.md`**. Otherwise read **`CONTEXT_PROMPT.md`** (if a later phase is current but CONTEXT is missing and the brief exists, **merge the brief into CONTEXT** first per the CONTEXT_PROMPT template).
14
+ 3. Use **`getPhaseGuidance`** for the current phase. Do **not** update **`workflow_tracking.json`**. If that file exists and is not a pointer, run **`appledger migrate preview`** and then apply.
15
15
 
16
16
  ### Local `_forgetrail/` folder
17
17
 
@@ -19,15 +19,15 @@ I'm continuing work on [APP NAME]. You are following ForgeTrail, a structured ph
19
19
 
20
20
  **Before doing anything else:**
21
21
 
22
- 1. Read **`.forgetrail/workflow_tracking.json`** to see where we left off.
22
+ 1. Read **`appledger/profiles/forgetrail.yaml`** and the latest session record to see where we left off. Do not treat **`.forgetrail/workflow_tracking.json`** as the live record.
23
23
  2. Read `_forgetrail/WORKFLOW.md` for the full phase map, playbooks, and patterns.
24
- 3. Read `_forgetrail/TRACKING_SCHEMA.md` to understand how to update the tracking file.
24
+ 3. Read `_forgetrail/TRACKING_SCHEMA.md` for where project state lives. The legacy JSON shape in that file is for migration only.
25
25
  4. Read `CONTEXT_PROMPT.md` for the current architecture and project state — or **`docs/PHASE_1_BRIEF.md`** if still in Phase 1; if Phase 2+ and CONTEXT is empty but the brief exists, merge brief → CONTEXT first.
26
26
 
27
27
  **Rules for this session:**
28
28
 
29
29
  - When you believe a phase's exit criteria are met, tell me explicitly: "I think we've completed [Phase X]. The exit criteria are met because [reasons]. Ready to move to [Phase Y]?" Wait for my confirmation.
30
- - After completing work, update **`.forgetrail/workflow_tracking.json`** following the structure in `_forgetrail/TRACKING_SCHEMA.md`: move satisfied exit criteria, add decisions to the `decisions` array (with rationale), log issues to the `gotchas` array, and add session notes.
30
+ - After completing work, update **`appledger/`**: move satisfied criteria only when evidence exists, add decision records (with rationale), log lessons or questions, and update the session record. Do not write **`workflow_tracking.json`**.
31
31
  - Keep `CONTEXT_PROMPT.md` updated as the source of truth for project architecture.
32
32
  - If something isn't working after 5 turns, propose a fundamentally different approach rather than continuing to patch.
33
33
 
package/INITIAL_PROMPT.md CHANGED
@@ -9,13 +9,13 @@ You are helping me build a full-stack web application. I use ForgeTrail, a struc
9
9
 
10
10
  ### MCP-first (recommended — no `_forgetrail/` copy in this repo)
11
11
 
12
- If **ForgeTrail is connected as an MCP server**, do **not** require a local `_forgetrail/` folder. Methodology, templates, and audits stay in the MCP server (open-source ForgeTrail install); persist only **`.forgetrail/workflow_tracking.json`** and optional Cursor rules in this repo.
12
+ If **ForgeTrail is connected as an MCP server**, do **not** require a local `_forgetrail/` folder. Methodology, templates, and audits stay in the MCP server (open-source ForgeTrail install). Persist project state in **`appledger/`**. Do **not** create **`.forgetrail/workflow_tracking.json`**. Optional Cursor rules may live in this repo.
13
13
 
14
14
  **Before doing anything else:**
15
15
 
16
16
  0. If **`docs/GENESIS.md`** exists, call **`ingestPlanArtifact`** with its contents and review the draft brief before scaffolding. If the user only has an idea, offer **`getGenesisSpecPrompt`** (they save as `docs/GENESIS.md`) or point them at **TRY_FORGETRAIL.md** when MCP is not the entry path.
17
- 1. Call the ForgeTrail MCP tool **`getNewProjectKickoff`** (set **`includeCursorRule`** to **false** if not using Cursor). Write **`.forgetrail/workflow_tracking.json`** and the Cursor rule when included; keep the **first reply to the user** short per the bundle’s post-bootstrap section (no MCP tool list or raw JSON dump). **Alternatively:** call **`getNewProjectBootstrap`**, **`getInitialWorkflowTracking`**, **`getPostBootstrapUserMessage`**, and **`getForgeTrailCursorPhaseRule`** separately.
18
- 2. In Phase 1, call **`getGreenfieldIntakePrompt`** alongside **`getChecklist`** (`before-session-1`) so exports (PDF / DOCX / PPTX, etc.), tenancy (e.g. consultants × clients), hybrid vs full spec, compliance tier, and hero flow are captured early in **`PHASE_1_BRIEF.md`** and **`decisions[]`** (skip questions already answered in Genesis).
17
+ 1. Call the ForgeTrail MCP tool **`getNewProjectKickoff`** (set **`includeCursorRule`** to **false** if not using Cursor). When `appledger` is installed, run **`appledger init`** as that bundle describes. Do **not** write **`workflow_tracking.json`**. Write the Cursor rule when included. Keep the **first reply to the user** short per the bundle’s post-bootstrap section (no MCP tool list or raw JSON dump). **Alternatively:** call **`getNewProjectBootstrap`**, **`getInitialWorkflowTracking`**, **`getPostBootstrapUserMessage`**, and **`getForgeTrailCursorPhaseRule`** separately. `getInitialWorkflowTracking` does not return a JSON file to save.
18
+ 2. In Phase 1, call **`getGreenfieldIntakePrompt`** alongside **`getChecklist`** (`before-session-1`) so exports (PDF / DOCX / PPTX, etc.), tenancy (e.g. consultants × clients), hybrid vs full spec, compliance tier, and hero flow are captured early in **`PHASE_1_BRIEF.md`** and as decision records (skip questions already answered in Genesis).
19
19
  3. Use **`getProgressiveDocSchedule`**, **`getPhaseGuidance`**, **`getChecklist`**, **`getTemplate`** (include **`PHASE_1_BRIEF`** in Phase 1; use `mode: "shell"` or `full` as needed), **`getTrackingSchema`**, **`runAudit`**, **`searchLessons`**, and **`getAntiPatterns`** as that bootstrap describes.
20
20
  4. We're starting with Phase 1 (Architecture + Planning).
21
21
 
@@ -25,11 +25,11 @@ If **ForgeTrail is connected as an MCP server**, do **not** require a local `_fo
25
25
 
26
26
  **Optional — JSON seed/fixture data from any LLM:** The user can generate structured JSON in **another** LLM chat (or the same one), save it under e.g. `data/` or `fixtures/`, and ask you to validate and import. Use the copy-paste prompt in **`content/FORGETRAIL_LITE.md` §4.3** (template-in-repo: `_forgetrail/content/FORGETRAIL_LITE.md`); **validate** all such JSON at the boundary before writing to a DB.
27
27
 
28
- **Optional — web search (live data):** If the app needs **up-to-date web search**, the user can sign up for **[Tavily](https://tavily.com/)** and/or the **[Brave Search API](https://api-dashboard.search.brave.com/)** (free or entry-level credits — see vendor pricing), add the key to **`.env`**, and ask you to wire **server-side** calls only. **`FORGETRAIL_LITE.md` §4.4** has the full note; log provider choice in **`decisions[]`**.
28
+ **Optional — web search (live data):** If the app needs **up-to-date web search**, the user can sign up for **[Tavily](https://tavily.com/)** and/or the **[Brave Search API](https://api-dashboard.search.brave.com/)** (free or entry-level credits — see vendor pricing), add the key to **`.env`**, and ask you to wire **server-side** calls only. **`FORGETRAIL_LITE.md` §4.4** has the full note; log the provider choice as a decision record.
29
29
 
30
- **Phase 1 — project archetype:** classify the project as **`product`** (default — full 7-phase lifecycle), **`internal-tool`** (Phase 6 optional; Phase 7 drops payments/business-plan/marketing criteria), or **`one-shot`** (gift / event / demo — phases 5–7 collapse into one polish-and-ship gate). Infer from my description and confirm rather than interrogate. Record in **`PHASE_1_BRIEF.md`**, **`decisions[]`**, and **`project.archetype`** in the tracking file; **prune** the non-applicable exit criteria from the tracking template and log the pruning as a decision. See **WORKFLOW.md §1d**. When the project **ends**, run the **wrap protocol** (WORKFLOW.md §1e): harvest `gotchas[]` + `decisions[]` for generalizable lessons, propagate them, set `project.status` to `"wrapped"`.
30
+ **Phase 1 — project archetype:** classify the project as **`product`** (default — full 7-phase lifecycle), **`internal-tool`** (Phase 6 optional; Phase 7 drops payments/business-plan/marketing criteria), or **`one-shot`** (gift / event / demo — phases 5–7 collapse into one polish-and-ship gate). Infer from my description and confirm rather than interrogate. Record it in **`PHASE_1_BRIEF.md`**, as a decision record, and as **`archetype`** on **`appledger/profiles/forgetrail.yaml`**. Prune the non-applicable criteria on that profile and log the pruning as a decision. Do not write `workflow_tracking.json`. See **WORKFLOW.md §1d**. When the project **ends**, run the **wrap protocol** (WORKFLOW.md §1e): harvest lesson and decision records, propagate the generalizable ones, and set **`project_status`** to **`wrapped`** on the profile.
31
31
 
32
- **Phase 1 — state persistence (web apps):** before locking PocketBase + auth, ask me *"Does any state need to outlive this browser — accounts, cross-device sync, shared data — or is per-user state fine in `localStorage`?"* If **local-only**: drop PocketBase + auth, target `adapter-static`, no deploy-time secrets. If **persistent**: full Default-A stack. Record the answer in **`PHASE_1_BRIEF.md` §4 (`State persistence:`)** and **`decisions[]`**. See **`FORGETRAIL_LITE.md` §7** (A-local vs A-persistent).
32
+ **Phase 1 — state persistence (web apps):** before locking PocketBase + auth, ask me *"Does any state need to outlive this browser — accounts, cross-device sync, shared data — or is per-user state fine in `localStorage`?"* If **local-only**: drop PocketBase + auth, target `adapter-static`, no deploy-time secrets. If **persistent**: full Default-A stack. Record the answer in **`PHASE_1_BRIEF.md` §4 (`State persistence:`)** and as a decision record. See **`FORGETRAIL_LITE.md` §7** (A-local vs A-persistent).
33
33
 
34
34
  **Phase 1 — content-generation pattern (only if content is LLM-produced):** if any v1 content is produced by an LLM (rather than hand-authored or from a conventional non-LLM API), pick **one** of three patterns **before scaffolding** — it drives deploy model, cost, and secret management:
35
35
 
@@ -37,7 +37,7 @@ If **ForgeTrail is connected as an MCP server**, do **not** require a local `_fo
37
37
  - **Build-time LLM generation** — `pnpm run seed` calls the provider once, writes JSON into `data/`, commits it; zero runtime LLM cost; pairs with `adapter-static`. Seed may use cloud APIs or the same Ollama env.
38
38
  - **BYO-LLM paste** — prompt in the repo; I run it in any LLM chat (including local Ollama) and paste JSON into `data/seed.json`; Zod validates at app start; zero project-level API keys.
39
39
 
40
- Record pattern, provider (e.g. `ollama/ibm/granite4.1:8b`), env var names, paths, and validator in **`PHASE_1_BRIEF.md`** (content-generation section) and **`decisions[]`**. See **`FORGETRAIL_LITE.md` §7.1** for OpenAI, Ollama, seed, and BYO skeletons.
40
+ Record pattern, provider (e.g. `ollama/ibm/granite4.1:8b`), env var names, paths, and validator in **`PHASE_1_BRIEF.md`** (content-generation section) and as a decision record. See **`FORGETRAIL_LITE.md` §7.1** for OpenAI, Ollama, seed, and BYO skeletons.
41
41
 
42
42
  **External listing/article URLs (if the hero flow imports from pasted URLs):** follow **`FORGETRAIL_LITE.md` §7.2** — layered fetch and parse, **don’t blame users** for correct URLs when selectors rot, optional **single** structured **verbatim** recover from stripped page text (env-gated). Expand into **`docs/TECHNICAL_REFERENCE.md`** using the ForgeTrail template subsection on deterministic extractors vs markup drift.
43
43
 
@@ -54,17 +54,17 @@ Skip the **“copy-paste paths”** section below unless we are using a **local*
54
54
  **Before doing anything else:**
55
55
 
56
56
  1. Read `_forgetrail/WORKFLOW.md` to understand the full phase map, playbooks, and patterns.
57
- 2. Read `_forgetrail/TRACKING_SCHEMA.md` to understand the tracking file structure before updating it.
58
- 3. Read **`.forgetrail/workflow_tracking.json`** to see current project state.
59
- 4. If using **Cursor**, copy **`_forgetrail/content/cursor-rules/forgetrail-phase-status.mdc`** to **`.cursor/rules/forgetrail-phase-status.mdc`** (create folders if needed) so agents surface phase / next actions from `.forgetrail/workflow_tracking.json`.
57
+ 2. Read `_forgetrail/TRACKING_SCHEMA.md` for where project state lives. The legacy JSON shape in that file is for migration only.
58
+ 3. Read **`appledger/profiles/forgetrail.yaml`** and the latest session record. Do **not** create **`.forgetrail/workflow_tracking.json`**.
59
+ 4. If using **Cursor**, copy **`_forgetrail/content/cursor-rules/forgetrail-phase-status.mdc`** to **`.cursor/rules/forgetrail-phase-status.mdc`** (create folders if needed) so agents surface phase / next actions from `appledger/profiles/forgetrail.yaml`.
60
60
  5. We're starting with Phase 1 (Architecture + Planning).
61
61
 
62
62
  **Rules for every session:**
63
63
 
64
- - At the start of each session, read `.forgetrail/workflow_tracking.json` and `CONTEXT_PROMPT.md` (if it exists).
64
+ - At the start of each session, read `appledger/profiles/forgetrail.yaml`, the latest session record, and `CONTEXT_PROMPT.md` (if it exists).
65
65
  - When you believe a phase's exit criteria are met, tell me explicitly: "I think we've completed [Phase X]. The exit criteria are met because [reasons]. Ready to move to [Phase Y]?" Wait for my confirmation.
66
- - After completing work, update `.forgetrail/workflow_tracking.json` following the structure in `TRACKING_SCHEMA.md`: move satisfied exit criteria, add decisions to the `decisions` array (with rationale), log issues to the `gotchas` array, and add session notes.
67
- - During Phase 1, create and lock **`docs/PHASE_1_BRIEF.md`**; mirror major decisions in **`decisions[]`**.
66
+ - After completing work, update **`appledger/`**: move satisfied criteria only when evidence exists, add decision records (with rationale), log lessons or questions, and update the session record. Do not write **`workflow_tracking.json`**.
67
+ - During Phase 1, create and lock **`docs/PHASE_1_BRIEF.md`**; mirror major decisions as decision records.
68
68
  - When we create `CONTEXT_PROMPT.md` (Phase 2), **merge `PHASE_1_BRIEF.md` into it** first (see template), then keep it updated as the source of truth.
69
69
  - If something isn't working after 5 turns, propose a fundamentally different approach rather than continuing to patch.
70
70
 
@@ -174,12 +174,12 @@ Phase 1 (Architecture + Planning):
174
174
  - Recommend what to skip for v1.
175
175
  - Wait for my confirmation on every architectural decision.
176
176
  - Create **`docs/PHASE_1_BRIEF.md`** from the ForgeTrail template (`_forgetrail/docs/` or MCP **`getTemplate("PHASE_1_BRIEF")`**). Fill and **lock** it before we exit Phase 1.
177
- - Record major commitments in **`.forgetrail/workflow_tracking.json`** → **`decisions[]`** (and phase notes) so the next session does not depend on chat history.
177
+ - Record major commitments as **decision records in `appledger/`** so the next session does not depend on chat history. Do not write **`workflow_tracking.json`**.
178
178
 
179
179
  Phase 2 (Scaffolding + Core Build):
180
180
 
181
181
  - Only after I've confirmed the architecture and the brief is locked.
182
- - Read **`PHASE_1_BRIEF.md`** and **`.forgetrail/workflow_tracking.json`** first.
182
+ - Read **`PHASE_1_BRIEF.md`**, **`appledger/profiles/forgetrail.yaml`**, and the latest session record first. Do not treat **`workflow_tracking.json`** as the live record.
183
183
  - Build the **entire app skeleton in one pass**: project init, dependencies, services, routes, components — **do not defer the runnable spine or hero flow**.
184
184
  - Include an import script if there's existing data.
185
185
  - Wire up the hero flow end to end.
package/README.md CHANGED
@@ -26,15 +26,15 @@ You need a new empty project folder and a coding agent that can read files. Node
26
26
  2. Copy [`content/FORGETRAIL_LITE.md`](content/FORGETRAIL_LITE.md) to `.forgetrail/FORGETRAIL_LITE.md`, or run `pnpm dlx forgetrail install --lite --with-genesis-stub` (Node.js 20+).
27
27
  3. Paste the kickoff line from [TRY_FORGETRAIL.md](TRY_FORGETRAIL.md). Approve the Phase 1 brief before any scaffold.
28
28
 
29
- The shortest supported first task is: create tracking, draft `docs/PHASE_1_BRIEF.md`, and wait for approval. You do not have to run all seven phases. Full recipe: [Try](https://forgetrail.dev/docs/try).
29
+ The shortest supported first task is: create `appledger/`, draft `docs/PHASE_1_BRIEF.md`, and wait for approval. You do not have to run all seven phases. Full recipe: [Try](https://forgetrail.dev/docs/try).
30
30
 
31
31
  ## Lite, CLI, and MCP
32
32
 
33
33
  | Path | Who uses it | What it is |
34
34
  | --- | --- | --- |
35
- | **Lite** | First path | One protocol file. The agent writes tracking. |
36
- | **CLI** (`forgetrail`) | Node.js 20+ | Installer. Writes Lite with a starter tracking file and Cursor hooks, or the full template tree. Skips files that already exist. Does not run the agent. |
37
- | **MCP** (`forgetrail-mcp`) | Cursor or Claude | Phase guidance, templates, and lessons search. Tracking still lives in the app repo. |
35
+ | **Lite** | First path | One protocol file. The agent writes `appledger/`. |
36
+ | **CLI** (`forgetrail`) | Node.js 20+ | Installer. Writes Lite and Cursor hooks, or the full template tree. It does not write a tracking JSON file. Skips files that already exist. Does not run the agent. |
37
+ | **MCP** (`forgetrail-mcp`) | Cursor or Claude | Phase guidance, templates, and lessons search. The ledger still lives in the app repo. |
38
38
 
39
39
  ```bash
40
40
  pnpm dlx forgetrail install --lite --with-genesis-stub
@@ -44,7 +44,7 @@ MCP: `npx -y forgetrail-mcp` with `FORGETRAIL_ROOT` set. Prefer `pnpm dlx` on Wi
44
44
 
45
45
  ## What you get
46
46
 
47
- A 7-phase playbook, a live `.forgetrail/workflow_tracking.json`, and templates pre-loaded with first-party production lessons. Each project leaves a trail of decisions, gotchas, and breadcrumbs that future work follows. Those lesson notes are not independent adoption evidence.
47
+ A 7-phase playbook, a ledger in `appledger/`, and templates pre-loaded with first-party production lessons. Each project leaves decisions, lessons, and a session handoff that future work follows. Those lesson notes are not independent adoption evidence. A new install does not create `.forgetrail/workflow_tracking.json`.
48
48
 
49
49
  Optional hooks in [`content/hooks/`](content/hooks/README.md) load the current phase at session start in Cursor or Claude Code, validate tracking edits, and check for a session note at session stop. The agent still does the writing. Flags, MCP, and the phase table live in the [docs](https://forgetrail.dev/docs).
50
50
 
@@ -1,12 +1,21 @@
1
- # workflow_tracking.json Schema Reference
1
+ # Project record
2
2
 
3
- This file documents how to read and update **`.forgetrail/workflow_tracking.json`** in customer project repos. (This ForgeTrail repo keeps a starter copy at **`workflow_tracking.json`** at the repo root for MCP `getInitialWorkflowTracking` — agents write the output to **`.forgetrail/workflow_tracking.json`** in the app repo.)
3
+ Phase, decisions, sessions, and gotchas live in **`appledger/`**.
4
4
 
5
- Agents should reference this when updating the tracking file.
5
+ - **`appledger/profiles/forgetrail.yaml`** holds the current phase instance and criteria. Phase ids are `plan`, `build`, `stabilize`, `iterate`, `refine`, `align`, and `harden`.
6
+ - Decision records, session records, and lesson or question records live under **`appledger/records/`**.
7
+ - Do **not** create or update **`.forgetrail/workflow_tracking.json`**. `.forgetrail/` is hooks and host integration.
8
+ - If that JSON file already exists and its `status` is not `pointer`, run **`appledger migrate preview`**, then apply once. Do not keep a second decision log.
9
+ - A file with `"status": "pointer"` and `"record": "appledger/"` is a leftover pointer. Do not add decisions, sessions, or phase status to it.
6
10
 
7
- ## Phase ID vocabulary (Lite vs MCP)
11
+ `getInitialWorkflowTracking` does not return a starter JSON file. `validateTracking` classifies an existing file. It does not accept a legacy document as healthy writable state.
12
+
13
+ The rest of this file describes the **legacy** Lite and full JSON shapes so an existing file can be recognized and migrated. It is not a template to copy into a new project.
14
+
15
+ ## Legacy phase id vocabulary (Lite vs full)
16
+
17
+ Both legacy schemas describe the same seven lifecycle phases. **`scripts/forgetrail-dev-launcher.mjs`** can still read either shape. New work uses the profile ids in the table's display-name column.
8
18
 
9
- Both schemas describe the same seven lifecycle phases. **`scripts/forgetrail-dev-launcher.mjs`** maps either shape to the display names below.
10
19
 
11
20
  | # | Lite `currentPhase` | MCP `currentPhase` | Display name |
12
21
  |---|---------------------|--------------------|--------------|
@@ -18,9 +27,9 @@ Both schemas describe the same seven lifecycle phases. **`scripts/forgetrail-dev
18
27
  | 6 | `6` | `6-strategic-review` | Align |
19
28
  | 7 | `7` | `7-hardening` | Harden |
20
29
 
21
- **Lite (`schemaVersion: "lite-1"`):** numeric `currentPhase`; each phase has **`exitCriteria`** as `{ "flagName": true/false }`. Starter: **`FORGETRAIL_LITE.md`** §11.
30
+ **Lite (`schemaVersion: "lite-1"`):** numeric `currentPhase`; each phase has **`exitCriteria`** as `{ "flagName": true/false }`. The old copy block is **`FORGETRAIL_LITE.md`** §11. Do not write it into a project.
22
31
 
23
- **MCP / full starter:** string `currentPhase`; each phase has **`exitCriteriaMet`** and **`exitCriteriaRemaining`** string arrays. Starter: repo-root **`workflow_tracking.json`** via `getInitialWorkflowTracking`.
32
+ **Full / MCP:** string `currentPhase`; each phase has **`exitCriteriaMet`** and **`exitCriteriaRemaining`** string arrays. The old sample remains at repo-root **`workflow_tracking.json`** for migration only. `getInitialWorkflowTracking` does not return it.
24
33
 
25
34
  ## Top-Level Fields
26
35
 
package/TRY_FORGETRAIL.md CHANGED
@@ -29,14 +29,14 @@ Prove ForgeTrail in one sitting: write a **what, not how** spec in any AI chat,
29
29
  `pnpm dlx forgetrail install --lite`
30
30
  Stub for Genesis too:
31
31
  `pnpm dlx forgetrail install --lite --with-genesis-stub`
32
- The CLI also writes a starter tracking file and Cursor hooks, and skips files that already exist.
32
+ The CLI writes the Lite protocol and Cursor hooks. It does not write a tracking JSON file. Project state belongs in `appledger/`. It skips files that already exist.
33
33
 
34
34
  5. **Save your spec as `docs/GENESIS.md`**
35
35
  Create `docs/` if needed. That path is the canonical handoff for ForgeTrail (not the repo root).
36
36
 
37
37
  6. **Open the folder in your coding agent** and paste this kickoff line:
38
38
 
39
- > Follow `.forgetrail/FORGETRAIL_LITE.md` as the project protocol. Treat `docs/GENESIS.md` as the product spec (what, not how). Create `.forgetrail/workflow_tracking.json` and draft `docs/PHASE_1_BRIEF.md` from the Genesis file, asking me only about gaps. Do not scaffold application code until I explicitly approve the Phase 1 brief.
39
+ > Follow `.forgetrail/FORGETRAIL_LITE.md` as the project protocol. Treat `docs/GENESIS.md` as the product spec (what, not how). Create `appledger/` (manifest, profile, application record, session record) and draft `docs/PHASE_1_BRIEF.md` from the Genesis file, asking me only about gaps. Do not create `workflow_tracking.json`. Do not scaffold application code until I explicitly approve the Phase 1 brief.
40
40
 
41
41
  7. **Approve the Phase 1 brief** before any app scaffold. If the agent starts writing application code early, stop it and paste the kickoff line again.
42
42
 
@@ -46,7 +46,7 @@ Prove ForgeTrail in one sitting: write a **what, not how** spec in any AI chat,
46
46
 
47
47
  - [ ] `.forgetrail/FORGETRAIL_LITE.md` is present
48
48
  - [ ] `docs/GENESIS.md` is present
49
- - [ ] `.forgetrail/workflow_tracking.json` exists
49
+ - [ ] `appledger/profiles/forgetrail.yaml` and a session record exist
50
50
  - [ ] `docs/PHASE_1_BRIEF.md` drafted from your Genesis (or clearly in progress)
51
51
  - [ ] The agent asked for approval before scaffolding
52
52
 
package/WORKFLOW.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  A persistent development system for building software with AI agents. A structured 7-phase workflow for solo developers building non-trivial full-stack apps with coding agents. Derived from 7 sessions and ~78,000 lines of real-world app development.
6
6
 
7
+ **System of record:** Phase, decisions, lessons, and sessions live in `appledger/` (`profiles/forgetrail.yaml` and records). Do not create or update `.forgetrail/workflow_tracking.json`. If that file already exists and is not a pointer, run `appledger migrate preview` and then apply. Do not keep a second decision log. `.forgetrail/` is hooks and host integration.
8
+
7
9
  ---
8
10
 
9
11
  ## 1. Phase Map
@@ -16,7 +18,7 @@ These phases emerged from the actual build sequence across all sessions. They're
16
18
 
17
19
  **Entry criteria:** You have a clear problem to solve and know your preferred tech stack.
18
20
 
19
- **Exit criteria:** You've confirmed tech choices, folder structure, data model shape, and the first batch of features to build. Claude has summarized its understanding back to you, and you've corrected any misunderstandings. **`PHASE_1_BRIEF.md` is complete and locked** (see §1a), and major commitments are in **`.forgetrail/workflow_tracking.json` → `decisions[]`** so Phase 2 can start without chat context.
21
+ **Exit criteria:** You've confirmed tech choices, folder structure, data model shape, and the first batch of features to build. Claude has summarized its understanding back to you, and you've corrected any misunderstandings. **`PHASE_1_BRIEF.md` is complete and locked** (see §1a), and major commitments are decision records in **`appledger/`** so Phase 2 can start without chat context.
20
22
 
21
23
  **What actually happened:** Session 1 opened with full context (existing job search system, 44 jobs, DOCX templates, preferred stack). Claude proposed Playwright over Puppeteer, docxtemplater for Word preservation, Kanban UI, filesystem-based storage, and an import migration path. All confirmed in a single exchange before any code was written.
22
24
 
@@ -102,7 +104,7 @@ These phases emerged from the actual build sequence across all sessions. They're
102
104
 
103
105
  **Principle:** **Phase 2** still means the **full app spine** in one pass — project init, dependencies, data path, routes, components, import/migration if needed, **hero flow end-to-end**. That spine should not be deferred.
104
106
 
105
- **ForgeTrail workspace:** All lifecycle/agent artifacts live in **`.forgetrail/`** at the repo root — **`.forgetrail/workflow_tracking.json`**, **`.forgetrail/IDEAS.md`**, platform rules (`AGENTS.md`, `CLAUDE.md`, optional `FORGETRAIL_LITE.md`). Product docs (`docs/PHASE_1_BRIEF.md`, `CONTEXT_PROMPT.md`, `README.md`, `TODO.md`, **`docs/FORGETRAIL_PROGRESS.md`**) stay outside `.forgetrail/`. Optionally gitignore `.forgetrail/` for a cleaner public repo or MCP-only boots (no vendored Lite). See **`FORGETRAIL_LITE.md` §1.5** and **`NEW_PROJECT_BOOTSTRAP.md`**.
107
+ **ForgeTrail workspace:** Protocol, rules, and hooks live in **`.forgetrail/`** at the repo root — **`.forgetrail/IDEAS.md`**, platform rules (`AGENTS.md`, `CLAUDE.md`, optional `FORGETRAIL_LITE.md`). Project state lives in **`appledger/`**. Do not create `.forgetrail/workflow_tracking.json`. Product docs (`docs/PHASE_1_BRIEF.md`, `CONTEXT_PROMPT.md`, `README.md`, `TODO.md`, **`docs/FORGETRAIL_PROGRESS.md`**) stay outside `.forgetrail/`. Optionally gitignore `.forgetrail/` for a cleaner public repo or MCP-only boots (no vendored Lite). Commit `appledger/` with the app. See **`FORGETRAIL_LITE.md` §1.5** and **`NEW_PROJECT_BOOTSTRAP.md`**.
106
108
 
107
109
  **Non-technical operators:** Phase 2 should add **setup/run/status** launchers (**`ONE_CLICK_DEV_SETUP.md`**) and **test-*** launchers per dependency (**`SYSTEM_HEALTH_CHECKS.md`**). Avoid hardcoded PocketBase versions (**§4.2.2**). Local Ollama: Granite 4.1 / Gemma 3 defaults, not thinking models unless required (**§4.8**).
108
110
 
@@ -110,7 +112,7 @@ These phases emerged from the actual build sequence across all sessions. They're
110
112
 
111
113
  | Phase | App / code | Docs to create or substantially extend (from ForgeTrail templates — or MCP `getTemplate`) |
112
114
  | ----- | ---------- | ------------------------------------------------------------------------------------------- |
113
- | **1 — Architecture** | Conversation only — no app code | **`PHASE_1_BRIEF.md`** (structured planning handoff). Log major commitments in **`.forgetrail/workflow_tracking.json`** (`decisions[]`, phase notes). |
115
+ | **1 — Architecture** | Conversation only — no app code | **`PHASE_1_BRIEF.md`** (structured planning handoff). Record major commitments as decision records in **`appledger/`**, and note the sign-off on the session record. |
114
116
  | **2 — Scaffolding** | Entire runnable skeleton + hero flow | **`CONTEXT_PROMPT.md`** populated by **merging `PHASE_1_BRIEF.md`** into it (see CONTEXT_PROMPT template “Handoff from Phase 1”), then **`README.md`**, **`TODO.md`**, **`.forgetrail/IDEAS.md`**. **Do not** generate the rest of the `docs/` template set in Phase 2 unless the user explicitly needs a file for the spine (rare). |
115
117
  | **3 — Stabilization** | Reliability, env, errors | Update **`CONTEXT_PROMPT.md`** / **`README.md`** when behavior, env, or patterns change. No new template types required. |
116
118
  | **4 — Feature iteration** | Features, specs | Per complex feature: write **`specs/[feature].md`** from **`SPEC_FEATURE_TEMPLATE`** before multi-file work (lifecycle: `specs/` → `partial/` → `completed/`). Add **`TECHNICAL_REFERENCE.md`** when the API/data model surface is non-trivial; **`TEST_PLAN.md`** when manual QA paths deserve a written walkthrough; **`DESIGN_SYSTEM.md`** for layout, a11y, and repeated UI patterns as the UI grows. Optional: **`DEV_ESTIMATE.md`**. When a release adds **new user-facing capabilities** (not only refactors), extend **`TECHNICAL_REFERENCE.md` → Feature Documentation** with a stub for each area (routes, data, discovery → import parity) and add **`TEST_PLAN.md`** scenarios — don’t capture the work only as 💡 lesson callouts in **`CONTEXT_PROMPT.md`**. |
@@ -128,24 +130,24 @@ These phases emerged from the actual build sequence across all sessions. They're
128
130
 
129
131
  If the project repo has [gstack](https://github.com/garrytan/gstack) installed (slash-command skills for Claude Code), ForgeTrail and gstack are **complementary layers** rather than competing systems. They solve different problems:
130
132
 
131
- - **ForgeTrail** = **lifecycle methodology + project memory.** Phases, exit criteria, progressive docs, `.forgetrail/workflow_tracking.json`, business/brand strategy, lessons, and audits.
133
+ - **ForgeTrail** = **lifecycle methodology + project memory.** Phases, exit criteria, progressive docs, `appledger/`, business/brand strategy, lessons, and audits.
132
134
  - **gstack** = **sprint execution + automation.** Slash-command skills that act as virtual team roles (engineering review, QA, security, deploy) within the current coding session.
133
135
 
134
- **The integration model:** ForgeTrail owns the *what* and *when* (which phase, which docs, which exit criteria). gstack skills accelerate the *how* (build faster, review better, test more thoroughly, deploy safely). After every meaningful gstack sprint, persist outcomes in ForgeTrail's tracking system — gstack has no cross-session memory.
136
+ **The integration model:** ForgeTrail owns the *what* and *when* (which phase, which docs, which exit criteria). gstack skills accelerate the *how* (build faster, review better, test more thoroughly, deploy safely). After every meaningful gstack sprint, persist outcomes in `appledger/` — gstack has no cross-session memory.
135
137
 
136
138
  ### Phase-by-phase integration
137
139
 
138
140
  **Phase 1 — Plan:**
139
- Use gstack's `/office-hours` for product framing conversations and `/plan-ceo-review` for scope validation. Capture all outputs in **`PHASE_1_BRIEF.md`** and `.forgetrail/workflow_tracking.json → decisions[]` — these are ForgeTrail artifacts that gstack doesn't produce. Example: after `/office-hours` surfaces a risk, add it to the brief's §8 (Risks & Mitigations) and log the decision in tracking.
141
+ Use gstack's `/office-hours` for product framing conversations and `/plan-ceo-review` for scope validation. Capture all outputs in **`PHASE_1_BRIEF.md`** and as decision records in `appledger/` — these are ForgeTrail artifacts that gstack doesn't produce. Example: after `/office-hours` surfaces a risk, add it to the brief's §8 (Risks & Mitigations) and record the decision.
140
142
 
141
143
  **Phase 2 — Build:**
142
144
  Use `/plan-eng-review` to validate the technical spine before committing. After building the skeleton, run `/review` on the initial commit to catch structural issues early. ForgeTrail handles the brief → `CONTEXT_PROMPT.md` merge and progressive doc creation (`README`, `TODO`, `.forgetrail/IDEAS.md`).
143
145
 
144
146
  **Phase 3 — Stabilize:**
145
- Use `/investigate` for systematic root-cause debugging when errors are non-obvious. Log every gotcha found in `.forgetrail/workflow_tracking.json → gotchas[]` and update `CONTEXT_PROMPT.md` — gstack fixes the bug but ForgeTrail ensures the lesson persists so the next session doesn't repeat it.
147
+ Use `/investigate` for systematic root-cause debugging when errors are non-obvious. Record every lesson in `appledger/` and update `CONTEXT_PROMPT.md` — gstack fixes the bug but ForgeTrail ensures the lesson persists so the next session doesn't repeat it.
146
148
 
147
149
  **Phase 4 — Iterate:**
148
- This is where gstack's inner loop shines. Per feature: `/plan-eng-review` (design) → build → `/review` (code quality) → `/qa` (browser-based testing with Playwright) → `/ship` (commit + changelog). After each shipped feature, update `TODO.md` (mark done), `CONTEXT_PROMPT.md` (if patterns changed), and `.forgetrail/workflow_tracking.json` (exit criteria progress, session notes). For complex features, write a ForgeTrail `specs/[feature].md` *before* starting the gstack build cycle.
150
+ This is where gstack's inner loop shines. Per feature: `/plan-eng-review` (design) → build → `/review` (code quality) → `/qa` (browser-based testing with Playwright) → `/ship` (commit + changelog). After each shipped feature, update `TODO.md` (mark done), `CONTEXT_PROMPT.md` (if patterns changed), and `appledger/` (criteria that have evidence, and the session record). For complex features, write a ForgeTrail `specs/[feature].md` *before* starting the gstack build cycle.
149
151
 
150
152
  **Phase 5 — Refine:**
151
153
  Use `/review` on refactor branches to verify no regressions. After refactoring, update `CONTEXT_PROMPT.md` and `TECHNICAL_REFERENCE.md` to reflect the new file structure — gstack's review catches broken imports but doesn't update your documentation.
@@ -158,7 +160,7 @@ Run **both** ForgeTrail's `runAudit("black-hat")` and gstack's `/cso` — they'r
158
160
 
159
161
  ### Key rule
160
162
 
161
- After every gstack sprint that completes meaningful work, **update `.forgetrail/workflow_tracking.json`** (advance exit criteria, add decisions/gotchas, update session notes). gstack does persist some sprint-level artifacts — design docs from `/office-hours` live in `~/.gstack/projects/`, retro snapshots in `.context/retros/`, review gate overrides per branch, and skill usage analytics. But gstack has **no lifecycle state** (what phase are we in?), **no decision rationale log** (why did we choose PocketBase over Supabase?), **no gotcha capture** (what burned us and how did we fix it?), and **no architecture context document** (what does the file tree look like, what patterns do we use?). ForgeTrail's `.forgetrail/workflow_tracking.json` + `CONTEXT_PROMPT.md` fill exactly this gap — they are the system of record that lets the next session pick up where this one left off without replaying context from chat history.
163
+ After every gstack sprint that completes meaningful work, **update `appledger/`** (criteria that have evidence, decision records, lessons, and the session record). Do not write `.forgetrail/workflow_tracking.json`. gstack does persist some sprint-level artifacts — design docs from `/office-hours` live in `~/.gstack/projects/`, retro snapshots in `.context/retros/`, review gate overrides per branch, and skill usage analytics. But gstack has **no lifecycle state** (what phase are we in?), **no decision rationale log** (why did we choose PocketBase over Supabase?), **no lesson capture** (what burned us and how did we fix it?), and **no architecture context document** (what does the file tree look like, what patterns do we use?). ForgeTrail's `appledger/` + `CONTEXT_PROMPT.md` fill exactly this gap — they are the system of record that lets the next session pick up where this one left off without replaying context from chat history.
162
164
 
163
165
  ---
164
166
 
@@ -166,10 +168,10 @@ After every gstack sprint that completes meaningful work, **update `.forgetrail/
166
168
 
167
169
  When the host agent supports **parallel subagents** (Grok Build `spawn_subagent`, Cursor Task/subagents, Claude agent teams, etc.), ForgeTrail and subagents are **complementary layers** — same relationship as ForgeTrail + gstack in §1b:
168
170
 
169
- - **ForgeTrail** = **lifecycle methodology + project memory.** Phases, exit criteria, progressive docs, `.forgetrail/workflow_tracking.json`, audits, and lessons.
171
+ - **ForgeTrail** = **lifecycle methodology + project memory.** Phases, exit criteria, progressive docs, `appledger/`, audits, and lessons.
170
172
  - **Subagents** = **parallel, context-isolated execution** within a phase — audits, research, spikes, and deep exploration without bloating the parent thread.
171
173
 
172
- **The integration model:** ForgeTrail owns the *what* and *when* (which phase, which docs, which exit criteria). Subagents multiply throughput on the parts of ForgeTrail that are most context-heavy and parallelizable. The **parent agent** always synthesizes subagent output into ForgeTrail artifacts and updates tracking — subagents have no cross-session memory.
174
+ **The integration model:** ForgeTrail owns the *what* and *when* (which phase, which docs, which exit criteria). Subagents multiply throughput on the parts of ForgeTrail that are most context-heavy and parallelizable. The **parent agent** always synthesizes subagent output into ForgeTrail artifacts and updates `appledger/` — subagents have no cross-session memory.
173
175
 
174
176
  ### Phase-by-phase integration
175
177
 
@@ -180,7 +182,7 @@ Main agent only (or one **read-only** explore subagent for competitive/market re
180
182
  Main agent builds the full spine in one pass. Optional: one read-only subagent to research integration edge cases — do not split the hero-flow build across subagents unless the host explicitly supports coordinated merge.
181
183
 
182
184
  **Phase 3 — Stabilize:**
183
- Optional read-only explore subagent for stubborn root-cause analysis; parent logs every gotcha in `.forgetrail/workflow_tracking.json → gotchas[]` and updates `CONTEXT_PROMPT.md`.
185
+ Optional read-only explore subagent for stubborn root-cause analysis; the parent records every lesson in `appledger/` and updates `CONTEXT_PROMPT.md`.
184
186
 
185
187
  **Phase 4 — Iterate:**
186
188
  Strong fit. Call **`suggestSubagentDecomposition`** then spawn parallel explore subagents for feature research and tradeoff analysis; optional **worktree-isolated** spike for prototyping. Parent picks the approach and implements (or delegates to a single write-capable subagent).
@@ -192,14 +194,14 @@ Worktree-isolated subagents for exploratory refactors; parent reviews, merges, a
192
194
  Optional read-only subagents for market/competitor research; synthesis targets ForgeTrail templates (`BRAND_AND_PRODUCT`, strategic `TODO`).
193
195
 
194
196
  **Phase 7 — Harden:**
195
- Strong fit. Spawn parallel **read-only** subagents per audit type (security/black-hat, UX cohesion, code quality). Each subagent runs **`runAudit`** + **`searchLessons`** as appropriate. Parent synthesizes into `BLACK_HAT_REPORT.md`, `CODE_QUALITY.md`, triages into `TODO.md`, and updates tracking.
197
+ Strong fit. Spawn parallel **read-only** subagents per audit type (security/black-hat, UX cohesion, code quality). Each subagent runs **`runAudit`** + **`searchLessons`** as appropriate. Parent synthesizes into `BLACK_HAT_REPORT.md`, `CODE_QUALITY.md`, triages into `TODO.md`, and updates `appledger/`.
196
198
 
197
199
  ### Recommended pattern
198
200
 
199
201
  1. Call **`suggestSubagentDecomposition`** with current phase + task description.
200
202
  2. Spawn subagents with **`background: true`** (or equivalent) when the host supports it.
201
- 3. Parent collects outputs → progressive docs + `.forgetrail/workflow_tracking.json`.
202
- 4. Run **`validateTracking`** after synthesis.
203
+ 3. Parent collects outputs → progressive docs + `appledger/`.
204
+ 4. Run **`validateTracking`** after synthesis. A pointer is accepted. A writable tracking document is a conflict.
203
205
 
204
206
  ### Concrete example (Phase 7 — Grok-style hosts)
205
207
 
@@ -211,14 +213,14 @@ Spawn three read-only subagents in parallel:
211
213
  2. UX: ux-cohesion or panel-usability audit against current UI flows.
212
214
  3. Code quality: audit against CODE_QUALITY template + getAntiPatterns.
213
215
 
214
- Parent: synthesize into BLACK_HAT_REPORT.md + CODE_QUALITY.md, update tracking gotchas/decisions, present prioritized next actions.
216
+ Parent: synthesize into BLACK_HAT_REPORT.md + CODE_QUALITY.md, record lessons and decisions in appledger/, present prioritized next actions.
215
217
  ```
216
218
 
217
219
  Hosts differ in spawn syntax — call **`getAgentIntegrationGuide`** (`grok`, `cursor`, `claude`, or `generic`) for tailored commands.
218
220
 
219
221
  ### Key rule
220
222
 
221
- After subagent results return, the **parent must** update `.forgetrail/workflow_tracking.json` (advance exit criteria, add decisions/gotchas, update session notes) and relevant progressive docs. Subagents fix or explore in isolation but **do not** replace ForgeTrail as the system of record for lifecycle state, decision rationale, or gotcha capture.
223
+ After subagent results return, the **parent must** update `appledger/` (criteria that have evidence, decision records, lessons, and the session record) and relevant progressive docs. Do not write `.forgetrail/workflow_tracking.json`. Subagents fix or explore in isolation but **do not** replace ForgeTrail as the system of record for lifecycle state, decision rationale, or lesson capture.
222
224
 
223
225
  ---
224
226
 
@@ -226,7 +228,7 @@ After subagent results return, the **parent must** update `.forgetrail/workflow_
226
228
 
227
229
  The 7 phases were extracted from a commercial SaaS build, and the default exit criteria assume one — payments, brand pillars, business plan, security audit. Many ForgeTrail projects are **not** that: a gift app for a birthday, an internal dashboard, a weekend tool. Forcing a one-time-use trivia game through "Payment flow works end to end" produces noise (endless `N/A` annotations) and, worse, teaches agents to rubber-stamp criteria instead of reading them.
228
230
 
229
- **Fix: choose an archetype in Phase 1 and prune the tracking template at bootstrap.** The archetype is a product-shape question, same class as state persistence — ask it early, record it in **`PHASE_1_BRIEF.md`** (§1 or §3) and **`decisions[]`**, and store it as **`project.archetype`** in **`.forgetrail/workflow_tracking.json`** (see `TRACKING_SCHEMA.md`).
231
+ **Fix: choose an archetype in Phase 1 and prune the profile at bootstrap.** The archetype is a product-shape question, same class as state persistence — ask it early, record it in **`PHASE_1_BRIEF.md`** (§1 or §3) and as a decision, and store it as **`archetype`** on **`appledger/profiles/forgetrail.yaml`**.
230
232
 
231
233
  | Archetype | What it is | Phase adjustments |
232
234
  |-----------|-----------|-------------------|
@@ -236,26 +238,26 @@ The 7 phases were extracted from a commercial SaaS build, and the default exit c
236
238
 
237
239
  **Agent duties when archetype ≠ `product`:**
238
240
 
239
- 1. **Prune, don't annotate.** At bootstrap (or as soon as the archetype is decided), remove non-applicable exit criteria from the tracking file's phase arrays and replace collapsed phases with the archetype's gate criteria. A criterion that survives pruning must be genuinely checkable — the goal is that every remaining item is real.
240
- 2. **Log the pruning as a decision** (`decisions[]`) so a later session knows the missing criteria were removed intentionally, not lost.
241
+ 1. **Prune, don't annotate.** At bootstrap (or as soon as the archetype is decided), remove non-applicable criteria from the profile and replace collapsed phases with the archetype's gate criteria. A criterion that survives pruning must be genuinely checkable — the goal is that every remaining item is real.
242
+ 2. **Record the pruning as a decision** in `appledger/` so a later session knows the missing criteria were removed intentionally, not lost.
241
243
  3. **Escalate on drift.** If a `one-shot` starts growing accounts, or an `internal-tool` gets external users, say so explicitly and propose re-promoting to `product` — restoring the pruned criteria for the phases still ahead. Archetypes scale the lifecycle down; they are not a permanent exemption.
242
244
 
243
- For quick throwaway spikes (an experiment you may delete tomorrow), consider skipping ForgeTrail entirely — a tracking file for a two-hour prototype is overhead, not discipline. The archetypes above are for projects that will be **finished**, however small.
245
+ For quick throwaway spikes (an experiment you may delete tomorrow), consider skipping ForgeTrail entirely — a ledger for a two-hour prototype is overhead, not discipline. The archetypes above are for projects that will be **finished**, however small.
244
246
 
245
247
  ---
246
248
 
247
249
  ## 1e. Wrap protocol (closing a project and harvesting its lessons)
248
250
 
249
- ForgeTrail's tracking schema collects `gotchas[]` and `decisions[]` all project long — but nothing consumed them systematically at the end. A small project could log two genuinely reusable gotchas and have them die in the repo because no propagation pass ever ran. The wrap protocol closes that loop: **finishing a project includes harvesting it.**
251
+ The ledger collects lessons and decisions all project long — but nothing consumed them systematically at the end. A small project could record two genuinely reusable lessons and have them die in the repo because no propagation pass ever ran. The wrap protocol closes that loop: **finishing a project includes harvesting it.**
250
252
 
251
253
  **When to run:** the project is done (shipped, delivered, handed off) or being intentionally shelved. For `one-shot` projects this is a natural, expected step — the project ends, ForgeTrail keeps the lessons. For long-lived products, run the same harvest step at major milestones (launch, ownership change) rather than waiting for a "wrap" that may never come.
252
254
 
253
255
  **Steps:**
254
256
 
255
- 1. **Sweep the tracking file.** Read every `gotchas[]` and `decisions[]` entry plus `CONTEXT_PROMPT.md`'s gotcha/pattern sections. For each, ask: *is this generalizable beyond this app?* Framework traps, CLI behavior changes, and integration surprises usually are; app-specific content decisions usually are not.
256
- 2. **Run the propagation prompt** (`prompts/propagate-to-forgetrail.md`) with the harvest list as input — see its **Harvest mode** section, designed for exactly this sweep. Small projects without a product journal or full doc set use the tracking file as the primary discovery source.
257
- 3. **Close the tracking file.** Set `project.status` to `"wrapped"` (see `TRACKING_SCHEMA.md`), add a final `sessions[]` entry summarizing end state and where things live (deploy URL, handoff notes), and make a final commit. Optionally tag the repo (`v1.0`, `shipped`).
258
- 4. **Log the propagation** in ForgeTrail's `update-log.md` as usual. A wrap with zero propagable lessons is legitimate — note "wrapped, nothing to propagate" in the final session entry and skip steps 2 and 4.
257
+ 1. **Sweep the ledger.** Read every lesson and decision record plus `CONTEXT_PROMPT.md`'s lesson and pattern sections. For each, ask: *is this generalizable beyond this app?* Framework traps, CLI behavior changes, and integration surprises usually are; app-specific content decisions usually are not.
258
+ 2. **Run the propagation prompt** (`prompts/propagate-to-forgetrail.md`) with the harvest list as input — see its **Harvest mode** section, designed for exactly this sweep. Small projects without a product journal or full doc set use `appledger/` as the primary discovery source.
259
+ 3. **Close the ledger.** Set `project_status` to `wrapped` on `appledger/profiles/forgetrail.yaml`, add a final session record summarizing end state and where things live (deploy URL, handoff notes), and make a final commit. Optionally tag the repo (`v1.0`, `shipped`). Do not write `.forgetrail/workflow_tracking.json`.
260
+ 4. **Log the propagation** in ForgeTrail's `update-log.md` as usual. A wrap with zero propagable lessons is legitimate — note "wrapped, nothing to propagate" in the final session record and skip steps 2 and 4.
259
261
 
260
262
  **Why this is a protocol and not a suggestion:** the compounding loop (README) only compounds if lessons actually flow back. One flagship project propagating regularly plus a dozen small projects propagating never is a leak — the small projects are often where the freshest scaffolding and framework gotchas surface, because they exercise the newest tool versions.
261
263
 
@@ -268,7 +270,9 @@ Catalyst Forge siblings (and Cloudflare as a default DNS/hosting suggestion) are
268
270
  - **ForgeTrail** = lifecycle + project memory.
269
271
  - **Companions** = one bounded job (publish Markdown, named ports, editorial review, quality score, labels, backup, voice journal).
270
272
 
271
- They are **never required**. Decline is success. Do not dump the shelf at kickoff. Suggest when a trigger is true; persist outcomes in `.forgetrail/workflow_tracking.json`.
273
+ They are **never required**. Decline is success. Do not dump the shelf at kickoff. Suggest when a trigger is true; persist the outcome on the appledger session as `data.companion_outcomes`. Do not write `workflow_tracking.json`.
274
+
275
+ **Subjects:** When an applicable subject exists — an application, a tool server, a skill package, an agent configuration, or a model variant — record a disposition with `appledger subjects`. A family with no subject is `not_applicable`, not a missing label. Do not generate or rewrite a label. A published xFacts label remains an offer when the product goes public or changes hands, and only if the user asks.
272
276
 
273
277
  **Agents:** `getCompanionSuggestions` (`phase` or `situation`) plus the optional footer on `getPhaseGuidance`. Mapping: `content/COMPANION_TOOLS.md`. Shelf: [catalystforge.com/tools](https://catalystforge.com/tools/).
274
278
 
@@ -284,7 +288,8 @@ They are **never required**. Decline is success. Do not dump the shelf at kickof
284
288
  - Hard-to-undo work → TemperPass
285
289
  - Pre-launch newcomer check → Cold-eye
286
290
  - Quality / presentation of a tool, site, or page → CraftAssay
287
- - Product going public or handed off → xFacts
291
+ - An applicable subject exists → record a disposition (`appledger subjects`). A missing family stays `not_applicable`. Do not generate a label.
292
+ - Product going public or handed off, and the user asks → offer an xFacts label
288
293
  - Unpushed work you cannot lose → IngotVault
289
294
  - Spoken idea capture → DictaWhisper
290
295
 
@@ -298,8 +303,8 @@ ForgeTrail includes deterministic host hooks (`.forgetrail/hooks/` with `.cursor
298
303
 
299
304
  - **Shell guards:** Runs pre-commit verification (`pnpm run verify`), prevents package manager divergence (e.g. `npm`/`yarn` when `pnpm-lock.yaml` is present), gates `git push` on explicit user approval, and flags destructive operations (`git reset --hard`, `rm -rf`).
300
305
  - **Edit guards:** Requires user confirmation before mutating environment secrets (`.env*`) or canonical/completed specs (`specs/completed/**`).
301
- - **Session start injection:** Dynamically injects project name, current phase, open exit criteria, and last session notes on session start, retiring always-on static phase rules.
302
- - **Tracking validation:** Validates `.forgetrail/workflow_tracking.json` on save, returning issues immediately.
306
+ - **Session start injection:** Points the session at `appledger/` (profile phase and the latest session). It does not treat `.forgetrail/workflow_tracking.json` as the live phase.
307
+ - **Tracking validation:** A pointer to `appledger/` is accepted. A writable `workflow_tracking.json` is a conflict and is not the system of record.
303
308
 
304
309
  Where the host supports hooks, tool-level denial and injection take the load off agent context budgets.
305
310
 
@@ -322,29 +327,29 @@ Where the host supports hooks, tool-level denial and injection take the load off
322
327
  - Identify the hardest integration points (in Exec Foundry: DOCX XML manipulation)
323
328
  - Suggest a migration path for existing data
324
329
  - Recommend what to skip for v1
325
- - **If your agent supports a native plan mode** (Grok `/plan`, Cursor Plan mode, extended plan-before-code): use it for all Phase 1 work. Include **`getGreenfieldIntakePrompt`** questions in the plan context. Do **not** write app code or heavy docs until the user approves the plan. On approval, map the plan into **`PHASE_1_BRIEF.md`** (`getTemplate`) and log commitments in **`decisions[]`**. See **`getPlanModePatterns`** (MCP) or WORKFLOW §1c for handoff details.
326
- - **Classify the project archetype** (`product` | `internal-tool` | `one-shot`) per **§1d** and prune the tracking template's exit criteria to match. Record it in **`PHASE_1_BRIEF.md`**, **`decisions[]`**, and **`project.archetype`** in the tracking file. Default to `product` when unsure.
327
- - **If this is a web app**, answer the state-persistence sub-question **before** locking PocketBase + auth: *"Does any state need to outlive this browser — accounts, cross-device sync, shared data — or is state per-user local?"* If local-only → drop PocketBase + auth, target `adapter-static`, persist via `localStorage` / `IndexedDB`. If persistent → full backend stack. Record the answer in **`PHASE_1_BRIEF.md` §4 (`State persistence:`)** and **`decisions[]`**. See **ForgeTrail Lite** §7 (A-local vs A-persistent) and **GREENFIELD_INTAKE.md** §7.
328
- - **Hosting / DNS / git (if still open):** ask registrar, DNS, git host, and production host. If the user has not already named providers, default to **GitHub** + **Cloudflare DNS** (free plan) and **Cloudflare Pages** for a static site. A DigitalOcean (or similar) origin stays valid when the app needs a server. Record in the brief and `decisions[]`.
330
+ - **If your agent supports a native plan mode** (Grok `/plan`, Cursor Plan mode, extended plan-before-code): use it for all Phase 1 work. Include **`getGreenfieldIntakePrompt`** questions in the plan context. Do **not** write app code or heavy docs until the user approves the plan. On approval, map the plan into **`PHASE_1_BRIEF.md`** (`getTemplate`) and record commitments as decisions in **`appledger/`**. See **`getPlanModePatterns`** (MCP) or WORKFLOW §1c for handoff details.
331
+ - **Classify the project archetype** (`product` | `internal-tool` | `one-shot`) per **§1d** and prune the profile's criteria to match. Record it in **`PHASE_1_BRIEF.md`**, as a decision, and as **`archetype`** on the profile. Default to `product` when unsure.
332
+ - **If this is a web app**, answer the state-persistence sub-question **before** locking PocketBase + auth: *"Does any state need to outlive this browser — accounts, cross-device sync, shared data — or is state per-user local?"* If local-only → drop PocketBase + auth, target `adapter-static`, persist via `localStorage` / `IndexedDB`. If persistent → full backend stack. Record the answer in **`PHASE_1_BRIEF.md` §4 (`State persistence:`)** and as a decision in **`appledger/`**. See **ForgeTrail Lite** §7 (A-local vs A-persistent) and **GREENFIELD_INTAKE.md** §7.
333
+ - **Hosting / DNS / git (if still open):** ask registrar, DNS, git host, and production host. If the user has not already named providers, default to **GitHub** + **Cloudflare DNS** (free plan) and **Cloudflare Pages** for a static site. A DigitalOcean (or similar) origin stays valid when the app needs a server. Record in the brief and as a decision in `appledger/`.
329
334
  - **Optional companions** (never required): TemperPass before hard-to-undo locks; FilePress if the product is a Markdown site; DictaWhisper if they capture ideas by voice; LocalSlip/LocalHelm if this machine already runs other local apps. Call **`getCompanionSuggestions`**. See §1f.
330
335
  - **If any content is produced by an LLM** (not hand-authored, not from a conventional non-LLM API), pick one of three content-generation patterns **in Phase 1** — it drives deploy model, cost, and secret management:
331
336
  - **Runtime LLM API** — server route calls the provider per request; needs rate-limit + streaming UX. **Cloud** (OpenAI, Anthropic, …): API keys in `.env`. **Local Ollama:** `OLLAMA_BASE_URL` + `OLLAMA_MODEL`; Phase 2 **`setup:ollama`** / **`test:ollama`** (see **SYSTEM_HEALTH_CHECKS.md**, Lite §4.8) — default **Granite 4.1** / **Gemma 3**, not thinking models unless required.
332
337
  - **Build-time LLM generation** — `scripts/seed.ts` calls the provider once, writes JSON into `data/`, commits it; no runtime cost; pairs well with A-local + `adapter-static`. Seed may use cloud APIs or the same Ollama env as local dev.
333
338
  - **BYO-LLM paste** — ship a prompt in the repo; the user runs it in their own LLM chat (including a local Ollama UI) and pastes JSON into `data/seed.json`; Zod validates at app start; zero project-level keys.
334
339
 
335
- Record pattern, provider, and env vars in **`PHASE_1_BRIEF.md`** (content-generation section) and **`decisions[]`**. See **ForgeTrail Lite** §7.1 for minimal reference skeletons.
340
+ Record pattern, provider, and env vars in **`PHASE_1_BRIEF.md`** (content-generation section) and as a decision in **`appledger/`**. See **ForgeTrail Lite** §7.1 for minimal reference skeletons.
336
341
 
337
342
  **Artifacts to create:**
338
343
 
339
344
  - **`PHASE_1_BRIEF.md`** in `docs/` (from `_forgetrail/docs/PHASE_1_BRIEF.md` template or ForgeTrail MCP `getTemplate({ name: "PHASE_1_BRIEF" })`). Fill every section; mark **locked** when accurate.
340
- - **`.forgetrail/workflow_tracking.json`**: append **`decisions[]`** entries for each major architectural commitment (with rationale); update **`phases["1-architecture"].notes`** with sign-off summary.
345
+ - **`appledger/`**: a decision record for each major architectural commitment (with rationale); the session record carries the sign-off summary. Do not create `.forgetrail/workflow_tracking.json`.
341
346
 
342
347
  **Verify before moving on:**
343
348
 
344
349
  - You've confirmed or rejected every architectural suggestion
345
350
  - Claude has acknowledged your tech stack preferences (not just its defaults)
346
351
  - The data model handles your existing data, not just new data
347
- - **`PHASE_1_BRIEF.md` is complete and locked** — Phase 2 can start from this file + `.forgetrail/workflow_tracking.json` without the Phase 1 chat
352
+ - **`PHASE_1_BRIEF.md` is complete and locked** — Phase 2 can start from this file + `appledger/` without the Phase 1 chat
348
353
 
349
354
  **Example prompt (this worked):**
350
355
 
@@ -357,7 +362,7 @@ Where the host supports hooks, tool-level denial and injection take the load off
357
362
  - Confirmed architecture decisions from Phase 1
358
363
  - Access to any existing data/templates that need importing
359
364
  - **Optional — JSON from another LLM chat:** If you are generating **seed, fixture, or import data** as JSON, you can use any LLM (ChatGPT, Claude, Gemini, etc.) with a **structured prompt**, save the reply to a file in the repo (e.g. `data/seed-catalog.json`), then hand it to the coding agent. You can do this **multiple times** for different datasets or iterations. The agent should **validate** the JSON at the boundary (e.g. Zod / JSON Schema) before import — same caution as any LLM-produced structured content. A ready-to-customize prompt template lives in **ForgeTrail Lite** (`content/FORGETRAIL_LITE.md` §4.3) for copy-paste use.
360
- - **Optional — web search for live internet data:** If the product needs **current web results** (not only static seed JSON), the human typically **signs up** for a search API, adds a key to **`.env`**, and hands off to the agent. Common developer-friendly options include **[Tavily](https://tavily.com/)** and the **[Brave Search API](https://api-dashboard.search.brave.com/)** (both offer **entry-level or free monthly credits** — verify on [Tavily pricing](https://tavily.com/pricing) and [Brave API pricing](https://api-dashboard.search.brave.com/documentation/pricing)). See **ForgeTrail Lite** §4.4; record provider and env var names in **`decisions[]`** and **`CONTEXT_PROMPT.md`**.
365
+ - **Optional — web search for live internet data:** If the product needs **current web results** (not only static seed JSON), the human typically **signs up** for a search API, adds a key to **`.env`**, and hands off to the agent. Common developer-friendly options include **[Tavily](https://tavily.com/)** and the **[Brave Search API](https://api-dashboard.search.brave.com/)** (both offer **entry-level or free monthly credits** — verify on [Tavily pricing](https://tavily.com/pricing) and [Brave API pricing](https://api-dashboard.search.brave.com/documentation/pricing)). See **ForgeTrail Lite** §4.4; record provider and env var names as a decision in **`appledger/`** and in **`CONTEXT_PROMPT.md`**.
361
366
  - **Content-generation pattern (if the Phase 1 choice applies):** scaffold whichever of the three patterns was locked — **Runtime LLM API** (server route + provider config: cloud keys or **Ollama** `OLLAMA_*` + **`setup-ollama`** / **`test-ollama`** launchers), **Build-time LLM generation** (`scripts/seed.ts` + `data/*.json` committed; seed may call Ollama or cloud), or **BYO-LLM paste** (prompt file in repo + `data/seed.json` + Zod validator). **ForgeTrail Lite** §7.1 has minimal reference skeletons (OpenAI route, Ollama route, seed script, import-time validator) to copy. Validate all LLM-produced JSON at the boundary; treat the model's output as untrusted.
362
367
  - **External URL → record (if applicable):** When the hero flow imports from **listing or article URLs**, follow **ForgeTrail Lite** §7.2 — layered fetch/parse, honest failure typing when **DOM drift** empties extraction, optional single **verbatim** LLM recover behind an env gate — and mirror detail in **`docs/TECHNICAL_REFERENCE.md`** as the project grows.
363
368
 
@@ -371,7 +376,7 @@ Where the host supports hooks, tool-level denial and injection take the load off
371
376
 
372
377
  - `.env.example` with all required variables (for **PocketBase** stacks: include the **public API URL and port** — e.g. `PUBLIC_POCKETBASE_URL=…` — so local dev does not assume default **8090** when other PocketBase servers or projects are already using it; the serve script, app client, and schema tools must all agree on the same value. See **ForgeTrail Lite** §14 and **`POCKETBASE_SCHEMA_SCRIPT.md`**.)
373
378
  - `.gitignore`
374
- - **Phase 2 doc set only** (see **§1a Progressive documentation**): First read **`PHASE_1_BRIEF.md`** and **`.forgetrail/workflow_tracking.json`**. Create **`CONTEXT_PROMPT.md`** and **merge** the brief into it using the mapping in the CONTEXT_PROMPT template (“Handoff from Phase 1”). Then **`README.md`**, **`TODO.md`** (seed from brief §11), **`.forgetrail/IDEAS.md`** from `_forgetrail/docs/` templates (or ForgeTrail MCP `getTemplate` name `IDEAS`).
379
+ - **Phase 2 doc set only** (see **§1a Progressive documentation**): First read **`PHASE_1_BRIEF.md`** and **`appledger/profiles/forgetrail.yaml`**. Create **`CONTEXT_PROMPT.md`** and **merge** the brief into it using the mapping in the CONTEXT_PROMPT template (“Handoff from Phase 1”). Then **`README.md`**, **`TODO.md`** (seed from brief §11), **`.forgetrail/IDEAS.md`** from `_forgetrail/docs/` templates (or ForgeTrail MCP `getTemplate` name `IDEAS`).
375
380
  - **Do not** create the rest of the ForgeTrail doc templates in Phase 2 (e.g. `BRAND_AND_PRODUCT`, `CODE_QUALITY`, `DEPLOYMENT`) unless the user explicitly requires one to complete the spine.
376
381
 
377
382
  **Verify before moving on:**
@@ -405,7 +410,7 @@ Where the host supports hooks, tool-level denial and injection take the load off
405
410
  - No **new** doc files. However:
406
411
  - Update **`CONTEXT_PROMPT.md`** with any patterns, env quirks, or workarounds discovered during stabilization.
407
412
  - Update **`README.md`** if setup steps changed (new env vars, revised install, required services).
408
- - Add **`gotchas[]`** entries to **`.forgetrail/workflow_tracking.json`** for every surprise (env, path, auth, integration) so the same mistake is never repeated.
413
+ - Record a lesson in **`appledger/`** for every surprise (env, path, auth, integration) so the same mistake is never repeated. Do not write `.forgetrail/workflow_tracking.json`.
409
414
 
410
415
  **Verify before moving on:**
411
416
 
@@ -415,7 +420,7 @@ Where the host supports hooks, tool-level denial and injection take the load off
415
420
 
416
421
  **Anti-pattern:** Reporting "it doesn't work" without the error message. The fix: always include the exact output.
417
422
 
418
- **Optional companion:** when the cause is not yet earned, offer **Gap Last** (`getCompanionSuggestions` situation `unclear-cause`). Log remaining questions in `gotchas[]`.
423
+ **Optional companion:** when the cause is not yet earned, offer **Gap Last** (`getCompanionSuggestions` situation `unclear-cause`). Record remaining questions in `appledger/`.
419
424
 
420
425
  ### Phase 4: Feature Iteration + Value Delivery
421
426
 
@@ -562,7 +567,7 @@ Where the host supports hooks, tool-level denial and injection take the load off
562
567
  - No silent failures in core workflows
563
568
  - Docs alignment audit passed (MCP `runAudit({ type: "docs-alignment" })` or `_forgetrail/prompts/docs-alignment-audit.md`)
564
569
 
565
- **Optional companions:** Cold-eye for newcomer readiness; CraftAssay for a quality score of the presented work; xFacts label when the product goes public or changes hands; FilePress + Cloudflare Pages for a Markdown or docs site; IngotVault before a rewrite. See §1f.
570
+ **Optional companions:** Cold-eye for newcomer readiness; CraftAssay for a quality score of the presented work; FilePress + Cloudflare Pages for a Markdown or docs site; IngotVault before a rewrite. If an applicable subject exists, record a disposition; a missing family is `not_applicable`. Offer an xFacts label only when the product goes public or changes hands and the user asks. Do not generate a label. See §1f.
566
571
 
567
572
  ---
568
573
 
@@ -797,7 +802,7 @@ Print this and work through it sequentially for each new project.
797
802
 
798
803
  - [ ] Open with full context + "summarize your understanding and make suggestions before building"
799
804
  - [ ] Create and complete **`PHASE_1_BRIEF.md`**; lock it before treating Phase 1 as done
800
- - [ ] Record major decisions in **`.forgetrail/workflow_tracking.json`** (`decisions[]` + phase 1 notes)
805
+ - [ ] Record major decisions in **`appledger/`** (decision records and the session record)
801
806
  - [ ] Confirm or reject every architectural suggestion explicitly
802
807
  - [ ] Say "Make it so" only after all decisions are locked
803
808
  - [ ] Verify the app runs and shows real data
@@ -864,7 +869,7 @@ Print this and work through it sequentially for each new project.
864
869
  - [ ] Use "paste the error" for debugging
865
870
  - [ ] Update CONTEXT_PROMPT.md before ending (especially decisions and their WHY)
866
871
  - [ ] Mark completed TODOs, add new ones
867
- - [ ] Update .forgetrail/workflow_tracking.json with session notes, decisions, gotchas
872
+ - [ ] Update the appledger session, decisions, and lessons. Do not write workflow_tracking.json
868
873
 
869
874
  ---
870
875
 
@@ -897,7 +902,7 @@ Full templates for each document live in `_forgetrail/docs/` (or ForgeTrail MCP
897
902
 
898
903
  ### Document Lifecycle
899
904
 
900
- **Phase 1 (Architecture):** Complete and lock **`PHASE_1_BRIEF.md`**; mirror commitments in **`.forgetrail/workflow_tracking.json`**.
905
+ **Phase 1 (Architecture):** Complete and lock **`PHASE_1_BRIEF.md`**; mirror commitments as decision records in **`appledger/`**. Do not write `.forgetrail/workflow_tracking.json`.
901
906
 
902
907
  **Phase 2 (Scaffold):** Full **app spine** in one pass. **Docs:** Merge brief → **`CONTEXT_PROMPT.md`**, then **`TODO.md`**, **`README.md`**, **`.forgetrail/IDEAS.md`** only (§1a). Minimal extra prose at first beyond the merge.
903
908
 
@@ -17,7 +17,7 @@ Claude-based coding agents integrate with ForgeTrail through MCP, extended plann
17
17
 
18
18
  **New project:**
19
19
  ```
20
- Call ForgeTrail getNewProjectKickoff, write .forgetrail/workflow_tracking.json, getGreenfieldIntakePrompt, getPhaseGuidance("1").
20
+ Call ForgeTrail getNewProjectKickoff, write appledger/, getGreenfieldIntakePrompt, getPhaseGuidance("1"). Do not write workflow_tracking.json.
21
21
  No app code until PHASE_1_BRIEF.md is locked.
22
22
  ```
23
23