Commit Graph

2012 Commits

Author SHA1 Message Date
Edward Langley 38ec60616c Merge remote-tracking branch 'gh/main' into wave/tt22-no-legacy-json
# Conflicts:
#	context/test-evidence/command.md
2026-09-23 08:18:38 -07:00
Ed Langley 705c92d9ff Merge pull request #197 from fiddlerwoaroof/collapse-fu/gw18
improvise-gw18/yk2s/lx7w/54g1: the cursor's cell has three doors
2026-09-23 08:18:10 -07:00
Edward Langley 21e239dca5 Model's Debug renders its HashMaps in key order, so the effect fingerprints cannot flake (improvise-pc3b) 2026-09-23 08:15:57 -07:00
Ed Langley 968f65afe0 Merge pull request #211 from fiddlerwoaroof/docs/28ri-oga4-diho
docs: one home for the review rules; pin gh/main; audit prose fixes (28ri, oga4, diho)
2026-09-23 08:14:35 -07:00
Ed Langley 0a4f906b1c Merge pull request #218 from fiddlerwoaroof/tooling/7epn-lnsh
tooling: pr-reviews polls past poll 2; stale harness lock names its fix (7epn, lnsh)
2026-09-23 08:14:05 -07:00
Edward Langley c6c2de96b2 Merge remote-tracking branch 'gh/main' into fix/ixxx-untouched-commit
# Conflicts:
#	context/test-evidence/clients.md
#	context/test-evidence/command.md
2026-09-23 08:13:40 -07:00
Ed Langley cb60166a84 Merge pull request #225 from fiddlerwoaroof/fix/rtud-command-md
command.md: say where each refuse_and_stop refusal is held (improvise-rtud)
2026-09-23 08:13:37 -07:00
Edward Langley f85fddbb2f harness/opfs-contract: refresh Cargo.lock for the dropped serde features (improvise-tt22) 2026-09-23 08:13:25 -07:00
Ed Langley c7e48546c3 Merge pull request #220 from fiddlerwoaroof/fix/17ak-help-footer
The TUI help footer's keys come off the keymap (17ak)
2026-09-23 08:13:10 -07:00
Edward Langley 993418f143 improvise-d7aj: pin the fold memo to the whole key, and the diamond
A formula met at two fold keys in one evaluation (an IF branch naming an
item of another category) must be evaluated at each. A memo keyed by the
formula alone read circular there and passed the whole suite; this test
fails under it and nothing else does. The diamond A1 = B2 + C3 over D is
pinned too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:12:48 -07:00
Edward Langley 6026768ceb rustfmt the sjdb tests
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:10:36 -07:00
Edward Langley 2383c37f2f Merge remote-tracking branch 'gh/main' into fix/oplp-tile-cursor
# Conflicts:
#	context/test-evidence/clients.md
2026-09-23 08:10:09 -07:00
Edward Langley 27cbe2c1dd Tile select opens on the first regular category, not _Index
improvise-oplp: EnterTileSelect and the browser's resolver both opened the
tile cursor at 0, which is _Index, so `T Enter` or `T r` put _Index alone
on Row and emptied a pivot grid; the browser worker then persisted it.

The rule is improvise_protocol::opening_tile, over &[TileEntry], called by
both ends. TileEntry gains `regular`, filled host-side from CategoryKind in
project::tiles_of, because a thin client cannot tell _Index from a user
category without sniffing names. _Index/_Dim stay tileable (#192).

A lockstep case presses `T Enter` on both ends and pins which category
moved; it was red at base (_Index on Row), and fails for a TUI-only revert
and for a `regular` filled true everywhere. contract.spec.js counted three
ArrowRights from tile 0 and now asserts `T` alone selects Product.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:08:54 -07:00
Edward Langley c312431154 improvise-sjdb: judge an unstored record at its own cell, not its first column
RecordHash drops _Measure, so every column of a row carries the same record,
and with a collapsed _Measure group the first is the fold. aggregate_refusal
now finds the position by the whole key the write names. Rival for the
stored-record test: stored records through cell_id fails it alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:08:45 -07:00
Edward Langley 6e021699d4 improvise-sjdb: red — an empty cell beside a collapsed measure group
The host projects Feb x Units as a Record, and #217 refuses the write:
aggregate_refusal judges the record at its first column, the Money fold.
Also pins that a stored record stays writable whatever the host view does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:07:38 -07:00
Edward Langley a1d27cc1cf Merge commit '33cf49692781f1bd0f4b7654bce6ac9f7a30cc4f' into fix/we1a-rtud-refusal-tests 2026-09-23 08:06:53 -07:00
Edward Langley eb061391fe Pin that every aborting model effect also refuses (improvise-we1a)
Host::mutating_frame rejects on refused || aborted, and deleting the
aborted arm left the workspace green. The wire table cannot see an
abort-without-refuse because that arm is what rejects it, so the new
table applies each failing ModelCommand's effects to a bare App and
asserts it refused, pinning which cases abort so it is not vacuous.
The arm is kept as defence: AbortChain shows an abort need not be an
error, so making abort-without-refuse unconstructible is declined.

Also keeps rtud's three key-path table rows (load, import-json of an
absent JSON, a formula that does not parse) as added coverage; rtud's
prose fix lands separately.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:06:45 -07:00
Edward Langley 93c455db19 Merge commit '33cf49692781f1bd0f4b7654bce6ac9f7a30cc4f' into fix/wdmp-asker-cursor 2026-09-23 08:05:47 -07:00
Edward Langley ab1c981829 improvise-wdmp: drop an unused mut clippy flagged
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:05:15 -07:00
Edward Langley a1a9be33f0 Merge gh/main (33cf4969) into collapse-fu/gw18
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:03:56 -07:00
Edward Langley f3fb83ee45 improvise-kb1d: document the refusal; v4hg has closed the add/edit asymmetry
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:02:14 -07:00
Edward Langley 77a3825576 improvise-wdmp: the asker's own placement survives the reset its reframe earned
A browser frame that reframes and then places the cursor was folded whole by
the client before the relayed ResetCursor arrived, so the reset undid the
placement while the mirror (reset, then placed, in frame order) kept it.
Host::mutating_frame now relays to the asker every later cursor-placing
command of the frame after its reset, so the client ends where its mirror
and the TUI do. Excluding the asker from the reset was rejected: a frame
that places nothing would reset the mirror silently (gotcha 24).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:01:41 -07:00
Edward Langley 1f541e0fb2 core.md §14: a stored total is fold-invariant only under Sum/Count
Under Avg/Min/Max the strip sums each row's aggregate, so a Max
measure's total moves on z for the same reason a formula column's does
(improvise-wm20). Docs only, from the #203 review.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:01:15 -07:00
Edward Langley 5bcea582f2 Merge gh/main (33cf4969) into collapse-fu/eccl
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:00:49 -07:00
Edward Langley 168a28d2c5 tooling: the dead-ID audit compares positively and is a checked script
improvise-52eq: the AGENTS.md recipe searched `bd show` output for "not
found" and printed "all resolve" when there was none, so a bd that was
missing, failing or never run passed the audit. scripts/bd-audit-ids
keeps the file scan and exclusions, then `comm -23`s the cited ids
against `bd list --all --limit 0 --json`. A dead id is exit 1 and is
named. A bd that does not answer is exit 3, never a pass.

scripts/bd-audit-ids-test.sh has eight cases on a throwaway repo with a
fake bd. The old recipe as a rival fails 7 of the 8. Disabling the
comparison fails the dead-id case, and an empty exclusion list fails the
pass case. CI runs it with the other named suites. The "One environment
note" now reports which forms the guard refused and allowed, as observed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 08:00:05 -07:00
Edward Langley 7da905cdbb command.md: say where each refuse_and_stop refusal is held (improvise-rtud)
#213 merged before this correction was pushed; the push re-created a
branch main never saw. This lands the final wording on gh/main.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:59:08 -07:00
Ed Langley 33cf496927 Merge pull request #215 from fiddlerwoaroof/fix/5xbq-1c5m
One page rule for both ends; the help overlay shows how to page (5xbq, 1c5m)
2026-09-23 07:58:59 -07:00
Edward Langley 82bbc74c13 Merge remote-tracking branch 'gh/main' into wave/km71-edit-formula 2026-09-23 07:57:04 -07:00
Edward Langley 531cf4954c improvise-kb1d: refuse renaming a formula outside _Measure
A regular category's formula target is a real item, and replace_formula added
the new target without removing the old, stranding it as an empty item and
appending the new one. Until formulas have a stable identity (improvise-sboz),
a target change outside _Measure is refused and the editor stays open.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:57:04 -07:00
Edward Langley 8ee5fade27 fy9o: corner lockstep guard, evidence and protocol.md; file improvise-jmti
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:57:01 -07:00
Edward Langley ae281a58a8 Merge gh/main (bf2de499) into collapse-fu/gw18
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:56:53 -07:00
Ed Langley bf2de4995b Merge pull request #208 from fiddlerwoaroof/fix/b9f2-width-guard
Determinism law: the width guard measures the drills it compared (improvise-b9f2)
2026-09-23 07:56:04 -07:00
Ed Langley 345a35895e Merge pull request #213 from fiddlerwoaroof/wave/refuse-fu
Pin every refusal site, and keep a bad formula in its editor (improvise-v4hg, 514o, 0v8l)
2026-09-23 07:55:36 -07:00
Ed Langley cd55944e98 Merge pull request #216 from fiddlerwoaroof/fix/y5eo-records-startup
improvise-y5eo: a document opening on a records view opens the host in RecordsNormal (after #207)
2026-09-23 07:55:09 -07:00
Edward Langley e62a289cc3 Merge remote-tracking branch 'gh/main' into wave/tt22-no-legacy-json 2026-09-23 07:53:45 -07:00
Edward Langley 56f8d37e95 fmt: leading blank line left by the removed serde import 2026-09-23 07:53:20 -07:00
Edward Langley ca19b7686d A reopened cell editor shows the cell it landed on (improvise-fy9o)
The cell-editing commits own their buffer clear at their head instead of
the keymap welding one after them, so the re-seed survives and Enter,
Enter writes nothing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:53:18 -07:00
Edward Langley 41aa4073f1 docs: -d skip reason measured; the ADR exception at both merge rules
improvise-28ri, from the #211 review at 6ccad4b: the recipe's grep has no
-r, so the skills' symlinks arrive as directory operands and are never
read. -d skip only silences "Is a directory", and sort -u would absorb a
duplicate anyway. Measured with BSD grep 2.6.0 and GNU grep 3.12: 3092
matches either way, 462 distinct ids. GNU grep -r follows those
symlinks (3107), so -r must not be added.

improvise-oga4: "Shipping a wave"'s opening and "Repository policy over
the Beads blocks" now point at the ADR exception. The wave SKILL.md
pointer is unwrapped, so a grep for "ADR pull requests" finds it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:53:01 -07:00
Edward Langley 5e37973fc0 The TUI help footer's keys come off the keymap
improvise-17ak: render_footer hand-wrote l/Tab, h/S-Tab and q/Esc, a key
table no check could read, and already short of the keymap (n, → and ? were
bound and not advertised). It now draws the page indicator followed by
hint_line(Help), truncated in cells.

Derived rather than deleted: the status row carries the same hint, but
draw_status prints status_msg instead of it whenever a message is standing,
and nothing clears the message on entering Help, so deleting the footer's
keys would leave a user who saved and then pressed ? with none.

The guard renders the popup at 140 columns on every page and requires the
footer row to contain hint_line(Help). Red at base; and a literal copy of
today's string fails it as soon as the keymap drops a binding.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:51:50 -07:00
Edward Langley ec548862ac Cargo.lock: improvise-formula no longer depends on serde 2026-09-23 07:50:30 -07:00
Edward Langley 7fb6960cf8 WIP: drop the serde derives only the legacy loader used; docs (improvise-tt22) 2026-09-23 07:50:26 -07:00
Edward Langley ebf3dd2ba2 tooling: pr-reviews polls past the second poll; stale harness lock names its fix
improvise-7epn: two cases on the one-tick-per-read clock. One resolves on
poll 3, and one times out after polling up to the deadline. Replacing the
post-poll deadline check with `break` now fails exactly those two
(23 passed, 2 failed), where before it left the suite 23/23.

improvise-lnsh: when `cargo metadata --locked` refuses the opfs-contract
lock, build.sh now says not to remove --locked and names
`cargo update -w --manifest-path harness/opfs-contract/Cargo.toml`.
Checked by hand against a lock with pest pinned to 2.9.1. Evidence is in
context/test-evidence/tooling.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:49:40 -07:00
Edward Langley 5690903d60 improvise-vndi: an inline edit opened before a document swap is refused
EditTarget captures document_generation when the editor opens, and
BasisCache::claim_as_read claims it rather than the current one. The
layout tier stays current, as clients.md argues for 2wu3. A red test
through a real Host over MemoryFs: A opens North/Revenue, B loads a
same-shaped document holding 5555, A commits "42" -> DocumentReplaced,
5555 survives.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:48:15 -07:00
Ed Langley 12c81dd3d6 Merge pull request #207 from fiddlerwoaroof/fix/v8ab-fresh-slice
improvise-v8ab: a fresh session's slice is the host's startup slice (after #206)
2026-09-23 07:44:07 -07:00
Edward Langley f176c2b8ca WIP: a legacy JSON workbook is refused by name (improvise-tt22) 2026-09-23 07:43:13 -07:00
Edward Langley bc060f6760 Merge remote-tracking branch 'gh/main' into collapse-fu/ciw8 2026-09-23 07:41:45 -07:00
Edward Langley 46e75c415f improvise-ciw8: pin the unresolved-write answer; document the rule and why vec![] stays
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:41:43 -07:00
Edward Langley a8737f3fa5 One page rule for both ends; the help overlay shows how to page
improvise-5xbq: resolve::page_rows is now the one home of the page-scroll
rule; the TUI's Move calls it instead of repeating visible_rows * 3 / 4.
A lockstep case pages (PgDn/PgUp, Ctrl-d/Ctrl-u) on a non-square window,
8 rows by 3 columns, and pins the TUI's landing rows as well as comparing
host and client, since one home moves both ends together. Both faults
the ticket injected (page_rows = window_rows / 2; paging by window_cols)
now fail at the first PgDn, before and after the move to one home.

improvise-1c5m: the help overlay draws the mode's own hint (hint_line,
the string #hint carries) in a sticky footer, so a narrow window whose
app bar wraps under #help still says how to page. Playwright case at
600px, red at base, and red again with the footer made non-sticky.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:41:03 -07:00
Edward Langley 08b87edd49 improvise-y5eo: a document opening on a records view opens the host in RecordsNormal
App::with_storage now ends with settle_normal_mode, the rule every batch
ends with, so the host's startup mode matches the one Sessions::connect
hands a client. #207's startup-slice test gains a records-opening case.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:40:45 -07:00
Edward Langley 6ccad4b80d docs: only the user's explicit approval accepts or merges an ADR
The user's ruling: "An ADR isn't approved until I say it is." CI, the
reviews and the adversarial review stay required as gates, but none of
them is approval. SKILL.md's "not on a review" pointer is reworded to
match.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
2026-09-23 07:40:13 -07:00