@pennixrv/trellis 0.7.0-beta.31 → 0.7.0-beta.34

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 (36) hide show
  1. package/dist/commands/channel/index.d.ts.map +1 -1
  2. package/dist/commands/channel/index.js +15 -11
  3. package/dist/commands/channel/index.js.map +1 -1
  4. package/dist/commands/channel/spawn.d.ts.map +1 -1
  5. package/dist/commands/channel/spawn.js +16 -11
  6. package/dist/commands/channel/spawn.js.map +1 -1
  7. package/dist/configurators/shared.js +2 -2
  8. package/dist/configurators/shared.js.map +1 -1
  9. package/dist/migrations/manifests/0.7.0-beta.32.json +9 -0
  10. package/dist/migrations/manifests/0.7.0-beta.33.json +9 -0
  11. package/dist/migrations/manifests/0.7.0-beta.34.json +9 -0
  12. package/dist/templates/common/bundled-skills/trellis-channel/SKILL.md +3 -1
  13. package/dist/templates/common/bundled-skills/trellis-channel/references/command-reference.md +11 -10
  14. package/dist/templates/common/bundled-skills/trellis-channel/references/forum.md +4 -12
  15. package/dist/templates/common/bundled-skills/trellis-channel/references/multi-target-dispatch.md +113 -0
  16. package/dist/templates/common/bundled-skills/trellis-channel/references/progress-debugging.md +4 -4
  17. package/dist/templates/common/bundled-skills/trellis-channel/references/subnode-work.md +32 -7
  18. package/dist/templates/common/bundled-skills/trellis-channel/references/workers.md +2 -3
  19. package/dist/templates/common/bundled-skills/trellis-channel/references/workflows.md +11 -12
  20. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +6 -2
  21. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +6 -1
  22. package/dist/templates/common/commands/continue.md +24 -9
  23. package/dist/templates/common/commands/start.md +7 -0
  24. package/dist/templates/common/skills/brainstorm.md +16 -3
  25. package/dist/templates/copilot/prompts/brainstorm.prompt.md +2 -2
  26. package/dist/templates/shared-hooks/inject-workflow-state.py +3 -2
  27. package/dist/templates/trellis/index.d.ts +1 -0
  28. package/dist/templates/trellis/index.d.ts.map +1 -1
  29. package/dist/templates/trellis/index.js +2 -0
  30. package/dist/templates/trellis/index.js.map +1 -1
  31. package/dist/templates/trellis/scripts/common/task_planning.py +133 -0
  32. package/dist/templates/trellis/scripts/common/task_store.py +20 -1
  33. package/dist/templates/trellis/scripts/subnode_artifact.py +32 -0
  34. package/dist/templates/trellis/scripts/task.py +96 -2
  35. package/dist/templates/trellis/workflow.md +51 -4
  36. package/package.json +2 -2
@@ -26,8 +26,7 @@ trellis channel create design-feedback \
26
26
  --type forum \
27
27
  --scope global \
28
28
  --description "Cross-project design feedback board." \
29
- --context-raw "One thread per design topic; close when resolved." \
30
- --by main
29
+ --context-raw "One thread per design topic; close when resolved."
31
30
  ```
32
31
 
33
32
  Use `--scope project` for a board scoped to one repo, `--scope global` for a
@@ -42,7 +41,6 @@ a thread is `opened`; everything afterwards uses the same `--thread` key.
42
41
  ```bash
43
42
  trellis channel post design-feedback opened \
44
43
  --scope global \
45
- --as main \
46
44
  --thread login-empty-state \
47
45
  --title "Empty state on the login screen" \
48
46
  --description "Track design feedback for the new login empty state." \
@@ -58,13 +56,11 @@ trellis channel post design-feedback comment \
58
56
 
59
57
  trellis channel post design-feedback status \
60
58
  --scope global \
61
- --as main \
62
59
  --thread login-empty-state \
63
60
  --status closed
64
61
 
65
62
  trellis channel post design-feedback summary \
66
63
  --scope global \
67
- --as main \
68
64
  --thread login-empty-state \
69
65
  --summary "Adopted the option-B layout; ticket TRELLIS-123 owns the fix."
70
66
  ```
@@ -187,12 +183,10 @@ wrong key (typo, wrong slug convention, etc.). Threads do not support hard
187
183
  deletion — rename is the supported corrective action.
188
184
 
189
185
  ```bash
