Skip to content

docs(changelog): shorten 0.33.0's fragments so its release notes leave out no entry - #987

Merged
nissa-seru merged 21 commits into
anima-research:mainfrom
nissa-seru:ada/033-notes
Nov 7, 2026
Merged

nissa-seru merged 21 commits into
anima-research:mainfrom
nissa-seru:ada/033-notes

Conversation

@nissa-seru

Copy link
Copy Markdown
Contributor

Rewrites 0.33.0's pending changelog fragments so its GitHub release can carry the whole 0.33.0 section, where today the release notes would leave out 85 of the section's 196 entries.

The 0.33.0 release notes

  • base (main): the section is 169,829 characters from 92 fragments, over release-notes.mjs's limit of 120,000, so the notes leave out the section's last 85 of its 196 entries.
  • head: the section is 119,417 characters, 110 entries from 58 fragments, and the notes leave out nothing.

What changed:

  • Fixes of the release's own new mechanisms fold into the entries that describe them. A .fixed fragment whose every fix is to a mechanism no release has shipped (checked against v0.32.0) now reads as what 0.33.0 does, in that mechanism's Added, Breaking or Changed entry. A fix to behaviour 0.32.0 shipped stays a Fixed entry.
  • An Added entry for the boot pass that hands an interrupted agent's unread notices to the primary (291-interrupted-notice-pass.added), which had none. It takes in the two interrupted-notice-pass fragments, which described only that pass's edges.
  • Cross-references name the section and the entry's lead ("see Breaking: every agent's context follows its own presentation index"), where they named a fragment's file, which a release reader can't look up.
  • Shorter text: sentences that repeat another entry, and a new mechanism's own failure handling, are cut. A name a removed line gave is still named elsewhere in changelog.d, except examples of names 0.32.0 already had (such as offline recovery's --messages), hooks the package doesn't export, and one failure log line ([thinking-binding]).

Nothing outside changelog.d changes. Each commit's message says what it folded, moved or cut, and why.

@antra-tess for awareness: these are the release notes for 0.33.0, the release that carries #844. No review is asked.

  • Pending changelog fragments edited: every change is in changelog.d.
Credits

Ada-1017 and Hamish-2699 rewrote the fragments, and Hilda-2681 read every commit against the code. Ada-1017 wrote this description.

Details for agents

Head 7cb8c147b457, on main at c788d078c409.

Problem

At c788d078c409, the 0.33.0 section that release-changelog.mjs renders from changelog.d is 169,829 characters, so release-notes.mjs cuts it to fit its 120,000 limit and leaves out the section's last 85 of its 196 entries.

Changes

21 commits, each touching only changelog.d, take its 92 fragments to 58, as listed in the top.

Tests

Docs only, so no test suite was run for it. Both counts come from running release-changelog.mjs with the version set to 0.33.0, then release-notes.mjs, over a copy of changelog.d and CHANGELOG.md at c788d078c409 and at 7cb8c147b457, on Linux with Node v24.22.2.

  • Which fixes fold: for each fold, the mechanism the folded fix touches was looked for by its names in src at v0.32.0, and the fix was folded only where that mechanism is absent there. A reader who wrote neither half checked each folding commit the same way.

  • Names kept: each of the 304 distinct code spans in the 21 commits' removed lines was searched for, backticks included, in changelog.d at 7cb8c147b457, and 284 are there as written. Of the other 20:

    • eight are there in another form, such as readsSharedSlot without its argument, or neverPresented as SurgeryMarksPreview.neverPresented;
    • four are example values, such as { agent: 'resident' };
    • eight are the exceptions the top lists: five names src already had at v0.32.0 (--messages, kind: 'prose-drafts', system_context:<namespace>, workspace-head-move, and user, the participant that release stored its notices under), two hooks of the tune-out coordinator that src/index.ts doesn't export (writesHeld, branchOrigin), and the log line.

    A name a removed line gave without backticks wasn't checked.

