@pennixrv/trellis 0.7.0-beta.52 → 0.7.0-beta.54

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 (38) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/init.js +2 -2
  3. package/dist/commands/update.d.ts.map +1 -1
  4. package/dist/commands/update.js +3 -2
  5. package/dist/commands/update.js.map +1 -1
  6. package/dist/configurators/shared.js +1 -1
  7. package/dist/configurators/shared.js.map +1 -1
  8. package/dist/migrations/manifests/0.7.0-beta.53.json +27 -0
  9. package/dist/migrations/manifests/0.7.0-beta.54.json +8 -0
  10. package/dist/templates/codex/hooks/session-start.py +9 -18
  11. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +1 -1
  12. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +1 -1
  13. package/dist/templates/common/commands/continue.md +1 -1
  14. package/dist/templates/common/commands/start.md +2 -3
  15. package/dist/templates/common/skills/idea-to-closed-plan.md +105 -0
  16. package/dist/templates/copilot/hooks/session-start.py +9 -18
  17. package/dist/templates/copilot/prompts/start.prompt.md +2 -3
  18. package/dist/templates/opencode/lib/session-utils.js +1 -1
  19. package/dist/templates/shared-hooks/inject-workflow-state.py +1 -1
  20. package/dist/templates/shared-hooks/session-start.py +10 -24
  21. package/dist/templates/trellis/index.d.ts +1 -0
  22. package/dist/templates/trellis/index.d.ts.map +1 -1
  23. package/dist/templates/trellis/index.js +2 -0
  24. package/dist/templates/trellis/index.js.map +1 -1
  25. package/dist/templates/trellis/scripts/common/task_migration.py +231 -0
  26. package/dist/templates/trellis/scripts/common/task_planning.py +252 -10
  27. package/dist/templates/trellis/scripts/common/task_store.py +11 -2
  28. package/dist/templates/trellis/scripts/task.py +86 -38
  29. package/dist/templates/trellis/workflow.md +23 -20
  30. package/dist/utils/template-fetcher.js +1 -1
  31. package/dist/utils/template-fetcher.js.map +1 -1
  32. package/dist/utils/workflow-resolver.d.ts +2 -2
  33. package/dist/utils/workflow-resolver.d.ts.map +1 -1
  34. package/dist/utils/workflow-resolver.js +9 -1
  35. package/dist/utils/workflow-resolver.js.map +1 -1
  36. package/package.json +2 -2
  37. package/dist/templates/common/skills/brainstorm.md +0 -236
  38. package/dist/templates/copilot/prompts/brainstorm.prompt.md +0 -162
@@ -260,6 +260,11 @@ def _get_task_status(trellis_dir: Path, hook_input: dict) -> str:
260
260
 
261
261
  task_title = task_data.get("title", task_ref)
262
262
  task_status = task_data.get("status", "unknown")
263
+ from common.task_planning import PlanningError, planning_record
264
+ try:
265
+ stage = planning_record(task_data).get("stage") or "unknown (legacy task)"
266
+ except PlanningError as exc:
267
+ return f"Status: TASK_ERROR\nTask: {task_ref}\nNext: Repair the existing planning record: {exc}"
263
268
 
264
269
  if task_status == "completed":
265
270
  return (
@@ -268,9 +273,6 @@ def _get_task_status(trellis_dir: Path, hook_input: dict) -> str:
268
273
  "or start a new task."
269
274
  )
270
275
 
271
- has_prd = (task_dir / "prd.md").is_file()
272
- has_design = (task_dir / "design.md").is_file()
273
- has_implement = (task_dir / "implement.md").is_file()
274
276
  present = [
275
277
  name
276
278
  for name in ("prd.md", "design.md", "implement.md", "implement.jsonl", "check.jsonl")
@@ -278,27 +280,16 @@ def _get_task_status(trellis_dir: Path, hook_input: dict) -> str:
278
280
  ]
279
281
  present_line = ", ".join(present) if present else "none"
280
282
 
281
- if not has_prd:
282
- return (
283
- f"Status: PLANNING\nTask: {task_title}\nPresent: {present_line}\n"
284
- "Next: Load trellis-brainstorm and write prd.md. Stay in planning."
285
- )
286
-
287
283
  if task_status == "planning":
