<feed xmlns='http://www.w3.org/2005/Atom'>
<title>soryu/makima/src/server/state.rs, branch strict-orchestration</title>
<subtitle>soryu-co/soryu mirror</subtitle>
<id>http://src.eirin.xyz/soryu/atom?h=strict-orchestration</id>
<link rel='self' href='http://src.eirin.xyz/soryu/atom?h=strict-orchestration'/>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/'/>
<updated>2026-05-02T14:26:39+00:00</updated>
<entry>
<title>build(server): split Dockerfiles, make ML model paths optional (#120)</title>
<updated>2026-05-02T14:26:39+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-05-02T14:26:39+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=70a83104292c4e1fe5f43dd5f50e5214928c8dd6'/>
<id>urn:sha1:70a83104292c4e1fe5f43dd5f50e5214928c8dd6</id>
<content type='text'>
Existing Dockerfile (with LLM/STT/TTS model download) is now `Dockerfile.full`.
The new top-level `Dockerfile` builds a slim image without python, without
huggingface_hub, without the model download step. The slim image is the new
default for users who only want the orchestration surface — the directive
folder UI, the mesh/task system, the API.

## Slim Dockerfile
* No python / huggingface_hub / model downloads.
* Same runtime tooling as `k8s/daemon/Dockerfile` (git, gh CLI, ssh, jq,
  curl, ca-certs, libssl3).
* Embeds the daemon binary at /app/daemon-binaries/makima-linux-x86_64
  for the in-server download endpoint.
* PARAKEET_MODEL_DIR / SORTFORMER_MODEL_PATH / CHATTERBOX_MODEL_DIR are
  intentionally NOT set — Listen and Speak return "ML models not
  configured" if a client tries to use them.

## ML model paths now optional
`ServerArgs.parakeet_model_dir`, `parakeet_eou_dir`, `sortformer_model_path`,
`chatterbox_model_dir` are now `Option&lt;String&gt;` (no defaults). The bin
constructor inspects them: if all four are present, configures
`AppState::new`; if all four are absent, uses the new
`AppState::new_slim()` which leaves `model_config = None`. The lazy load
path in `get_ml_models` already returned a clean error for None.

Speak (TTS) was already optional via `model_config.as_ref()` — still works.

Mixed configurations log a warning and degrade to slim mode.

## Ops note
The old `Dockerfile.full` retains the original behaviour for anyone who
needs STT/diarization/TTS in production. CI still builds the daemon image
from `k8s/daemon/Dockerfile` (untouched).

Co-authored-by: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;</content>
</entry>
<entry>
<title>fix(directive): cancel orphaned planner and kick reconciler on goal update (#104)</title>
<updated>2026-04-30T09:43:31+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-04-30T09:43:31+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=c3e97bbcc32bd18d9344dd44cc54dfcdce32100b'/>
<id>urn:sha1:c3e97bbcc32bd18d9344dd44cc54dfcdce32100b</id>
<content type='text'>
Resolves the user-visible bug where editing a directive's goal mid-flight
shows "saved" but does not actually replan: the running planner kept emitting
add-step calls based on the OLD goal while a fresh planner was supposed to
take over, and the user had to wait up to 15s for the next reconciler tick
before any replanning even started.

## What was happening

PUT /api/v1/directives/{id}/goal already had two paths:
  - Small change + planner running → SendMessage interrupt + KEEP orchestrator.
  - Everything else → clear orchestrator_task_id and let phase_replanning
    spawn a new planner on the next 15s tick.

The "everything else" path cleared the directive's pointer to the planner
task but never cancelled the task itself. The task kept executing and could
race the new planner by adding more steps from the stale plan. Worse, those
new steps could push MAX(steps.created_at) past the just-bumped
goal_updated_at, suppressing phase_replanning entirely.

## Fix

1. New helper `try_cancel_running_planner()` (orchestration/directive.rs):
   sends `InterruptTask { graceful: true }` to the daemon owning the
   orchestrator task and marks the task `interrupted` in the DB. All errors
   are logged and swallowed so the goal update still completes.

2. update_goal handler calls the helper whenever it is about to take the
   "clear orchestrator_task_id" branch, so the orphaned planner stops
   producing stale-plan steps before its DB linkage is cut.

3. New `AppState::directive_kick` (tokio::sync::Notify) lets the handler
   signal the reconciler to run a tick immediately. The reconciler loop in
   server/mod.rs now selects between its 15s interval and the notify, so the
   user no longer waits up to 15s after editing a goal before replanning
   actually starts. update_goal calls `kick_directive_reconciler()` after
   the goal is persisted (both paths).

## Why not also loosen `get_directives_needing_replanning`

The query already covers the common cases once the orphan-cancel lands —
without a still-running orphan adding fresh steps, goal_updated_at reliably
exceeds MAX(steps.created_at) after a goal edit. Loosening the predicate
risked spurious replans for directives that legitimately have no steps yet
(those are handled by `phase_planning`).

Co-authored-by: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;</content>
</entry>
<entry>
<title>feat: soryu-co/soryu - makima: Fix build errors in daemon protocol and task manager (#89)</title>
<updated>2026-03-10T17:33:23+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-03-10T17:33:23+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=3679ceb3325033faa2f889ef3dfee5668ef7aeea'/>
<id>urn:sha1:3679ceb3325033faa2f889ef3dfee5668ef7aeea</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: worktree diff/commit endpoints and frontend diff viewing (#88)</title>
<updated>2026-03-09T17:20:52+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-03-09T17:20:52+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=f49aaa39a32661b54c109ba002d24cbdf73f4ea3'/>
<id>urn:sha1:f49aaa39a32661b54c109ba002d24cbdf73f4ea3</id>
<content type='text'>
* feat: soryu-co/soryu - makima: Fix worktree info failing when origin ref is missing

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* feat: soryu-co/soryu - makima: Add worktree commit endpoint and diff endpoint for regular users

* feat: soryu-co/soryu - makima: Add frontend diff viewing with clickable worktree files</content>
</entry>
<entry>
<title>feat: move daemon reauth to daemons page, add contract-backed directive steps, rename Mesh to Exec (#84)</title>
<updated>2026-03-02T15:18:31+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-03-02T15:18:31+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=78cb861412850889424ae7d5ae5cd952a2b90295'/>
<id>urn:sha1:78cb861412850889424ae7d5ae5cd952a2b90295</id>
<content type='text'>
* feat: soryu-co/soryu - makima: Rename Mesh to Exec in navigation

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* feat: soryu-co/soryu - makima: Add contract-backed steps to directive flow

* WIP: heartbeat checkpoint</content>
</entry>
<entry>
<title>feat: non-blocking reconcile polling, directive CLI orders &amp; cleanup (#82)</title>
<updated>2026-02-24T23:37:44+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-02-24T23:37:44+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=5d1fbed2733e93cc2be2e1a89ca022d88bef613f'/>
<id>urn:sha1:5d1fbed2733e93cc2be2e1a89ca022d88bef613f</id>
<content type='text'>
* feat: soryu-co/soryu - makima: Remove aarch64-unknown-linux-gnu from release workflow

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* feat: soryu-co/soryu - makima: Implement non-blocking ask with client-side polling for reconcile mode</content>
</entry>
<entry>
<title>Makima system improvements: Orders, directive questions, PR creation fix, bug fixes (#62)</title>
<updated>2026-02-14T21:29:26+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-02-14T21:29:26+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=9aadbc7958d39d181c0dd0600e2b7c30bb6c391a'/>
<id>urn:sha1:9aadbc7958d39d181c0dd0600e2b7c30bb6c391a</id>
<content type='text'>
* feat: soryu-co/soryu - makima: Fix directive goal update bug - stale closure issue

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* feat: soryu-co/soryu - makima: Create Orders database schema and backend API

* feat: soryu-co/soryu - makima: Fix task Claude instance not receiving user inputs from input box

* WIP: heartbeat checkpoint

* feat: soryu-co/soryu - makima: Build Orders frontend page replacing the Board page

* WIP: heartbeat checkpoint

* WIP: heartbeat checkpoint

* feat: soryu-co/soryu - makima: Fix directive PR creation system</content>
</entry>
<entry>
<title>Set directive env vars correctly for daemon</title>
<updated>2026-02-09T15:55:01+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-02-09T15:55:01+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=339c1769379a851c4126021132573bd4b7994cf2'/>
<id>urn:sha1:339c1769379a851c4126021132573bd4b7994cf2</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Release in makima repo</title>
<updated>2026-02-02T22:52:05+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-02-02T22:52:05+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=0f06a7f9968816e5e2553c4f1c2104f2fa504f96'/>
<id>urn:sha1:0f06a7f9968816e5e2553c4f1c2104f2fa504f96</id>
<content type='text'>
Also remove all other TTS models
</content>
</entry>
<entry>
<title>Use chatterbox TTS</title>
<updated>2026-02-01T03:04:36+00:00</updated>
<author>
<name>soryu</name>
<email>soryu@soryu.co</email>
</author>
<published>2026-02-01T03:04:36+00:00</published>
<link rel='alternate' type='text/html' href='http://src.eirin.xyz/soryu/commit/?id=a2c147ddd59f55a07b5be0c8970169726b55c876'/>
<id>urn:sha1:a2c147ddd59f55a07b5be0c8970169726b55c876</id>
<content type='text'>
</content>
</entry>
</feed>