190
- trellis channel thread rename design-feedback old-key new-key \
191
- --scope global \
192
- --as main
186
+ trellis channel thread rename design-feedback old-key new-key --scope global
193
187
  ```
194
188
 
195
- - `--as <agent>` is **required**.
189
+ - Omit `--as` to use `TRELLIS_CHANNEL_AS` or `main`; pass it only to attribute the rename to another actor.
196
190
  - `post <name> rename` is rejected — you must use `thread rename`.
197
191
 
198
192
  ## Deletion Discipline
@@ -216,12 +210,10 @@ trellis channel create release-notes \
216
210
  --type forum \
217
211
  --scope global \
218
212
  --description "Internal release and runtime changelog." \
219
- --context-raw "One thread per notable change; close when shipped." \
220
- --by main
213
+ --context-raw "One thread per notable change; close when shipped."
221
214
 
222
215
  trellis channel post release-notes opened \
223
216
  --scope global \
224
- --as main \
225
217
  --thread release-2026-q1 \
226
218
  --title "Channel threads and forum UX in 0.6" \
227
219
  --description "Forum channel UX shipped in the 0.6 line." \
@@ -0,0 +1,113 @@
1
+ # Multiple Evidence Units
2
+
3
+ Use after the user has authorized independent evidence and the task owns a
4
+ reviewed unit mapping. Read `subnode-work.md` for artifact and acceptance rules.
5
+ Codex inline mode governs native implement/check agents; it does not disable
6
+ explicit Channel evidence. Missing independent reports cannot be replaced by
7
+ main-session pass claims.
8
+
9
+ ## Prepare And Dispatch In One Host Call
10
+
11
+ Choose units by work, complexity, evidence range, and relationship. Combine only
12
+ individually quick/simple and obviously related points with shared context and
13
+ a bounded total workload. Each scope item keeps its own evidence, conclusion,
14
+ unknowns, and stop condition. Neither eight slots nor eight owner domains imply
15
+ eight work packages. Store this mapping in the task's existing plan or matrix.
16
+
17
+ Read the actual native guard and current workers/reservations. Initially fill
18
+ all available capacity in FIFO order; a justified dependency or resource limit
19
+ belongs in the task record, not an arbitrary coordinator throttle. Initialize
20
+ all reviewed briefs before queue creation or spawning. A failed initialization
21
+ stops admission; preserve/reconcile partial artifacts without dispatching them.
22
+
23
+ For a configured subnode profile, `spawn --profile <id> --as <worker>` implies
24
+ the subnode role and inherits its Codex provider; do not repeat
25
+ `--agent subnode --provider codex`. Keep each worker ID and `send --to` explicit.
26
+ Author identity on `send` defaults to `TRELLIS_CHANNEL_AS` or `main`, so routine
27
+ dispatch need not repeat `--as main`.
28
+
29
+ Coalesce operations that can share one noninteractive host invocation. Use ONE
30
+ native `exec_command` containing a standard-library loop over existing CLI
31
+ commands. Multiple `exec_command` calls inside `functions.exec` still count as
32
+ multiple host calls. This is a procedure, not a new Channel batch API, scheduler,
33
+ or worker-state store. Keep init and dispatch as separate admission stages.
34
+
35
+ The following runnable pattern consumes a temporary, reviewed JSON array of
36
+ `{"target": "unit-id", "argv": ["trellis", "channel", ...]}` entries. Use
37
+ `[sys.executable, ".trellis/scripts/subnode_artifact.py", ...]` for artifact
38
+ commands. Put claim, spawn, and send in queue order; do not include waits. Review
39
+ each argument vector and the native capacity before executing. The input and
40
+ raw receipts are temporary command data, not task authority; retain only needed
41
+ non-sensitive evidence and clean the temporary input after use.
42
+
43
+ ```bash
44
+ # python on Windows; python3 elsewhere. Execute this whole block in ONE host call.
45
+ python3 - /absolute/path/to/reviewed-actions.json <<'PY'
46
+ import json
47
+ import subprocess
48
+ import sys
49
+
50
+ actions = json.load(open(sys.argv[1], encoding="utf-8"))
51
+ failed = False
52
+ for action in actions:
53
+ if failed:
54
+ print(json.dumps({"target": action["target"], "status": "not_attempted"}))
55
+ continue
56
+ argv = [sys.executable if part == "{python}" else part for part in action["argv"]]
57
+ try:
58
+ result = subprocess.run(argv, capture_output=True, text=True, check=False)
59
+ failed = result.returncode != 0
60
+ receipt = {"target": action["target"], "argv": argv,
61
+ "status": "error" if failed else "completed",
62
+ "exit_code": result.returncode,
63
+ "stdout": result.stdout, "stderr": result.stderr}
64
+ except OSError as error:
65
+ failed = True
66
+ receipt = {"target": action["target"], "argv": argv,
67
+ "status": "error", "error": str(error)}
68
+ print(json.dumps(receipt), flush=True)
69
+ sys.exit(1 if failed else 0)
70
+ PY
71
+ ```
72
+
73
+ The aggregate exit code is not per-target evidence. Inspect every receipt,
74
+ including missing or conflicting receipts; the first error stops later actions
75
+ and pauses the whole queue. Never retry a claimed attempt. A new approved
76
+ attempt needs a new brief and ID.
77
+
78
+ ## Rolling FIFO
79
+
80
+ 1. Capture a durable barrier before dispatch. Claim the earliest unclaimed unit,
81
+ spawn/send through native Channel, and preserve its receipt. The helper
82
+ enforces claim order; earlier claims need not be accepted to fill initial slots.
83
+ 2. Establish exactly one native waiter for the dispatched workers without
84
+ `--all`. Resume only its live host continuation until it returns, times out,
85
+ or errors; run no other host action meanwhile.
86
+ 3. Recheck dispatched items for failures, conflicts, and unresolved terminal
87
+ states. Still-running healthy workers do not need to finish. Validate the
88
+ completed worker's per-scope report, recheck sources and protected targets,
89
+ then write its create-once `accepted` disposition.
90
+ 4. That acceptance plus verified native capacity authorizes the next unclaimed
91
+ FIFO unit immediately, while other healthy workers continue. Preserve the
92
+ barrier/event cursor so already emitted terminal events cannot be lost.
93
+ 5. Incomplete/blocked/rejected results, validator concerns, capacity refusal,
94
+ missing/conflicting receipts, or unresolvable reservations pause the entire
95
+ queue. A terminal event alone never authorizes replacement. On recovery,
96
+ reconstruct claims, events, workers/reservations, reports, and dispositions;
97
+ never redispatch an old claim or require all healthy live predecessors to
98
+ complete merely to refill an accepted slot.
99
+
100
+ ## Temporary Task Switch
101
+
102
+ Save the old task's checkpoint. Pause refills and drain ALL already dispatched
103
+ units: wait, validate, and disposition each result, including failures; confirm
104
+ the live continuation, worker, and reservation boundaries are closed. A drain
105
+ does not dispatch pending queue items or turn a failure into acceptance. Do not
106
+ automatically kill, retry, or abandon the old queue. Preserve unclaimed work and
107
+ the old phase. Only after drain, run native `task.py select <new-task>`; it
108
+ changes context without status, branch, after_start hooks, or implementation
109
+ authority. With no in-flight work, select directly after saving the checkpoint.
110
+
111
+ When returning, reconstruct only the missing old-task facts and resume only
112
+ still-authorized work. Selecting a user-stopped audit never restarts it. Ordinary
113
+ continue and sufficient compaction recovery retain their direct checkpoint path.
@@ -127,7 +127,7 @@ wait command starts, capture a barrier before that operation and pass it back:
127
127
  ```bash
