Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .seeds/issues.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -628,9 +628,9 @@
{"id":"warren-e810","title":"Render terminal-failed banner in ConversationDetail","status":"closed","type":"task","priority":1,"plan_step_index":2,"description":"<!-- seeds:plan-backref:start -->\nStep 3 of plan pl-de53.\n\nParent seed: warren-203d — Leveret UI: surface anchoring-run failure on the conversation surface\nPlan template: bug\nPlan approach: UI-only fix, no wire/API changes. (1) Teach Chat to accept the already-fetched persisted transcript and render it merged with the live stream, so messages show regardless of run state. (2) In ConversationDetail, feed…\n\nRun `sd plan show pl-de53` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-07T12:04:30.130Z","updatedAt":"2026-06-07T12:25:32.861Z","labels":["bugwatch"],"plan_id":"pl-de53","blocks":["warren-0db3","warren-203d"],"extensions":{"role":"pi","lastRunId":"run_5gn4g2bcm1sz","lastRunAt":"2026-06-07T12:18:48.853Z"},"closedAt":"2026-06-07T12:25:32.861Z"}
{"id":"warren-0732","title":"Add Chat regression test for transcript render with empty stream","status":"closed","type":"task","priority":2,"plan_step_index":3,"description":"<!-- seeds:plan-backref:start -->\nStep 4 of plan pl-de53.\n\nParent seed: warren-203d — Leveret UI: surface anchoring-run failure on the conversation surface\nPlan template: bug\nPlan approach: UI-only fix, no wire/API changes. (1) Teach Chat to accept the already-fetched persisted transcript and render it merged with the live stream, so messages show regardless of run state. (2) In ConversationDetail, feed…\n\nRun `sd plan show pl-de53` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-07T12:04:30.130Z","updatedAt":"2026-06-07T12:35:56.802Z","labels":["bugwatch"],"plan_id":"pl-de53","blocks":["warren-0db3","warren-203d"],"closedAt":"2026-06-07T12:35:56.802Z"}
{"id":"warren-0db3","title":"Release: run /release per .claude/commands/release.md","status":"closed","type":"task","priority":2,"plan_step_index":4,"description":"<!-- seeds:plan-backref:start -->\nStep 5 of plan pl-de53.\n\nParent seed: warren-203d — Leveret UI: surface anchoring-run failure on the conversation surface\nPlan template: bug\nPlan approach: UI-only fix, no wire/API changes. (1) Teach Chat to accept the already-fetched persisted transcript and render it merged with the live stream, so messages show regardless of run state. (2) In ConversationDetail, feed…\n\nRun `sd plan show pl-de53` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-07T12:04:30.130Z","updatedAt":"2026-06-07T12:43:15.515Z","labels":["bugwatch"],"plan_id":"pl-de53","blocks":["warren-203d"],"closedAt":"2026-06-07T12:43:15.515Z"}
{"id":"warren-a056","title":"nightwatch patrol: 2026-06-09","status":"open","type":"task","priority":3,"createdAt":"2026-06-09T09:07:21.686Z","updatedAt":"2026-06-09T09:24:12.449Z","labels":["patrol","nightwatch"],"plan_id":"pl-7580","blockedBy":["warren-9d72","warren-f48a"]}
{"id":"warren-a056","title":"nightwatch patrol: 2026-06-09","status":"open","type":"task","priority":3,"createdAt":"2026-06-09T09:07:21.686Z","updatedAt":"2026-06-09T09:31:01.193Z","labels":["patrol","nightwatch"],"plan_id":"pl-7580","blockedBy":["warren-f48a"]}
{"id":"warren-43e6","title":"Repoint stale src/preview/launch.ts and src/preview/proxy.ts comment references after the launch/ + proxy/ splits","status":"closed","type":"task","priority":3,"plan_step_index":0,"description":"<!-- seeds:plan-backref:start -->\nStep 1 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:15:37.125Z","labels":["nightwatch"],"plan_id":"pl-7580","blocks":["warren-f48a","warren-a056"],"closedAt":"2026-06-09T09:15:37.125Z"}
{"id":"warren-bfe2","title":"Repoint stale src/runs/reap.ts comment references after the reap/ split","status":"closed","type":"task","priority":3,"plan_step_index":1,"description":"<!-- seeds:plan-backref:start -->\nStep 2 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:20:04.011Z","labels":["nightwatch"],"plan_id":"pl-7580","blocks":["warren-f48a","warren-a056"],"extensions":{"role":"pi","lastRunId":"run_jse1pepa24x7","lastRunAt":"2026-06-09T09:17:00.450Z"},"closedAt":"2026-06-09T09:20:04.011Z"}
{"id":"warren-9358","title":"Fix src/runs/burrow_config.ts -> src/runs/burrow-config.ts filename in planner.ts comment","status":"closed","type":"task","priority":3,"plan_step_index":2,"description":"<!-- seeds:plan-backref:start -->\nStep 3 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:24:12.449Z","labels":["nightwatch"],"plan_id":"pl-7580","blocks":["warren-f48a","warren-a056"],"closedAt":"2026-06-09T09:24:12.449Z"}
{"id":"warren-9d72","title":"Update comments referencing the retired brainstorm/interactive flow","status":"open","type":"task","priority":3,"plan_step_index":3,"description":"<!-- seeds:plan-backref:start -->\nStep 4 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:08:52.347Z","labels":["nightwatch"],"plan_id":"pl-7580","blocks":["warren-f48a","warren-a056"]}
{"id":"warren-f48a","title":"Release: run /release per .claude/commands/release.md","status":"open","type":"task","priority":3,"plan_step_index":4,"description":"<!-- seeds:plan-backref:start -->\nStep 5 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:24:12.449Z","labels":["nightwatch"],"plan_id":"pl-7580","blockedBy":["warren-9d72"],"blocks":["warren-a056"]}
{"id":"warren-9d72","title":"Update comments referencing the retired brainstorm/interactive flow","status":"closed","type":"task","priority":3,"plan_step_index":3,"description":"<!-- seeds:plan-backref:start -->\nStep 4 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:31:01.193Z","labels":["nightwatch"],"plan_id":"pl-7580","blocks":["warren-f48a","warren-a056"],"extensions":{"role":"pi","lastRunId":"run_2cwz2pp100m2","lastRunAt":"2026-06-09T09:25:40.442Z"},"closedAt":"2026-06-09T09:31:01.193Z"}
{"id":"warren-f48a","title":"Release: run /release per .claude/commands/release.md","status":"open","type":"task","priority":3,"plan_step_index":4,"description":"<!-- seeds:plan-backref:start -->\nStep 5 of plan pl-7580.\n\nParent seed: warren-a056 — nightwatch patrol: 2026-06-09\nPlan template: refactor\nPlan approach: Each step is an independent, comment-only fix touching a small set of files; there are no real dependencies between the four fix steps, so they can land in any order as separate PRs. The final Release step is ordered last and blocked by…\n\nRun `sd plan show pl-7580` for the full plan (context, alternatives, sibling steps, acceptance criteria).\n<!-- seeds:plan-backref:end -->","createdAt":"2026-06-09T09:08:52.347Z","updatedAt":"2026-06-09T09:31:01.193Z","labels":["nightwatch"],"plan_id":"pl-7580","blocks":["warren-a056"]}
4 changes: 2 additions & 2 deletions src/db/repos/runs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,8 @@ export class RunsRepo {
/**
* Every run row bound to a given `plotId`, ordered by id (stable for
* tests). Powers `POST /plots/:id/formalize` (warren-d22e / pl-0344
* step 8) which needs to enumerate every interactive turn of a
* brainstorm conversation to extract suggested intent — the caller
* step 8) which needs to enumerate every turn of a Plot's
* intent-shaping conversation to extract suggested intent — the caller
* re-sorts the underlying events by `ts` so dispatch-order surprises
* don't affect the summary. The `runs_plot_id` index (sqlite +
* postgres) covers the predicate.
Expand Down
16 changes: 8 additions & 8 deletions src/plots/formalize.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
/**
* `PlotFormalizer` — Plot brainstorm-summarize seam for
* `PlotFormalizer` — Plot conversation-summarize seam for
* `POST /plots/:id/formalize` (warren-d22e / pl-0344 step 8).
*
* Formalize converts a brainstorm-style interactive conversation into a
* Formalize converts a Plot's intent-shaping conversation into a
* **suggested** Plot intent — a `{goal, non_goals, constraints,
* success_criteria}` shape the user reviews, edits, and applies via the
* existing `POST /plots/:id/intent` route. The status transition to
* `ready` rides on the existing `POST /plots/:id/status` route. This
* handler is therefore non-mutating: it reads warren's events table for
* every interactive run bound to the Plot, extracts the agent's
* every run bound to the Plot, extracts the agent's
* marker-formatted intent claims, and returns a JSON suggestion. The
* Plot itself is untouched, no Plot event is emitted, no run is
* spawned.
*
* Why deterministic extraction, not a dispatched summarize-turn:
*
* 1. Interactive runs are async (respawn-per-turn, reply lands at reap
* via `agent_message` capture — see `src/runs/interactive.ts`). A
* 1. Conversation turns are async (the reply lands at reap via
* `agent_message` capture — see `src/runs/conversation-rewake.ts`). A
* synchronous HTTP response that includes an agent-generated summary
* would either block on a fresh dispatch or return a half-shape.
* 2. The brainstorm agent (`src/registry/builtins/brainstorm.ts`) is
* 2. The intent-shaping agent is
* already instructed to name intent fields explicitly via
* `**goal**: ...` / `**non_goals**: -` / etc. markers. The contract
* is in the system prompt; the parser anchors it.
Expand All @@ -31,7 +31,7 @@
* Extraction rules:
*
* - The seam scans every `agent_message` event across the Plot's
* interactive runs, in `ts` ascending order. Later messages override
* conversation runs, in `ts` ascending order. Later messages override
* earlier ones for the singular `goal` field; list fields
* (`non_goals`, `constraints`, `success_criteria`) accumulate
* deduplicated.
Expand Down Expand Up @@ -84,7 +84,7 @@ export interface DefaultPlotFormalizerDeps {

/**
* Production `PlotFormalizer`. Reads every `agent_message` event on
* interactive runs bound to the Plot and folds them through
* conversation runs bound to the Plot and folds them through
* `extractSuggestedIntent`. The Plot itself is untouched; the caller
* (handler) is responsible for validating that the Plot exists.
*/
Expand Down
4 changes: 2 additions & 2 deletions src/plots/needs-attention.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
* - **stale_draft**: Plot status is `drafting` and `last_event_ts`
* is older than `staleDraftAfterDays` (default 7). Pinned to
* `last_event_ts` (not `updated_at`) so an idle conversation in a
* brainstorm Plot — where every chat turn appends a `note` /
* interactive message event — keeps the draft fresh.
* drafting Plot — where every chat turn appends a `note` /
* conversation message event — keeps the draft fresh.
*
* The pure helper is exported separately from the aggregator so the
* unit tests in `./aggregate.test.ts` can exercise it without mocking
Expand Down
6 changes: 3 additions & 3 deletions src/runs/conversation-rewake.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@
* `conversation.rewake_replayed` system event on the new run carrying the
* prior run id + replayed message count.
*
* Mirrors the seam discipline of `conversation-idle.ts` and the spawn-forward
* discipline of `interactive.ts`: the reader / rotator are seams (production
* Mirrors the seam discipline of `conversation-idle.ts`: the reader / rotator
* are seams (production
* queries the warren-0b91 `conversations` + `messages` tables; the unit suite
* hands back literals) so this module needs neither disk nor those tables to
* be exercised, and the live HTTP wiring (warren-af15) slots the repo-backed
Expand Down Expand Up @@ -323,6 +323,6 @@ async function appendRewakeEvent(
});
} catch {
// Logging-only trail; a failure here must not unwind a successful
// re-wake. Mirrors recordPlotContextLoadFailure in interactive.ts.
// re-wake. Best-effort logging trail only.
}
}
4 changes: 2 additions & 2 deletions src/server/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,8 @@ export interface ServerDeps {
* Server-side Plot formalize seam (warren-d22e / pl-0344 step 8).
* Used by `POST /plots/:id/formalize` to extract a suggested intent
* (`{goal, non_goals, constraints, success_criteria}`) from the
* brainstorm conversation — every `agent_message` event across
* interactive runs bound to the Plot is parsed for field markers and
* intent-shaping conversation — every `agent_message` event across
* conversation runs bound to the Plot is parsed for field markers and
* folded into a single suggestion. The Plot is NOT mutated; the user
* accepts/edits via the existing `POST /plots/:id/intent` route.
* `bootServer` always wires the default; tests substitute a stub.
Expand Down
18 changes: 9 additions & 9 deletions src/ui/src/pages/plot-detail/interactive-panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ import { ReadOnlyField } from "./run-plan.tsx";
/**
* InteractivePanel (warren-444c / pl-0344 step 11) — renders Start
* brainstorming / Run planner / Formalize over an inline Chat anchored
* to the latest interactive run on the Plot. The agent's reply streams
* back into the transcript via reap-side `agent_message` capture
* (warren-509f, src/runs/reap/interactive.ts).
* to the latest conversation run on the Plot. The agent's reply streams
* back into the transcript via the Plot's conversation flow (the
* respawn-per-turn interactive primitive was retired with
* mode=interactive — warren-d622 / LEVERET.md §0.8).
*/

/* ----------------------------------------------------------------------- */
Expand Down Expand Up @@ -58,12 +59,11 @@ interface InteractiveAnchor {
/**
* Walk the Plot's event_log in reverse and return the most recent
* `run_dispatched` event whose `data.agent` is in the interactive set.
* `null` when no interactive run has ever been dispatched against this
* Plot. Each interactive turn is its own run row (respawn-per-turn,
* src/runs/interactive.ts) but `Chat`'s `onTurnSpawned` re-anchor only
* fires from inside the component — the activity feed sees every spawn
* as a fresh `run_dispatched`, so picking the latest tracks the live
* conversation handle.
* `null` when no such run has ever been dispatched against this
* Plot. Each turn is its own run row but `Chat`'s `onTurnSpawned`
* re-anchor only fires from inside the component — the activity feed
* sees every spawn as a fresh `run_dispatched`, so picking the latest
* tracks the live conversation handle.
*/
function findLatestInteractiveRun(
events: readonly PlotEvent[],
Expand Down
Loading