Skip to content

v54 (beta) - #5036

Draft
zbeyens wants to merge 828 commits into
mainfrom
next
Draft

zbeyens wants to merge 828 commits into
mainfrom
next

Conversation

@zbeyens

@zbeyens zbeyens commented Jun 17, 2026 •

Copy link
Copy Markdown
Member
  • Auto release

@codesandbox

codesandbox Bot commented Jun 17, 2026

Copy link
Copy Markdown

Review or Edit in CodeSandbox

Open the branch in Web Editor • VS Code • Insiders

Open Preview

@changeset-bot

changeset-bot Bot commented Jun 17, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: a04bf5d

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@zbeyens zbeyens changed the title Plate 54 (beta) v54 (beta) Jun 17, 2026
@vercel

vercel Bot commented Jun 20, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
plate Ignored Ignored Preview Oct 19, 2026 1:42pm UTC

Request Review

zbeyens and others added 30 commits October 25, 2026 03:06
Writes 525 units from the last 39 compile batches into the research
pages they belong to, without a second reader, the same way as the
earlier groups. Five plate-notes pages, a Typora page and a Wordgard
page start or continue in new parts.

Beyond the ask: nothing.

Shipped fast, no review.

Session: local_3b346f54-b80a-48ae-817e-84a5fd143386
Three Codex law readers placed the 93 law units that the compile
batches found under their Markdown editing spec sections. They merged
repeats into existing rules and picked free IDs, which adds 82
proposed rules, for 163 in all. The Search And Find-Jump note now
names the Find bar's selection seeding, so the Search seeding drift
bullet in current-evidence.md is gone, and the comment and suggestion
family row there names its current proof.

Beyond the ask: the Search note correction, which law reader a found.

Shipped fast, no review.

Session: local_3b346f54-b80a-48ae-817e-84a5fd143386
Plan: docs/plans/2026-10-24-research-loop.md
… plan

Deletes compile.mjs, its test, kb's fold, write, resolve, quote and
pins verbs, the K15 check and the empty docs/research/folded.tsv. The
compile was their last user. The homes index and the K14 no-home check
move to homes.mjs, with their tests in homes.test.mjs, so kb homes
works as before. The research loop plan closes partial. Its Close names
what landed and where proof stops, and step 3.4's trial waits.

Beyond the ask: nothing.

Shipped fast, no review.

Session: local_3b346f54-b80a-48ae-817e-84a5fd143386
Plan: docs/plans/2026-10-24-research-loop.md
Triage of udecode/plate issues lived in four places, and nothing recorded
that an issue was triaged, on which model, or against which issue text.

The Triage playbook now owns the method. `triage` and `triage label:<label>`
work the open queue, `triage #N` takes one issue with its neighbors, and
`triage fix #N` triages N's group, then goes on into a Bug fix run.
`pnpm triage` is the only writer of docs/triage/issues.tsv. `show` prints
each issue with numbered lines and says whether the session can record.
`record` takes a call only from the root session of a person's own Claude
or Codex launch, whose every turn ran on Opus or Sol at xhigh. It takes an
issue only when every line `show` printed for it reached that session's
tool results. A
record goes stale when the issue text, owner code, duplicate target, task
or method changes, and two records made at once show a conflict. `queue`,
`labels`, `mark` and `check` serve the global run, the `triaged` label,
comment drafts and `pnpm check`.

maintainer keeps GitHub I/O: issue drafts, Slate issues, PRs, security,
the queue snapshot and the truth gate. Bug fix runs `pnpm triage show` and
the live claim check before it reproduces a public issue. The shared lead
reader from dotai now ends a background call at its task notification or
at its output file's exit line.

Beyond the ask: none

Claude Code and Codex sessions on Opus or Sol at xhigh can record. A
session below that, a subagent, a nested `claude -p` and a Codex child
thread still triage and draft, and name each issue they could not record.
Every committer's `pnpm check` runs the register's shape check.

Session: local_1b552554-ec6a-42f7-9a92-d4db36d2d438
Plan: docs/plans/2026-10-24-issue-triage.md
cross.mjs now waits for stdout and stderr to drain before it exits, so
a Codex reply longer than 64 KB reaches its caller whole. On macOS the
old exit cut piped replies at 65,536 bytes. Both runtimes' sessions
that run a cross.mjs seat or reader gain whole replies; nothing else
changes for any committer. The sync renders dotai 62bba2c, which is
6206d2c plus this fix. The research loop plan drops its cross.mjs open
item and lists ellie and plate, which this sync leaves for their next
run.

