Skip to content

V1: integrated loop output, verified as a whole - #35

Merged
chriszarate merged 82 commits into
trunkfrom
loop/integration
Aug 20, 2026
Merged

chriszarate merged 82 commits into
trunkfrom
loop/integration

Conversation

@chriszarate

@chriszarate chriszarate commented Aug 20, 2026 •

Copy link
Copy Markdown
Collaborator

What this is

The complete output of the v1 executor loop (30 cycles; V1.md is the scope contract, LOOP.md the ledger), merged into one integration branch and verified as a whole — every item branch had only ever been verified individually against its own base. This PR supersedes the per-branch merge orders recorded in the ledger: review and merge this branch instead.

Contents

Lane A (verifier-PASSed in the loop): A1 empty-genesis reload stall fix, A3 real-daemon websocket e2e lane (no skips; de-experimentalizes the websocket transport), A4 yjs genesis rich-text split, A5 announce-inversion verification debt (incl. websocket daemon room scan), A6 phpcs burn-down to zero, A7 websocket fencing coverage, A9/A10 doc corrections, A13 de-rtc typing-quiet snapshot deferral, A14 session teardown hygiene, A15 intent-log mid-burst push gate + 500-row checkpoint interval.

Lane B (proposals, each with a recommended disposition stamped in proposals/*.md, pending your call): B1 yjs materialization fidelity (_save mirror, one subtree file), B3 inline pending-edit cards + summary-only panel, B4 commit-cadence dial, B5 review resolutions over REST.

Also merged: parked loop/a12's partial fixes (Jest-pinned, close the peer-side silent loss; the residual signature persists at a reduced rate — see below) and the v1-m1-maybe V1.md addition.

Integration-only commits (from an independent post-loop review, worked in order):

  • Positive assertion that B5's REST resolve POST fires in the de-rtc e2e walkthrough (the transport-row fallback could silently mask a broken route).
  • Deterministic de-rtc conflict provocation (held sync polls force the stale-base proposal — no more leaning on CI retries) + engine-level Jest for the contested-item targetIndex anchor.
  • CI: composer lint, an e2e-websocket job, and the subtree review-panel component Jest.
  • Three integration bugs found by whole-tree verification: phpcs violations invisible per-branch; a PHPUnit failure from the storage post-id static surviving DB rollbacks; the websocket e2e launcher losing its transport restore when Playwright SIGKILLs the webServer group (now state-file + globalTeardown).
  • B1 _save key hoisted to an exported constant; B4's settings row hides when the engine isn't de-rtc; docs sweep (AGENTS.md websocket lane, checkpoint numbers).

Verification (all on the final tree)

  • typecheck clean · Jest 537/537 · subtree component Jest 11/11 · composer lint clean · PHPUnit 325/325
  • Full default e2e 55/55 × 3 consecutive runs, retries disabled (13.1–13.7 min each) — V1 item A2's acceptance is met
  • e2e:websocket green against the real daemon (transport restore verified)
  • fuzz:quick 6/6
  • A8 exit gate (full fuzz matrix, 9 combos × 5 seeds, faults on): intent-log 15/15; two signatures found and filed, both reproduce identically on trunk-equivalent base (pre-existing, exposed by new seed/fault coverage — not regressions):
    1. yjs-server seed 3: core/group invalid-content recovery after final reload (passes recheck). Replay: npm run fuzz -- --combos=yjs-server/http-polling --seed-list=3
    2. de-rtc seed 5 (HTTP transports, fault lane): convergence timeout, schedule-dependent. Replay: npm run fuzz -- --combos=de-rtc/http-polling --seed-list=5 --steps=12 --trace=retain-on-failure

Review checklist (B6)

  • The four proposals' recommended dispositions (proposals/b1.md, b3.md, b4.md, b5.md)
  • Keep the loop/a12 merge (hammer rate 1–2/8 vs recorded ~4/8; the trigger-level fix — batching coarse captures — stays open post-v1)
  • The M1 "maybe" scope addition to V1.md (commits to nothing)
  • Accept or file the two fuzzer signatures per A8's rule

The ledger's "Post-loop integration" entry in LOOP.md carries the full evidence record.

🤖 Generated with Claude Code

chriszarate and others added 30 commits August 19, 2026 13:00
The websocket daemon's validate_room_request() forwards engine stamps
verbatim into the shared polling seam; existing tests covered stamp
forwarding and the basic stale-tab fence but not the engine-switch
behaviors. Add three tests exercising the WS-validated path end to end:

- a client provably speaking the newly-selected engine heals (resets)
  a switched global collection room and re-genesises under the new
  engine, matching HTTP polling;
- a stale tab stamping the old engine is fenced by the client-stamp
  check and never triggers the reset;
- per-post entity rooms stay fenced even for new-engine clients.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
V1.md's acceptance command filters on Test_WP_WebSocket_Sync_Transport;
the class was named Tests_Collaboration_WpWebSocketSyncTransport, so
the command selected zero tests and passed vacuously. Rename the class
so the acceptance filter genuinely runs the 12-test suite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
composer format auto-fixed 28 mechanical violations (assignment
alignment, multi-line array formatting, quote style). Hand fixes for
the remainder, all style- or comment-only:

- docblocks: intent-log materialize(), de-rtc save_canonical() (whose
  $advance param and bool return were undocumented), the rooms CLI's
  collect_room_meta() $room param
- Yoda conditions in the de-rtc engine; the websocket handshake echo
  hoisted into named variables (the inline ternary tripped the sniff)
- qm/debug hook-name ignores on two de-rtc call sites, matching the
  convention used everywhere else in the repo
- base64_decode ignores on the two hash-verified snapshot decodes
- rename a reserved-keyword parameter ($parent → $parent_id) in the
  base-seq preflight's flatten()

No behavior changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The ~275-errors note predated the loop; the real debt at the v1 base
was 17 errors + 26 warnings and was cleared to zero by A6 (loop/a6).
State the current contract instead: lint stays clean, excludes stay
as designed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The vendored automerge-php library never runs in a live merge: the only
call site sits behind a format check that every real path takes the other
way, and the legacy lane it guards is dead upstream too. Adds a Maybe
section (explicitly not part of the definition of done) with a phased
server-only plan, an estimate, and the reasons it may not be worth doing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ad stall)

Fuzzer finding (intent-log/http-polling seed 6, concurrency profile):
after a mid-session reload on an empty-genesis room, a block inserted
before the room snapshot arrived stayed local forever. update() dropped
pre-init trees on the floor, the capture lane is edge-triggered, and an
empty-genesis bootstrap skips the reconciling document push — so
nothing ever re-captured the editor's tree.

Fix: update() buffers the latest pre-init block tree; an empty-genesis
bootstrap schedules a deferred capture of it through the ordinary
capture path. The deferral (past the synchronous delivery burst) plus
a still-empty-document guard matter: a REJOINER's room also opens with
the empty genesis snapshot but replays its whole history right behind
it, and capturing the buffered tree against the bare genesis baseline
re-authors every saved block as new work — fuzz:quick caught exactly
that as duplicated blocks when the recovery ran synchronously. Any
post-init editor tree, or a non-empty bootstrap, discards the buffer.

Two Jest regression tests pin both sides: the stranded insert is
captured at bootstrap, and a rejoin-with-history discards the buffer.

Acceptance: the seed-6 replay passes, sweep oracles green, test:js
528 passed, fuzz:quick fully green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e A10

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The intent-log residuals list still carried A1 as OPEN; loop/a1 fixed
it. Describe the fix (buffered pre-init tree, deferred empty-genesis
recovery) and the residual that remains (pre-init edits on non-empty
bootstraps are clobbered by the reconciling push, as before).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Genesis mapped a block's whole wrapper-stripped inner markup onto its
first rich-text-source attribute — for core/image the <img …> markup
landed in caption. Byte round-trips held, but the attribute was
semantically wrong: editing the caption operated on (and could
destroy) the image markup.

blocks_to_yblocks now consults the attribute's source selector. A
selector-sourced attribute (image caption ← figcaption, and any block
whose rich-text attribute names a sub-element other than the wrapper)
seeds only that sub-element's inner text; the surrounding markup and
the sub-element's own tags move into the genesis wrapper record, and
to_serializable_block rebuilds the exact bytes from them. A caption
added in-session materializes with the element's conventional tags
(figcaption gets core's wp-element-caption class). Wrapper-sourced
attributes (paragraph/heading content, or a selector matching the
wrapper's own tag) keep the original mapping.

Three regression tests: caption seeds empty / the true caption (never
<img>) with byte-identical round-trips, a caption edit preserves the
image markup, and an added caption materializes with conventional
tags. All three fail against the base engine.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The scenario narratives (A-G), the resource-profile prose (later-joiner
read, 'whole documents travel'), the wire-format parity cell, and the
first known-gaps bullet still described the pre-announce wire. Update
them to the shipped model: sessions commit whole content through the
ordinary autosave endpoint (the transport carries no session
proposals), accepted work broadcasts constant-size announce advisories,
canonical lives once per room in the chained options row, behind
clients fetch one synthesized snapshot, and the active typist advances
by hash downloading nothing. Scenario C gains the commit-hold rule
(fuzzer-found burst-eating), and the known-gaps bullet now states what
still scales with document size (commit upload, fetch answers, merge
CPU/memory) versus what no longer does (stored rows, join payload).
Doc stays number-free.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ds); file A11 request-rate runaway

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…oak gate ruled PASS

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The post-inversion de-rtc/websocket fuzz failed 0/5 — every seed
non-convergent — for two stacked daemon gaps, both rooted in the same
fact: since the announce inversion, de-rtc's entire content flow lands
OUT-OF-BAND (commits ride the autosave endpoint, a web request), and
the daemon was built around socket-message-driven delivery.

1. No out-of-band delivery: the daemon only pushed rows in reaction to
   socket messages, so a stored announce never reached subscribers.
   tick() now runs a 1 Hz room scan: one storage read per subscribed
   room (get_updates_after_cursor from the lowest subscriber cursor),
   broadcast only when new rows exist.
2. Stale engine state: the daemon's registry holds ONE engine instance
   for the process lifetime, and the de-rtc engine caches room state
   per 'request'. A fetch arriving after an out-of-band commit was
   answered from the stale cached canonical — 'client is current',
   no snapshot. The engine now exposes flush_room_state_cache(), and
   the daemon restores the web process's per-request boundary by
   flushing before every message-driven process_room_request and
   every broadcast read.

Regression test (new file, avoids textual conflict with loop/a7's
edits to the WS transport test file): a fake subscribed socket, an
out-of-band de-rtc commit through the engine seam, one tick — the
announce must be pushed, the cursor must advance, and a quiet second
tick must push nothing.

de-rtc/websocket fuzz: 5/5 passed (was 0/5). Full PHPUnit (311),
Jest (526), fuzz:quick all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…l race

The retry-free full suite reproduced the known 'fixture login
navigation' flake: wp-login's wp_attempt_focus() steals focus (and
selects the username field) on a timer, and under full-suite load that
timer fires between the subtree fixture's two fill() calls — the
password lands in the still-selected username field, the mangled form
submits, and waitForURL times out on the re-rendered login page (the
failure snapshot shows the username field holding the literal
password).

The fixture is subtree code, so the subtree stays pristine: a
plugin-local fixtures module (tests/e2e/config/collaboration-fixtures)
replicates the subtree's wiring around a HardenedCollaborationUtils
whose joinUser retries once from a fresh context on failure — harness
plumbing only, no assertion surface touched; the root-cause fixture
fix belongs upstream (human-owned). All nine specs now import the
local module.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… A13 filed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The manager now subscribes to dispositions and, on voided:stale-base,
re-captures the last editor-fed tree against the current document at
the current seq (one recovery per void burst; getEditedRecord was
tried first and rejected — its block shape makes the bridge's derive
return null wholesale).

Status: the silent loss is closed for PEERS (the recovered edits reach
the other window; the old first-assertion failure is gone), and the
Jest regression + a shape-faithful table+quote scenario re-author
correctly. RESIDUAL under heavy repetition (~2/8): the AUTHOR's own
canvas can end diverged (its cell edit reverted locally, coarse
replace_text spliced at stale offsets — e.g. 'Quoted texed by Bt')
while the peer and the server hold the clean recovered content.
Suspect: the recapture fires before the replica has absorbed the
post-trim rows, so the author's optimistic apply mispredicts and the
canvas never reconciles. Resume point: gate the recovery on being
caught up (defer until the next clientReceive absorption) or force a
re-bootstrap; then re-run the 8x repetition and the full suite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…aths

onReset with local work on the canvas no longer pushes the checkpoint
document over a live mid-burst canvas: the bootstrap branch now
schedules the same lastEditorTree recapture the stale-void path uses
(scheduleTreeRecapture, one per burst). Full Jest 527 green.

Repetition verdict: still 4/8 — the tear happens EARLIER than any
manager recovery can prevent: the horizon reset lands MID-BURST, the
transport queue still carries pre-reset intents (voided, fine), and
the post-reset keystrokes capture incrementally against a baseline
that does not match the canvas, so their offsets apply torn ON THE
SERVER before the recapture repairs it; the author's canvas then
fights the repair. Next (attempt 3, final before parking): defer
applying a horizon-reset snapshot while the local burst is active
(session-level buffering in intent-log-session.ts — non-frozen), so
the reset lands on a quiet client and the existing re-derive contract
holds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…work

The session now DEFERS a horizon-reset snapshot (and every row behind
it) while the outbox holds un-settled local work, releasing when the
outbox drains — so every intent the server sees stays in one coherent
authoring frame. The session-level Jest test pins the new contract
(defer → settle → reset applies); the manager skips the stale-void
recapture while a reset is deferred (the reset's own recapture
re-derives everything). Full Jest 527 green; sweep oracles green.

PARKED after three attempts: the author-side tear STILL reproduces
~4/8 under the repetition hammer (same splice family: 'Quote edited
by Bed text', 'Quoted dited by Btext', lost cell edit). What IS fixed
and verified on this branch: the peer-side silent loss (peers converge
to recovered content), the server self-repairs via recapture, and the
deferral closes the frame-mixing hole the captures demonstrated. The
remaining schedule defeats all three layers — next investigator needs
fresh per-build wire evidence (the failing interleaving evolves with
each fix), and should also weigh the alternative angle: the trigger is
the pathological row explosion of coarse table captures (3 rows per
keystroke — set_attr(body) + 2 format_text), which drives mid-burst
checkpoints in the first place. Batching those captures (or pacing the
checkpoint trim) may kill the schedule at its source.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chriszarate and others added 18 commits August 20, 2026 08:18
… e2e walkthrough

The transport-row fallback would otherwise mask a broken route: this is
the first tree where B3's card flow and B5's REST lane coexist, and the
spec now fails if resolutions stop traveling over REST.
Branches based before the A6 burn-down carried debt A6 never saw:
B4's settings block comment, A5's room-scan timestamp alignment, and a
missing docblock on the a4/b1-lineage blocks_to_yblocks(). composer
lint is clean again on the integrated tree.
- composer lint in the php job (A6 keeps the standards debt at zero;
  the stale 'deliberately absent' comment is gone)
- an e2e-websocket job running the real-daemon lane (A3 — the lane
  that de-experimentalizes the websocket transport ran nowhere in CI)
- the subtree collaboration-review-panel Jest in the js job (B3's main
  coverage lives outside the plugin Jest roots)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1. Engine-level Jest for the contested review surface: the real
   collision choreography (propose, edit the same block again, merged
   own announce, fetched snapshot) driven through the session codec,
   asserting the contested item surfaces with its positional
   targetIndex anchor and that dismiss/restore route to the bridge's
   REJECT/ADOPT verbs.

2. Deterministic e2e conflict provocation: whether the escalation
   fired used to depend on scheduling (a run could serialize cleanly
   and park nothing, leaning on CI retries). The spec now holds user
   two's sync polls — never the commit lane — while user one's rewrite
   lands, so user two provably proposes from the stale base and the
   same-block overlap must escalate. URL matchers use the decoded
   form so plain-permalink (?rest_route=) envs match. 4x green
   locally, each run also exercising the B5 REST resolve assertion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- B1: the _save doc-mirror key is hoisted to an exported
  CRDT_BLOCK_SAVE_KEY constant in crdt-blocks.ts, making an upstream
  rename mechanical.
- B4: the commit-cadence settings row hides (live, following the
  engine select) when the active engine is not de-rtc. Hidden row, not
  disabled input: a disabled input drops from the POST and saving
  under another engine would silently reset the stored cadence.
- Each proposals/<id>.md now carries a recommended disposition section
  (explicitly pending human sign-off) so B6 review starts from a
  concrete position instead of an open survey.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AGENTS.md's testing section still described the retired peer-relay
websocket fixture lane and its test.fixme skip; it now describes the
real-daemon lane A3 shipped (no skips) and CI's new certifications.
engine-comparison.md's compaction/storage rows now carry intent-log's
live-authoring-sized 500-row checkpoint interval (A15) with the reason.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full-suite PHPUnit failed on the merged tree only:
test_forwarded_new_engine_stamp_heals_switched_collection_room read a
stale 'intent-log' stamp. The storage's static post-id cache survives
the per-test DB rollback, so the engine-registry class (same
collection room, now ordered differently by the new v1 test files)
leaves a dead cached post id: set_room_engine() writes to the
rolled-back post while the transport's reset path queries fresh and
finds nothing to reset. The polling suite already resets the static in
set_up for exactly this reason; the websocket suite now does the same.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Found during the sweep: after a websocket e2e run, the tests site was
left pinned to a daemon-less websocket transport and every later
polling suite timed out at session discovery (which first masqueraded
as an 8/8 A12-hammer failure). The daemon launcher's restore runs on
signal/exit, but Playwright can SIGKILL webServer process groups —
the in-process restore is not guaranteed. The launcher now persists
the pre-suite selection to a per-checkout state file, and a new
globalTeardown (running in Playwright's MAIN process) replays the
restore via the launcher's new --restore-only mode. Idempotent with
the launcher's own restore; verified by re-running the suite and
checking the option afterward.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts:
#	src/engines/intent-log-manager.ts
#	tests/js/engines/intent-log-manager.test.ts
…et; A8 run, two pre-existing signatures filed
All four Lane-B proposals accepted per their recommended dispositions;
the loop/a12 partial-fix merge kept; the M1 maybe-item accepted into
V1.md. Open: accept-or-file for the two A8 fuzzer signatures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both reproduce identically on the pre-v1 base tree (pre-existing,
exposed by new seed/fault coverage): F1 yjs-server seed-3 group
invalid-content recovery after reload; F2 de-rtc seed-5 convergence
timeout under HTTP fault injection. Filed with replay commands per
A8's rule; the soak is otherwise green. A8's disposition is complete
and no B6 decisions remain open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The e2e-websocket job failed with "tests wp-env not found": wp-env
uses PUBLIC ~/wp-env (not ~/.wp-env) when /snap exists — GitHub's
Ubuntu runners ship snapd, so the daemon launcher, the doctor, and
the fuzzer were all scanning the wrong home on CI while every macOS
checkout worked. All three now mirror wp-env's own derivation
(get-cache-directory.js: WP_ENV_HOME, else the snap check).

Also fixes the three lint errors the js job caught in merge-affected
test files (an unused destructure and two prettier layouts from the
a12/a15 keep-both merges) — full `npm run lint:js` is clean again;
the per-file linting done during integration missed files whose
formatting shifted in merges.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@chriszarate
chriszarate merged commit fcc67c4 into trunk Aug 20, 2026
4 checks passed
@chriszarate
chriszarate deleted the loop/integration branch August 20, 2026 16:56
chriszarate added a commit that referenced this pull request Aug 24, 2026
* V1 close-out capture pass: file F3/F4, refresh stale loop-era docs

- V1.md: file the parked-A12 residual as F3 (mid-burst compaction tear,
  hammer repro) and the accepted B5 disposition's legacy resolved-row
  retirement as F4; add the B3 collapse-after-N refinement and the
  upstream login-fixture fix to the v1.1 candidates; correct A6's stale
  ~275-error figure (real debt at loop start: 17E+26W).
- AGENTS.md: the e2e qualifications paragraph now reflects A2 met
  (3x retry-free green on the integration tree), the hardened login
  fixtures, and the A12 residual as the one known intermittent.
- engine-comparison.md: the two vision-table cells that still called
  B4/B5 unshipped now describe the shipped cadence dial (with the
  constrained-host recommendation) and the REST resolution lane.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* V1: promote maybe item M1 to v1.1 work item F5

At the human's direction, the unused-Automerge finding (recorded in
commit c117008, accepted into V1.md 2026-08-20) moves from the Maybe
section to the filed v1.1 items as F5. The content is unchanged: the
finding, the server-only phased plan, and the estimate carry over; the
phase-0 decision spike with its kill criteria is the first bounded
unit, and the old why-it-was-a-maybe bullets are kept as the filing's
recorded risks. The Maybe section notes the promotion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* V1: file F6-F8 from the sync-engines-rundown post audit (need shaping)

Three findings from auditing the 2026-08-21 rundown post against the
merged v1 tree, filed as v1.1 items marked NEEDS SHAPING (real problems,
but each lacks the scope decisions and acceptance commands a
loop-runnable item requires):

- F6: the post's hash-pinned kses approval stamp does not exist — the
  port dropped upstream's kses-allowance periphery, so approval is
  one-shot and an unprivileged edit to approved risky markup likely
  re-parks it. First unit: a PHPUnit reproduction; then implement the
  allowance or declare one-shot the policy and correct the post.
- F7: the WebSocket advisory-channel mode the post says we are
  exploring is unimplemented; shaping covers protocol shape (Lane B),
  transport-vs-daemon-mode, and benchmark acceptance.
- F8: the high-latency awareness primitives the post mentions have no
  repo presence; shaping starts with locating that work.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* docs/plan: propose a product-focused format for future work items

Adds the folder, its rules, a template, and one worked example so the
shape can be reviewed before we migrate anything.

The rules that do the work: one item per thing, plain language in the
first three sections, a real example with steps, a stated way to know
it is done, and a notes section at the bottom where deep technical
detail is welcome. Includes a table of our internal words with plain
replacements, so the rule is enforceable rather than aspirational.

Item 0001 is V1.md's F3 rewritten to the format, as proof that the
same information survives the translation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* docs: the review-resolution row survived the split with a stale verdict

The docs split carried this fidelity row over with its pre-PR-35 note
that review resolutions still ride transport rows. They do not: B5's
REST route shipped. The transport row remains only as a fallback for
older clients, and retiring it is filed as F4.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* docs/plan: lean on the new glossary instead of a second word list

The docs split shipped glossary.md, which defines the project's
invented vocabulary in plain words. The plan folder had grown its own
table of the same terms, which would have drifted from it.

The rule is now mechanical and has one source: if a word is in the
glossary, it is a term of art, so it does not belong in an item's
title, problem, or example. A few plain replacements stay as examples
of what that looks like. Also indexes plan/ in docs/README.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* docs/plan: add a checker and a skill that enforce the plain-language rule

check.mjs reads docs/glossary.md and reports any of our invented words
used above an item's notes section, plus missing sections and examples
without numbered steps. Run it with npm run plan:check. The jargon
check is eager by design: it flags words for a human to judge.

The plan-item skill applies the folder's rules when writing or
migrating an item, and stops short of opening the GitHub issue, which
stays an action the user names.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* docs/plan: migrate the eight open items out of V1.md

Each F-item is now a file in docs/plan/items/, rewritten so the title,
the problem and the example describe what a person using the editor
would run into. The precise technical account moves to the notes at the
bottom of each file, in full.

The out-of-scope list becomes not-now.md, where each entry says why it
is waiting rather than only what it is. V1.md keeps the v1 history and
gains a table mapping old names to new files.

Also repoints the references that pointed into the retired list, and
corrects a known-issues bullet that still described the yjs
materialization and genesis rich-text defects as open. Both shipped:
the first in PR #35, the second in the v1 loop's A4.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* docs/plan: add the one-way GitHub mirror

mirror.mjs pushes each item to an issue and writes the issue number
back into the file's frontmatter. It never reads changes back: the file
is the source of truth and the issue is where discussion happens.

Supports --dry-run, which is what the README shows first. The script
carries a note that it should be run by a person, since creating issues
on the public repo is not something to hand to an agent in passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* plan/: move to the repo root, fold in the last of the v1 paperwork

Structure:
- docs/plan moves to plan/ at the repo root, items become issues, and
  the two scripts move to plan/bin. Paths, links and the npm script
  follow.
- plan/history.md is new: why the code is shaped the way it is, and
  what has already been tried and failed. Deliberately short. It is
  the part of the v1 record that still informs decisions; the
  cycle-by-cycle narrative is not, and stays in git history.

Retired, after checking each one's content is accounted for:
- V1.md — its open items are plan/issues, its out-of-scope list is
  plan/not-now.md, its decisions are plan/history.md.
- PORTING.md — the split it tracked is finished and AGENTS.md
  describes the result.
- proposals/ — all four were accepted and shipped in PR #35; their
  reasoning is in plan/history.md and their one live residual is
  issue 0004.

Loop scaffolding is now generic: /issue-cycle replaces /v1-cycle and
works from plan/issues plus LOOP.md, the verifier becomes
issue-verifier, and the skill becomes plan-issue. LOOP.md is reset to
a fresh ledger with the eight issues queued, provable ones first.

Also corrects two more places that described shipped work as open (the
yjs materialization and genesis rich-text fixes, in
engine-comparison.md) and one that called the cadence default an open
question.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* Add issue templates: a short form for people, the full shape for agents

Two templates, deliberately different in kind:

- report.yml is a GitHub issue form. Only two fields are required —
  what happened and what you expected — because asking a reporter for
  acceptance criteria is asking them to do the investigation, and it
  deters filing. It is the front door for people.
- worked-up-issue.md is the shape an issue takes AFTER investigation,
  the same one plan/TEMPLATE.md defines. Note that issue forms only
  apply in the web UI: gh issue create --body-file bypasses them, so
  the agent-facing template is Markdown to copy, not a form to fill.

No behavior change yet; nothing has moved to GitHub.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* workflow and naming tweaks

* Move the queue to GitHub Issues; adopt agent: labels and shaping vocabulary

Follows your terminology: shape/shaped/shaping throughout, and every
label an agent maintains carries an agent: prefix. Five of them, with
gh commands to create them in plan/README.md:

  agent:needs shaping    filed, not yet investigated
  agent:ready            shaped, someone could start today
  agent:in progress      a cycle is on it
  agent:needs decision   shaped, blocked on a human
  agent:parked           three failed attempts, diagnosis in a comment

The needs-decision label is new. Shaping can conclude that a problem is
real but that a human has to choose something first, and that is a
different state from both "not investigated" and "ready".

New /shape-issues turns filed reports into issues anyone could pick up:
read, investigate, decide what it actually is, rewrite the body, move
the label, comment so the reporter gets a readable answer. It may edit
and close but not create, and explicitly may not fix, because mixing
shaping with fixing means nobody reviewed the shape.

/issue-cycle now reads its queue from gh rather than a table, and
parking writes a comment on the issue instead of a section in a file,
which puts the diagnosis where the next person will look. LOOP.md keeps
only the ledger.

check.mjs works on issue bodies now: no frontmatter, and it can fetch
by issue number or label. The jargon rule gained a subject. It binds
agents, not reporters: a person describing their own problem is plain
by default, and the risk was always ours.

Retires the plan-issue skill (shape-issues covers it), mirror.mjs (the
sync it did is exactly what GitHub-as-truth removes) and
plan/TEMPLATE.md (the issue template is the one copy). not-now.md
becomes wontfix.md.

plan/issues/ stays until those eight are filed on GitHub, which is a
human action.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* Fold needs-decision into parked; delete the checker in favour of instructions

A parked issue now covers every reason work cannot move: a decision
someone owes, a question waiting on an answer, or three failed
attempts. The label alone was never the useful part — what matters is
the comment saying what it needs, so that is now the rule. A park with
no comment is not parked, it is abandoned.

Deleting check.mjs: you were right to ask. Its one property that could
not live as an instruction was staying current with the glossary, and
that turns out to be a grep. Everything else it did — five sections
present, numbered steps, jargon above the notes — is reading, which is
what the shaping skill does anyway. 190 lines for a judgement call the
agent has to make regardless.

What we give up, honestly: consistency under load (a script checks the
tenth issue as carefully as the first) and an artifact in the
transcript proving the check ran. The skill now compensates by asking
the agent to state which checks it did, and to say so when it skipped
one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* The queue moves to GitHub: file the eight issues, drop the local copies

Issues #37-#44 now hold what plan/issues/ held. Five are labelled
agent:ready; #40, #42 and #44 are parked because each waits on a
decision rather than on work, and each carries a comment saying what
that decision is and who owes it.

Two of the eight were written as "shaping" but their stated first step
is a test or a measurement that needs nobody's permission, so they went
in as ready. Shaping status was about the fix, not the first step.

Everything that pointed at a file now points at an issue number:
history.md, the fidelity table, the engine comparison, AGENTS.md, and
the cross-references between the issues themselves. LOOP.md lists the
three parked ones so the ledger reads straight through, and the
migration notices are gone from plan/README.md and LOOP.md because the
migration is done.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* Stop hard-wrapping text that goes to GitHub

GitHub renders issue, pull request and comment bodies with hard line
breaks on: every newline inside a paragraph becomes a <br>. Our .md
files are wrapped at about 72 columns, so the eight issues filed from
those files arrived ragged, breaking mid-sentence at every wrap point.

Fixed on the eight live issues, the three parking comments and the pull
request body — all now render as flowing paragraphs, confirmed by
checking the rendered HTML for <br> (zero across all eight).

The durable fix is here: the shaped-issue template, plan/README.md, the
shaping skill and the loop cycle all now say it, and the template's own
prose no longer models the wrong habit. Called out where it bites: a
wrapped draft looks correct in a terminal, so this is invisible until
it is published.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* Move plan back under docs/

docs/plan/ again, with every pointer repointed and the relative links
inside it corrected by one level. No content changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

* Claim issues before working them, and stop using LOOP.md as a ledger

Both commands now claim an issue before the first line of work: add
agent:in progress and assign yourself, in one call. The label is what
hides it from everyone else's list. The assignee is who to ask about
it, which the label alone cannot say, and it costs nothing extra since
it rides the same call.

Releasing is the part that matters more. An abandoned claim is
invisible to every future run, so both commands now say to release on
any exit — shaped, closed, parked, out of budget. /shape-issues claims
one issue at a time rather than the whole batch, so a run that stops
early does not sit on work it never reached.

Selection: both take issue numbers as an argument; otherwise they read
what is assigned to you; otherwise they ask once and assign the answer
immediately. Writing the answer to GitHub is what makes it a one-time
question — the next cycle reads assignments instead of asking, with no
state file, and a human can see and change the selection from the issue
list.

LOOP.md is no longer a per-cycle ledger. Two machines committing it to
the base branch every cycle would collide constantly. Each cycle now
comments on its own issue, which is where the next person looks anyway
and which parallel machines can write at once. LOOP.md keeps only what
outlives one issue: how to run the loop, and the lessons.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WP4d5ouX9aSRmmwZQfZcsq

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
chriszarate added a commit that referenced this pull request Aug 24, 2026
83e144efc9 Sync: finish the trunk merge — drop two framework pieces this branch owns elsewhere
c6b266bc75 Rebuild package-lock.json on trunk's lock
2c50a5e9cd Sync: follow trunk's RTC experiment gate after the rebase
698a2fc7ca V1: integrated loop output, verified as a whole (#35)
13d1b3e154 Add more explicit test timeouts, reduce some default timeouts (#8)
cf93599113 Make intent-log the framework's default engine
0a9a170bdb Relocate the transport-specific e2e harness from the framework subtree
f683739358 Remove framework residue duplicated by or migrated to this plugin
7f36932c0d Sync: remove the framework's dual-homed intent-log frozen core
2149d22061 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
04d32960fd Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
1cd70e6820 Sync: backfill CHANGELOG for the framework/plugin split
7062018ff2 Docs: bring the sync architecture docs up to date for the framework/plugin split
98e8ba2fdf Sync: remove the built-in transports from the framework
14b9a11c67 Sync: remove the Yjs engine from the framework (step 4b)
cda266cad7 Sync: make connection retry transport-agnostic (E2)
00d42e9d76 Sync: make createSyncManager engine-neutral (step 4a)
f58a913289 Sync: route the collection path through the engine (step 3)
4008ded853 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
18ac9e5037 Sync: remove the intent-log engine from the framework (now plugin-only)
ce2d216dd6 Sync: expose registry test-support + session seam types for engine plugins
01111eee44 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
022ebd91e2 Sync: Make the collaboration framework engine/transport-less by default
8ac75c8cae Docs: Add an as-built architecture overview with mermaid diagrams
b3567fd4dc Sync: Add the WebSocket transport (daemon + codec-driven client)
276bd27a87 Sync: Make transports swappable; add HTTP long-polling
d0fb51470f Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
60eb412dfa Sync: Inline approval card for parked new-block proposals
08d3ecedcb Sync: Reserve Restore of requires-approval conflicts for capable users
5d24f4cc2c Sync: Stop dropping classic content; sync it as core/freeform
14a82d708b Sync: Sync Custom HTML blocks through the content field (raw-content model)
3be3b1c3e5 Sync: Fix the capture bug that silently blocked Custom HTML sync
65e8bf9369 Sync: Regression-test benign-to-protected attr value transitions
9983a07e54 Sync: Gate raw-attr markup at ingest; make block restore an approval
b63d141b62 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
bb4c4b9e9b Sync: Anchor collaboration conflicts to blocks in the canvas
11165044f7 Sync: Add the collaboration review panel to the document sidebar
ca51d70d4d Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
6a9357f463 Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
791a40e653 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
5149d9a9d3 Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
a71e3103c5 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
4dad221495 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
9668010b7b Docs: adversarial review of the intent-log branch (2026-08-05)
00f5867bf9 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
ffac7acf99 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
c070625a92 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
c27fb74ea7 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
86bb5d76ec Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
bbb0d851fe Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
1a108bb136 Sync: presence for the intent-log engine (Phase 2d-viii)
c8e9d59ae9 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
ffd4f44fb2 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
37456458bc Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
4146e4eb2c Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
bafedefbc6 Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
09c9ae78f2 Sync: never treat editor staleness as user intent (Phase 2d-iii)
bf2f8223ca Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
c03be224b9 Sync: record Phase 2d-i status in the architecture note
bf84dcd84a Collaboration: live two-browser intent-log editing (Phase 2d-i)
c6ffc0cf77 Sync: record Phase 2c status in the architecture note
12ba54f1f4 Sync: intent-log manager and adapter registration (Phase 2c-ii)
5bd6737e62 Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
46fb9020d3 Sync: record Phase 2a/2b status in the architecture note
76b516ded4 Sync: intent-log client session codec (Phase 2b)
c16d278721 Collaboration: unit tests for intent-log engine internals and adversarial ids
bbd1591b2d Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
312f3b3fe4 Sync: narrow transports to engine-opaque payloads (Phase 1c)
fb9af267ff Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
9276dc7c37 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
98365687c4 Collaboration: extract a swappable sync engine seam (Phase 0)
e61523237a Sync prototype: intent-log engine with field-scoped merge semantics
be1a0b58a2 UI: Add tooltips to Calendar and RangeCalendar navigation buttons (#81983)
db3254554c Pattern List: Import a pattern from JSON (#81919)
3bbdb29369 Fix: skip empty block markup in navigation to prevent split UL elements (#78793)
d13be36ff4 Fix: Line Break Tags Added to Scripts and Styles (#77542)
c96732f578 Styles Route: Reference the api-fetch and html-entities projects (#81989)
39088bf09a Block Styles: Refactor the variation UI to use ui/Button (#81833)
f8bec56d62 Extensible Site Editor: Add a theme preview page with global styles editing (#81954)
874959034f Boot: Mount the registered plugins (#81754)
086650feed Updated broken links in document files (#81961)
ec35342e1c Block Editor: Don't close inserter panel when inline quick inserter opens (#76241)
fd305b0fc6 Replace the Storybook test runner with the Vitest integration (#81918)
194f70eaa2 DataViews: Localize the date/datetime calendars from the site locale and direction (#81592)
fcf11dc55e DataViews: use `Menu` from `@wordpress/ui` (#81783)
cb20a4361e CollapsibleCard: Support multiple header descriptions (#81227)
094b1b094f Theme: Update Terrazzo packages to 2.7.1 (#81978)
0ae1399378 fix: Button rtl loader issue (#81901)
af8db520dc Components: migrate StyledLabel to SCSS module (#80001)
85b8c96615 UI: Add ValidatedInputControl component (#81627)
0e7546c0af Hide layout panel when no controls are available (#81968)
ca1b3fe1fe Docs: Align @PARAM tag columns in test/ docblocks (#81905)
8e57b0d27f Components: migrate GradientPicker, ColorPalette to SCSS module (#80473)
953a217f29 TypeScript: Bring the remaining route projects under the typecheck run (#81847)
6eddc656dd List: Add Align Support (#68002)
75768b4e6f UI: Accept locale codes in Calendar components (#81814)
87702decc4 DataViews: Fix date and datetime controls selecting the adjacent day (#81498)
a42b6775f4 Block editor: Move isElementVisible changelog entry to Unreleased (#81953)Co-authored-by: shail-mehta <shailu25@git.wordpress.org> Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
63b5d22cc1 Block Library: Fix failing test in playlist block (#81950)
009745b24e Playlist Track: Improve track upload error flows (#81878)
98047a5bf0 Automated Testing: Change Storybook default a11y test to error on failure (#81597)
f1b97bb6dc Playlist: Add bulk track metadata editing (#81441)
5b5c741de8 Dependency updates Aug 2026 (2) (#81906)
1e40a0d4a0 DataForm: Make the panel layout edit button the real field trigger (#80689)
5d097d5300 DataViews: Sync the displayed calendar month with external value changes (#81635)
f6e389d3a1 Update is-plain-object to 5.1.0 (#81926)
23ac1cdd11 Build Scripts: Force tsc --pretty so CI reports the project behind global diagnostics (#81937)
e5bc5a5fd1 Font library: Add skeleton loader for the font preview images (#81047)
d1e24d6340 Documentation: Update coding guidelines to recommend TypeScript (#81763)
b5e015d0c0 Storybook: Upgrade to 10.5 (#80692)
704b421e55 Use `WCInputControl` alias for legacy InputControl imports (#81830)
047dc276e2 SearchableChipSelect: Add grouped items support (#80989)
c836e0d30f Validation: update dependency-audit to 0.4.6 and ignore dataviews ./wp bundle (#81928)
57c278ca27 Editor: Migrate hierarchical term selector to @wordpress/ui (#81848)
c217b2698e Font Library: Fix the preview weight for variable fonts (#81748)
56897408ab Components: Improve text detection for button icon-with-text (#81521)
eaf986a580 Use `WCTextareaControl` alias for legacy TextareaControl imports (#81834)
54f9e9f675 chore: Update the combobox SCSS to have a breaking changes log (#81923)
5a675bf1d0 Update Ariakit packages (0.4.35 => 0.4.37) (#81080)
d76e6529dd UI: Update Base UI to 1.7.0 (#81390)
31f04b7159 Components: migrate ComboboxControl to SCSS module (#80471)
1d6106c233 Pre-publish panel: Remove the headings that repeat the panel title (#81806)
c49982dcb2 Editor: Set the width an entity opens at from the editor provider (#81750)
4ae7b44119 Global Styles: Close the revisions screen on the first back click (#81897)
c368c6810d Preserve layout and style attributes on Column transform (#81855)
e35b95c0ed Refactor parameter type hints and clean comments (#81898)
7f2be02a0b Try caching gutenberg_get_global_styles (#81889)
bfe2bf29ad Color Palette panel: Remove empty whitespace when there are no theme colors (#81894)
7cea1c72e1 Global Styles: Allow editing duotone palettes (#81605)
91e7ca7a59 Design System: Add portable agent skills (#80597)
eee4867232 Pattern: Disable visibility support (#81866)
c36cbd2cdd Storybook: Handle production module load failures (#81867)
d3f2c507db Global Styles: Group shadow editor rows as items (#81871)
4cbf437576 UI: add ControlWithError component (#81574)
70af7dbbb8 Fix/79641 rtc cursor hidden details block v2 (#81322)
f854b6b139 Storybook: Fix default background color for Example Application theme story (#81765)
157cff2ddd Editor: Announce publish date changes to screen readers (#81629)
da0bf8d33d UI: Mark Autocomplete, Field, and Fieldset as recommended (#80636)
0619247335 Core Data: Allow keyless entities to be addressed without a record ID (#81857)
3e52ca93e2 Dependencies: Dedupe, update adm-zip, nx (#81870)
e8aed3c82b Core Data: Validate the parsed-blocks cache against registered block types (#81809)
417261c052 Build: Emit TypeScript declarations with --noCheck (#81839)
06b9b58daf Boot: Migrate styles to CSS Modules (#81756)
d33e8a4154 Update save & submit docs (#81077)
427871b0cf Editor: Surface debugging details in the ErrorBoundary (#81642)
7deb3826a4 Theme: Add color warning diagnostics workbench (#81817)
a1e8d1dfaa UI: Expose keyboard shortcut presentation utilities (#81826)
04b2317c6b Editor: Remove FlexItem usage from NoteCard (#81851)
0b566e44b3 Add transform to Row for Columns block (#81802)
1b0671fbaf Add missing dependency to media-editor route (#81845)
23e8873b2c TypeScript: Put route projects under the typecheck run (#81829)
ee5da7178e Updated Aria Landmark Example URL (#81832)
f74762325c Fix MediaPlaceholder drag eligibility (#81431)
eba80d22a2 Docs: Fix broken skip ahead anchor on the custom block editor guide. (#81835)
442851efd6 Global Styles: Keep storing shadow presets as CSS variables when custom presets exist (#81346)
4d03cf0ed6 Bump astral-sh/setup-uv from 9.0.0 to 10.0.0 in /.github/workflows (#81823)
6106e2177b Components: migrate ResizableBox to SCSS module- #80720 (#81792)
c9e913d798 Storybook: Fix production build warnings (#81758)
a2d98c2883 Docs: Narrow the tsconfig split guidance to the standard layout (#81828)
94a108d3c9 UI: Add TextareaControl component (#81359)
e5039135ce Quick Inserter: Standardize the design of the Browse all button (#81827)
add1acd40f Docs: Fix broken link to the getEntityRecords selector reference. (#81791)
61121263ba Post Template: Fix mover arrows and labels for blocks inside the grid view (#81120)
321d5c87c7 UI: Mark Input-related components as recommended (#81658)
232cf07f1a UI: Add initial agents guidance mapping to contributing guidelines (#81400)
0aa2071fec Fix: Post Editor: 403 on /wp/v2/settings at boot for users without manage_options cap (#81813)
a0c83b4dd7 Add command: View post (#66720)
073b06862f add context to change "revisions code diff" (#81820)
3a5b8ad2dd Patterns explorer: Refactor the category sidebar to use Tabs (#81807)
eca76ad768 Menu: Add UI component (#79560)
8119bc827d Fields: migrate last remaining JS file to TS (#81808)
55f56985be Components: Fix Storybook accessibility issues in stories (#81777)
12fd2f5612 Playlist: Remove block toolbar sharing between parent and child blocks (#81432)
9359cf2bbf Rename the media editor toolbar button to 'Edit image' (#81705)
aee1d48442 Block Editor: Remove leftover files (#81793)
28c348acdf TypeScript: Require the typecheck run for type checking in CI (#81518)
f57b5d3bb6 Packages: Complete the tsconfig build and dev project split (#81517)
03211d47a7 Packages: Split story package tsconfigs into build and dev projects (#81516)
bce33cb4ff Editor: Debounce term filtering and announce results once (#81422)
15503fd5e5 Tests: Make PHPUnit tests independent of test config flags and theme root (#79159)
9d2c909e53 Docs: Fix broken link to the Document-Isolation-Policy explainer. (#81790)
2a59379cc1 Build Package: Use Core's boot module when a plugin has none (#81761)
038142b853 Update Changelog for 23.8.0
ca0444b218 Bump plugin version to 23.8.0
b0316b6134 Fix: Post Editor: Canvas animates from the left when switching mobile/tablet preview to desktop (#81484)
feb072be0e Media Editor Route: Add undo/redo and save/cancel actions to the header (#81563)
3abf43f1df Notes: Stop forcing capitalization of user names (#81788)
e16e4bbd88 Fix Broken Links in Package file (#81700)
42e91ce205 Command Palette: Allow commands to override the category icon (#81787)
3ba8bb1750 Components, DataViews, Editor, UI: Split tsconfigs into build and dev projects (#81515)
336666c980 Schemas: Document what the theme.json schema checks (#81773)
fdf5711313 More block: clarify description about excerpt vs full content (#80619)
96a6d41dc1 Theme: Improve color ramp contrast safeguards (#81185)
ab98811095 Dashboard Widgets: resolve widget types without a metadata module (#81738)
6e4cf9c292 Dashboard: add a Site Health detail page as the dashboard's second route (#81729)
e434463145 Align collaboration migration version markers with the 23.8.0 release (#81789)
bee1b17fb1 RTC: Add fallback identities when user profiles are unavailable (#81408)
894f273e9b Fix the failing e2e test (#81739)
e43dcaa48f Fields: Export the package stylesheet (#81769)
03811bd605 UI: Add Spinner component (#81358)
725b1f48e0 Fix DataViews list layout color token usage (#81074)
9a9d9c535a Notes: keep the note actions menu in view for long display names (#81414)
825d1789fb Update playlist track placeholder to match aria label (#81762)
939b3f3a92 ui/Card: Use the default neutral border (#81746)
a5e0b24f14 RTC: Couple RTC and polling provider as an opt-in experiment (#80658)
da621f2e6a Modal: Stop Escape key propagation on dismiss (#81785)
c00d0697de Tabs: Give tab IDs their own counter so numbering starts at 1 and never skips (#81781)
0ea2e57cb7 BoxControl: update the opposite side when ALT is held on the left or right input (#81530)
b6453f2621 Fix: Accordion: Anchored hash inside the accordion throws the malformed URL console error (#81780)
dc30b9dde7 Site editor: update template section description. (#81613)
a81f0474d9 Global styles: Register <label> as element (#81160)
cb8fc5f5c2 Block Editor: Add translator context to pseudo-state labels (#81770)
348c2da73c Fix: URL: normalizePath drops the rest of the query after a second "?" (#81612)
d889c67cbb Fix clipped focus outlines in the media editor Details sidebar (#81703)
87acb90b99 Prevent white screen crash during undo operations when Media Modal is open (#79898)
d1703e053a Global Styles: filter and indicate blocks that have custom styles (#81373)
8d862829e1 Media Editor Route: Make the route look like it's part of the media menu in the left-hand sidebar (#81565)
1bb4e5b157 Packages: Split tsconfigs for utility and mid-size packages (#81514)
4061b86a00 Enable axial gap for Group and restrict to flex and grid layouts. (#81476)
daf9c82168 Feat: support block spacing (#79689)
05abdcb349 Bump github/codeql-action/upload-sarif (#81436)
87826e5c9c Add `__unstable_wp_sync_storage` filter for pluggable storage backends (#81697)
1f6157810c UI: Collapse item-popup item sizing to default and small (#81354)
ba25994b47 Playlist: Add aria-label to prevent placeholder as label (#81654)
227aff3290 Components: Migrate DropdownContentWrapper to SCSS module (#81522)
75b9133222 Site Editor: Use inverted ThemeProvider seed for portaled UI (#81653)
4849c664c3 Update Terrazzo packages to 2.5.0 (#81082)
2f1563b9e0 Build Tools: Stop watcher process trees on shutdown (#81504)
262c721c8a Docs: Require site editor features to land in the extensible site editor too (#81752)
02aae3ab29 Boot: Preview the site where the canvas has nothing to open (#81749)
47e68c9f4c List View: Fix flaky global shortcut test and re-enable it (#81690)
ac1cf9e039 Lazy Editor: Keep the theme's editor styles on the canvas (#81747)
a2556e7201 Stop saving Table of Contents output (#80404)
5171671b5b Boot: Sync the editor's device preview with the URL (#81617)
ce19c147a8 RichText: Use the current record when handling Enter (#81696)
3f668616ac Editor: Simplify List View sidebar shortcut handling (#81693)
97a82266de Block API: Address review feedback on block keyboard shortcuts (#81621)
1b45b0780d Boot: Do not offer to edit a trashed entity (#81632)
e3187a5760 Edit Site Init: Seed the editor preferences the editor expects (#81628)
db5c14db14 Lazy Editor: Render the editor preferences modal (#81630)
090b2acc04 List View: Make focus on mount opt in (#81659)
137e908a9c Make Back button grid column flexible. (#81701)
cd0c368a2e Layout block supports: cast numeric grid attributes before use (#81560)
55dabd69d6 Inner Blocks: Fix bug that caused alignment controls to show in Image blocks within a Gallery (#81606)
d3c65d3a7e Admin UI: Fix the primary color of the Fresh admin color scheme (#81618)
2d9c286ac6 Playlist Track: Show upload spinner inline (#81445)
de9e36e54e Fix playlist track toolbar insertion (#81639)
614b3bf6b2 Editor: Refactor 'ErrorBoundary' to use the new recommended components (#81638)
0a886b47c9 Env: Fall back to cached docker images when the registry is unreachable (#81631)
ebd2ecafaa Boot: Warn before leaving with unsaved changes (#81625)
bff0a80003 Boot: Contain a surface failure to that surface (#81622)
f9913ca552 Perf: Report the first block selection as its own metric (#81616)
1c46b11820 Boot: Translate the canvas click-to-edit label (#81620)
0e92e54c99 Storybook: Add Story for  InnerBlocks (#68651)
f36f2bb2f3 Block API: Declare block keyboard shortcuts on variations and transforms (#81588)
476847df51 Boot: Let the editor canvas navigate between entity records (#81590)
11474d21bd Block Editor: Never spotlight blocks in a preview (#81615)
f3ec0c66e7 Storybook: Add Story for BlockPopover (#68681)
3bb6eb7a08 Global Styles: Expose additional elements in Typography and Colors (#80852)
ee35d7c8d3 Extensible Site Editor: Show only the style book on Styles for classic themes (#81579)
b65ede97c9 Storybook: Add Story for URLPopup component (#68449)
9f30bf7872 ComboboxControl: narrow `onChange` callback type to `string` | `null` (#81568)
560d975e66 Extensible Site Editor: Add the Identity route (#81576)
51d339f0d0 URL: Stop normalizePath throwing on a malformed percent sequence (#81086)
f3b8155a3b Fix parent inserter alignment with text labels enabled (#81608)
9aa7406203 url: clamp the truncated file name slice in filterURLForDisplay (#81529)
dbe1c1ccab Block editor: add an inserter to the parent selector (#81532)
aa50808db6 Fix viewport state values set by grid resizer (#81601)
6f26db48d8 Add Gutenberg version details for WordPress 7.1 (#81600)
be330310c5 Base Styles: Align `input-control` mixin to design system (#81357)
2b714533ed Components: Align legacy form control focus rings with WPDS (#80417)
4aa6912c04 Base styles: Streamline focus ring override (#81242)
b9cfc73f09 Editor: Register the editor keyboard shortcuts from the provider (#81580)
ab2550247a Extensible Site Editor: Gate theme screens on theme support (#81581)
3f15b6b806 Dashboard Widgets: promote high-relevance actions into a chrome footer (#81556)
fe89562bf1 Update waveform player dependency patch (#81454)
6bef42943e Vitest: Resolve @flakiness/vitest reporter to an absolute path (#81582)
b37473fe87 Packages: Split blob, grid, interactivity, and theme tsconfigs (#81509)
b228eebdfc TypeScript: Add typecheck script and split root tsconfig into build and dev solutions (#81499)
c099637b7b Extensible Site Editor: Preview the site on Home for classic themes (#81578)
1e6382df01 Editor: Speed up the hierarchical term selector for large taxonomies (#81376)
94c4e660bc Adds JSdoc for `avatar` block's edit.js (#68867)
a3aa0de472 Refactor: Convert `createColorHOC` to functional component (#70408)
9aee7c24d5 Adds JSdoc for `audio` block's edit.js (#68865)
78640e0317 Adds JSdoc for `column` and `columns` block's edit.js (#68873)
fe1c9d5c42 Docs: Fix broken links to the Block API reference guides. (#81571)
5b6431c6b6 Editor: Use PluginSidebar in GlobalStylesSidebar (#81570)
9fa0b67fb2 Docs: Add Block Editing Mode Readme. (#69411)
c4c5c62582 Release: Improve changelog categorization (#81475)
d4d4c4d7c5 DataViews: vendor `ValidatedToggleControl` (#81492)
150cd6da98 Media Editor Route Experiment: Override media edit links to point to the new experimental media editor (#81559)
0f61d4aa2e Writing flow: select next block on Enter key (#63484)
d033d614e5 Media editor: keep initial modal focus on the dialog frame (#81541)
07d89d593e Fix: Delete key on empty heading transforms following paragraph into heading (#78779)
e69ab441df In-between indicator: make symmetric (#68074)
f69e114ba8 DOM: treat a caret at a soft line wrap as an ambiguous position in Firefox (#81003)
c384568f21 Fix: getQueryArgs discards everything after the second = in a query argument value (#81066)
7455cde4fc Editor: Stop `:has()` selectors recalculating the whole document on every block selection (#81471)
08117d8685 DataForm: Fix the datetime control sending two updates per calendar interaction (#81440)
eb039018ff Fix: Term Description block skips display filters inside Terms Query. (#81290)
dd73b57749 Editor: Correctly mark ToolsMoreMenuGroup as a private SlotFill (#81503)
08e4e81221 Admin UI: Add Navigation component and Page navigation slot (#79746)
26eea2b99c Theme: Move changelog entry to unreleased (#81508)
7a8a56b1d0 Theme: Avoid root-level relational selectors (#81457)
9f798f32a5 Packages: Move unreleased changelog entries out of the 23.8 published versions (#81502)
cdff370d46 Storybook: Upgrade Vite to 8 (#81494)
2aacf5a578 BlockEditVisuallyButton: Update Developer Documentation (#68987)
c19909efaf Adds README for inspector-controls-tabs component (#69072)
d36bccf8ca Update 23.8 release changes on trunk (#81485)
b8315bfee4 DataViews: vendor `ValidatedToggleGroupControl` (#81450)
506584fc8d Docs: Fix dead link in the dynamic blocks tutorial (#81399)
dc8ce1ddca DataViews: vendor `ValidatedFormTokenField` (#81451)
a1d24c1308 Dimensions: Fix aspect ratio and scale controls not reflecting external updates (#80747)
d87ee650e3 Docs: Add Background image control Readme (#69409)
3c78efc964 Icon: Fix margin being applied twice in the editor (#81292)
86802246ac DataViews: vendor `ValidatedComboboxControl` (#81449)
2f9f8ce646 Update Changelog for 23.8.0-rc.1
485c71d2a1 InputControl: Vertically center date and time input values in Safari (#81361)
9045eadf0b Env: Update git to latest commit when `--update` passed (#81447)
3ceebb60e8 Bump plugin version to 23.8.0-rc.1
59965b3e00 ESLint: Rename root eslint.config.cjs to eslint.config.mjs (#81468)
f377cd0210 Backport core fixes for finalize route (#81465)
cc8e2c958b Docs: Add Block Lock Readme (#69434)
62f77b7dfd Docs: Add Block List Readme (#69432)
76300ee874 Fix empty list block with anchor persisting after backspace deletion (#77000)
7d63751ba6 Fix: flaky autosave shareable URL revisions e2e test. (#81455)
4d914a0bf5 Block editor: disclose the nested block count of a multi selection (#80745)
ac8de62e8a Docs: Add Block Actions Readme (#69408)
d90ebd76e8 Normalize block gap values in layout (#81460)
bc0a68e7ae Remove an unmodified wrapper when all its inner blocks are removed (#42503)
175d53c3e1 Writing flow: stop the caret on containers that do not merge with the text flow (#81456)
1bfda6cd3e Spacing Sizes Control: Make the control label translatable independently of the input aria label. (#81240)
c98049dbf4 Block editor: render a real default block in place of the default appender (#81231)
74dd7dc8ad UI: Upgrade React DayPicker to version 10 (#81439)
7f83800464 DataViews: vendor ValidatedRadioControl (#81434)
4c3f3f4f15 DataViews: vendor ValidatedCheckboxControl (#81435)
3c7745836d DataViews: vendor `ValidatedNumberControl` (#81433)
ab730b2236 Cover: Avoid passing null as the featured image size (#81444)
5abfd415e8 Components: Remove ValidatedTextControl private API (#80680)
a91983ca6c DataViews: Move the rich text control into the editor package (#81430)
13a0338a03 components/Menu: Restore Modal focus return when menu items close (#81164)
121e579189 Fix: Regression: Tabs block: Start with empty tab labels with placeholders (#81429)
11f6247b6a Navigation Overlay Close: Inherit typography and color from the overlay (#80751)
99aee654cc Docs: Fix broken link to the Node.js debugging guide. (#81398)
9e8d50d490 fix: order site identity changes predictably (#81283)
589bb11f9f Feature: Tabs block: consider using the tab title in the Document Overview instead of a generic "Tab" label (#81427)
637513a31f UI: Add `Calendar` and `RangeCalendar`, moved from `components` private APIs (#81337)
6e52fa407d DataViews: vendor `ValidatedSelectControl` (#81391)
cd08bc77ef Notes: Fix text wrapping for long usernames in collaboration sidebar (#81406)
04172b2c60 Interface: Let CSS own the ComplementaryArea width and use AnimatePresence custom for exit (#81363)
9f8d048a3b Test: Add private Vitest config and migrate a pilot test (#81037)
52eccd71b7 Update Changelog for 23.7.2
ae2290d8e7 Tools: Make agent setup a workspace (#81418)
70be075950 Bump plugin version to 23.7.2
126a840c69 DataForm: Fix hidden fields validation (#81377)
1a1b94c8a2 Widget Dashboard: host-tunable tile spacing via public custom properties (#81352)
79e0ed0693 Core Data: Fix post staying dirty after saving edited post meta with RTC enabled (#81392)
c381238065 Format Library: Remove unused CSS rule (#77831)
63bbebcaf0 Block Mover: Add the keyboard shortcut to the buttons' spoken description (#81380)
a370a8b6b7 Block Editor: Fix Escape from the block toolbar and stop redundant last focus dispatches (#81319)
746d5c31cd Dashboard Widgets: split action icons into wire and resolved forms (#81381)
7f8f873059 Global Styles: report border, shadow, outline, filter and dimension changes (#81407)
7dc85951fa Global Styles: Migrate shadows presets to use the preset management layer. (#79812)
445cf4af7e Scripts: Prevent a UTF-8 BOM in the middle of extracted CSS (#81383)
923807350e Changed Build Process Link and remove unused tags (#81360)
25fc9c1204 wp-build: Render the no-JS fallback in the generated page templates (#81365)
9cfdeddc7c Docs: Add error message guidance. (#81143)
1980b08d46 Fix: flaky list view paste block styles e2e test (#81229)
1bccb3ab9b Interface: Stop the secondary sidebar animating into place on page load (#81362)
07e90d6582 IconButton: Improve keyboard shortcut accessibility (#80402)
f8466c3adb Monitor all setup-related composite Actions. (#81192)
eb976a5434 Bump actions/stale from 10.4.0 to 11.0.0 in /.github/workflows (#81219)
150c61e445 Bump github/codeql-action/upload-sarif (#81287)
0f7b5c4eef DataViews:  Fix `array` field type validation for empty values (#81378)
4762fb7ab9 UI: Derive Base UI direction from WordPress i18n (#80399)
fb1241521f Try: Set post navigation link icon to next. (#81384)
ffd97c0bbb Playlist: Improve audio conversion and track selection (#80926)
be74d5d3f6 Dashboard Widgets: add icon and relevance to the widget action envelope (#81275)
107fb08d0e Editor: Keep the canvas height stable while resizing the canvas (#81163)
226f1e8da8 Remove content types experiment (#81340)
139cc8a248 New `kebab-case` package: extract utility and migrate private API calls (#81294)
260cd94a20 Scope breakpoint media queries to screen so printing does not look like a resize (#81367)
de4da84c1e Block Editor: Convert useBlockVisibility hook to TypeScript (#80390)
dd9abb6c0b Global Styles: Migrate font size presets to the shared preset layer (#79811)
c7cdb48157 Site editor: fix unreadable sidebar hover color (#81317)
341268f857 Playlist: Normalize Waveform Player configuration handling (#81342)
77e4d24585 Docs: Fix typo in block file structure guide (#81348)
c24e8b59bf Markdownlint: disable the MD033 (no-inline-html) rule project-wide (#81213)
949ba8754f Docs: Fix broken links to the removed JavaScript build setup guide. (#81232)
b7e4955ccf Keycodes: Make `withIgnoreIMEEvents` a public API (#81343)
3f224e67b0 Block Editor: Simplify InspectorControlsFill rendering logic (#81286)
354f66c7e1 Pert Tests: Avoid inflating interaction metrics with startTracing (#81264)
2fcd74717a DataViews: Use the public `@wordpress/ui` Badge instead of the private one (#81236)
91b373e707 Components: Migrate Spinner styles from Emotion to SCSS module (#80511)
8181ec4897 ESLint: Remove legacy import suppressions (#81338)
6b364aac1e Block Library: Document security patch releases (#81295)
7f43eafcce ESLint: Replace strict config with bulk suppressions (#81248)
a8adbd7a56 Block Editor: Bail out of hasSelectedInnerBlock when there is no clientId (#81315)
a17b59cd8a Theme: Colocate plugin tests with implementations (#81247)
4ee374307c Document editEntityRecord's options.isCached param (#81318)
8323351f39 Site Editor: Decode HTML entities in Identity fields (#81269)
2cb64f7ea2 Block Inspector: Disable the 'Edit original' button when the entity ID is missing (#81288)
1516e9bfce theme.json schema: allow responsive states on block style variations (#81309)
197c37094f theme.json schema: responsive states belong to blocks (#81253)
e89872315e Render viewport state element styles in the editor (#81307)
e574bb5827 Docs: remove breakpoint-only element style example from global styles guide (#81308)
102eb74ff8 Style states: Fix phantom pseudo element style output (#81291)
007f062fe5 Global styles: render element styles set only inside a breakpoint (#81265)
69b17c5e98 Packages: Recover July 29 npm release metadata (#81303)
53d9d2fa53 Update Changelog for 23.7.1
9379c90e79 Bump plugin version to 23.7.1
b7e98ae647 Fix missing return value in force_filtered_html_on_import footnotes filter (#81293)
3e0fe0ce05 Style states: fix state deselection when selecting the already selected block (#81277)
e8bc5cd3ca Navigation: Complete the DocBlocks for the responsive container and overlay style helpers (#80622)
7c36647bc4 Fix output for post date
57d90e1193 Ensure Content block tags always match available options.
63487665fa DataViews: Inline the kebabCase utility from components (#81284)
b1bad31b46 Latest Comments Block: Ensure latest comments can be viewed only for public posts
8d969332c5 fix: add optional chaining for empty reusable block (#81165) (#81177)
23b5b854ed Update phpcs, wpcs dependencies (#81279)
c476176cd1 Icons: move the inline image icon into the library (#81271)
a96cd78103 Block Directory: Make downloadable block item labels translatable. (#81237)
97894177e6 Dashboard Widgets: remove the Hello Dolly download action (#81272)
2dab68ff95 Flaky tests: Report as a PR comment only, stop creating issues (#81218)
7911b6ceaf ESLint: Define dependency import rules (#81246)
6e365e3537 Docs: Remove dependency group import guidance (#81245)
dc4a6a1c99 List View: Migrate label wrapper to UI Stack and drop Badge from the anchor (#81266)
ebab53f3d3 theme.json schema: fix block pseudo-classes and custom states (#81209)
5e2b7c1b1f Docs: explain how the theme.json schema fixtures work (#81263)
f889575799 Global Styles: Remove unused duplicate font family preview utilities (#81194)
1e267a50fa Block editor: unify what a new sibling block inherits (#81250)
b31639cc09 Footnotes: guard against invalid post meta values (#81201)
bb108741c2 Media: Cover client-side big image scaling and orphaned files (#81061)
9cd1367227 Storybook: Enable design system theme tool globally (#81116)
773a915066 Use p elements for callout alerts in components docs (#81234)
7212715749 Fix: Trunk e2e failures caused by the navigation spec leaving plain permalinks (#81238)
90f2bd5b96 Components: Deprecate Animate (#80931)
61e43986ac URLInput: Skip search requests while an IME composition is in progress (#80602)
2ef358f6cd AGENTS: Update development tips section (#81224)
01c037b1ff Blocks: Support static block templates in block type settings (#80027)
a152341f8f Docs: Fix broken Figma links on the design resources page. (#81166)
f8c8421e38 List View: Split the context and drop dead props to cut re-renders on expand and collapse (#81159)
c004e77c30 Block Editor: Fix Select all freezing on large posts (#81210)
1c5ff32abd Update Changelog for 23.7.0
bfd5303f9d DataViews: Fix the between `date` filter losing a manually typed date on blur (#81150)
943f0a62be Bump plugin version to 23.7.0
503dad4e4c Blocks: Update hpq to 1.4.0 and drop the ts-expect-error suppressions (#81199)
2cd1c4a58b Block Editor: Return false from isBlockSelected when there is no client ID (#81212)
acf17cde10 DataViews: Make grid and table item preview aspect ratio configurable (#79329)
f7f5670d56 DataViews: Pass only eligible items to a bulk action callback (#81198)
04f245f71d Ensure device preview is always accurate when window is zoomed in (#81193)
11bae0c3c0 Components: Add allowForms prop to SandBox component (#76471)
6b40482d0f Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (#81206)
1eaeae76c3 Remove the editableRoot opt-in from the paragraph block (#81184)
3a96676bba PanelColorSettings: Restore the missing space below the panel header (#81155)
b8cb89c907 Widgets editor: Add ThemeProvider for admin color schemes (#81173)
625944407d Blocks: Declare the `@types/react-is` devDependency (#81203)
1908100a47 Customizer widgets: Add ThemeProvider for admin color schemes (#81174)
52c7652c34 List View: Reduce per-row store subscriptions (#81136)
95ca3f044e Edit Widgets: Fix header toolbar button focus ring (#81176)
bffdae3257 Notes: fix the mention notification email composition (#81187)
fa4eff0910 Button: turn on the width setting by default in theme.json (#81196)
f9306164a1 Types: Replace remaining `@ts-expect-error` suppressions with proper typing (#81200)
c1d8367952 ESLint: Ban `@ts-ignore` in favour of `@ts-expect-error` (#81148)
991a717425 Agents: Add a defensive data design skill and route to the copy guide (#81131)
09e1e7ada3 Fix/79643 rtc awareness mixed block selection (#79836)
214438c400 Bump astral-sh/setup-uv from 8.3.2 to 9.0.0 in /.github/workflows (#80964)
7a1e659744 fix(admin-ui): reset the wp-admin li margin that misaligns Breadcrumbs (#81134)
02fea5a045 Bump actions/setup-node from 6.4.0 to 7.0.0 in /.github/setup-node (#80963)
b281d24fb6 Bump docker/login-action (#80962)
4513b4226b Media Editor: Render sidebar tabs via ComplementaryArea's render prop (#81133)
fe2e582976 Video: clarify the Video variation description (#81181)
a5e3bb48d7 Video: Hide settings for the GIF variation (#81142)
a0642d18c4 Block Supports: Guard against non-string attribute values to avoid fatal errors (#80501)
415b6f4508 Media: Improve the HEIC upload error and keep any upload errors up until dismissed (#81130)
REVERT: 8fdde7f743 Sync: remove the framework's dual-homed intent-log frozen core
REVERT: 64444c5109 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
REVERT: bdb55c7385 Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
REVERT: b87dce07c4 Sync: backfill CHANGELOG for the framework/plugin split
REVERT: b7cf02e709 Docs: bring the sync architecture docs up to date for the framework/plugin split
REVERT: 0d08f16481 Sync: remove the built-in transports from the framework
REVERT: 897e974c36 Sync: remove the Yjs engine from the framework (step 4b)
REVERT: 6180c357c8 Sync: make connection retry transport-agnostic (E2)
REVERT: 901a2ba337 Sync: make createSyncManager engine-neutral (step 4a)
REVERT: d574f8d1fe Sync: route the collection path through the engine (step 3)
REVERT: 8af5069291 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
REVERT: 88b2a22cf2 Sync: remove the intent-log engine from the framework (now plugin-only)
REVERT: 8f2cc74969 Sync: expose registry test-support + session seam types for engine plugins
REVERT: bc1fcc6bc3 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
REVERT: df743b1a68 Sync: Make the collaboration framework engine/transport-less by default
REVERT: 523cadb3b4 Docs: Add an as-built architecture overview with mermaid diagrams
REVERT: 773340178d Sync: Add the WebSocket transport (daemon + codec-driven client)
REVERT: a89022d73a Sync: Make transports swappable; add HTTP long-polling
REVERT: d312ecce21 Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
REVERT: 660ae1b184 Sync: Inline approval card for parked new-block proposals
REVERT: dd19643e94 Sync: Reserve Restore of requires-approval conflicts for capable users
REVERT: cb2c50f4e6 Sync: Stop dropping classic content; sync it as core/freeform
REVERT: e8b70c2618 Sync: Sync Custom HTML blocks through the content field (raw-content model)
REVERT: 1ab2581641 Sync: Fix the capture bug that silently blocked Custom HTML sync
REVERT: 0af03d60d5 Sync: Regression-test benign-to-protected attr value transitions
REVERT: d0fdd1290b Sync: Gate raw-attr markup at ingest; make block restore an approval
REVERT: c1353269a8 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
REVERT: 0a1dc908bf Sync: Anchor collaboration conflicts to blocks in the canvas
REVERT: 3cc6837dde Sync: Add the collaboration review panel to the document sidebar
REVERT: 42f4414661 Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
REVERT: 91d7ecb57a Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
REVERT: a6d52fe0a7 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
REVERT: 3cf3eea27f Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
REVERT: 887baa76b6 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
REVERT: 8dbac3a784 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
REVERT: e943fe7ef5 Docs: adversarial review of the intent-log branch (2026-08-05)
REVERT: 7fd02053b5 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
REVERT: be5fe799a1 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
REVERT: 58d3696eb9 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
REVERT: 689df3c0b6 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
REVERT: 7f205989c6 Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
REVERT: 034a9851a1 Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
REVERT: 05f376da52 Sync: presence for the intent-log engine (Phase 2d-viii)
REVERT: 30573c2ba6 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
REVERT: 7f3fe44da7 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
REVERT: af4e398cec Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
REVERT: 81091c0de0 Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
REVERT: 7d8414c8ec Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
REVERT: e1778e094f Sync: never treat editor staleness as user intent (Phase 2d-iii)
REVERT: e9261e7785 Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
REVERT: 8b4125788a Sync: record Phase 2d-i status in the architecture note
REVERT: 6b71de6649 Collaboration: live two-browser intent-log editing (Phase 2d-i)
REVERT: 56a2ec4542 Sync: record Phase 2c status in the architecture note
REVERT: 2daebd226c Sync: intent-log manager and adapter registration (Phase 2c-ii)
REVERT: 748153187a Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
REVERT: 93b4c5710d Sync: record Phase 2a/2b status in the architecture note
REVERT: e664cd0fcb Sync: intent-log client session codec (Phase 2b)
REVERT: f21a254365 Collaboration: unit tests for intent-log engine internals and adversarial ids
REVERT: a007745cb2 Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
REVERT: b965e32f1d Sync: narrow transports to engine-opaque payloads (Phase 1c)
REVERT: 188ce3728c Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
REVERT: dfe2434194 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
REVERT: 9dc871f8f5 Collaboration: extract a swappable sync engine seam (Phase 0)
REVERT: 5a3fa0c64d Sync prototype: intent-log engine with field-scoped merge semantics

git-subtree-dir: gutenberg
git-subtree-split: 83e144efc9cb29d5a2cc0f203c3009549e4868f8
chriszarate added a commit that referenced this pull request Aug 24, 2026
83e144efc9 Sync: finish the trunk merge — drop two framework pieces this branch owns elsewhere
c6b266bc75 Rebuild package-lock.json on trunk's lock
2c50a5e9cd Sync: follow trunk's RTC experiment gate after the rebase
698a2fc7ca V1: integrated loop output, verified as a whole (#35)
13d1b3e154 Add more explicit test timeouts, reduce some default timeouts (#8)
cf93599113 Make intent-log the framework's default engine
0a9a170bdb Relocate the transport-specific e2e harness from the framework subtree
f683739358 Remove framework residue duplicated by or migrated to this plugin
7f36932c0d Sync: remove the framework's dual-homed intent-log frozen core
2149d22061 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
04d32960fd Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
1cd70e6820 Sync: backfill CHANGELOG for the framework/plugin split
7062018ff2 Docs: bring the sync architecture docs up to date for the framework/plugin split
98e8ba2fdf Sync: remove the built-in transports from the framework
14b9a11c67 Sync: remove the Yjs engine from the framework (step 4b)
cda266cad7 Sync: make connection retry transport-agnostic (E2)
00d42e9d76 Sync: make createSyncManager engine-neutral (step 4a)
f58a913289 Sync: route the collection path through the engine (step 3)
4008ded853 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
18ac9e5037 Sync: remove the intent-log engine from the framework (now plugin-only)
ce2d216dd6 Sync: expose registry test-support + session seam types for engine plugins
01111eee44 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
022ebd91e2 Sync: Make the collaboration framework engine/transport-less by default
8ac75c8cae Docs: Add an as-built architecture overview with mermaid diagrams
b3567fd4dc Sync: Add the WebSocket transport (daemon + codec-driven client)
276bd27a87 Sync: Make transports swappable; add HTTP long-polling
d0fb51470f Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
60eb412dfa Sync: Inline approval card for parked new-block proposals
08d3ecedcb Sync: Reserve Restore of requires-approval conflicts for capable users
5d24f4cc2c Sync: Stop dropping classic content; sync it as core/freeform
14a82d708b Sync: Sync Custom HTML blocks through the content field (raw-content model)
3be3b1c3e5 Sync: Fix the capture bug that silently blocked Custom HTML sync
65e8bf9369 Sync: Regression-test benign-to-protected attr value transitions
9983a07e54 Sync: Gate raw-attr markup at ingest; make block restore an approval
b63d141b62 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
bb4c4b9e9b Sync: Anchor collaboration conflicts to blocks in the canvas
11165044f7 Sync: Add the collaboration review panel to the document sidebar
ca51d70d4d Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
6a9357f463 Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
791a40e653 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
5149d9a9d3 Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
a71e3103c5 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
4dad221495 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
9668010b7b Docs: adversarial review of the intent-log branch (2026-08-05)
00f5867bf9 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
ffac7acf99 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
c070625a92 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
c27fb74ea7 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
86bb5d76ec Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
bbb0d851fe Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
1a108bb136 Sync: presence for the intent-log engine (Phase 2d-viii)
c8e9d59ae9 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
ffd4f44fb2 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
37456458bc Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
4146e4eb2c Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
bafedefbc6 Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
09c9ae78f2 Sync: never treat editor staleness as user intent (Phase 2d-iii)
bf2f8223ca Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
c03be224b9 Sync: record Phase 2d-i status in the architecture note
bf84dcd84a Collaboration: live two-browser intent-log editing (Phase 2d-i)
c6ffc0cf77 Sync: record Phase 2c status in the architecture note
12ba54f1f4 Sync: intent-log manager and adapter registration (Phase 2c-ii)
5bd6737e62 Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
46fb9020d3 Sync: record Phase 2a/2b status in the architecture note
76b516ded4 Sync: intent-log client session codec (Phase 2b)
c16d278721 Collaboration: unit tests for intent-log engine internals and adversarial ids
bbd1591b2d Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
312f3b3fe4 Sync: narrow transports to engine-opaque payloads (Phase 1c)
fb9af267ff Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
9276dc7c37 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
98365687c4 Collaboration: extract a swappable sync engine seam (Phase 0)
e61523237a Sync prototype: intent-log engine with field-scoped merge semantics
be1a0b58a2 UI: Add tooltips to Calendar and RangeCalendar navigation buttons (#81983)
db3254554c Pattern List: Import a pattern from JSON (#81919)
3bbdb29369 Fix: skip empty block markup in navigation to prevent split UL elements (#78793)
d13be36ff4 Fix: Line Break Tags Added to Scripts and Styles (#77542)
c96732f578 Styles Route: Reference the api-fetch and html-entities projects (#81989)
39088bf09a Block Styles: Refactor the variation UI to use ui/Button (#81833)
f8bec56d62 Extensible Site Editor: Add a theme preview page with global styles editing (#81954)
874959034f Boot: Mount the registered plugins (#81754)
086650feed Updated broken links in document files (#81961)
ec35342e1c Block Editor: Don't close inserter panel when inline quick inserter opens (#76241)
fd305b0fc6 Replace the Storybook test runner with the Vitest integration (#81918)
194f70eaa2 DataViews: Localize the date/datetime calendars from the site locale and direction (#81592)
fcf11dc55e DataViews: use `Menu` from `@wordpress/ui` (#81783)
cb20a4361e CollapsibleCard: Support multiple header descriptions (#81227)
094b1b094f Theme: Update Terrazzo packages to 2.7.1 (#81978)
0ae1399378 fix: Button rtl loader issue (#81901)
af8db520dc Components: migrate StyledLabel to SCSS module (#80001)
85b8c96615 UI: Add ValidatedInputControl component (#81627)
0e7546c0af Hide layout panel when no controls are available (#81968)
ca1b3fe1fe Docs: Align @PARAM tag columns in test/ docblocks (#81905)
8e57b0d27f Components: migrate GradientPicker, ColorPalette to SCSS module (#80473)
953a217f29 TypeScript: Bring the remaining route projects under the typecheck run (#81847)
6eddc656dd List: Add Align Support (#68002)
75768b4e6f UI: Accept locale codes in Calendar components (#81814)
87702decc4 DataViews: Fix date and datetime controls selecting the adjacent day (#81498)
a42b6775f4 Block editor: Move isElementVisible changelog entry to Unreleased (#81953)Co-authored-by: shail-mehta <shailu25@git.wordpress.org> Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
63b5d22cc1 Block Library: Fix failing test in playlist block (#81950)
009745b24e Playlist Track: Improve track upload error flows (#81878)
98047a5bf0 Automated Testing: Change Storybook default a11y test to error on failure (#81597)
f1b97bb6dc Playlist: Add bulk track metadata editing (#81441)
5b5c741de8 Dependency updates Aug 2026 (2) (#81906)
1e40a0d4a0 DataForm: Make the panel layout edit button the real field trigger (#80689)
5d097d5300 DataViews: Sync the displayed calendar month with external value changes (#81635)
f6e389d3a1 Update is-plain-object to 5.1.0 (#81926)
23ac1cdd11 Build Scripts: Force tsc --pretty so CI reports the project behind global diagnostics (#81937)
e5bc5a5fd1 Font library: Add skeleton loader for the font preview images (#81047)
d1e24d6340 Documentation: Update coding guidelines to recommend TypeScript (#81763)
b5e015d0c0 Storybook: Upgrade to 10.5 (#80692)
704b421e55 Use `WCInputControl` alias for legacy InputControl imports (#81830)
047dc276e2 SearchableChipSelect: Add grouped items support (#80989)
c836e0d30f Validation: update dependency-audit to 0.4.6 and ignore dataviews ./wp bundle (#81928)
57c278ca27 Editor: Migrate hierarchical term selector to @wordpress/ui (#81848)
c217b2698e Font Library: Fix the preview weight for variable fonts (#81748)
56897408ab Components: Improve text detection for button icon-with-text (#81521)
eaf986a580 Use `WCTextareaControl` alias for legacy TextareaControl imports (#81834)
54f9e9f675 chore: Update the combobox SCSS to have a breaking changes log (#81923)
5a675bf1d0 Update Ariakit packages (0.4.35 => 0.4.37) (#81080)
d76e6529dd UI: Update Base UI to 1.7.0 (#81390)
31f04b7159 Components: migrate ComboboxControl to SCSS module (#80471)
1d6106c233 Pre-publish panel: Remove the headings that repeat the panel title (#81806)
c49982dcb2 Editor: Set the width an entity opens at from the editor provider (#81750)
4ae7b44119 Global Styles: Close the revisions screen on the first back click (#81897)
c368c6810d Preserve layout and style attributes on Column transform (#81855)
e35b95c0ed Refactor parameter type hints and clean comments (#81898)
7f2be02a0b Try caching gutenberg_get_global_styles (#81889)
bfe2bf29ad Color Palette panel: Remove empty whitespace when there are no theme colors (#81894)
7cea1c72e1 Global Styles: Allow editing duotone palettes (#81605)
91e7ca7a59 Design System: Add portable agent skills (#80597)
eee4867232 Pattern: Disable visibility support (#81866)
c36cbd2cdd Storybook: Handle production module load failures (#81867)
d3f2c507db Global Styles: Group shadow editor rows as items (#81871)
4cbf437576 UI: add ControlWithError component (#81574)
70af7dbbb8 Fix/79641 rtc cursor hidden details block v2 (#81322)
f854b6b139 Storybook: Fix default background color for Example Application theme story (#81765)
157cff2ddd Editor: Announce publish date changes to screen readers (#81629)
da0bf8d33d UI: Mark Autocomplete, Field, and Fieldset as recommended (#80636)
0619247335 Core Data: Allow keyless entities to be addressed without a record ID (#81857)
3e52ca93e2 Dependencies: Dedupe, update adm-zip, nx (#81870)
e8aed3c82b Core Data: Validate the parsed-blocks cache against registered block types (#81809)
417261c052 Build: Emit TypeScript declarations with --noCheck (#81839)
06b9b58daf Boot: Migrate styles to CSS Modules (#81756)
d33e8a4154 Update save & submit docs (#81077)
427871b0cf Editor: Surface debugging details in the ErrorBoundary (#81642)
7deb3826a4 Theme: Add color warning diagnostics workbench (#81817)
a1e8d1dfaa UI: Expose keyboard shortcut presentation utilities (#81826)
04b2317c6b Editor: Remove FlexItem usage from NoteCard (#81851)
0b566e44b3 Add transform to Row for Columns block (#81802)
1b0671fbaf Add missing dependency to media-editor route (#81845)
23e8873b2c TypeScript: Put route projects under the typecheck run (#81829)
ee5da7178e Updated Aria Landmark Example URL (#81832)
f74762325c Fix MediaPlaceholder drag eligibility (#81431)
eba80d22a2 Docs: Fix broken skip ahead anchor on the custom block editor guide. (#81835)
442851efd6 Global Styles: Keep storing shadow presets as CSS variables when custom presets exist (#81346)
4d03cf0ed6 Bump astral-sh/setup-uv from 9.0.0 to 10.0.0 in /.github/workflows (#81823)
6106e2177b Components: migrate ResizableBox to SCSS module- #80720 (#81792)
c9e913d798 Storybook: Fix production build warnings (#81758)
a2d98c2883 Docs: Narrow the tsconfig split guidance to the standard layout (#81828)
94a108d3c9 UI: Add TextareaControl component (#81359)
e5039135ce Quick Inserter: Standardize the design of the Browse all button (#81827)
add1acd40f Docs: Fix broken link to the getEntityRecords selector reference. (#81791)
61121263ba Post Template: Fix mover arrows and labels for blocks inside the grid view (#81120)
321d5c87c7 UI: Mark Input-related components as recommended (#81658)
232cf07f1a UI: Add initial agents guidance mapping to contributing guidelines (#81400)
0aa2071fec Fix: Post Editor: 403 on /wp/v2/settings at boot for users without manage_options cap (#81813)
a0c83b4dd7 Add command: View post (#66720)
073b06862f add context to change "revisions code diff" (#81820)
3a5b8ad2dd Patterns explorer: Refactor the category sidebar to use Tabs (#81807)
eca76ad768 Menu: Add UI component (#79560)
8119bc827d Fields: migrate last remaining JS file to TS (#81808)
55f56985be Components: Fix Storybook accessibility issues in stories (#81777)
12fd2f5612 Playlist: Remove block toolbar sharing between parent and child blocks (#81432)
9359cf2bbf Rename the media editor toolbar button to 'Edit image' (#81705)
aee1d48442 Block Editor: Remove leftover files (#81793)
28c348acdf TypeScript: Require the typecheck run for type checking in CI (#81518)
f57b5d3bb6 Packages: Complete the tsconfig build and dev project split (#81517)
03211d47a7 Packages: Split story package tsconfigs into build and dev projects (#81516)
bce33cb4ff Editor: Debounce term filtering and announce results once (#81422)
15503fd5e5 Tests: Make PHPUnit tests independent of test config flags and theme root (#79159)
9d2c909e53 Docs: Fix broken link to the Document-Isolation-Policy explainer. (#81790)
2a59379cc1 Build Package: Use Core's boot module when a plugin has none (#81761)
038142b853 Update Changelog for 23.8.0
ca0444b218 Bump plugin version to 23.8.0
b0316b6134 Fix: Post Editor: Canvas animates from the left when switching mobile/tablet preview to desktop (#81484)
feb072be0e Media Editor Route: Add undo/redo and save/cancel actions to the header (#81563)
3abf43f1df Notes: Stop forcing capitalization of user names (#81788)
e16e4bbd88 Fix Broken Links in Package file (#81700)
42e91ce205 Command Palette: Allow commands to override the category icon (#81787)
3ba8bb1750 Components, DataViews, Editor, UI: Split tsconfigs into build and dev projects (#81515)
336666c980 Schemas: Document what the theme.json schema checks (#81773)
fdf5711313 More block: clarify description about excerpt vs full content (#80619)
96a6d41dc1 Theme: Improve color ramp contrast safeguards (#81185)
ab98811095 Dashboard Widgets: resolve widget types without a metadata module (#81738)
6e4cf9c292 Dashboard: add a Site Health detail page as the dashboard's second route (#81729)
e434463145 Align collaboration migration version markers with the 23.8.0 release (#81789)
bee1b17fb1 RTC: Add fallback identities when user profiles are unavailable (#81408)
894f273e9b Fix the failing e2e test (#81739)
e43dcaa48f Fields: Export the package stylesheet (#81769)
03811bd605 UI: Add Spinner component (#81358)
725b1f48e0 Fix DataViews list layout color token usage (#81074)
9a9d9c535a Notes: keep the note actions menu in view for long display names (#81414)
825d1789fb Update playlist track placeholder to match aria label (#81762)
939b3f3a92 ui/Card: Use the default neutral border (#81746)
a5e0b24f14 RTC: Couple RTC and polling provider as an opt-in experiment (#80658)
da621f2e6a Modal: Stop Escape key propagation on dismiss (#81785)
c00d0697de Tabs: Give tab IDs their own counter so numbering starts at 1 and never skips (#81781)
0ea2e57cb7 BoxControl: update the opposite side when ALT is held on the left or right input (#81530)
b6453f2621 Fix: Accordion: Anchored hash inside the accordion throws the malformed URL console error (#81780)
dc30b9dde7 Site editor: update template section description. (#81613)
a81f0474d9 Global styles: Register <label> as element (#81160)
cb8fc5f5c2 Block Editor: Add translator context to pseudo-state labels (#81770)
348c2da73c Fix: URL: normalizePath drops the rest of the query after a second "?" (#81612)
d889c67cbb Fix clipped focus outlines in the media editor Details sidebar (#81703)
87acb90b99 Prevent white screen crash during undo operations when Media Modal is open (#79898)
d1703e053a Global Styles: filter and indicate blocks that have custom styles (#81373)
8d862829e1 Media Editor Route: Make the route look like it's part of the media menu in the left-hand sidebar (#81565)
1bb4e5b157 Packages: Split tsconfigs for utility and mid-size packages (#81514)
4061b86a00 Enable axial gap for Group and restrict to flex and grid layouts. (#81476)
daf9c82168 Feat: support block spacing (#79689)
05abdcb349 Bump github/codeql-action/upload-sarif (#81436)
87826e5c9c Add `__unstable_wp_sync_storage` filter for pluggable storage backends (#81697)
1f6157810c UI: Collapse item-popup item sizing to default and small (#81354)
ba25994b47 Playlist: Add aria-label to prevent placeholder as label (#81654)
227aff3290 Components: Migrate DropdownContentWrapper to SCSS module (#81522)
75b9133222 Site Editor: Use inverted ThemeProvider seed for portaled UI (#81653)
4849c664c3 Update Terrazzo packages to 2.5.0 (#81082)
2f1563b9e0 Build Tools: Stop watcher process trees on shutdown (#81504)
262c721c8a Docs: Require site editor features to land in the extensible site editor too (#81752)
02aae3ab29 Boot: Preview the site where the canvas has nothing to open (#81749)
47e68c9f4c List View: Fix flaky global shortcut test and re-enable it (#81690)
ac1cf9e039 Lazy Editor: Keep the theme's editor styles on the canvas (#81747)
a2556e7201 Stop saving Table of Contents output (#80404)
5171671b5b Boot: Sync the editor's device preview with the URL (#81617)
ce19c147a8 RichText: Use the current record when handling Enter (#81696)
3f668616ac Editor: Simplify List View sidebar shortcut handling (#81693)
97a82266de Block API: Address review feedback on block keyboard shortcuts (#81621)
1b45b0780d Boot: Do not offer to edit a trashed entity (#81632)
e3187a5760 Edit Site Init: Seed the editor preferences the editor expects (#81628)
db5c14db14 Lazy Editor: Render the editor preferences modal (#81630)
090b2acc04 List View: Make focus on mount opt in (#81659)
137e908a9c Make Back button grid column flexible. (#81701)
cd0c368a2e Layout block supports: cast numeric grid attributes before use (#81560)
55dabd69d6 Inner Blocks: Fix bug that caused alignment controls to show in Image blocks within a Gallery (#81606)
d3c65d3a7e Admin UI: Fix the primary color of the Fresh admin color scheme (#81618)
2d9c286ac6 Playlist Track: Show upload spinner inline (#81445)
de9e36e54e Fix playlist track toolbar insertion (#81639)
614b3bf6b2 Editor: Refactor 'ErrorBoundary' to use the new recommended components (#81638)
0a886b47c9 Env: Fall back to cached docker images when the registry is unreachable (#81631)
ebd2ecafaa Boot: Warn before leaving with unsaved changes (#81625)
bff0a80003 Boot: Contain a surface failure to that surface (#81622)
f9913ca552 Perf: Report the first block selection as its own metric (#81616)
1c46b11820 Boot: Translate the canvas click-to-edit label (#81620)
0e92e54c99 Storybook: Add Story for  InnerBlocks (#68651)
f36f2bb2f3 Block API: Declare block keyboard shortcuts on variations and transforms (#81588)
476847df51 Boot: Let the editor canvas navigate between entity records (#81590)
11474d21bd Block Editor: Never spotlight blocks in a preview (#81615)
f3ec0c66e7 Storybook: Add Story for BlockPopover (#68681)
3bb6eb7a08 Global Styles: Expose additional elements in Typography and Colors (#80852)
ee35d7c8d3 Extensible Site Editor: Show only the style book on Styles for classic themes (#81579)
b65ede97c9 Storybook: Add Story for URLPopup component (#68449)
9f30bf7872 ComboboxControl: narrow `onChange` callback type to `string` | `null` (#81568)
560d975e66 Extensible Site Editor: Add the Identity route (#81576)
51d339f0d0 URL: Stop normalizePath throwing on a malformed percent sequence (#81086)
f3b8155a3b Fix parent inserter alignment with text labels enabled (#81608)
9aa7406203 url: clamp the truncated file name slice in filterURLForDisplay (#81529)
dbe1c1ccab Block editor: add an inserter to the parent selector (#81532)
aa50808db6 Fix viewport state values set by grid resizer (#81601)
6f26db48d8 Add Gutenberg version details for WordPress 7.1 (#81600)
be330310c5 Base Styles: Align `input-control` mixin to design system (#81357)
2b714533ed Components: Align legacy form control focus rings with WPDS (#80417)
4aa6912c04 Base styles: Streamline focus ring override (#81242)
b9cfc73f09 Editor: Register the editor keyboard shortcuts from the provider (#81580)
ab2550247a Extensible Site Editor: Gate theme screens on theme support (#81581)
3f15b6b806 Dashboard Widgets: promote high-relevance actions into a chrome footer (#81556)
fe89562bf1 Update waveform player dependency patch (#81454)
6bef42943e Vitest: Resolve @flakiness/vitest reporter to an absolute path (#81582)
b37473fe87 Packages: Split blob, grid, interactivity, and theme tsconfigs (#81509)
b228eebdfc TypeScript: Add typecheck script and split root tsconfig into build and dev solutions (#81499)
c099637b7b Extensible Site Editor: Preview the site on Home for classic themes (#81578)
1e6382df01 Editor: Speed up the hierarchical term selector for large taxonomies (#81376)
94c4e660bc Adds JSdoc for `avatar` block's edit.js (#68867)
a3aa0de472 Refactor: Convert `createColorHOC` to functional component (#70408)
9aee7c24d5 Adds JSdoc for `audio` block's edit.js (#68865)
78640e0317 Adds JSdoc for `column` and `columns` block's edit.js (#68873)
fe1c9d5c42 Docs: Fix broken links to the Block API reference guides. (#81571)
5b6431c6b6 Editor: Use PluginSidebar in GlobalStylesSidebar (#81570)
9fa0b67fb2 Docs: Add Block Editing Mode Readme. (#69411)
c4c5c62582 Release: Improve changelog categorization (#81475)
d4d4c4d7c5 DataViews: vendor `ValidatedToggleControl` (#81492)
150cd6da98 Media Editor Route Experiment: Override media edit links to point to the new experimental media editor (#81559)
0f61d4aa2e Writing flow: select next block on Enter key (#63484)
d033d614e5 Media editor: keep initial modal focus on the dialog frame (#81541)
07d89d593e Fix: Delete key on empty heading transforms following paragraph into heading (#78779)
e69ab441df In-between indicator: make symmetric (#68074)
f69e114ba8 DOM: treat a caret at a soft line wrap as an ambiguous position in Firefox (#81003)
c384568f21 Fix: getQueryArgs discards everything after the second = in a query argument value (#81066)
7455cde4fc Editor: Stop `:has()` selectors recalculating the whole document on every block selection (#81471)
08117d8685 DataForm: Fix the datetime control sending two updates per calendar interaction (#81440)
eb039018ff Fix: Term Description block skips display filters inside Terms Query. (#81290)
dd73b57749 Editor: Correctly mark ToolsMoreMenuGroup as a private SlotFill (#81503)
08e4e81221 Admin UI: Add Navigation component and Page navigation slot (#79746)
26eea2b99c Theme: Move changelog entry to unreleased (#81508)
7a8a56b1d0 Theme: Avoid root-level relational selectors (#81457)
9f798f32a5 Packages: Move unreleased changelog entries out of the 23.8 published versions (#81502)
cdff370d46 Storybook: Upgrade Vite to 8 (#81494)
2aacf5a578 BlockEditVisuallyButton: Update Developer Documentation (#68987)
c19909efaf Adds README for inspector-controls-tabs component (#69072)
d36bccf8ca Update 23.8 release changes on trunk (#81485)
b8315bfee4 DataViews: vendor `ValidatedToggleGroupControl` (#81450)
506584fc8d Docs: Fix dead link in the dynamic blocks tutorial (#81399)
dc8ce1ddca DataViews: vendor `ValidatedFormTokenField` (#81451)
a1d24c1308 Dimensions: Fix aspect ratio and scale controls not reflecting external updates (#80747)
d87ee650e3 Docs: Add Background image control Readme (#69409)
3c78efc964 Icon: Fix margin being applied twice in the editor (#81292)
86802246ac DataViews: vendor `ValidatedComboboxControl` (#81449)
2f9f8ce646 Update Changelog for 23.8.0-rc.1
485c71d2a1 InputControl: Vertically center date and time input values in Safari (#81361)
9045eadf0b Env: Update git to latest commit when `--update` passed (#81447)
3ceebb60e8 Bump plugin version to 23.8.0-rc.1
59965b3e00 ESLint: Rename root eslint.config.cjs to eslint.config.mjs (#81468)
f377cd0210 Backport core fixes for finalize route (#81465)
cc8e2c958b Docs: Add Block Lock Readme (#69434)
62f77b7dfd Docs: Add Block List Readme (#69432)
76300ee874 Fix empty list block with anchor persisting after backspace deletion (#77000)
7d63751ba6 Fix: flaky autosave shareable URL revisions e2e test. (#81455)
4d914a0bf5 Block editor: disclose the nested block count of a multi selection (#80745)
ac8de62e8a Docs: Add Block Actions Readme (#69408)
d90ebd76e8 Normalize block gap values in layout (#81460)
bc0a68e7ae Remove an unmodified wrapper when all its inner blocks are removed (#42503)
175d53c3e1 Writing flow: stop the caret on containers that do not merge with the text flow (#81456)
1bfda6cd3e Spacing Sizes Control: Make the control label translatable independently of the input aria label. (#81240)
c98049dbf4 Block editor: render a real default block in place of the default appender (#81231)
74dd7dc8ad UI: Upgrade React DayPicker to version 10 (#81439)
7f83800464 DataViews: vendor ValidatedRadioControl (#81434)
4c3f3f4f15 DataViews: vendor ValidatedCheckboxControl (#81435)
3c7745836d DataViews: vendor `ValidatedNumberControl` (#81433)
ab730b2236 Cover: Avoid passing null as the featured image size (#81444)
5abfd415e8 Components: Remove ValidatedTextControl private API (#80680)
a91983ca6c DataViews: Move the rich text control into the editor package (#81430)
13a0338a03 components/Menu: Restore Modal focus return when menu items close (#81164)
121e579189 Fix: Regression: Tabs block: Start with empty tab labels with placeholders (#81429)
11f6247b6a Navigation Overlay Close: Inherit typography and color from the overlay (#80751)
99aee654cc Docs: Fix broken link to the Node.js debugging guide. (#81398)
9e8d50d490 fix: order site identity changes predictably (#81283)
589bb11f9f Feature: Tabs block: consider using the tab title in the Document Overview instead of a generic "Tab" label (#81427)
637513a31f UI: Add `Calendar` and `RangeCalendar`, moved from `components` private APIs (#81337)
6e52fa407d DataViews: vendor `ValidatedSelectControl` (#81391)
cd08bc77ef Notes: Fix text wrapping for long usernames in collaboration sidebar (#81406)
04172b2c60 Interface: Let CSS own the ComplementaryArea width and use AnimatePresence custom for exit (#81363)
9f8d048a3b Test: Add private Vitest config and migrate a pilot test (#81037)
52eccd71b7 Update Changelog for 23.7.2
ae2290d8e7 Tools: Make agent setup a workspace (#81418)
70be075950 Bump plugin version to 23.7.2
126a840c69 DataForm: Fix hidden fields validation (#81377)
1a1b94c8a2 Widget Dashboard: host-tunable tile spacing via public custom properties (#81352)
79e0ed0693 Core Data: Fix post staying dirty after saving edited post meta with RTC enabled (#81392)
c381238065 Format Library: Remove unused CSS rule (#77831)
63bbebcaf0 Block Mover: Add the keyboard shortcut to the buttons' spoken description (#81380)
a370a8b6b7 Block Editor: Fix Escape from the block toolbar and stop redundant last focus dispatches (#81319)
746d5c31cd Dashboard Widgets: split action icons into wire and resolved forms (#81381)
7f8f873059 Global Styles: report border, shadow, outline, filter and dimension changes (#81407)
7dc85951fa Global Styles: Migrate shadows presets to use the preset management layer. (#79812)
445cf4af7e Scripts: Prevent a UTF-8 BOM in the middle of extracted CSS (#81383)
923807350e Changed Build Process Link and remove unused tags (#81360)
25fc9c1204 wp-build: Render the no-JS fallback in the generated page templates (#81365)
9cfdeddc7c Docs: Add error message guidance. (#81143)
1980b08d46 Fix: flaky list view paste block styles e2e test (#81229)
1bccb3ab9b Interface: Stop the secondary sidebar animating into place on page load (#81362)
07e90d6582 IconButton: Improve keyboard shortcut accessibility (#80402)
f8466c3adb Monitor all setup-related composite Actions. (#81192)
eb976a5434 Bump actions/stale from 10.4.0 to 11.0.0 in /.github/workflows (#81219)
150c61e445 Bump github/codeql-action/upload-sarif (#81287)
0f7b5c4eef DataViews:  Fix `array` field type validation for empty values (#81378)
4762fb7ab9 UI: Derive Base UI direction from WordPress i18n (#80399)
fb1241521f Try: Set post navigation link icon to next. (#81384)
ffd97c0bbb Playlist: Improve audio conversion and track selection (#80926)
be74d5d3f6 Dashboard Widgets: add icon and relevance to the widget action envelope (#81275)
107fb08d0e Editor: Keep the canvas height stable while resizing the canvas (#81163)
226f1e8da8 Remove content types experiment (#81340)
139cc8a248 New `kebab-case` package: extract utility and migrate private API calls (#81294)
260cd94a20 Scope breakpoint media queries to screen so printing does not look like a resize (#81367)
de4da84c1e Block Editor: Convert useBlockVisibility hook to TypeScript (#80390)
dd9abb6c0b Global Styles: Migrate font size presets to the shared preset layer (#79811)
c7cdb48157 Site editor: fix unreadable sidebar hover color (#81317)
341268f857 Playlist: Normalize Waveform Player configuration handling (#81342)
77e4d24585 Docs: Fix typo in block file structure guide (#81348)
c24e8b59bf Markdownlint: disable the MD033 (no-inline-html) rule project-wide (#81213)
949ba8754f Docs: Fix broken links to the removed JavaScript build setup guide. (#81232)
b7e4955ccf Keycodes: Make `withIgnoreIMEEvents` a public API (#81343)
3f224e67b0 Block Editor: Simplify InspectorControlsFill rendering logic (#81286)
354f66c7e1 Pert Tests: Avoid inflating interaction metrics with startTracing (#81264)
2fcd74717a DataViews: Use the public `@wordpress/ui` Badge instead of the private one (#81236)
91b373e707 Components: Migrate Spinner styles from Emotion to SCSS module (#80511)
8181ec4897 ESLint: Remove legacy import suppressions (#81338)
6b364aac1e Block Library: Document security patch releases (#81295)
7f43eafcce ESLint: Replace strict config with bulk suppressions (#81248)
a8adbd7a56 Block Editor: Bail out of hasSelectedInnerBlock when there is no clientId (#81315)
a17b59cd8a Theme: Colocate plugin tests with implementations (#81247)
4ee374307c Document editEntityRecord's options.isCached param (#81318)
8323351f39 Site Editor: Decode HTML entities in Identity fields (#81269)
2cb64f7ea2 Block Inspector: Disable the 'Edit original' button when the entity ID is missing (#81288)
1516e9bfce theme.json schema: allow responsive states on block style variations (#81309)
197c37094f theme.json schema: responsive states belong to blocks (#81253)
e89872315e Render viewport state element styles in the editor (#81307)
e574bb5827 Docs: remove breakpoint-only element style example from global styles guide (#81308)
102eb74ff8 Style states: Fix phantom pseudo element style output (#81291)
007f062fe5 Global styles: render element styles set only inside a breakpoint (#81265)
69b17c5e98 Packages: Recover July 29 npm release metadata (#81303)
53d9d2fa53 Update Changelog for 23.7.1
9379c90e79 Bump plugin version to 23.7.1
b7e98ae647 Fix missing return value in force_filtered_html_on_import footnotes filter (#81293)
3e0fe0ce05 Style states: fix state deselection when selecting the already selected block (#81277)
e8bc5cd3ca Navigation: Complete the DocBlocks for the responsive container and overlay style helpers (#80622)
7c36647bc4 Fix output for post date
57d90e1193 Ensure Content block tags always match available options.
63487665fa DataViews: Inline the kebabCase utility from components (#81284)
b1bad31b46 Latest Comments Block: Ensure latest comments can be viewed only for public posts
8d969332c5 fix: add optional chaining for empty reusable block (#81165) (#81177)
23b5b854ed Update phpcs, wpcs dependencies (#81279)
c476176cd1 Icons: move the inline image icon into the library (#81271)
a96cd78103 Block Directory: Make downloadable block item labels translatable. (#81237)
97894177e6 Dashboard Widgets: remove the Hello Dolly download action (#81272)
2dab68ff95 Flaky tests: Report as a PR comment only, stop creating issues (#81218)
7911b6ceaf ESLint: Define dependency import rules (#81246)
6e365e3537 Docs: Remove dependency group import guidance (#81245)
dc4a6a1c99 List View: Migrate label wrapper to UI Stack and drop Badge from the anchor (#81266)
ebab53f3d3 theme.json schema: fix block pseudo-classes and custom states (#81209)
5e2b7c1b1f Docs: explain how the theme.json schema fixtures work (#81263)
f889575799 Global Styles: Remove unused duplicate font family preview utilities (#81194)
1e267a50fa Block editor: unify what a new sibling block inherits (#81250)
b31639cc09 Footnotes: guard against invalid post meta values (#81201)
bb108741c2 Media: Cover client-side big image scaling and orphaned files (#81061)
9cd1367227 Storybook: Enable design system theme tool globally (#81116)
773a915066 Use p elements for callout alerts in components docs (#81234)
7212715749 Fix: Trunk e2e failures caused by the navigation spec leaving plain permalinks (#81238)
90f2bd5b96 Components: Deprecate Animate (#80931)
61e43986ac URLInput: Skip search requests while an IME composition is in progress (#80602)
2ef358f6cd AGENTS: Update development tips section (#81224)
01c037b1ff Blocks: Support static block templates in block type settings (#80027)
a152341f8f Docs: Fix broken Figma links on the design resources page. (#81166)
f8c8421e38 List View: Split the context and drop dead props to cut re-renders on expand and collapse (#81159)
c004e77c30 Block Editor: Fix Select all freezing on large posts (#81210)
1c5ff32abd Update Changelog for 23.7.0
bfd5303f9d DataViews: Fix the between `date` filter losing a manually typed date on blur (#81150)
943f0a62be Bump plugin version to 23.7.0
503dad4e4c Blocks: Update hpq to 1.4.0 and drop the ts-expect-error suppressions (#81199)
2cd1c4a58b Block Editor: Return false from isBlockSelected when there is no client ID (#81212)
acf17cde10 DataViews: Make grid and table item preview aspect ratio configurable (#79329)
f7f5670d56 DataViews: Pass only eligible items to a bulk action callback (#81198)
04f245f71d Ensure device preview is always accurate when window is zoomed in (#81193)
11bae0c3c0 Components: Add allowForms prop to SandBox component (#76471)
6b40482d0f Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (#81206)
1eaeae76c3 Remove the editableRoot opt-in from the paragraph block (#81184)
3a96676bba PanelColorSettings: Restore the missing space below the panel header (#81155)
b8cb89c907 Widgets editor: Add ThemeProvider for admin color schemes (#81173)
625944407d Blocks: Declare the `@types/react-is` devDependency (#81203)
1908100a47 Customizer widgets: Add ThemeProvider for admin color schemes (#81174)
52c7652c34 List View: Reduce per-row store subscriptions (#81136)
95ca3f044e Edit Widgets: Fix header toolbar button focus ring (#81176)
bffdae3257 Notes: fix the mention notification email composition (#81187)
fa4eff0910 Button: turn on the width setting by default in theme.json (#81196)
f9306164a1 Types: Replace remaining `@ts-expect-error` suppressions with proper typing (#81200)
c1d8367952 ESLint: Ban `@ts-ignore` in favour of `@ts-expect-error` (#81148)
991a717425 Agents: Add a defensive data design skill and route to the copy guide (#81131)
09e1e7ada3 Fix/79643 rtc awareness mixed block selection (#79836)
214438c400 Bump astral-sh/setup-uv from 8.3.2 to 9.0.0 in /.github/workflows (#80964)
7a1e659744 fix(admin-ui): reset the wp-admin li margin that misaligns Breadcrumbs (#81134)
02fea5a045 Bump actions/setup-node from 6.4.0 to 7.0.0 in /.github/setup-node (#80963)
b281d24fb6 Bump docker/login-action (#80962)
4513b4226b Media Editor: Render sidebar tabs via ComplementaryArea's render prop (#81133)
fe2e582976 Video: clarify the Video variation description (#81181)
a5e3bb48d7 Video: Hide settings for the GIF variation (#81142)
a0642d18c4 Block Supports: Guard against non-string attribute values to avoid fatal errors (#80501)
415b6f4508 Media: Improve the HEIC upload error and keep any upload errors up until dismissed (#81130)
REVERT: 8fdde7f743 Sync: remove the framework's dual-homed intent-log frozen core
REVERT: 64444c5109 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
REVERT: bdb55c7385 Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
REVERT: b87dce07c4 Sync: backfill CHANGELOG for the framework/plugin split
REVERT: b7cf02e709 Docs: bring the sync architecture docs up to date for the framework/plugin split
REVERT: 0d08f16481 Sync: remove the built-in transports from the framework
REVERT: 897e974c36 Sync: remove the Yjs engine from the framework (step 4b)
REVERT: 6180c357c8 Sync: make connection retry transport-agnostic (E2)
REVERT: 901a2ba337 Sync: make createSyncManager engine-neutral (step 4a)
REVERT: d574f8d1fe Sync: route the collection path through the engine (step 3)
REVERT: 8af5069291 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
REVERT: 88b2a22cf2 Sync: remove the intent-log engine from the framework (now plugin-only)
REVERT: 8f2cc74969 Sync: expose registry test-support + session seam types for engine plugins
REVERT: bc1fcc6bc3 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
REVERT: df743b1a68 Sync: Make the collaboration framework engine/transport-less by default
REVERT: 523cadb3b4 Docs: Add an as-built architecture overview with mermaid diagrams
REVERT: 773340178d Sync: Add the WebSocket transport (daemon + codec-driven client)
REVERT: a89022d73a Sync: Make transports swappable; add HTTP long-polling
REVERT: d312ecce21 Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
REVERT: 660ae1b184 Sync: Inline approval card for parked new-block proposals
REVERT: dd19643e94 Sync: Reserve Restore of requires-approval conflicts for capable users
REVERT: cb2c50f4e6 Sync: Stop dropping classic content; sync it as core/freeform
REVERT: e8b70c2618 Sync: Sync Custom HTML blocks through the content field (raw-content model)
REVERT: 1ab2581641 Sync: Fix the capture bug that silently blocked Custom HTML sync
REVERT: 0af03d60d5 Sync: Regression-test benign-to-protected attr value transitions
REVERT: d0fdd1290b Sync: Gate raw-attr markup at ingest; make block restore an approval
REVERT: c1353269a8 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
REVERT: 0a1dc908bf Sync: Anchor collaboration conflicts to blocks in the canvas
REVERT: 3cc6837dde Sync: Add the collaboration review panel to the document sidebar
REVERT: 42f4414661 Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
REVERT: 91d7ecb57a Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
REVERT: a6d52fe0a7 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
REVERT: 3cf3eea27f Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
REVERT: 887baa76b6 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
REVERT: 8dbac3a784 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
REVERT: e943fe7ef5 Docs: adversarial review of the intent-log branch (2026-08-05)
REVERT: 7fd02053b5 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
REVERT: be5fe799a1 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
REVERT: 58d3696eb9 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
REVERT: 689df3c0b6 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
REVERT: 7f205989c6 Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
REVERT: 034a9851a1 Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
REVERT: 05f376da52 Sync: presence for the intent-log engine (Phase 2d-viii)
REVERT: 30573c2ba6 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
REVERT: 7f3fe44da7 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
REVERT: af4e398cec Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
REVERT: 81091c0de0 Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
REVERT: 7d8414c8ec Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
REVERT: e1778e094f Sync: never treat editor staleness as user intent (Phase 2d-iii)
REVERT: e9261e7785 Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
REVERT: 8b4125788a Sync: record Phase 2d-i status in the architecture note
REVERT: 6b71de6649 Collaboration: live two-browser intent-log editing (Phase 2d-i)
REVERT: 56a2ec4542 Sync: record Phase 2c status in the architecture note
REVERT: 2daebd226c Sync: intent-log manager and adapter registration (Phase 2c-ii)
REVERT: 748153187a Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
REVERT: 93b4c5710d Sync: record Phase 2a/2b status in the architecture note
REVERT: e664cd0fcb Sync: intent-log client session codec (Phase 2b)
REVERT: f21a254365 Collaboration: unit tests for intent-log engine internals and adversarial ids
REVERT: a007745cb2 Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
REVERT: b965e32f1d Sync: narrow transports to engine-opaque payloads (Phase 1c)
REVERT: 188ce3728c Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
REVERT: dfe2434194 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
REVERT: 9dc871f8f5 Collaboration: extract a swappable sync engine seam (Phase 0)
REVERT: 5a3fa0c64d Sync prototype: intent-log engine with field-scoped merge semantics

git-subtree-dir: gutenberg
git-subtree-split: 83e144efc9cb29d5a2cc0f203c3009549e4868f8
chriszarate added a commit that referenced this pull request Aug 24, 2026
638392d908 Fix lint violations in the sync-engine and review-panel files
afe0e5cad7 Sync: update getSyncManager tests to the engine-adapter API
a095509c0a Docs: sync engine architecture notes, integration guide, and reviews
5f56443ec1 Relocate the transport-specific e2e harness to the engines plugin
c36a86a669 Editor: collaboration review panel — sidebar, canvas anchors, inline approval
a1fd6e57bc Sync: escalation review lifecycle — store, actionable notices, restore/discard
c0ad64b8e1 Sync: rich-text and raw-content block config — classic and Custom HTML sync
00171d2487 Sync: mirror block save markup into the shared doc
44dd11d3e3 Sync: presence for engines without a shared Y.Doc
7446e5dee0 Sync: enforce the engine handshake; degrade to post locking, not silence
1021f39c64 Sync: client-side engine seam — SPI, registries, engine-neutral manager
fc96d7b5ac Collaboration: server-side engine/transport seam, empty by default
REVERT: 83e144efc9 Sync: finish the trunk merge — drop two framework pieces this branch owns elsewhere
REVERT: c6b266bc75 Rebuild package-lock.json on trunk's lock
REVERT: 2c50a5e9cd Sync: follow trunk's RTC experiment gate after the rebase
REVERT: 698a2fc7ca V1: integrated loop output, verified as a whole (#35)
REVERT: 13d1b3e154 Add more explicit test timeouts, reduce some default timeouts (#8)
REVERT: cf93599113 Make intent-log the framework's default engine
REVERT: 0a9a170bdb Relocate the transport-specific e2e harness from the framework subtree
REVERT: f683739358 Remove framework residue duplicated by or migrated to this plugin
REVERT: 7f36932c0d Sync: remove the framework's dual-homed intent-log frozen core
REVERT: 2149d22061 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
REVERT: 04d32960fd Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
REVERT: 1cd70e6820 Sync: backfill CHANGELOG for the framework/plugin split
REVERT: 7062018ff2 Docs: bring the sync architecture docs up to date for the framework/plugin split
REVERT: 98e8ba2fdf Sync: remove the built-in transports from the framework
REVERT: 14b9a11c67 Sync: remove the Yjs engine from the framework (step 4b)
REVERT: cda266cad7 Sync: make connection retry transport-agnostic (E2)
REVERT: 00d42e9d76 Sync: make createSyncManager engine-neutral (step 4a)
REVERT: f58a913289 Sync: route the collection path through the engine (step 3)
REVERT: 4008ded853 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
REVERT: 18ac9e5037 Sync: remove the intent-log engine from the framework (now plugin-only)
REVERT: ce2d216dd6 Sync: expose registry test-support + session seam types for engine plugins
REVERT: 01111eee44 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
REVERT: 022ebd91e2 Sync: Make the collaboration framework engine/transport-less by default
REVERT: 8ac75c8cae Docs: Add an as-built architecture overview with mermaid diagrams
REVERT: b3567fd4dc Sync: Add the WebSocket transport (daemon + codec-driven client)
REVERT: 276bd27a87 Sync: Make transports swappable; add HTTP long-polling
REVERT: d0fb51470f Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
REVERT: 60eb412dfa Sync: Inline approval card for parked new-block proposals
REVERT: 08d3ecedcb Sync: Reserve Restore of requires-approval conflicts for capable users
REVERT: 5d24f4cc2c Sync: Stop dropping classic content; sync it as core/freeform
REVERT: 14a82d708b Sync: Sync Custom HTML blocks through the content field (raw-content model)
REVERT: 3be3b1c3e5 Sync: Fix the capture bug that silently blocked Custom HTML sync
REVERT: 65e8bf9369 Sync: Regression-test benign-to-protected attr value transitions
REVERT: 9983a07e54 Sync: Gate raw-attr markup at ingest; make block restore an approval
REVERT: b63d141b62 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
REVERT: bb4c4b9e9b Sync: Anchor collaboration conflicts to blocks in the canvas
REVERT: 11165044f7 Sync: Add the collaboration review panel to the document sidebar
REVERT: ca51d70d4d Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
REVERT: 6a9357f463 Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
REVERT: 791a40e653 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
REVERT: 5149d9a9d3 Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
REVERT: a71e3103c5 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
REVERT: 4dad221495 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
REVERT: 9668010b7b Docs: adversarial review of the intent-log branch (2026-08-05)
REVERT: 00f5867bf9 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
REVERT: ffac7acf99 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
REVERT: c070625a92 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
REVERT: c27fb74ea7 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
REVERT: 86bb5d76ec Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
REVERT: bbb0d851fe Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
REVERT: 1a108bb136 Sync: presence for the intent-log engine (Phase 2d-viii)
REVERT: c8e9d59ae9 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
REVERT: ffd4f44fb2 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
REVERT: 37456458bc Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
REVERT: 4146e4eb2c Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
REVERT: bafedefbc6 Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
REVERT: 09c9ae78f2 Sync: never treat editor staleness as user intent (Phase 2d-iii)
REVERT: bf2f8223ca Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
REVERT: c03be224b9 Sync: record Phase 2d-i status in the architecture note
REVERT: bf84dcd84a Collaboration: live two-browser intent-log editing (Phase 2d-i)
REVERT: c6ffc0cf77 Sync: record Phase 2c status in the architecture note
REVERT: 12ba54f1f4 Sync: intent-log manager and adapter registration (Phase 2c-ii)
REVERT: 5bd6737e62 Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
REVERT: 46fb9020d3 Sync: record Phase 2a/2b status in the architecture note
REVERT: 76b516ded4 Sync: intent-log client session codec (Phase 2b)
REVERT: c16d278721 Collaboration: unit tests for intent-log engine internals and adversarial ids
REVERT: bbd1591b2d Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
REVERT: 312f3b3fe4 Sync: narrow transports to engine-opaque payloads (Phase 1c)
REVERT: fb9af267ff Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
REVERT: 9276dc7c37 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
REVERT: 98365687c4 Collaboration: extract a swappable sync engine seam (Phase 0)
REVERT: e61523237a Sync prototype: intent-log engine with field-scoped merge semantics

git-subtree-dir: gutenberg
git-subtree-split: 638392d90882a9f65bbf4a7b1dbaf23036980bfb
chriszarate added a commit that referenced this pull request Aug 24, 2026
…runk (#25)

* Follow the framework's move of RTC behind a Gutenberg experiment

WordPress/gutenberg#80658 replaced the `wp_collaboration_enabled` option (and
its Settings → Writing checkbox) with the `gutenberg-real-time-collaboration`
experiment, and renamed the client flag to
`window.__experimentalEnableRealTimeCollaboration`. Gutenberg deletes the old
option on upgrade, so every place here that read or wrote it was silently
looking at nothing.

Server: the de-rtc autosave-commit guard and the websocket sync-server CLI
command now ask `wp_is_collaboration_enabled()`, which is the framework's own
question. The websocket command's old guard was doubly dead — it called
`wp_is_collaboration_allowed()`, which no longer exists, behind a
`function_exists` check that quietly skipped the whole test.

Tests and tooling: PHPUnit fixtures, the Jest manager tests, the fuzzer, the
transport benchmark, and `rtc-dev.mjs` (including `npm run doctor`) all flip
or read the experiment instead. The e2e fixtures need no change — the
subtree's `setCollaboration` already sets the experiment.

* Squashed 'gutenberg/' changes from 8fdde7f743..83e144efc9

83e144efc9 Sync: finish the trunk merge — drop two framework pieces this branch owns elsewhere
c6b266bc75 Rebuild package-lock.json on trunk's lock
2c50a5e9cd Sync: follow trunk's RTC experiment gate after the rebase
698a2fc7ca V1: integrated loop output, verified as a whole (#35)
13d1b3e154 Add more explicit test timeouts, reduce some default timeouts (#8)
cf93599113 Make intent-log the framework's default engine
0a9a170bdb Relocate the transport-specific e2e harness from the framework subtree
f683739358 Remove framework residue duplicated by or migrated to this plugin
7f36932c0d Sync: remove the framework's dual-homed intent-log frozen core
2149d22061 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
04d32960fd Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
1cd70e6820 Sync: backfill CHANGELOG for the framework/plugin split
7062018ff2 Docs: bring the sync architecture docs up to date for the framework/plugin split
98e8ba2fdf Sync: remove the built-in transports from the framework
14b9a11c67 Sync: remove the Yjs engine from the framework (step 4b)
cda266cad7 Sync: make connection retry transport-agnostic (E2)
00d42e9d76 Sync: make createSyncManager engine-neutral (step 4a)
f58a913289 Sync: route the collection path through the engine (step 3)
4008ded853 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
18ac9e5037 Sync: remove the intent-log engine from the framework (now plugin-only)
ce2d216dd6 Sync: expose registry test-support + session seam types for engine plugins
01111eee44 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
022ebd91e2 Sync: Make the collaboration framework engine/transport-less by default
8ac75c8cae Docs: Add an as-built architecture overview with mermaid diagrams
b3567fd4dc Sync: Add the WebSocket transport (daemon + codec-driven client)
276bd27a87 Sync: Make transports swappable; add HTTP long-polling
d0fb51470f Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
60eb412dfa Sync: Inline approval card for parked new-block proposals
08d3ecedcb Sync: Reserve Restore of requires-approval conflicts for capable users
5d24f4cc2c Sync: Stop dropping classic content; sync it as core/freeform
14a82d708b Sync: Sync Custom HTML blocks through the content field (raw-content model)
3be3b1c3e5 Sync: Fix the capture bug that silently blocked Custom HTML sync
65e8bf9369 Sync: Regression-test benign-to-protected attr value transitions
9983a07e54 Sync: Gate raw-attr markup at ingest; make block restore an approval
b63d141b62 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
bb4c4b9e9b Sync: Anchor collaboration conflicts to blocks in the canvas
11165044f7 Sync: Add the collaboration review panel to the document sidebar
ca51d70d4d Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
6a9357f463 Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
791a40e653 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
5149d9a9d3 Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
a71e3103c5 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
4dad221495 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
9668010b7b Docs: adversarial review of the intent-log branch (2026-08-05)
00f5867bf9 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
ffac7acf99 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
c070625a92 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
c27fb74ea7 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
86bb5d76ec Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
bbb0d851fe Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
1a108bb136 Sync: presence for the intent-log engine (Phase 2d-viii)
c8e9d59ae9 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
ffd4f44fb2 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
37456458bc Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
4146e4eb2c Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
bafedefbc6 Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
09c9ae78f2 Sync: never treat editor staleness as user intent (Phase 2d-iii)
bf2f8223ca Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
c03be224b9 Sync: record Phase 2d-i status in the architecture note
bf84dcd84a Collaboration: live two-browser intent-log editing (Phase 2d-i)
c6ffc0cf77 Sync: record Phase 2c status in the architecture note
12ba54f1f4 Sync: intent-log manager and adapter registration (Phase 2c-ii)
5bd6737e62 Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
46fb9020d3 Sync: record Phase 2a/2b status in the architecture note
76b516ded4 Sync: intent-log client session codec (Phase 2b)
c16d278721 Collaboration: unit tests for intent-log engine internals and adversarial ids
bbd1591b2d Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
312f3b3fe4 Sync: narrow transports to engine-opaque payloads (Phase 1c)
fb9af267ff Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
9276dc7c37 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
98365687c4 Collaboration: extract a swappable sync engine seam (Phase 0)
e61523237a Sync prototype: intent-log engine with field-scoped merge semantics
be1a0b58a2 UI: Add tooltips to Calendar and RangeCalendar navigation buttons (#81983)
db3254554c Pattern List: Import a pattern from JSON (#81919)
3bbdb29369 Fix: skip empty block markup in navigation to prevent split UL elements (#78793)
d13be36ff4 Fix: Line Break Tags Added to Scripts and Styles (#77542)
c96732f578 Styles Route: Reference the api-fetch and html-entities projects (#81989)
39088bf09a Block Styles: Refactor the variation UI to use ui/Button (#81833)
f8bec56d62 Extensible Site Editor: Add a theme preview page with global styles editing (#81954)
874959034f Boot: Mount the registered plugins (#81754)
086650feed Updated broken links in document files (#81961)
ec35342e1c Block Editor: Don't close inserter panel when inline quick inserter opens (#76241)
fd305b0fc6 Replace the Storybook test runner with the Vitest integration (#81918)
194f70eaa2 DataViews: Localize the date/datetime calendars from the site locale and direction (#81592)
fcf11dc55e DataViews: use `Menu` from `@wordpress/ui` (#81783)
cb20a4361e CollapsibleCard: Support multiple header descriptions (#81227)
094b1b094f Theme: Update Terrazzo packages to 2.7.1 (#81978)
0ae1399378 fix: Button rtl loader issue (#81901)
af8db520dc Components: migrate StyledLabel to SCSS module (#80001)
85b8c96615 UI: Add ValidatedInputControl component (#81627)
0e7546c0af Hide layout panel when no controls are available (#81968)
ca1b3fe1fe Docs: Align @param tag columns in test/ docblocks (#81905)
8e57b0d27f Components: migrate GradientPicker, ColorPalette to SCSS module (#80473)
953a217f29 TypeScript: Bring the remaining route projects under the typecheck run (#81847)
6eddc656dd List: Add Align Support (#68002)
75768b4e6f UI: Accept locale codes in Calendar components (#81814)
87702decc4 DataViews: Fix date and datetime controls selecting the adjacent day (#81498)
a42b6775f4 Block editor: Move isElementVisible changelog entry to Unreleased (#81953)Co-authored-by: shail-mehta <shailu25@git.wordpress.org> Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
63b5d22cc1 Block Library: Fix failing test in playlist block (#81950)
009745b24e Playlist Track: Improve track upload error flows (#81878)
98047a5bf0 Automated Testing: Change Storybook default a11y test to error on failure (#81597)
f1b97bb6dc Playlist: Add bulk track metadata editing (#81441)
5b5c741de8 Dependency updates Aug 2026 (2) (#81906)
1e40a0d4a0 DataForm: Make the panel layout edit button the real field trigger (#80689)
5d097d5300 DataViews: Sync the displayed calendar month with external value changes (#81635)
f6e389d3a1 Update is-plain-object to 5.1.0 (#81926)
23ac1cdd11 Build Scripts: Force tsc --pretty so CI reports the project behind global diagnostics (#81937)
e5bc5a5fd1 Font library: Add skeleton loader for the font preview images (#81047)
d1e24d6340 Documentation: Update coding guidelines to recommend TypeScript (#81763)
b5e015d0c0 Storybook: Upgrade to 10.5 (#80692)
704b421e55 Use `WCInputControl` alias for legacy InputControl imports (#81830)
047dc276e2 SearchableChipSelect: Add grouped items support (#80989)
c836e0d30f Validation: update dependency-audit to 0.4.6 and ignore dataviews ./wp bundle (#81928)
57c278ca27 Editor: Migrate hierarchical term selector to @wordpress/ui (#81848)
c217b2698e Font Library: Fix the preview weight for variable fonts (#81748)
56897408ab Components: Improve text detection for button icon-with-text (#81521)
eaf986a580 Use `WCTextareaControl` alias for legacy TextareaControl imports (#81834)
54f9e9f675 chore: Update the combobox SCSS to have a breaking changes log (#81923)
5a675bf1d0 Update Ariakit packages (0.4.35 => 0.4.37) (#81080)
d76e6529dd UI: Update Base UI to 1.7.0 (#81390)
31f04b7159 Components: migrate ComboboxControl to SCSS module (#80471)
1d6106c233 Pre-publish panel: Remove the headings that repeat the panel title (#81806)
c49982dcb2 Editor: Set the width an entity opens at from the editor provider (#81750)
4ae7b44119 Global Styles: Close the revisions screen on the first back click (#81897)
c368c6810d Preserve layout and style attributes on Column transform (#81855)
e35b95c0ed Refactor parameter type hints and clean comments (#81898)
7f2be02a0b Try caching gutenberg_get_global_styles (#81889)
bfe2bf29ad Color Palette panel: Remove empty whitespace when there are no theme colors (#81894)
7cea1c72e1 Global Styles: Allow editing duotone palettes (#81605)
91e7ca7a59 Design System: Add portable agent skills (#80597)
eee4867232 Pattern: Disable visibility support (#81866)
c36cbd2cdd Storybook: Handle production module load failures (#81867)
d3f2c507db Global Styles: Group shadow editor rows as items (#81871)
4cbf437576 UI: add ControlWithError component (#81574)
70af7dbbb8 Fix/79641 rtc cursor hidden details block v2 (#81322)
f854b6b139 Storybook: Fix default background color for Example Application theme story (#81765)
157cff2ddd Editor: Announce publish date changes to screen readers (#81629)
da0bf8d33d UI: Mark Autocomplete, Field, and Fieldset as recommended (#80636)
0619247335 Core Data: Allow keyless entities to be addressed without a record ID (#81857)
3e52ca93e2 Dependencies: Dedupe, update adm-zip, nx (#81870)
e8aed3c82b Core Data: Validate the parsed-blocks cache against registered block types (#81809)
417261c052 Build: Emit TypeScript declarations with --noCheck (#81839)
06b9b58daf Boot: Migrate styles to CSS Modules (#81756)
d33e8a4154 Update save & submit docs (#81077)
427871b0cf Editor: Surface debugging details in the ErrorBoundary (#81642)
7deb3826a4 Theme: Add color warning diagnostics workbench (#81817)
a1e8d1dfaa UI: Expose keyboard shortcut presentation utilities (#81826)
04b2317c6b Editor: Remove FlexItem usage from NoteCard (#81851)
0b566e44b3 Add transform to Row for Columns block (#81802)
1b0671fbaf Add missing dependency to media-editor route (#81845)
23e8873b2c TypeScript: Put route projects under the typecheck run (#81829)
ee5da7178e Updated Aria Landmark Example URL (#81832)
f74762325c Fix MediaPlaceholder drag eligibility (#81431)
eba80d22a2 Docs: Fix broken skip ahead anchor on the custom block editor guide. (#81835)
442851efd6 Global Styles: Keep storing shadow presets as CSS variables when custom presets exist (#81346)
4d03cf0ed6 Bump astral-sh/setup-uv from 9.0.0 to 10.0.0 in /.github/workflows (#81823)
6106e2177b Components: migrate ResizableBox to SCSS module- #80720 (#81792)
c9e913d798 Storybook: Fix production build warnings (#81758)
a2d98c2883 Docs: Narrow the tsconfig split guidance to the standard layout (#81828)
94a108d3c9 UI: Add TextareaControl component (#81359)
e5039135ce Quick Inserter: Standardize the design of the Browse all button (#81827)
add1acd40f Docs: Fix broken link to the getEntityRecords selector reference. (#81791)
61121263ba Post Template: Fix mover arrows and labels for blocks inside the grid view (#81120)
321d5c87c7 UI: Mark Input-related components as recommended (#81658)
232cf07f1a UI: Add initial agents guidance mapping to contributing guidelines (#81400)
0aa2071fec Fix: Post Editor: 403 on /wp/v2/settings at boot for users without manage_options cap (#81813)
a0c83b4dd7 Add command: View post (#66720)
073b06862f add context to change "revisions code diff" (#81820)
3a5b8ad2dd Patterns explorer: Refactor the category sidebar to use Tabs (#81807)
eca76ad768 Menu: Add UI component (#79560)
8119bc827d Fields: migrate last remaining JS file to TS (#81808)
55f56985be Components: Fix Storybook accessibility issues in stories (#81777)
12fd2f5612 Playlist: Remove block toolbar sharing between parent and child blocks (#81432)
9359cf2bbf Rename the media editor toolbar button to 'Edit image' (#81705)
aee1d48442 Block Editor: Remove leftover files (#81793)
28c348acdf TypeScript: Require the typecheck run for type checking in CI (#81518)
f57b5d3bb6 Packages: Complete the tsconfig build and dev project split (#81517)
03211d47a7 Packages: Split story package tsconfigs into build and dev projects (#81516)
bce33cb4ff Editor: Debounce term filtering and announce results once (#81422)
15503fd5e5 Tests: Make PHPUnit tests independent of test config flags and theme root (#79159)
9d2c909e53 Docs: Fix broken link to the Document-Isolation-Policy explainer. (#81790)
2a59379cc1 Build Package: Use Core's boot module when a plugin has none (#81761)
038142b853 Update Changelog for 23.8.0
ca0444b218 Bump plugin version to 23.8.0
b0316b6134 Fix: Post Editor: Canvas animates from the left when switching mobile/tablet preview to desktop (#81484)
feb072be0e Media Editor Route: Add undo/redo and save/cancel actions to the header (#81563)
3abf43f1df Notes: Stop forcing capitalization of user names (#81788)
e16e4bbd88 Fix Broken Links in Package file (#81700)
42e91ce205 Command Palette: Allow commands to override the category icon (#81787)
3ba8bb1750 Components, DataViews, Editor, UI: Split tsconfigs into build and dev projects (#81515)
336666c980 Schemas: Document what the theme.json schema checks (#81773)
fdf5711313 More block: clarify description about excerpt vs full content (#80619)
96a6d41dc1 Theme: Improve color ramp contrast safeguards (#81185)
ab98811095 Dashboard Widgets: resolve widget types without a metadata module (#81738)
6e4cf9c292 Dashboard: add a Site Health detail page as the dashboard's second route (#81729)
e434463145 Align collaboration migration version markers with the 23.8.0 release (#81789)
bee1b17fb1 RTC: Add fallback identities when user profiles are unavailable (#81408)
894f273e9b Fix the failing e2e test (#81739)
e43dcaa48f Fields: Export the package stylesheet (#81769)
03811bd605 UI: Add Spinner component (#81358)
725b1f48e0 Fix DataViews list layout color token usage (#81074)
9a9d9c535a Notes: keep the note actions menu in view for long display names (#81414)
825d1789fb Update playlist track placeholder to match aria label (#81762)
939b3f3a92 ui/Card: Use the default neutral border (#81746)
a5e0b24f14 RTC: Couple RTC and polling provider as an opt-in experiment (#80658)
da621f2e6a Modal: Stop Escape key propagation on dismiss (#81785)
c00d0697de Tabs: Give tab IDs their own counter so numbering starts at 1 and never skips (#81781)
0ea2e57cb7 BoxControl: update the opposite side when ALT is held on the left or right input (#81530)
b6453f2621 Fix: Accordion: Anchored hash inside the accordion throws the malformed URL console error (#81780)
dc30b9dde7 Site editor: update template section description. (#81613)
a81f0474d9 Global styles: Register <label> as element (#81160)
cb8fc5f5c2 Block Editor: Add translator context to pseudo-state labels (#81770)
348c2da73c Fix: URL: normalizePath drops the rest of the query after a second "?" (#81612)
d889c67cbb Fix clipped focus outlines in the media editor Details sidebar (#81703)
87acb90b99 Prevent white screen crash during undo operations when Media Modal is open (#79898)
d1703e053a Global Styles: filter and indicate blocks that have custom styles (#81373)
8d862829e1 Media Editor Route: Make the route look like it's part of the media menu in the left-hand sidebar (#81565)
1bb4e5b157 Packages: Split tsconfigs for utility and mid-size packages (#81514)
4061b86a00 Enable axial gap for Group and restrict to flex and grid layouts. (#81476)
daf9c82168 Feat: support block spacing (#79689)
05abdcb349 Bump github/codeql-action/upload-sarif (#81436)
87826e5c9c Add `__unstable_wp_sync_storage` filter for pluggable storage backends (#81697)
1f6157810c UI: Collapse item-popup item sizing to default and small (#81354)
ba25994b47 Playlist: Add aria-label to prevent placeholder as label (#81654)
227aff3290 Components: Migrate DropdownContentWrapper to SCSS module (#81522)
75b9133222 Site Editor: Use inverted ThemeProvider seed for portaled UI (#81653)
4849c664c3 Update Terrazzo packages to 2.5.0 (#81082)
2f1563b9e0 Build Tools: Stop watcher process trees on shutdown (#81504)
262c721c8a Docs: Require site editor features to land in the extensible site editor too (#81752)
02aae3ab29 Boot: Preview the site where the canvas has nothing to open (#81749)
47e68c9f4c List View: Fix flaky global shortcut test and re-enable it (#81690)
ac1cf9e039 Lazy Editor: Keep the theme's editor styles on the canvas (#81747)
a2556e7201 Stop saving Table of Contents output (#80404)
5171671b5b Boot: Sync the editor's device preview with the URL (#81617)
ce19c147a8 RichText: Use the current record when handling Enter (#81696)
3f668616ac Editor: Simplify List View sidebar shortcut handling (#81693)
97a82266de Block API: Address review feedback on block keyboard shortcuts (#81621)
1b45b0780d Boot: Do not offer to edit a trashed entity (#81632)
e3187a5760 Edit Site Init: Seed the editor preferences the editor expects (#81628)
db5c14db14 Lazy Editor: Render the editor preferences modal (#81630)
090b2acc04 List View: Make focus on mount opt in (#81659)
137e908a9c Make Back button grid column flexible. (#81701)
cd0c368a2e Layout block supports: cast numeric grid attributes before use (#81560)
55dabd69d6 Inner Blocks: Fix bug that caused alignment controls to show in Image blocks within a Gallery (#81606)
d3c65d3a7e Admin UI: Fix the primary color of the Fresh admin color scheme (#81618)
2d9c286ac6 Playlist Track: Show upload spinner inline (#81445)
de9e36e54e Fix playlist track toolbar insertion (#81639)
614b3bf6b2 Editor: Refactor 'ErrorBoundary' to use the new recommended components (#81638)
0a886b47c9 Env: Fall back to cached docker images when the registry is unreachable (#81631)
ebd2ecafaa Boot: Warn before leaving with unsaved changes (#81625)
bff0a80003 Boot: Contain a surface failure to that surface (#81622)
f9913ca552 Perf: Report the first block selection as its own metric (#81616)
1c46b11820 Boot: Translate the canvas click-to-edit label (#81620)
0e92e54c99 Storybook: Add Story for  InnerBlocks (#68651)
f36f2bb2f3 Block API: Declare block keyboard shortcuts on variations and transforms (#81588)
476847df51 Boot: Let the editor canvas navigate between entity records (#81590)
11474d21bd Block Editor: Never spotlight blocks in a preview (#81615)
f3ec0c66e7 Storybook: Add Story for BlockPopover (#68681)
3bb6eb7a08 Global Styles: Expose additional elements in Typography and Colors (#80852)
ee35d7c8d3 Extensible Site Editor: Show only the style book on Styles for classic themes (#81579)
b65ede97c9 Storybook: Add Story for URLPopup component (#68449)
9f30bf7872 ComboboxControl: narrow `onChange` callback type to `string` | `null` (#81568)
560d975e66 Extensible Site Editor: Add the Identity route (#81576)
51d339f0d0 URL: Stop normalizePath throwing on a malformed percent sequence (#81086)
f3b8155a3b Fix parent inserter alignment with text labels enabled (#81608)
9aa7406203 url: clamp the truncated file name slice in filterURLForDisplay (#81529)
dbe1c1ccab Block editor: add an inserter to the parent selector (#81532)
aa50808db6 Fix viewport state values set by grid resizer (#81601)
6f26db48d8 Add Gutenberg version details for WordPress 7.1 (#81600)
be330310c5 Base Styles: Align `input-control` mixin to design system (#81357)
2b714533ed Components: Align legacy form control focus rings with WPDS (#80417)
4aa6912c04 Base styles: Streamline focus ring override (#81242)
b9cfc73f09 Editor: Register the editor keyboard shortcuts from the provider (#81580)
ab2550247a Extensible Site Editor: Gate theme screens on theme support (#81581)
3f15b6b806 Dashboard Widgets: promote high-relevance actions into a chrome footer (#81556)
fe89562bf1 Update waveform player dependency patch (#81454)
6bef42943e Vitest: Resolve @flakiness/vitest reporter to an absolute path (#81582)
b37473fe87 Packages: Split blob, grid, interactivity, and theme tsconfigs (#81509)
b228eebdfc TypeScript: Add typecheck script and split root tsconfig into build and dev solutions (#81499)
c099637b7b Extensible Site Editor: Preview the site on Home for classic themes (#81578)
1e6382df01 Editor: Speed up the hierarchical term selector for large taxonomies (#81376)
94c4e660bc Adds JSdoc for `avatar` block's edit.js (#68867)
a3aa0de472 Refactor: Convert `createColorHOC` to functional component (#70408)
9aee7c24d5 Adds JSdoc for `audio` block's edit.js (#68865)
78640e0317 Adds JSdoc for `column` and `columns` block's edit.js (#68873)
fe1c9d5c42 Docs: Fix broken links to the Block API reference guides. (#81571)
5b6431c6b6 Editor: Use PluginSidebar in GlobalStylesSidebar (#81570)
9fa0b67fb2 Docs: Add Block Editing Mode Readme. (#69411)
c4c5c62582 Release: Improve changelog categorization (#81475)
d4d4c4d7c5 DataViews: vendor `ValidatedToggleControl` (#81492)
150cd6da98 Media Editor Route Experiment: Override media edit links to point to the new experimental media editor (#81559)
0f61d4aa2e Writing flow: select next block on Enter key (#63484)
d033d614e5 Media editor: keep initial modal focus on the dialog frame (#81541)
07d89d593e Fix: Delete key on empty heading transforms following paragraph into heading (#78779)
e69ab441df In-between indicator: make symmetric (#68074)
f69e114ba8 DOM: treat a caret at a soft line wrap as an ambiguous position in Firefox (#81003)
c384568f21 Fix: getQueryArgs discards everything after the second = in a query argument value (#81066)
7455cde4fc Editor: Stop `:has()` selectors recalculating the whole document on every block selection (#81471)
08117d8685 DataForm: Fix the datetime control sending two updates per calendar interaction (#81440)
eb039018ff Fix: Term Description block skips display filters inside Terms Query. (#81290)
dd73b57749 Editor: Correctly mark ToolsMoreMenuGroup as a private SlotFill (#81503)
08e4e81221 Admin UI: Add Navigation component and Page navigation slot (#79746)
26eea2b99c Theme: Move changelog entry to unreleased (#81508)
7a8a56b1d0 Theme: Avoid root-level relational selectors (#81457)
9f798f32a5 Packages: Move unreleased changelog entries out of the 23.8 published versions (#81502)
cdff370d46 Storybook: Upgrade Vite to 8 (#81494)
2aacf5a578 BlockEditVisuallyButton: Update Developer Documentation (#68987)
c19909efaf Adds README for inspector-controls-tabs component (#69072)
d36bccf8ca Update 23.8 release changes on trunk (#81485)
b8315bfee4 DataViews: vendor `ValidatedToggleGroupControl` (#81450)
506584fc8d Docs: Fix dead link in the dynamic blocks tutorial (#81399)
dc8ce1ddca DataViews: vendor `ValidatedFormTokenField` (#81451)
a1d24c1308 Dimensions: Fix aspect ratio and scale controls not reflecting external updates (#80747)
d87ee650e3 Docs: Add Background image control Readme (#69409)
3c78efc964 Icon: Fix margin being applied twice in the editor (#81292)
86802246ac DataViews: vendor `ValidatedComboboxControl` (#81449)
2f9f8ce646 Update Changelog for 23.8.0-rc.1
485c71d2a1 InputControl: Vertically center date and time input values in Safari (#81361)
9045eadf0b Env: Update git to latest commit when `--update` passed (#81447)
3ceebb60e8 Bump plugin version to 23.8.0-rc.1
59965b3e00 ESLint: Rename root eslint.config.cjs to eslint.config.mjs (#81468)
f377cd0210 Backport core fixes for finalize route (#81465)
cc8e2c958b Docs: Add Block Lock Readme (#69434)
62f77b7dfd Docs: Add Block List Readme (#69432)
76300ee874 Fix empty list block with anchor persisting after backspace deletion (#77000)
7d63751ba6 Fix: flaky autosave shareable URL revisions e2e test. (#81455)
4d914a0bf5 Block editor: disclose the nested block count of a multi selection (#80745)
ac8de62e8a Docs: Add Block Actions Readme (#69408)
d90ebd76e8 Normalize block gap values in layout (#81460)
bc0a68e7ae Remove an unmodified wrapper when all its inner blocks are removed (#42503)
175d53c3e1 Writing flow: stop the caret on containers that do not merge with the text flow (#81456)
1bfda6cd3e Spacing Sizes Control: Make the control label translatable independently of the input aria label. (#81240)
c98049dbf4 Block editor: render a real default block in place of the default appender (#81231)
74dd7dc8ad UI: Upgrade React DayPicker to version 10 (#81439)
7f83800464 DataViews: vendor ValidatedRadioControl (#81434)
4c3f3f4f15 DataViews: vendor ValidatedCheckboxControl (#81435)
3c7745836d DataViews: vendor `ValidatedNumberControl` (#81433)
ab730b2236 Cover: Avoid passing null as the featured image size (#81444)
5abfd415e8 Components: Remove ValidatedTextControl private API (#80680)
a91983ca6c DataViews: Move the rich text control into the editor package (#81430)
13a0338a03 components/Menu: Restore Modal focus return when menu items close (#81164)
121e579189 Fix: Regression: Tabs block: Start with empty tab labels with placeholders (#81429)
11f6247b6a Navigation Overlay Close: Inherit typography and color from the overlay (#80751)
99aee654cc Docs: Fix broken link to the Node.js debugging guide. (#81398)
9e8d50d490 fix: order site identity changes predictably (#81283)
589bb11f9f Feature: Tabs block: consider using the tab title in the Document Overview instead of a generic "Tab" label (#81427)
637513a31f UI: Add `Calendar` and `RangeCalendar`, moved from `components` private APIs (#81337)
6e52fa407d DataViews: vendor `ValidatedSelectControl` (#81391)
cd08bc77ef Notes: Fix text wrapping for long usernames in collaboration sidebar (#81406)
04172b2c60 Interface: Let CSS own the ComplementaryArea width and use AnimatePresence custom for exit (#81363)
9f8d048a3b Test: Add private Vitest config and migrate a pilot test (#81037)
52eccd71b7 Update Changelog for 23.7.2
ae2290d8e7 Tools: Make agent setup a workspace (#81418)
70be075950 Bump plugin version to 23.7.2
126a840c69 DataForm: Fix hidden fields validation (#81377)
1a1b94c8a2 Widget Dashboard: host-tunable tile spacing via public custom properties (#81352)
79e0ed0693 Core Data: Fix post staying dirty after saving edited post meta with RTC enabled (#81392)
c381238065 Format Library: Remove unused CSS rule (#77831)
63bbebcaf0 Block Mover: Add the keyboard shortcut to the buttons' spoken description (#81380)
a370a8b6b7 Block Editor: Fix Escape from the block toolbar and stop redundant last focus dispatches (#81319)
746d5c31cd Dashboard Widgets: split action icons into wire and resolved forms (#81381)
7f8f873059 Global Styles: report border, shadow, outline, filter and dimension changes (#81407)
7dc85951fa Global Styles: Migrate shadows presets to use the preset management layer. (#79812)
445cf4af7e Scripts: Prevent a UTF-8 BOM in the middle of extracted CSS (#81383)
923807350e Changed Build Process Link and remove unused tags (#81360)
25fc9c1204 wp-build: Render the no-JS fallback in the generated page templates (#81365)
9cfdeddc7c Docs: Add error message guidance. (#81143)
1980b08d46 Fix: flaky list view paste block styles e2e test (#81229)
1bccb3ab9b Interface: Stop the secondary sidebar animating into place on page load (#81362)
07e90d6582 IconButton: Improve keyboard shortcut accessibility (#80402)
f8466c3adb Monitor all setup-related composite Actions. (#81192)
eb976a5434 Bump actions/stale from 10.4.0 to 11.0.0 in /.github/workflows (#81219)
150c61e445 Bump github/codeql-action/upload-sarif (#81287)
0f7b5c4eef DataViews:  Fix `array` field type validation for empty values (#81378)
4762fb7ab9 UI: Derive Base UI direction from WordPress i18n (#80399)
fb1241521f Try: Set post navigation link icon to next. (#81384)
ffd97c0bbb Playlist: Improve audio conversion and track selection (#80926)
be74d5d3f6 Dashboard Widgets: add icon and relevance to the widget action envelope (#81275)
107fb08d0e Editor: Keep the canvas height stable while resizing the canvas (#81163)
226f1e8da8 Remove content types experiment (#81340)
139cc8a248 New `kebab-case` package: extract utility and migrate private API calls (#81294)
260cd94a20 Scope breakpoint media queries to screen so printing does not look like a resize (#81367)
de4da84c1e Block Editor: Convert useBlockVisibility hook to TypeScript (#80390)
dd9abb6c0b Global Styles: Migrate font size presets to the shared preset layer (#79811)
c7cdb48157 Site editor: fix unreadable sidebar hover color (#81317)
341268f857 Playlist: Normalize Waveform Player configuration handling (#81342)
77e4d24585 Docs: Fix typo in block file structure guide (#81348)
c24e8b59bf Markdownlint: disable the MD033 (no-inline-html) rule project-wide (#81213)
949ba8754f Docs: Fix broken links to the removed JavaScript build setup guide. (#81232)
b7e4955ccf Keycodes: Make `withIgnoreIMEEvents` a public API (#81343)
3f224e67b0 Block Editor: Simplify InspectorControlsFill rendering logic (#81286)
354f66c7e1 Pert Tests: Avoid inflating interaction metrics with startTracing (#81264)
2fcd74717a DataViews: Use the public `@wordpress/ui` Badge instead of the private one (#81236)
91b373e707 Components: Migrate Spinner styles from Emotion to SCSS module (#80511)
8181ec4897 ESLint: Remove legacy import suppressions (#81338)
6b364aac1e Block Library: Document security patch releases (#81295)
7f43eafcce ESLint: Replace strict config with bulk suppressions (#81248)
a8adbd7a56 Block Editor: Bail out of hasSelectedInnerBlock when there is no clientId (#81315)
a17b59cd8a Theme: Colocate plugin tests with implementations (#81247)
4ee374307c Document editEntityRecord's options.isCached param (#81318)
8323351f39 Site Editor: Decode HTML entities in Identity fields (#81269)
2cb64f7ea2 Block Inspector: Disable the 'Edit original' button when the entity ID is missing (#81288)
1516e9bfce theme.json schema: allow responsive states on block style variations (#81309)
197c37094f theme.json schema: responsive states belong to blocks (#81253)
e89872315e Render viewport state element styles in the editor (#81307)
e574bb5827 Docs: remove breakpoint-only element style example from global styles guide (#81308)
102eb74ff8 Style states: Fix phantom pseudo element style output (#81291)
007f062fe5 Global styles: render element styles set only inside a breakpoint (#81265)
69b17c5e98 Packages: Recover July 29 npm release metadata (#81303)
53d9d2fa53 Update Changelog for 23.7.1
9379c90e79 Bump plugin version to 23.7.1
b7e98ae647 Fix missing return value in force_filtered_html_on_import footnotes filter (#81293)
3e0fe0ce05 Style states: fix state deselection when selecting the already selected block (#81277)
e8bc5cd3ca Navigation: Complete the DocBlocks for the responsive container and overlay style helpers (#80622)
7c36647bc4 Fix output for post date
57d90e1193 Ensure Content block tags always match available options.
63487665fa DataViews: Inline the kebabCase utility from components (#81284)
b1bad31b46 Latest Comments Block: Ensure latest comments can be viewed only for public posts
8d969332c5 fix: add optional chaining for empty reusable block (#81165) (#81177)
23b5b854ed Update phpcs, wpcs dependencies (#81279)
c476176cd1 Icons: move the inline image icon into the library (#81271)
a96cd78103 Block Directory: Make downloadable block item labels translatable. (#81237)
97894177e6 Dashboard Widgets: remove the Hello Dolly download action (#81272)
2dab68ff95 Flaky tests: Report as a PR comment only, stop creating issues (#81218)
7911b6ceaf ESLint: Define dependency import rules (#81246)
6e365e3537 Docs: Remove dependency group import guidance (#81245)
dc4a6a1c99 List View: Migrate label wrapper to UI Stack and drop Badge from the anchor (#81266)
ebab53f3d3 theme.json schema: fix block pseudo-classes and custom states (#81209)
5e2b7c1b1f Docs: explain how the theme.json schema fixtures work (#81263)
f889575799 Global Styles: Remove unused duplicate font family preview utilities (#81194)
1e267a50fa Block editor: unify what a new sibling block inherits (#81250)
b31639cc09 Footnotes: guard against invalid post meta values (#81201)
bb108741c2 Media: Cover client-side big image scaling and orphaned files (#81061)
9cd1367227 Storybook: Enable design system theme tool globally (#81116)
773a915066 Use p elements for callout alerts in components docs (#81234)
7212715749 Fix: Trunk e2e failures caused by the navigation spec leaving plain permalinks (#81238)
90f2bd5b96 Components: Deprecate Animate (#80931)
61e43986ac URLInput: Skip search requests while an IME composition is in progress (#80602)
2ef358f6cd AGENTS: Update development tips section (#81224)
01c037b1ff Blocks: Support static block templates in block type settings (#80027)
a152341f8f Docs: Fix broken Figma links on the design resources page. (#81166)
f8c8421e38 List View: Split the context and drop dead props to cut re-renders on expand and collapse (#81159)
c004e77c30 Block Editor: Fix Select all freezing on large posts (#81210)
1c5ff32abd Update Changelog for 23.7.0
bfd5303f9d DataViews: Fix the between `date` filter losing a manually typed date on blur (#81150)
943f0a62be Bump plugin version to 23.7.0
503dad4e4c Blocks: Update hpq to 1.4.0 and drop the ts-expect-error suppressions (#81199)
2cd1c4a58b Block Editor: Return false from isBlockSelected when there is no client ID (#81212)
acf17cde10 DataViews: Make grid and table item preview aspect ratio configurable (#79329)
f7f5670d56 DataViews: Pass only eligible items to a bulk action callback (#81198)
04f245f71d Ensure device preview is always accurate when window is zoomed in (#81193)
11bae0c3c0 Components: Add allowForms prop to SandBox component (#76471)
6b40482d0f Media Attached to: Fix issue with the popover unexpectedly flipping, tweak wording (#81206)
1eaeae76c3 Remove the editableRoot opt-in from the paragraph block (#81184)
3a96676bba PanelColorSettings: Restore the missing space below the panel header (#81155)
b8cb89c907 Widgets editor: Add ThemeProvider for admin color schemes (#81173)
625944407d Blocks: Declare the `@types/react-is` devDependency (#81203)
1908100a47 Customizer widgets: Add ThemeProvider for admin color schemes (#81174)
52c7652c34 List View: Reduce per-row store subscriptions (#81136)
95ca3f044e Edit Widgets: Fix header toolbar button focus ring (#81176)
bffdae3257 Notes: fix the mention notification email composition (#81187)
fa4eff0910 Button: turn on the width setting by default in theme.json (#81196)
f9306164a1 Types: Replace remaining `@ts-expect-error` suppressions with proper typing (#81200)
c1d8367952 ESLint: Ban `@ts-ignore` in favour of `@ts-expect-error` (#81148)
991a717425 Agents: Add a defensive data design skill and route to the copy guide (#81131)
09e1e7ada3 Fix/79643 rtc awareness mixed block selection (#79836)
214438c400 Bump astral-sh/setup-uv from 8.3.2 to 9.0.0 in /.github/workflows (#80964)
7a1e659744 fix(admin-ui): reset the wp-admin li margin that misaligns Breadcrumbs (#81134)
02fea5a045 Bump actions/setup-node from 6.4.0 to 7.0.0 in /.github/setup-node (#80963)
b281d24fb6 Bump docker/login-action (#80962)
4513b4226b Media Editor: Render sidebar tabs via ComplementaryArea's render prop (#81133)
fe2e582976 Video: clarify the Video variation description (#81181)
a5e3bb48d7 Video: Hide settings for the GIF variation (#81142)
a0642d18c4 Block Supports: Guard against non-string attribute values to avoid fatal errors (#80501)
415b6f4508 Media: Improve the HEIC upload error and keep any upload errors up until dismissed (#81130)
REVERT: 8fdde7f743 Sync: remove the framework's dual-homed intent-log frozen core
REVERT: 64444c5109 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
REVERT: bdb55c7385 Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
REVERT: b87dce07c4 Sync: backfill CHANGELOG for the framework/plugin split
REVERT: b7cf02e709 Docs: bring the sync architecture docs up to date for the framework/plugin split
REVERT: 0d08f16481 Sync: remove the built-in transports from the framework
REVERT: 897e974c36 Sync: remove the Yjs engine from the framework (step 4b)
REVERT: 6180c357c8 Sync: make connection retry transport-agnostic (E2)
REVERT: 901a2ba337 Sync: make createSyncManager engine-neutral (step 4a)
REVERT: d574f8d1fe Sync: route the collection path through the engine (step 3)
REVERT: 8af5069291 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
REVERT: 88b2a22cf2 Sync: remove the intent-log engine from the framework (now plugin-only)
REVERT: 8f2cc74969 Sync: expose registry test-support + session seam types for engine plugins
REVERT: bc1fcc6bc3 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
REVERT: df743b1a68 Sync: Make the collaboration framework engine/transport-less by default
REVERT: 523cadb3b4 Docs: Add an as-built architecture overview with mermaid diagrams
REVERT: 773340178d Sync: Add the WebSocket transport (daemon + codec-driven client)
REVERT: a89022d73a Sync: Make transports swappable; add HTTP long-polling
REVERT: d312ecce21 Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
REVERT: 660ae1b184 Sync: Inline approval card for parked new-block proposals
REVERT: dd19643e94 Sync: Reserve Restore of requires-approval conflicts for capable users
REVERT: cb2c50f4e6 Sync: Stop dropping classic content; sync it as core/freeform
REVERT: e8b70c2618 Sync: Sync Custom HTML blocks through the content field (raw-content model)
REVERT: 1ab2581641 Sync: Fix the capture bug that silently blocked Custom HTML sync
REVERT: 0af03d60d5 Sync: Regression-test benign-to-protected attr value transitions
REVERT: d0fdd1290b Sync: Gate raw-attr markup at ingest; make block restore an approval
REVERT: c1353269a8 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
REVERT: 0a1dc908bf Sync: Anchor collaboration conflicts to blocks in the canvas
REVERT: 3cc6837dde Sync: Add the collaboration review panel to the document sidebar
REVERT: 42f4414661 Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
REVERT: 91d7ecb57a Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
REVERT: a6d52fe0a7 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
REVERT: 3cf3eea27f Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
REVERT: 887baa76b6 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
REVERT: 8dbac3a784 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
REVERT: e943fe7ef5 Docs: adversarial review of the intent-log branch (2026-08-05)
REVERT: 7fd02053b5 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
REVERT: be5fe799a1 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
REVERT: 58d3696eb9 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
REVERT: 689df3c0b6 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
REVERT: 7f205989c6 Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
REVERT: 034a9851a1 Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
REVERT: 05f376da52 Sync: presence for the intent-log engine (Phase 2d-viii)
REVERT: 30573c2ba6 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
REVERT: 7f3fe44da7 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
REVERT: af4e398cec Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
REVERT: 81091c0de0 Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
REVERT: 7d8414c8ec Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
REVERT: e1778e094f Sync: never treat editor staleness as user intent (Phase 2d-iii)
REVERT: e9261e7785 Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
REVERT: 8b4125788a Sync: record Phase 2d-i status in the architecture note
REVERT: 6b71de6649 Collaboration: live two-browser intent-log editing (Phase 2d-i)
REVERT: 56a2ec4542 Sync: record Phase 2c status in the architecture note
REVERT: 2daebd226c Sync: intent-log manager and adapter registration (Phase 2c-ii)
REVERT: 748153187a Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
REVERT: 93b4c5710d Sync: record Phase 2a/2b status in the architecture note
REVERT: e664cd0fcb Sync: intent-log client session codec (Phase 2b)
REVERT: f21a254365 Collaboration: unit tests for intent-log engine internals and adversarial ids
REVERT: a007745cb2 Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
REVERT: b965e32f1d Sync: narrow transports to engine-opaque payloads (Phase 1c)
REVERT: 188ce3728c Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
REVERT: dfe2434194 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
REVERT: 9dc871f8f5 Collaboration: extract a swappable sync engine seam (Phase 0)
REVERT: 5a3fa0c64d Sync prototype: intent-log engine with field-scoped merge semantics

git-subtree-dir: gutenberg
git-subtree-split: 83e144efc9cb29d5a2cc0f203c3009549e4868f8

* Turn the collaboration experiment on for the whole PHPUnit suite

The framework consults `wp_is_collaboration_enabled()` on `init` (registering
the `wp_sync_storage` post type and the CRDT post meta) and again on
`rest_api_init` (the transport routes), both of which fire before any test's
set_up. So the gate has to be flipped in the bootstrap, not per class.

This restores the posture the suite always had — the retired
`wp_collaboration_enabled` option was registered with a default of true, so
collaboration was on for every test without anyone asking. Per-class option
juggling comes out; one class's teardown deleting the experiment would
otherwise have switched collaboration off for every class after it.

* Say so on the settings screen when collaboration is off

Real-time collaboration used to default ON and had a visible Settings →
Writing checkbox. Now it defaults OFF behind a Gutenberg experiment, so it is
easy to land on Settings → Collaboration, pick an engine, save, and see
nothing happen. Show a notice pointing at the experiments screen in that
state.

* e2e: follow Gutenberg's empty-post appender to the ghost block

Gutenberg no longer renders a button appender on an empty post. It renders a
"ghost" paragraph — a real block element with role=document and the
accessible name "Add default block" — which materializes into the store on
the first pointerdown or focus. Every spec that started an empty post was
clicking `role=button[name="Add default block"]`, which no longer exists, so
they all timed out before typing a character. This is what was failing e2e on
this branch.

Switch to `getByRole( 'document', { name: 'Add default block' } )`, the same
locator the subtree's own collaboration specs use. Behavior is unchanged: the
ghost is not in the block store until the click, exactly like the old
appender. Same fix in the two-tab observer and the transport benchmarks.

* e2e: enable collaboration before the websocket daemon starts

Playwright starts webServers before global setup, so when
rtc-real-ws-daemon.mjs launches `wp collaboration sync-server` the suite's own
setCollaboration has not run yet. That was harmless while the CLI command's
guard was dead code; now that it really asks whether collaboration is enabled,
the daemon would refuse to start and take the websocket suite with it. Enable
the experiment in the launcher, before the daemon.

* Regenerate package-lock.json for the bumped subtree

The plugin depends on the framework through the subtree
(`@wordpress/sync: file:./gutenberg/packages/sync`), so the root lock embeds
the subtree workspace manifests. Bumping the subtree moved those packages to
1.53.0 and added a `@types/jest` devDependency, which put the lock out of sync
with `package.json` — `npm ci` refuses that outright, so every CI job died at
its install step before running a thing.

Also drops a stale `extraneous` entry pointing at an unrelated local worktree
(`../workspaces/gutenberg/try-intent-log/packages/sync`) that had no business
being committed.

* Squashed 'gutenberg/' changes from 83e144efc9..638392d908

638392d908 Fix lint violations in the sync-engine and review-panel files
afe0e5cad7 Sync: update getSyncManager tests to the engine-adapter API
a095509c0a Docs: sync engine architecture notes, integration guide, and reviews
5f56443ec1 Relocate the transport-specific e2e harness to the engines plugin
c36a86a669 Editor: collaboration review panel — sidebar, canvas anchors, inline approval
a1fd6e57bc Sync: escalation review lifecycle — store, actionable notices, restore/discard
c0ad64b8e1 Sync: rich-text and raw-content block config — classic and Custom HTML sync
00171d2487 Sync: mirror block save markup into the shared doc
44dd11d3e3 Sync: presence for engines without a shared Y.Doc
7446e5dee0 Sync: enforce the engine handshake; degrade to post locking, not silence
1021f39c64 Sync: client-side engine seam — SPI, registries, engine-neutral manager
fc96d7b5ac Collaboration: server-side engine/transport seam, empty by default
REVERT: 83e144efc9 Sync: finish the trunk merge — drop two framework pieces this branch owns elsewhere
REVERT: c6b266bc75 Rebuild package-lock.json on trunk's lock
REVERT: 2c50a5e9cd Sync: follow trunk's RTC experiment gate after the rebase
REVERT: 698a2fc7ca V1: integrated loop output, verified as a whole (#35)
REVERT: 13d1b3e154 Add more explicit test timeouts, reduce some default timeouts (#8)
REVERT: cf93599113 Make intent-log the framework's default engine
REVERT: 0a9a170bdb Relocate the transport-specific e2e harness from the framework subtree
REVERT: f683739358 Remove framework residue duplicated by or migrated to this plugin
REVERT: 7f36932c0d Sync: remove the framework's dual-homed intent-log frozen core
REVERT: 2149d22061 Docs: reflect the undo relocation (engine-provided undo; framework carries none)
REVERT: 04d32960fd Sync: make undo engine-provided and relocate the Yjs undo manager to the plugin
REVERT: 1cd70e6820 Sync: backfill CHANGELOG for the framework/plugin split
REVERT: 7062018ff2 Docs: bring the sync architecture docs up to date for the framework/plugin split
REVERT: 98e8ba2fdf Sync: remove the built-in transports from the framework
REVERT: 14b9a11c67 Sync: remove the Yjs engine from the framework (step 4b)
REVERT: cda266cad7 Sync: make connection retry transport-agnostic (E2)
REVERT: 00d42e9d76 Sync: make createSyncManager engine-neutral (step 4a)
REVERT: f58a913289 Sync: route the collection path through the engine (step 3)
REVERT: 4008ded853 Sync: extract an engine-neutral seam from the sync manager (steps 1-2)
REVERT: 18ac9e5037 Sync: remove the intent-log engine from the framework (now plugin-only)
REVERT: ce2d216dd6 Sync: expose registry test-support + session seam types for engine plugins
REVERT: 01111eee44 Sync: Expose registerSyncEngine / registerSyncTransport private APIs
REVERT: 022ebd91e2 Sync: Make the collaboration framework engine/transport-less by default
REVERT: 8ac75c8cae Docs: Add an as-built architecture overview with mermaid diagrams
REVERT: b3567fd4dc Sync: Add the WebSocket transport (daemon + codec-driven client)
REVERT: 276bd27a87 Sync: Make transports swappable; add HTTP long-polling
REVERT: d0fb51470f Sync: Benchmark harness through the WP_Sync_Engine seam (Phase 3)
REVERT: 60eb412dfa Sync: Inline approval card for parked new-block proposals
REVERT: 08d3ecedcb Sync: Reserve Restore of requires-approval conflicts for capable users
REVERT: 5d24f4cc2c Sync: Stop dropping classic content; sync it as core/freeform
REVERT: 14a82d708b Sync: Sync Custom HTML blocks through the content field (raw-content model)
REVERT: 3be3b1c3e5 Sync: Fix the capture bug that silently blocked Custom HTML sync
REVERT: 65e8bf9369 Sync: Regression-test benign-to-protected attr value transitions
REVERT: 9983a07e54 Sync: Gate raw-attr markup at ingest; make block restore an approval
REVERT: b63d141b62 Sync: Enforce unfiltered_html at intent ingest (requires-approval lane)
REVERT: bb4c4b9e9b Sync: Anchor collaboration conflicts to blocks in the canvas
REVERT: 11165044f7 Sync: Add the collaboration review panel to the document sidebar
REVERT: ca51d70d4d Sync: opt-in wire inspector, server debug envelopes, and Query Monitor breadcrumbs
REVERT: 6a9357f463 Sync: proposal read API and resolution lifecycle (review finding 1.3b complete)
REVERT: 791a40e653 Sync: rewrite intent-log capture onto rich-text coordinates (review finding 1.4)
REVERT: 5149d9a9d3 Sync: bound intent-log growth with compaction checkpoints (review finding 1.6)
REVERT: a71e3103c5 Sync: serialize ingest, pin UTF-16 coordinates, and close the planner policy holes (review findings 1.3a, 1.5, 1.8, 1.9, 3.2, 3.4)
REVERT: 4dad221495 Sync: codec-driven transport recovery and a real lock posture for bootstrap engine mismatch (review findings 1.1, 1.2)
REVERT: 9668010b7b Docs: adversarial review of the intent-log branch (2026-08-05)
REVERT: 00f5867bf9 Sync: deterministic client-side genesis ids (Phase 2d-xiii)
REVERT: ffac7acf99 Sync: title sync for the intent-log engine via an entity property family (Phase 2d-xii)
REVERT: c070625a92 Docs: record Phase 2d-ix through 2d-xi status in ARCHITECTURE.md
REVERT: c27fb74ea7 Sync: verify the intent-log save flow end to end (Phase 2d-xi)
REVERT: 86bb5d76ec Sync: surface intent-log escalations as an editor notice (Phase 2d-x)
REVERT: bbb0d851fe Sync: client-side 409 engine-mismatch handling (Phase 2d-ix)
REVERT: 1a108bb136 Sync: presence for the intent-log engine (Phase 2d-viii)
REVERT: c8e9d59ae9 Sync: cement durable-identity behavior — tests, tooling, and two masked defects (Phase 2d-vii)
REVERT: ffd4f44fb2 Collaboration: durable block identity — stamper, duplicate re-mint, unknown-id adoption (Phase 2d-vi)
REVERT: 37456458bc Sync: content-aware identity adoption — splits no longer steal sibling identity (Phase 2d-v)
REVERT: 4146e4eb2c Sync: give editor-pushed blocks stable clientIds (Phase 2d-iv)
REVERT: bafedefbc6 Sync: e2e coverage for passive-reader and reader-first intent-log scenarios
REVERT: 09c9ae78f2 Sync: never treat editor staleness as user intent (Phase 2d-iii)
REVERT: bf2f8223ca Sync: fix intent-log identity churn and genesis wrapper mismatch (Phase 2d-ii)
REVERT: c03be224b9 Sync: record Phase 2d-i status in the architecture note
REVERT: bf84dcd84a Collaboration: live two-browser intent-log editing (Phase 2d-i)
REVERT: c6ffc0cf77 Sync: record Phase 2c status in the architecture note
REVERT: 12ba54f1f4 Sync: intent-log manager and adapter registration (Phase 2c-ii)
REVERT: 5bd6737e62 Sync: intent-log capture bridge — block trees in, verified intents out (Phase 2c-i)
REVERT: 46fb9020d3 Sync: record Phase 2a/2b status in the architecture note
REVERT: 76b516ded4 Sync: intent-log client session codec (Phase 2b)
REVERT: c16d278721 Collaboration: unit tests for intent-log engine internals and adversarial ids
REVERT: bbd1591b2d Collaboration: WP_Intent_Log_Engine — intents over the polling transport (Phase 2a)
REVERT: 312f3b3fe4 Sync: narrow transports to engine-opaque payloads (Phase 1c)
REVERT: fb9af267ff Sync: graduate the intent-log engine core into packages/sync (Phase 1b)
REVERT: 9276dc7c37 Collaboration: intent-log planner PHP twin with frozen transcript vectors (Phase 1a)
REVERT: 98365687c4 Collaboration: extract a swappable sync engine seam (Phase 0)
REVERT: e61523237a Sync prototype: intent-log engine with field-scoped merge semantics

git-subtree-dir: gutenberg
git-subtree-split: 638392d90882a9f65bbf4a7b1dbaf23036980bfb
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.

1 participant