288
- if has_design and has_implement:
289
- next_action = "Review planning artifacts with the user before `task.py start`."
290
- else:
291
- next_action = (
292
- "Lightweight task can ask for start review with PRD-only; "
293
- "complex task must add design.md and implement.md before `task.py start`."
294
- )
295
284
  return (
296
- f"Status: PLANNING\nTask: {task_title}\nPresent: {present_line}\n"
297
- f"Next: {next_action}"
285
+ f"Status: PLANNING\nTask: {task_title}\nStage: {stage}\nPresent: {present_line}\n"
286
+ "Next: Load trellis-idea-to-closed-plan and resume the recorded planning stage; "
287
+ "artifact presence does not establish readiness."
298
288
  )
299
289
 
300
290
  return (
301
291
  f"Status: {task_status.upper()}\nTask: {task_title}\nPresent: {present_line}\n"
292
+ f"Stage: {stage}\n"
302
293
  "Next: Follow the matching per-turn workflow-state. Context order is jsonl entries, "
303
294
  "prd.md, design.md if present, implement.md if present."
304
295
  )
@@ -49,7 +49,7 @@ If the user wants only one platform to avoid sub-agents, first confirm whether t
49
49
 
50
50
  | `status` | Artifact state | Resume at |
51
51
  | --- | --- | --- |
52
- | `planning` | `prd.md` missing | Phase 1.1 (load `trellis-brainstorm`) |
52
+ | `planning` | any planning artifact state | Read `meta.planning.stage`; load `trellis-idea-to-closed-plan` and resume that stage |
53
53
  | `planning` | lightweight task with `prd.md` complete | present final plan, ask to seal and approve proceeding or supplement/revise, then native seal/approve/start; reuse sufficient authorization |
54
54
  | `planning` | complex task missing `design.md` or `implement.md` | complete missing planning artifacts |
55
55
  | `planning` | complex task has `prd.md`, `design.md`, and `implement.md` | present final plan, ask to seal and approve proceeding or supplement/revise, then native seal/approve/start; reuse sufficient authorization |
@@ -70,7 +70,7 @@ After editing, make the AI reread `.trellis/workflow.md`; do not assume the flow
70
70
 
71
71
  `workflow.md` is the semantic center of the local workflow, but each platform can also have its own entry files:
72
72
 
73
- - skills, such as `trellis-brainstorm` and `trellis-check`.
73
+ - skills, such as `trellis-idea-to-closed-plan` and `trellis-check`.
74
74
  - commands/prompts/workflows, such as continue and finish-work.
75
75
  - hooks, such as session-start or workflow-state injection.
76
76
 
@@ -51,7 +51,7 @@ Run only when the phase or routing rule is missing; otherwise reuse it.
51
51
  `get_context.py` shows the active task's `status` field. Route by `status` + artifact presence. This command replaces the user needing to remember the Trellis flow; it does not itself approve implementation.
52
52
 
53
53
  - `status=planning` + `task.json.meta.delivery_mode = "analysis_only"` → verify the PRD's bounded evidence deliverable and protected-target no-change boundary, then complete the evidence and archive directly regardless of complexity or cross-owner scope. Do not run `task.py start`; a protected-target change requires a separate change-bearing task.
54
- - `status=planning` + no `prd.md` → **1.1** (load `trellis-brainstorm`)
54
+ - `status=planning` + no `prd.md` → load `trellis-idea-to-closed-plan` and resume at the recorded stage
55
55
  - `status=planning` + a recorded `decision-needed` or unsealed decision chain → return to `pennix-decision-grill` only for a change-bearing decision or a user-owned choice that materially defines the requested research scope or method; research recommendations and open product choices alone do not trigger the gate.
56
56
  - `status=in_progress` + a material unresolved decision → record the reason and run `task.py replan <task> "<reason>"`; do not ask a native question during implementation.
57
57
  - `status=planning` + `prd.md` only → decide whether the task is lightweight or complex. Lightweight can move to **1.4** review; complex returns to **1.1** to add `design.md` + `implement.md`.
@@ -43,8 +43,7 @@ Index files list the specific guideline docs to read when you actually start cod
43
43
  From Step 1 you know the current task and status. Check the task directory:
44
44
 
45
45
  - **Active task with `task.json.meta.delivery_mode = "analysis_only"`** → keep `planning`, complete the PRD's bounded evidence work, then verify the no-change boundary, commit task artifacts, and archive directly. Do not run `task.py start`; any protected-target change needs a separate change-bearing task.
46
- - **Active task status `planning` + no `prd.md`** → Phase 1.1. Load the `trellis-brainstorm` skill.
47
- - **Active task status `planning` + `prd.md` exists** → stay in Phase 1. Lightweight tasks can be PRD-only; complex tasks need `design.md` + `implement.md`. Load the relevant Phase 1 step detail before `task.py start`.
46
+ - **Active task status `planning`** → read `meta.planning.stage` through `task.py current --json`, then load `trellis-idea-to-closed-plan` and resume that exact stage. Do not infer planning state from whether `prd.md` exists.
48
47
  - **Existing task selected by explicit intent but not bound** → use native `task.py select` for context only. Drain already dispatched Channel units before a real task switch. Planned/change-bearing work presents the final plan and asks whether to seal and approve proceeding or supplement/revise before native seal/approve/start; reuse an existing sufficient authorization. Selecting or recovering context does not approve implementation.
49
48
  - **Active task status `in_progress`** → Phase 2 step 2.1. Load the step detail:
50
49
  ```bash
@@ -58,7 +57,7 @@ From Step 1 you know the current task and status. Check the task directory:
58
57
 
59
58
  | User intent | Skill |
60
59
  |---|---|
61
- | New feature / unclear requirements | `trellis-brainstorm` |
60
+ | New task, unresolved planning, or major change to an active task | `trellis-idea-to-closed-plan` |
62
61
  | About to write code | `trellis-before-dev` |
63
62
  | Done coding / quality check | `trellis-check` |
64
63
  | Stuck / fixed same bug multiple times | `trellis-break-loop` |
@@ -0,0 +1,105 @@
1
+ # Trellis Idea to Closed Plan
2
+
3
+ Use this Skill to turn a new, changed, or newly blocked request into a complete, reviewed, explicitly authorized Trellis plan. This Skill owns planning and post-closure change triage. The Trellis CLI owns lifecycle state and receipts. Hooks and session utilities only route and display state. This Skill does not implement the task or edit `task.json`.
4
+
5
+ ## Authority and state
6
+
7
+ Read the active task through `python3 ./.trellis/scripts/task.py current --json`, then read its `task.json`, planning documents, execution ledger, and current workflow. `task.status` is the task lifecycle; `task.json.meta.planning.stage` is the planning stage. Never infer one from the other, write either field by hand, or recreate old approvals. Use only native `task.py plan`, `start`, `replan`, and `archive` commands for transitions.
8
+
9
+ The planned change path is:
10
+
11
+ ```text
12
+ planning/intake
13
+ -> evidence
14
+ -> decision_convergence (only while a material user choice is open)
15
+ -> solution_formation
16
+ -> solution_review
17
+ -> user_review
18
+ -> plan_closed
19
+ -> start -> in_progress
20
+ ```
21
+
22
+ The other authorized paths are:
23
+
24
+ - Task-based direct change: `intake -> evidence -> direct_ready -> start -> in_progress`; the CLI verifies the bounded direct contract.
25
+ - Analysis-only: `intake -> evidence -> archive`; it stays `planning`, records research evidence, and never starts implementation.
26
+ - Taskless direct work stays outside the task machine only while it remains one small, bounded, single-owner, reversible change with immediate verification. If it grows, create a task at `intake`.
27
+ - Completed or archived tasks are terminal. A follow-up gets a new task.
28
+
29
+ The CLI allows only documented `plan advance` edges. In particular, `intake` advances to `evidence`; `evidence` advances to `decision_convergence`, `solution_formation`, or a validated `direct_ready`; and later stages can return to `evidence`, `decision_convergence`, or `solution_formation` when their material preconditions hold. `plan_closed` is reopened only through `task.py replan` with an explicit earlier target stage.
30
+
31
+ ## Route the request before editing
32
+
33
+ 1. Determine whether the request belongs to the active task by comparing its goal, owner, repository, branch, component, scope, and acceptance. An independent deliverable gets a separate task and leaves the unrelated active task and ledger untouched. If bounded evidence cannot establish the relationship, ask the user to clarify before changing either task.
34
+ 2. If the task is completed or archived, create a new follow-up task. Never reopen a terminal task.
35
+ 3. Classify the work explicitly as `execution_class=planned|direct` and `delivery_mode=change_bearing|analysis_only`. Use planned work for multiple steps, material decisions, cross-component ownership, significant risk, or public/data/release changes. Use direct only when one named owner can perform one small, reversible change with immediate verification and a clear rollback. Use analysis-only only when the deliverable is evidence and the PRD states a no-change boundary for protected targets.
36
+ 4. Create a task only when the user asked for one or explicitly agrees after you explain why Trellis tracking is needed. Creating a task does not approve its plan or implementation. `task.py create` creates a planning task at `intake`; set classification with `task.py set-meta`, then use `task.py current --json` to confirm the task and stage. Do not set reserved `meta.planning` through `create --meta` or `set-meta`.
37
+ 5. Keep the stage unchanged while gathering and recording evidence. Persist verified facts and source paths in task research or PRD. Use project-specific code or search routing rules; a search result is evidence only after it is checked against the source.
38
+
39
+ ## Evidence and stage progression
40
+
41
+ - Inspect repository-backed facts, applicable specs, and task history before asking the user to resolve questions those sources can answer. Keep evidence, source paths, unresolved facts, and a recoverable next action in the task's research or planning artifacts.
42
+ - Advance a stage only after its evidence and exit conditions are met. Missing evidence is not a resolved decision or a reason to claim the plan is closed. Use `$pennix-decision-grill` only for consequential choices the user owns.
43
+ - For read-heavy evidence, define a bounded question, evidence units, source authority, and a stop condition; delegate research only through the project's approved routing. If independent subnode dispatch is requested, record the exact question, units, scope, stop conditions, destinations, concurrency, and acceptance method, then obtain explicit approval before any spawn or send. That approval covers only the frozen dispatch.
44
+ - `analysis_only` (`task.json.meta.delivery_mode = "analysis_only"`) tasks may include complex or cross-owner evidence work and recommendations. Keep them in `planning`, verify the evidence deliverable and protected-target no-change boundary, then archive through the native CLI. Do not require `design.md`, `implement.md`, a planning seal, implementation approval, or `task.py start`; create a separate change-bearing task before acting on a recommendation that changes a protected target.
45
+
46
+ ## Resolve decisions and form the solution
47
+
48
+ Use `pennix-decision-grill` for consequential user choices. Ask one high-priority, dependency-ready decision at a time; after each answer, update the decision record and reassess what remains. Do not ask users to choose facts, settled preferences, or local implementation details that can be resolved from evidence. If the request changes materially, incorporate it before proceeding.
49
+
50
+ Maintain one `trellis-decisions:v1` JSON block in `prd.md` while material decisions remain. Every decision has `id`, `status`, `question`, `evidence`, `answer_or_reason`, `impact`, and `reopen_when`. Record resolved decisions as `decided` or `deferred` with a reason; do not enter solution formation or review while any decision is `open`.
51
+
52
+ Write `prd.md` with a testable goal, scope, requirements, acceptance criteria, exclusions, confirmed facts, and decision evidence. For planned change-bearing work, write `design.md` with component boundaries, interfaces, data flow, compatibility, alternatives that matter, and operational risks. Then write `implement.md` with exactly one `trellis-implementation-plan:v1` JSON block. Each ordered step must include:
53
+
54
+ ```json
55
+ {
56
+ "id": "stable-step-id",
57
+ "target": {
58
+ "repository": "actual repository",
59
+ "branch": "actual branch",
60
+ "component_or_path": "owned component or path"
61
+ },
62
+ "depends_on": [],
63
+ "action": "concrete work",
64
+ "deliverables": "reviewable result",
65
+ "verification": "commands and observable acceptance evidence",
66
+ "risks": "material risks",
67
+ "rollback": "specific recovery action"
68
+ }
69
+ ```
70
+
71
+ Dependencies must refer only to earlier steps. Every step must have one actual owner and target. The JSON block must also contain exactly one `stop_point` with non-empty `condition`, `observable_evidence`, and `remaining_work`. The stop condition defines when this task is complete; remaining work names items outside this task. Do not leave generic, unbounded, or future-phase work inside the stop point.
72
+
73
+ Before final review, rewrite `prd.md` against the final artifact structure. Keep it lossless: preserve every confirmed fact, requirement ID, decision, constraint, source anchor, severity, and acceptance mapping; remove resolved questions and duplicates without dropping information. Fold temporary assumptions and resolved questions into the owning sections, merge overlapping defect and requirement lists while keeping evidence and anchors with the requirement, then read the PRD top to bottom to confirm no material is missing or repeated without purpose. Also confirm the goal, scope, exclusions, observable acceptance, resolved decisions, remaining technical unknowns, ownership, dependencies, compatibility, risks, verification, rollback, and stop point are consistent across the artifacts.
74
+
75
+ For `direct_ready`, record one change, one owner, bounded scope, immediate verification, and rollback in `prd.md`; the CLI validates these fields. For `analysis_only`, record the evidence deliverable and protected-target no-change boundary. Neither path should be padded with a planned implementation sequence.
76
+
77
+ Advance only after writing the material required by the target stage. Before solution review, check that all decisions are resolved and every implementation step has explicit order, dependency, repository/branch/path, deliverable, verification, risk, and rollback. Verify that the solution satisfies each acceptance criterion, addresses every material risk, and has one observable stop point. Fix gaps before advancing.
78
+
79
+ Before `plan seal` or `task.py start`, run native task validation and the applicable context checks. On subagent-dispatch workflows, `implement.jsonl` and `check.jsonl` must each contain at least one real spec or research entry; empty manifests or seed-only `_example` rows do not satisfy this gate. Inline workflows use their native context-loading path.
80
+
81
+ ## Review, approval, and start
82
+
83
+ Run the applicable task-context checks before review. Inspect the full current documents and obtain the current digest with:
84
+
85
+ ```bash
86
+ python3 ./.trellis/scripts/task.py plan digest <task>
87
+ ```
88
+
89
+ Present the complete solution to the user: goal and exclusions, resolved decisions, repository/branch/component ownership, ordered steps and dependencies, acceptance and verification, risks and rollback, and the exact stop point. Ask whether to seal and approve this displayed plan or revise it. A task request, earlier design answer, or parent-task approval is not approval of this plan.
90
+
91
+ If the user asks for changes, update the materials, return to the earliest affected stage through permitted planning transitions, rerun validation, and present the revised complete solution. When the user explicitly approves proceeding with the displayed solution, run `plan seal <task> --expected-digest <shown-digest>`, use the returned revision with `plan approve <task> --revision <n> --basis <actual non-sensitive approval>`, then `task.py start <task>`. If the user approves sealing only, stop after seal. An empty reply, cancellation, or selection of a recommended option is not approval. On a command failure, inspect its output and actual task state before retrying.
92
+
93
+ The digest and seal cover the task identity, classification, and review documents. Material edits invalidate the prior seal and approval. `execution.md` is an unsealed progress/evidence ledger and is excluded from that digest.
94
+
95
+ ## Classify changes after closure or direct start
96
+
97
+ For each new request, changed condition, or implementation discovery, first decide whether it is for this active task. Do not mutate an unrelated task. If the relationship is unclear, leave state and ledger unchanged and ask.
98
+
99
+ A change is **minor** only if the user authorized it (for requested work) and every approved commitment remains true: goal, scope, acceptance, decisions, owner/repository/branch/component, design and public/data/security/privacy/release behavior, dependencies, verification, risks/rollback, and unique stop point. For planned work, it must fit an approved step and its ownership. For direct work, the task must still meet every direct eligibility condition. A small edit that changes scope or acceptance is major. Bounded evidence gathering that cannot establish minor status also means major.
100
+
101
+ For a minor change, leave task status and stage unchanged, preserve the sealed plan, and append to `execution.md`: the approved revision/classification, trigger and evidence, why all commitments remain valid, affected step or direct contract, exact delta, and verification. Continue only after the authorized delta and verification are recorded.
102
+
103
+ A change is **major** if it changes any approved commitment, invalidates a material assumption, reopens a user decision, outgrows direct eligibility, changes ownership/target/dependency/verification/risk/rollback/stop point, or remains uncertain after bounded evidence. Stop work that depends on it, record the finding, then run native `task.py replan <task> --to <earliest-stage> <reason>`. Choose `intake` for goal/scope/classification/owner changes or direct work that outgrows eligibility; `evidence` when facts must be re-established; `decision_convergence` when a user decision is open; `solution_formation` when the solution or implementation contract changes; `solution_review` when only internal review must repeat; and `user_review` only when the complete solution and internal review remain valid but the user must approve that same material again. Replan invalidates the prior seal and approval. Rebuild the plan, present it, and obtain new explicit approval before dependent implementation resumes.
104
+
105
+ When an analysis-only evidence review is complete, verify its acceptance and no-change boundary, then archive from `evidence` with the native archive command and a concise result reason. For administrative abandonment, record the reason and use the guarded archive path. Do not treat `plan_closed` as completion or archive a task merely because planning is finished.
@@ -251,6 +251,11 @@ def _get_task_status(trellis_dir: Path, hook_input: dict) -> str:
251
251
 
252
252
  task_title = task_data.get("title", task_ref)
253
253
  task_status = task_data.get("status", "unknown")
254
+ from common.task_planning import PlanningError, planning_record
255
+ try:
256
+ stage = planning_record(task_data).get("stage") or "unknown (legacy task)"
257
+ except PlanningError as exc:
258
+ return f"Status: TASK_ERROR\nTask: {task_ref}\nNext: Repair the existing planning record: {exc}"
254
259
 
255
260
  if task_status == "completed":
256
261
  return (
@@ -259,9 +264,6 @@ def _get_task_status(trellis_dir: Path, hook_input: dict) -> str:
259
264
  "or start a new task."
260
265
  )
261
266
 
262
- has_prd = (task_dir / "prd.md").is_file()
263
- has_design = (task_dir / "design.md").is_file()
264
- has_implement = (task_dir / "implement.md").is_file()
265
267
  present = [
266
268
  name
267
269
  for name in ("prd.md", "design.md", "implement.md", "implement.jsonl", "check.jsonl")
@@ -269,27 +271,16 @@ def _get_task_status(trellis_dir: Path, hook_input: dict) -> str:
269
271
  ]
270
272
  present_line = ", ".join(present) if present else "none"
271
273
 
272
- if not has_prd:
273
- return (
274
- f"Status: PLANNING\nTask: {task_title}\nPresent: {present_line}\n"
275
- "Next: Load trellis-brainstorm and write prd.md. Stay in planning."
276
- )
277
-
278
274
  if task_status == "planning":
279
- if has_design and has_implement:
280
- next_action = "Review planning artifacts with the user before `task.py start`."
281
- else:
282
- next_action = (
283
- "Lightweight task can ask for start review with PRD-only; "
284
- "complex task must add design.md and implement.md before `task.py start`."
285
- )
286
275
  return (
287
- f"Status: PLANNING\nTask: {task_title}\nPresent: {present_line}\n"
288
- f"Next: {next_action}"
276
+ f"Status: PLANNING\nTask: {task_title}\nStage: {stage}\nPresent: {present_line}\n"
277
+ "Next: Load trellis-idea-to-closed-plan and resume the recorded planning stage; "
278
+ "artifact presence does not establish readiness."
289
279
  )
290
280
 
291
281
  return (
292
282
  f"Status: {task_status.upper()}\nTask: {task_title}\nPresent: {present_line}\n"
283
+ f"Stage: {stage}\n"
293
284
  "Next: Follow the matching per-turn workflow-state. Context order is jsonl entries, "
294
285
  "prd.md, design.md if present, implement.md if present."
295
286
  )
@@ -40,8 +40,7 @@ Index files list the specific guideline docs to read when you actually start cod
40
40
  ## Step 4: Decide next action
41
41
  From Step 1 you know the current task and status. Check the task directory:
42
42
 
43
- - **Active task status `planning` + no `prd.md`** → Phase 1.1. Load the `trellis-brainstorm` skill.
44
- - **Active task status `planning` + `prd.md` exists** → stay in Phase 1. Lightweight tasks can be PRD-only; complex tasks need `design.md` + `implement.md`. Load the relevant Phase 1 step detail before `task.py start`.
43
+ - **Active task status `planning`** → read `meta.planning.stage` through `task.py current --json`, then load `trellis-idea-to-closed-plan` and resume that exact stage. Do not infer planning state from whether `prd.md` exists.
45
44
  - **Active task status `in_progress`** → Phase 2 step 2.1. Load the step detail:
46
45
  ```bash