Not verified

The release isn't cut here, so GitHub's own rendering of the notes isn't seen.

Ada-1017 and others added 21 commits November 7, 2026 03:23
…ts entry

844-stop-stamp.fixed and 844-stop-loses-waiting-note.fixed fixed only the waiting
tune-out cancel, its loss notices and the stop stamp, none of which a release has
shipped (0.32.0 cancels at once). What they describe is now one paragraph of the
291-deferral-queue breaking entry, as what this release does: the loss notice
kept at a stop, the stamp, what the next boot tells the persistent subconscious,
the release's cancel.by / cancel.askers, and the two traces.

844-queued-note-loss-in-release.fixed keeps only what 0.32.0 shipped: a tune-out
whose release reached the resident but whose end wasn't recorded after a store
fault between the two. The rest of it fixed the waiting cancel alone.
…keep what 0.32.0 shipped

- 291-branch-move-resync.fixed: carrying each window across a branch move is
  this release's own mechanism; what a reader can see of it (the window carried,
  legacy mode until the next move where it can't be written down, redo entries
  dropped) joins the 'rebase' occasion's bullet in 291-branch-move-resync.added.
- 844-release-without-reader-held-writes.fixed: a release of a tune-out on record
  at a reader-less connect waiting for held writes is an edge of mechanisms no
  release shipped; it names nothing a consumer sees. Removed.
- 291-stop-during-complete-build.fixed keeps its first bullet (0.32.0 stored the
  round and called the turn completed); the second was a stop from a listener of
  the round's presentation, a mechanism new here.
- 844-close-focus-or-own.fixed keeps 0.32.0's close (it closed the turn's own
  channel), its refusal's naming edge in one sentence.
- 291-complete-while-waiting.fixed: its slug-like pointer to 0.30.0's entry now
  says what it means.
Release readers see no fragment names, so 'the 291-presentation-mandatory entry'
and the like now name the section and the entry's lead (Breaking: every agent's
context follows its own presentation index; Added: every row says who it is for;
Added: AgentConfig.observes; Breaking: the chronicle ^0.6.0 dependency), and
context-manager's own entries are its 0.25.0 release notes. The review8-* slugs
are left for the folds of those fragments.
…sumer sees

A boot tells a hold the stop accounted for from the notice the stop kept, not
from the stamp. And six surfaces the folded fragments named appear nowhere else,
so they come back, briefly: the stamp's branch and wakesOwed, the notices'
lossNoticeId, keptAtSequence and lostAtStop, a budgeted stop leaving a hold out
of its stamp, the first start on a store with no stamp (holds count as stopped
cleanly, logged), the tool-result guard's staged batch read at boot, the waiting
answer's warning and serverId, and a queued note going out before another
cancel's release. The dropped-cancel trace lists all four reasons.
review8-tune-out-deferred-cancel.fixed, -window-start.fixed and
-window-starts-unreadable.fixed fixed only the waiting cancel and the
subconscious's ordinal window start, which no release shipped (v0.32.0 has no
noteDropped, window-starts or deferred coordinator cancel). Their behaviours
that a consumer can see go into the entries for those mechanisms
(291-deferral-queue breaking, 291-subconscious-window added), as sentences
handed to that entry's owner: a waiting cancel ends only its own hold; where a
note left with it goes when another cancel ends the hold, and who is told of
its loss; the clamped start kept. The fixed entry's last bullet described the
waiting note's text before its rewrite, and is not carried. Their failure
handling with no surface (a set or read that throws) is left to the code.

review8-tune-out-deferred-cancel.added keeps its trace, worded shorter, and
gains tune-out:note-loss-untold, which only the folded fixed entry named.
…eep 0.32.0's