128
128
  BARRIER="$(trellis channel barrier T)"
129
129
  # spawn or trigger work that may emit a terminal event
130
- trellis channel wait T --as main --workers check \
130
+ trellis channel wait T --workers check \
131
131
  --after-seq "$BARRIER" --timeout 15m
132
132
  ```
133
133
 
@@ -146,10 +146,10 @@ The separate event-filter mode wakes on:
146
146
  Useful filters:
147
147
 
148
148
  ```bash
149
- trellis channel wait T --as main --from check --kind done --timeout 15m
150
- trellis channel wait T --as main --from check,check-cx --kind done --all --timeout 15m
149
+ trellis channel wait T --from check --kind done --timeout 15m
150
+ trellis channel wait T --from check,check-cx --kind done --all --timeout 15m
151
151
  trellis channel wait T --as worker --kind message --timeout 1h
152
- trellis channel wait T --as main --thread release-note --action status --timeout 10m
152
+ trellis channel wait T --thread release-note --action status --timeout 10m
153
153
  ```
154
154
 
155
155
  Exit codes: `0` matched, `124` timeout, `1`/`2` errors. On `wait --all`
@@ -20,7 +20,26 @@ dependencies, stop conditions, deadline, and `channel_ref`. Set `retry_of`
20
20
  only for an explicit manual retry and `counter_of` only for intentional
21
21
  counterwork. A retry names an existing, different subnode in the same task and
22
22
  `work_id`; counterwork may be initialized independently. The helper supplies
23
- the immutable task identity and report path.
23
+ the immutable task identity and report path. New units also require `unit_plan`:
24
+
25
+ ```json
26
+ {
27
+ "unit_plan": {
28
+ "plan_ref": ".trellis/tasks/09-07-example/design.md#evidence-units",
29
+ "sizing_rationale": "One bounded dependency inspection with a separately reviewable result."
30
+ }
31
+ }
32
+ ```
33
+
34
+ The reference must identify an existing regular Markdown document inside this
35
+ task. For multiple scope items, add `grouping_rationale` explaining why every
36
+ item is quick/simple, obviously related, and uses shared context while retaining
37
+ separate conclusions. Record the actual scope mapping and evidence in the task
38
+ plan before initializing briefs; owner domains and slot counts do not determine
39
+ unit counts. Complex or lengthy points need separate units or further splitting.
40
+ The helper checks structure, not the truth of the sizing judgment. Historical
41
+ brief/report readers remain compatible; new init and queue admission require
42
+ the unit plan.
24
43
 
25
44
  ```bash
26
45
  TASK=.trellis/tasks/09-07-example
@@ -117,19 +136,20 @@ the worker can emit a terminal event. The CLI waits once for a worker lifecycle
117
136
  transition after that barrier, including supervisor-authored terminal events:
118
137
 
119
138
  ```bash
120
- trellis channel create subnode-example --by main --cwd "$PWD"
139
+ trellis channel create subnode-example
121
140
  BARRIER="$(trellis channel barrier subnode-example)"
122
- trellis channel spawn subnode-example --agent subnode --provider codex \
123
- --as "$SUBNODE_ID" --cwd "$PWD"
141
+ trellis channel spawn subnode-example --agent subnode --as "$SUBNODE_ID"
124
142
 
125
143
  printf '%s\n' "Read $TASK/subnodes/$WORK_ID/$SUBNODE_ID/brief.json and perform only that bounded work." \
126
- | trellis channel send subnode-example --as main --to "$SUBNODE_ID" \
144
+ | trellis channel send subnode-example --to "$SUBNODE_ID" \
127
145
  --stdin --delivery-mode requireRunningWorker
128
146
 
129
- trellis channel wait subnode-example --as main --workers "$SUBNODE_ID" \
147
+ trellis channel wait subnode-example --workers "$SUBNODE_ID" \
130
148
  --after-seq "$BARRIER" --timeout 30m
131
149
  ```
132
150
 
151
+ When selecting a configured model profile, use `--profile <id>` in place of `--agent subnode`; it implies the subnode role and reads its Codex provider from role frontmatter. Keep the unique worker `--as` for dispatch identity. Omit author `--as` on `send` and `wait` to use `TRELLIS_CHANNEL_AS` or `main`.
152
+
133
153
  `channel.subnode` in `.trellis/config.yaml` supplies the role defaults for
134
154
  `max_live_workers` (generated default `8`), `idle_timeout`, `timeout`, and
135
155
  `warn_before`. Change that section before a dispatch group when its resource
