Board reads are faster on large projects, and the idea tool stops repeating the same project rules.
Loading the completed tasks on a large board is several times faster, with the same results.
Reconciling the board reads the completed tasks once instead of twice.
Slow database requests can now be traced to the part of PAPI that issued them.
The idea tool shows the full project rules once per session and titles after that, and still flags any idea that conflicts with a rule.
Full detail
Query_board_page no longer recomputes scope aggregates per call; the Done-set paging cost drops from about 17 s to 2.5 s with byte-identical results.
Board_reconcile prepare reads the Done set once and reuses it for the cross-check.
Reader join key on database timing; query_board_page is tagged for pg_stat_statements attribution.
Idea names its readers and returns conventions as titles after the first idea in a session; the conflict warning still appears.
v0.402.175
Planning sends less text: the branch and drift rules load only when they apply.
The branch-coherence rule loads only when the board spans more than one module.
The priority drift check names its three signals once, without repeating the recalibration text.
Full detail
The branch-coherence rule loads only when the board spans more than one module; the drift check no longer repeats the recalibration text.
v0.402.174
Planning and orient send less text per call, and the planner keeps standing release rules in conventions.
The plan board is capped at 12 KB, and the planner skips the audit-classification rule unless a task needs it.
The carry-forward says only what changed this cycle; standing release rules live in conventions and are sent once.
Full detail
The plan board section is capped at 12 KB, and the audit-classification rule loads only when a task title needs it.
The carry-forward keeps only what changed this cycle; standing release rules belong in conventions.
v0.402.170
PAPI now records how each tool call went, so cycle timing and failures can be measured.
Every tool call records its size, outcome and cycle, so per-cycle numbers can be read directly.
A failed release or cycle closure now records why it failed.
Full detail
Every tool call records its response size, outcome and cycle; cycle_performance reads the per-cycle numbers.
Failed tool calls and release steps record a redacted reason; orient shows the last release failure when the edge serves it.
v0.402.169
Board and planning replies are smaller, and editing a task's handoff no longer means regenerating it.
The task board shows fewer columns by default; ask for the full table when you need it.
Editing one acceptance criterion or handoff section no longer regenerates the whole handoff.
The planner leaves out other members' tasks, and its reply is smaller.
Orient and the build start reply are smaller, with the same warnings.
Full detail
Board_edit changes acceptance criteria and handoff sections in place, logged to task history.
Another member's tasks stay out of plan prepare.
Plan prepare keeps instructions for the triggers present and caps its large data sections.
The tool list drops restated text, with a byte budget test.
And board_view is compact by default; orient and build_execute send less.
v0.402.168
A new project starts on a light setup, and reviewing several tasks takes one step.
A new project starts with fewer steps and turns on more as it grows; any setting you chose stays as you set it.
Orient shows how long tasks have waited for review.
One review call can record verdicts for several tasks; each still needs your own verdict.
Optional warn-only guards can be installed for your AI client, and nothing turns on without asking.
Full detail
The ceremony ruling table records which steps are promises and which are optional, with defaults per preset.
Capability presets; a new project starts on a light path, and explicit settings always win.
Orient shows how long tasks have waited for review; review_submit records several verdicts in one call, each still needing its own human verdict.
Opt-in, warn-only guard hooks behind the skills installer.
v0.402.167
Structured output from a planner or handoff generator is accepted with or without a code fence, and the prompts now say which form to use.
Handoff and plan apply accept the structured output whether or not it is wrapped in a json code fence, so a bare JSON block no longer fails with a generic parse error.
The handoffs-only and handoff generator prompts name the json code fence explicitly, so callers send the expected envelope.
Full detail
handoff_generate apply and plan accept the structured output whether or not the JSON after <!-- PAPI_STRUCTURED_OUTPUT --> is wrapped in a json code fence. Bare JSON previously failed with a generic "Could not parse structured output" error. The handoffs-only and handoff generator prompts now name the code fence.
v0.402.166
A cycle whose finished work was squash-merged, or later replaced by other work, can now be closed with a verified, recorded correction instead of hand-edited records.
Closing a cycle accepts a correction naming the commit that actually landed each piece of work, and checks it against your repository before it counts.
Work that a later change replaced can be closed as superseded, naming the change that replaced it.
Every correction is recorded on the task with who made it, when, and why, and finishing a build without its commit or files now warns you straight away.
Full detail
close_cycle can close a cycle whose accepted tasks landed through a squash merge with an incomplete or pre-squash build receipt, or whose files a later task removed. A new receipt_corrections input names the commit that actually landed each task; it counts only if the caller's checkout proves it is on the fetched base, names the task, was not reverted and kept its files, or, for a supersession, that a named Done task's commit removed them. Each accepted correction is written to the task's notes with who, when, the previous receipt and the reason, listed in the close_cycle output (supersessions separately), and marked on the CHANGELOG line. Uncorrected tasks are proved exactly as before. build_execute now warns at completion when a finished build records no commit or no files, since closure cannot prove it later. npm run papi:close-cycle takes --receipt-corrections <file.json>.
v0.402.165
A large board now loads in a handful of pages instead of dozens, so board reconciliation returns inside its time budget on a mature project.
The board reader asks for pages of 1000 rows instead of 100, so a 4,700-task board takes about five calls rather than about forty-seven.
Selection, ordering and filters are unchanged, and the same candidates come back in the same order.
Measured on the PapiUI board, a 1000-row page takes 752 ms against 587 ms for 100 rows.
Full detail
board_reconcile prepare can read a mature board in bounded large pages. The hosted compatibility reader asked the canonical board query for 100 rows at a time, so a ~4,700-task board cost ~47 sequential calls at ~550 ms each and still hit the 30s deadline. The page-size ceiling moves from 100 to 1000 (measured on the PapiUI board: 752 ms for 1000 rows against 587 ms for 100), turning the full read into ~5 calls. Selection, ordering, filters and the response shape are unchanged.
v0.402.164
board_reconcile prepare on a mature board no longer pays for full-row reads it never uses, and a refused board read no longer surfaces as an orient failure.
The cycle-integrity check and the code-ahead mismatch check now share one compact board snapshot instead of making two separate full-row reads of every task on the board.
The Done cross-check reads only id and title, and the active read is compact, so notes, handoffs and build reports never ship to checks that do not use them.
The reconciliation report is unchanged, with the same candidates in the same order, and no truncation, cap or deadline change.
Full detail
board_reconcile prepare no longer pays for unprojected full-board reads. Its cycle-integrity check and code-ahead mismatch check now share one lean health snapshot, the Done cross-check asks for the four-field duplicate projection, and the active read is compact. On the hosted PapiUI board this replaces two full-row reads of ~4,700 tasks each — the calls that held the live run at the 30s deadline, while compact pages themselves measured ~47ms — with one small payload. The reconciliation report is unchanged.
v0.402.162
board_reconcile prepare stops reading full rows for its Done-task cross-check on a mature board, and a refused board read no longer surfaces as an orient failure.
The Done-task cross-check now reads only id and title instead of every full row, cutting the heavy-column reads in reconcile prepare on a 4,600-task board.
The reconciliation report is byte-identical on the real board, same candidates and same order, with no truncation, cap or deadline change.
A board page refused for lack of a search slot is retried inside the call, covering the first page, windowed pages and the sequential fallback, and the health summary no longer runs its two reads at once, so orient survives transient contention on a large board.
Full detail
A board read refused for lack of a search slot is retried inside the call instead of surfacing as a failure. The retry covers the first page, every windowed page and the sequential fallback, and honours the proxy's stated retry-after; the health summary's two board reads now run one after the other. This fixes an orient crash or degraded summary under its own concurrent readers on a large board, which the wave reads had widened.
board_reconcile prepare no longer reads full rows for Done tasks. The "Already Done?" cross-check only reads each done task's id and title, so the Done read now uses the existing compact shape: on the hosted PapiUI board that drops ~21.5 MB of notes, note entries, handoffs and build reports, and with it the ~68% of the run this single call was spending. The reconciliation report on the real board is byte-identical (same sha256), candidate order is unchanged, and there is no truncation, board cap or deadline change.
v0.402.160
A release can no longer ship a version whose tag never reached the remote, and the edge deployment has one named owner.
Recording a release version now checks the remote for its tag, so a version claimed without one is refused instead of silently recorded.
Ownership of the data-proxy edge deployment is settled in writing against the code: promote.sh decides when, scripts/deploy-edge.sh does the work, and nothing else deploys it.
Full detail
A release can no longer record a version whose tag is missing from the remote. The collision gate can prove a version was actually published (--require-tag reads refs/tags/vX.Y.Z over git ls-remote, prefers the peeled ref, and fails closed when the remote cannot be listed), and a failed tag push during a release is an error instead of a warning.
Settled who owns the data-proxy edge deployment, verified against the code: scripts/promote.sh owns WHEN, scripts/deploy-edge.sh owns HOW, scripts/lib/edge-activation.sh owns only the deploy decision, and the CI artifact workflow owns none of it.
v0.402.159
Large boards load faster, and slow database reads and failed build-report writes now say where the time went.
Reading a large board for orient and idea no longer waits on one page at a time, so both respond sooner on a project with thousands of tasks.
A slow reader or a failed build-report write now records which stage it was in and how long it took, so a one-off failure can be diagnosed afterwards.
Full detail
Cut the cost of the dominant database reader behind slow orient and idea on a large board. Each reader is now attributed separately (stage label and duration), and the board-page reader that dominated the time is windowed instead of read one page at a time. Mandatory orient readers stay uncapped (AD-96); only best-effort readers are bounded.
Time the build-report write path per stage and carry the stage and duration on the failure record, so a one-off write failure can be diagnosed after the fact.
Rank database query shapes by (stage, shape) and state which timing basis is real, instead of ranking by shape alone.
v0.402.158
The server no longer changes your database when it starts, and says exactly what to run when the schema is missing.
Starting the server only checks the schema; it never creates or alters tables, so a start can no longer deadlock beside live writes.
A missing or outdated schema stops the server with the command that fixes it, and a new init command sets up an empty self-hosted database.
Full detail
Stop creating and altering tables at server start. The server now only verifies the schema (one read-only catalog query) and, when it is missing or behind, stops with the command that fixes it; applies every migration to an empty database and records the ledger, and refuses a database that already has a schema. The built-in 35-table schema (against 103 tables from the migrations) and its startup ALTER statements, which deadlocked beside live writes, are removed.
v0.402.157
Review becomes a step with its own brief, and OAuth sign-in survives a lost response.
Every task in review now has a brief to review against, and release lists any task that never got one.
Refreshing a sign-in is atomic and tolerates a retry after a lost response, so fewer forced re-connects.
Recorded build tokens show on the task and in the AI usage report; the admin view counts multi-builder projects per week.
A version-collision check now guards pull requests and release tags.
Full detail
Add review_task, which returns a review brief for a task in In Review (what to review against, the decisions and conventions that bind the change, earlier rework in the area, what the build report claims) and records that a brief was issued for the current build. The task sheet shows a "Review brief" line once one exists.
Say the same thing on every surface that puts a task In Review: call review_task, then review_submit once it has been reviewed, then release. One shared sentence, pinned by a test, in the tool responses, shipped templates, skills, llms files and public docs.
At release, list the cycle tasks with no review brief for their current build, and narrow the release PR review to the integrated diff only. Listing and guidance only; it never blocks a release.
Make OAuth refresh rotation atomic and log why a grant was rejected (distinct reason codes, no token material). A retry within 10 seconds of a lost response gets a fresh pair instead of revoking the chain; reuse outside the window revokes the chain; a database error on the lookup is a server error rather than invalid_grant. Adds the rotate_oauth_token function and a prev_refresh_hash column.
Record a client's self-declared name only after initialize has validated its bearer, so an unvalidated bearer cannot write the name cache or the data proxy.
Add a version-collision gate (scripts/check-version-collision.mjs) to the local gate and PR CI: the version-bearing files must agree, and a changed version must be above main's and different from any open PR's; --tag fails if the tag already exists.
Score the idea-capture AD conflict flag by how distinctive the shared words are, and show the matched words, so a long idea no longer matches an unrelated decision on common words.
Cut the cost of board_reconcile preparation on a large board (about 7.0s to about 1.3s on a synthetic 3,700-task board) without changing its decisions. The hosted timing is checked at release.
Add handler tests for the existing planning_log tool (view, edit, delete with confirmation, invalid ids, missing adapter methods).
Reset every git mock between review tests so they pass in any order.
Show recorded build tokens on the task Build tab and in the Insights AI usage report, with Not recorded where nothing was sent.
Add the S6 metric to the admin activation view: projects where two or more people finished builds in the same ISO week, owner and employee accounts excluded.
v0.402.156
Plans show open dependencies, bugs land on the board, and the design system reaches every AI client.
See a task's unfinished prerequisites before choosing a cycle, in the plan and its preview.
A bug, research or spike item filed with an explicit type lands on the project board, not a personal queue.
The project's design system is delivered to plan, build, review and orient, and shown on Strategy > Design.
Full detail
Show recorded task dependencies that are still open before a cycle is chosen: on the compact board line, in the plan context and in the plan preview, read by id so a large board is never scanned.
File a bug, research, spike or discovery item on the project board when its type is explicit, even without a module, instead of routing it to the personal action queue.
Let MCP clients sign in and refresh their session using the server's canonical address.
Research findings on verifying a client's workspace against its bound project (no behaviour change).
(partial): Deliver the project's design system (the document tagged canon:design-system, else DESIGN.md) to plan, build, review and orient, and read the same document on Strategy > Design, with clear private and not-stored states. Editing it from the dashboard is not built yet.
(partial): Check task ownership when a plan is previewed, so a plan can no longer assign work that belongs to another member. Keeping such tasks out of plan preparation is still open.
(partial): Say how large the plan context really is when it is over budget and name the largest parts. The payload itself is not smaller yet.
v0.402.155
Builds now record when they started, which tool built them and how many tokens they used.
A build's start time and the tool that made each call now survive a server restart, so duration, tool-call counts and the tool name are no longer lost.
Starting a build lists the details to send when completing it, and a completed build says exactly which were left out and how to add them.
Plan, review and release calls can carry the tokens used since the previous stage, and each response says how to collect them.
The new usage-reporter skill reads token counts from your AI client's own local transcript, numbers only, and reports Not recorded when it cannot.
Full detail
Read a build's start time from the task's own history instead of process memory, so started_at, build duration and the tool-call window are no longer lost when a server restart falls between starting and completing a build.
List the details to send at completion (model, tokens, commit, acceptance results, handoff accuracy) in the build start response, with the build window already filled into the usage command, and name every detail a completion left out.
Remember each connection's MCP client name on the server, so the tool that made a call is still named after a server restart or on another instance.
Accept an optional stage_usage (tokens, model, window) on plan, review_submit, release and strategy_review, and end each of those responses with the exact usage-reporter command and window for the next stage call. The server stores what is sent and never estimates.
Use the agent label as the build's author when the server cannot tell which MCP client called.
Add the usage-reporter skill: it sums token usage from the client's own local transcript (numbers only, no prompt text) and reports Not recorded when it cannot.
Rework the hub: Needs you, Work (board and list), Team and Roadmap views, icon pips on cards and rows, Built by and Built with on every card, a task sheet laid out as Plan, Build, Review, Release and History, release branches with Held by chips, a Connections table per harness, an Import sheet and a What AIs read preview.
Unknown1 release
v0.402.154
Plans respect who owns a task, and an oversized plan context is described honestly.
Check task ownership when a plan is previewed, so work that belongs to another member is not assigned.
Say how large the plan context really is when it is over budget, and name its largest parts.
Full detail
Check task ownership when a plan is previewed, so a plan can no longer assign work that belongs to another member; the planner prompt also states the rule.
Say how large the plan context really is when it is over budget, name the largest parts, and stop claiming it was kept under the budget when the core selection context alone exceeds it.