Beyond the ask: the cross.mjs fix, which this plan's compile hit twice.

Shipped fast, no review.

Session: local_3b346f54-b80a-48ae-817e-84a5fd143386
Plan: docs/plans/2026-10-24-research-loop.md
Renders the dotai commit that ranks issue-backed tasks first within a
priority and makes the push guard deny bash -e -c, bash -c -- and
forced matching or wildcard pushes of next. Closes the triage plan,
with its lesson panel, its Reflect section and its five P0 cards.

Beyond the ask: the two guard fixes, which the lesson panel found.

Session: local_1b552554-ec6a-42f7-9a92-d4db36d2d438
Plan: docs/plans/2026-10-24-issue-triage.md
… round 1

natamox said all three pages are ready to test, so they leave Held pages
for Sessions with the number, tester and browser they held. Date and find
go to Sin on the iPhone and suggestion to natamox in Chrome. The schedule,
scope and brief counts follow: 120 sessions and nine held pages.

Beyond the ask: none.

Session: local_3cc6e510-e427-4247-99e0-81e361ce4c00
Plan: docs/plans/2026-10-19-sweep-r1.md
natamox asked to run both sessions, so they move from Sin to natamox and
keep their number and browser. The schedule moves their 16 session
minutes and two find-note minutes with them.

Beyond the ask: none.

Session: local_3cc6e510-e427-4247-99e0-81e361ce4c00
Plan: docs/plans/2026-10-19-sweep-r1.md
The knowledge page at Cp3hdNMXy9EvTQR7MQaNu3 no longer opens, so the
subject's Page: line points at a new page, 2DJZ9eDVACXLPG6BJ29kXy. The
research loop plan records the move as a Defaults row whose word,
"drop the new page", reverses it. Its decision log gains the ship rows
for the cross.mjs sync land and this move.

Beyond the ask: nothing.

Shipped fast, no review.

Session: local_3b346f54-b80a-48ae-817e-84a5fd143386
Plan: docs/plans/2026-10-24-research-loop.md
…opens

Syncs dotai 85392bf. When a plan page's publish fails because the page was
deleted, or another claude.ai account owns it after an account switch, the
lead now makes the new page without asking the owner.

- .claude/settings.json runs `page-stop.mjs --hook` as a PostToolUseFailure
  hook on Artifact. On the tool's not-found error it tells the lead to rerun
  the page-stop command with --new.
- page-stop.mjs prints that rerun beside every publish to a recorded link.
  --new names the link it replaces and records it as gone for every worktree
  of the clone, so the next publish goes to the new page instead of making
  another while origin/next still names the dead one.
- The plan-page skill and rules/pages.md say to run --new without asking,
  and the rules table pairs that rule with the hook and the tests.
- The pstack subject page moves to a new link, because the previous one was
  not found after an account switch, and the triage plan's Defaults row
  names the old and new links.

Beyond the ask: the plan-page render stops listing other worktrees' Page:
lines, and step 8 drops the route that read them, because most of those
lines were dead links and pages.md already sent the lead to --new.

Session: local_1b552554-ec6a-42f7-9a92-d4db36d2d438
Plan: docs/plans/2026-10-24-issue-triage.md
Step 3.4 of the research loop plan asked whether telling every workflow
to start from `pnpm kb` gives better answers. It ran four questions, two
fresh read-only sessions per question and arm, and a blind grader scored
them against 58 keys. Arm A, without phase 3's lines, scored 46. Arm B,
with them, scored 44, so the plan's pass rule failed and phase 3's lines
come out of research, Plan, Verdict, Bug fix, Perf issue, best-api and
sweep triage.

Agents in Claude Code and Codex are no longer told to open each workflow
with the lookup. Anyone can still run `pnpm kb`, which is unchanged.
Research still runs one `pnpm kb discover` search per new task or
verdict, adds each repo it reads or skips to `docs/research/repos.tsv`,
and writes findings and rejected leads to the area page. Bug fix and Perf
issue point at every part of the split plate-notes pages.

The plan closes, and `docs/plans/topics/knowledge.md` now holds the
layer's current state, its prior art and its open work.

Beyond the ask: the revert keeps research's search, repo rows and
write-back, which the trial never ran, because phase 1's freeze leaves
research no other committed home; restored lines that pointed at the
frozen run folders now name the area pages; and `docs/research/schema.md`
gets back the run-ledger sentence phase 3 cut.