@@ -137,7 +157,12 @@ or lifetime needs differ; pass the corresponding `spawn` flag only for a
137
157
  one-off override. The generic `channel.worker_guard` remains the fallback for
138
158
  ordinary workers and for a subnode key omitted from the project config.
139
159
 
140
- For a group, use `--workers a,b --all` with the barrier captured before dispatch.
160
+ For rolling FIFO dispatch, follow `references/multi-target-dispatch.md`: initially
161
+ fill available native capacity, wait for the first terminal worker, review and
162
+ accept it, then refill while other workers continue. Do not use `--all` as an
163
+ ordinary refill prerequisite. Use `--workers a,b --all` only when the intent
164
+ requires draining all already dispatched workers, with the barrier captured
165
+ before dispatch.
141
166
  Worker mode emits one terminal worker projection per satisfied target. Ordinary
142
167
  adapter errors and peer turn completion do not end the wait. `--from` remains
143
168
  an exact event-author filter; it is not a worker lifecycle selector.
@@ -106,8 +106,7 @@ trellis channel spawn cr-example --agent check --provider codex --as check-cx \
106
106
  --file "$TASK/prd.md" \
107
107
  --file "$TASK/design.md" \
108
108
  --file "$TASK/implement.md" \
109
- --jsonl "$TASK/check.jsonl" \
110
- --cwd "$PWD" --timeout 30m
109
+ --jsonl "$TASK/check.jsonl" --timeout 30m
111
110
  ```
112
111
 
113
112
  The `spawned` event records both the literal `files` array and any `manifests`
@@ -128,7 +127,7 @@ channel:
128
127
  trellis channel spawn cr-feature --agent check --as check-claude
129
128
  trellis channel spawn cr-feature --agent check --provider codex --as check-cx
130
129
 
131
- trellis channel wait cr-feature --as main \
130
+ trellis channel wait cr-feature \
132
131
  --from check-claude,check-cx --kind done --all --timeout 15m
133
132
  ```
134
133
 
@@ -9,7 +9,7 @@ Use when the user says "和 codex/claude 讨论一下", "brainstorm", or "拉一
9
9
  进来一起看".
10
10
 
11
11
  ```bash
12
- trellis channel create brainstorm-storage-layer --by main \
12
+ trellis channel create brainstorm-storage-layer \
13
13
  --task .trellis/tasks/05-XX-storage-adapter
14
14
  BARRIER="$(trellis channel barrier brainstorm-storage-layer)"
15
15
 
@@ -20,10 +20,10 @@ trellis channel spawn brainstorm-storage-layer \
20
20
  --as cx-arch --timeout 30m
21
21
 
22
22
  trellis channel send brainstorm-storage-layer \
23
- --as main --to cx-arch --text-file /tmp/brainstorm-r1.md
23
+ --to cx-arch --text-file /tmp/brainstorm-r1.md
24
24
 
25
25
  trellis channel wait brainstorm-storage-layer \
26
- --as main --kind done --from cx-arch --after-seq "$BARRIER" --timeout 10m
26
+ --kind done --from cx-arch --after-seq "$BARRIER" --timeout 10m
27
27
  ```
28
28
 
29
29
  Do not stop after one answer. Read the answer, identify vague areas, send a
@@ -53,7 +53,7 @@ Use when the user asks to dispatch implementation or review work.
53
53
 
54
54
  ```bash
55
55
  TASK=.trellis/tasks/05-12-foo
56
- trellis channel create cr-foo --task "$TASK" --by main
56
+ trellis channel create cr-foo --task "$TASK"
57
57
  BARRIER="$(trellis channel barrier cr-foo)"
58
58
 
59
59
  trellis channel spawn cr-foo \
@@ -61,11 +61,10 @@ trellis channel spawn cr-foo \
61
61
  --jsonl "$TASK/check.jsonl" \
62
62
  --file "$TASK/prd.md" \
63
63
  --file "$TASK/design.md" \
64
- --file "$TASK/implement.md" \
65
- --cwd "$PWD" --timeout 15m
64
+ --file "$TASK/implement.md" --timeout 15m
66
65
 
67
- trellis channel send cr-foo --as main --to check --text-file /tmp/cr-brief.md
68
- trellis channel wait cr-foo --as main --kind done --from check --after-seq "$BARRIER" --timeout 15m
66
+ trellis channel send cr-foo --to check --text-file /tmp/cr-brief.md
67
+ trellis channel wait cr-foo --kind done --from check --after-seq "$BARRIER" --timeout 15m
69
68
  trellis channel messages cr-foo --kind message --from check --tag final_answer
70
69
  ```
71
70
 
@@ -78,7 +77,7 @@ already run.
78
77
  Use one channel and distinct worker names.
79
78
 
80
79
  ```bash
81
- trellis channel create cr-feature --by main --ephemeral
80
+ trellis channel create cr-feature --ephemeral
82
81
  BARRIER="$(trellis channel barrier cr-feature)"
83
82
 
84
83
  trellis channel spawn cr-feature --agent check \
@@ -89,9 +88,9 @@ trellis channel spawn cr-feature --agent check --provider codex --as check-cx \
89
88
  --jsonl "$TASK/check.jsonl" --file "$TASK/prd.md" --file "$TASK/design.md" \
90
89
  --timeout 15m
91
90
 
92
- trellis channel send cr-feature --as main --to check --text-file /tmp/cr-brief.md
93
- trellis channel send cr-feature --as main --to check-cx --text-file /tmp/cr-brief.md
94
- trellis channel wait cr-feature --as main --kind done --from check,check-cx --all --after-seq "$BARRIER" --timeout 15m
91
+ trellis channel send cr-feature --to check --text-file /tmp/cr-brief.md
92
+ trellis channel send cr-feature --to check-cx --text-file /tmp/cr-brief.md
93
+ trellis channel wait cr-feature --kind done --from check,check-cx --all --after-seq "$BARRIER" --timeout 15m
95
94
  ```
