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.
- package/CONTINUATION_PROMPT.md +5 -5
- package/INITIAL_PROMPT.md +15 -15
- package/README.md +5 -5
- package/TRACKING_SCHEMA.md +16 -7
- package/TRY_FORGETRAIL.md +3 -3
- package/WORKFLOW.md +50 -45
- package/content/AGENT_INTEGRATION_claude.md +1 -1
- package/content/AGENT_INTEGRATION_cursor.md +3 -3
- package/content/AGENT_INTEGRATION_generic.md +5 -5
- package/content/AGENT_INTEGRATION_grok.md +8 -8
- package/content/COMPANION_TOOLS.md +1 -1
- package/content/FORGETRAIL_LITE.md +72 -68
- package/content/FORGETRAIL_PROGRESS.md +3 -3
- package/content/GENESIS_SPEC_PROMPT.md +1 -1
- package/content/GENESIS_STUB.md +1 -1
- package/content/GREENFIELD_INTAKE.md +6 -6
- package/content/KICKOFF_WITHOUT_MCP.md +1 -1
- package/content/NEW_PROJECT_BOOTSTRAP.md +27 -27
- package/content/PLAN_MODE_PATTERNS.md +4 -4
- package/content/POST_BOOTSTRAP_USER_MESSAGE.md +1 -1
- package/content/SESSION_RESUME_MCP.md +7 -7
- package/content/companion-tools.json +1 -1
- package/content/cursor-rules/forgetrail-phase-status.mdc +8 -9
- package/content/examples/two-session-continuity.md +31 -67
- package/content/forgetrail-workspace-README.md +2 -2
- package/content/hooks/README.md +3 -3
- package/content/hooks/session-start.mjs +58 -63
- package/content/hooks/session-stop.mjs +49 -30
- package/content/hooks/validate-tracking-core.mjs +34 -1
- package/content/scripts/forgetrail-dev-launcher.mjs +12 -2
- package/content/skills/forgetrail/SKILL.md +21 -21
- package/content/skills/forgetrail/SKILL_FACTS.md +2 -2
- package/docs/CONTEXT_PROMPT.md +1 -1
- package/docs/NPM.md +8 -8
- package/docs/PHASE_1_BRIEF.md +7 -7
- package/package.json +69 -70
- package/scripts/forgetrail-cli.mjs +1 -1
- package/scripts/install-lib.mjs +1 -0
- package/scripts/install.mjs +6 -23
- package/scripts/publish-gate.mjs +6 -4
- package/scripts/tracking-cutover.test.mjs +109 -0
- package/scripts/workspace-index.mjs +9 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ForgeTrail Lite — portable kickoff for any agentic chat
|
|
2
2
|
|
|
3
|
-
> **ForgeTrail Lite v2.
|
|
3
|
+
> **ForgeTrail Lite v2.2.0**
|
|
4
4
|
> © Catalyst Forge, LLC — [www.catalystforge.com](https://www.catalystforge.com)
|
|
5
5
|
> Part of the **ForgeTrail** open-source methodology ([Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) in the upstream ForgeTrail repo).
|
|
6
6
|
>
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
A single self-contained file for starting a new project in **any** agent: Cursor, Claude Code, Claude Cowork, OpenAI Codex, Cline, Aider, Continue, Windsurf, etc. **No MCP server, no vendored methodology tree, no external fetches.** Drop this file into the repo (or paste it into chat), and the agent has enough structure to run a real project end to end.
|
|
10
10
|
|
|
11
|
+
**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`. §11 is the legacy shape for `appledger migrate` only. 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 the protocol, rules, and hooks.
|
|
12
|
+
|
|
11
13
|
> **Maintainers:** Optional onboarding blocks in **§4.3**, **§4.4**, and **§7.1** are intentionally duplicated in root **`README.md`** and **`WORKFLOW.md`**. When you edit one, sync the others (see **`update-log.md`** — FORGETRAIL_LITE release checklist, item 3).
|
|
12
14
|
|
|
13
15
|
> **Audience:** agent-first, but skim-friendly for humans. If you are the human, read §1–§3 then hand the rest to your agent. If you are the agent, read it all once, then follow §4 step by step.
|
|
@@ -20,7 +22,7 @@ Read this block **before you touch a tool.** These are the footguns that most co
|
|
|
20
22
|
|
|
21
23
|
1. **Clean commit messages.** Use `git commit -m "…"` or `git commit -F file` (multi-line). Commit at natural stopping points with concise summaries. Never leave broken uncommitted work across session boundaries.
|
|
22
24
|
2. **Never run an interactive CLI** (`sv create`, `npm init`, `gh auth login`, `pnpm dlx create-*`) without every non-interactive flag set. A TTY prompt in an agent terminal hangs the session. Full rule: §8 rule 6.
|
|
23
|
-
3. **Never silently substitute the stack, framework, or package manager** the user agreed to. If a constraint forces a deviation, ask first and
|
|
25
|
+
3. **Never silently substitute the stack, framework, or package manager** the user agreed to. If a constraint forces a deviation, ask first and record a decision in `appledger/`. Full rule: §7 + §8.
|
|
24
26
|
4. **Never dump a wall of intake questions** into one message. Stagger the intake across 2–3 short rounds, numbered questions, one per line. Full rule: §5 + §9.
|
|
25
27
|
|
|
26
28
|
If your host supports hooks (Cursor `hooks.json`, Claude Code `settings.json`), these rules are backed by host-level guards in `.forgetrail/hooks/` that run pre-commit verification, block unrequested pushes, and enforce package manager locking. On hosts without hooks, these rules are prompt-level only. Do not violate them.
|
|
@@ -39,7 +41,7 @@ If your host supports hooks (Cursor `hooks.json`, Claude Code `settings.json`),
|
|
|
39
41
|
|
|
40
42
|
Any of the three works. A + C together is best. For a written pre-Phase-1 spec, A + **`docs/GENESIS.md`** is the Try path.
|
|
41
43
|
|
|
42
|
-
**Context budget note:** This protocol is comprehensive (~28k tokens) and is designed to guide initial kickoff and reference. Do not load this entire file into always-on context on every subsequent turn. After Phase 2 spine scaffolding, persistent project state lives in
|
|
44
|
+
**Context budget note:** This protocol is comprehensive (~28k tokens) and is designed to guide initial kickoff and reference. Do not load this entire file into always-on context on every subsequent turn. After Phase 2 spine scaffolding, persistent project state lives in `appledger/`, `CONTEXT_PROMPT.md`, and active feature specs. On Cursor and Claude Code, host hooks in `.forgetrail/hooks/` point the session at `appledger/` without consuming prompt budget.
|
|
43
45
|
|
|
44
46
|
---
|
|
45
47
|
|
|
@@ -47,7 +49,7 @@ Any of the three works. A + C together is best. For a written pre-Phase-1 spec,
|
|
|
47
49
|
|
|
48
50
|
ForgeTrail agent artifacts (protocol, tracking, platform rules) live in **`.forgetrail/`** at the repo root — **whether you bootstrap via ForgeTrail Lite file copy or MCP greenfield.**
|
|
49
51
|
|
|
50
|
-
**Upstream ForgeTrail is open source** (Apache 2.0). In your app repo, **`.forgetrail/`** holds
|
|
52
|
+
**Upstream ForgeTrail is open source** (Apache 2.0). In your app repo, **`.forgetrail/`** holds the protocol, rules, and hooks. Project state lives in **`appledger/`**. **MCP greenfield** does not need a tracking JSON file. **Lite file bootstrap** may copy `FORGETRAIL_LITE.md` here; you may **commit** `.forgetrail/` under the same license or **gitignore** it to keep the public repo focused on app code and to avoid duplicating a large protocol when MCP already serves updates. Never commit **secrets** (`.env`, API keys) inside the ledger or rules.
|
|
51
53
|
|
|
52
54
|
```
|
|
53
55
|
.forgetrail/
|
|
@@ -56,7 +58,6 @@ ForgeTrail agent artifacts (protocol, tracking, platform rules) live in **`.forg
|
|
|
56
58
|
AGENTS.md ← §12 snippet
|
|
57
59
|
CLAUDE.md ← §12.5 snippet (Claude Code)
|
|
58
60
|
IDEAS.md ← backlog parking lot
|
|
59
|
-
workflow_tracking.json ← §11 starter / live tracking
|
|
60
61
|
hooks/ ← host safety hooks (scripts + configs)
|
|
61
62
|
cursor/rules/ ← §12 Cursor rule snippets
|
|
62
63
|
forgetrail-updates-log.mdc
|
|
@@ -67,10 +68,10 @@ ForgeTrail agent artifacts (protocol, tracking, platform rules) live in **`.forg
|
|
|
67
68
|
|
|
68
69
|
| Choice | When | `.gitignore` | Bootstrap commit includes |
|
|
69
70
|
|--------|------|--------------|---------------------------|
|
|
70
|
-
| **A — Commit `.forgetrail/`** (Lite default) | Self-contained history;
|
|
71
|
+
| **A — Commit `.forgetrail/`** (Lite default) | Self-contained history; protocol and rules travel with the repo | Do **not** list `.forgetrail/` | `.forgetrail/` artifacts from steps 3–4 (`AGENTS.md`, rules, hooks, optional Lite copy). Commit `appledger/` with the app. |
|
|
71
72
|
| **B — Gitignore `.forgetrail/`** | Cleaner public app repo; MCP serves methodology; avoid vendoring a large Lite file on GitHub | Add `.forgetrail/` | `.gitignore` only (+ any `.cursor/rules/` copies you symlinked for IDE load) — agent workspace stays local |
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
Record the choice as a decision in **`appledger/`** (for example, commit `.forgetrail/` or gitignore it). Never commit **secrets** (`.env`, API keys) inside the ledger or rules.
|
|
74
75
|
|
|
75
76
|
**Cursor / IDE wiring (local only):** tools read `.cursor/rules/` and repo-root `AGENTS.md` by default — not `.forgetrail/`. After creating `.forgetrail/`, either:
|
|
76
77
|
|
|
@@ -87,24 +88,26 @@ When a boot surfaces a gap in **ForgeTrail Lite itself** (not a one-off app bug)
|
|
|
87
88
|
|
|
88
89
|
- **Upstream template:** `forgetrail/content/FORGETRAIL_LITE_UPDATES.md` (empty starter — copy into `.forgetrail/`).
|
|
89
90
|
- **Cursor rule:** `.forgetrail/cursor/rules/forgetrail-updates-log.mdc` (§12.5) — symlink into `.cursor/rules/` (§1.5).
|
|
90
|
-
- **Log session-local incidents**
|
|
91
|
+
- **Log session-local incidents** as a lesson or an open question in `appledger/` — routine bugs and product-only notes do not belong in the updates file.
|
|
91
92
|
- **Write for maintainers:** what went wrong, which Lite § should change, optional pointer to this repo. Tighten or cross-link if the topic is already covered.
|
|
92
93
|
|
|
93
94
|
---
|
|
94
95
|
|
|
95
96
|
## 2. What this is (and what it is not)
|
|
96
97
|
|
|
97
|
-
**ForgeTrail Lite is** a minimal, stack-agnostic project kickoff protocol: a 7-phase lifecycle, a Phase 1 product brief,
|
|
98
|
+
**ForgeTrail Lite is** a minimal, stack-agnostic project kickoff protocol: a 7-phase lifecycle, a Phase 1 product brief, an `appledger/` ledger, a few baseline docs, and a set of guardrails that keep agents from shipping a half-built spine or silently swapping your stack.
|
|
98
99
|
|
|
99
100
|
**It is not** the full ForgeTrail methodology — no audit prompts, no deep per-phase playbooks, no lessons database, no template library. For those, use the ForgeTrail MCP server (see §13). Lite gets you ~80% of the value in one file.
|
|
100
101
|
|
|
101
|
-
**Optional companions:** when a job matches (Markdown site, two or more local apps, local Ollama, copy review
|
|
102
|
+
**Optional companions:** when a job matches (Markdown site, two or more local apps, local Ollama, copy review), you may offer a sibling from the Catalyst Forge shelf. Never required. Do not list them in the first message to the human. MCP: `getCompanionSuggestions`. Full mapping lives with ForgeTrail, not in this file.
|
|
103
|
+
|
|
104
|
+
**Subjects:** When the project has 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 publish a label unless the user asks. Offering an xFacts label when the product goes public or changes hands stays optional.
|
|
102
105
|
|
|
103
106
|
**Named ports (if they accept):** [LocalSlip](https://localslip.dev). FilePress: lease name = site `package.json` `name`. `localslip claim NAME --port N && filepress dev`. Do not pass `--port`. Vite: `localslip get` in `vite.config`, `strictPort`. Claim once. Do not write `ensure-lease.mjs`. Do not add the `localslip` package just to read a port.
|
|
104
107
|
|
|
105
108
|
### Who creates what
|
|
106
109
|
|
|
107
|
-
The **human** only needs to do two things: copy ForgeTrail Lite into **`.forgetrail/`** (or paste this doc into chat), and tell the agent to follow it. **Everything else is created by the agent** as it works through the phases. You should never be asked to hand-write
|
|
110
|
+
The **human** only needs to do two things: copy ForgeTrail Lite into **`.forgetrail/`** (or paste this doc into chat), and tell the agent to follow it. **Everything else is created by the agent** as it works through the phases. You should never be asked to hand-write `appledger/`, `.forgetrail/AGENTS.md`, the brief, `CONTEXT_PROMPT.md`, or the Phase 2 baseline files — the agent writes them and shows them to you for review. Do not create `.forgetrail/workflow_tracking.json`.
|
|
108
111
|
|
|
109
112
|
| File / folder | Who creates it | When |
|
|
110
113
|
|---|---|---|
|
|
@@ -115,7 +118,7 @@ The **human** only needs to do two things: copy ForgeTrail Lite into **`.forgetr
|
|
|
115
118
|
| `.forgetrail/cursor/rules/forgetrail-updates-log.mdc` | **Agent** (from §12.5 snippet) | First session — symlink/copy to `.cursor/rules/` for Cursor |
|
|
116
119
|
| `.forgetrail/hooks/` + `.cursor/hooks.json` | **Agent** (from upstream `content/hooks/`) | First session — host-level safety and tracking enforcement |
|
|
117
120
|
| `.forgetrail/FORGETRAIL_LITE_UPDATES.md` | **Agent** (from upstream template) | Optional — when logging Lite protocol gaps (§1.6) |
|
|
118
|
-
|
|
|
121
|
+
| `appledger/` (manifest, profile, application record, session record) | **Agent** | First session |
|
|
119
122
|
| `docs/FORGETRAIL_PROGRESS.md` | **Agent** (template + refreshed on phase changes / status script) | Phase 2+ (§4.6) |
|
|
120
123
|
| `setup.bat` / `setup.sh`, `run.bat` / `run.sh`, `status.bat` / `status.sh` | **Agent** | Phase 2 when local dev needs repeatability (§4.5) |
|
|
121
124
|
| `test-pocketbase.bat`, `test-ollama.bat`, `setup-ollama.bat` (+ `.sh`) | **Agent** | Phase 2 per stack (§4.7–§4.8) |
|
|
@@ -140,7 +143,7 @@ Every project flows through these phases. The agent **pauses at every phase tran
|
|
|
140
143
|
|
|
141
144
|
| # | Phase | Entry | Exit |
|
|
142
145
|
|---|-------|-------|------|
|
|
143
|
-
| **1** | **Plan** | user has a rough idea | `docs/PHASE_1_BRIEF.md` is complete and **locked**; stack, hero flow, v1 scope, and major
|
|
146
|
+
| **1** | **Plan** | user has a rough idea | `docs/PHASE_1_BRIEF.md` is complete and **locked**; stack, hero flow, v1 scope, and major choices are decision records in `appledger/` |
|
|
144
147
|
| **2** | **Build (spine)** | Phase 1 brief is locked | a **runnable end-to-end hero flow** exists in one pass: project init, deps installed, data path working, routes + components + hero journey wired, `CONTEXT_PROMPT.md` written by merging the brief, and a runnable `verify` script in `package.json` passing cleanly |
|
|
145
148
|
| 3 | Stabilize | spine runs | critical bugs fixed, error paths handled, the happy path + 1–2 known sad paths are reliable |
|
|
146
149
|
| 4 | Iterate | hero flow is solid | secondary features land one at a time; each complex feature has a short **delivery spec** (§3.1) before multi-file work; each ships with tests or at least a manual test note |
|
|
@@ -148,17 +151,17 @@ Every project flows through these phases. The agent **pauses at every phase tran
|
|
|
148
151
|
| 6 | Align | code is clean | brand, naming, copy, and UX are coherent; `README.md` matches reality |
|
|
149
152
|
| 7 | Harden | product is coherent | security review, performance pass, deploy pipeline, post-deploy live smoke check (HTTP 200, assets resolve), docs for the next operator |
|
|
150
153
|
|
|
151
|
-
**Deep focus in Lite:** Phases **1** and **2**. Most projects die because the brief was skipped and the spine was half-built. Phases 3–7 are real but mostly need the user to say "let's move on" — the agent's job after Phase 2 is to keep
|
|
154
|
+
**Deep focus in Lite:** Phases **1** and **2**. Most projects die because the brief was skipped and the spine was half-built. Phases 3–7 are real but mostly need the user to say "let's move on" — the agent's job after Phase 2 is to keep `appledger/` current and not regress.
|
|
152
155
|
|
|
153
|
-
**Project archetype (scale the lifecycle to the project):** During Phase 1 intake, classify the project and record it in the brief,
|
|
156
|
+
**Project archetype (scale the lifecycle to the project):** During Phase 1 intake, classify the project and record it in the brief, as a decision, and as `archetype` on `appledger/profiles/forgetrail.yaml`:
|
|
154
157
|
|
|
155
158
|
- **`product`** (default) — others will use it, maybe pay for it. Full 7-phase lifecycle.
|
|
156
159
|
- **`internal-tool`** — real recurring users, no market. Phase 6 (Align) optional; Phase 7 keeps security/deploy/docs but drops payments, business plan, and marketing criteria.
|
|
157
160
|
- **`one-shot`** — keepsake, gift, event, or demo built for one occasion. Phases 1–4 scaled down; phases 5–7 collapse into one **polish + ship** gate: works on the target device (usually a phone), no dead ends, `prefers-reduced-motion` respected, personal/placeholder content filled, deployed or handed off. Emotional polish outranks hardening depth here.
|
|
158
161
|
|
|
159
|
-
When archetype ≠ `product`, **prune** the non-applicable
|
|
162
|
+
When archetype ≠ `product`, **prune** the non-applicable criteria in the profile once (and record that pruning as a decision) instead of annotating them "N/A" forever. If the project outgrows its archetype (a one-shot grows accounts), flag it and propose re-promoting to `product`.
|
|
160
163
|
|
|
161
|
-
**Wrap (when the project ends):** Finishing a project includes **harvesting** it. When the app ships, is delivered, or is intentionally shelved: sweep
|
|
164
|
+
**Wrap (when the project ends):** Finishing a project includes **harvesting** it. When the app ships, is delivered, or is intentionally shelved: sweep lesson and decision records for lessons that generalize beyond this app (framework traps, CLI changes, integration surprises), record them in `FORGETRAIL_LITE_UPDATES.md` (§1.6) or propagate to the upstream ForgeTrail repo if you have one, set `project_status` to `wrapped`, and add a final session record with the end state (deploy URL, handoff notes). Small projects often surface the freshest tooling lessons — do not let them die in the repo. Optional: Cold-eye for a newcomer-readiness pass. A public xFacts label is still optional and only when the user asks. The subject disposition from the **Subjects** note above is already recorded.
|
|
162
165
|
|
|
163
166
|
### 3.1 Feature specs (Phase 4+)
|
|
164
167
|
|
|
@@ -231,7 +234,7 @@ Before touching files or running setup, verify the tools this protocol depends o
|
|
|
231
234
|
- **macOS:** `xcode-select --install` installs the Command Line Tools (includes git). Alternative: `brew install git` if Homebrew is present.
|
|
232
235
|
- **Linux:** `sudo apt install git` (Debian/Ubuntu), `sudo dnf install git` (Fedora/RHEL), `sudo pacman -S git` (Arch), or the distro equivalent.
|
|
233
236
|
- **Ask the user:** *"Git isn't installed. I can wait while you install it with `<OS-specific command>`, or we can proceed without source control for now and you can add git later. Which would you prefer?"*
|
|
234
|
-
3. If the user proceeds **without git**, enter **no-git mode**: skip step 2, step 5, and the commits in step 12.
|
|
237
|
+
3. If the user proceeds **without git**, enter **no-git mode**: skip step 2, step 5, and the commits in step 12. Record a decision that source control is deferred, and a lesson that git is not yet installed. Treat "install git + run the missed commits" as a Phase 7 hardening task. Never pretend commits happened.
|
|
235
238
|
4. The agent **must not install git itself** — always run the install command by asking the user to execute it, or instruct them to run it in their own terminal. System-wide installs require user consent.
|
|
236
239
|
5. **Check git configuration.** Ensure basic git configuration (`user.name`, `user.email`) exists before making baseline commits.
|
|
237
240
|
|
|
@@ -249,7 +252,7 @@ Before touching files or running setup, verify the tools this protocol depends o
|
|
|
249
252
|
|
|
250
253
|
1. After Node is present, run `npm --version`. If it prints a version, continue.
|
|
251
254
|
2. If `node` works but `npm` is missing, the install is incomplete or PATH is wrong — ask the user to **reinstall Node.js LTS** from <https://nodejs.org/> (the official installer includes **npm** and **corepack**). Do not proceed to pnpm until `npm` resolves.
|
|
252
|
-
3. **npm is not the package manager for Lite projects** — it is only a **bootstrap tool** to reach pnpm (`npm install -g pnpm`) when corepack does not activate pnpm. Never substitute `npm install` for `pnpm install` in the app repo without an explicit user decision
|
|
255
|
+
3. **npm is not the package manager for Lite projects** — it is only a **bootstrap tool** to reach pnpm (`npm install -g pnpm`) when corepack does not activate pnpm. Never substitute `npm install` for `pnpm install` in the app repo without an explicit user decision recorded as a decision in `appledger/`.
|
|
253
256
|
|
|
254
257
|
**pnpm** (needed from step 10 onward — install **after** Node and npm):
|
|
255
258
|
|
|
@@ -258,7 +261,7 @@ Before touching files or running setup, verify the tools this protocol depends o
|
|
|
258
261
|
- Run `corepack enable`, then `corepack prepare pnpm@latest --activate` (or the version in `packageManager` once `package.json` exists), then re-check `pnpm --version`.
|
|
259
262
|
3. If corepack is unavailable or still doesn't resolve pnpm:
|
|
260
263
|
- Confirm **`npm --version`** works, then ask the user to run **`npm install -g pnpm`** (may need admin / sudo). Re-check `pnpm --version`.
|
|
261
|
-
4. **Do not silently fall back to `npm` or `yarn` for project installs.** Lite's defaults are pnpm-anchored (lockfile, workspace semantics, script conventions). If the user truly cannot install pnpm (rare — locked-down machine), stop and discuss before picking an alternative, and
|
|
264
|
+
4. **Do not silently fall back to `npm` or `yarn` for project installs.** Lite's defaults are pnpm-anchored (lockfile, workspace semantics, script conventions). If the user truly cannot install pnpm (rare — locked-down machine), stop and discuss before picking an alternative, and record the deviation as a decision in `appledger/`.
|
|
262
265
|
5. **Native addons (pnpm v9+).** If install logs say **"Ignored build scripts"** for packages like **`better-sqlite3`**, add at the **workspace root** `package.json`:
|
|
263
266
|
```json
|
|
264
267
|
"pnpm": { "onlyBuiltDependencies": ["better-sqlite3"] }
|
|
@@ -280,7 +283,7 @@ If the project will push to GitHub:
|
|
|
280
283
|
|
|
281
284
|
### 4.1.2 Stack-conditional checks (Phase 2 entry — after brief is locked)
|
|
282
285
|
|
|
283
|
-
**When:** Start of **Phase 2** (§4.2 step 10 onward), once **`docs/PHASE_1_BRIEF.md`** is locked and stack choices are in **`
|
|
286
|
+
**When:** Start of **Phase 2** (§4.2 step 10 onward), once **`docs/PHASE_1_BRIEF.md`** is locked and stack choices are decision records in **`appledger/`**. Do **not** block Phase 1 on these — they depend on what the project actually uses.
|
|
284
287
|
|
|
285
288
|
**Agent:** Walk the rows that apply; skip the rest. Prefer **isolated test scripts** (§4.7–§4.8) over “start the whole app and guess.”
|
|
286
289
|
|
|
@@ -293,36 +296,36 @@ If the project will push to GitHub:
|
|
|
293
296
|
| **E2E / Playwright in v1** | `pnpm run test:e2e:install` (or project script) once before first `test:e2e` | **`DEV_AUTOMATION_SCRIPTS.md`** |
|
|
294
297
|
| **Native Node addons** (`better-sqlite3`, `sharp`, `bcrypt`, …) | First `pnpm install`: if compile fails, install OS build tools; set **`pnpm.onlyBuiltDependencies`** at workspace root (§4.1 pnpm step 5) | §13 |
|
|
295
298
|
| **Monorepo `backend/` + `frontend/`** | Merge **root + package** `.env` in Vite/Node entry (§4.2.1); run **`env:check`** after both `.env.example` files exist | §4.2.1 |
|
|
296
|
-
| **Docker / Postgres / Redis / custom DB** (stack override) | Follow brief §6
|
|
299
|
+
| **Docker / Postgres / Redis / custom DB** (stack override) | Follow brief §6 and the decision records — document install in **`README.md`**, not Lite defaults | Phase 1 override only |
|
|
297
300
|
| **A-local (no PocketBase)** | Skip PocketBase/Ollama rows unless brief still uses local LLM without PB | §7 A-local |
|
|
298
301
|
|
|
299
302
|
**Port and disk (runtime):** If PocketBase or Ollama fails mysteriously, check **port** in `.env` (not default **8090** on busy machines) and **disk/RAM** for Ollama models — use **`test-pocketbase.bat`** / **`test-ollama.bat`**, not universal preflight.
|
|
300
303
|
|
|
301
304
|
**Linux minimal images:** If `setup-pocketbase` fails on extract, confirm **`unzip`** (Mac/Linux scripts) or use Windows PowerShell path — see §4.1 install-script note.
|
|
302
305
|
|
|
303
|
-
|
|
306
|
+
Record anything non-obvious as a lesson in **`appledger/`** (for example, Playwright browsers installed on a second machine, or node-gyp needing VS Build Tools on Windows).
|
|
304
307
|
|
|
305
308
|
### 4.2 Ordered first actions
|
|
306
309
|
|
|
307
|
-
1. **Read** `.forgetrail/FORGETRAIL_LITE.md` top to bottom. Also read
|
|
310
|
+
1. **Read** `.forgetrail/FORGETRAIL_LITE.md` top to bottom. Also read `appledger/profiles/forgetrail.yaml`, the latest session record, `.forgetrail/AGENTS.md`, and `CONTEXT_PROMPT.md` if they already exist. Do not read a writable `workflow_tracking.json` as the live phase.
|
|
308
311
|
2. **Ensure the folder is a git repo.** *(Skip this step if the user opted into no-git mode in §4.1.)* Check with `git rev-parse --is-inside-work-tree`. If it returns false or errors, run `git init -b main` (or `git init` + `git branch -m main` on older git) at the repo root. Never re-init an existing repo. **Apply §1.5 git policy** (default: **commit `.forgetrail/`** for Lite). Write a minimal `.gitignore` containing at least:
|
|
309
312
|
```
|
|
310
313
|
node_modules/
|
|
311
314
|
.env
|
|
312
315
|
.DS_Store
|
|
313
316
|
```
|
|
314
|
-
Add `.forgetrail/` **only** if you chose §1.5 branch **B** (gitignore). Do **not** add it when committing `.forgetrail/`.
|
|
317
|
+
Add `.forgetrail/` **only** if you chose §1.5 branch **B** (gitignore). Do **not** add it when committing `.forgetrail/`. Record the choice as a decision. (The full `.gitignore` lands in Phase 2 per §14.)
|
|
315
318
|
3. **Create `.forgetrail/`** if missing. **Create platform rule files** inside it (see §1.5), even if the current session is only one tool. Users switch between tools between sessions.
|
|
316
319
|
1. **`.forgetrail/AGENTS.md`** — use the §12 snippet verbatim. Covers Codex CLI and any other `AGENTS.md`-native tool (cite explicitly or symlink to repo root locally if your tool requires root `AGENTS.md`).
|
|
317
320
|
2. **`.forgetrail/cursor/rules/forgetrail-updates-log.mdc`** — use the §12.5 snippet verbatim. **Symlink or copy** into `.cursor/rules/` so Cursor reminds agents when to update `FORGETRAIL_LITE_UPDATES.md` (§1.6). Optional: copy the upstream **`FORGETRAIL_LITE_UPDATES.md`** starter into `.forgetrail/` when you expect protocol feedback during the project.
|
|
318
321
|
3. **`.forgetrail/hooks/` and `.cursor/hooks.json`** — install host safety hooks (`content/hooks/`) into `.forgetrail/hooks/` and copy `cursor-hooks.json` to `.cursor/hooks.json`. On Cursor, this runs pre-commit verification, enforces pnpm lock consistency, gates git push at the tool level, and injects live phase context at session start. For Claude Code, add `claude-settings-hooks.json` into `.claude/settings.json`.
|
|
319
|
-
If any of these already exists and its content conflicts with the Lite defaults, **do not overwrite** — flag the conflict to the user and ask how to reconcile.
|
|
320
|
-
4. **Create
|
|
322
|
+
If any of these already exists and its content conflicts with the Lite defaults, **do not overwrite** — flag the conflict to the user and ask how to reconcile. Record the reconciliation as a decision in `appledger/`.
|
|
323
|
+
4. **Create `appledger/`** if it does not exist: `manifest.yaml`, `profiles/forgetrail.yaml` with the `plan` phase `in_progress`, an application record, and a session record. Do **not** create `.forgetrail/workflow_tracking.json`. Fill the application name and a one-line description from whatever the user has already said. Criteria stay `pending` until evidence exists.
|
|
321
324
|
5. **If git was initialized in step 2**, make the first commit now so the user has a clean baseline. **What lands in the commit depends on §1.5:** if **committing `.forgetrail/`**, steps 3–4 artifacts are included; if **gitignoring `.forgetrail/`**, only `.gitignore` (and any `.cursor/rules/` copies) — the workspace stays local-only and that is expected, not a mistake. Example: `git add -A && git commit -m "chore: ForgeTrail Lite bootstrap"`. Skip this step if the repo already had history — do not squash or amend what's there. Skip entirely if the user is in no-git mode (§4.1).
|
|
322
325
|
6. **Ask the §5 intake questions.** Do not write any project code yet. For the first user-facing reply, follow §9 (plain product language, one clear "reply with," no methodology jargon).
|
|
323
|
-
7. **Create `docs/`** (if missing) and **draft `docs/PHASE_1_BRIEF.md`** from the §6 template using the user's answers. Show it to the user, iterate, then **lock it**:
|
|
324
|
-
8. **Pause for explicit approval** before moving to Phase 2. Do not advance
|
|
325
|
-
9. **On approval, create `CONTEXT_PROMPT.md`** at the repo root from the §10 template by merging the locked brief's key sections.
|
|
326
|
+
7. **Create `docs/`** (if missing) and **draft `docs/PHASE_1_BRIEF.md`** from the §6 template using the user's answers. Show it to the user, iterate, then **lock it**: mark the brief criteria met in `appledger/profiles/forgetrail.yaml` only when the user has approved them, and record major commitments as decision records.
|
|
327
|
+
8. **Pause for explicit approval** before moving to Phase 2. Do not advance the profile phase silently. **Explicit approval** means the user has reviewed the locked brief and given a clear, unambiguous affirmative — examples: *"locked,"* *"approved,"* *"go to phase 2,"* *"ship it,"* *"start building."* Silence, ambiguous nods (*"cool,"* *"interesting,"* *"ok"*), follow-up questions, or a "we'll see" do **not** count — if in doubt, ask: *"Ready to lock the brief and start Phase 2?"* and wait for a yes/no. An eager agent advancing on a "hmm" is a bigger cost than asking once more.
|
|
328
|
+
9. **On approval, create `CONTEXT_PROMPT.md`** at the repo root from the §10 template by merging the locked brief's key sections. Set the profile's current phase to `build` only after that approval.
|
|
326
329
|
10. **Initialize the app and install dependencies** (the agent runs all of these — do not ask the user). **First:** run the **§4.1.2** stack-conditional checklist for this project (PocketBase test, Ollama, env keys, Playwright, native addons — only what applies).
|
|
327
330
|
|
|
328
331
|
**Default A (web app — SvelteKit + PocketBase) — prefer the manual scaffold.** By the time we reach this step, the Lite bootstrap has already written **`.forgetrail/`** (protocol + tracking + agent rules), **`docs/PHASE_1_BRIEF.md`**, **`CONTEXT_PROMPT.md`**, **`.gitignore`**, and **`.git/`** at the repo root. That means the root is **never empty** when we scaffold, and `pnpm dlx sv create .` will hit `Directory not empty. Continue?` — an **interactive** prompt with no reliable non-interactive bypass in most versions (§13 anti-pattern). Rather than fight that, scaffold manually. It is deterministic and is **the primary path** for Lite.
|
|
@@ -348,7 +351,7 @@ Log anything non-obvious in **`gotchas[]`** (e.g. *"Playwright browsers installe
|
|
|
348
351
|
- **Recent `sv` versions may emit no `svelte.config.js`.** From `sv` CLI ~v0.16, adapter and compiler options can live inside the `sveltekit()` plugin call in **`vite.config.ts`** instead of a separate config file. Do not hunt for (or blindly create) `svelte.config.js` to configure the adapter — read `vite.config.ts` first. For `adapter-static` prerendering, set `export const prerender = true` in **`src/routes/+layout.ts`** — that works under either config layout.
|
|
349
352
|
- **Never** use `sv create .` against a populated repo root — there is no stable flag to skip the interactive "non-empty" prompt, and the agent terminal will hang (§8 rule 6, §13).
|
|
350
353
|
- If a prior run left a partially created `app/`, **remove it** (or scaffold into a different new name) before retrying — do **not** re-run against the partial tree and try to answer the prompt.
|
|
351
|
-
- If you use this shortcut, note that **dev commands run from `app/`**: `cd app && pnpm dev`, or `pnpm -C app dev` from the repo root. Record the layout in `
|
|
354
|
+
- If you use this shortcut, note that **dev commands run from `app/`**: `cd app && pnpm dev`, or `pnpm -C app dev` from the repo root. Record the layout as a decision in `appledger/` and call it out at the top of `README.md` (§14).
|
|
352
355
|
|
|
353
356
|
**A.3 — `pnpm init` cleanup (applies to both A.1 and Default B).** `pnpm init` writes some defaults that are wrong for a Lite project and need to be corrected before anything else:
|
|
354
357
|
- Set `"type": "module"` (ESM — see §8).
|
|
@@ -359,11 +362,11 @@ Log anything non-obvious in **`gotchas[]`** (e.g. *"Playwright browsers installe
|
|
|
359
362
|
|
|
360
363
|
**Default B (API / service / script — Node + TS):** run `pnpm init` at the **repo root**, apply the A.3 cleanup, then `pnpm add -D typescript tsx vitest @types/node` and write a strict `tsconfig.json` (`"module": "ESNext"`, `"moduleResolution": "Bundler"`, `"strict": true`, `"target": "ES2022"`). Add runtime deps (e.g. `hono`, `zod`) with `pnpm add` as the spine requires them.
|
|
361
364
|
|
|
362
|
-
**Default B + separate UI (web app + API, not PocketBase):** when the brief is **UI + backend** but not Default A, use a **pnpm workspace** with committed packages — e.g. `backend/` (or `packages/api`) + `frontend/` (or `packages/web`) — instead of fighting `sv create .` at the repo root. The **`sv create app`** shortcut (A.2) into an **empty** subfolder is the first-class path for the frontend; init the API package with `pnpm init` + A.3 in its folder. Record the layout in `
|
|
365
|
+
**Default B + separate UI (web app + API, not PocketBase):** when the brief is **UI + backend** but not Default A, use a **pnpm workspace** with committed packages — e.g. `backend/` (or `packages/api`) + `frontend/` (or `packages/web`) — instead of fighting `sv create .` at the repo root. The **`sv create app`** shortcut (A.2) into an **empty** subfolder is the first-class path for the frontend; init the API package with `pnpm init` + A.3 in its folder. Record the layout as a decision in `appledger/` and `README.md` (§14). Load env per §4.2.1.
|
|
363
366
|
|
|
364
367
|
**Both paths:** always use **`pnpm`**, never `npm` or `yarn`. Never hand-edit `package.json` to add deps — use `pnpm add` / `pnpm add -D` so `pnpm-lock.yaml` stays in sync. If `pnpm` is suddenly missing here (it was verified at §4.1 preflight but the machine changed), re-run the preflight rather than silently falling back to `npm`.
|
|
365
368
|
11. **Build the full runnable spine in one pass** (Phase 2 exit criteria in §3). As files are needed, also create the **Phase 2 baseline docs** from §14: `README.md`, `TODO.md` (seeded from brief §11), `.forgetrail/IDEAS.md`, `.env.example`, the full `.gitignore`, **one-click launchers** (§4.5), **`docs/FORGETRAIL_PROGRESS.md`** (§4.6), and PocketBase install scripts per §4.2.2 when Default A uses PocketBase.
|
|
366
|
-
12. **At every subsequent phase transition**, pause for the user's explicit "go" before updating
|
|
369
|
+
12. **At every subsequent phase transition**, pause for the user's explicit "go" before updating the profile phase. Update the session record at the end of each substantive session. *(If git is enabled)* commit (`git add -A && git commit -m "<phase>: <summary>"`) at natural stopping points so history mirrors the phase log. In no-git mode, skip the commit and note progress in the session record only — and remind the user each session that git is still deferred.
|
|
367
370
|
|
|
368
371
|
### 4.2.1 Environment variables (monorepos and split UI/API)
|
|
369
372
|
|
|
@@ -390,9 +393,9 @@ Log anything non-obvious in **`gotchas[]`** (e.g. *"Playwright browsers installe
|
|
|
390
393
|
|
|
391
394
|
1. **Do not** embed a single PocketBase version in `FORGETRAIL_LITE.md`, bootstrap snippets, or app scripts as the only source of truth.
|
|
392
395
|
2. **Default:** resolve **latest stable** at **install time** (GitHub `pocketbase/pocketbase` releases API). Copy upstream **`content/scripts/setup-pocketbase.mjs`** into the app repo (or equivalent in `scripts/setup-pocketbase.ts`).
|
|
393
|
-
3. **Pin only after success:** when a boot works, set **`POCKETBASE_VERSION=0.xx.yy`** in **`.env`** and write **`pocketbase/.pocketbase-version`** via the install script. Record the pin in **`
|
|
396
|
+
3. **Pin only after success:** when a boot works, set **`POCKETBASE_VERSION=0.xx.yy`** in **`.env`** and write **`pocketbase/.pocketbase-version`** via the install script. Record the pin as a decision in **`appledger/`**.
|
|
394
397
|
4. **Env override:** `POCKETBASE_VERSION=latest` (or unset) → re-resolve on next `setup:pocketbase` / **setup.bat**. `POCKETBASE_VERSION=<semver>` → download that release only.
|
|
395
|
-
5. **Align SDK:** `pnpm add pocketbase` should use a **current** SDK compatible with the resolved server;
|
|
398
|
+
5. **Align SDK:** `pnpm add pocketbase` should use a **current** SDK compatible with the resolved server; record **both** versions in a lesson if wire errors appear (§13 — curl first).
|
|
396
399
|
|
|
397
400
|
**Port / duplicate instances:** Keep **`PUBLIC_POCKETBASE_URL`** (or your convention) in **`.env`**. Install and **run** scripts must **detect** if something already listens on that port (health check) and print a clear message — not silently attach to another project's PocketBase.
|
|
398
401
|
|
|
@@ -432,7 +435,7 @@ Output requirements
|
|
|
432
435
|
1. **[Tavily](https://tavily.com/)** — search/extract endpoints aimed at **AI and agent** workflows. Sign up, create an API key, add e.g. `TAVILY_API_KEY` to **`.env`** and document a placeholder in **`.env.example`**. [Pricing / credits](https://tavily.com/pricing) · [Docs](https://docs.tavily.com/).
|
|
433
436
|
2. **[Brave Search API](https://api-dashboard.search.brave.com/)** — **web, news, images, video**, and related endpoints. Create a key in the developer dashboard, add e.g. `BRAVE_API_KEY` (or the env name the official SDK/docs specify) to **`.env`**. [Pricing](https://api-dashboard.search.brave.com/documentation/pricing) — new accounts typically get **renewable monthly credits**; set **usage/budget limits** in the dashboard so you stay within the free-credit range while prototyping.
|
|
434
437
|
|
|
435
|
-
**For agents:** Call search APIs **from the server** only; never send secret keys to the client. If the product needs search, nudge the user in Phase 1–2: *"If you don’t have a key yet, sign up for Tavily and/or Brave, add the key to `.env`, and tell me which provider we’re using for v1."*
|
|
438
|
+
**For agents:** Call search APIs **from the server** only; never send secret keys to the client. If the product needs search, nudge the user in Phase 1–2: *"If you don’t have a key yet, sign up for Tavily and/or Brave, add the key to `.env`, and tell me which provider we’re using for v1."* Record the provider as a decision in **`appledger/`** and wire **`CONTEXT_PROMPT.md`**. Pick **one** provider for the spine unless the brief explicitly needs two; avoid shipping both without a product reason (cost and complexity add up). **Cache, rate-limit, and respect robots/ToS** for any URLs you then fetch.
|
|
436
439
|
|
|
437
440
|
### 4.5 One-click local dev (non-technical operators)
|
|
438
441
|
|
|
@@ -458,7 +461,7 @@ Output requirements
|
|
|
458
461
|
|
|
459
462
|
### 4.6 ForgeTrail phase progress (human-readable)
|
|
460
463
|
|
|
461
|
-
**Source of truth:**
|
|
464
|
+
**Source of truth:** **`appledger/profiles/forgetrail.yaml`** and the latest session record (agents update every session). Do not write `workflow_tracking.json`.
|
|
462
465
|
|
|
463
466
|
**For humans who are not in Cursor:**
|
|
464
467
|
|
|
@@ -497,7 +500,7 @@ Output requirements
|
|
|
497
500
|
1. **Try to install** Ollama when missing (winget / brew / official install script) — see **`setup-ollama.mjs`**.
|
|
498
501
|
2. **Detect GPU VRAM** (`nvidia-smi` when available) and pull a model that fits with headroom.
|
|
499
502
|
3. **Default models (non-thinking):** **`ibm/granite4.1:8b`** or **`ibm/granite4.1:3b`** on smaller VRAM; **`gemma3:4b`** / **`gemma3:12b`** when **`OLLAMA_PREFER_GEMMA=1`**. Prefer **instruction** Granite 4.x / Gemma 3 — not DeepSeek-R1, QwQ, or other **reasoning-only** families unless **`OLLAMA_USE_THINKING=1`** and the brief explicitly requires chain-of-thought models.
|
|
500
|
-
4. **Pin after success:** set **`OLLAMA_MODEL`** in **`.env`** and record in **`
|
|
503
|
+
4. **Pin after success:** set **`OLLAMA_MODEL`** in **`.env`** and record a decision in **`appledger/`** after **`test-ollama`** passes.
|
|
501
504
|
5. **Setup vs test:** **`setup-ollama.bat`** (install + pull); **`test-ollama.bat`** (version + one completion). Do not fold Ollama into **run.bat** unless the app always needs it running.
|
|
502
505
|
|
|
503
506
|
**Env:** `OLLAMA_BASE_URL`, `OLLAMA_MODEL`, optional `OLLAMA_PREFER_GEMMA=1`, `SKIP_OLLAMA_INSTALL=1`.
|
|
@@ -516,7 +519,7 @@ These are the **topics the agent needs to cover in Phase 1**, not a checklist to
|
|
|
516
519
|
- **Problem & audience** — what they're building and why, who the primary user is, what pain v1 removes.
|
|
517
520
|
- **Hero workflow** — in one sentence, the *one* end-to-end journey that must work in v1 (e.g. "sign up → onboard → generate report → export PDF"). What proves the spine is alive?
|
|
518
521
|
- **Type of app** — **A. web app** (UI, auth, stored data) or **B. API / service / script** (no UI or minimal UI)? The matching default stack (§7) is used automatically — the user picks the **type**, not the stack. Only ask about language/framework/DB/deploy if the user volunteers a constraint or explicitly overrides the default.
|
|
519
|
-
- **Project archetype** — is this a **product** (others will use it), an **internal tool** (recurring users, no market), or a **one-shot** (gift, event, demo — one occasion, then done)? Often obvious from Round 1 — confirm rather than ask. Drives which later phases apply (§3) and which
|
|
522
|
+
- **Project archetype** — is this a **product** (others will use it), an **internal tool** (recurring users, no market), or a **one-shot** (gift, event, demo — one occasion, then done)? Often obvious from Round 1 — confirm rather than ask. Drives which later phases apply (§3) and which criteria get pruned from the profile.
|
|
520
523
|
- **v1 scope** — what *must* ship in v1, what is explicitly *out* of v1 (deferred, not deleted).
|
|
521
524
|
- **Constraints** — timeline, team size, budget, latency targets, offline support, compliance hints (even "none yet, but enterprise later").
|
|
522
525
|
- **Delivery shape** — exports (PDF / DOCX / PPTX / CSV / Markdown)? Multi-tenant (one org or many orgs × clients)? Auth model (public, invite-only, SSO)? Is the product read in-app or is export the main deliverable?
|
|
@@ -603,7 +606,7 @@ _Status: DRAFT | LOCKED (<date>)_
|
|
|
603
606
|
|
|
604
607
|
## 9. Decision log (headline decisions only)
|
|
605
608
|
|
|
606
|
-
Mirror material entries in
|
|
609
|
+
Mirror material entries as decision records in **`appledger/`** (choice, rationale, alternatives). §11 is the legacy JSON shape. Do not copy it.
|
|
607
610
|
|
|
608
611
|
- <date> — <decision> — <why> — <alternatives considered>
|
|
609
612
|
|
|
@@ -647,7 +650,7 @@ Both defaults share the same foundation — **TypeScript + pnpm + ESM** — so t
|
|
|
647
650
|
- **A-sub-question: does state need to outlive the browser?** Before locking PocketBase + auth, ask: *"Does any state need to outlive the browser — accounts, cross-device sync, shared data, admin views? Or is every user's state private and fine to live in `localStorage`?"*
|
|
648
651
|
- **A-local (per-user, browser-only):** drop PocketBase and auth. `adapter-static` becomes viable, no deploy-time secrets, no server-side DB. Persist via `localStorage` / `IndexedDB`. Many hobby/toy apps and single-session tools fit here — do not scaffold server infrastructure they will not use. An **interactive** A-local app stays on SvelteKit. [FilePress](https://getfilepress.com) is for a Markdown site or an optional `site/` beside the app (Cloudflare Pages + Wrangler), not a replacement for the app. If LocalSlip is in play: `localslip claim` then `filepress dev`; FilePress reads the lease — do not pass `--port`.
|
|
649
652
|
- **A-persistent (the existing Default A):** keep PocketBase, auth, and the full SvelteKit + adapter-auto defaults.
|
|
650
|
-
- Record the choice in `
|
|
653
|
+
- Record the choice as a decision in `appledger/` and in `docs/PHASE_1_BRIEF.md` §4 so future sessions do not re-introduce a DB the project chose to skip.
|
|
651
654
|
|
|
652
655
|
**B. API / service / script / CLI** — no UI, or minimal UI.
|
|
653
656
|
- **Node 20+ + TypeScript + pnpm**, ESM only (`"type": "module"`), `tsx` for dev, `tsc --noEmit` for type-check, `vitest` for tests. Grow into **Hono** (HTTP) or a plain worker as needed.
|
|
@@ -658,11 +661,11 @@ Both defaults share the same foundation — **TypeScript + pnpm + ESM** — so t
|
|
|
658
661
|
|
|
659
662
|
1. **Ask once:** *"Is this a **web app** (A) or an **API / service / script** (B)?"* — that's it. Do not enumerate frameworks, DBs, or deploy targets unless the user asks.
|
|
660
663
|
2. **Confirm the default in one line** after they pick: e.g. *"Got it — web app, so I'll use the SvelteKit + PocketBase default unless you want to change anything."* Give them an easy "or change X" opening without forcing them to use it.
|
|
661
|
-
3. **Lock the default in `docs/PHASE_1_BRIEF.md` §4** and record
|
|
664
|
+
3. **Lock the default in `docs/PHASE_1_BRIEF.md` §4** and record a decision in `appledger/`:
|
|
662
665
|
```json
|
|
663
666
|
{ "date": "<YYYY-MM-DD>", "phase": 1, "decision": "Stack: default-A (SvelteKit+PB)", "why": "app type = web app; no overrides", "alternatives": [] }
|
|
664
667
|
```
|
|
665
|
-
4. **Honor explicit overrides minimally.** If the user says "React, not Svelte," swap the frontend layer only — keep TS/pnpm/ESM/PB/Tailwind. Record the override in `
|
|
668
|
+
4. **Honor explicit overrides minimally.** If the user says "React, not Svelte," swap the frontend layer only — keep TS/pnpm/ESM/PB/Tailwind. Record the override as a decision in `appledger/` with the user's reason.
|
|
666
669
|
|
|
667
670
|
**Rules of the road**
|
|
668
671
|
- **Never silently substitute.** If the user picked A, do not ship React because the agent is more familiar with it.
|
|
@@ -677,7 +680,7 @@ Orthogonal to the A/B picker: if the app needs content (text, structured data, d
|
|
|
677
680
|
- **Build-time LLM generation** — an offline script (e.g. `pnpm run seed`) calls an LLM **once**, writes JSON under `data/`, and commits it. Zero **runtime** LLM cost. Provider can be **cloud** or **Ollama** (same `OLLAMA_*` env — only required when running the seed script). Pairs well with **A-local** + `adapter-static`.
|
|
678
681
|
- **BYO-LLM paste pattern** — ship a prompt in the repo (`prompts/seed.md` or brief §12); the **user** runs it in their own LLM chat account; the user pastes the JSON output into a repo file (e.g. `data/seed.json`); a schema (typically **Zod**) validates at app start. **Zero API keys in the project, zero runtime cost, the user keeps control of their own LLM account.** Ideal for hobby / OSS / free-hosted projects where API-key provisioning would kill the "download and run" experience. See §4.3 for the copy-paste prompt template and validator skeleton.
|
|
679
682
|
|
|
680
|
-
Record the chosen pattern in `
|
|
683
|
+
Record the chosen pattern as a decision in `appledger/` and in `docs/PHASE_1_BRIEF.md` §12 (or §4 if §12 is omitted). Mixing is fine (e.g. build-time seed + optional runtime enrichment), but be explicit about which layer uses which pattern.
|
|
681
684
|
|
|
682
685
|
#### Minimal reference skeletons
|
|
683
686
|
|
|
@@ -825,10 +828,10 @@ Full ForgeTrail expands this under **`docs/TECHNICAL_REFERENCE.md`** (*URL impor
|
|
|
825
828
|
|
|
826
829
|
## 8. Agent rules (non-negotiable in Lite)
|
|
827
830
|
|
|
828
|
-
1. **Pause at phase transitions.** Declare exit criteria are met, **wait for user approval**, then update `
|
|
831
|
+
1. **Pause at phase transitions.** Declare exit criteria are met, **wait for user approval**, then update the profile phase in `appledger/profiles/forgetrail.yaml`.
|
|
829
832
|
2. **Phase 2 delivers a full runnable spine in one pass.** Init → deps → data path → routes → components → hero flow **end to end**. Do not defer "we'll wire the DB next session." If the spine would take longer than one session, shrink v1 scope with the user before starting.
|
|
830
833
|
- **Output budget:** a real spine can be 20–30 files / a few thousand lines — that is fine in a modern large-context session. If the spine is clearly going to exceed **~30 tool calls** (a rough proxy for small-context risk), break it into **two commits within the same session** without pausing for user approval between them: **(a)** configs + directory scaffolding + empty route stubs + data model, then **(b)** route bodies + components + hero-flow glue. Both commits still land inside Phase 2; the spine is not "half-built" until the second commit verifies the hero flow end-to-end. Do not use this as an excuse to defer wiring to a later session.
|
|
831
|
-
3. **Log material decisions.** Anything a future teammate would ask "why did we do it that way?"
|
|
834
|
+
3. **Log material decisions.** Anything a future teammate would ask "why did we do it that way?" becomes a decision record in `appledger/` with a one-line rationale.
|
|
832
835
|
4. **First user-facing reply is plain product language.** No methodology jargon, no tool-name dumps, no file inventories unless asked. Confirm what you did, say what happens next, give one concrete "reply with." (See §9.)
|
|
833
836
|
5. **List format conventions** when offering options (also applies to plans, next steps, checkpoints):
|
|
834
837
|
- **Numbered** (1/2/3) = ordered pipeline, sequence matters.
|
|
@@ -836,7 +839,7 @@ Full ForgeTrail expands this under **`docs/TECHNICAL_REFERENCE.md`** (*URL impor
|
|
|
836
839
|
- **Letters** (A/B/C) = pick-one / "which first?" — avoids collision with numbered steps.
|
|
837
840
|
6. **No interactive CLIs** in scripted commands. Pass non-interactive flags. Examples: `npm create vite@latest -- --template ...`, `gh repo create --confirm`. For SvelteKit in Lite, **prefer the manual scaffold** (§4.2 step 10 A.1) over `sv create` — by the time Phase 2 runs, the repo root is never empty and `sv create .` will hit an un-skippable **`Directory not empty. Continue?`** prompt and hang. If you do use `sv create` as a shortcut, target a **new empty subfolder** (`sv create app`), never `.`. A hanging prompt in an agent terminal is a dead session.
|
|
838
841
|
7. **Five-turn rule.** If a bug or design problem has not converged in ~5 turns, **stop patching** and propose a different approach (different library, different data model, different scope cut). Announce the pivot explicitly.
|
|
839
|
-
8. **Update
|
|
842
|
+
8. **Update the ledger after substantive work.** Move criteria that have evidence, and update the session record. A stale `appledger/` after a busy session is a bug. Do not write `workflow_tracking.json`.
|
|
840
843
|
9. **Git commits — clean messages and natural stopping points.** See **§8.9** for guidelines. Commit with phase-prefixed or descriptive messages (`git commit -m "phase-2: wire hero flow"` or `git commit -F path/to/msg.txt`). Always verify that types and checks pass cleanly before committing. Never leave uncommitted broken states across session boundaries.
|
|
841
844
|
|
|
842
845
|
10. **Install/bootstrap scripts must branch on `process.platform` before shelling out to archive, network, or text tools.** Treat `tar`, `unzip`, `curl`, `sed`, `awk`, `openssl`, and similar as **platform-dependent on Windows** — never a drop-in from a Unix-only recipe. On `win32`, prefer PowerShell (`Expand-Archive`, `Invoke-WebRequest`) or call `C:\Windows\System32\tar.exe` by absolute path to bypass PATH shadowing; keep `tar` / `unzip` / `curl` for macOS/Linux branches. Layer fallbacks and end with a clear error that points the user at manual steps (e.g. “Extract All”) if automation cannot run. Full failure modes: §13 (Engineering).
|
|
@@ -859,7 +862,7 @@ Ensure that automated checks pass (`pnpm run verify` or project test suite) befo
|
|
|
859
862
|
|
|
860
863
|
## 9. First user-facing reply after bootstrap
|
|
861
864
|
|
|
862
|
-
After you create `.forgetrail/AGENTS.md`,
|
|
865
|
+
After you create `.forgetrail/AGENTS.md`, `appledger/`, and the git baseline, your **first message to the human** should be **short, plain-English, and ask only the opening round** of §5. Do not create `.forgetrail/workflow_tracking.json`. Do **not** dump the full intake checklist. Do **not** list MCP tools, internal file paths, ForgeTrail terms ("hero workflow," "architecture," "spine," "exit criteria," "brief," "phase"), or file inventories. Target **~80 words or fewer** — this is a conversation starter, not a form.
|
|
863
866
|
|
|
864
867
|
**The anchor round is always Round 1:** three small, numbered questions — project name, what it is, who it's for. Nothing else. Stagger the rest of §5 across follow-up messages once they answer.
|
|
865
868
|
|
|
@@ -927,14 +930,14 @@ Once the brief is locked and you start the spine, create `CONTEXT_PROMPT.md` at
|
|
|
927
930
|
- <other project-specific conventions>
|
|
928
931
|
|
|
929
932
|
## Current phase
|
|
930
|
-
<from
|
|
933
|
+
<from appledger/profiles/forgetrail.yaml>
|
|
931
934
|
|
|
932
|
-
## Recent
|
|
933
|
-
<pull from
|
|
935
|
+
## Recent lessons (last 3–5)
|
|
936
|
+
<pull from appledger lesson records>
|
|
934
937
|
|
|
935
938
|
## Pointers
|
|
936
939
|
- Brief: docs/PHASE_1_BRIEF.md
|
|
937
|
-
-
|
|
940
|
+
- Ledger: appledger/
|
|
938
941
|
- TODO: TODO.md
|
|
939
942
|
```
|
|
940
943
|
|
|
@@ -942,9 +945,9 @@ Keep it **short** — this is a map, not a monograph. If it grows past ~200 line
|
|
|
942
945
|
|
|
943
946
|
---
|
|
944
947
|
|
|
945
|
-
## 11.
|
|
948
|
+
## 11. Legacy `.forgetrail/workflow_tracking.json` (do not copy)
|
|
946
949
|
|
|
947
|
-
|
|
950
|
+
Do **not** write this into a project. It is the old Lite shape. `appledger migrate` reads it when a project already has the file. New projects start at `appledger/`.
|
|
948
951
|
|
|
949
952
|
**Lite vs MCP tracking:** Lite uses **`schemaVersion: "lite-1"`**, numeric **`currentPhase`** (`1`–`7`), and per-phase **`exitCriteria`** objects (boolean flags). The full MCP starter uses string phase keys (`1-architecture`, …) and **`exitCriteriaMet`** / **`exitCriteriaRemaining`** arrays — see **`TRACKING_SCHEMA.md`** (phase ID map + both shapes). **`scripts/forgetrail-dev-launcher.mjs`** `status` understands both.
|
|
950
953
|
|
|
@@ -1000,7 +1003,7 @@ Save this as `.forgetrail/AGENTS.md` so agents that auto-load it (Codex, Cursor,
|
|
|
1000
1003
|
|
|
1001
1004
|
```markdown
|
|
1002
1005
|
<!--
|
|
1003
|
-
Agent protocol based on ForgeTrail Lite v2.
|
|
1006
|
+
Agent protocol based on ForgeTrail Lite v2.2.0.
|
|
1004
1007
|
© Catalyst Forge, LLC — www.catalystforge.com
|
|
1005
1008
|
Licensed under Apache License 2.0 (upstream ForgeTrail repo).
|
|
1006
1009
|
-->
|
|
@@ -1010,10 +1013,10 @@ Save this as `.forgetrail/AGENTS.md` so agents that auto-load it (Codex, Cursor,
|
|
|
1010
1013
|
This repository uses **ForgeTrail Lite** as its project kickoff and operating protocol. The full protocol is in `.forgetrail/FORGETRAIL_LITE.md` — read it at the start of every fresh session.
|
|
1011
1014
|
|
|
1012
1015
|
## Non-negotiables
|
|
1013
|
-
- **Phase gates:** pause at every phase transition and wait for explicit user approval before advancing. Current phase lives in
|
|
1016
|
+
- **Phase gates:** pause at every phase transition and wait for explicit user approval before advancing. Current phase lives in `appledger/profiles/forgetrail.yaml`.
|
|
1014
1017
|
- **Phase 1 before code:** do not write project code until `docs/PHASE_1_BRIEF.md` is locked and stack is agreed.
|
|
1015
1018
|
- **Phase 2 = full runnable spine** in one pass (init → deps → data → routes → hero flow end to end). No deferred spine.
|
|
1016
|
-
- **Log decisions:** every material decision
|
|
1019
|
+
- **Log decisions:** every material decision is a decision record in `appledger/` with a one-line rationale.
|
|
1017
1020
|
- **Plain first reply:** first user-facing message after bootstrap is product language, not methodology jargon. See `.forgetrail/FORGETRAIL_LITE.md` §9.
|
|
1018
1021
|
- **Ask questions as numbered lists, one per line.** Never mash multiple questions into a paragraph. See §5.
|
|
1019
1022
|
- **Git commits:** plain `-m` or `-F` at natural stopping points with concise summaries. Verify checks pass before committing. See §8.9.
|
|
@@ -1031,9 +1034,9 @@ This repository uses **ForgeTrail Lite** as its project kickoff and operating pr
|
|
|
1031
1034
|
Initial `git init`, `pnpm init` / scaffolder, `pnpm install`, and the initial commit are all done by the agent per `.forgetrail/FORGETRAIL_LITE.md` §4. Do not ask the user to run setup commands by hand. If `git`, **Node.js**, **npm**, or **pnpm** are missing, follow §4.1 preflight (concrete install path; no-git mode for git only — never silently skip).
|
|
1032
1035
|
|
|
1033
1036
|
## Session start
|
|
1034
|
-
1. Read
|
|
1035
|
-
2. Check
|
|
1036
|
-
3. Verify `.git/` and `package.json` exist if the phase calls for them; if missing, re-read `.forgetrail/FORGETRAIL_LITE.md` §4 (preflight + ordered actions) and catch up before proceeding. If
|
|
1037
|
+
1. Read `appledger/profiles/forgetrail.yaml` and `CONTEXT_PROMPT.md` (if present). Do not treat `.forgetrail/workflow_tracking.json` as the live phase.
|
|
1038
|
+
2. Check the current profile phase and the latest session record.
|
|
1039
|
+
3. Verify `.git/` and `package.json` exist if the phase calls for them; if missing, re-read `.forgetrail/FORGETRAIL_LITE.md` §4 (preflight + ordered actions) and catch up before proceeding. If a decision records that source control is deferred, respect no-git mode and remind the user git is still pending.
|
|
1037
1040
|
4. If the previous session left exit criteria unmet, resume there — do not jump ahead.
|
|
1038
1041
|
```
|
|
1039
1042
|
|
|
@@ -1053,17 +1056,17 @@ These are the failures ForgeTrail sees most often. The agent should re-read this
|
|
|
1053
1056
|
- **Skipping the Phase 1 brief.** Rewrites compound. If the user says "just start coding," offer to write a 10-line brief in 2 minutes first — it still pays off.
|
|
1054
1057
|
- **Half-built spine.** Scaffolding a UI with mock data, or wiring a DB with no UI, and calling it Phase 2. The spine is end-to-end or it is not a spine.
|
|
1055
1058
|
- **Silent stack swap.** Choosing a framework, DB, or language the user did not confirm. Always name the stack and get a "yes" before Phase 2.
|
|
1056
|
-
- **
|
|
1057
|
-
- **Turning the first reply into a methodology dump.** Users want a product answer, not a tour of
|
|
1059
|
+
- **Ledger rot.** Creating `appledger/` once and never updating it. Update the session record at the end of every substantive turn. Do not recreate `.forgetrail/workflow_tracking.json`.
|
|
1060
|
+
- **Turning the first reply into a methodology dump.** Users want a product answer, not a tour of decision records and exit criteria.
|
|
1058
1061
|
|
|
1059
1062
|
**Engineering**
|
|
1060
1063
|
- **Interactive CLIs in agent terminals.** `sv create`, `npm init`, `gh auth login`, `pnpm dlx create-*` will hang forever on a TTY prompt. Pass every flag, or skip the CLI and write files directly.
|
|
1061
1064
|
- **`sv create` against a repo that Lite has already bootstrapped.** By §4.2 step 10 the repo root is **never empty** — the Lite bootstrap (steps 1–9) writes **`.forgetrail/`**, `docs/PHASE_1_BRIEF.md`, `CONTEXT_PROMPT.md`, `.gitignore`, and `.git/` before any scaffolder runs. Running `pnpm dlx sv create .` at that point triggers an **interactive** `Directory not empty. Continue?` prompt with **no reliable non-interactive bypass** — agent terminals cannot answer it and the session hangs (§8 rule 6). **Prevention:** in Lite, **prefer the manual scaffold** described in §4.2 step 10 (A.1); it is deterministic and never prompts. If you want the `sv create` shortcut, target a **fresh subfolder that does not exist yet** (e.g. `sv create app`, never `sv create .`). **Recovery:** kill the hung process, delete any partial `app/`, and switch to the manual path or retry into a new folder name. Do not try to answer the prompt by piping "Yes" — non-portable and fragile.
|
|
1062
|
-
- **Committing secrets or the wrong artifacts to a public repo.** Do not put API keys, `.env`, or customer-private notes in
|
|
1065
|
+
- **Committing secrets or the wrong artifacts to a public repo.** Do not put API keys, `.env`, or customer-private notes in **`appledger/`** or committed rules. Prefer **`.forgetrail/`** (not repo root) for agent files per §1.5. If you **gitignored** `.forgetrail/` but later need it on GitHub, that is fine — it was intentional. If you **accidentally committed secrets** or sensitive internal URLs, treat the remote as compromised: rotate credentials and rewrite history (`git filter-repo`) if needed; a follow-up delete commit does **not** remove blobs from history. Vendoring a full Lite copy when **MCP** already serves methodology is clutter, not a license violation — drop the duplicate file and use MCP tools instead.
|
|
1063
1066
|
- **GitHub GH007 / private email on push.** See §4.1.1 — fix noreply identity and repo-local `user.email` before debugging merge or sync UI errors.
|
|
1064
1067
|
- **Re-running scaffolders in an initialized app folder.** A second `sv create` on top of an existing SvelteKit tree (root or `app/`) typically errors or corrupts config. Detect the presence of `package.json` plus `svelte.config.js` (or `app/package.json` if using the subfolder shortcut) and refuse.
|
|
1065
1068
|
- **Mixing CommonJS and ESM.** Pick ESM (`"type": "module"`) from day one. Do not sprinkle `require()` in a project that uses `import`.
|
|
1066
|
-
- **Opaque backend errors: curl first, version-drift second, SDK source last.** Single-binary and managed backends (PocketBase, SurrealDB, Meilisearch, Supabase stack, and similar) ship the **server binary** and the **JS/TS SDK** on **independent release trains**. When the server tightens a wire rule (e.g. PocketBase 0.37 requires `Authorization: Bearer <token>` on reads; an older SDK still sends a bare token) you often get a **single opaque 400/500** like *Something went wrong while processing your request* with no hint of headers, query shape, or the rule that fired. Worse, the server may be **permissive on writes** and **strict on reads** — `create()` works, `getFullList()` fails — so the bug reads as *"data was never saved."* **Diagnostic:** do not start in SDK source or with retries. Bypass the client with `curl` (e.g. `curl -w "\nHTTP=%{http_code}\n"`), same credentials, and vary **one** dimension at a time: auth header format (`Authorization: <token>` vs `Authorization: Bearer <token>`), query params (drop `sort` / `filter` / `perPage`), HTTP method. The SDK hides the exact bytes on the wire; `curl` shows them — the delta between a 200 and what the SDK sends **is** the bug, usually in **minutes** vs an hour of internals archaeology. **Prevention / fix until the SDK matches:** a client `beforeSend` (or request-interceptor) shim that normalizes headers or query shape; treat any cross-endpoint opaque 400/500 as **wire mismatch until proven otherwise**. **Session hygiene:**
|
|
1069
|
+
- **Opaque backend errors: curl first, version-drift second, SDK source last.** Single-binary and managed backends (PocketBase, SurrealDB, Meilisearch, Supabase stack, and similar) ship the **server binary** and the **JS/TS SDK** on **independent release trains**. When the server tightens a wire rule (e.g. PocketBase 0.37 requires `Authorization: Bearer <token>` on reads; an older SDK still sends a bare token) you often get a **single opaque 400/500** like *Something went wrong while processing your request* with no hint of headers, query shape, or the rule that fired. Worse, the server may be **permissive on writes** and **strict on reads** — `create()` works, `getFullList()` fails — so the bug reads as *"data was never saved."* **Diagnostic:** do not start in SDK source or with retries. Bypass the client with `curl` (e.g. `curl -w "\nHTTP=%{http_code}\n"`), same credentials, and vary **one** dimension at a time: auth header format (`Authorization: <token>` vs `Authorization: Bearer <token>`), query params (drop `sort` / `filter` / `perPage`), HTTP method. The SDK hides the exact bytes on the wire; `curl` shows them — the delta between a 200 and what the SDK sends **is** the bug, usually in **minutes** vs an hour of internals archaeology. **Prevention / fix until the SDK matches:** a client `beforeSend` (or request-interceptor) shim that normalizes headers or query shape; treat any cross-endpoint opaque 400/500 as **wire mismatch until proven otherwise**. **Session hygiene:** record **SDK version + server version** together in a lesson so the next run checks version drift first.
|
|
1067
1070
|
- **Env secrets in the repo.** Only `.env.example` is committed. Real `.env` is in `.gitignore`. Check before every commit.
|
|
1068
1071
|
- **Assuming `.env` is loaded without code.** Node/TS entrypoints (`tsx`, `node`, Hono, workers) do **not** read `.env` unless you call **`dotenv`** (or equivalent) at startup — see §4.2.1. Vite loads env for `vite.config.*`, but monorepo layouts need **merged `loadEnv`** from repo root + package with paths derived from **`import.meta.url`**, not `process.cwd()` alone.
|
|
1069
1072
|
- **pnpm ignored native build scripts.** `better-sqlite3` and similar may install without `prebuild-install` / `node-gyp` on pnpm v9+ — see §4.1 preflight step 5 (`onlyBuiltDependencies` at workspace root).
|
|
@@ -1115,8 +1118,9 @@ During Phase 2, create these once the spine is running. Keep them short and hone
|
|
|
1115
1118
|
# AGENTS.md
|
|
1116
1119
|
# CLAUDE.md
|
|
1117
1120
|
# IDEAS.md
|
|
1118
|
-
# .forgetrail/workflow_tracking.json
|
|
1119
1121
|
# .cursor/rules/forgetrail-updates-log.mdc
|
|
1122
|
+
# Do not symlink or recreate .forgetrail/workflow_tracking.json.
|
|
1123
|
+
# Project state is appledger/ and is committed with the app.
|
|
1120
1124
|
|
|
1121
1125
|
# Deps
|
|
1122
1126
|
node_modules/
|
|
@@ -1149,7 +1153,7 @@ During Phase 2, create these once the spine is running. Keep them short and hone
|
|
|
1149
1153
|
|
|
1150
1154
|
**Rule of thumb:** whenever you add a framework, check whether its build-output directory name (`build`, `dist`, `public`, `out`, `target`) could collide with a route or source path in that framework, and **anchor accordingly**. After Phase 2, run `git ls-files | grep routes/ | head` (or equivalent) once to confirm no route directories were swallowed.
|
|
1151
1155
|
- **Optional JSON data files** — e.g. `data/seed-*.json` or `fixtures/*.json` created by the user (see §4.3) for seed or demo content. The agent validates and imports; the user can regenerate or add files **multiple times** for different tables or domains.
|
|
1152
|
-
- **`docs/FORGETRAIL_PROGRESS.md`** — human-readable ForgeTrail phase snapshot (§4.6); refresh when
|
|
1156
|
+
- **`docs/FORGETRAIL_PROGRESS.md`** — human-readable ForgeTrail phase snapshot (§4.6); refresh when the profile phase or criteria change, or when the user runs **status.bat** / **forgetrail:status**. The durable phase is `appledger/profiles/forgetrail.yaml`.
|
|
1153
1157
|
- **One-click dev launchers** — **`setup.bat`** / **`setup.sh`**, **`run.bat`** / **`run.sh`**, **`status.bat`** / **`status.sh`** at repo root; logic in **`scripts/forgetrail-dev-launcher.mjs`** (upstream template). See **`ONE_CLICK_DEV_SETUP.md`**.
|
|
1154
1158
|
- **Isolated health checks** — **`test-pocketbase.bat`** / **`test-ollama.bat`** (and **`setup-ollama.bat`** when local LLM); scripts in **`scripts/`** per **`SYSTEM_HEALTH_CHECKS.md`**.
|
|
1155
1159
|
|
|
@@ -1162,7 +1166,7 @@ Phases 3–7 add documents as the project grows (test plan, design notes, deploy
|
|
|
1162
1166
|
The user wins. This is a default protocol, not a law. When the user overrides a rule:
|
|
1163
1167
|
|
|
1164
1168
|
1. Acknowledge the override briefly.
|
|
1165
|
-
2. Record it in `
|
|
1169
|
+
2. Record it as a decision in `appledger/` with the date, phase, choice, rationale, and optional alternatives so future sessions see the exception.
|
|
1166
1170
|
3. Proceed.
|
|
1167
1171
|
|
|
1168
1172
|
The one exception: **do not** skip logging the override itself — that is how Lite stays coherent across sessions.
|
|
@@ -1175,4 +1179,4 @@ ForgeTrail Lite covers the shape of a project. The full **ForgeTrail MCP server*
|
|
|
1175
1179
|
|
|
1176
1180
|
---
|
|
1177
1181
|
|
|
1178
|
-
**ForgeTrail Lite v2.
|
|
1182
|
+
**ForgeTrail Lite v2.2.0** · © Catalyst Forge, LLC · [www.catalystforge.com](https://www.catalystforge.com) · [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ForgeTrail progress
|
|
2
2
|
|
|
3
|
-
_Human-readable snapshot for non-technical operators. **Source of truth:**
|
|
3
|
+
_Human-readable snapshot for non-technical operators. **Source of truth:** `appledger/profiles/forgetrail.yaml` and the latest session record. The agent updates those. Do not write `.forgetrail/workflow_tracking.json`. This page is a snapshot, not the record._
|
|
4
4
|
|
|
5
5
|
## Current phase
|
|
6
6
|
|
|
@@ -9,11 +9,11 @@ _Human-readable snapshot for non-technical operators. **Source of truth:** `.for
|
|
|
9
9
|
|
|
10
10
|
## What's done
|
|
11
11
|
|
|
12
|
-
_(Populated from
|
|
12
|
+
_(Populated from criteria marked met in the profile.)_
|
|
13
13
|
|
|
14
14
|
## Still to do (this phase)
|
|
15
15
|
|
|
16
|
-
_(Populated from
|
|
16
|
+
_(Populated from criteria still pending.)_
|
|
17
17
|
|
|
18
18
|
## How to check progress anytime
|
|
19
19
|
|
|
@@ -14,7 +14,7 @@ Use this **before** Phase 1, in **any** LLM chat — ChatGPT, Claude, Grok, a lo
|
|
|
14
14
|
|
|
15
15
|
1. Save it in the project repo as **`docs/GENESIS.md`** (canonical path).
|
|
16
16
|
2. Follow the human recipe in **`TRY_FORGETRAIL.md`** (ForgeTrail repo root), or feed the spec into ForgeTrail Phase 1:
|
|
17
|
-
- **Automatic draft:** call **`ingestPlanArtifact`** with the full `GENESIS.md` text as `planContent`. It maps headings like *Problem statement*, *Goals and non-goals*, *Required background on the data/file format*, *Core domain concepts*, *Edge cases*, *Milestones*, and *Open questions* into `docs/PHASE_1_BRIEF.md` sections, and extracts any `D1.`/`D2.`-style decisions into `
|
|
17
|
+
- **Automatic draft:** call **`ingestPlanArtifact`** with the full `GENESIS.md` text as `planContent`. It maps headings like *Problem statement*, *Goals and non-goals*, *Required background on the data/file format*, *Core domain concepts*, *Edge cases*, *Milestones*, and *Open questions* into `docs/PHASE_1_BRIEF.md` sections, and extracts any `D1.`/`D2.`-style decisions into decision records for `appledger/`. Do not write `workflow_tracking.json`. Sections without a clean home (e.g. **Acceptance criteria** — the brief has no dedicated section for it) land in a "Plan sections not auto-mapped" footer — fold that into **§12 Handoff checklist** or its own appendix by hand.
|
|
18
18
|
- **Manual walkthrough:** read `docs/GENESIS.md` together with the agent as context, then run **`getGreenfieldIntakePrompt`** + `getChecklist(before-session-1)` to confirm delivery details the spec might not cover (tenancy, compliance, live search, content-generation pattern).
|
|
19
19
|
3. Either way, **lock `docs/PHASE_1_BRIEF.md`** before Phase 2 scaffolding, per the normal Phase 1 exit criteria.
|
|
20
20
|
|
package/content/GENESIS_STUB.md
CHANGED
|
@@ -13,6 +13,6 @@ Replace this file with your **what, not how** build spec.
|
|
|
13
13
|
|
|
14
14
|
See **TRY_FORGETRAIL.md** in the ForgeTrail repo for the full recipe. Short version:
|
|
15
15
|
|
|
16
|
-
> Follow `.forgetrail/FORGETRAIL_LITE.md` as the project protocol. Treat `docs/GENESIS.md` as the product spec (what, not how).
|
|
16
|
+
> Follow `.forgetrail/FORGETRAIL_LITE.md` as the project protocol. Treat `docs/GENESIS.md` as the product spec (what, not how). If `appledger` is installed, run `appledger init`. Otherwise create `appledger/` (manifest, profile, application record, session record). 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.
|
|
17
17
|
|
|
18
18
|
Keep this file at **`docs/GENESIS.md`** (this path). Do not move it to the repo root.
|