Session: local_ae687136-56d8-4673-b635-769cd64a2c01
Plan: docs/plans/2026-10-24-research-loop.md
The research loop plan's decision log gets the ship row for a440862,
which landed step 3.4's revert and the plan's close, so the log records
the commit and the check run that carried them.

Beyond the ask: none

Session: local_ae687136-56d8-4673-b635-769cd64a2c01
…t once

Two peers editing a paragraph that holds a link could both end with two copies of it. The editor keeps an empty text on each side of a link, but storage often lacked one: a joining peer's import deleted it, inserting a link never wrote it, and a split could leave a line without one. Every reader that pairs stored and editor children by position then refused the paragraph and rewrote it whole, and two concurrent rewrites both survived.

Neither Yjs import deletes a text inside an element any more. Before a local edit is written to storage, the binding writes an empty text into each gap of the blocks the edit touches, and after an edit that adds or removes nodes it does the same for the result before the caret is published. In a schema with content roots, whose root rewrite compares every block, it fills every block before that rewrite. It deletes no text, and it skips a block it already checked until a peer's update does more than type into stored texts. A link inserted after an empty text lands after the stored empty text, so adding and removing links no longer stores one more empty text each time. A read inside a lowering finds each referenced node through the root's index instead of walking the document. The core correction drops an empty text beside an inline where a lettered text shares its run, and a caret at the start of a lettered text stays in that text. The saved rich-text playground loses its empty text after the suggestion link, so its comment range moves one child left.

Beyond the ask: typing beside a link now survives a teammate's join, Enter after a link reaches every peer, a caret beside a link a teammate just inserted publishes, two peers removing pieces of a split link leave both removed, and every editor drops an empty text beside a link where letters share its side.

Enter while a teammate types at the start of the text after it still loses that letter, as before. A document saved by an earlier beta loses such an empty text when it loads, so a comment range saved after it in that paragraph points one child too far.

Session: local_a33882c1-c5eb-4565-a740-d3803d4b74dc
Plan: docs/plans/2026-10-24-collaboration-empty-text-runs.md
The paired-timing runner printed a verdict while a planted arm read 31% away from the slowdown it planted, so the line measured something other than the plant. Each planted arm now names the ratio its slowdown plants, which must be past the budget. A cohort whose planted arm reads further from that ratio than the ratio's distance to the budget plus the same-code noise is inconclusive. The benchmark rule, its methodology and the enforcement table say so. The plan of the Yjs link race fix gains its reflect record and two Open work items.

Beyond the ask: the benchmark rule drops two sentences about a host load limit, which the runner already refuses.

Session: local_a33882c1-c5eb-4565-a740-d3803d4b74dc
Plan: docs/plans/2026-10-24-collaboration-empty-text-runs.md
… calls

Each triage record now saves the GitHub login gh is signed in as. A record by a login outside triage.owners in .agents/pstack.json, today only zbeyens, reads unconfirmed until an owner records the issue again, so the owner checks every call another person's session makes, its priority included. pnpm triage queue lists unconfirmed issues only for an owner, because a contributor's own records would otherwise come back in their queue on every run, and labels keeps the triaged label off them. show prints who opened each issue.

Beyond the ask: none

Session: local_1b552554-ec6a-42f7-9a92-d4db36d2d438
The research loop left three cleanup lists and three rule ambiguities in the knowledge subject's Open work. Codex readers sorted the 438 rewritten or removed old compiled units against HEAD. The 12 that needed restoring repeat five claims about LSP, VS Code providers, EditContext and lightweight textareas, and each one is checked at a pinned clone and written to its area page. The other 425 units differ only in pins or spacing and are dropped. The four stale pages the trial named now match the code. The fifth item, collaboration.md, was right as it stood. Of the 28 old compile findings, 20 close here: public docs (DOCX install, editor.read inside an update, readonly type listings, the history policy check, tx.value.replace resetting history, schema.content.open, image URL paste, with their Chinese twins), research and subject pages, moot ones and ones already fixed. The other eight need code, tooling or data work and stay in the knowledge Open work.