96
95
 
97
96
  `--all` means every listed worker must emit a matching event.
@@ -10,6 +10,7 @@ Task lifecycle includes creation, start, context configuration, finish, archive,
10
10
  4. `.trellis/scripts/common/task_store.py`
11
11
  5. `.trellis/scripts/common/task_utils.py`
12
12
  6. The current task's `.trellis/tasks/<task>/task.json`
13
+ 7. `.trellis/scripts/common/task_planning.py` for material revisions and start admission
13
14
 
14
15
  ## Common Needs And Edit Points
15
16
 
@@ -23,6 +24,8 @@ Task lifecycle includes creation, start, context configuration, finish, archive,
23
24
  | Change default task fields | `.trellis/scripts/common/task_store.py`. |
24
25
  | Change task parsing/search | `.trellis/scripts/common/task_utils.py`. |
25
26
  | Change active task behavior | `.trellis/scripts/common/active_task.py`. |
27
+ | Select context without starting | Native `task.py select`; preserve phase/branch and drain live Channel work first. |
28
+ | Seal and record later approval of a material plan | Native `task.py plan seal/approve`; reserved `meta.planning`, owned by `common/task_planning.py`. |
26
29
 
27
30
  ## lifecycle hooks
28
31
 
@@ -44,7 +47,7 @@ Hook commands receive the `TASK_JSON_PATH` environment variable, pointing to the
44
47
 
45
48
  ## Change Task Fields
46
49
 
47
- If the user wants to add project-local fields, prefer putting them under `meta` in `task.json` to avoid breaking existing scripts' assumptions about standard fields.
50
+ If the user wants to add project-local fields, prefer putting them under `meta` in `task.json` to avoid breaking existing scripts' assumptions about standard fields. `meta.planning` is reserved for native seal/approve; do not prefill or overwrite it through generic metadata. Classification uses `execution_class=direct|planned` and `delivery_mode=change_bearing|analysis_only`.
48
51
 
49
52
  Example:
50
53
 
@@ -70,7 +73,8 @@ Active task is session-level state stored in `.trellis/.runtime/sessions/`. Do n
70
73
  `cmd_create` in `.trellis/scripts/common/task_store.py` calls `set_active_task` best-effort right after writing the new task directory. The behavior:
71
74
 
72
75
  - When the calling shell carries session identity (`TRELLIS_CONTEXT_ID` env var, or any platform-specific session env that `resolve_context_key` recognizes — see `active_task.py:_ENV_SESSION_KEYS`), the per-session pointer at `.trellis/.runtime/sessions/<context_key>.json` is rewritten to point at the new task. The task's `status=planning` and `[workflow-state:planning]` fires on the very next `UserPromptSubmit`.