Folded, since v0.32.0 has none of their mechanisms (waiting cancel,
foreignRounds, neverPresented, managersRefusingWork, presented-window
refusals): review8-operator-close-wait (into the 291-deferral-queue
breaking entry's account of the close and the retry), -foreign-rounds (into
291-resident-observes: raw while the window is the record, a derived agent
or fork sent rounds as its template is), -failed-restore (into the 'rebase'
bullet of 291-branch-move-resync), -preview-unreadable (into
291-removal-propagation's neverPresented) and -rollback-observed-rows, which
291-removal-propagation's no-op refusal already says.

review8-operator-undo-redo keeps what 0.32.0 shipped (a redo whose checkpoint
save failed threw the store's error, its entry taken off the stack), the
refusal and the trace's order, and drops the undo's checkpoint-retry edge.
The other operator entries fix 0.32.0 behaviour or text and stay as they are.
…ation entries

Every review8-presentation fix but placement and turn-start fixed the
presentation index, which no release shipped (v0.32.0 has no presentRows or
windowStatusOf). What a consumer can see goes to the presentation entries:
presentation:failed's messageIds (291-presentation-index), the
presentation-legacy ops alert and presentation:failed's legacy flag
(291-presentation-mandatory), and the held-draft notice presented at once to
an idle observer or the subconscious (291-presentation-points). Boot-wakes,
framing, own-order, retraction and rollback-hold are that mechanism's failure
handling, with nothing to name, or already said by those entries.
review8-unstamped-own-rows is said by 291-presentation-mandatory's undo
bullet.

Placement and turn-start stay: 0.32.0 counted a fork's render as read, and
compiled a start without the writes its flush couldn't store.
…ience fixes

All fixed mechanisms no release shipped (v0.32.0 has no returnedToArrivals,
history leftOut, readersOf, declaredWith or audience stamp):
- review8-recovery-noop-cut and -suppress-kept: one bullet of
  291-removal-propagation's fixed entry, beside the no-op refusal it already
  gives for offline recovery's rows without a Discord id.
- review8-modules-history-left-out: leftOut counted once across resumes, in
  291-removal-propagation's changed entry; -window-note is said by its added
  entry.
- review8-audience-named-readers, -modules-registry-reads-shared and
  -modules-registry-legacy-edges: 291-audience-stamp's added entry, the
  legacy edge's migration note with them, in place of that entry's pointer to
  this fragment.

review8-modules-discord-lost-create folds into the message:lost trace's
Added entry: what the Discord module does with a create lost at a release.
…p 0.32.0's

Folded or left to the code, since v0.32.0 has no WriteLandedError, deferred
importer or holding-window lookup: review8-writes-own-row-landed (into
291-deferral-queue's WriteLandedError account), -import-ids,
-unreadable-holders and -window-row-log (failure handling with nothing to
name).

review8-writes-interrupted-notice keeps its first bullet, what 0.32.0 did
(looked for the result in held mail by name alone), with a lead that
291-deferral-import's pointer can name; its third bullet (metadata.passedOn)
goes to the new Added entry for the boot pass, and its second is that pass's
failure handling. -held-mail-sync is worded shorter; -coalescer-failure-save
stays as it is, since v0.32.0's render() had no delivery-failure handling to
show the broken form was unshipped.
…hipped

Its first bullet, a close whose release waited for held writes, fixed the
waiting cancel, which no release shipped; it folds into the 291-deferral-queue
breaking entry's account of the close. The rest fixes 0.32.0's close of the
excepted channel (v0.32.0 framework.ts:32128-32137 answered a fixed "The focus
on it ended all the same" or rejected with "The close wasn't recorded") and
stays, with the answers' words kept and the explanation shortened. The
pointer to 844-close-focus-or-own is written out.
…e failure

review8-channel-close-focus gave the failure answers but not the close's
ordinary answer once its focus ended, which changed since 0.32.0 ("The focus on
it ended all the same, and what the other channels held was delivered." became
"The focus on it ended, and what the other channels held was delivered, up to
its backlog cap.", framework.ts endedText), and its "otherwise" left out the
failure after the release notice was stored, which the answer tells in words of
its own. Both are text the agent reads, so both are quoted.
…boot pass entry

Places the sentences the review8 commits folded into the 291 Added,
Breaking and Changed entries (deferral queue: the retry, a waiting cancel
ending only its own hold, where its note goes, the close's waiting answer,
own rows on WriteLandedError; subconscious window, observes, audience,
presentation, branch-move resync, removal propagation, deferral import),
so the review8 fragments those commits deleted lose no consumer surface.

Adds 291-interrupted-notice-pass.added: the boot pass that hands an
interrupted agent's unread notices to the primary had no Added entry.
It folds interrupted-notice-pass-held and -retried, which described only
that new pass's edges (no release shipped it; 0.32.0 passed such writes
from its deferred queue). The held case is left out: the held fragment
itself says no hold can be in force while the boot passes notices.

Corrections to the stop paragraph read against c788d07: the waiting
answer's warning is given only while the run's start isn't recorded and
the cancel carries the persistent subconscious's note; keptAtSequence
keeps a later ask from reading as told; the sentence on a waiting note
going out first moves into the fuller account after noteDropped, which
says the persistent subconscious's goes before the release and a reader
fork's after it. pendingRound is carried onto the presentation index,
not read from it.

Slug references left in 291-presentation-mandatory, -held-stored-at-once,
-reads-row.breaking and -presentation-index now name entries by section
and lead.
…s' own edges

291-deferral-queue.breaking: the opening paragraph says the same with
fewer words, every surface kept (the two holds, deferredWrites, the
context-reinit-failed and store-held-lost alerts and their data fields,
WriteLandedError, WriteOutcomeUnknownError, mayBeStored, the coalesced
render's recovery, 0.32.0's queue for each case). The crash sentence
before store-held-long goes: the note's account already says a restart
leaves the tune-out in force and cancels one whose end time passed. The
Rollback bullet points to the presentation index's MANIFEST bullet rather
than repeating it; Migration's quiesce paragraph is shorter.

291-subconscious-window.added: drops the window start's own failure
handling (a start set while the window is the record, one whose setting
failed before a move, a restart's unreadable anchor); the next bullet
already says a restart sets the start in force again.

291-audience-stamp.added: the tune-out hold rule is said once, for any
write that carries metadata.tuneOut; the imported writes' stamp points to
the deferral import entry, which says it.

291-deferral-import.added: drops the importer's own crash and read-failure
edges (a landed write skipped by id, the search failure, the malformed
drop, the unreadable owed-wakes read); a write that can't be stored still
stays in the record for the next boot.
… entries

The five entries keep every surface they name (APIs, fields, traces and their
reasons, refusal and tool text, the prompt-cache miss) and every comparison
with 0.32.0, and lose what another entry already says or what is a new
mechanism's own edge:
- presentation-points.added: a write stored at once (the deferral-queue
  breaking entry says it), a write-down that throws after its record, an own
  row after a failed start, a gate batch's failure log line, the redo's
  read-mark detail beyond "cover them again". Undo and redo point to the
  breaking entry instead of restating it.
- presentation-points.changed: a surgery's held writes (the deferral-queue
  breaking entry), and a listener that starts one during a release.
- removal-propagation.added/.changed/.fixed: the explanation of why removals
  propagate, the returned rows' later edges, a repair that fails, the search
  of summaries alone, a plan for later work; the offline recovery bullets
  become one bullet with three parts.

The rendered 0.33.0 section goes from 131,885 to 126,340 characters.
…ne's source once

291-resident-observes.added: the 0.32.0 view of the shared slot and the
unstamped rows before the upgrade are said in the Breaking entry's
residents bullet; this entry keeps one clause and points there.

291-audience-stamp.added: the batched-wake line's source goes on the
sentence that already names the line, and the rule's rationale is one
sentence.
The refusal names the host's hide only where a row it points to has a Discord
message id, and leaves it out where none has one; the entry said only the first.
291-deferral-queue.breaking: Module authors says the same with fewer
words (the held write's '' id and what can't find it, its traced release,
the external-id map, ModuleMessage.held's new meaning, queryMessages'
order, the held: handle for one release); Tune-out hosts' last sentence
and Traces are shorter, every name kept. Drops the stop alert listener's
own write (an edge of the new stop accounting) and the close answer's
timing clause, keeping the waiting answer's words.

291-subconscious-window.added: drops the signature rationale, which
explains the transcript's choice rather than a behaviour.

291-tune-out-reader-text.changed: the old create() refusal is quoted
without its preamble.
…-input entries

Every surface these entries name stays (the ReadMark API and its answers,
readsRow, WritePlacement, heldFromResidents and held, heldMessageIds, the two
dependency floors and create()'s refusals, the MANIFEST bound, the turn-inputs
pin and setting), and so does every comparison with 0.32.0 and 0.31.0. What
goes:
- 291-held-stored-at-once.changed: what the deferral-queue breaking entry says
  of writes kept in memory and of a cancel during a surgery, the clock row the
  presentation points entry gives, and the dump's read where writesHeld throws.
- 291-chronicle-0.6.breaking: why context-manager has no one-row path, and
  the version list beyond "0.5.1 and earlier" / "0.24.0 and earlier".
- 291-audience-stamp.fixed: the wake-onboarding bullet, which the
  audience-stamp added entry says and which no release shipped; the spec
  bullet, a fix of own slots, goes to that entry as one sentence.
- 291-reads-row.*, 291-complete-while-waiting.fixed, 291-turn-inputs-window:
  restatement and examples, and a re-presented row's edge before the
  write-down.
…plit

291-audience-stamp.added: a spec still written without ownSlot
(readsSharedSlot: true, its own namespace, an agent edge) is read as the
restored record is, owning its namespace's slot and observing the shared
slot. The sentence comes from 291-audience-stamp.fixed's last bullet,
which fixed own slots, a mechanism no release shipped.
…the index

context-manager 0.24.1 and 0.24.2 have no window index either, so "0.24.0 and
earlier" left two releases out; and the load on 0.24.0 keeps its reason (it has
neither error).
A bare "see Added" becomes "see Added: `AgentConfig.observes`", the
entry's lead.
@nissa-seru nissa-seru self-assigned this Nov 7, 2026
@nissa-seru
nissa-seru merged commit 16a16ff into anima-research:main Nov 7, 2026
11 checks passed
nissa-seru pushed a commit to nissa-seru/agent-framework that referenced this pull request Nov 7, 2026
Catches anima-research#361 up onto main at 16a16ff: anima-research#844's merge, then anima-research#987's notes,
which changed only changelog.d. Three hunks in src/framework.ts conflicted:

- The type region keeps both sides: RecordedTurnCheckpoint beside main's
  heldWritesTold, sameCheckpoint and SurgeryHeldWrite.
- quiesce()'s doc takes main's text, with the budget hold's sentences added
  where they hold under it. A write is stored at once while quiesced now, so
  the old text's deferred-write queue is gone from it.
- The OverBudget breaker's drain kick stays in kickOverBudgetDrain, where the
  hold's own compression calls it. It already carried main's two stops, for a
  framework that is stopping and for a surgery's hold. Its branch for an undo
  or a redo that moved the store under a tick goes, as main dropped that
  branch with syncMoveReinit.

Everything else merged cleanly. The hold's tests that this merge breaks are
recast in the next commit.
nissa-seru pushed a commit to nissa-seru/agent-framework that referenced this pull request Nov 9, 2026
… [Gate: …] line for events with a message of their own

The merge brings anima-research#844 (Dendrite's presentation index, readsRow) and anima-research#987
into anima-research#972. anima-research#844 deleted the deferral queue and the two marks anima-research#972 judged a
batch's writes by (readsDeferredWrite, readsStoredMessage), so anima-research#972's
handing could not be merged as it was: 38 conflict blocks in six files (7
textual, 13 on the write marks, 18 on the line's handing and placing).
The merge is resolved as the cut, rather than catching the handing up and
then deleting it.

What the cut does:
- An event with a message of its own in the window gets no line: an MCPL
  channel message or push (stored at arrival), a heartbeat tick or reminder,
  and a module event whose host gave the gate its one stored write
  (`added`). Only events with no message of their own keep a line, quoting
  each, written when the batch is delivered, counted over those alone.
- Its wake carries what it is for as WakeProvenance.writes (WakeWrite: the
  write and the channel a reply is owed in), present only when every event
  with a message of its own was given its write; the line's own placement
  joins them where a line was written. The framework maps each by
  readsRowFor, so a mark is taken only for the agent the write was placed
  for, and the wake carries InferenceRequest.readsRows only when every write
  maps; otherwise it stays plain (a co-resident's, the trunk's). The
  scheduler drops it once each row is done (rowDone with that row's
  replyTo), as main judges a wake's one readsRow.
- Gone: main's 0.27.0 handing (WakeProvenance.line, WakeLine, wakeLineText,
  InferenceRequest.wakeLines, EventGate's isNewestEntry, the framework's
  isNewestContextEntry, placeWakeLines, placedWakeLines, mergeWakeLines,
  wakeLineKey, gate:wake-line-omitted) and anima-research#972's own (lines, owed lines,
  the held buffer's split by write). isNewestIn and windowTail go with
  their only callers (open anima-research#690 uses isNewestIn only for "newest").
  referenceLine and GateEntryRef go too.
- Kept from anima-research#972: evaluate(info, after) and its threading through the
  channel lane (routed and deliverTo forks included), the push lane, the
  heartbeat and the module path; the judge's isAnswered, now one small
  function on covers (no answered mark: false; covered or in doubt: true),
  and no `unsure` parameter left on the wake's judging (rowDone is
  main's); upcomingWakes' and the
  framework's `certain` for wakes that may drop; the agent-facing
  descriptions of debounce and judge rules.
- Why no quoted line for a recipient that doesn't hold an event:
  under conversation routing a debounced channel message wakes the trunk
  and every fork, and quoting it there would show one conversation's words
  in another. Those recipients now wake plain,
  as main's forks did, and the trunk loses main's untrue "already shown
  above" line. Who is woken is unchanged.

Tests: test/gate-batch-in-window.test.ts pins the rule's cases, red at main
past every premise and green here. Tests that pinned the handing
are turned round or, where their subject is gone, removed
(batched-wake-line, event-gate, event-gate-judge, presentation-points,
presented-watermarks, stored-injections, audience-stamp-writers,
event-gate-strict-rules, supplied-text-in-context). anima-research#972's drop tests are
ported to main's marks (debounce-seen-wake, the fork case in
conversation-routing). Changelog fragments rewritten for the cut.
nissa-seru pushed a commit to nissa-seru/agent-framework that referenced this pull request Nov 9, 2026
Catches anima-research#361 up onto main at 16a16ff: anima-research#844's merge, then anima-research#987's notes,
which changed only changelog.d. Three hunks in src/framework.ts conflicted:

- The type region keeps both sides: RecordedTurnCheckpoint beside main's
  heldWritesTold, sameCheckpoint and SurgeryHeldWrite.
- quiesce()'s doc takes main's text, with the budget hold's sentences added
  where they hold under it. A write is stored at once while quiesced now, so
  the old text's deferred-write queue is gone from it.
- The OverBudget breaker's drain kick stays in kickOverBudgetDrain, where the
  hold's own compression calls it. It already carried main's two stops, for a
  framework that is stopping and for a surgery's hold. Its branch for an undo
  or a redo that moved the store under a tick goes, as main dropped that
  branch with syncMoveReinit.

Everything else merged cleanly. The hold's tests that this merge breaks are
recast in the next commit.
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