Skip to content

Release 0.13.0: labelled links, Discard changes, your own posts - #49

Merged
aneeshsathe merged 28 commits into
mainfrom
release-0.13.0
Oct 19, 2026
Merged

aneeshsathe merged 28 commits into
mainfrom
release-0.13.0

Conversation

@aneeshsathe

Copy link
Copy Markdown
Owner

Burrow 0.13.0. The release notes are the [0.13.0] section of CHANGELOG.md.

What's in it

  • Labelled links (studio 0.47, [[id | text]] / ![[id | text]]). blyg-render now matches studio 0.47.0: parity is 246/250, and the other 4 are the known decision-#60 cases. The pickers, Quote into a thread, lineage, plain text, spell-check and generated text all handle the label.
  • Needs studio 0.47. On an older blyg, only posts with labelled links wait. Everything else syncs. Burrow shows a "Your blyg needs updating" notice, and the publish sheet can rewrite the links bare.
  • Discard changes (⌥⌘Z, the Post menu, the toolbar, ⌘Y) for a published post with unpublished edits. Waiting outbox saves are dropped, and an edit made mid-discard isn't saved over the restored text.
  • Your own posts: "Your blyg" is a Reading source. Published posts in Posts get Reply / Quote / Link post chips. Your own pins can be forked from ⌘Y.
  • Usability fixes from the review: picker rows, footers, the tooltips for unpublished edits, published and pinned, the edit marker, a Fortress activity strip in place of the z-level, no Discard key on Windows, and the toast spacing.
  • Windows wording for newer text, from @patwater's fork (ae0bafa). Windows follow-ups are in Windows follow-ups: in-app browser pane, auto-update, signing and installer #48.
  • Docs, the tour (new Discard and own-post steps, plus edited picker and Reader steps) and the 0.13.0 what's-new card.

Checks

  • cargo fmt, clippy --workspace --all-targets -D warnings and cargo test --workspace pass on macOS.
  • Stock e2e (scripts/e2e-local.sh, BLYG_E2E_STOCK=1) against local studio builds: v0.47.0 48/48 core and 2/2 notes; v0.46.1 48/48 core and 2/2 notes.
  • The tour was stepped through from a 0.12.0 launch on sample data.
  • No personal data in the diff. Commit authors use noreply addresses.