Rules, for Claude Code and Codex sessions alike (both runtimes smoked over four rounds):
- A session in a worktree clones a missing repository beside the main checkout, never into .claude/worktrees.
- An R5 sweep session loads research with the round plan's comparison as its question. It writes each editor's facts to that editor's area page and cross-editor comparisons to editor-architecture/. Each gap stays a find that Triage sends to verdict.
- An open design question becomes a chips decide task only when chips.md's Offer allows one, and otherwise goes where Offer lists unofferable findings. An evidence or contradiction gap stays an open question on the page it blocks.
Committers lose nothing. Docs readers get an import command that installs jszip and an editor API page that matches the types.

Beyond the ask: verify.mdc's Sweep line now names running a sweep session. research's maintain mode routes a setup-defect task through chips' Offer. The DOCX home README names its existing page, and that page's dead related link points at the imports subject.

Session: local_3b346f54-b80a-48ae-817e-84a5fd143386
pnpm triage record refused a session that may not record before it read a single row. A session at the wrong model or effort could triage and draft, but it could not learn whether its batch would pass. record now checks each row's issue number, columns and detail before any fetch or session check, and a dry run that the session check refuses says how many rows passed. The Triage playbook's Who records says a session that cannot record still checks its batch this way.

Beyond the ask: the whole change, a workflow fix the P0 triage run needed because its session may not record

Session: local_1b552554-ec6a-42f7-9a92-d4db36d2d438
natamox's retest of /docs/date and /docs/find on 2026-10-25 kept one
find: the date calendar ignores the first Escape and the first click
outside it, while platejs.org closes on the first. natamox published
it as #5317. A click on the date sets a flag that only a press on the
date clears, so onOpenChange drops the next close. The date domain
holds only this P2 kind, so it gets no task.

Beyond the ask: the find bar that covered its match on /docs/find goes
to Not bugs yet, and the caret-less click below the text, which looks
like #5227, goes to Open work with natamox as owner.

Session: local_3cc6e510-e427-4247-99e0-81e361ce4c00
Plan: docs/plans/2026-10-23-sweep-loop.md
The full triage reads each open udecode/plate issue in the queue and records one call per issue in the register. A fix run can then start from each issue's scope, priority, owner lines and missing test, or from its spec question or the repro it still lacks. This commit holds the native, clipboard, editing, selection, authored-review and documents groups.

Beyond the ask: none

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
The full triage records one call per open udecode/plate issue in the register. This commit holds the history, collaboration, pagination and drag-and-drop groups. Two v1 reports, the Yjs selection hook and the dnd-kit handle caret, wait for a repro on next, because next rebuilt the code they name.

Beyond the ask: none

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
The full triage records one call per open udecode/plate issue in the register. This commit holds the API and UI groups and finishes the queue, so every open issue it lists now has a record. One v1 table report waits for a repro on next, because next's editable no longer has the DOM point error it names.

Beyond the ask: none

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
…ister

`pnpm triage labels` prints the commands that make GitHub match the triage register. It now also sets the org's native Priority issue field from each current kind record (P0 Urgent, P1 High, P2 Medium, P3 Low), and it adds or removes the needs reproduction, duplicate and enhancement labels so they match each current record's outcome. It reads the field and each issue's value through batched GraphQL and looks up the field and option IDs by name. When the org lacks the field or one of its options, it refuses before it prints anything. It still runs no write. The triage playbook's Drafts section now says what the command syncs.

Beyond the ask: REOPEN_BATCH is now GRAPHQL_BATCH, because both GraphQL reads use it.

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
… the issue

A triage comment that restates the issue's own cause, or only confirms it, adds noise to a public issue. The triage playbook's Drafts section now says a kind record gets a comment draft only when triage found something the issue lacks, such as a cause the issue left untraced or a different owner. Otherwise nothing is posted, and the triaged label and the Priority field carry the call.

Beyond the ask: none

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
A triage comment on a bug should let a person or an agent start the fix without tracing the cause again. The triage playbook's Drafts section now says every draft follows technical-writing and links each code location to a permalink pinned to a commit, because line numbers on next drift. A bug comment has up to four bold-led parts: Cause with its linked code, Not traced, Open decision and Test as numbered steps with the expected result. It leaves out any part that has nothing to say.

Beyond the ask: none

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
When accepting every pending suggestion leaves a root or a quote short of
lines, the review preview adds empty lines that nothing stores. The recorder
matched stored lines to preview lines by shape, so a letter typed at the end
of a line a pending join pulls up landed in the empty line below it, or the
framed law threw, as in PR 5218 and in a root that needs three lines with
two joins. The preview also drew a caret stored at the end of that line in
the empty line, one line below where edits act, and a plugin write after
such a line stored a document that accepted to something else.

