Name the EchoLedger in 02 — settle write provenance for attribution and announcements
06 and 10 consumed a per-file app-vs-foreign classifier that 02's component inventory never named and whose layering prose seemed to deny. Settled: a new EchoLedger component records each BoardWriter operation's expected outcome (content hash / absence / move pair); final-content matching classifies each observed file, deciding both races (byte-identical foreign write → app-mediated, accepted; same-window foreign overwrite → foreign, last writer wins). Ledger is in-memory and per-store; launch catch-up is all-foreign; bracketed operations bypass it. "Trusts its own writes no more than anyone else's" is scoped to rendering; BoardWriter's no-hidden-state bullet stands. Claude-Session: https://claude.ai/code/session_01HJ7PhFNmQ19bvy9RMD6GSb
This commit is contained in:
@@ -27,7 +27,7 @@ The stance is committed in 00-vision.md: **accessibility is a requirement of "na
|
||||
|
||||
## Live board announcements
|
||||
|
||||
- **Foreign changes announce, app-mediated echoes never do.** The auto-committer already classifies every observed change as app-mediated or foreign and synthesizes diff summaries for commit messages (06-history-undo.md); announcements reuse that summarizer — one polite (non-interrupting) digest per reload debounce ("Board changed: 2 cards edited, 1 card added"), never per-file chatter. On no-git boards the same classifier runs without the committer — announcements don't depend on git mode.
|
||||
- **Foreign changes announce, app-mediated echoes never do.** The auto-committer already classifies every observed change as app-mediated or foreign (the EchoLedger — 02-architecture.md ▸ Components) and synthesizes diff summaries for commit messages (06-history-undo.md); announcements reuse that summarizer — one polite (non-interrupting) digest per reload debounce ("Board changed: 2 cards edited, 1 card added"), never per-file chatter. On no-git boards the same classifier runs without the committer — announcements don't depend on git mode.
|
||||
- **A vanishing focus is called out specifically.** If the selected or VO-focused card disappears in a reload (deleted externally, or hidden by a lane tombstone), the announcement names it ("Card 'Fix login' was deleted externally") and focus recovers to the card's lane (mirroring selection's reload-survival rules, 02-architecture.md).
|
||||
- **Bracketed operations announce once, at completion** ("Pulled 3 commits", "Switched to branch 'redesign'") — never their internal churn (02-architecture.md's bracketing). The live-reload-resilience banner (02-architecture.md) is an accessibility element and is announced when it appears and when it clears — including the read-only lock after a failed bracketed reload.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user