@ai-matrx/records-ui 0.85.13 → 0.85.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,86 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
+ ## 0.85.15 (2026-09-25 — published by PUBLISH-SWEEP-7)
4
+
5
+ The tagged 0.85.14 never reached npm: its deterministic gate failed on `NeverRecorded … custom.field_declare` (fixture recorded against records 0.58.11). The fixture is re-recorded (below); everything 0.85.14 carried ships here. Needs `@ai-matrx/records` >= 0.58.13 (`viewDesignate` / `custom.view_designate`).
6
+
7
+ ### A held decision survives a reload (GATES-TAIL, VERIFIER-21 #3r, 2026-09-25)
8
+
9
+ * **`ActionInbox` keeps every open Undo hold in the browser until the decide door answers for it**
10
+ (`localStorage` `records-ui:held-decisions`, one entry per approval). A reload during the
11
+ five-second hold used to kill the made-on-pagehide request with the page, and the reloaded inbox
12
+ showed the approval pending with no word, though the screen had said "Declined". Now the
13
+ reloaded inbox shows it still held ("Declined · Undo") for the rest of its window, then makes it;
14
+ past its window it is made at once and says so. Undo forgets it; an approval the store no longer
15
+ lists as waiting on this person is forgotten. The store keeps no pending-decision state, so this is
16
+ a browser-side promise; the store still decides who may decide. Suite RED 2/2 → GREEN 7/7.
17
+
18
+ ### Gate recording is re-runnable and leaves nothing behind (2026-09-25)
19
+
20
+ * **The deterministic suite is re-recorded against `@ai-matrx/records` 0.58.12** (demo only; no
21
+ shipped code changed). The publish of 0.85.14 failed on `NeverRecorded … custom.field_declare`
22
+ because 0.58.12 sends a column's word as `type`; `demo/fixtures/doors.json` is re-recorded.
23
+ * **Why re-recording kept failing.** Not a name collision — every recording already names its tables
24
+ with a per-run stamp saved in the fixture. The first-time walk asserted a freshly declared table
25
+ had NO columns, which the store stopped producing on 2026-09-21 (a declared name is a Field) and
26
+ cannot produce at all now (`custom.field_retire` refuses a table's title column, REC-2). The walk
27
+ now asserts what the store makes, as `live-smoke` already did: the declared column, drawn, and no
28
+ "no columns yet" sentence over it.
29
+ * **A failed recording never overwrites the fixture, and every run archives what it made.** The
30
+ recording seam keeps a ledger of every record a creating door returned; `afterAll` soft-deletes
31
+ exactly those, newest first, whatever happened (`recorded-doors.ts`, `deterministic.test.tsx`).
32
+ * **`live-smoke` takes back its package table's Home** (read from the Table's `parent_id`). Every gate
33
+ run used to leave one "<name> views Home" in the test organization; 144 stray walk records in
34
+ Test's Org (test@test.com) were archived through `custom.record_delete`.
35
+
36
+ ### Lane VIEW-SWITCH-NOT-DESIGNATION (2026-09-25)
37
+
38
+ * **A look at a table never changes how it opens** (`TablePage.tsx`, `views.ts`; VERIFIER-21).
39
+ Pressing Kanban or Calendar saved `layout` onto the table's DEFAULT view, so the next person to
40
+ open the table landed in the last look anybody took. A press on the default view now carries
41
+ every other key it changed (a board's grouping, a calendar's date, a colour) and never `layout` or
42
+ `isDefault` (`viewPatchFor`); the store refuses them through `view_declare` by name. The one way to
43
+ change how a table opens is the menu's **"Make <layout> the default"** — offered only to someone
44
+ who may edit the table and only when what is showing is not already how it opens — sent through
45
+ `designateView` → `custom.view_designate` (editor). New exports: `viewPatchFor`,
46
+ `openingLayoutOf`, `makeDefaultLabel`, `designateView`. Test:
47
+ `a-look-at-a-table-never-changes-how-it-opens.test.tsx` (RED on the prior `TablePage`: two layout
48
+ writes onto the default view and no designate control; GREEN 6/6).
49
+ * **A date stays a date on a board card** (`CardDates.tsx`, `ViewSwitcher.tsx`, `Pipeline.tsx`;
50
+ VERIFIER-21 item 5). Kanban and pipeline cards carry the table's date columns under the title,
51
+ drawn by the one value renderer (`RecordValue`), so "Mar 1, 2026" reads the same on the card as
52
+ in the Sheet, the Grid, the record panel and the Calendar; a blank date draws nothing and a
53
+ withheld one says so. Test: `a-board-card-shows-its-date.test.tsx` (RED: the card read only
54
+ "INV-20417"; GREEN, also under `TZ=America/Los_Angeles`).
55
+
56
+ ### Lane BIG-VALUES-READERS (2026-09-25)
57
+
58
+ * **A row read through the matching door opens its whole text** (`values.tsx`): every store read
59
+ door (`custom.read_records_matching` — the grid's — `read_record`, `read_records`,
60
+ `read_records_by_ids`, `read_records_archived`) now carries a value-kept-as-a-file's pointer
61
+ (`_values.<key>.src` -> `_sources.<ptr>`, file fields only), so `wholeValueOf` finds it and the
62
+ grid cell shows "Open the whole text" on every read path. `ProvenanceBadge` now draws nothing for
63
+ such a pointer (the cell already says the text is in a file) instead of the pointer's raw fields.
64
+ Test `a-row-read-through-the-matching-door-opens-its-whole-text.test.tsx` (RED 1/3 -> GREEN 3/3).
65
+ Consumer action: none.
66
+
67
+ ### Lane RC-B2b (2026-09-25)
68
+
69
+ * **Authored form text reads the way it was written** (`host.tsx`, `FormRunner.tsx`): new optional
70
+ host port `RecordsUiHost.renderText(text, where)` with `RenderTextSlot`
71
+ (`"form-intro" | "form-help" | "form-thank-you"`). A form's intro, a question's help and the
72
+ thank-you body go through it, so the host's one markdown renderer draws `**bold**`, math and
73
+ links; unbound, the text shows exactly as written. Suite
74
+ `authored-form-text-reads-through-the-host.test.tsx`: RED with the port ignored, GREEN 2/2.
75
+ **Consumer action:** matrx-frontend wraps `/f/[formId]`'s `FormRunner` in
76
+ `RecordsUiProvider value={{ renderText }}` returning `RichContentInline` (phrasing, valid in `<p>`).
77
+
78
+ ## 0.85.14 (tagged by the auto release; never published, see 0.85.15)
79
+
80
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
81
+ `git diff npm/records-ui/v0.85.13..npm/records-ui/v0.85.14 -- apps/shared/records-ui`).
82
+ No source changes intended and no consumer action required.
83
+
3
84
  ## 0.85.13 (2026-09-25 — published by PUBLISH-SWEEP-6)
4
85
 
5
86
  **Needs `@ai-matrx/records` 0.58.11.** 0.85.12 was tagged but never reached npm: its packed-consumer