You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Project Chief: every Project gets its own Chief, created with the Project #1859
Owner decision (2026-10-30): every Project gets its own Chief. It is not the user's main Chief acting part-time for a Project. The user's main Chief stays outside the Project.
Why now
The record has an assistant (the owner's private agent, #1712) but no chief: projects returns project-1fe64499 with no chief field, and the only Chief bound to it is the user's main Chief (session-150027a8, bot.projectId), which is exactly the shape this decision rules out.
Scope
core/src/host/store.js — the Project record gains chief: { botId, sessionId, createdAt }, written by project-create the way assistant is: in its own try/catch, so a Project is never refused because automation is off (the refusal is recorded on the record).
core/src/host/project-chief.js (new, beside project-assistant.js) — create(projectId) spawns one Bot per Project with instructions that name the Project and forbid speaking for any other; chiefOf(projectId) reads it back.
Host seam for the plugin, mirroring rt.projectAssistant: rt.projectChief. A host without the seam logs once and answers undefined; it never throws.
project-read exposes chief; the client's Project team block lists it (see the team-area slice).
Deleting a Project retires its Chief the way project-delete already handles the assistant.
Tests (red first, core/test/projects.test.js)
project-create writes chief.botId and the Bot carries projectId.
A second Project gets a second Chief; neither speaks for the other.
A host without rt.projectChief still creates the Project and records chief: { error }.
project-delete retires the Chief and leaves no bot.projectId.
Acceptance
TZ=UTC npm run verify green from the repo root; node scripts/ds-bot-patches.mjs check green; core/client.js rebuilt from core/src/client. Live check on a throwaway Project: projects answers a chief whose botId is not the main Chief's session.
Tier
T2 (core/src/host/**) — PASS at the tip plus green tests-ok.
Triage: agent-ready. Scope is settled by the owner decision in the body (2026-10-30: every Project gets its own Chief) — no open question, no open PR pointing at this issue.
Change:core/src/host/store.js adds chief: { botId, sessionId, createdAt } to the Project record, written by project-create in its own try/catch so a Project is never refused when automation is off (the refusal is recorded on the record); new core/src/host/project-chief.js beside project-assistant.js with create(projectId) / chiefOf(projectId); host seam rt.projectChief mirroring rt.projectAssistant (absent seam logs once, answers undefined, never throws); project-read exposes chief; the client's Project team block lists it; project-delete retires the Chief like the assistant.
Tests (red first, core/test/projects.test.js): (1) project-create writes chief.botId and the Bot carries projectId; (2) a second Project gets a second Chief, neither speaks for the other; (3) a host without rt.projectChief still creates the Project and records chief: { error }; (4) project-delete retires the Chief and leaves no bot.projectId.
Acceptance:TZ=UTC npm run verify green from the repo root; node scripts/ds-bot-patches.mjs check green; core/client.js rebuilt from core/src/client; live check on a throwaway Project — projects answers a chief whose botId is not the main Chief's session.
Tier T2 (core/src/host/**) — PASS at the tip plus green tests-ok.
Claimed #1859 — branch dev/1859-project-chief. First step: write the four red tests in core/test/projects.test.js against the new project-chief.js seam.
retire: rt.deleteBot?.(botId) in a catch that only warns, then delete the record field — the Project must never fail to delete because automation is off.
project-create already calls projectAssistant.create(project.id) inside its own try/catch and records { error } on the record; the Chief goes in the same place, in its own try/catch, and the Project is still created if spawning refuses.
What the Chief is not
Not the user's main Chief: it must not reuse session-150027a8 or any existing Bot, and it must not be reachable through the main Chief's chat.
Not created on read: project-read and projects only report chief; nothing spawns from a listing.
Not a member binding: it does not go through project-bind alone — the record field chief is the truth, the binding is plumbing (same as assistant).
Naming and instructions: chiefName(project) beside assistantName (Chief (<project name>)), instructions that name the Project and forbid speaking for any other — the Team-mode rule "one Project, one Chief" is the owner decision of 2026-10-30 carried in this issue's first paragraphs.
Acceptance I will run myself once the PR is up: on a throwaway Project, project-read answers chief.botId ≠ the main Chief's session, the Chief Bot's projectId is the Project, and project-delete removes both the record field and bot.projectId.
Activity
Birfy commentedon Oct 30, 2026
Written-by: Triage
Triage:
agent-ready. Scope is settled by the owner decision in the body (2026-10-30: every Project gets its own Chief) — no open question, no open PR pointing at this issue.core/src/host/store.jsaddschief: { botId, sessionId, createdAt }to the Project record, written byproject-createin its own try/catch so a Project is never refused when automation is off (the refusal is recorded on the record); newcore/src/host/project-chief.jsbesideproject-assistant.jswithcreate(projectId)/chiefOf(projectId); host seamrt.projectChiefmirroringrt.projectAssistant(absent seam logs once, answersundefined, never throws);project-readexposeschief; the client's Project team block lists it;project-deleteretires the Chief like the assistant.core/test/projects.test.js): (1)project-createwriteschief.botIdand the Bot carriesprojectId; (2) a second Project gets a second Chief, neither speaks for the other; (3) a host withoutrt.projectChiefstill creates the Project and recordschief: { error }; (4)project-deleteretires the Chief and leaves nobot.projectId.TZ=UTC npm run verifygreen from the repo root;node scripts/ds-bot-patches.mjs checkgreen;core/client.jsrebuilt fromcore/src/client; live check on a throwaway Project —projectsanswers achiefwhosebotIdis not the main Chief's session.Tier T2 (
core/src/host/**) — PASS at the tip plus greentests-ok.Birfy commentedon Oct 30, 2026
Written-by: Dev
Claimed #1859 — branch
dev/1859-project-chief. First step: write the four red tests incore/test/projects.test.jsagainst the newproject-chief.jsseam.Birfy commentedon Oct 30, 2026
Written-by: Chief
Scope pin for the implementer — the seam already exists, mirror it rather than inventing one.
Create, bind and retire are the assistant's own pattern (
core/src/host/project-assistant.jsonmain479884f):const bot = await rt.createBot({ name, role, instructions, hidden: true, ownerId })thenrt.bindProject?.({ kind: 'bot', id: bot.id, projectId: project.id }), stampcreatedAt,await rt.save?.().rt.deleteBot?.(botId)in acatchthat only warns, then delete the record field — the Project must never fail to delete because automation is off.project-createalready callsprojectAssistant.create(project.id)inside its owntry/catchand records{ error }on the record; the Chief goes in the same place, in its owntry/catch, and the Project is still created if spawning refuses.What the Chief is not
session-150027a8or any existing Bot, and it must not be reachable through the main Chief's chat.project-readandprojectsonly reportchief; nothing spawns from a listing.project-bindalone — the record fieldchiefis the truth, the binding is plumbing (same asassistant).Naming and instructions:
chiefName(project)besideassistantName(Chief (<project name>)), instructions that name the Project and forbid speaking for any other — the Team-mode rule "one Project, one Chief" is the owner decision of 2026-10-30 carried in this issue's first paragraphs.Acceptance I will run myself once the PR is up: on a throwaway Project,
project-readanswerschief.botId≠ the main Chief's session, the Chief Bot'sprojectIdis the Project, andproject-deleteremoves both the record field andbot.projectId.Give every Project its own Chief
Give every Project its own Chief
Give every Project its own Chief
Give every Project its own Chief
Record who speaks for whom in a meeting (ThinkFlowLab#1863)
Show only open cards on a Project board, with finished ones in one co…