@ai-matrx/records-ui 0.85.11 → 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,12 +1,133 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
- ## 0.85.11
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)
4
79
 
5
80
  Automatic changed-only republish (docs/metadata drift since the last tag — see
6
- `git diff npm/records-ui/v0.85.10..npm/records-ui/v0.85.11 -- apps/shared/records-ui`).
81
+ `git diff npm/records-ui/v0.85.13..npm/records-ui/v0.85.14 -- apps/shared/records-ui`).
7
82
  No source changes intended and no consumer action required.
8
83
 
9
- ## Unreleased — lane ORDER-FILTER (2026-09-25)
84
+ ## 0.85.13 (2026-09-25 — published by PUBLISH-SWEEP-6)
85
+
86
+ **Needs `@ai-matrx/records` 0.58.11.** 0.85.12 was tagged but never reached npm: its packed-consumer
87
+ canary could not import `wholeValueOf` because records 0.58.10 never published. Everything under
88
+ 0.85.12 below ships here.
89
+
90
+ ## 0.85.12 (2026-09-25 — tagged by PUBLISH-SWEEP-5; never published, see 0.85.13)
91
+
92
+ **Needs `@ai-matrx/records` 0.58.10** (the decision hold). Carries UI-FIX-19's dashboard read-back and
93
+ store-sentence-first refusals (`0989c57e69`) and S5-PRIME-2's Undo hold (`3e2c93da3c`). ORDER-FILTER
94
+ shipped in 0.85.11 (below).
95
+
96
+ ### Lane MOVER-BIG-VALUES (2026-09-25)
97
+
98
+ * **A value kept as a file shows its words and opens the file** (`WholeValue.tsx`): every read
99
+ layout draws the first words, the whole text's size and "Open the whole text" through the new
100
+ host port `hrefForFile`; unbound, it says the rest is in a file (never a dead link). The export
101
+ writes the file's whole content through the new host port `readFileText`.
102
+
103
+ ### Lane S5-PRIME-2, VERIFIER-20 (2026-09-25)
104
+
105
+ * **A decision is held for Undo before it is made** (Gmail's undo send). Approve or decline — by
106
+ key, click or a selection — and the row says "Approved · made in 5s · Undo" for the row's
107
+ `undo_seconds`, then the decision is made through the one door. Undo (or `z`) inside the window
108
+ calls nothing: the item is waiting again exactly as it was, with no history. A row the store
109
+ gives 0 (a run already waits on the answer) is made at once and says so. A hold still open when
110
+ the page goes away or the inbox unmounts is made then, never dropped. Suite
111
+ `inbox-decision-undo.test.tsx`: RED 5/5 on the prior bytes, GREEN 5/5. Needs `@ai-matrx/records`
112
+ with `undo_seconds`.
113
+ * **The inbox's clear is named Clear, and its view Cleared** (was Done / Done). A checklist step
114
+ row already has a Done — it FINISHES the step — so two buttons named Done on one row meant two
115
+ different things (found walking the live inbox as admin@admin.com). `e` still clears.
116
+
117
+ ### Lane UI-FIX-19 (2026-09-25, VERIFIER-20)
118
+
119
+ * **A new dashboard says nothing the store did not lose** (VERIFIER-20 a). The read-back treats an
120
+ empty default the store fills in (`group_by: []`, `filter: {}`) as the same "nothing" that was
121
+ sent, beside the earlier rule that keys the store adds to a setting are not a loss. Suite: a
122
+ fresh dashboard created and read back as production stores it — RED 2 on the prior bytes, GREEN.
123
+ * **A refusal is headed by the store's own sentence, and no SQLSTATE or codename reaches a person**
124
+ (VERIFIER-20 b). `PlainRefusal.storeSaid`; `RefusalNotice` heads with the store's sentence (the
125
+ generic title only when nothing of its words survived) and says it once. Engineer text (SQLSTATE,
126
+ an engineer's hint) is on `data-for-engineers` only: no longer the notice's tooltip or a hidden
127
+ line, and `RefusalLine` likewise. `WhereItLives` passes a refused move's hint through
128
+ `hintForAPerson`. Suite `a-refusal-heads-with-the-store-s-own-sentence.test.tsx`: RED 2/2 -> GREEN.
129
+ **Consumer action:** a host that read the notice's `title` for debugging reads
130
+ `data-for-engineers`.
10
131
 
11
132
  **Needs the next `@ai-matrx/records`** (`readInViewOrder({ filter })`).
12
133
 
@@ -19,6 +140,14 @@ No source changes intended and no consumer action required.
19
140
  filtered hand order is the door's page two. The client-side `inHandOrder` helper is gone.
20
141
  Tests: `a-hand-set-order-is-the-grids-sort.test.tsx` RED 3/16 on the prior bytes, GREEN 16/16.
21
142
 
143
+ ## 0.85.11
144
+
145
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
146
+ `git diff npm/records-ui/v0.85.10..npm/records-ui/v0.85.11 -- apps/shared/records-ui`).
147
+ No source changes intended and no consumer action required.
148
+
149
+ ### Lane ORDER-FILTER (2026-09-25)
150
+
22
151
  ## 0.85.10 (2026-09-25 — published by PUBLISH-SWEEP-5)
23
152
 
24
153
  **Needs `@ai-matrx/records` 0.58.8** (`TableHomeDestination.slug`). Carries UI-FIX-19's move-destination