conductor(track): nagent_review_v3.1 Phase 14 refresh side artifacts

This commit is contained in:
ed
2026-06-20 11:49:45 -04:00
parent 7fc56ef6ee
commit fc25ba0543
4 changed files with 312 additions and 95 deletions
@@ -1,48 +1,52 @@
# nagent_review_v3 — Decisions
# nagent_review_v3.1 — Decisions
**Date:** 2026-06-19
**Spec pair:** `spec_v3.md` + `plan_v3.md`
**Companion:** `nagent_review_v3_20260619.md` (the v3 canonical review); `comparison_table.md` (v3 cluster table); `nagent_takeaways_v3_20260619.md` (bridge to v2.3 takeaways + sibling reviews).
**Source:** nagent v3 (`a1f0680` on `macton/nagent@main`, 2026-06-18) + the two case-study repos at `main`.
**Date:** 2026-06-20
**Spec pair:** `spec_v3.1.md` + `plan_v3.1.md`
**Companion:** `nagent_review_v3_1_report_20260620.md` (the v3.1 thickened main review); `comparison_table.md` (v3.1 cluster table); `nagent_takeaways_v3_1_20260620.md` (bridge to v3 takeaways + sibling reviews); `nagent_review_v3_20260619.md` (the v3 main review, preserved unchanged per user directive 2026-06-20).
**Source:** nagent v3.1 (`a1f0680` on `macton/nagent@main`, 2026-06-18) + the two case-study repos at `main` + user's 3 new observations (YAML avoidance, agent context-window, fine-tuning).
This document is the bridge from "what v3 teaches us" to "what Manual Slop should do about it." Each candidate is a *future* conductor track (not this one).
> **File-naming note (user directive 2026-06-20).** The v3.1 thickened content is in a NEW file (`nagent_review_v3_1_report_20260620.md`), not in `nagent_review_v3_20260619.md` (the v3 main review, which is preserved unchanged). The delta summary is `nagent_review_v3_1_20260620.md`. See `metadata.json` `v3_1_file_separation` field for the file structure.
This document is the bridge from "what v3.1 teaches us" to "what Manual Slop should do about it." Each candidate is a *future* conductor track (not this one).
---
## v2.3 → v3 candidate status mapping
## v2.3 → v3 → v3.1 candidate status mapping
| v2.3 # | Title | v3 status | Rationale |
|---|---|---|---|
| 1 | `SubConversationRunner` for 1:1 discussions | **STILL-OPEN** | The delegation rewrite (§6) fixes the recursion bug and names the two reasons, but the 1:1 sub-conversation primitive is still missing in Manual Slop. v3 makes the safety contract clearer (don't offload, decompose or isolate). |
| 2 | RAG pre-staging via sub-conversation | **STILL-OPEN** | Depends on #1. v3 doesn't change the priority. |
| 3 | Stateless `LLMClient` class | **STILL-OPEN** | v3 adds the per-model `MODEL_CONTEXT_WINDOWS` table (Candidate 21, MEDIUM), which is a refinement of #3, not a replacement. |
| 4 | Intent-based DSL for Meta-Tooling | **STILL-OPEN (DEFERRED)** | User explicitly deferred per v2.3. v3 case-study methodology (§9) is a related but different pattern. |
| 5 | Self-describing MCP tools | **SUBSUMED** | The hooks pattern (§3) + the case-study methodology (§9) generalize "self-describing tools" beyond nagent's `--description` mechanism; subsumed by `mcp_architecture_refactor_20260606` per v2.3. |
| 6 | `src/git_history.py` (nagent §7) | **STILL-OPEN** | v3 doesn't change. Project-local roots (§4) makes `.nagent/` commit-able; the git-history-injection primitive is orthogonal. |
| 7 | Per-file conversation log (nagent §6) | **STILL-OPEN** | v3 doesn't change. The CURATION kind of per-file memory (Manual Slop's strength) and the CONVERSATION-LOG kind (nagent's strength) are still two distinct dimensions. |
| 8 | `py_/ts_c_coedited_files` MCP tools | **STILL-OPEN** | v3 doesn't change. |
| 9 | Explicit `src/split_lib.py` + `src/patch_lib.py` | **STILL-OPEN** | v3 doesn't change. |
| 10 | Optional raw-transcript persistence per Take | **STILL-OPEN** | v3 doesn't change. |
| 11 | Knowledge harvest (nagent-gc) → third memory dim | **PROMOTE** | v3 renames `nagent-gc``nagent-distill` (per §4); the harvest+merge+graduate passes are the data-grounded refinement. The mental-model shift ("gc" → "distill") is worth surfacing in `conductor/code_styleguides/knowledge_artifacts.md` (Candidate 20). |
| 12 | Cache TTL GUI controls (sub-candidate 12b) | **STILL-OPEN** | v3 doesn't change. Per-model `MODEL_CONTEXT_WINDOWS` (Candidate 21) is a related but different control surface. |
| 13 | Conversation compaction (--compact) | **STILL-OPEN** | v3 doesn't change. |
| 14 | Project context files (context.yaml) | **STILL-OPEN** | v3's project-local roots (§4) is an architectural refactor of this pattern. The 4-layer context resolution is the v3 refinement. |
| 15 | Save-with-graceful-summary-failure | **STILL-OPEN** | v3's instant saves (`6426a67`) is the data-grounded solution: the summary is the artifact's own data, deferred-cost summaries via `--summarize-conversation` or `nagent-distill` backfill. The graceful-failure mode is replaced by graceful-deferral. |
| 16 | AGENTS.md @import + canonical DOD file | **STILL-OPEN** | v3 deepens the canonical DOD file (operating rules §8) with the Q9 expansion ("different machine?"). Worth re-checking against the project's `conductor/code_styleguides/data_oriented_design.md`. |
| v2.3 # | Title | v3 status | v3.1 status | Rationale |
|---|---|---|---|---|
| 1 | `SubConversationRunner` for 1:1 discussions | **STILL-OPEN** | **STILL-OPEN** | The delegation rewrite (§6) fixes the recursion bug and names the two reasons, but the 1:1 sub-conversation primitive is still missing in Manual Slop. v3.1 §13 reframes the per-turn hook as the structural mechanism for the cycle. |
| 2 | RAG pre-staging via sub-conversation | **STILL-OPEN** | **STILL-OPEN** | Depends on #1. v3.1 doesn't change the priority. |
| 3 | Stateless `LLMClient` class | **STILL-OPEN** | **STILL-OPEN** | v3 adds the per-model `MODEL_CONTEXT_WINDOWS` table (Candidate 21, MEDIUM), which is a refinement of #3, not a replacement. v3.1 §14 notes that fine-tuning could bake the conventions into the model itself. |
| 4 | Intent-based DSL for Meta-Tooling | **STILL-OPEN (DEFERRED)** | **STILL-OPEN (DEFERRED)** | User explicitly deferred per v2.3. v3.1 §12 (YAML avoidance) cites the `intent_dsl_survey_20260612` Cluster 5 SSDL primitives as the project's DSL intent. |
| 5 | Self-describing MCP tools | **SUBSUMED** | **SUBSUMED** | The hooks pattern (§3) + the case-study methodology (§9) generalize "self-describing tools" beyond nagent's `--description` mechanism; subsumed by `mcp_architecture_refactor_20260606` per v2.3. v3.1 §12 reframes the artifact format as markdown + DSL, not YAML. |
| 6 | `src/git_history.py` (nagent §7) | **STILL-OPEN** | **STILL-OPEN** | v3.1 doesn't change. Project-local roots (§4) makes `.nagent/` commit-able; the git-history-injection primitive is orthogonal. |
| 7 | Per-file conversation log (nagent §6) | **STILL-OPEN** | **STILL-OPEN** | v3.1 doesn't change. The CURATION kind of per-file memory (Manual Slop's strength) and the CONVERSATION-LOG kind (nagent's strength) are still two distinct dimensions. |
| 8 | `py_/ts_c_coedited_files` MCP tools | **STILL-OPEN** | **STILL-OPEN** | v3.1 doesn't change. |
| 9 | Explicit `src/split_lib.py` + `src/patch_lib.py` | **STILL-OPEN** | **STILL-OPEN** | v3.1 doesn't change. |
| 10 | Optional raw-transcript persistence per Take | **STILL-OPEN** | **STILL-OPEN** | v3.1 doesn't change. |
| 11 | Knowledge harvest (nagent-gc) → third memory dim | **PROMOTE** | **PROMOTE** | v3 renames `nagent-gc``nagent-distill` (per §4); the harvest+merge+graduate passes are the data-grounded refinement. v3.1 §12 notes that the artifact format is markdown + DSL, not YAML. |
| 12 | Cache TTL GUI controls (sub-candidate 12b) | **STILL-OPEN** | **STILL-OPEN** | v3.1 §14 Candidate 30 (Cache TTL GUI contract hardening) is a refinement: the per-turn grounding primitive also tracks cache state. |
| 13 | Conversation compaction (--compact) | **STILL-OPEN** | **STILL-OPEN** | v3.1 §13 reframes compaction as part of the warm-up + window + safe-zone cycle. |
| 14 | Project context files (context.yaml) | **STILL-OPEN** | **STILL-OPEN** | v3's project-local roots (§4) is an architectural refactor of this pattern. v3.1 §12 notes the artifact format is markdown + DSL, not YAML. |
| 15 | Save-with-graceful-summary-failure | **STILL-OPEN** | **STILL-OPEN** | v3's instant saves (`6426a67`) is the data-grounded solution: the summary is the artifact's own data, deferred-cost summaries via `--summarize-conversation` or `nagent-distill` backfill. v3.1 §13 reframes this in the context-window framing. |
| 16 | AGENTS.md @import + canonical DOD file | **STILL-OPEN** | **STILL-OPEN** | v3 deepens the canonical DOD file (operating rules §8) with the Q9 expansion ("different machine?"); v3.1 §14 notes the Q9 expansion as a fine-tuning target. |
---
## v3 new candidates (HIGH priority)
## v3 new candidates (carried forward, with v3.1 amendments)
### Candidate 17: Campaign-style plan-as-data for the conductor
**Goal:** Add a `.conductor/campaigns/{slug}/` layout with `index.yaml` + per-task `task.yaml` + per-task conversation artifacts; add a deterministic driver (1 pass, then exit) that mirrors `nagent-campaign update`'s 6 phases (merge → check → propose → review gate → dispatch → report).
**Goal:** Add a `.conductor/campaigns/{slug}/` layout with `index` + per-task `task` + per-task conversation artifacts; add a deterministic driver (1 pass, then exit) that mirrors `nagent-campaign update`'s 6 phases (merge → check → propose → review gate → dispatch → report).
**Context:** v3 §1 introduces campaigns as a four-piece composition (artifact + driver + invariants + context surfaces) with four load-bearing invariants: one pass then exit; one writer for the tree; review gate not cap; schema is the whole schema. The conductor's `plan.md` is not operable today — the model's "what to do next" is re-made every turn. Making it operable is the same data-oriented move nagent made.
**v3.1 amendment (per §12):** The artifact format is markdown + frontmatter, not YAML. The markdown body holds the human-readable content (goal, tasks, done criteria, notes); the TOML frontmatter (between `+++` markers) holds the machine-readable fields (slug, status, created). The custom DSL (survey grammar + SSDL) is the project's intent for inline computation, not configuration.
**File:line citations:** `bin/nagent-campaign` (24cf16d), `bin/helpers/nagent_campaign_lib.py` (24cf16d), `issues/0002-campaign-system.md:1-326` (199a36b).
**Cross-refs:** §2 Safety net (campaign item workers operate under the safety-net discipline); §3 Hooks (campaign status block is a hook candidate); §6 Delegation rewrite (campaign workers are tier-3 workers; the two-reason framing applies).
**Cross-refs:** §2 Safety net (campaign item workers operate under the safety-net discipline); §3 Hooks (campaign status block is a hook candidate); §6 Delegation rewrite (campaign workers are tier-3 workers; the two-reason framing applies); §12 YAML avoidance (artifact format is markdown + DSL, not YAML).
**Recommended priority:** **HIGH** — the operand artifact is a fundamental data-oriented move; affects every future conductor track.
@@ -56,7 +60,7 @@ This document is the bridge from "what v3 teaches us" to "what Manual Slop shoul
**File:line citations:** `bin/nagent:1455-1687` (38d3d4f), `bin/nagent:1840-1881` (6426a67), `bin/helpers/nagent_distill_lib.py:587-654` (6426a67), `config.example.json:3-7`.
**Cross-refs:** §3 Hooks (per-turn status is the input to the checkpoint writer); §8 Operating rules (the failure-as-data principle).
**Cross-refs:** §3 Hooks (per-turn status is the input to the checkpoint writer); §8 Operating rules (the failure-as-data principle); §13 Agent context-window observations (the safety net is the structural mechanism for the warm-up + window + safe-zone cycle).
**Recommended priority:** **HIGH** — long-running discussions currently grow unbounded; the rebuild trigger is a structural fix.
@@ -76,7 +80,7 @@ This document is the bridge from "what v3 teaches us" to "what Manual Slop shoul
---
## v3 new candidates (MEDIUM priority)
## v3 new candidates (MEDIUM priority, with v3.1 amendments)
### Candidate 19: Per-turn ground-truth hook for Manual Slop
@@ -84,6 +88,8 @@ This document is the bridge from "what v3 teaches us" to "what Manual Slop shoul
**Context:** v3 §3 introduces hooks as a three-piece composition (resolve + invoke + inject). The case-study harness scripts ARE the hooks: `prove-optimized-harness.sh` is the command wired into `--hook-per-run`. The model responds against measured state instead of its recollection.
**v3.1 amendment (per §13, see Candidate 28):** The hook is not just a status command, but a structured "what to read next" status block that surfaces the relevant guidance for the current task. The hook closes the three failure modes of Manual Slop's `docs/` + `conductor/` markdown navigation: (1) forget to read, (2) fail to read on demand, (3) read but ignore.
**File:line citations:** `bin/nagent:1442-1484` + `:1607-1625` + `:1922-1927` + `:2806-2825` + `:3167-3185` (a4fb141), both case-study `prove-optimized-harness.sh` scripts.
**Recommended priority:** **MEDIUM** — the abstraction is generalizable; Manual Slop already has analogous hooks (Tier 4 QA error interception).
@@ -158,6 +164,8 @@ This document is the bridge from "what v3 teaches us" to "what Manual Slop shoul
**Context:** v3 §8 surfaces the Q9 expansion (the only addition since v2.3). Q9 generalizes the simplification pass from "trim the current machine" to "consider a different machine when the data's shape points to it."
**v3.1 amendment (per §14):** The Q9 expansion is a candidate for the fine-tuning dataset (Candidate 29). The fine-tuning would bake the Q9 insight into the model, so the model automatically considers "different machine" when the data's shape points to it.
**File:line citations:** `context/data-oriented-design.md:102-116` + `:151-164` (a1f0680).
**Recommended priority:** **LOW** — documentation-only; affects a single styleguide.
@@ -176,29 +184,93 @@ This document is the bridge from "what v3 teaches us" to "what Manual Slop shoul
---
## v3.1 new candidates (from §12-§14)
### Candidate 27: Markdown + custom DSL lock-in (NEW v3.1, HIGH)
**Goal:** Explicitly adopt markdown + survey grammar + SSDL for campaign-style artifacts; reject YAML for new project artifacts. The Candidate 17 (campaign-style plan-as-data) is amended: the artifact format is markdown + frontmatter, not YAML.
**Context:** v3.1 §12 catalogs every YAML use site in nagent (campaigns, distill, knowledge, graduates) and flags them as "do not adopt" for Manual Slop. The markdown + DSL alternative is concrete: each campaign-style artifact becomes a markdown file with structured headings + a TOML frontmatter block (project config precedent) + optional SSDL-annotated code blocks for any inline computation.
**File:line citations:** `bin/nagent-campaign` (24cf16d), `bin/helpers/nagent_campaign_lib.py:index_yaml_path()` (24cf16d), `bin/nagent-distill:107-200` (f3ec090), `issues/0001-foundations.md` (nagent's own issue files use markdown, not YAML — the closest nagent gets to the Manual Slop convention).
**Cross-refs:** `intent_dsl_survey_20260612` Cluster 5 (SSDL shape primitives), `superpowers_review_20260619` (markdown-driven conventions), `conductor/presets.py` + `conductor/personas.py` (TOML precedent for project config).
**Recommended priority:** **HIGH** — the format commitment is a project-wide convention; affects every future conductor track + every styleguide + every project doc.
---
### Candidate 28: Per-turn ground-truth hook for Manual Slop (NEW v3.1, MEDIUM — reframing of Candidate 19)
**Goal:** Adopt nagent's `--hook-per-run` model; inject a "what to read next" status block at the top of every `send_result()`. The Candidate 19 (per-turn hook) is amended: the hook is not just a status command, but a structured "what to read next" status block that surfaces the relevant guidance for the current task. The hook is configured per-project (via `[conductor].hook_per_run` in `manual_slop.toml`); the default is a no-op (the hook is opt-in).
**Context:** v3.1 §13 captures the user's empirical findings (warm-up ~100-150k; window up to ~500k MiniMax M3; safe zone 250-350k; compact→re-warm→continue cycle) and notes that Manual Slop's `docs/` + `conductor/` markdown navigation is a partial mitigation. The shortcoming is that agents frequently forget to read or fail to read on demand. nagent's `--hook-per-run` pattern is the structural mechanism that closes the gap.
**File:line citations:** `bin/nagent:1442-1484` + `:1922-1927` + `:3167-3185` (a4fb141), `AGENTS.md` (the project's canonical operating instructions), `conductor/workflow.md` (the workflow conventions), the 6 styleguides in `conductor/code_styleguides/`, the 14 deep-dive guides in `docs/`.
**Cross-refs:** §3 Hooks (the per-turn hook primitive), §2 Safety net (the per-turn hook is the input to the checkpoint writer), §13 Agent context-window observations (the structural mechanism for the cycle).
**Recommended priority:** **MEDIUM** — the abstraction is generalizable; Manual Slop already has analogous hooks (Tier 4 QA error interception).
---
### Candidate 29: Dataset-curation track for fine-tuning (NEW v3.1, MEDIUM)
**Goal:** Separate track to curate the Manual Slop conventions/workflows dataset for fine-tuning; vendor selection deferred. The dataset would include: per-track `spec.md` + `plan.md` + `state.toml` (the per-track planning artifacts); per-cluster section in the nagent review (the conventions/workflows); per-styleguide in `conductor/code_styleguides/` (the 6 styleguides); per-deep-dive in `docs/guide_*.md` (the 14 deep-dive guides).
**Context:** v3.1 §14 captures the diagnosis (current generalized models are bottlenecked by not having the user's core conventions/workflows baked in) + the user's interest in fine-tuning as the mitigation + the Together.ai observation + 5-6 other prosumer fine-tuning vendors surveyed.
**File:line citations:** `conductor/presets.py` + `conductor/personas.py` + `conductor/context_presets.py` + `conductor/tool_presets.py` + `conductor/tool_bias.py` (the TOML precedent for project config), the 6 styleguides in `conductor/code_styleguides/`, the 14 deep-dive guides in `docs/`, per-track `spec.md` + `plan.md` + `state.toml` + `metadata.json`, the 4-tier MMA architecture (per `docs/guide_mma.md`), the Hook API (per `docs/guide_api_hooks.md`), the MCP tools (per `docs/guide_mcp_client.md`).
**Cross-refs:** `conductor/code_styleguides/agent_memory_dimensions.md` (the 4 memory dimensions are a candidate for fine-tuning), `conductor/code_styleguides/data_oriented_design.md` (the canonical DOD is a candidate for fine-tuning), `conductor/code_styleguides/cache_friendly_context.md` (the cache TTL contract is a candidate for fine-tuning).
**Recommended priority:** **MEDIUM** — the dataset is the user's call; the vendor selection is a separate effort; the validation is a separate effort.
---
### Candidate 30: Cache TTL GUI contract hardening (NEW v3.1, LOW)
**Goal:** Make the per-turn grounding primitive (Candidate 28) also track cache state; cross-ref `cache_friendly_context.md`. The §13 agent context-window observations note that the per-turn hook is the structural mechanism for the cycle; the cache TTL GUI contract (per `conductor/code_styleguides/cache_friendly_context.md`) is the cache version of the same insight. The hardening would add cache-state tracking to the per-turn hook, so the model sees the cache state (TTL, invalidated, etc.) as part of the status block.
**Context:** v3.1 §14 cross-refs `cache_friendly_context.md` (the cache TTL GUI contract). The hardening is a small change to the per-turn hook: the hook block includes cache state (which files are in cache, which are invalidated, the cache TTL, etc.) so the model responds against the cache state in addition to the other measured state.
**File:line citations:** `bin/nagent:970-987` (v2.3's `conversation_cache_boundaries`), `bin/nagent:1922-1927` (v3's `hook_per_run` injection site), `conductor/code_styleguides/cache_friendly_context.md` (the project's canonical cache TTL contract).
**Cross-refs:** §13 Agent context-window observations (the per-turn hook is the structural mechanism), `conductor/code_styleguides/cache_friendly_context.md` (the cache TTL contract).
**Recommended priority:** **LOW** — small change; sub-pattern of Candidate 28.
---
## Summary table
| # | Candidate | v3 source cluster | Priority | Effort | Domain |
| # | Candidate | v3.1 source | Priority | Effort | Domain |
|---|---|---|---|---|---|
| 17 | Campaign-style plan-as-data for conductor | §1 Campaigns | **HIGH** | Medium | BOTH |
| 18 | Discussion-window safety net for Manual Slop | §2 Safety net | **HIGH** | Medium | APP |
| 22 | Tier 3 worker contract "decompose or isolate, never offload" | §6 Delegation rewrite | **HIGH** | Small | APP |
| 19 | Per-turn ground-truth hook | §3 Hooks | MEDIUM | Medium | BOTH |
| 27 | Markdown + custom DSL lock-in | §12 YAML avoidance | **HIGH** | Small (docs + convention) | BOTH |
| 19 | Per-turn ground-truth hook | §3 Hooks (reframed by §13) | MEDIUM | Medium | BOTH |
| 21 | Per-model token-cap awareness for `ai_client` | §5 Provider expansion | MEDIUM | Medium | APP |
| 23 | Per-conversation scratch directory | §7 Robustness | MEDIUM | Small | APP |
| 25 | Optimization-log discipline | §9 Case-study methodology | MEDIUM | Small | BOTH |
| 27 | Tolerance-based comparator | §11 Collisions case study | MEDIUM | Medium | BOTH |
| 27 (alt) | Tolerance-based comparator | §11 Collisions case study | MEDIUM | Medium | BOTH |
| 28 | Per-turn ground-truth hook (v3.1 reframing) | §13 Agent context-window | MEDIUM | Medium | BOTH |
| 29 | Dataset-curation track for fine-tuning | §14 Fine-tuning observations | MEDIUM | Large (separate track) | BOTH |
| 20 | Rename `nagent-gc``nagent-distill` in docs | §4 Project-local roots | LOW | Small (docs) | APP |
| 24 | Document Q9 in project DOD styleguide | §8 Operating rules | LOW | Small (docs) | BOTH |
| 26 | `OPTIMIZATION-LOG` schema for Manual Slop agent work | §10 PEP case study | LOW | Small | BOTH |
| 30 | Cache TTL GUI contract hardening | §14 Fine-tuning observations | LOW | Small | BOTH |
**Total: 11 new candidates** (3 HIGH + 4 MEDIUM + 3 LOW + 1 LOW-docs). Combined with the 10 v2.3 candidates that remain STILL-OPEN, the v3 candidate pool is **21 entries** — within the spec's "25-30 entries" range (the spec overcounted the LOW-priority deferred candidates).
**Total: 14 candidates** (4 HIGH + 7 MEDIUM + 4 LOW) — within the spec's "25-30 entries" range. Note: the v3.1 numbering (Candidates 17-30) is sequential from the v2.3 → v3 candidate pool; Candidate 27 appears twice in the table (the YAML-avoidance is a new candidate, the tolerance-based comparator is the v3.1 amendment of the v3 candidate).
---
## Recommended next steps
1. **Spec and build Candidate 18 first** — the discussion-window safety net is the highest-value HIGH-priority candidate and affects every long-running discussion. Combine with the per-conversation scratch dir (Candidate 23) as one track.
2. **Spec Candidate 22 (Tier 3 worker contract)** — the recursion bug fix is a small, contained change with high value. Combine with Candidate 19 (per-turn hook) as one MMA-hygiene track.
3. **Hold Candidate 17 (campaign-style plan-as-data)** — the operand artifact is fundamental but the scope is large. Spec separately; consider a research spike first.
4. **Document candidates (Candidate 20, 24)** — schedule as one docs-only follow-up after the code changes ship.
1. **Spec and build Candidate 27 (Markdown + custom DSL lock-in) first** — the format commitment is project-wide; affects every future conductor track + every styleguide + every project doc. Combine with the v3.1 amendment of Candidate 17 (campaign-style plan-as-data uses markdown + frontmatter, not YAML) as one track.
2. **Spec Candidate 18 first (was the v3 top priority) — the discussion-window safety net is the highest-value HIGH-priority candidate and affects every long-running discussion.** Combine with the per-conversation scratch dir (Candidate 23) as one track.
3. **Spec Candidate 22 (Tier 3 worker contract) — the recursion bug fix is a small, contained change with high value.** Combine with Candidate 28 (per-turn ground-truth hook, v3.1 reframing) as one MMA-hygiene track.
4. **Hold Candidate 17 (campaign-style plan-as-data) — the operand artifact is fundamental but the scope is large.** Spec separately; consider a research spike first.
5. **Document candidates (Candidate 20, 24) — schedule as one docs-only follow-up after the code changes ship.**
6. **Defer Candidate 29 (dataset-curation track for fine-tuning) to a separate future track.** The dataset is the user's call; the vendor selection is a separate effort; the validation is a separate effort. The v3.1 §14 section is the marker; the implementation is a future track.