73
- - When session identity is unavailable (raw CLI invocation outside an AI session, or a platform that doesn't propagate identity to shell), the task directory is still created and `status=planning` is still written, but the active pointer is left untouched. The user can attach the task later with `task.py start <dir>` once they're back in an AI session.
76
+ - When session identity is unavailable (raw CLI invocation outside an AI session, or a platform that doesn't propagate identity to shell), the task directory is still created and `status=planning` is still written, but the active pointer is left untouched. Attach planning context later with `task.py select <dir>` once identity is available; start requires its own phase/approval gates.
77
+ - `create --no-start` deliberately preserves the prior pointer; use select to switch context after saving the checkpoint and draining already dispatched Channel work. Selecting does not change phase/branch, run after_start, or grant implementation authority.
74
78
 
75
79
  This makes `[workflow-state:planning]` the live breadcrumb during the brainstorm and JSONL curation work that follows `task.py create`. The pre-R7 behavior left the breadcrumb stuck on `no_task` until `task.py start`, so the planning block was effectively dead text.
76
80
 
@@ -43,6 +43,8 @@ The Trellis task system is stored entirely under `.trellis/tasks/` in the user p
43
43
  | `children` / `parent` | Parent/child task relationships. |
44
44
  | `commit` / `pr_url` | Commit and PR information after completion. |
45
45
  | `meta` | Extension fields. |
46
+ | `meta.execution_class` / `meta.delivery_mode` | Explicit task classification; planned/change-bearing start needs current material-plan approval. |
47
+ | `meta.planning` | Reserved native material revision, seal, and later approval; use plan seal/approve, never generic metadata. |
46
48
 
47
49
  ## Parent / Child Task Trees
48
50
 
@@ -81,7 +83,7 @@ The user sees a "current task," but Trellis stores active task state per session
81
83
  .trellis/.runtime/sessions/<context-key>.json
82
84
  ```
83
85
 
84
- `task.py start` writes the task path into the runtime session file for the current session. `task.py current --source` shows the current task and where it came from. Different AI windows can point to different tasks without overwriting each other.
86
+ `task.py select` writes only the current session's task context; status/branch and implementation authority are unchanged. `task.py start` also enters execution after its admission gates. `task.py current --source` shows the current task and where it came from. Different AI windows can point to different tasks without overwriting each other. Before switching with live Channel work, pause refills and drain already dispatched units/reservations while preserving pending work and the old phase.
85
87
 
86
88
  If the platform or shell environment has no stable session identity, `task.py start` may be unable to set the active task. The AI should read the error, inspect the platform hook/session environment, and not fall back to a shared global pointer.
87
89
 
@@ -107,6 +109,9 @@ Rules:
107
109
 
108
110
  ```bash
109
111
  python3 ./.trellis/scripts/task.py create "<title>" --description "<one-line summary>" --slug <slug>
112
+ python3 ./.trellis/scripts/task.py select <task>
113
+ python3 ./.trellis/scripts/task.py plan seal <task>
114
+ python3 ./.trellis/scripts/task.py plan approve <task> --revision <n> --basis "<actual later approval>"
110
115
  python3 ./.trellis/scripts/task.py start <task>
111
116
  python3 ./.trellis/scripts/task.py current --source
112
117
  python3 ./.trellis/scripts/task.py add-context <task> implement <file> <reason>
@@ -4,14 +4,28 @@ Resume work on the current task — pick up at the right phase/step in `.trellis
4
4
 
5
5
  ---
6
6
 
7
- ## Step 1: Load Current Context
7
+ ## Step 1: Reuse the Checkpoint; Fill Only Missing Context
8
+
9
+ If the current conversation or compaction summary already supplies project root,
10
+ task, phase, authorization and pending action, resume that action directly. Keep
11
+ running tool handles and completed work; skip the queries below and Steps 2–4
12
+ unless a specific fact or instruction is missing/conflicting. A plain continue
13
+ does not require startup, Git/status/history or formal handoff validation.
14
+
15
+ After compaction, never repeat or re-answer the last consumed user input from
16
+ before compaction. Continue from the actual checkpoint. Handle genuinely new
17
+ post-compaction input normally.
18
+
19
+ For a fresh session, changed target, missing/conflicting facts or explicit
20
+ inspection, use the minimum query that resolves the gap:
8
21
 
9
22
  ```bash
10
- {{PYTHON_CMD}} ./.trellis/scripts/get_context.py
11
23
  {{PYTHON_CMD}} ./.trellis/scripts/task.py current --json
12
24
  ```
13
25
 
14
- Confirms: current task, git state, recent commits.
26
+ Use full `get_context.py` only when its identity/project/Git overview is needed.
27
+ Protected native writes still enforce identity, binding and ownership through
28
+ their owner; this shortcut never bypasses those checks.
15
29
 
16
30
  Before routing by status, distinguish identity from task binding. A non-null
17
31
  `session_source` confirms available identity; only `source=session:...` confirms
@@ -19,17 +33,18 @@ a direct task binding. For `unbound` / `unbound_ambiguous`, review existing task
19
33
  artifacts and select by the user's explicit intent. Exit code 1 for ambiguity
20
34
  does not mean identity is absent. Do not guess, duplicate tasks, invent identity,
21
35
  or edit runtime pointers. Return a planning candidate to the planning gates below;
22
- use native `task.py start <task>` only when its activation contract permits it.
36
+ use native `task.py select <task>` to bind planning context after any required
37
+ Channel drain; use `task.py start` only when its activation contract permits it.
23
38
  An eligible `analysis_only` candidate remains in planning without start.
24
39
  If `session_source` is null, report unavailable identity separately.
25
40
 
26
- ## Step 2: Load the Phase Index
41
+ ## Step 2: Load the Phase Index Only When Needed
27
42
 
28
43
  ```bash
29
44
  {{PYTHON_CMD}} ./.trellis/scripts/get_context.py --mode phase
30
45
  ```
31
46
 
32
- Shows the Phase Index (Plan / Execute / Finish) with routing + skill mapping.
47
+ Run only when the phase or routing rule is missing; otherwise reuse it.
33
48
 
34
49
  ## Step 3: Decide Where You Are
35
50
 
@@ -37,11 +52,11 @@ Shows the Phase Index (Plan / Execute / Finish) with routing + skill mapping.
37
52
 
38
53
  - `status=planning` + `task.json.meta.delivery_mode = "analysis_only"` → first confirm the task still satisfies the bounded evidence-only eligibility rule; then complete the PRD's evidence work, verify its acceptance criteria and no-change boundary, and archive directly. Do not run `task.py start`; a protected-target change requires a separate change-bearing task.
39
54
  - `status=planning` + no `prd.md` → **1.1** (load `trellis-brainstorm`)
40
- - `status=planning` + a recorded `decision-needed` or unsealed decision chain → return to the planning frontier and load `pennix-decision-gates` when independent material questions can be batched.
55
+ - `status=planning` + a recorded `decision-needed` or unsealed decision chain → return to the planning frontier and load `pennix-decision-grill` when independent material questions can be batched.
41
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.
42
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
58
  - `status=planning` + complex artifacts complete + sub-agent jsonl not curated (empty, or only a legacy `_example` placeholder row) → **1.3**
44
- - `status=planning` + required artifacts complete + required jsonl curated or inline mode → run the Planning Seal closure pass, then **1.4** (ask for start review; only run `task.py start` after user confirms)
59
+ - `status=planning` + required artifacts complete + required jsonl curated or inline mode → run the Planning Seal closure pass, then **1.4**. Existing authorization must be a later explicit implementation approval for this task's current sealed material revision. Initial requests, design answers, and parent-task approval do not qualify. Use native plan seal/approve/start; ask only when that approval is missing. A replan invalidates it; minor progress edits do not.
45
60
  - `status=in_progress` + implementation not started → **2.1**
46
61
  - `status=in_progress` + implementation done, not yet checked → **2.2**
47
62
  - `status=in_progress` + check passed → **3.3** (spec update) → **3.4** (commit)
@@ -55,7 +70,7 @@ Phase rules (full detail in `.trellis/workflow.md`):
55
70
 
56
71
  ## Step 4: Load the Specific Step
57
72
 
58
- Once you know which step to resume at:
73
+ Only if the identified step's instructions are missing:
59
74
 
60
75
  ```bash
61
76
  {{PYTHON_CMD}} ./.trellis/scripts/get_context.py --mode phase --step <X.X> --platform {{CLI_FLAG}}
@@ -2,6 +2,12 @@
2
2
 
3
3
  Initialize a Trellis-managed development session. This platform has no session-start hook, so manually load the equivalent compact context by following these steps.
4
4
 
5
+ Run this initialization once when project context is genuinely missing or the
6
+ target project changes. Existing session context and a sufficient compaction
7
+ summary count as loaded context. An ordinary continue or new task in the same
8
+ known project resumes the pending action without repeating these steps. For
9
+ partial missing/conflicting facts, query only the needed owner evidence.
10
+
5
11
  ---
6
12
 
7
13
  ## Step 1: Current state
@@ -39,6 +45,7 @@ From Step 1 you know the current task and status. Check the task directory:
39
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.
40
46
  - **Active task status `planning` + no `prd.md`** → Phase 1.1. Load the `trellis-brainstorm` skill.
41
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`.
48
+ - **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 start requires native plan seal and matching later approval for this task's current material revision; selecting or recovering context does not approve implementation.
42
49
  - **Active task status `in_progress`** → Phase 2 step 2.1. Load the step detail:
43
50
  ```bash
44
51
  {{PYTHON_CMD}} ./.trellis/scripts/get_context.py --mode phase --step 2.1 --platform {{CLI_FLAG}}
@@ -6,7 +6,7 @@ A request to build, implement, fix, refactor, or "go ahead" is not approval to l
6
6
 
7
7
  For every non-trivial task, the user must respond at least once after the initial request before implementation begins. If no clarification is needed, that response must approve the final planning summary described below.
8
8
 
9
- While any user-owned product, scope, UX, compatibility, risk, or acceptance decision remains unresolved, keep the task in planning. First inventory evidence and decision dependencies. If at least two independent material decisions remain and `pennix-decision-gates` is available, delegate one bounded batch of up to three frontier questions; otherwise ask the single highest-value question. Do not edit product code, dispatch implementation, or run `task.py start` until the decision chain is sealed.
9
+ While any user-owned product, scope, UX, compatibility, risk, or acceptance decision remains unresolved, keep the task in planning. First inventory evidence and decision dependencies. If at least two independent material decisions remain and `pennix-decision-grill` is available, delegate one bounded batch of up to three frontier questions; otherwise ask the single highest-value question. Do not edit product code, dispatch implementation, or run `task.py start` until the decision chain is sealed.
10
10
 
11
11
  ## Analysis-Only Exception
12
12
 
@@ -30,6 +30,15 @@ Repository evidence establishes current behavior and technical constraints. The
30
30
 
31
31
  When research, audit, review, or investigation is too large to leave one independently useful conclusion in the current bounded session, split it into evidence units. Each unit must have one question or scope, a minimal evidence range, a destination artifact, and a stop condition; write its facts, conclusion or blocker, unknowns, and recovery point before starting another unit. Size units so one normal context window can finish and persist one useful result; do not promise an exact token or time limit. Routine navigation and transient tool output do not need an artifact. Create a child task only when the unit has an independent owner, lifecycle, and acceptance contract.
32
32
 
33
+ Persist the unit-to-point mapping in this task's existing plan/matrix before
34
+ dispatch. Include workload rationale, dependencies, minimal evidence, shared
35
+ context, and per-point delivery. Combine points only when each is quick/simple
36
+ and they are obviously related; explain the grouping and bounded total workload.
37
+ Complex or lengthy points need separate units or further splitting. Slots and
38
+ owner domains do not determine unit count. Explicit independent subnodes use
39
+ `trellis-channel`'s unit-plan and multi-target procedure; planning itself does
40
+ not authorize dispatch.
41
+
33
42
  ---
34
43
 
35
44
  Use this skill during Phase 1 planning to turn the user's request into clear requirements and planning artifacts.
@@ -60,12 +69,16 @@ Use a concise title from the user's request. Both the title and `--description`
60
69
  - product intent still needed from the user
61
70
  - scope or risk decisions still needed from the user
62
71
  - likely out-of-scope items
63
- 4. If user-owned decisions remain, calculate the independent frontier. Use `pennix-decision-gates` for a bounded batch when two or more independent material decisions are ready; otherwise ask the single highest-value question. Include recommendation and trade-off. Yield only while the answer is unavailable.
72
+ 4. If user-owned decisions remain, calculate the independent frontier. Use `pennix-decision-grill` for a bounded batch when two or more independent material decisions are ready; otherwise ask the single highest-value question. Include recommendation and trade-off. Yield only while the answer is unavailable.
64
73
  5. When the host returns the current continuation's answer, immediately persist it in `prd.md` or the decision artifact, recheck evidence and conflicts, recalculate the frontier, and continue the same planning loop. Do not create a second Trellis lifecycle for the same decision chain. Stop only for a new unresolved frontier, a real capability or authority block, or a final sealed summary awaiting implementation approval.
65
74
  6. When no user-owned decision remains, create or update `design.md` and `implement.md` for complex tasks.
66
75
  7. Run the requirement convergence gate, then the PRD convergence pass. Finish with one Planning Seal closure pass.
67
76
  8. Present the final planning summary and stop. Do not run `task.py start` or edit product code in the same turn.
68
- 9. Only a subsequent user message that explicitly approves the latest planning summary authorizes `task.py start` and implementation. If implementation reveals a material unresolved decision, record `decision-needed`, run `task.py replan <task> "<reason>"`, and return through this planning flow; do not open a popup during implementation.
77
+ 9. For planned/change-bearing tasks, classify `execution_class=planned` and `delivery_mode=change_bearing` in native task meta, then run `task.py plan seal <task>` after closure. Only a subsequent user message explicitly approving this task's current material plan authorizes `task.py plan approve <task> --revision <n> --basis "<short non-sensitive actual approval basis>"`, followed by `task.py start` and implementation. Initial delivery requests, parent-task approval, and design answers are insufficient. If scope, owner, risk, public behavior, or acceptance materially changes, run `task.py replan <task> "<reason>"`; it invalidates seal/approval. Return through planning, seal the new revision, present it, and obtain later approval. Minor wording, formatting, and progress records do not require resealing. The native record enforces structure, not authenticity of chat approval.
78
+
79
+ When changing the active task only for planning, use native `task.py select`,
80
+ not start. `create --no-start` intentionally preserves the old pointer. Follow
81
+ the Channel drain procedure before switching with live evidence workers.
69
82
 
70
83
  Do not invent a project-specific product/spec hierarchy. If the repository already has product, domain, or spec docs, use them. If it does not, proceed with the evidence that exists.
71
84
 
@@ -10,7 +10,7 @@ A request to build, implement, fix, refactor, or "go ahead" is not approval to l
10
10
 
11
11
  For every non-trivial task, the user must respond at least once after the initial request before implementation begins. If no clarification is needed, that response must approve the final planning summary described below.
12
12
 
13
- While any user-owned product, scope, UX, compatibility, risk, or acceptance decision remains unresolved, keep the task in planning. First inventory evidence and decision dependencies. If at least two independent material decisions remain and `pennix-decision-gates` is available, delegate one bounded batch of up to three frontier questions; otherwise ask the single highest-value question. Do not edit product code, dispatch implementation, or run `task.py start` until the decision chain is sealed.
13
+ While any user-owned product, scope, UX, compatibility, risk, or acceptance decision remains unresolved, keep the task in planning. First inventory evidence and decision dependencies. If at least two independent material decisions remain and `pennix-decision-grill` is available, delegate one bounded batch of up to three frontier questions; otherwise ask the single highest-value question. Do not edit product code, dispatch implementation, or run `task.py start` until the decision chain is sealed.
14
14
 
15
15
  ## Analysis-Only Exception
16
16
 
@@ -60,7 +60,7 @@ Use a concise title from the user's request. Both the title and `--description`
60
60
  - product intent still needed from the user
61
61
  - scope or risk decisions still needed from the user
62
62
  - likely out-of-scope items
63
- 4. If user-owned decisions remain, calculate the independent frontier. Use `pennix-decision-gates` for a bounded batch when two or more independent material decisions are ready; otherwise ask the single highest-value question. Include recommendation and trade-off. Yield only while the answer is unavailable.
63
+ 4. If user-owned decisions remain, calculate the independent frontier. Use `pennix-decision-grill` for a bounded batch when two or more independent material decisions are ready; otherwise ask the single highest-value question. Include recommendation and trade-off. Yield only while the answer is unavailable.
64
64
  5. When the host returns the current continuation's answer, persist it in `prd.md` or the decision artifact, recheck evidence and conflicts, recalculate the frontier, and continue the same planning loop. Stop only for a new unresolved frontier, a real capability or authority block, or a final sealed summary awaiting implementation approval.
65
65
  6. When no user-owned decision remains, create or update `design.md` and `implement.md` for complex tasks.
66
66
  7. Run the requirement convergence gate, then the PRD convergence pass. Finish with one Planning Seal closure pass.
@@ -74,7 +74,7 @@ from typing import Optional
74
74
  # get the full SessionStart overview; this short reminder points the main session
75
75
  # at the start skill once and leaves the per-turn state block compact.
76
76
  CODEX_NO_TASK_BOOTSTRAP_NOTICE = """<trellis-bootstrap>
77
- If you have not already loaded Trellis context this session, read the `trellis-start` skill once.
77
+ If Trellis project context is missing, read the `trellis-start` skill once. Current context or a sufficient compaction summary counts as loaded; an ordinary continue resumes its pending action without restarting.
78
78
  </trellis-bootstrap>"""
79
79
 
80
80
 
@@ -363,7 +363,8 @@ def _codex_mode_banner(config: dict) -> str:
363
363
  else:
364
364
  meaning = (
365
365
  "inline: the main session implements/checks directly; "
366
- "do not dispatch implement/check sub-agents."
366
+ "do not dispatch implement/check sub-agents. Explicit Channel independent-evidence "
367
+ "subnodes follow the selected project workflow and remain available in inline mode."
367
368
  )
368
369
  return f"<codex-mode>{meaning}</codex-mode>"
369
370
 
@@ -36,6 +36,7 @@ export declare const commonTasks: string;
36
36
  export declare const commonTaskContext: string;
37
37
  export declare const commonContextProjection: string;
38
38
  export declare const commonTaskStore: string;
39
+ export declare const commonTaskPlanning: string;
39
40
  export declare const commonSessionContext: string;
40
41
  export declare const commonContinuationRecord: string;
41
42
  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,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,CA6CnD;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,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"}