47
46
  {{PYTHON_CMD}} ./.trellis/scripts/get_context.py --mode phase --step 2.1 --platform {{CLI_FLAG}}
@@ -54,7 +53,7 @@ From Step 1 you know the current task and status. Check the task directory:
54
53
 
55
54
  | User intent | Skill |
56
55
  |---|---|
57
- | New feature / unclear requirements | `trellis-brainstorm` |
56
+ | New task, planning, or major change to an active task | `trellis-idea-to-closed-plan` |
58
57
  | About to write code | `trellis-before-dev` |
59
58
  | Done coding / quality check | `trellis-check` |
60
59
  | Stuck / fixed same bug multiple times | `trellis-break-loop` |
@@ -88,7 +88,7 @@ function getTaskStatus(ctx, platformInput = null) {
88
88
  (!existsSync(checkJsonl) || hasCuratedJsonlEntry(checkJsonl))
89
89
 
90
90
  if (taskStatus === "planning" && !hasPrd) {
91
- return `Status: PLANNING\nTask: ${taskTitle}\nPresent: ${presentLine}\nNext-Action: Load trellis-brainstorm and write prd.md. Stay in planning.`
91
+ return `Status: PLANNING\nTask: ${taskTitle}\nPresent: ${presentLine}\nNext-Action: Load trellis-idea-to-closed-plan and resume the recorded planning stage.`
92
92
  }
93
93
 
94
94
  if (taskStatus === "planning") {
@@ -475,7 +475,7 @@ def main() -> int:
475
475
  task = get_active_task(root, data)
476
476
  if task is None:
477
477
  # No active task — still emit a breadcrumb nudging AI toward
478
- # trellis-brainstorm + task.py create when user describes real work.
478
+ # trellis-idea-to-closed-plan + task.py create when user describes tracked work.
479
479
  no_task_key = resolve_breadcrumb_key("no_task", platform, config)
480
480
  breadcrumb = build_breadcrumb(
481
481
  None, "no_task", templates, breadcrumb_key=no_task_key
@@ -450,6 +450,11 @@ def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
450
450
 
451
451
  task_title = task_data.get("title", task_ref)
452
452
  task_status = task_data.get("status", "unknown")
453
+ from common.task_planning import PlanningError, planning_record
454
+ try:
455
+ stage = planning_record(task_data).get("stage") or "unknown (legacy task)"
456
+ except PlanningError as exc:
457
+ return f"Status: TASK_ERROR\nTask: {task_ref}\nNext-Action: Repair the existing planning record: {exc}"
453
458
  artifact_names = ("prd.md", "design.md", "implement.md", "implement.jsonl", "check.jsonl")
454
459
  present = [name for name in artifact_names if (task_dir / name).is_file()]
455
460
  if (task_dir / "research").is_dir():
@@ -463,9 +468,6 @@ def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
463
468
  "Next-Action: Run `/trellis:finish-work`. If the working tree is dirty, return to Phase 3.4 first."
464
469
  )
465
470
 
466
- has_prd = (task_dir / "prd.md").is_file()
467
- has_design = (task_dir / "design.md").is_file()
468
- has_implement_plan = (task_dir / "implement.md").is_file()
469
471
  implement_jsonl = task_dir / "implement.jsonl"
470
472
  check_jsonl = task_dir / "check.jsonl"
471
473
  jsonl_ready = (
@@ -473,39 +475,23 @@ def _get_task_status(trellis_dir: Path, input_data: dict) -> str:
473
475
  and (not check_jsonl.is_file() or _has_curated_jsonl_entry(check_jsonl))
474
476
  )
475
477
 
476
- if task_status == "planning" and not has_prd:
477
- return (
478
- f"Status: PLANNING\nTask: {task_title}\n"
479
- f"Present: {present_line}\n"
480
- "Next-Action: Load `trellis-brainstorm` and write `prd.md`. Stay in planning."
481
- )
482
-
483
478
  if task_status == "planning":
484
- missing_complex = [
485
- name for name, exists in (
486
- ("design.md", has_design),
487
- ("implement.md", has_implement_plan),
488
- )
489
- if not exists
479
+ next_bits = [
480
+ "Load `trellis-idea-to-closed-plan` and resume the recorded planning stage; "
481
+ "artifact presence does not establish readiness"
490
482
  ]
491
- next_bits: list[str] = []
492
- if missing_complex:
493
- next_bits.append(
494
- "Lightweight task can request start review with PRD-only; "
495
- f"complex task must add {', '.join(missing_complex)} before start"
496
- )
497
- else:
498
- next_bits.append("Planning artifacts are present; ask for review before `task.py start`")
499
483
  if not jsonl_ready:
500
484
  next_bits.append("curate `implement.jsonl` and `check.jsonl` before sub-agent mode start")
501
485
  return (
502
486
  f"Status: PLANNING\nTask: {task_title}\n"
487
+ f"Stage: {stage}\n"
503
488
  f"Present: {present_line}\n"
504
489
  f"Next-Action: {'; '.join(next_bits)}. Do not enter implementation until the user confirms start."
505
490
  )
506
491
 
507
492
  return (
508
493
  f"Status: {str(task_status).upper()}\nTask: {task_title}\n"
494
+ f"Stage: {stage}\n"
509
495
  f"Present: {present_line}\n"
510
496
  "Next-Action: Follow the matching per-turn workflow-state. "
511
497
  "Implementation/check context order is jsonl entries -> `prd.md` -> `design.md if present` -> `implement.md if present`."
@@ -37,6 +37,7 @@ export declare const commonTaskContext: string;
37
37
  export declare const commonContextProjection: string;
38
38
  export declare const commonTaskStore: string;
39
39
  export declare const commonTaskPlanning: string;
40
+ export declare const commonTaskMigration: string;
40
41
  export declare const commonSessionContext: string;
41
42
  export declare const commonContinuationRecord: string;
42
43
  export declare const commonOwnershipRecord: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AACF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,kBAAkB,QAE9B,CAAC;AACF,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,wBAAwB,QAEpC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAG9E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAG7E,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAC/D,eAAO,MAAM,qBAAqB,QAAoC,CAAC;AAMvE,eAAO,MAAM,sBAAsB,QAAsC,CAAC;AAC1E,eAAO,MAAM,kBAAkB,QAAkC,CAAC;AAClE,eAAO,MAAM,oBAAoB,QAAoC,CAAC;AACtE,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA8CnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAOlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAcH,eAAO,MAAM,WAAW,QAAsC,CAAC;AAG/D,eAAO,MAAM,UAAU,QAA6C,CAAC;AACrE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,YAAY,QAA2C,CAAC;AACrE,eAAO,MAAM,QAAQ,QAAuC,CAAC;AAC7D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,SAAS,QAAwC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,WAAW,QAA0C,CAAC;AACnE,eAAO,MAAM,iBAAiB,QAAiD,CAAC;AAChF,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AACF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,kBAAkB,QAE9B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,wBAAwB,QAEpC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAE/B,CAAC;AACF,eAAO,MAAM,eAAe,QAA+C,CAAC;AAC5E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,QAAgD,CAAC;AAG9E,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAC7E,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AACvE,eAAO,MAAM,qBAAqB,QAEjC,CAAC;AACF,eAAO,MAAM,mBAAmB,QAA4C,CAAC;AAG7E,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,QAA8B,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAgC,CAAC;AAC/D,eAAO,MAAM,qBAAqB,QAAoC,CAAC;AAMvE,eAAO,MAAM,sBAAsB,QAAsC,CAAC;AAC1E,eAAO,MAAM,kBAAkB,QAAkC,CAAC;AAClE,eAAO,MAAM,oBAAoB,QAAoC,CAAC;AACtE,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA+CnD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAOlD"}
@@ -47,6 +47,7 @@ export const commonTaskContext = readTemplate("scripts/common/task_context.py");
47
47
  export const commonContextProjection = readTemplate("scripts/common/context_projection.py");
48
48
  export const commonTaskStore = readTemplate("scripts/common/task_store.py");
49
49
  export const commonTaskPlanning = readTemplate("scripts/common/task_planning.py");
50
+ export const commonTaskMigration = readTemplate("scripts/common/task_migration.py");
50
51
  export const commonSessionContext = readTemplate("scripts/common/session_context.py");
51
52
  export const commonContinuationRecord = readTemplate("scripts/common/continuation_record.py");
52
53
  export const commonOwnershipRecord = readTemplate("scripts/common/ownership_record.py");
@@ -104,6 +105,7 @@ export function getAllScripts() {
104
105
  scripts.set("common/context_projection.py", commonContextProjection);
105
106
  scripts.set("common/task_store.py", commonTaskStore);
106
107
  scripts.set("common/task_planning.py", commonTaskPlanning);
108
+ scripts.set("common/task_migration.py", commonTaskMigration);
107
109
  scripts.set("common/session_context.py", commonSessionContext);
108
110
  scripts.set("common/continuation_record.py", commonContinuationRecord);
109
111
  scripts.set("common/ownership_record.py", commonOwnershipRecord);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/trellis/index.ts"],"names":[],"mappings":"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"}