Changelog
Every release of the app, newest first. Every version is kept, and latest points at the newest.
v0.1.2
2026-10-27v0.1.2
- release: v0.1.2
- Onboarding against prod · org repositories, the real API, an Approvals step, and the Studio and Floor fixes from the first live run (#738)
- DARK-1423 · The packaged desktop app sends no errors or events: bake its Sentry DSN and PostHog key into the production build (#730)
- PostHog LLM analytics and site instrumentation (#726)
v0.1.1
2026-10-26v0.1.1
- release: v0.1.1
- DARK-1439 · Bake the identity provider into the production build (#729)
- DARK-1430 · signed cache hits, lint on its own runner, a red run stops early (#725)
v0.1.0
2026-10-26v0.1.0
- release: real bucket name, one notarizer (#728)
- release: publish to the GCP_RELEASES_BUCKET variable, not a hardcoded dm-releases (#727)
- release: v0.1.0
- DARK-1436 · Deploys leave revision names to Cloud Run; keys.md cites only checks that run (#724)
- Production: wire AUTH0_MANAGEMENT_CLIENT_SECRET into the api (#723)
- DARK-1430 · verify on two runners: desktop's tests in their own job, a scoped audit for each half (#722)
- DARK-1434 · Test suite pass: one lint pass for the ratchets, desktop tests without per-file isolation, condition waits (#721)
- DARK-1411 · production.env: the origins, the Auth0 tenant and ids, CORS, the API's Sentry DSN and PostHog key (#720)
- The api image carries its profile, and the api reads it at boot (#718)
- Production: wire the api's secrets and the nightly backup (#719)
- DARK-1430 · verify once per change; retire the commander gate; audit warns; settings-scopes waits (#717)
- DARK-1430 · One verify per merge: ci.yml stops running on a push to main (#714)
- Turn Dependabot off: no weekly update pull requests [skip ci]
- Base green after Wave 1: main's verify passes (#709)
- DARK-1396 · Wave 1 · Production on GCP, built without keys (#697)
- DARK-1336 · Copy pass on the chief of staff (DARK-1380): plain words, sentence case
- DARK-1380 · Chief of staff — you, delegated (#666)
- Every wait draws the round Dark Matter mark: retire the dot-grid Thinking figure (#667)
- DARK-1336 · Copy pass on Home (DARK-1338): plain words, sentence case
- Add the copy-pass skill: how to change many strings without breaking what reads them
- DARK-1336 · Copy pass on the Chat room (DARK-1329): plain words, sentence case
- DARK-1338 · Home — the room an engineer comes back to (#654)
- DARK-1336 · A suggested task reads "Suggested" everywhere, never "Proposed" or "draft"
- DARK-1336 · Copy pass I follow-up: the last internal words, sentence case everywhere, and plain server messages (#665)
- DARK-1329 · The Chamber talks — a Chat room on your own seat (#652)
- DARK-1336 · Copy pass I: the app speaks one plain language (#653)
- DARK-1321 · The door never breaks on an app update: lenient reads, DOOR_VERSION, and the app says when a door is behind (#650)
- Repo-agnostic agents — the sweep after #560 (MVP cut of DARK-1181) (#636)
- DARK-1316 · Continual improvements — CI-1 projects view · CI-2 board by project · CI-3 backlog off the board (#634)
- DARK-1242 · Improvement pass II — bugs, small features and loop fixes after the Oct 18 walkthrough (#615)
- TWO-3 · A question survives its session ending: the stand-down leaves blocked work standing, and the Chamber names the work's real state (#595)
- CLEA-17 · The door says where the notes vault is: a notes.where verb, and a README the app drops in the vault (#593)
- TWO-2 · B · seating() honours hold, and the held seat becomes a setting (#594)
- DARK-1217 A · GET /v1/work-items/:id/graph serves a project's whole work graph; the links route refuses a cycle (#592)
- Point the API README at docs/older/06-architecture.md (#591)
- CLEA-16 · Board lanes say what the track says: "checks" and "human review" replace integrating and deciding (#590)
- CLEA-11 · PR bodies read human-first: summary and screenshots on top, the agent report folded (#589)
- Hovering an orbiting sub-agent holds its orbit and shows the tail of its session (#588)
- CLEA-9 · Dotted background for the Studio (#587)
- Retarget --link to amber #e6a23c — links and selection are warm, focus and status unchanged (#586)
- CLEA-7 · the terminal draws at a terminal's pitch, in the face it measured (#585)
- CLEA-6 · What landed reads as markdown, clamped behind Show more (#584)
- Desktop window opens at the display's work area and remembers its bounds (#583)
- DARK-1181 · Repo-agnostic prompts — the repository profile is the knowledge base v0, one repoSection() in every brief, one press to confirm (#560)
- CI README history: stop naming the removed maestro scripts (#581)
- DARK-1205 · the local app carries the real icon, bone dots on chassis; the inverted variant is gone
- DARK-1214 · build-log: the local stack, run from nothing
- DARK-1214 · the local app gets its own userData: productName goes into the bundled package.json
- DARK-1214 · the local-origin guard leaves api.ts, so electron-vite's config loads under plain Node
- DARK-1205 · integration fixes: chassis identity reaches the renderer, strict optional types, lint
- DARK-1205 · dm:stack reads compose ps as Compose prints it in its tests; --print-token is --show-token
- DARK-1212 · pnpm dm:stack: a worktree from --ref, the image and the app built from one SHA, compose up with a deadline per service, the token handed to the app, install and open, plus status/logs/open/down/reset; flag-driven and non-interactive
- DARK-1190 · the relaunch test waits for the paused record to go instead of reading it once
- DARK-1213 · web in the local stack: apps/web Dockerfile (Next standalone) and an opt-in web service on 44311
- DARK-1190 · the person's-resume test waits for the third start instead of reading it once
- DARK-1211 · the local app's identity: Dark Matter Local, its own app id, icon, userData, keychain item and MCP name; updater off; local · <sha7> in the rail
- DARK-1190 · the live suites' run, recorded
- DARK-1210 · infra/local/compose.yaml: postgres, migrate on Railway's exact pre-deploy command, api gated on /health, a seed safe to re-run, project dm-local
- DARK-1190 · the role table has five roles since the steward joined the stations
- DARK-1206 · env declared once: one manifest, one layered resolver, the API, doctor and dm:app read through it, .env.example generated
- DARK-1190 · gate fixes after the lanes merged: lint, the rail's new words, Freeze view, and the ledger leaving pauses out
- DARK-1207 · DM_ENV: the environment model, three public profiles, environment on /health, and the guards that refuse cross-wiring
- DARK-1208 · main calls the API origin the renderer CSP was built with
- DARK-1209 · the app icon on the macOS grid, its local variant, and the dev dock icon
- DARK-1194 · Start now lists seated sessions; dev stand-in carries pause states; screenshots and build-log
- DARK-1205 · the mark the desktop icon is generated from
- DARK-1201 · DARK-1199 · DARK-1198 · a paused session keeps its clock, chooses how to come back, and is told what the pause cut off
- DARK-1202 · DARK-1203 · A paused session survives an app quit and carries on after the relaunch
- DARK-1194 · wired to the host: Queue on a full Mac, Start now, place in line, Pause and Resume
- DARK-1194 · waiting and paused on the seat counts, off DARK-1193's rows; screenshots
- DARK-1193 · Pause keeps the work: host pause, resume and start now for local sessions
- DARK-1194 · non-pausable sessions are listed but not offered; no resumes-fresh wording
- DARK-1194 · build-log page
- DARK-1194 · Auto-start on the project header, over DARK-1195's route
- DARK-1195 · auto-start: a project switch that lets the loop start its Ready work
- DARK-1194 · cloud is reviews only on the project, Settings and the rail
- DARK-1194 · Start now menu split out; build-log page
- DARK-1195 · auto-start: a project switch that lets the loop start its Ready work
- DARK-1194 · the session pane's Pause Task becomes Freeze view, beside Stop…
- DARK-1196 · Pause/resume spike: interrupt + --resume, cold cache, Codex, app quit, deadline
- DARK-1194 · Queue, Start now sheet and pause controls, drawn from props
- DARK-1191 · DARK-1192 · Cloud runs the reviewer only; priority orders fresh work; queuePositions
- DARK-1194 · approved mockup for seats, queue, start now and pause
- DARK-1004 · Seats, Ledger, Cloud — the epic, rebased onto main as one commit (#481)
- GENE-2 · onboarding offers to connect Claude Desktop and Claude Code, as an optional step (#554)
- GENE-3 · The Ledger moves into Settings → This org; the drawer keeps four rooms (#555)
- GENE-1 · a malformed sketch is refused in place and mermaid leaves nothing in the body (#553)
- DARK-1179 · a person's comments wait five quiet minutes, so one Mender pass takes them all
- DARK-1179 · its own mark on the send back to review, and the reader comment reflowed
- DARK-1179 · a person's comment on the pull request sends the Fixer
- DARK-1074 · the registry page regenerated after merging main (#550)
- DARK-1074 · the live suites' run after DARK-1173 and DARK-1174, recorded
- DARK-1173 · the host runs /code-review itself and hands the Reviewer its candidates; a verdict answers every one
- DARK-1151 · the mark becomes the loader
- DARK-1174 · format, and the build-log says what the recordings carry
- DARK-1174 · every station is told, in its system prompt, that it can ask a person
- DARK-1151 · brand assets and the loader prototype to port
- DARK-1074 · the live suites' run on the integration head, recorded
- DARK-1169 · the build-log names the filed finding
- DARK-1169 · auto-review is the one switch for review: the team's reviewer step no longer gates it
- DARK-1156 · the API's route list names the review settings route
- DARK-1155 · pnpm format and pnpm registry after rebasing onto the siblings
- DARK-1155 · the build-log names the filed finding
- DARK-1155 · pnpm format, and regenerate the registry after the rebase
- DARK-1155 · a step spins up its own session with its role brief: no roster gating, no Crew screen
- DARK-1158 · regenerate the registry after the rebase
- DARK-1158 · resume only while it is cheaper: last turn under 50 minutes, history under 60k tokens, both read off what the CLI recorded
- DARK-1158 · pnpm format and pnpm registry
- DARK-1158 · the Mender resumes the Builder's session, forked and told the role changed; every step leaves a hand-off note dm ticket prints first
- DARK-1160 · register the hand-back reading and the loop's answer to it; format
- DARK-1160 · CI under any workflow name, no CI green through auto-merge, silent CI a person's
- DARK-1157 · lint, the build-log page and the registry for the round's answers comment
- DARK-1157 · answers to findings with no thread are one plain PR comment per round
- DARK-1157 · regenerate the registry and the atlas for review_github_posts
- DARK-1157 · findings are inline comments on the PR, and the fix is the reply
- DARK-1152 · a review nothing has started says why in the loop's own words, Review starts a fresh Reviewer, Fix it starts the Fixer
- DARK-1159 · the build-log says where a silent review goes at the budget
- DARK-1159 · a ticket whose sessions all ended silent goes to a person
- DARK-1156 · a person's deciding is never merged unreviewed; the auto-merge chip in luminance (DARK-1167)
- DARK-1159 · a session that ends without saying anything leaves its offer open, and dm is on a station's PATH again
- DARK-1156 · format, and regenerate the registry after the rebase
- DARK-1156 · project settings: auto-review and Claude Code review, two toggles the loop obeys
- DARK-1154 · a repository with no CI workflow is green; configured CI that never reports is still a person's
- DARK-1153 · the loop runs for any org this Mac can act in, and a person's Start is a go
- DARK-1117 · lint ignores the server dm:app stages into desktop resources
- DARK-1150 · the extension's icon is the mark on chassis, so it reads on a light theme
- DARK-1149 · External connections: a shown-once dialog with an explicit Copy
- DARK-1148 · a sketch's mermaid is stored once
- DARK-1117 · Claude Code runs the server the app ships; a refusal exits
- DARK-1066 · the exit test's rulings
- DARK-1073 · the project's design band says whose hand froze the plan, and via what
- DARK-1066 · the exit test, run through the app's own seams
- DARK-1066 · the epic's live suites, run and recorded
- DARK-1074 · the five canvas boards rendered, for the epic PR's as-built comparison
- DARK-1066 · the merge page names the account read and the lint baseline
- DARK-1066 · drop the lint baseline's entry for settings/host-credential.tsx, which main deleted
- DARK-1129 · ASSISTANTS on the Settings page, screenshots; registry and atlas
- DARK-1074 · lane gate: drop the five legacy-list entries DARK-1086 cleaned, register findings-live, regenerate the atlas, record the live run
- DARK-1066 · the merge's live suites, the account read's delegate, and its build-log pages
- DARK-1138 · the Floor card's verdict acts: Merge and Read verdict on a ready verdict, Rule with the one disputed line on a ruling (#522)
- DARK-1135 · the Reviewer and the review Mender are cut from the pull request's head, and wait where none is read (#521)
- DARK-1070 · the 0086 migration suite lends 0094's link labels too
- DARK-1070 · registry after merging the integration branch
- DARK-1120 · disputes that outlast the rounds, or that the Reviewer re-read and still objects to, are a ruling — not another reading (#511)
- DARK-1072 · screenshots on the build-log page; registry after merging the integration branch
- DARK-1084 · a recorded Reviewer run and a recorded Mender run on a real seat, replayed by the contract suite (#518)
- DARK-1069 · screenshots on the build-log page
- DARK-1090 · the Progress module on the project overview and the Projects view as the five-step strip, counted by the board's own track (#516)
- DARK-1070 · a cut's plans read via off their design link line (DARK-1121); registry, format
- DARK-1070 · registry and format
- DARK-1070 · the Studio as an API: studio.open, studio.write (settled), studio.acceptCut, studio.session on the person route
- DARK-1069 · registry after rebase
- DARK-1069 · comments say what the code does, not which ticket wrote it
- DARK-1069 · rebased on DARK-1068: work.attach beside chamber.ask, the house rule names it, registry, atlas and format
- DARK-1069 · artifacts on the ticket: an artifact link by its name, the rail's ARTIFACTS group, work.attach
- DARK-1106 · a ready verdict under auto-merge merges unattended through the review card's own gh act, and a held merge parks in deciding with one sentence (#509)
- DARK-1073 · the thread with via, as looked at headless
- DARK-1091 · Check in from the card and the hologram task modal opens the ticket's run lane with the say-to box focused (#512)
- DARK-1073 · registry after rebase
- DARK-1072 · registry after rebase
- DARK-1072 · Settings → ASSISTANTS: connect Claude Desktop and Claude Code through main, rows, revoke, scope chips that re-mint; doctor knows this Mac
- DARK-1073 · openapi regenerated; comments say what, not which ticket
- DARK-1073 · registry and format
- DARK-1073 · via on the ticket: the thread, the plan band and the Chamber's asker say whose assistant's hand it was
- DARK-1087 · the ticket rail lists the crew by role, the agent picker offers by role fit, and the first look enlists a pair (#510)
- DARK-1083 · the findings well on the review card, the verdict in the card's status slot, and the ruling card after two rounds (#508)
- DARK-1123 · the registry measures the renamed suites: roles-setting for stations-setting, floor/track.test for first-track
- DARK-1088 · a project adds to a role's brief with .dark-matter/roles/<role>.md and names a model per role; the host reads the role's model under the ticket on every start (#507)
- DARK-1068 · registry, atlas and format
- DARK-1086 · Settings → Crew is one screen: how a ticket flows here, the roster with role chips, the role rows; STATIONS retired (#505)
- DARK-1081 · dm verdict and dm finding — the Reviewer cites the checks it read, the Mender answers findings, the briefs are rewritten around them, and the station return carries the verdict (#504)
- DARK-1068 · the server speaks the delegate: one credential carries its Brain, its scopes pick the tools, chamber.ask asks
- DARK-1089 · trackOf in contracts: plan · build · checks · review · merge, derived from served facts, never stored; the first-ticket track generalised to every ticket page (#503)
- DARK-1082 · findings from GitHub — Claude Code Review and people's inline comments folded by the PR poll; the verdict posted once as a PR comment via gh (#502)
- DARK-1085 · an operative carries roles — roles, name, retired_at, a PATCH route, a role table, and runsAs picks by role with the reviewer never the builder (#499)
- DARK-1077 · the card's owner line says the job: bravo · builder, and after hand-back bravo · built · charlie · reviewed (#501)
- DARK-1067 · atlas regenerated for the delegate credential
- DARK-1067 · the delegate credential: an assistant acts with your hand, and every line says via
- DARK-1080 · a review is a verdict over findings — contracts, migration 0095, ReviewContext projected from findings, reviewTurn reads the decision (#496)
- DARK-1078 · the Reviewer's sentence on the review card's facts well and the Floor card's status slot, until findings exist (#493)
- DARK-1079 · needs you · n on the bottom rail, org-wide, in every room; press to filter the board (#492)
- DARK-1076 · the Reviewer is never the Builder's operative — interim rule in runsAs (#491)
- DARK-1075 · the CI mender is the Fixer wherever a person reads it; mender stays the review-objection station (#490)
- DARK-1071 · the bundle: pnpm dm:mcp:bundle builds dark-matter.mcpb, checked in pnpm check, shipped in the app's resources
- DARK-1074 · the loop, pass II — the proposal: brief and seven boards
- DARK-1066 · proposal: Claude at the door — the MCP server as the dogfooding bridge
- DARK-962 · Settings as a page — three scopes, a route in the room slot, a status at every row, deep links to one row (#427)
- DARK-932 · Onboarding v1 — sign in, your machine, your repos, the agent's first look; /welcome ends at Start work (#458)
- DARK-949 · Many orgs, one Mac (#428)
- DARK-979 · a pull request appearing on a ticket refreshes an open window
- Delete hello.sh from the repo root (undo SOME-8) (#444)
- SOME-8 · hello.sh prints hello world at the repo root (#443)
- DARK-978 · Merge on the review card shows that it is working
- Delete hello.sh from the repo root (undo #439) (#441)
- DARK-976 · a merged pull request is done, from any step, the moment it merges
- hello.sh prints hello world at the repo root (#439)
- DARK-975 · the pull request shows from hand-back, and a merged card offers Mark done
- SOME-5 · delete hello.sh (undo SOME-4)
- DARK-974 · a watched session ends when its agent does, and a merge pressed on the card finishes the ticket
- SOME-4 · hello.sh prints hello world at the repo root
- DARK-973 · every run starts from the latest of its project's Base on origin
- DARK-972 · Try again on a ticket whose last session failed or was killed
- DARK-971 · a refused run releases without deleting a branch it never cut
- DARK-923 · the live gate's record after the main sync
- wave 3 · the live gate's record
- DARK-930 · registry, atlas, build-log page and screenshots for the Closing module
- DARK-930 · the Closing module: what a project shipped, read once its last task is done, and Close project on the button
- DARK-943 · A finished session stops its agent and leaves the Floor (+ DARK-944) (#423)
- wave 2 · the live gate's record
- DARK-927 · on DARK-928 and DARK-929: the closed-unmerged referral beside the Mender's react and the janitor's merged hook, Drop hands the branch to the janitor, registry after both blocks
- DARK-927 · the review is the ticket's run column: the card, the Pull request rail group, the Chamber's In review rows, Merge under the person's gh, Send back with a note, and closed-unmerged to Deciding
- DARK-929 · on DARK-928: the poll's merge hook beside the Mender's, registry regenerated
- DARK-929 · the janitor: after a merge the branch, the trunk and the worktree; at start the dead trees; dm:sweep for the rest
- DARK-928 · a Mender is first in line for a seat, never over the cap
- DARK-928 · openapi, registry, build-log page
- DARK-928 · red CI and a conflict send the work back to a Mender
- DARK-926 · the ticket knows what GitHub thinks of its PR: one gh pr list per repo, a reducer, and a Needs-you pill (#418)
- DARK-931 · Terminal — every terminal in a pty host ported from VS Code, reattach with full scrollback, and ⌃` in every room (#421)
- DARK-924 · a project binds a repository, and the engineer's clone becomes its trunk (#419)
- The accent is yellow: --teal becomes --yellow #FFC800 (#420)
- DARK-925 · the shapes review-to-merge writes into: a project's repository, a ticket's pull request, the cleanup record, and the host's send-back (#416)
- DARK-923 · the proposal, so seats can read it
- DARK-896 · Studio seat-3 — keys by project, autonomy, the operative's planning run, readiness (#412)
- DARK-858 · Studio seat-2 — smoke-test fixes (#395)
- DARK-811 · the site is the instrument, and the download comes home (#365)
- DARK-816 · Studio seat-1 follow-ups (#376)
- DARK-801 · one person with several ways in, a sign-in that is the war table, and everything a person may do about who they are (#363)
- DARK-802 · a turn belongs to the session, not to the panel that started it (#364)
- DARK-800 · the write path that read the wrong bytes, and the editor its own autosave destroyed (#362)
- DARK-796 · Notes stops being an editor with a preview and becomes the place the thinking lives (#361)
- DARK-794 · a session you can let go of, come back to, and draw on (#360)
- DARK-783 · the Studio seat picks its own model, and answers in typed blocks rather than prose (#359)
- DARK-795 · the view toggle is four pills, in one place on every view (#358)
- DARK-764 · the session room grows a tab per project with agents running, so one project's shells are a press away from another's (#355)
- DARK-763 · the Floor's session panes are the agent's own terminal — node-pty behind the kit's xterm, structure from the transcript and hooks (#345)
- the ticket baseline lets go of two files that are no longer there to violate (#350)
- DARK-776 · a sketch is a canvas of rich tiles, and the assistant reads what was drawn (#346)
- DARK-766 · the ticket gets a third column, and the labels holding it apart can be read (#342)
- DARK-773 · a backfill that writes to a projection has to say it is the projector (#349)
- DARK-779 · --mock opens a demo org seeded with the board, beside the working one (#347)
- DARK-782 · the API becomes the only thing the UI reads (#348)
- DARK-772 · one command boots the app, and the boot fixes what it used to only refuse on (#344)
- DARK-770 · the plan's five kinds become six views of one document, and every number on the band is something you owe (#343)
- commander · a DMG is never a ticket's evidence
- DARK-715 · a person signs in, an org exists that nobody was asked about, and one org can never read another (#335)
- DARK-718 · one command turns into a signed download, and a running app finds it (#339)
- DARK-717 + DARK-744 · one seam decides what leaves a process, and a catalogue that cannot hold a free string (#338)
- DARK-716 · a merge to main is a deploy, and two gates stand in front of it (#334)
- DARK-720 · Notes — a local-only, Obsidian-compatible vault the app edits and indexes (#340)
- DARK-743 · the studio client carried the revision in its types, not in its body (#337)
- DARK-742 · a refusal that names no way forward is a wall, and the seat reads it as one (#336)
- DARK-737 · the seat can change a block already on the plan (#333)
- DARK-736 · a second hand-off finds the ticket where it is, and clears what the first left (#332)
- DARK-735 · a block that already holds its answer can still settle its Chamber row (#331)
- DARK-734 · the plan flute reaches its panel, and the Chamber's door carries a ticket (#330)
- DARK-733 · an answer in the Studio settles its Chamber row, and a card reads down one edge (#329)
- DARK-730 · the Chief of Staff suggests a change, and still cannot make one (#328)
- DARK-729 · a studio question is settled in the Studio, and the Chamber lists it (#327)
- DARK-728 · a composer that holds a newline, and carries a list on (#326)
- DARK-727 · a block on the plan can be cut, and is asked about first (#325)
- DARK-726 · a Studio field is as tall as what is in it (#324)
- the Studio's wait is three animations, and a session keeps the one it drew (#323)
- DARK-725 · nothing starts a session on work the org has not decided yet (#322)
- DARK-724 · a suggestion is answered once, however many times a person presses (#321)
- DARK-723 · the Studio's wait is the canvas's own dot-grid in motion (#320)
- a seat takes what a person pastes (#319)
- The Chamber could not find the ticket it was ruling on (#318)
- four things the smoke test found, and a diagram that sometimes did not draw (#317)
- the transcript reads like an agent log, and a run of steps folds (#316)
- a sketch on the workbench — the canvas chrome, at the size a block gives it (#315)
- a dispatch can name its own branch, and an unknown one is fetched before it is refused (#314)
- two things that were built and never committed (#313)
- the second look — spacing that was overridden, and a diagram in somebody else's palette (#312)
- DM-671 · the hologram's nuclei are the projects this board is about (#310)
- six things between a working Studio and a usable one (#311)
- the joined walk, run once — a plan frozen before dispatch, in the brief the agent read (#309)
- the last link — a session briefed with the plan its ticket is on (#308)
- the suite that spends — a real claude, a real repository, a real plan (#307)
- the seat remembers between turns — its words, its cost, and which ticket it was on (#306)
- DARK-708 · the Studio's assistant becomes a session that reads the code and proposes into the plan (#305)
- three things that reached the app: a dropped field, a fixture on the wired path, and a scrim over the cards (#304)
- an owner is a person, and the agent working it is its own field (#302)
- DARK-703 · the Studio seat's building blocks: an invocation profile, a context packet, and eleven MCP verbs (#301)
- DARK-702 · an operative sends its own ticket back to the studio (#298)
- the Floor's project taxonomy — a standing, a picker built for names, and the boards that read them (#300)
- DARK-701 · the Floor's hologram, rebuilt as a canvas war table on real data (#299)
- DARK-661 · a done-means block with no session behind it names none, not a stray uuid (#297)
- DARK-689 · acceptCut refuses a project cut that decided nothing (#296)
- DARK-691 · a studio session's own component credential — the MCP server signs as itself (#295)
- DARK-660 · a cut task's unmet predecessor gets a named wait, not a silent draft (#293)
- DARK-599 · studio.cut proposes the project's cut, and checkCut names what it got wrong (#294)
- DARK-625/626 · a studio session's own line can now sign itself, not only the person holding the pen (#288)
- DARK-685 · a real UserId to name resolver for the Studio's card and popover (#292)
- DARK-688 · GET /v1/studio resolves a cut's task keys after acceptance (#291)
- DARK-694 · the gate count in prose, measured instead of remembered (#290)
- DARK-693 · a rebase always touches what the registry reads (#289)
- DARK-686 · the client can name a 409, and the port reads back a stale write instead of throwing past the card (#286)
- DARK-687 · the popover composes all ten block-scoped events, and a work item's key resolves too (#287)
- DARK-652 · a per-block compile route, and a key everywhere a card draws a ticket (#285)
- DARK-668 · no repo change — D72-D78 established, the ledger has already moved to Confluence (#284)
- DARK-651 · a sketch's source, writable — the route and the store both had no arm for it (#283)
- DARK-659 · render an undecided approach and question, and refuse a hand-off that decided nothing (#282)
- DARK-629 · WorkItemDetail carries its own comment count (#272)
- DARK-681 · the Chamber names a design link by the ticket's key and version, not its row id (#281)
- DARK-596 · unhide the Studio (holds on DARK-680) (#274)
- DARK-680 · the Studio port's api arm addresses the session the server actually registers (#280)
- DARK-684 · claim the unclaimed test verify:live found, then prove it was the only one (#279)
- DARK-684 · the one test no registry command claimed, and the census that proves it was the only one (#278)
- DARK-667 · the server admits what it cannot see; the panel answers for its own machine (#277)
- DARK-679 / DARK-682 — the bootstrap owner gets a name, and the Ledger explains its own zero (#276)
- DARK-596 · the S4 exit test walked, wired and on fixtures — documentation only (#275)
- DARK-679 · wired-path audit — screenshots, no code change (#273)
- DARK-590 · DARK-591 — the assistant in the room: a focus, five honest states, six verbs that only propose (#258)
- DARK-662 · DARK-677 — handOff/skip() throw past their first write, and CI's checkout carries the trunk it diffs against (#271)
- DARK-674 / DARK-673 - the Studio reads back the cut it stores, and the history popover aligns to its edge (#270)
- DARK-594 · S4 D3 — an open question on the design becomes a Chamber decision before building, and the ruling answers the block (#256)
- DARK-676 · DARK-675 — the status skill's dead docs/findings/ line gets a live Jira query, and date-range.tsx clears the ratchet (#269)
- DARK-670 · a test refuses an edit to an already-merged migration (#268)
- DARK-672 · the docs/findings/ dead-link pattern, closed for good in apps/api/src and docs/build-log/ (#267)
- DARK-646 · the Studio port's cut shapes derive from Cut, not restate it (#266)
- DARK-654 · Popover drops its listbox and haspopup with no options (#265)
- DARK-658 · DARK-669 — a cursor for a status-narrowed board, and three closed dead links (#264)
- DARK-600 · S4 F4 · plan mode in the room: the Cut view (#263)
- DARK-665 · DARK-666 — the allowlist earns its exemptions, and 0070 stops misnaming 0042 (#262)
- DARK-614 · a test guards the tracked settings a roleless Attach reads (#261)
- DARK-650 · DARK-648 — a top rail content seam, and a bottom rail that only claims a CoS it has (#260)
- DARK-601 · S4 H1 — the registry's honest census, the doctor's honest silence (#259)
- DARK-663 · 0070's snapshot restored, and a check that the journal and the snapshots agree (#257)
- DARK-597 · DARK-598 — the cut is checked before it is shown, and a cut becomes children (#255)
- DARK-592 · S4 D1 — the way in: the Floor's ticket page shows the design, links into the Studio, and the list says which tickets were worked out (#254)
- DARK-593 · S4 D2 — the design section: BRIEF.md, dm ticket and dm design render one Design (#253)
- DARK-589 · S4 B3 — hand off, revise into v2, and discard (#252)
- DARK-638 · DARK-642 · DARK-647 — the S4 spec, in the repo (#251)
- DARK-636 · DARK-628 — a lane's own truth, and a door for a blocked project (#250)
- DARK-633 · DARK-634 — the correction line gets vocabulary for a reference, and three rooms get a recorded reason instead of a fix (#249)
- DARK-588 · S4 B2 — working the plan: reorder, choose, reject, answer, a block becomes a ticket, its history, and the sketch opens (#248)
- DARK-643 · DARK-644 — a live suite that reports the database, not the code, on both sides (#247)
- DARK-630 · DARK-639 · DARK-640 — a count is a query, not the length of a page (#246)
- DARK-645 · what holds the served facts — and the one surface that held nothing (#245)
- DARK-595 · the design gate armed, and the version 0 that is the way past it (#242)
- DARK-587 · S4 B1 — the plan is the canvas: ticket band, intent, block cards, add row, a refusal kept on screen; the diagram, sidebar and terminal out (#244)
- forget a retired meter's recorded runs, so
pnpm registrystops refusing sprint-4 (#243) - DARK-584 · DARK-585 · DARK-586 — a work item's plan, frozen at hand-off (#240)
- a blocked card asks which ruling holds it, not what the org is deciding (#241)
- DARK-632 · DARK-631 — a count is a query, so a board can be a page and still say what it left out (#239)
- DARK-465 · a work item carries a team, so a ticket filed from a team's board is that team's (#238)
- DARK-627 · DARK-475 — a work item is found by its key and by its id, and the paging that stays says so (#237)
- remove opus from settings - prinicpal
- DARK-564 · the grid already meant start — so a project's start is the cascade, and the page can finally take it (#236)
- DARK-563 · the DARK backlog loads into Org #0, and a ticket with no detail comes from a project (#235)
- DARK-561 · the Studio's front door — an MCP server over the app's own routes, refused where the app refuses (#234)
- S3's tail · eight tickets, and what a refusal looks like in eight places (#233)
- DARK-441 · a merged pull request finishes the ticket, and the item's own consent is what allows it (#232)
- DARK-550 · the move menu is a menu now, so its keyboard cap is true (#231)
- DARK-557 · the Ledger's briefing invents nothing on the live arm (#230)
- DARK-489 · four surfaces name a project and all four open it — closes DARK-437, DARK-509, DARK-511, DARK-510, DARK-500, DARK-533 (#229)
- DARK-606 · a registered command may not name a test file that does not exist — 29 entries, 26 of them meters for surfaces the burn-down deleted (#228)
- DARK-568 · a decision has a key, so nothing draws a uuid where a person reads a name · closes DARK-108, DARK-251, DARK-398, DARK-552, DARK-579 (#227)
- DARK-576 · every command that can start a session says what it spends on — plus DARK-580, DARK-577, DARK-449 (#226)
- DARK-575 · a registered command may not name only tests that skip · DARK-572 · the container answers about the server the tests will use · closes DARK-446 (#225)
- DARK-565 · the live suites name the model they spend on · DARK-543 · a red stops depending on how many agents are working (#224)
- DARK-574 · DARK-573 · DARK-448 · DARK-444 — four answers where there was one: what a session is doing, per station (#223)
- DARK-400 · a credential the assistant spends, so a
cosline is evidence it wrote it · closes DARK-402, decides DARK-420 (#221) - DARK-555 · DARK-567 · DARK-309 · DARK-314 — one answer to what is blocked, and a door that goes to the thing (#222)
- DARK-571 · the eighteen unclaimed tests get the entry that is actually about them (#220)
- DARK-569 · DARK-570 — the registry's claim, checked in both directions: a chain that claims a package, and a test no command claims (#219)
- DARK-553 · DARK-554 · the two ends of the loop — a control that hands a ticket to an operative, and the loop with no window (#218)
- DARK-478 · a team policy is an owner's, and the screen is told so rather than finding out (#215)
- DARK-351 · S3's exit test, walked from the front door — two claims hold, the third has no door (#217)
- DARK-531 · a blocked ticket gets the question, where the work returns to, and the Chamber (#216)
- DARK-530 · a gated destination opens the one thing that satisfies it, and the sentence that said it could not is gone (#214)
- DARK-545 · DARK-539 · DARK-547 — the freeze stops being able to lie by omission (#213)
- DARK-534 · a fourth operative — the Mender answers a review without the ticket leaving it (#212)
- DARK-529 · one move menu, drawn from one answer and read by five surfaces — and the board consults the machine (#211)
- DARK-487 · the Chief of Staff becomes a chassis column, and the composer stops moving (#210)
- DARK-525 · DARK-535 · DARK-537 · DARK-541 — the gate stops getting less trustworthy as the sprint gets busier (#209)
- DARK-526 · one answer per destination, and the three facts it reads served rather than guessed (#207)
- DARK-487 · the Chief of Staff as a column, drawn before it is built (#208)
- DARK-513 · an allocation exists when a session does — and three more things the page said that were not true (#206)
- DARK-507 · every pipeline state draws a heading, and an add row only where a create opens (#204)
- DARK-512 ·
Open projectopens the project, and a Floor dialog is drawn over the room (#203) - DARK-527 · the move menu, measured — the hint is metadata, and the sheets are 500 (#205)
- DARK-490 · the host presents a credential of its own, and one route resolves it · narrows DARK-402 (#193)
- DARK-516 · a tool call is never a ticket's status, and an empty step says so once (#202)
- DARK-514 · back is the walk, not a destination — and a confirmation mounts on the chassis (#201)
- DARK-517 · a spike on moving a ticket — the screen refuses on the machine's behalf, and guesses (#199)
- DARK-515 · the CoS transcript follows its own newest line, and stops the moment you are reading (#200)
- DARK-482 · one column per stored state, and one name for it everywhere (#197)
- DARK-508 · a project's row goes to the project's page, and a test that walks in from the front door (#196)
- DARK-494 · DARK-495 · select several and act once, and write one down where it goes (#195)
- DARK-493 · a task row that works — state, agent and priority in place, and the list is an address (#194)
- DARK-491 · a kill releases the operative, so the loop reads one offer instead of two conditions (#192)
- DARK-492 · the project page's header becomes the project's editor (#191)
- commander · survey before you build, and say what you surveyed (#190)
- DARK-481 · the station goes on the contract, so a ticket's chain outlives the app run · DARK-476 (#189)
- DARK-480 · the loop reads who moved the work, not only where it landed · DARK-378 (#188)
- DARK-483 · the ticket shows which step is running · DARK-484 · and you can talk to it (#187)
- DARK-485 · the plan becomes a part of the ticket, a link becomes a link, and a name says what kind of name it is · DARK-477 · DARK-486 (#186)
- DARK-44 · the Chief of Staff gets verbs, and the verbs are the app's own API · DARK-473 (#182)
- DARK-459 · the tail says which station is running and what it left · DARK-469 · the loop gets a surface (#181)
- DARK-430 · a home for projects, drawn as the distribution of their work · DARK-460 · finished work goes away without leaving the ledger (#180)
- DARK-456 · one standing conversation for the whole app, and the walls that stayed up · DARK-455 · the panel reads well, echoes instantly, and its citations open (#178)
- DARK-170 · the loop dispatches a station when work arrives, and a budget on the ledger stops it looping · DARK-448 (#179)
- DARK-458 · callsigns are phonetic, drawn at random, and belong to one piece of live work (#177)
- DARK-453 · DARK-454 — one press stands a session down, and one channel says the work moved (#176)
- DARK-450/451/452 · the assistant gets a lane of its own, the thread opens on the conversation, and the row that did nothing now writes (#175)
- DARK-457 · the card says who has it, and the control says what happens to the work · DARK-461 · + New asks what you are making (#174)
- DARK-450 · widening a check still re-validates the rows a narrowing spared (#170)
- DARK-427 · a ticket with a pull request on it can be ended, and the record says what it left open (#169)
- DARK-439 · a work contract begins on any phase a station works, and the one-live rule was already standing on its own (#166)
- DARK-172 · three stations — Researcher, Builder, Reviewer — as station briefs over the S2 host (#168)
- DARK-445 · the github fixtures carry the field the schema now requires (#167)
- DARK-423/424/387/432/362 · one status control, a property rail, and the two defects under them (#165)
- DARK-428 · the board learns what happened to a pull request (#164)
- DARK-31 · the Chief of Staff's answer arrives as it is written (#163)
- DARK-171 · station contracts — a phase, a role, and a return the grid can check (#162)
- DARK-425 · the create form names the project it opened on · DARK-426 · Drive session resolves by project, and refuses when there is none (#160)
- commander · dm:ui stops opening the Principal's browser (#161)
- DARK-364 · dm:seed stands an org up and leaves the queue empty; the demo board is one flag away (#158)
- DARK-429 · iterations come off the surface, and nothing underneath moves (#157)
- DARK-316 · the host and the CoS sign their own name, and the component name is part of the rule (#149)
- DARK-408 · the Chief of Staff answers on the engineer's own Claude Code seat, and no key is involved (#155)
- DARK-33 · a refused ask reads as a refusal, drawn where the answer would have been (#154)
- DARK-32 · the per-room context — what each scope is allowed to know, and to name (#152)
- DARK-325 · an import carries its plan in the tracker it came from (#153)
- DARK-329 · a gate for the suites the gate cannot run, and a clock over how long ago anything ran them (#151)
- DARK-30 · one route family for the Chief of Staff — a scope the server picks, and citations it can prove (#150)
- DARK-349 · the model key lives in the Mac keychain, and every road it does not travel is a test (#148)
- DARK-29 · the Chief of Staff moves into the chassis, scoped to the room you are standing in (#147)
- DARK-28 · thread and turn storage — an org-scoped table with its own append-only stream (#146)
- commander · pnpm format belongs in the last commit, and the S2 working memory (#132)
- DARK-381 · DARK-383 · the assignee pill names people, and an iteration filter that means one thing (#145)
- DARK-382 · the Floor keeps its column width, puts the CoS in front, and scrolls (#144)
- DARK-380 · a ticket says where it can go, and what each move needs first (#143)
- DARK-379 · a killed session reads killed, a dead prompt says so, and a ticket tells an action from a fact (#142)
- DARK-361 · the tracker can be managed from the app (#140)
- DARK-275 · the board gets a Queued column, and starting an agent becomes something you can find (#139)
- DARK-358 · one command starts the app, and it knows which repository it is in (#138)
- commander · regenerate the atlas, which main is currently red on (#137)
- DARK-307 · a session carries the operative the org named for its callsign (#136)
- DARK-341 · the task route carries the work's own state, and Attach gates on it (#135)
- DARK-352 · dm ask polls the id the Chamber minted, not one that was never there (#134)
- DARK-335 · the host names how a session ended, and a returned contract lets its ticket go (#130)
- DARK-336 · Attach refuses before the click, and the refusal after it is the Brain's own sentence (#129)
- DARK-334 · compose falls back to the ticket when there is no Brain to anchor to (#128)
- DARK-308 · a Chamber badge visible from outside the Chamber (#127)
- DARK-319 · the reaper gets a caller — a pg-boss sweep, mounted in the API, on a cadence read off the board (#126)
- DARK-312 · retire the edges into
blocked, andblocked → draft(#125) - DARK-301 · a reaped ticket goes to queued, and the refusal that stopped it is heard (#124)
- DARK-311 · the host finishes the hand-back: integrating → review (#123)
- DARK-147 ·
blockedis derived from an open decision, not stored (#122) - DARK-18 · Chamber v1 — the question queue, and the room unhides (#121)
- DARK-239 · the host resumes a session with the answer (#120)
- DARK-42 · the
dmCLI and the brief — the agent's half of the conversation (#119) - DARK-233 · questions — a decision that stops the work and puts it back (#103)
- commander · the lane gate is local and once per lane (#118)
- DARK-294 · the reaper — a session whose credential expired is provably gone (#113)
- DARK-299 · the desktop app refuses without a binary, in the doctor's own sentence (#117)
- DARK-270 · pnpm dm:electron fetches the binary, and the doctor names it (#116)
- DARK-281 · dm:doctor reports the machine: which agent CLIs, Electron, the cap (#115)
- DARK-273 · the refusal's reason, held to the element a pointer lands on (#114)
- DARK-286 · every append parses the envelope it is about to write (#112)
- DARK-287 · a CI run that never started is not a verdict (#111)
- DARK-283 · one live contract per work item, held by the database (#110)
- DARK-237 · the result — a ticket that stops says why it stopped (#109)
- DARK-238 · cost carries its cached tokens, and the scanner checks the record (#108)
- DARK-41 · Kill from the chip — a confirmation that names the tree, and a record of who (#107)
- DARK-34 · the contract lifecycle's missing verbs — started, returned, and a resume that is real on one backend and honest on the other (#106)
- DARK-236 · the session tail is the host's, and the invented transcript comes out (#105)
- DARK-90 · auto-merge per work item, resolved in one place (#104)
- DARK-36 · the desktop host — a session starts on your own machine, and the app can stop it (#95)
- DARK-234 · ticket-scoped agent tokens, and the wall around them (#102)
- DARK-267 · dm:cost's worktree resolver, proven against real git (#101)
- DARK-266 · the CoS panel stops swallowing questions, and the walk becomes a test (#98)
- DARK-252 · the gh probe gets a deadline, so a runner with no credential fails fast (#100)
- DARK-232 · typed notes on a work item, and the plan gate (#99)
- DARK-252 · the gate and the loop are two commands, and the gate is polite (#96)
- DARK-235 · Attach — the control, the agent picker, the live chip on the card (#97)
- DARK-111 · the Chamber's already-ruled toast, in one short sentence (#94)
- DARK-86 · operative identity — the durable named agent a ticket is handed to (#93)
- DARK-200 · Sprint 1 registry close-out — eight entries, two stale titles, three named gaps (#92)
- DARK-205 · the board a team walks in on — GET /v1/floor/board takes a team, and the pill rests on yours (#90)
- DARK-206 · Jira importer — DARK comes in as work items, once (#91)
- DARK-203 · the task description, editable in place, and its renderer promoted to the kit (#89)
- DARK-142 · iterations — its own table, and the board that defaults to one (#88)
- DARK-210 · the ship log and the atlas, published to Confluence on every merge (#87)
- DARK-96 · refetch the board after a successful move, api mode only (#86)
- DARK-204 · comments — a thread on every work item (#85)
- DARK-220 · mount AssignPicker on the kanban card's Assign CTA (#83)
- DARK-20 · the create path — a person can write down a new work item from the Floor (#84)
- DARK-134 · estimate and due date on a work item (#82)
- DARK-209 · the atlas is generated from the code, and pnpm verify keeps it that way (#81)
- DARK-87 · the Floor's three filter pills open a popover and filter server-side (#80)
- DARK-88 · work items get a human-readable key (#79)
- DARK-199 · make valueSeverity (and its stats sibling) optional to match types.ts (#78)
- DARK-91 · assign a task to a person — the human half of the operative picker (#77)
- DARK-101 · the Ledger's search box is a query, not a slice of the page (#76)
- DARK-181 · the main-process menu now filters and renumbers on ROOM_VISIBILITY (#75)
- DARK-165 · teams, team members, and the roster read a picker is served from (#72)
- DARK-208 · the Hologram view is addressable — a URL is a control (#74)
- DARK-146 · spread the seed's history over thirty working days (#73)
- DARK-211 · auto-merge — the commander gate, and the branch protection that arms it (#71)
- DARK-179 · retire dm:handoff — its write-destination died with the corpus it served (#70)
- DARK-193 · refuse the Ledger's search box in api mode, keep it live on fixtures (#69)
- DARK-184 · a documented ?ports=mock flag for dm:ui, and a rail that says which mode you are in (#68)
- DARK-182 · dm:cost resolves a worktree back to its repo and ticket via git (#67)
- DARK-95 · the Pulse pill yields the toast corner, and only while a toast is in it (#66)
- DARK-131 · guard the Observatory's fleet reading (O-12, O-13) (#61)
- DARK-167 · wire or visibly refuse every control on the Floor and the Ledger (#63)
- DARK-183 · open the registry's closed ticket set to DARK- (#65)
- DARK-92 · the Pulse pill's dot now reads the route's own freshness word (#64)
- DARK-48 · the toast's undrawn half — dwell, a ✕, motion, and what waits past two (#62)
- DARK-94 · key the project timeline by identity, not by the minute it happened (#60)
- DARK-49 · remove the Chamber's Mic control (#59)
- DARK-166 · hide the four rooms whose stage has not passed (#56)
- DARK-148 · the Carbon scrollbar — one document rule on the ink-dim ramp (#57)
- DARK-149 · give the Hologram's task modal a real way out (#58)
- DARK-168 · retire the repo's planning corpus (#55)
- beta · the wave-two system map — 92 gaps, seven systems, and the order to build them
- DM-71 · the Planner — one module wired, six refused, and the spec for the rest (#51)
- DM-70 · the Observatory — a second route beside the pack, and four views that say what they cannot know (#52)
- DM-69 · the Studio — the block stream as the thread, and the tie to a ticket (#54)
- DM-67 · the Chamber — a queue over real decisions, and the product's one write (#53)
- Beta · Jira takes the backlog, the design specs, and D51–D53 (#50)
- DM-68 · the Floor — three routes shaped for the room, and a drag that writes (#49)
- DM-101 · The Ledger, pass 2 — served filter domains, the date range, and a page that says it is loading (#48)
- DM-66 · the Ledger — real history, a route shaped for the room, and the document that keeps them honest (#46)
- fix(RIG-14): raise the timeout on three CI-only-slow tests, not the app (#47)
- UI-18 + DM-76 · the toast, and the seam that wires it (#45)
- Beta · the owned domain, and the plan that scoped it (#44)
- docs(bravo): close the session — the log, four rulings, the tracker (#43)
- beta + bravo · the backend plan, and the harness that runs the sessions (#37)
- fix(DM-72): repoint the seed's dead backlog ref, add the check that keeps it honest (#32)
- chore: untrack screenshot artifacts, ignore root-level pngs
- feat(skills): add next-steps skill for addressable recommendations
- UI-15 · the Floor — five views, a computed hologram, real terminals (#30)
- feat(UI-12): the Planner — the room that re-columnises when you open its CoS (#29)
- feat(ui-14): the Studio — a computed canvas, a real terminal, one screen (#28)
- feat(UI-13): the Chamber — one decision renderer, five configurations (#27)
- feat(UI-16): the Observatory — four views, and Alerts as the Dashboard's state (#26)
- fix(rig): waitForPort probes both loopback stacks; add ChatBubble/DetailPanel to Carbon (#25)
- feat(skills): sweep stray processes as part of a status check
- feat(ui-10): the Ledger, and the kit changes the shakedown found (#24)
- fix(rig): RIG-11 · teardown waits for the process group, not just its child (#22)
- UI-2c · the accumulated token gaps, and the orb rulings (#23)
- UI-9 · pnpm dm:ui — the shipped renderer in a browser, plus the Carbon catalogue (#21)
- fix(desktop): collect colocated room tests, and let them exist
- feat(UI-4): the data layer — one port seam every room reads through (#20)
- feat(skills): a status skill for reporting into an away Principal
- rig(RIG-10): close the last type-aware lint gaps, cold-worktree rig commands (#19)
- fix: clear Alloy's residue, and ignore worktrees in the baseline tool too
- rig(RIG-9): delete Alloy, retarget the meters that pointed at it (#18)
- feat(rig): RIG-8 · un-grandfather Carbon's own source (#17)
- docs: link the ticket skill from CLAUDE.md
- feat(rig): RIG-5 · ticket-execution skill, with a findings channel (#16)
- docs(plan-status): bring the tracker current
- fix(lint): ignore .claude/, link the comment convention, file RIG-8
- feat(rig): RIG-3 · relocate reasoning out of code (#15)
- ci(RIG-2): re-enable CI on
pnpm verify(#12) - docs: correct two stale claims RIG-4's check surfaced
- feat(brief): one generated entry point, checked against the decision ledger (#14)
- feat(rig): RIG-7 · teardown wrapper for anything an agent launches (#13)
- feat(rig): RIG-6 · PR template (#11)
- feat(rig): RIG-1 ·
pnpm verify, one gate that cannot lie (#10) - docs: STD- -> RIG-, and Stage 0 is 'the rig'
- docs: Stage 0 standards, and the meta-problem behind it
- feat(carbon): UI-7 · graph — React Flow nodes, edges and three computed layouts (#9)
- feat(carbon): UI-6 · charts — nivo under a Carbon theme, sparkline hand-rolled (#8)
- docs(rooms): strike three superseded library arguments
- UI-8 · Terminal — real in-browser terminals for supervising agents (#7)
- feat(carbon): UI-5 · states kit — skeleton, spinner, empty, error (#5)
- UI-3 · Chassis, router, and the burn-down (#6)
- feat(carbon): close the four preset gaps UI-2 found (#4)
- docs(carbon-kit): name the census's blind spot
- UI-2 · Carbon chrome components (#3)
- docs(architecture): fix a cva example naming colours that never existed
- refactor(carbon): hue-named status utilities, per spec §2 (#2)
- fix: actually ignore .claude/worktrees/
- ci: disable the pipeline until the MVP lands
- fix: untrack agent worktree, gitignore .claude/worktrees/
- docs(carbon-kit): withdraw §5, correct two token findings from UI-1
- chore(ui-1): lockfile, root deps, tracker
- test(carbon): meter the vocabulary, and register the suites
- feat(desktop): wire the Carbon preset into the renderer's build
- feat(lint): make the styling discipline mechanical
- feat(carbon): the Tailwind preset, cn(), and the shadcn seam
- feat(carbon): extend the token sheet from the measured frames
- feat(carbon): vendor Inter 400/500 — the third face D9 ruled for
- docs(backlog): Phase 4 — 16 tickets in four stages
- docs(architecture): Phase 3 settled — libraries over a custom UI system
- docs(architecture): Phase 3 draft — the frontend as a system
- docs: persist the plan — mission, decisions, tracker, and six room specs
- chore: retire the maestro hooks
- chore: lockfile picks up @dark-matter/carbon
- docs(design): why dm:specimen is not the Carbon fidelity harness
- feat(carbon): scaffold the Carbon-A package — tokens only, no primitives
- fix(design): sanitise the frame name before it reaches a write path
- docs(design): freeze the Figma geometry so no worktree needs the token
- feat(carbon): the two Carbon-A typefaces, licensed and vendored
- docs(CLAUDE.md): point at Carbon-A, and stop sending agents to dead paths
- docs: Carbon-A becomes the design authority; prior doc set moved to history
- docs(build-log): stamp sentinel merge, fix source line
- chore(maestro): scaffold sentinel's build-log page
- ops(OPS-1.1+1.2): event-driven watcher wakes, stop-guard retired to an instant check
- docs(build-log): stamp cipher merge, fix source line
- chore(maestro): scaffold cipher's build-log page; MAESTRO_MODEL override
- docs+feat(ops-1.4): the inter-agent wire format, and the hook that warns past it
- Stamp the threecol merge
- docs(DM-61): the registry entries, the build-log page, and the ruling in the tracker
- feat(DM-61): measure the geometry in the page the capture was taken from
- feat(DM-61): three columns is the ceiling, and the Chief of Staff can be put away
- Renumber the anchor to DM-60, and stop build-log writing into the wrong checkout
- Stamp the anchor merge
- docs(DM-59): the build-log page for the credential-to-person join
- fix(DM-59): close the hole in the cold-start gate that let this ship
- feat(DM-59): the app anchors itself, and both rooms read one answer
- feat(DM-59): serve the credential-to-person join at /v1/anchor
- feat(DM-59): the record behind the credential-to-person join
- Stamp the dock merge in the build log
- tool(DM-41): every room is captured twice, so the Chief of Staff's column is in the set at all
- tool(desktop): one rig survives — the seam-drivers move into dm:specimen and room-rig is deleted
- fix(DM-41): the specimen keeps its Field, and the rig prints through stdout
- docs(DM-41): the build-log page, the S5 amendment, and the standing rule about deviations
- fix(DM-41): the Chief of Staff is a summon bar and a racked column, not a panel in the bar
- alloy(DM-41): fill takes what is left, and never less than the narrowest module there is
- alloy(DM-41): the dock takes a line, not children, and the bay racks the column beside the deck
- tool(desktop): the room rig lands, because a measurement nobody can retake is a claim
- Regenerate the build-log index after the specimen merge
- Stamp the build-log pages for tonight's merges
- docs(specimen): the build-log page, the tracker, and the rig's own README section
- test(specimen): the four claims under a capture that fail silently
- feat(specimen): pnpm dm:specimen — a room, both finishes, real data, as a capture
- Ignore the design artboards: a re-pull is the source of truth
- Doctor: branch-work checks the ref, not a stopwatch
- Bring the design source into the repo, and bind briefs to it
- Tier 1 complete: the product opens from nothing and reaches a cited brief
- docs(build-log): record the four merges that landed under this branch
- docs(atlas): CompilePanel is mounted, and the class it belonged to is closed
- docs(atlas): draw the cold-start gate — DM-58 is the gate this atlas is about
- chore(atlas): prettier owns the sources, not the page it generates
- docs(atlas): the build-log page, and stop shipping two copies of one build script
- docs(atlas): redraw against main @ 404da92 — ingest is built, compile is idempotent
- docs(atlas): the architecture atlas, generated from one data file
- agents_live: an operative reopened after 'done' is working, not finished
- docs(build-log): index the polish page under its own title
- docs(build-log): the pass where the rooms were opened and looked at
- fix(DM-55): a compile board comes down the moment the session moves under it
- fix(alloy): a room is as tall as what is in it, so the deck has something to scroll
- docs(registry): three meters for compile in the app, and a gap that closed twice over
- test(desktop): a component built and never mounted is now a red suite
- fix(DM-55): compile leaves the test harness, and its refusals stop being lies
- chore(format): reflow a paragraph prettier had not been run over
- fix(alloy): the chassis is the ground of the window, and only the deck moves
- fix(DM-37): the 401 remedy names a command that can actually produce a token
- fix(DM-36): wire the Floor, and stop it blaming the connection for everything
- docs(build-log): put the digest above the Tickets line, where the gate reads it
- docs(build-log): DM-58 — the product opens from nothing, and shows its work
- docs(DM-58): the gate names the two traps that cost a night each
- feat(DM-58): the last three joins — a vault, a Brain, and a cited morning
- feat(DM-58): the cold-start gate — prove the product opens from nothing
- fix(DM-58): a refused origin leaves a trace
- fix(DM-58): the app opens cold — CORS_ORIGINS defaults to the renderer in development
- fix(DM-58): CORS_ORIGINS is validated at the boundary, not at the comparison
- Stamp the build-log pages for the origin and ingest merges
- kill-agent: never TERM the tmux server
- chore(extract): delete a scratch probe that should never have been committed
- docs(build-log): DM-57 — no database had ever had a Brain
- docs(build-log): a block remembers the ticket it became
- docs(DM-57): the cold start, and the finding it turned up
- docs: where a proposal's grounds live, and India off the Tier 1 board
- docs(DM-55): close gaps 6 and 7, and name what is still open
- chore(DM-55): the renderer carries a block's origin through
- test(DM-55): compiling twice, over the wire and against the shipped wiring
- test(DM-55): the origin and its idempotence, against a real Postgres
- feat(DM-55): compile is idempotent or refuses, end to end
- feat(DM-55): compileBlock — propose and record the origin as one act
- feat(DM-55): a block records the ticket it compiled to
- test(ingest): the cold start is the test — subprocesses, not imports
- Pass the backend whole instead of naming two keys to discard
- feat(ingest): DM-57 — pnpm dm:ingest gives a fresh database a Brain
- Stop the spawn briefing from executing itself
- Doctor: ask the process tree before declaring an operative dead at boot
- Serve CORS from apps/api: the renderer could never reach it
- refactor(indexes): embedderFor and providerFor become the package's, not the CLI's
- Wire the Observatory into the served app; commit this week's plan
- fix(maestro): teardown reaps the process, the doctor sees strays, and Control's subject is read
- docs(build-log): stamp the compile merge
- feat(maestro): board.sh — every branch's merge-readiness in one call, in parallel
- chore(DM-55): rebase onto DM-56 — regenerate the registry, re-look at the rows
- feat(DM-55): wire onto DM-54 — real session model, real plugin, one bad test found
- docs(build-log): where reasoning becomes tickets, and mostly refuses to
- chore(DM-55): registry — three suites, one gap closed, five named
- test(DM-55): the seam, joined — DM-49's grant proven over a wire for the first time
- feat(DM-55): the compile specimen, and three defects it found
- feat(DM-55): the compile endpoint, and the panel that accounts for every block
- feat(DM-55): compile decides what in a session is work, and refuses the rest
- fix(maestro): an operative rebases itself; only a semantic collision reaches the Commander
- docs(build-log): stamp the observatory merge
- docs(build-log): what the rebase onto DM-54 changed, and what it exposed
- fix(chassis): route by table, because the last room made the placeholder unreachable
- chore(DM-56): the specimen recorder, the captures' fixture, the build-log page and the registry
- fix(alloy): box-sizing was missing from the kit, so every row in every room was clipped 12px
- feat(DM-56): the Observatory room — readings that carry their basis, gaps that name their source
- feat(DM-56): offer what the model already connects you to, so following has a target
- feat(DM-56): follow and unfollow over HTTP, and a refusal that says what is wrong
- feat(DM-56): follow anything — a watchlist keyed by the person, not the org
- feat(DM-56): GET /v1/observatory — the watchlist, and three lenses that say what they read
- feat(DM-56): the Observatory's pack — a reading carries its basis, a gap names its source
- docs(build-log): stamp the studio merge
- feat(DM-54): render and look — the specimen, and what looking changed
- style(DM-54): prettier on registry/app.yaml
- docs(DM-54): the registry entry, and the page for someone who has not read the code
- feat(DM-54): the Studio room — a canvas a person cannot lose
- feat(DM-54): the Studio over HTTP, and no route that saves a document
- feat(DM-54): a session can be opened already holding something
- feat(DM-54): a studio session is appended to, never written over
- feat(DM-54): a studio session is a document made of changes
- docs(build-log): stamp the sysactor merge
- docs(build-log): a machine may propose work, and may do nothing else to it
- docs(DM-49): the grid's prose, the S2 note, and three gaps named precisely
- feat(DM-49): the board says which tickets the machine proposed
- feat(DM-49): the propose verb, and a component that cannot do anything else
- feat(DM-49)!: the envelope names one line a machine may sign
- test(harness): a 'starting' operative IS accused once the grace expires
- fix(verify): the build-log gate honours the exemption its own usage text promises
- docs(build-log): Sierra wrote most of the chassis coverage, and git will not say so
- docs(build-log): stamp the coverage merge
- docs(build-log): the chassis coverage page, describing the tree that exists
- registry(harness): the chassis service gets the meter it was missing
- test(api): the chassis service's two suites reconciled into one
- fix(doctor): a spawn that died at boot stops looking like a spawn that just started
- docs(build-log): stamp the wave-3 gate
- docs(build-log): the wave-3 gate, run end to end on a real agent
- fix(dispatch): the draft reply is parsed as the shape the route actually sends
- fix(maestro): a merge you have not reported holds the turn
- fix(build-log): two pending pages for one operative no longer exits silently
- docs(build-log): the union, the live run on the merged tree, and the teardown guard's page
- fix(maestro): a teardown refuses to discard work it cannot get back
- test(peek): pin the ordering the union makes, which neither branch could test alone
- fix(peek): the closing line says how a session ended, not what it said again
- docs(build-log): the peek page, and format/typecheck across the branch
- feat(peek): the specimen, the captures, and the registry entries
- feat(peek): the panel, and the six sentences a silence can mean
- feat(peek): the session log, and one route that reads it with the record
- test(peek): narrate the recordings, and prove the watcher only receives
- feat(peek): narrate a session line, and a watcher that can only receive
- docs(build-log): stamp the evidence merge
- docs(evidence): DM-47 registry, the build-log page, and two gaps closed
- feat(chamber): DM-47 evidence reaches the glass, and what it cannot support says so
- feat(evidence): DM-47 the pack is written, and /v1/evidence serves it
- feat(evidence): DM-47 a table for the pack, and the key that makes the citation real
- docs(build-log): stamp the rearm merge
- docs(build-log): stamp the dispatch merge
- docs(build-log): stamp the authority merge
- docs(build-log): DM-53 record what the merge gate caught
- docs(maestro): say what supervising() actually shares with its neighbours
- chore(registry): regenerate REGISTRY.md for the DM-53 entry
- docs(build-log,plan-status): DM-53 the page and the decision entry
- docs(maestro): DM-53 write down the constraint the design turns on
- test(maestro): DM-53 the steady state, sampled rather than asserted
- docs(dispatch): the ticket moves, and what that costs
- fix(api): DM-46's live loop sends one ticket three times
- feat(maestro): DM-53 the watcher re-arms itself, and what it saw survives the exit nobody hears
- feat(db): a dispatch starts work on the board, not only on the contract
- docs(dispatch): the build-log page, for the seam as well as the surface
- feat(desktop): wire the dispatch surface to the routes that now exist
- feat(api): the step between a ticket and a dispatch
- feat(db): briefs get a home, so a contract's citation resolves
- fix(dispatch): delete a state DM-45 cannot produce, and draw the only real brake
- docs(registry): regenerate REGISTRY.md for DM-44
- docs(dispatch): registry entries, four named gaps, and the build-log page
- fix(dispatch): four defects that only rendering the surface could find
- test(dispatch): the refusals lead, because they are the ticket
- feat(dispatch): the dispatch surface, and the reason it refuses
- docs(build-log): the DM-46 collision, and what it says about the gate
- fix(maestro): an agent/* branch is not sufficient to mean "a maestro operative"
- docs(build-log): the numbers as they stand after the rebase onto DM-51
- docs(maestro): the suite list in §9b now says what test:harness actually runs
- docs(maestro): §4b order provenance, and what the stamp asks of the Commander
- test(maestro): the order stamp gets its meter, and four orphaned suites join the gate
- feat(maestro): an instruction carries provenance, and one that cannot be attributed says so
- docs(build-log): stamp the runner merge
- docs(registry,06,build-log): both halves on the record, and the two gaps left open
- feat(api,harness): the loop closes — a person authorises, an agent runs, the ledger records
- docs(build-log): stamp the union merge
- docs(build-log): stamp the contract merge
- fix(db,api): rebase onto DM-45 — one refusal body, one guard, and a journal that is ascending again
- refactor(db): prove the second guard instead of leaving it unreachable
- docs(registry,build-log): what DM-43 is, what proves it, and what it does not do yet
- feat(api): work contracts over HTTP, and a dispatch endpoint that cannot exist unguarded
- test(db): the contract ledger, proved against a real Postgres and a second empty one
- feat(db): a Work Contract gets a home, a history and an org
- feat(contracts): a Work Contract gets a life, and the turn brake it was missing
- fix(verify): the
anyban reads code, not prose - docs(06): S4 gains a runner, and the split that keeps its evidence worth reading
- docs(build-log): the gate's first live catch, on its own branch
- test(harness): the brake, biting — and a stopped session still leaves a pack
- docs(build-log): the measured evidence, including the real-repo rehearsal
- docs(build-log): stamp the wiring merge
- docs(dm-45): registry entries, the build-log page, and three named gaps
- docs(harness): the record — README, registry, and the build-log page
- feat(harness): a real agent, a real worktree, a real diff — and the brief is not the answer
- feat(api): the trust line over HTTP, and the guard a dispatch has to get past
- docs(build-log): the union gate's page, and the regenerated registry index
- feat(db): the org's trust line, stored — one row per act it has ruled on
- feat(harness): the runner service — a seat, a brake, and the four statements
- feat(maestro): verify a merge candidate as the merge, not as a branch
- feat(maestro): a parked Commander stands by on the inbox instead of going deaf
- docs(retro): the parked-fleet supervision gap, and reading-is-not-handling
- fix(maestro): unread mail holds the turn when the fleet is parked
- docs(build-log): stamp the census merge
- docs(build-log): DM-24-census — the merge set is a fact about the graph
- docs(build-log): stamp bfa1c5f, and correct what its page said about why
- docs(build-log): stamp the Inline wrap merge
- fix(build-log): the merge set is the first-parent chain, not a subject prefix
- fix(DM-40): Inline can wrap, because a row that outgrows its module was being cut
- refactor(DM-38): split the ticket panel, and delete the stand-in the wiring left behind
- docs(build-log): stamp the chamber follow-on
- fix(maestro): a message body is written literally, not evaluated twice
- docs(build-log): stamp the ledgerroom follow-on
- feat(DM-37): take the served shapes from contracts, and wire the Ledger room
- docs(build-log): stamp the dock seam-fix merge
- docs(DM-38): the build-log page for the second pass, digest written
- fix(DM-41): follow citations over the seam, and do not throw in shared chrome
- feat(DM-38): the room can point a ticket at something, which was the last write it lacked
- test(DM-38): join the halves — the work ledger over HTTP into a real Postgres
- docs(build-log): stamp the chamber merge
- docs(DM-37): the evidence at merge, measured after the rebase
- feat(DM-37): wire the dock, follow citations over the seam, and take the merged rooms
- fix(DM-37): typecheck and lint clean, except the Field import that is still on another branch
- docs(DM-37): registry entries, four named gaps, and the build-log page
- feat(DM-37): the renderer data layer, the Chamber port, and the room's suite
- feat(DM-37): the evidence gate, the queue, and the decision unit
- docs(build-log): stamp the ledgerroom merge
- docs(DM-38): register the room, and stop the page saying it is unbuilt
- feat(DM-38): the Ledger room — the tracker, and every edit is an event
- wip(DM-38): the board module
- refactor(DM-38): the transition grid moves to contracts, where both ends can read it
- feat(DM-40): Chip selected — a filter that cannot show it is on is not a control
- style(DM-38): prettier on the two registry files
- docs(DM-38): the build-log page and the registry entries for the data path
- feat(DM-38): pnpm dm:seed — Org #0's own board, written through the real store
- feat(DM-38): the board serves WorkItemPage, and a transition carries its note
- feat(DM-38): the board carries its links, and a move can carry its note
- feat(DM-38): a work item as it is served, in contracts where both ends can reach it
- feat(DM-38): the work ledger over HTTP — every write is a line, not a row
- docs(build-log): stamp the dock merge
- docs(build-log): stamp the floor merge
- docs(DM-41): the build-log page for the CoS dock, digest written
- feat(DM-41): the CoS dock — present in every room, and the refusal is the feature
- feat(DM-41): POST /v1/cos/ask — the route the dock talks to
- feat(DM-40): Field — the kit can be typed into, and the dock holds it
- docs(build-log): stamp the gate2 merge
- feat(DM-36): GET /v1/floor — the brief and the board, in one read
- feat(DM-36): follow a citation, and refuse everything else
- feat(DM-36): the Floor — tracker, brief pack, signals
- docs(build-log): stamp the embed merge
- docs(DM-24): the second-pass filename ruling, and this branch's build-log page
- docs(plan-status): Control's key-directive and retro-scheduling entries
- docs(DM-17): the build-log page for the stubbed embed path, digest written
- fix(DM-24): the build-log gate takes the first page it finds, and passes on the wrong one
- docs(DM-17): the registry entries, the READMEs, and the caveat in writing
- test(DM-17): the stubbed embed path, live, against Postgres and pgvector
- feat(DM-17): MOCK_MODE picks the embedder, and that is the whole seam
- docs(build-log): stamp the alloy signal-roles merge
- feat(vault): a priced model may have nothing on the other end to authenticate to
- docs(build-log): one colour, one job
- feat(DM-17): the caveat travels with the number, computed from the index
- docs(build-log): stamp the scribe branch-work merge
- refactor(DM-40): one colour, one job — split the signal family and enforce it
- feat(DM-17): the stub embedding provider — deterministic, labelled, zero-cost
- docs(build-log): stamp the shell merge
- style(DM-35): reword a comment that quoted Electron's own signature
- feat(DM-24): branch-work — the only check that can see the shared-checkout trap
- feat(DM-35): wire Alloy into the chassis, and register it
- docs(build-log): stamp the cos merge
- docs(DM-27): the build-log page for the Chief of Staff, digest written
- test(DM-27): 42 tests, the registry entry, and the CLI
- feat(DM-35): Electron chassis with an Electron-free renderer and a typed IPC seam
- docs(build-log): stamp the alloy merge
- docs(build-log): stamp the scribe merge
- docs(build-log): the third fixture, and the defect it found
- fix(DM-24): the pending marker is a prefix, not a whole line
- feat(DM-27): the Chief of Staff composes — plan, triage, spec-watch
- docs(build-log): the Alloy component kit
- chore(DM-40): register the kit's meters under S5
- feat(DM-40): Alloy component kit — tokens, primitives, both finishes
- docs(DM-26): the trust line's build-log page
- chore(DM-24): regenerate REGISTRY.md for the maestro-build-log title
- feat(DM-26): the trust line — fleet to CoS to human, and refusal by default
- fix(DM-24): resolve the operative from the branch, never from the typed scope
- docs: Control's DM-29 reconciliation and the wave-1-built-to-gate entry
- refactor(DM-26): one RecordingGraph, on @dark-matter/db/testing
- fix(DM-24): the doctor tells a one-command fix from an hour of archaeology
- feat(DM-24): verify.sh gates on a build-log page with its digest written
- feat(DM-24): a page can be written before the merge it documents
- fix(maestro): close the shared-checkout trap, and raise the grid to six
- docs(build-log): record whose work four mis-attributed pages actually are
- docs(build-log): the search index page
- docs(build-log): the Slack connector page
- docs(DM-18): what the 1.000 does and does not establish
- docs(build-log): the Linear connector page, and three scaffolds
- fix(identity): the graph double answers the two reads DM-18 added
- docs(DM-18): the registry rows, five named gaps, and the widened authority guard
- refactor(DM-25): split the write path from the read path, and trim the barrel
- feat(DM-18): POST /v1/ask, and the route-auth seam DM-23 will stand on
- fix(DM-24): watch.sh exits 0 on firing unless a caller opts in to 10
- feat(DM-18): pnpm dm:ask — the answer, the eval, and a refusal that exits 1
- docs(DM-25): the registry rows, four named gaps, and the ledger's own page
- fix(DM-29): a session that finished on the last line is not a timeout
- feat(DM-18): Ask v0 — anchor, expand, recall, cited answer
- feat(DM-25): the update verb — a title can be corrected, and the ledger keeps both sides
- docs(DM-29): the adapters' own page — the seam, the pin, and five named gaps
- feat(DM-29): the evidence-completeness eval, the registry rows, and the package's own page
- feat(DM-2)!: LedgerEvent gains work-item.updated — a title can be corrected
- feat(DM-24): the stop guard waits inline and hands back the event
- test(DM-29): the worktree lifecycle, the evidence pack, and dispatch end to end
- style(DM-25): prettier on the schema barrel
- feat(DM-25): the work ledger — every mutation is an event, state is a projection
- feat(DM-29): the adapter seam, and two backends behind it
- docs(DM-39): the build-log page — what CI actually did
- docs(DM-39): the DM-39 suite, its registry row, and three named gaps
- refactor(DM-24): watch.sh exits 10 when it fires, 0 when it times out
- chore(DM-39): claim workflow_job in the GitHub extractor, stating nothing
- feat(DM-39): CI jobs, and a watermark a running job can hold
- feat(DM-25): the work ledger's schema — events as truth, state as projection
- feat(DM-18): GraphStore.entities — hydrate a ranking without an N+1
- feat(DM-18): the model can be cited — provenance on reads, and a frontier walk
- docs(DM-14): the package README and the build-log page
- chore(DM-14): registry entries, two named gaps, and the root dm:decisions script
- docs(DM-13): the registry rows, three named gaps, and the extractor's own page
- feat(DM-14): the precision harness, the CLI, and the live suite
- feat(DM-13): pnpm dm:extract, and the run proved against a real Postgres
- chore(DM-24): regenerate REGISTRY.md for the stop-guard suite
- test(DM-13): the golden sets, the graph invariants, and what each source degrades on
- feat(DM-24): a Stop hook makes an unwatched turn-end impossible
- feat(DM-14): the extraction log, and a pass that resumes instead of re-paying
- feat(DM-13): the GitHub and Linear extractors, and the run that drives them
- feat(DM-14): threads out of the ledger, and the metered path to a verdict
- feat(DM-13): the extractor registry — two honest members, one key
- docs(DM-15): the build-log page records the DM-17 collision and what the auto-merge hid
- docs(DM-15): the registry rows, three named gaps, and the resolver's own page
- test(DM-15): the resolver against a real Postgres, and two defects it found
- feat(DM-15): the identity resolver — accounts into people, with the evidence attached
- fix(DM-17): parse the aggregate instant instead of typing it as a Date
- feat(DM-17): registry rows, the named gap, docs, and two defects found by running it
- feat(DM-15): identity assertions — the one place a person writes into the Brain
- test(DM-17): drop and rebuild, proved against a real Postgres
- docs(DM-9): the build-log page for the GitHub connector
- test(DM-11): both paths off an authored cassette, and into a real Postgres
- refactor(github): split the sweep from what a leg reads
- feat(DM-17): the index rebuild — projection, batched embedding, one command
- test(github,sdk): prove both connectors against a real Postgres, not a double
- feat(DM-11): the Slack connector — allowlisted channels, threads, and a guard that refuses
- feat(DM-17): the index table, and the two grants that build it
- docs(DM-10): the registry rows, the named gap, and the connector's own page
- feat(github): DM-9 connector — repos, pushes, commits, PRs, issues, reviews, runs
- feat(DM-10): the Linear connector — issues, projects, states, comments, and the moves between them
- feat(DM-17): price the embed model, with a sentinel where a price cannot exist
- revert(DM-11): back out the SDK ledger-double move — Quebec owns that one
- feat(DM-11): the SDK can refuse a delivery on volume, and lends its ledger double
- docs(build-log): DM-12 vault — the page its own operative could not write
- feat(sdk): let a connector read the response headers, not only the body
- feat(DM-10): the SDK speaks GraphQL, and its ledger double is part of the kit
- docs(DM-24): build-log page for the gate fix itself
- docs(DM-24): the task title line is where a brief declares what it owns
- docs(DM-24): build-log pages for wrench, sdk and graph
- fix(DM-24): a build-log page that documents the pending marker reads as unwritten
- fix(DM-24): the registry gate demands rows for tickets the brief only mentions
- feat(DM-12): make the doctor's llm-key and llm-budget rows real
- fix(DM-16): a retraction at the instant a fact began is a result, not a raise
- fix(DM-16): refuse a self-edge as a result, not as a driver error
- docs(DM-16): register the graph's suites and write down what it refuses
- feat(DM-12): BYOK vault — sealed key store, per-call meter, budget guard
- test(DM-16): prove the invariants against a real Postgres, not against types
- fix(DM-8): a poll moves past an event no retry could fix
- docs(DM-8): SDK README and registry entries, with the live gap named
- feat(DM-16): the graph store — assert, retract, and bitemporal reads under the grid
- test(DM-8): the toy connector, its recording, and the failure paths
- feat(DM-8): connector SDK core — auth seam, transport, normalization, harness
- feat(DM-16): L2 model graph tables — entities and edges, invariants as constraints
- feat(DM-24): callsign on the pane border, and docs for both directives
- feat(DM-16): the v1 ontology's rules — edge endpoint grid and per-entity attributes
- feat(DM-24): build-log.sh and a doctor row that notices an unwritten page
- docs(DM-24): backfill the build log for all nine landed merges
- feat(DM-24): NATO callsigns for operatives, drawn fresh at spawn
- fix(DM-22): a database with no migration table reads as unmigrated, not unreadable
- fix(DM-24): register under system maestro; harness is S4, not us
- feat(DM-22): /v1/diagnostics, the dm:doctor CLI, and the registry entries
- fix(DM-24): allocate the test's pty ourselves, not through script(1)
- refactor(DM-7): tighten the append path and stop paging a batch early
- chore(DM-7): register the ledger suites and document what replay guarantees
- fix(DM-24): one guard for every way latency.py can be called wrong
- feat(DM-22): the thirteen doctor checks, behind injected seams
- test(DM-7): prove byte-identical replay against a real Postgres
- chore(DM-24): regenerate REGISTRY.md for the floor-based latency metric
- fix(DM-24): time the hook's floor, so load cannot call a healthy hook broken
- feat(DM-7): append and replay the observation ledger
- feat(DM-7): observations table, append-only trigger, and its policy cells
- wip(doctor): DM-22 scaffolding — check vocabulary, env reader, http seam, db migration status
- fix(DM-24): say what silence means in the hook auditor's RUNS row
- fix(DM-24): order the hook's rows by who is waiting, and count operatives properly
- feat(DM-24): doctor gate for the inbox hook, and a watcher death it can name
- feat(DM-24): audit the inbox hook's own install, and document both layers
- docs: Control's rulings on the Overwatch escalation
- feat(DM-24): check the Commander's inbox on every prompt, not on remembering
- feat(DM-24): make the watcher refuse rather than pretend it is armed
- fix(harness): the doctrine rules no longer match their own source
- fix(harness): verify findings are one line each; the build log gets its own block
- fix(harness): doctor reads state at the maestro seat, not at whatever worktree it runs in
- test(DM-5): prove the generated SQL against a real Postgres
- feat(DM-24): register the harness, wire its gates into CI and the maestro skill
- chore(DM-6): register the queue conformance suites
- feat(DM-6): Queue interface with pg-boss and in-memory implementations
- feat(DM-5): dev-token auth, org provisioning, and the DM-5 registry entry
- chore(DM-4): regenerate REGISTRY.md for the api-chassis entry
- feat(DM-5): orgs/users/memberships schema with RBAC at the query layer
- fix(DM-4): report a failed shutdown instead of dropping it
- test(harness): regression cases for every bug that has bitten, and every doctor check
- chore(DM-4): register the api-chassis suite under S6 platform
- chore(DM-4): docker-compose Postgres and the api block in .env.example
- feat(DM-4): platform chassis — Fastify app, validated config, health, JSON logs
- feat(harness): verify.sh — verify-before-merge as a gate, not a habit
- feat(harness): doctor.sh — the harness reports its own brokenness
- fix(harness): guard four command substitutions that set -e kills silently
- fix(maestro): watcher missed 'done'; move worktrees out of the repo
- chore(DM-1): ignore .turbo cache in git, prettier and eslint
- feat(DM-3): registry schema, generator, and the foundation's own entry
- docs(maestro): document plugin hook rot and the check that catches it
- test(maestro): cover every check-plugin-hooks verdict and repair
- feat(maestro): add check-plugin-hooks.sh plugin hook auditor
- chore(DM-1): keep prettier and eslint out of .maestro, dist, coverage
- feat(DM-2): the seven envelopes as zod schemas with round-trip and rejection tests
- chore(DM-1): scaffold pnpm + turborepo workspace with strict TS, lint, format, CI
- feat(maestro): tmux agent harness, two-way channels, watcher, doctrine
- Initial commit: docs, CLAUDE.md, maestro tooling, env stubs