The resolver now hands the map the lines it built, and the map sets them
aside before it matches, so typed letters stay in the joined line with the
caret after them. The preview draws a caret in an added line only while its
own placement there stands, and edits at that caret act on the line above.
The ledger compares every window that held an added line with what the
commands wrote and refuses a mismatch as diverged, or reordered when only
the order differs. Accepting may drop added lines left over at the end, so
Enter at the start or end of a joined line and a two-line paste at its end
split the line. A write inside an added line records that whole line, so a
plugin write that types there and then adds or moves a line records what
the editor showed.

Beyond the ask: the preview's caret rule for added lines, Backspace at a
caret placed there deleting the last letter of the line above, Enter and
paste at a joined line's start or end now recording, and the refusal of
three writes next stored, each found by this work's diff panels.

Session: local_064bce27-9b78-411a-b33b-bea4f86194d4
…ed subject

The framed-recording, joined-line-end and added-line caret plans landed in
6a059d1 and 90166d7, so each now has its Close and reads executed. The
authored subject gains their rules: completion's struck element, the join
that reads pending content, and how the preview, the recorder and the
ledger treat the empty lines a preview adds. It also gains the added-lines
layer row, the alternatives the plans rejected, the ProseMirror changeset
reading and their open work, and it drops the item for the two recording
laws that t_820a6175 fixed.

Beyond the ask: none

Session: local_064bce27-9b78-411a-b33b-bea4f86194d4
Synced from udecode/dotai ed87f9c6. cross.mjs now reports a runtime still
running at its deadline as "no answer within N seconds", followed by the
last lines it printed, whatever it exits with once stopped. A panel seat
that exited 143 on SIGTERM used to read as "exit 143", and one that wrote
an answer while stopping read as a success. A runtime that fails before
its deadline keeps its own exit code and output.

Claude Code and Codex leads both gain it, in every panel round seats.mjs
runs and every cross.mjs call.

Beyond the ask: none

Session: local_064bce27-9b78-411a-b33b-bea4f86194d4
The added-line caret plan gains its Reflect section: four Backlog items
for the owner and the findings the lead rejected, with each reason. Its
Deviations now give the base and head timing of the React caret test
whose cases timed out while landing: about 6% slower at head, with its
slowest test far under Vitest's deadline.

Beyond the ask: none

Session: local_064bce27-9b78-411a-b33b-bea4f86194d4
Plan: docs/plans/2026-10-25-authored-added-line-caret.md
90166d7 shifted the code both records cite, so their records went stale and `pnpm triage labels` skipped them. The cited blocks are unchanged, so each issue keeps its call: #5194 stays P1 at record.ts:3413 and ledger.ts:1256, and #5274 stays P0 at authored.ts:2075 and authored-changes.tsx:604.

Beyond the ask: none

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5
A full triage run ended with records and labels but offered no fix runs, so its calls never reached the chips board. Only the sweep offered one fix run per domain. The Triage playbook now owns that step and the fix it leads to. Once records land, each domain with a P0 or P1 kind gets one fix-run task through chips. `triage fix <domain>` runs one Bug fix run over the domain's issues, and a redesign run when two kinds share an owner. The miss-class table moved from sweep.md into the playbook, because triage assigns the classes and the fix run closes them. sweep.md keeps the rounds, the tester and fixer handoff and the tier order between domains, and links to the playbook for the rest.

A read-only smoke ran in Claude Code and Codex. In both, a full-queue request routed to the offer step and an area request to one grouped fix run, and a single-issue report stayed on the Bug fix playbook. Anyone who runs triage in either runtime now gets the offers, and the sweep's fixer runs `triage fix <domain>` in place of its own steps. No entry point was removed.

Beyond the ask: from the smoke's findings, an issue an open task already names stays with that task, so a domain task never repeats one, and a task's own issues stay in its group even when they belong to another domain. The Fix steps also say what a session that cannot record does, because a domain task at high effort cannot write records.

Session: local_0a6831be-5f8a-400f-85cc-d51ccf1907e5

This branch was successfully deployed

2 active (outdated) and 1 inactive (outdated) deployments
Beta — 90166d76 Deployed Oct 25, 2026 by zbeyens via deploy #333
preview-next — e300fb32 Deployed Oct 19, 2026 by zbeyens via deploy #8
Preview — eabe8a13 Deployed Oct 19, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants