@ai-matrx/records-ui 0.85.4 → 0.85.7

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,6 +1,141 @@
1
1
  # Changelog — @ai-matrx/records-ui
2
2
 
3
- ## Unreleased — lane DATA-V2-FACE (2026-09-24)
3
+ ## 0.85.7 (2026-09-24 — published by PUBLISH-SWEEP-5)
4
+
5
+ **Needs `@ai-matrx/records` 0.58.6** (the inbox doors: `inboxSnooze`, `inboxClear`, `inboxCounts`,
6
+ `workInbox({view})`). Also carries GRID-TAILS' agent-button target with the table's name, fields,
7
+ document and level (`676aa103ca`, reached main through an integrator sweep) and VIEW-KEYS-SHEET's
8
+ `designatedLayoutOf` (`4a049f0c97`).
9
+
10
+ ### Lane S5-PRIME-2 (2026-09-24)
11
+
12
+ * **`ActionInbox` snoozes and clears at Superhuman's bar.** `s` opens the snooze choices on the row
13
+ (Later today, Tomorrow 8 AM, Next Monday 8 AM — `1`/`2`/`3` — or a picked date and time) and it
14
+ comes back to the top of the inbox then; `e` clears a piece of work you have seen (it comes back
15
+ if somebody else changes it); `z` or the Undo in the status line takes either back. **A decision
16
+ still owed has no Done control** — deciding is what takes it away. Three views, `v` cycles them —
17
+ Inbox, Snoozed (each says when it comes back; `u` or Unsnooze), Done (`u` or Put back) — each
18
+ counted by the store's `inboxCounts`, the same number the shell badge shows. Empty Snoozed and
19
+ Done views say what they are for. Only this person's inbox changes: nothing is written on the
20
+ approval or the record.
21
+ * **A checklist step is drawn once.** The inbox's "Your checklist steps" group shows only the steps
22
+ the inbox door still lists as waiting (so a snoozed or cleared step leaves it too), and those steps
23
+ are no longer drawn a second time as assignment rows above; each carries Snooze and Done.
24
+ `MyChecklistSteps` gains `onlyIds`, `onSteps` and `actions`.
25
+ * Exports `snoozeChoices`, `SnoozeChoice`, `INBOX_VIEWS`. Suite `inbox-snooze-and-done.test.tsx`:
26
+ RED 6/6 on the prior bytes, GREEN 6/6. Needs `@ai-matrx/records` with the S5-PRIME-2 inbox doors.
27
+
28
+ ### Lane S5-PRIME (2026-09-24)
29
+
30
+ * **`ActionInbox` reaches Linear's and Superhuman's table stakes.** Grouped by kind (default:
31
+ Approvals, Agent proposals, Assigned to you) or by table, each heading counted; a `Group by`
32
+ control and `g` cycle kind → table → none; `j/k`, `x`, `a/d` walk the rows in the order they are
33
+ drawn. `h` / "Show decided" brings closed items in, and **a closed item says who decided it and
34
+ when** ("Approved by … · <time>", or "Withdrawn when … archived it") with the store's sentence and no
35
+ controls. **An empty inbox says why** (what arrives here; nothing ever decided; or, narrowed to a
36
+ table, how many wait in other tables with "Show all"). `tableId` now actually narrows (it kept every
37
+ row). Exports `groupInbox`, `InboxGrouping`, `INBOX_GROUPINGS`; `enumLabels` adds
38
+ `WORK_INBOX_KIND_GROUP_LABEL`, `WORK_APPROVAL_STATES`, `WORK_APPROVAL_STATE_LABEL`. Suite
39
+ `inbox-groups-and-closed-items.test.tsx`: RED 6/6 on the prior bytes, GREEN 6/6. Needs
40
+ `@ai-matrx/records` with the S5-PRIME `WorkInboxItem` fields.
41
+
42
+ ### Lane VIEW-KEYS-SHEET (2026-09-24)
43
+
44
+ * **The Sheet is designated one way: `layout: "sheet"`.** `designatedLayoutOf` no longer reads the
45
+ mover's mark (`moved_from.kind = "default_view"` with no layout) as the Sheet; `moved_from` is
46
+ provenance only. The store's view-keys registry declares `sheet` as a layout, the mover writes it,
47
+ and a production repair wrote it on every copied table's default view (none left on the mark
48
+ alone — measured on production before this change). Suites: `a-table-opens-the-way-it-was-designated.test.tsx`
49
+ (the mark alone designates nothing: RED on the prior bytes, GREEN), `the-designated-default-wins-over-a-seed.test.tsx`.
50
+
51
+ ### Lane UI-FIX-18 (2026-09-24)
52
+
53
+ * **A card is titled by what names its record** (VERIFIER-18 H5). New `cardTitleField(fields, titleKey,
54
+ exclude)` in `names.ts`: the Table's `title_field` → a conventional name key → the first text column
55
+ in declared order → any other column that can title; never a checkbox, the group/stage column or a
56
+ system stamp. The kanban, the calendar and the pipeline all read it (the kanban used to take the
57
+ first non-group column, so a board grouped by Stage read "false"/"true"). The table's title column
58
+ is handed down by the host that already read the table — new `ViewSwitcher` prop `titleField`
59
+ (TablePage passes it) and `PipelineBoard` prop `titleKey`; neither reads the table a second time.
60
+ Suite `a-card-is-titled-by-what-names-its-record.test.tsx` (RED 1/7 on the prior bytes, GREEN 7/7).
61
+ * **A date is a date — the control and the text follow the stored value, never `config.kind` alone**
62
+ (correction to the 0.85.6 date line). `carriesTimeOfDay(field, value)` / `dateFormatFor(field, value)`
63
+ read the value's shape: a value with no time part (a date of birth on a `kind: "datetime"` Field) gets
64
+ a date-only control and a date-only reading in the grid, the form, the panel and the calendar; with no
65
+ value, only `format: "datetime"` or the store's own Created / Last changed stamps carry a time. The
66
+ one-day-early fix stays: a bare date is read as a local calendar day. The recorded public form's
67
+ "date of birth" asks for a date again (`demo/form-runner.test.tsx` GREEN on the unchanged fixture);
68
+ the date suite gains the birthday clauses (GREEN 15/15).
69
+ * **A dashboard save is confirmed, and what the store did not keep is said** (VERIFIER-18 M2). Every
70
+ `declare()` on the canvas (shape, grouping, comparison, target, remove) reads the dashboard back and
71
+ `whatTheStoreDidNotKeep(sent, stored)` names any setting the store answered differently, on its block
72
+ ("The store did not keep its comparison for “Jobs by status”…"), in a status line; the controls show
73
+ what the store really holds. Suite `a-dashboard-save-says-what-the-store-did-not-keep.test.tsx`
74
+ (RED 4/4 on the prior bytes, GREEN 4/4); S3 and canvas suites still green.
75
+ * **A withheld value says why, in every layout** (VERIFIER-18 H1, the screen half). New `withheld.tsx`
76
+ is the one helper: `withheldNoticeOf(hidden, key)`, `withheldSentence(field, notice)` (the store's
77
+ own `says` — "Budget with contingency is worked out from Budget, which you have not been given." —
78
+ or its reason, the level it needs and the other way in), `WithheldValue` and `WITHHELD_WORD`.
79
+ `RecordValue` takes `withheld` and draws "Withheld" with the sentence on hover and for screen
80
+ readers, never "—"; the grid cell, the editing cell, the gallery, the record panel and the public
81
+ page hand it `row.hidden[key]`; every card (kanban, calendar, pipeline, unplaced list) reads one
82
+ `cardWords(record, field, labels)`; the export writes "Withheld: <sentence>". A source guard refuses a
83
+ `<RecordValue` that draws a row's value without its notice. Suite
84
+ `a-withheld-value-says-why-in-every-layout.test.tsx` (RED 5/6 on the prior bytes, GREEN 6/6).
85
+ * **`TablesHome makingOnly`** (VERIFIER-18 M3): only the ways to make a table (New table, Start from an
86
+ example, the import that follows) and none of the lists — no table sections, no dashboards list (and
87
+ no `dashboards` read), no booking pages, no "Show everything" line. matrx-frontend's organization hub,
88
+ which lists the organization's tables (pick lists under "Kept by the app"), dashboards and booking
89
+ pages itself, passes it once this version is in its lockfile, so the page draws one list. Default
90
+ false. Suite `the-organization-page-lists-its-tables-once.test.tsx` (RED 1/2 on the prior bytes,
91
+ GREEN 2/2).
92
+ * **Exported for hosts:** `resolveTableStyle` and `styleFromDecorations` (the one color resolver —
93
+ matrx-frontend's Sheet moves onto them and deletes its own translation once this version is in its
94
+ lockfile), the date helper (`dateText`, `calendarDayOf`, `calendarDayLabel`, `carriesTimeOfDay`,
95
+ `dateFormatFor`, `hasTimePart`, `isDateField`) and `cardTitleField`.
96
+
97
+ ## 0.85.6 (2026-09-24 — published by PUBLISH-SWEEP-5)
98
+
99
+ **Needs `@ai-matrx/records` 0.58.4** (published first: its catalogue carries the doors this release
100
+ draws — `table_home`, `table_move`, `portal_form`, the `entity_reference` kind). 0.85.5 (the release
101
+ run's automatic tag) never reached npm: `every-kind-the-store-takes-is-on-the-menu` found
102
+ `entity_reference` published by the store with nothing classifying how the menu sends it (it goes as
103
+ its word, with `allowed_types`, exactly like `signature`); and `every-table-row-says-where-it-lives`
104
+ asserted the door-absent sentence for `custom.table_home`, which is live now — it asserts the store is
105
+ asked once, when the chip is pressed, and that its organization is drawn (RED on the pre-apply
106
+ catalogue, GREEN on the live one).
107
+
108
+ ### Lane UI-FIX-18 (2026-09-24)
109
+
110
+ * **A date reads the same day in every layout, in every time zone** (VERIFIER-18 H2). New `dates.ts`
111
+ is the one date helper: `dateText` prints through the design system's registry (`formatFieldValue`,
112
+ what the grid already used), `calendarDayOf` / `calendarDayLabel` file and head a calendar day
113
+ without UTC midnight, `carriesTimeOfDay` / `dateFormatFor` read `config.kind` (with the older
114
+ `format: "datetime"` honoured). `scalarText` (gallery, cards, record panel, history), the calendar,
115
+ the date editor and `formatForField` all read it. A bare `2026-04-01` is Apr 1 in Los Angeles and in
116
+ Tokyo, never Mar 31. Suite `a-date-reads-the-same-day-in-every-layout.test.tsx` (RED 7/13 on the
117
+ prior bytes, GREEN 13/13), with a source guard refusing `toISOString().slice(0, 10)` and UTC-midnight
118
+ dates in any screen.
119
+ * **Created time and Last changed time print like every other date and time** (VERIFIER-18 M1):
120
+ `formatForField` answers `{ id: "datetime" }` for `config.system` `created_time` / `modified_time`, so
121
+ the grid, gallery, record panel and the panel's "Worked out by the system" line read
122
+ *Sep 24, 2026, 5:13 PM*, not `2026-09-25T00:13:34.564Z`.
123
+
124
+ ### Lane DATA-V2-FACE-2 (2026-09-24)
125
+
126
+ * **One name, one place: the Grid draws no name of its own.** `Grid` no longer draws the table's name
127
+ and row count above the records, nor the design system's per-browser working-view tabs ("Default
128
+ view" + "+") and "Default view ▾" menu (`viewTabs={false}`, no `tableId` handed to `MatrxDataTable`).
129
+ The page that places the grid names the table; the page's view bar is the one place views live; the
130
+ data table's footer counts the rows. `toolbarActions` still draw, on their own row, only when given.
131
+ Suite: `the-grid-names-nothing-the-page-already-names.test.tsx` (RED 3/3 on the prior bytes, GREEN 3/3).
132
+ * **`defaultViewOf(views)`** — when two views both claim the table's default (the mover's designated
133
+ Sheet and a page seed a later move of the view bar's older store brings in, both "All records"), the
134
+ designated one wins; `ViewBar` opens on it. Suite `the-designated-default-wins-over-a-seed.test.tsx`.
135
+ * **`WhereItLives` `variant="title"`** — quiet, frameless, for the page header beside the object's name
136
+ (matrx-frontend's /data-v2 table header uses its own copy today; the swap keeps the look).
137
+
138
+ ### Lane DATA-V2-FACE (2026-09-24)
4
139
 
5
140
  * **A table opens the way it was designated, and its face is one row.** `TablePage` draws, above the
6
141
  records, only the saved-views bar (when the table has two or more views, or the person asked for it),
@@ -17,13 +152,16 @@
17
152
  (no second "All records" is seeded beside it). A package layout (`grid`, `kanban`…) never designates,
18
153
  because a click writes those; on a designated table a layout picked from the menu is for the visit and
19
154
  is never written over the designation.
155
+ * `TablePage` takes `leading` (the host's quiet where-it-lives chip, at the start of the one row) and
156
+ `menuExtras` (host capabilities in the table menu, e.g. "When a row changes, run an agent…").
157
+ `designatedLayoutOf`, `tableOpening` and `TABLE_MENU` are exported.
20
158
  * `ViewSwitcher` takes `chooser={false}` (the page draws the choice) and `openExport`; a host layout's
21
159
  `render` receives `openExport`, so the Sheet's "Export this table…" opens the page's own export.
22
160
  `ViewBar` takes `quietWhenAlone` and `onViews`.
23
161
  * Tests: `a-table-opens-the-way-it-was-designated.test.tsx` (RED 3/3 against the pre-lane page, GREEN
24
162
  8/8); `every-table-can-reach-its-archive.test.tsx` now reaches Archived through the menu.
25
163
 
26
- ## Unreleased — lane SC-1-TAILS (2026-09-24)
164
+ ### Lane SC-1-TAILS (2026-09-24)
27
165
 
28
166
  * **`WhereItLives`** — the one chip for "Lives in <organization>" and moving a table, moved here from matrx-frontend
29
167
  so every host (and `TablesHome`) mounts the same builder. The consequence is said in the panel before "Move it";
@@ -35,6 +173,12 @@
35
173
  * **Consumer action:** matrx-frontend passes `organizationName` to `TablesHome` in `OrganizationHub.tsx` and swaps
36
174
  its three `WhereItLives` call sites to this export.
37
175
 
176
+ ## 0.85.5
177
+
178
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
179
+ `git diff npm/records-ui/v0.85.4..npm/records-ui/v0.85.5 -- apps/shared/records-ui`).
180
+ No source changes intended and no consumer action required.
181
+
38
182
  ## 0.85.4 (2026-09-24 — published by PUBLISH-SWEEP-5; folds every section below down to 0.84.8)
39
183
 
40
184
  **0.85.3 never reached npm** (the release run's automatic tag, run 36064683447): every test passed
@@ -80,6 +224,13 @@ integrator's sweeps (`79b505cfa5`, `9a6618f2d0`, `452e363c2e`) rather than their
80
224
  Every change is one `custom.action_declare` with the whole list; a store refusal is shown under the
81
225
  form and what was typed stays. Same controls as the field panel. Suite
82
226
  `an-owner-writes-the-tables-own-buttons.test.tsx`: RED 6 on the bytes without the section, GREEN 8.
227
+ * **An agent button hands over what the grid holds — the host reads nothing on press.** `runAgentAction`'s
228
+ target gains `tableName`, `fields`, `document` (the row as this reader sees it) and `level`. **Consumer
229
+ action:** a host that re-read the table, its fields, the record or the level to start the job drops those
230
+ reads and takes them from the target. Test RED without them, GREEN with them.
231
+ * **An agent action is never labelled "a column it changes is gone".** The store answers `runnable: false`
232
+ for every agent action; the badge is for update actions only (found on the live walk of Rincon's Invoices;
233
+ test RED → GREEN).
83
234
  * **A button declared in settings appears on the grid beside it without a reload.** `rowActionsChanged(tableId)`
84
235
  (gridActions.tsx): every mounted `useTableActions` of that table reads `custom.row_actions` again after a
85
236
  declare. Test RED without the listener, GREEN with it.