Not in this release: the upstream label-grammar fixes (blygger/blygger-studio#78), which go into a later re-sync, and a retake of docs/screenshots/themes/fortress.png, which still shows the old z-level.

🤖 Generated with Claude Code

aneeshsathe and others added 28 commits October 18, 2026 13:33
One scanner (grammar.rs, the studio's grammar.ts) now reads every link,
directive, TK source ref, stub-quote and native-model bracket form. A
link's label is its anchor text (escaped; an empty label falls back to
the target's text); a directive's label is ignored by resolution and the
bake. Literals restored into URLs are encodeURI'd as the studio does.

Public API: link_refs, directive_ref, label_text, link_source,
link_label, strip_generated_grammar (row 67), and Span::label on the
native model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mmar vectors

31 label_* corpus cases cover every labels.test.ts case plus labels in
alt text, link text, URLs, TK output and malformed directives. The
harness also runs grammar_input.json through grammar.ts and
link-label.ts into parity/_grammar.json. Parity: 246/250 byte-identical,
the same 4 known decision #60 divergences; grammar vectors all match.
docs/RENDER.md describes the grammar, the API and the new pinned
upstream behaviours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
blyg_core::grammar now re-exports link_refs, directive_ref, label_text,
link_source and strip_generated_grammar from blyg-render and adds only
source_ids, label_range, replace_links and directive_source on top. The
reading stream keeps a link's Span::label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From patwater/burrow-blyg-windows- ae0bafa. App text added since the
port that said "this Mac", "macOS Keychain" or a ⌘ key now goes through
keymap::hint: lineage, the stub bar, sources, subscriptions, the stream,
the notes drawer, the About server notice ("your other Macs" becomes
"your other PCs"). Also wrapped: the new-note placeholder, the
signed-out toast and the theme-dark note.

The fork's README and WINDOWS.md are not taken: the README already
covers both platforms, and the Windows notes live in site/src/install.md,
which gains the fork's two new facts (macOS fonts named by a theme map
to Windows ones; About opens Explorer).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A published post with unpublished edits can go back to the version it has
published (upstream's "discard changes"): ⌥⌘Z, Post › Discard Changes…, a
toolbar button, and "Discard changes…" on the current version in ⌘Y. A
sheet asks first, then restore(id, item.version). Disabled with a reason
for drafts and scratch notes, withdrawn or clean posts, and offline.

Every restore now runs through discard::restore_working_copy: core's
restore holds the sync lock and drops the waiting outbox ops, and the
editor doesn't save while the restore is on its way, so text typed
meanwhile can't put the old copy back. A failed restore saves it.

Tests: vm rules, headless window tests (typing during a discard, a failed
discard), a store test, and real-studio e2e cases (incl. generated text,
where dirty stays set). SPEC updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Your published posts are reading rows ("~own", studio 0.45's own-items
marker): in All, Today and the stream, and alone under "Your blyg" in the
Reader's sources pane, with the same reading pane and action chips. They
are never unread, never thumbed, never counted, and no read state or
signal is sent for them; AI reply isn't offered on them. Opening one shows
your current and pinned versions, pins from your public pin files.

On a published post the Posts view shows Reply · new stub, Quote into a
thread, Fork a pin and Link post · new fragment above the editor, also in
the Post menu with keys (⌥⌘R, ⌥⌘Q, ⌥⌘F, ⌥⌘L; in Reading they act on the
open post). They run the Reading view's code on the post's row, so a
self-stub's stub_of and a self-fork's forked_from name your origin
(protocol 0.4 §10.6, §5.6) and a quote's transclusion omits it (§10.3).
Forking your own pins is one switch, own::FORK_OWN. The lineage ring
offers Reply and Fork on your own post too.

Link posts and quotes are written with the label grammar's helpers. An
e2e case checks a self-stub and a self-fork against a local studio.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Burrow's [[ picker writes labelled links ([[id | label]]) that a studio
older than 0.47 shows as literal text or a broken link. The sync engine
now checks a studio floor once a session (and every minute, or on a
manual sync, while it fails): the manifest's generator
(blygger-studio/<version>, the one manifest key that moved between
0.46.1 and 0.47.0), else a /api/search probe for the label 0.47 hits
carry; when neither can tell, the blyg isn't locked out.

Below the floor nothing about a post is sent (outbox, publish,
withdraw, pin, restore, upload, fork, responses, highlight), pulls go
on, and the app says "Your blyg needs updating" once, in the status
bar, on connect, and in About. The "older than 0.40" limits sheet and
its About section go: every blyg that could see them now gets this.

Docs, CHANGELOG, a real-studio e2e case (0.46.1 and 0.47.0), and
BLYG_E2E_SKIP_NOTES for running it alone below the floor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The string literal wrapped onto a new line without its \ continuation, so
the toast's second line carried a run of spaces. The line is now a small
function, still_unpublished ("Still marked unpublished: vN has generated
text. ⌘⏎ publishes it as vN+1"), with a test that it has no double spaces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The user's review decisions:
- O1: your own posts show no thumbs, no unread dot and no AI reply.
- O2 (b): no Fork on your own posts in Reading or the Posts view. The
  ForkPost action, its ⌥⌘F key and menu item are gone. ⌘Y offers "Fork
  this pin" on a pinned version of yours (forked_from naming your origin,
  protocol 0.4 §5.6), greyed with "Pin one in ⌘Y to fork it" on an
  unpinned one. vm::own_actions is the one place; own::FORK_OWN switches
  it. The lineage ring says your post forks from ⌘Y.
- L3: Quote into a thread, the lineage map's Quote and → Notes write
  ![[id | label]] with directive_source (the opening heading, else the
  title; vm::quote_label, to unify with the picker's helper at merge).
  Reply and Link post stay bare.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(A) Each [[ / ![[ / ⌘K row leads with the post's title again, as in 0.12.
A link's row adds a muted, italic "links as “…”" line when the label it
writes isn't the title, and the excerpt line no longer repeats the label.
A quote's row has no such line: its label is a note readers never see.

(B) For a post with no heading, a pick writes the title as the label
([[id | Gardens, not streams]]) rather than the studio's quoted excerpt,
with the first line and the body run together. The quoted excerpt stays
for a title over 80 characters or a post with no text. This differs from
the studio's paletteInsert on purpose; docs/SPEC.md rule 3 says why
(blyg_core::pick::pick_label).

The fake reading data's sample ids were upper case, and some used i, l,
o or u, so the 0.47 grammar didn't read them and a demo row showed a raw
![[01K2…]]. They are now lower-case Crockford base32.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"⏎ inserts [[… | label]]" and "⏎ inserts ![[… | note]] on its own line",
since a pick has written the long form since studio 0.47. docs/SPEC.md
rules 3 and 7 (and the feature list) describe the labelled form: the label
is the link's text, a quote's note is only for you, and the reading
actions still write the bare forms. The site's Writing page says how to
rename a link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
⌥⌘Z respells to Ctrl+Alt+Z on Windows, and Windows reports AltGr as
Ctrl+Alt: on layouts where AltGr+Z types a letter (Polish programmer's ż)
typing it in a published post would open the Discard sheet, whose ⏎
throws the edits away. keymap::WINDOWS_KEYLESS drops that one key there;
Menu › Post › Discard Changes… and the toolbar button still work, and the
button's tooltip shows no key.

The keymap tests allow the exception by name (keyless_here), not with a
blanket skip, and a new test checks on every platform that the Windows
table drops only that key and keeps its menu and button. The generated
shortcut table, the site's Keys page, the Windows notes and docs/SPEC.md
say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The status bar's "public vN · unpublished edits" and the Posts row's edit
marker get a tooltip naming both ways out: "⌘⏎ publishes them as vN+1 ·
⌥⌘Z discards them" (vm::edits_tip, through keymap::hint_owned; on Windows,
where Discard has no key, "Ctrl+Enter publishes them as vN+1 · Discard
Changes in the Post menu"). The row's marker reads "Unpublished edits: …".

The toolbar's Discard button is Lucide's eraser rather than undo-2, whose
↶ read as Undo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Posts row drew unpublished edits with marker.new in the accent: in
Paper the same dot as "unread" on the reading side, in Fortress a * next
to the ☼ of a published post. It now has its own theme slot,
marker.edited, drawn in color-edited (unset: a dot in color-edited), and
Fortress sets it to glyph("Δ"). marker.new keeps unread posts,
subscriptions and mentions, so the reading side doesn't change.

The edited mark ("Unpublished edits: ⌘⏎ publishes them as vN+1 · ⌥⌘Z
discards them"), the published vN pill and ☼ ("Published: vN is public
on your blyg") and the ⌘Y pin mark ("Pinned: this version stays public,
for others to quote or fork") have tooltips. docs/THEMES.md lists the new
slot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Below blygger-studio 0.47 the floor no longer holds every push. A post
waits only when its text has a labelled link or quote, [[id | label]]
or ![[id | label]], outside code with a non-empty label (floor::
has_labels, on the studio's grammar). Its outbox ops and its publish
wait. Everything else syncs, including other posts, withdraw, pin,
restore, image uploads (unattached into a post not yet on the blyg)
and forks. The check reads the text as it is on every flush, so
removing the labels releases the post. Generated TK output counts like
any text.

The publish sheet on a held post offers enter to write the links bare
and publish (floor::strip_labels). The list pill gets a tooltip on a
waiting post. The pickers write the bare form on such a blyg
(floor::picker_label). The notice, toast and About copy now say which
posts wait.

Tests: label detection (code, empty labels, directives), a mock-engine
test of which ops wait, a UI test of the sheet, and the e2e floor case
rewritten. The full e2e suite passes at studio 0.46.1 and 0.47.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"z −2 ▼" was the selected post's row number written as a Dwarf Fortress
depth, with no tooltip; the top post read z −1 and ▼ showed on every post.
Fortress now shows your last two weeks of posts as a text-mode strip, a
day per character in block characters ▁▂▃▄▅▆▇█ (· for a day with none),
in its chrome font and accent, from the same activity data as Harbour's
tide sparkline. Its tooltip: "Your posts, last 14 days · today on the
right".

The ornament is block-sparkline (Kind::BlockSparkline); Kind::ZLevel and
StatusData.depth are gone. A user theme that still names z-level loads:
the name maps to block-sparkline, with a warning rather than an error.
docs/THEMES.md and the theme tests follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Quote into a thread writes `![[id]]` when the blyg is below studio 0.47,
as the pickers do, so the post doesn't wait (notes stay labelled: they
never reach the blyg). blyg-core's grammar re-exports blyg-render's
is_js_ws rather than keeping a copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vm::quote_label now uses blyg_core::pick::pick_label, so Quote into a
thread and → Notes label a post exactly as the [[ picker does (heading,
else title, else the quoted excerpt when the title is too long).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- What's new 0.13.0: labelled links, Discard changes, your own posts in
  Reading and Posts, the studio 0.47 requirement. Show me what's new
  starts at the new discard step.
- Tour: discard (the sample published post with an unpublished edit;
  ⌥⌘Z, or the Post menu / eraser on Windows, opens the confirm sheet) and
  own-post (the chips on your published post; ⌥⌘R or a chip makes a stub).
  The quotes step becomes "Links and quotes": it counts a typed [[ and
  teaches labels; the Reader step names Your blyg.
- Tests: the 0.12 -> 0.13 launch, and the 0.13 steps landing on the sheet,
  the chips, the picker and Your blyg.
- Site: labelled links, renaming a link and what the picker writes;
  Discard changes and the edit marks' tooltips; replying to, quoting,
  linking and forking your own posts; Your blyg in Reading; keys and FAQ.
- CHANGELOG: the 0.13 Added/Changed/Fixed lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aneeshsathe
aneeshsathe merged commit c51cde5 into main Oct 19, 2026
3 checks passed
@aneeshsathe
aneeshsathe deleted the release-0.13.0 branch October 19, 2026 02:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants