Ticket index
The prose on this site cites issue ids like improvise-9c8c. They are this project's own tracker ids, kept in-repo with beads; there is no public issue URL to link to, so this page is what they resolve to. Titles come from .beads/issues.jsonl, a passive export that lags the database — an id it does not carry is listed here without a title and is not linked from the prose.
254 ids are cited, of which 254 resolve.
| Id | Status | Title |
|---|---|---|
| improvise-08wb | closed | [bug] A refused ClientFrame::Commands keeps the commands before the refusal |
| improvise-0ai | closed | gp-tree: expose a fit/evolve entry point in the library |
| improvise-0bf | closed | Inconsistent float-equality tolerance in formula eval |
| improvise-0hb | deferred | Make Sequence bindings transactional at command level |
| improvise-0o6x | closed | A group header first on its axis is never drawn, so a leading collapsed group has no way back |
| improvise-0x9u | closed | A click cannot move the grid selection while an editor is open |
| improvise-0yq8 | closed | Move ClientState and keys.rs::step into improvise-protocol |
| improvise-1125 | closed | Row-header width is computed per frame in the widget |
| improvise-1c9 | closed | ExportPrompt mode shows no status-bar hint |
| improvise-1cz | closed | export_csv emits unquoted CSV — commas in values corrupt output |
| improvise-1ey | open | Browser frontend MVP: end-to-end working demo |
| improvise-1l9o | closed | furnished_client hand-builds a basis instead of taking the server's |
| improvise-1wl0 | closed | AxisFrame::first is serde(default), so a frame with no origin claims it leads the axis |
| improvise-21d | closed | Epic: Integrate gp-tree — fit interpretable decision trees as computed measures |
| improvise-23qd | closed | The Projection::Basis record set is derived twice, and the second copy is the tests' yardstick |
| improvise-26dm | closed | The fourth length-not-completeness list: cases.len() == 13 in ui/effect.rs |
| improvise-2avl | closed | layout_version moved outside the effect loop and neither abort arm is tested |
| improvise-2hi | closed | Extract AppMode dispatch methods (mode_label, mode_style, mode_key) |
| improvise-2lh | closed | Migrate name-string comparisons to CategoryKind enum checks |
| improvise-2oxt | closed | The landing page's casts predate the records columns and show the recorder's shell prompt |
| improvise-2wm | closed | WizardKey effect embeds the import-wizard state machine inside Effect::apply |
| improvise-2yc2 | closed | DataStore::live_records walks a HashMap -- decide its order before writing the caller |
| improvise-2zq | closed | Records mode has no inline way to add a category, unlike the + column for measures |
| improvise-349m | closed | format_md/parse_md is not idempotent when a .improv file has two Category sections with the same name |
| improvise-35e | closed | Temporary adapter: RenderCache::from_app bridge for incremental widget migration |
| improvise-368h | closed | [bug] No client on any transport can ask its host to save |
| improvise-3gy | closed | 4.2 Enable GitHub Pages |
| improvise-3vr | closed | vb4 step 1: scaffold ModelState and ViewState types |
| improvise-3x3u | closed | Resolve the two unaddressed nullary wire variants before concurrency lands |
| improvise-3zq | closed | Records-mode Enter/Tab at bottom-right: persist empty record, re-enter editing |
| improvise-44ad | closed | ColWidths is redundant under the label fold, and the test that would change is gotcha 33(c)'s evidence |
| improvise-4bwa | closed | Three bindings improvise-e24v listed as needing no enrichment do need it |
| improvise-4dpj | closed | The RecordsNormal-to-Normal arm of settle_normal_mode has zero coverage, and it is live |
| improvise-4ju | closed | Make EditOrDrill mode-agnostic; delete EnterEditMode |
| improvise-4ktt | closed | The js job's bundle-freedom is a convention, not a gate |
| improvise-4pg | closed | Extract panel mode keymap template |
| improvise-4s8 | closed | Extract a gp-tree feature matrix from a View's records |
| improvise-4yc | closed | Malformed numbers in .improv file silently become 0.0 |
| improvise-4zl7 | closed | A fitted tree must route per record and aggregate the results, not route on the aggregate |
| improvise-56ek | closed | SetPanelOpen maps a Panel to a field twice, in two crates |
| improvise-5j9 | closed | ImportPipeline silently skips records missing category values |
| improvise-5jm5 | closed | Model::evaluate_aggregated takes a list it only tests for emptiness |
| improvise-5jna | closed | The browser page does not paint the title bar it is now told about |
| improvise-5ray | closed | check-evidence ignores #### headings and every browser-test entry uses them |
| improvise-5ubs | closed | A cyclic-successor all() can silently omit a variant while its doc says it cannot |
| improvise-60z | closed | Virtual views _Records and _Drill should not be persisted to .improv files |
| improvise-61f | closed | Add invariant test for command registry name mapping |
| improvise-669b | closed | The harness spec and the page can still disagree about HANDSHAKE_TIMEOUT_MS through a stale assemble |
| improvise-6c6q | closed | [bug] apply_switch relays a refused switch to everyone but the asker |
| improvise-6kj | closed | Pest parse errors lack file:line context for users |
| improvise-6mq | closed | Introduce Storage/VFS abstraction in persistence layer |
| improvise-6nsd | open | A prune-by-write renumbers the grid without moving layout_version -- ADR 001 middle tier |
| improvise-6os | closed | O(n^2) stem deduplication in recompute_formulas |
| improvise-6sq | closed | Merge EditOrDrill and EnterEditAtCursorCmd into EnterEdit{mode} |
| improvise-6t3 | closed | Unify Commit{Formula,CategoryAdd,ItemAdd} into CommitBuffer(kind) |
| improvise-711n | closed | parse_number_format silently yields 0 decimals for the ,.2f spelling our own docs show |
| improvise-748f | closed | A drill exited with no edits, and view-back, mark the document dirty |
| improvise-75ld | closed | A refused or no-op AddCategory still bumps layout_version and raises dirty |
| improvise-764 | closed | Migrate import wizard widget and state to consume RenderCache |
| improvise-78v6 | closed | PR #61 deleted the help-overlay spec and nothing replaced it |
| improvise-7kvw | closed | SetPageSelection renumbers the grid under prune_empty and does not reset the cursor |
| improvise-7na | closed | Decide whether fitted gp-tree models are persisted alongside the formula |
| improvise-7v62 | closed | Checked does not bind the App it was checked against |
| improvise-7ybz | closed | The browser category panel has no pointer affordance at all |
| improvise-7yx | closed | Close test gaps flagged by deep review |
| improvise-864a | open | Concurrent merges to main race on one Pages environment and the superseded deploys fail |
| improvise-8ec3 | closed | improvise-io's test binary breaches the 2s per-binary rule on some machines, and the pinned figure is not reproducible |
| improvise-8fy | closed | Introduce simple_effect! macro for single-field setter effects |
| improvise-8qlr | closed | Column-group run coalescing is derived twice, and the agreement test does not pin the TUI arm |
| improvise-8shu | closed | Constrain the .improv grammar generator's strategy; improvise-io's lib binary is the run's outlier |
| improvise-8tk | closed | ZZ / :wq quits even when the save fails, silently discarding the model |
| improvise-8uj8 | closed | every_rejection_message_says_the_edit_did_not_land covers five of seven variants |
| improvise-8uz | closed | Cursor and scroll are per-client state stored in the shared View |
| improvise-8xhy | closed | [bug] A fit over a categorical feature emits an unevaluable formula |
| improvise-907 | closed | Import wizard step machine: validate early, allow going back, make the terminal step real |
| improvise-955n | closed | [bug] Host::commands applies a batch partially before rejecting |
| improvise-9c8c | closed | Move the reasoning out of code comments into context/ prose, cap comments at two lines |
| improvise-9c9o | closed | A geometry effect right after a mid-batch SwitchView skips the cursor check entirely |
| improvise-9cn | closed | Introduce register_cmd! macro to prevent name drift |
| improvise-9ix | closed | SQLite persistence format (alternative save/restore) |
| improvise-9iyv | open | The route-then-aggregate fold's cost, measured |
| improvise-9mo9 | closed | [bug] Geometry effects that renumber the grid but never reset the cursor |
| improvise-9v0j | open | view_frame and view_shape are separated by example, not by property |
| improvise-9x6 | closed | Worker-hosted server bundle (wasm, MessageChannel transport) |
| improvise-9za9 | closed | Demoting an evidence heading to prose is an unguarded escape hatch |
| improvise-a2x | closed | Derive Serialize/Deserialize for the ViewState field types |
| improvise-aaw | closed | Replace CreateAndSwitchView with Binding::Sequence |
| improvise-ac2z | open | A host's none_cats leak into another view's grid: formula columns vanish |
| improvise-ahdf | closed | repo-map gotchas 36 and 43 still name Sessions::apply as the production door |
| improvise-anr9 | closed | Project the five grid-frame facts: unblocks H, z, gz and fixes Food/Alice at once |
| improvise-azhb | open | Decide who sets a document's default view now that a switch does not |
| improvise-bck | open | Standalone web MVP: end-to-end offline demo |
| improvise-bgtf | closed | The landing page is served by the harness and asserted by nothing |
| improvise-bidq | closed | Two answers to 'is this category virtual', four lines apart in view/types.rs |
| improvise-bpq2 | closed | Client-side key resolution: what must the projections carry? |
| improvise-byz | closed | records_display returns Some("") for out-of-bounds columns instead of None |
| improvise-c5v | closed | Improve records view data entry by making each measure a normal value column (wide format instead of synthetic Value column) |
| improvise-c6j | closed | WizardStep::Done is unreachable from the UI |
| improvise-cl7y | closed | A browser reports "Formula added" for a formula only the host can parse |
| improvise-cqi | closed | Extract improvise-protocol crate (Command, ViewState, reduce_view) |
| improvise-cqq | closed | Server-side projection emission layer + per-client viewport tracking |
| improvise-cr3 | closed | DOM renderer for browser grid (reads ViewState + render cache) |
| improvise-ct5 | closed | i on an empty records grid reports 'cannot drill', leaking a pivot-mode concept |
| improvise-d44s | closed | gp_tree::data::preprocess writes to stderr from library code |
| improvise-djm | closed | Standalone main-thread bundle: wasm-client + worker transport |
| improvise-djn | closed | AddCategory effect silently swallows failures |
| improvise-djoo | closed | Publish the context/ prose as a documentation site folded into GitHub Pages |
| improvise-dkqn | closed | gp-tree::fit should take one slice of rows, not parallel x/y slices |
| improvise-dqn | closed | CyclePanelFocus does not actually cycle between panels |
| improvise-drg | closed | vb4 step 5: narrow Effect::apply signatures where one-slice |
| improvise-dz8 | closed | Add Axis::Filter for drill-fixed coordinates |
| improvise-e24v | closed | Second tranche of client-side key resolution: ~15 bindings needing no enrichment |
| improvise-e5pf | open | Command::ChangeMode(Normal) is on the wire and reduce_view folds it without the records resolution |
| improvise-e8no | open | A wide numeric category now refuses a fit that used to ignore it |
| improvise-edp | closed | Establish ViewModel layer: derived data between RenderCache and widgets |
| improvise-ehz | closed | EnterEditAtCursor effect calls rebuild_layout and builds a CmdContext inside apply |
| improvise-ete | closed | Add Model/Category getter methods to absorb .unwrap().items/groups chains |
| improvise-ew0 | closed | vb4 step 3: move UI session fields into ViewState |
| improvise-fdt6 | closed | A browser cannot add a formula, so FormulaEdit is a room that swallows typing |
| improvise-fkfg | closed | ADR-001 b: ModelCommand carries its basis; Applied gains a rejected case |
| improvise-fuj | closed | Two effects read files directly instead of going through Storage |
| improvise-g0f | closed | Decide whether two clients may view different views |
| improvise-g6s1 | closed | WizardStep::Preview has no characterization fixture |
| improvise-gcvb | closed | The browser cannot commit a records-mode creating column, though it is now nameable |
| improvise-gd28 | open | Drill over the wire needs the addressed command form |
| improvise-gd83 | closed | AxisEntry carries no group-end boundary, so group_of gives an ungrouped item the preceding group |
| improvise-gdl | closed | SetBuffer effect special-cases the "search" buffer name |
| improvise-gfq | closed | Import wizard defers the 'no category accepted' failure to the very last keystroke |
| improvise-git | closed | Replace SaveAndQuit with Binding::Sequence in keymap |
| improvise-gv9r | closed | [bug] A wire model command never marks the document dirty |
| improvise-gvnb | closed | [bug] A geometry command resets the App cursor but not the session mirrors |
| improvise-gxi | closed | Define unified reduce_full(&mut App, &Command) -> Vec<Command> |
| improvise-h04z | open | Decide whether UI glyphs move to the protocol, as short_label() did |
| improvise-h074 | in_progress | Two edges of App::resolve_view: a worse panic message, and a host-side DeleteView bypass |
| improvise-h0b | closed | Evict wizard and drill_state from ViewState (bootstrap-snapshot hygiene) |
| improvise-h0iv | closed | group_runs coalesces by name alone, so two runs under different headers merge |
| improvise-hkr8 | closed | A click that cannot compose its activation keeps the prefix and drops the payload |
| improvise-hkt6 | closed | Three small totality gaps found in review |
| improvise-hmu | closed | TAB/Enter on bottom-right of records view should insert record below (TAB→first cell, Enter→same column); o inserts below cursor |
| improvise-hmws | closed | Storage cannot expose an async seam through Box<dyn Storage> |
| improvise-hsoe | closed | check-evidence cannot see a duplicate heading, and three exist |
| improvise-hwpi | closed | The browser shell fails quietly, and never reads a key |
| improvise-i2m5 | closed | improvise-io still carries its own pipe-quoting copy, without the keyword guard |
| improvise-i34 | closed | OPFS-backed Storage implementation for wasm target |
| improvise-i5tk | closed | Narrow the TUI's GridCache to its viewport -- benchmark first |
| improvise-igxp | closed | The browser help overlay's rows are asserted as present, never as content |
| improvise-iioi | closed | The view and formula panels have no pointer affordance while the category panel does |
| improvise-ijql | closed | check-comment-runs.py --check-evidence silently skips the comment-run cap it is named for |
| improvise-iot6 | closed | render_csv builds GridLayout::new, so CSV export carries rows the view prunes |
| improvise-ir7l | closed | [bug] A formula cell is offered as editable and silently reverts |
| improvise-izk | closed | gp-tree step 1: emit a fitted Tree as an improvise formula string |
| improvise-j31x | closed | Server hosts several documents: a registry above Sessions |
| improvise-j7v6 | closed | The typed-string classification lives in two crates, and its guard test asserts by hand |
| improvise-jc8 | closed | Evict host-only state from ViewState: flip the transient-keymap Arc |
| improvise-jjx | closed | Scrolled grid suppresses first visible row-header label |
| improvise-jmjz | closed | grid_of evaluates the whole grid three times per frame; compute_col_widths is ~45% of it |
| improvise-jq8l | closed | web/app.js never calls scrollIntoView, so a selection can sit outside the window |
| improvise-jytm | closed | Split active_view: document default vs per-client authoritative (improvise-g0f) |
| improvise-k099 | closed | AppMode::hint_text/label put terminal UI strings on a serde wire enum |
| improvise-k2i4 | closed | The two nullary model commands are unaddressed and act on one client's staged state |
| improvise-k69y | closed | [bug] draw_status reads the document's active view, not the client's |
| improvise-k8h | closed | Tie MinibufferConfig.buffer_key to the keymap's buffer name |
| improvise-k8i | closed | CSV import silently drops columns when row widths mismatch |
| improvise-kc7n | closed | improvise-ws-server never checks Origin, so any page a user visits can drive their session |
| improvise-kdp | closed | Duplicated aggregation dispatch block |
| improvise-kh8 | closed | Phase 4: Landing page (optional) |
| improvise-kmgs | closed | Derive the model half of the Command vocabulary from the EffectKind::Model effects |
| improvise-kos | closed | _Dim and _Index should work as pivot axes outside Records/Drill view; must default to None axis on non-records views including empty models |
| improvise-kpnr | open | improvise-ws-server has no authentication, and the documented sharing path now exposes it |
| improvise-ksst | closed | A gp-tree fit records its seed but not its GA config |
| improvise-ktv1 | closed | Move the help content into the shared layer so a browser can show help |
| improvise-l4qx | closed | [bug] A text cell is invisible whenever any category is on the None axis |
| improvise-l8rh | closed | The ambiguous-date heuristic reads American-first, so a European CSV imports with days and months swapped |
| improvise-lae | closed | ZZ / :wq with no file path should prompt for a path instead of only erroring |
| improvise-lltt | open | [bug] A view-scoped ModelCommand names no view, so it lands on the host's |
| improvise-lyyc | closed | check-evidence is one-directional: a test citing the evidence file can have no entry |
| improvise-m91 | deferred | (Stretch) Command log + native undo/replay |
| improvise-mae | closed | Tag existing effects as model / view / projection-emitting |
| improvise-mai9 | closed | A status message written while a minibuffer is open is never drawn |
| improvise-mcq4 | open | The frame fingerprint is a 4x regression on the held-key path improvise-748f just optimized |
| improvise-mzv | closed | Import wizard does not pre-check 12-category limit |
| improvise-n10 | closed | Migrate GridWidget to consume RenderCache + ViewState (not &App) |
| improvise-n3wt | closed | prune_axis_items: keep-slice length invariant is only a debug_assert |
| improvise-n89z | closed | Three Projection mutations have no producer |
| improvise-ni6k | closed | Invalidate the cursor by observing the grid frame, not by a per-effect table |
| improvise-nrs | closed | Duplicated find_item_category helper in eval paths |
| improvise-nynk | closed | adopt_cursor_epoch resets every client's cursor, including clients on a view nothing reshaped |
| improvise-o1c | closed | Import wizard has no way back; Esc discards all field decisions silently |
| improvise-o31u | closed | The landing page's casts render at a 4.8px font on a phone, and it is now the site root |
| improvise-oaq | closed | Redundant file re-read in ImportJsonHeadless effect |
| improvise-odbc | closed | [bug] bank-info.improv in the repo root does not parse |
| improvise-ondj | closed | [bug] reduce_full/apply_command apply a Command::Model without the basis check |
| improvise-p1ym | closed | Project the page-axis item lists so [ and ] work in a browser |
| improvise-pca | closed | Migrate panel widgets (category/formula/view/tile_bar) to consume RenderCache |
| improvise-pczv | closed | .improv section headers are a second, unquoted naming rule |
| improvise-pdvm | closed | AddItem/RemoveItem reshape the grid but declare CellData, so layout_version and cursor_epoch disagree |
| improvise-plcx | closed | The browser harness needs a grouped, multi-level fixture — the demo has neither |
| improvise-poia | closed | The records-mode + column has no projected identity |
| improvise-pubt | closed | [bug] display_value_in reads the host's drill edits against a foreign layout |
| improvise-q08 | closed | improvise-ws-server binary (tokio + tungstenite session wrapper) |
| improvise-q0vb | closed | Pad the import wizard's hint line to the panel width |
| improvise-qf57 | closed | The formula-row click test lost its no-editor-opened assertion in the #61 relocation |
| improvise-qsmp | closed | App::cmd_context's panel-open propagator is untested: C cannot open a closed panel and nothing fails |
| improvise-r08u | closed | IS and WHERE differ on trailing word boundary in formula.pest |
| improvise-r4lo | closed | Two answers to what a typed string means, and they are adjacent |
| improvise-res9 | closed | Doc site: derive the published set, so an unpublished context/ doc fails the build |
| improvise-rkeq | closed | Decide RenderCache's shape: grid-only wire type vs per-widget sub-caches |
| improvise-rm4s | closed | The evidence check accepts headings naming tests that never run |
| improvise-rml | closed | Consolidate Axis display into a method on Axis |
| improvise-rmvx | closed | Six advertised keys do nothing in the browser, and the guard is scoped to one mode |
| improvise-rucf | deferred | Read arbitrary SQLite databases as a data source |
| improvise-ry89 | closed | cv_regress/cv_classify with k=1 now return plausible numbers instead of NaN |
| improvise-s13 | closed | Delete mode-entry shim commands; use enter-mode with arg |
| improvise-s17o | closed | reduce_full and apply_command's view-slice arm have no production caller |
| improvise-seik | closed | Client::viewport is kept for a reason web/app.js falsified in the same wave |
| improvise-shyt | closed | [bug] Records-mode row order is not stable across processes |
| improvise-sihr | closed | Every minibuffer mode entered from records mode exits to plain Normal while the layout is still records |
| improvise-sxsf | open | cargo test -- --list cannot name the binary, so two crates could share a full test path |
| improvise-t3ux | closed | cv_regress and cv_classify are O(n-squared) |
| improvise-t6db | closed | grid_in ignored prune_empty for a non-active view, hiding a staleness bug |
| improvise-t8s | closed | View::axis_of panics on missing category |
| improvise-taxx | closed | [bug] The socket close listener overwrites a precise error with disconnected |
| improvise-th7m | closed | Dead F(1) binding: bound to bare 'enter-mode' then immediately rebound |
| improvise-thpe | closed | help::compact discriminates a chord by parsing a string it formatted |
| improvise-tm6 | open | Epic: Standalone static-web deployment via wasm + VFS storage |
| improvise-toc | closed | Effect::changes_mode() is a static flag but ViewBack/ViewForward/StartImportWizard change the mode conditionally |
| improvise-tom1 | closed | Drill pending edits are invisible to remote clients, and there are now three answers to 'what text is in this cell' |
| improvise-trd3 | open | Help pages clamp at both ends; decide whether they should wrap |
| improvise-tvt | closed | Route mutations through Workbook facade instead of app.workbook.model chains |
| improvise-ut7p | closed | improvise-gp fit_from_gen0 is a third copy of the GA loop |
| improvise-vhcz | closed | [bug] OpfsFs::list disagrees with the other backends on path shape |
| improvise-vjms | closed | Decide whether a category panel shows the virtual categories |
| improvise-vvl3 | closed | A headless browser harness: run storage_contract and the shell assertions under Playwright |
| improvise-vx3 | closed | fit-measure command: fit a tree and add it as a formula |
| improvise-w3q | closed | Extract text-entry keymap template for minibuffer modes |
| improvise-wd6n | closed | A fit may still not split on col.missing or a date sub-feature |
| improvise-wsaw | closed | The browser ignores category_panel_open, so C toggles nothing visible |
| improvise-x1ns | closed | encoded_width undercounts a forced category that has a missing coordinate |
| improvise-x2c | closed | vb4 step 2: move workbook/file_path/dirty into ModelState |
| improvise-x7cq | closed | A kb.pl inconsistency can still reach the published site |
| improvise-x7sw | closed | Which-key hints have no protocol home (the open half of improvise-jb3) |
| improvise-xf1 | deferred | Verify OpfsFs against Safari — Chromium and Firefox are covered |
| improvise-xks6 | closed | One home for the client/server frame envelopes |
| improvise-xps8 | closed | The handshake watchdog overwrites a genuine mid-session disconnect eight seconds later |
| improvise-xwi6 | closed | Concurrent edits: basis check (ADR 001, layer 1 — the correctness floor) |
| improvise-y4xg | closed | CmdContext carries a fourth Panel-to-field mapping, and it is completely unguarded |
| improvise-ych | closed | Null category values become the literal item "null" on import |
| improvise-ywd | closed | Wasm compatibility audit and fixes across core/formula/command/io |
| improvise-z05r | closed | CommitExport does not bail on an empty path, and ExportCsv does not abort the batch |
| improvise-z5eg | closed | Gate improvise-gp in the CI wasm job |
| improvise-z754 | closed | Document name, dirty flag and file path have no home a client can read |
| improvise-zgb | closed | .improv formula loader mis-splits category suffix via rfind(" [") |
| improvise-zkkw | closed | The browser shell is only ever run on Chromium, but improvise-bck's criterion says Firefox too |
| improvise-zv8t | closed | fit_measure never tells preprocess which columns are categories, so a numeric- or date-valued category is unspellable |