Changelog

Every release of the app, newest first. Every version is kept, and latest points at the newest.

  1. v0.1.2

    2026-10-27

    v0.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)
  2. v0.1.1

    2026-10-26

    v0.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)
  3. v0.1.0

    2026-10-26

    v0.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 registry stops 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 cos line 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 project opens 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, and blocked → 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 · blocked is 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 dm CLI 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 any ban 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