@ai-matrx/records 0.5.1 → 0.7.2

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,138 @@
1
1
  # Changelog — @ai-matrx/records
2
2
 
3
+ ## 0.7.2
4
+
5
+ **The door catalogue, regenerated while the store was still growing.** 0.7.1
6
+ mirrored 300 doors and the gate, running twelve minutes later, counted 301 —
7
+ another lane shipped one in the window. Regenerated: 301 doors. Nothing else
8
+ changed.
9
+
10
+ ## 0.7.1
11
+
12
+ **The live suite opens the switch the way the store resolves it.**
13
+
14
+ 0.7.0's release gate failed four clauses against the live store and none of them
15
+ was about this package's code. `platform.knob_resolve` reads an organization's
16
+ own override ABOVE the base knob row, and Test's Org gained one
17
+ (`custom/system_enabled` = false, written through the ramp screen's own writer)
18
+ — so the suite's in-transaction `update platform.feature_knob` stopped opening
19
+ anything and three cases met the store's switched-off refusal. Both rungs are
20
+ set inside the transaction now, for the member's organization and for the
21
+ stranger organization the membership wall case names, and the `rollback` still
22
+ puts both back.
23
+
24
+ The fourth was the door catalogue: 293 mirrored names against 300 live doors,
25
+ because other lanes added seven. `src/store.generated.ts` is regenerated from
26
+ the live store — 300 doors, 35 knobs, 1020 entity tokens — which is the file's
27
+ whole contract: nothing in it is typed by a person.
28
+
29
+ ## 0.7.0
30
+
31
+ **A screen can ask what this person may do, before it offers it.**
32
+
33
+ The 19–20 September verdict (sixth pass) watched a colleague who had been shared
34
+ a table at Viewer double-click a cell, get a live editor, type a value and press
35
+ Enter — and only then be told she may not write. "The permission is right; the
36
+ screen told her she could." No screen could have done better: the store answers
37
+ "what may this person do to this thing?" in exactly one place,
38
+ `custom.effective_level`, which has no grant to `authenticated` and no decision
39
+ of its own — it takes ANY principal and ANY subject, so granting it to clients
40
+ would be handing out a visibility probe.
41
+
42
+ - **`client.myLevels({ ids })`** — the new `custom.my_levels` door. What level
43
+ the CALLER holds on the subjects they name, with no principal argument: the
44
+ person is resolved from the session, so you can ask about your own access and
45
+ about nobody else's. It takes a LIST so a page of fifty rows is one call, and
46
+ **every id asked about gets a row** — `null` included, because a missing row
47
+ and "no access" would be the same thing to the screen that asked and one of
48
+ them is a silence. `null` for an id that does not exist is the same answer, so
49
+ it is not an existence oracle.
50
+ - **`useMyLevel(id)` / `useMyLevels(ids)`** in `/react`.
51
+ - **`level.ts`**: `PermissionLevel`, `PERMISSION_LEVELS`, `atLeast`,
52
+ `asPermissionLevel`, `highestLevel`. The ladder a screen compares with is the
53
+ ladder the door compares with; two orderings would be two answers to one
54
+ question and the second is always wrong.
55
+
56
+ **What this release deliberately does NOT do.** A `Table.your_level` carried off
57
+ the read door looked free and was wrong: `tableList` reads the Table KERNEL, so
58
+ `read_records`'s `level` there is the caller's level on the kernel — viewer, for
59
+ everybody — and not on the table that row describes. It was written, measured
60
+ wrong within the hour (a table's own owner came back `viewer`), and removed; the
61
+ reason is in `core/client.ts` where the next person will reach for it. A table
62
+ is a record, and its level is asked for like any other record's.
63
+
64
+ ### Consumer action
65
+
66
+ None required. `custom.my_levels` is live on the main database (lane UI-HONEST,
67
+ `uihonest_a_screen_can_ask_what_it_may_offer.sql` +
68
+ `uihonest_the_level_door_takes_a_json_list.sql`), so `myLevels` answers as soon
69
+ as this version is installed.
70
+
71
+ ## 0.6.2
72
+
73
+ The generated store contract, regenerated at 279 doors. 0.6.1's gate was red on
74
+ nothing but the count: the door catalogue is asserted EQUAL to the live store's,
75
+ and other lanes landed a door in the ten minutes between the regeneration and
76
+ the publish. No source change and no consumer action.
77
+
78
+
79
+ ## 0.6.1
80
+
81
+ 0.6.0's release gate caught four things the live store had changed since the
82
+ contract was generated, and this is all four.
83
+
84
+ - **`54001` is a refusal class this package now knows.** `custom.record_delete`
85
+ stops a cascade that nests past sixty-four levels of containment — a loop
86
+ somebody built rather than a hierarchy — and it is a `store_limit`.
87
+ - **The generated contract is regenerated at 278 doors.**
88
+ - **The signed-out reach assertion excludes trigger functions**, for the reason
89
+ `platform.reopen_declared_doors` excludes them: they have no direct call
90
+ surface, so a grant on one says nothing about who can reach the store. Two
91
+ store triggers another lane landed turned it red while nothing about the
92
+ store's reach had changed.
93
+ - **The read door decides the organization WALL before the switch.** It opens
94
+ with `custom.assert_may_know_table`, so a person outside an organization is
95
+ told they are not a member and is never told whether the store is on for it.
96
+ The adapter suite accepts both of the store's own sentences and no third one.
97
+
98
+ ### Consumer action
99
+
100
+ None.
101
+
102
+
103
+ ## 0.6.0
104
+
105
+ **A column can be added.** The store grew the three doors a Field always needed
106
+ and this package carries them.
107
+
108
+ - **`fieldDeclare`, `fieldUpdate`, `fieldRetire`** on the client, and
109
+ `useFieldMutation()` in `/react`. Until now a Field was written with
110
+ `recordWrite` into the field kernel, and that could never work: the one write
111
+ door writes `data_class = 'record'` and cannot ALSO add the key to the Table
112
+ record's `fields` array, which the store's field guard requires before it
113
+ accepts any definition at all. Every screen that tried ended on *"the table
114
+ does not declare a field called … — declare it there first"*.
115
+ - **`NewFieldDeclaration`** — what a PERSON says when they add a column: a
116
+ parity type, a name, and for a choice list the choices themselves. The store
117
+ turns that into the behaviour, modifiers, format, unit, relation target,
118
+ relation maximum, compute_on and attached Rules its own guards demand, so a
119
+ client states an intention and never re-derives thirteen types of its own.
120
+ - **`FieldPatch`** — a field's own settings. What a field HOLDS is a conversion
121
+ and the door refuses it here by name.
122
+ - The generated store contract is refreshed to the live 260-door registry.
123
+
124
+ ### Consumer action
125
+
126
+ Nothing breaks. A host that writes Fields with `recordWrite` should move to
127
+ `useFieldMutation().declare` — the old path is the defect, not a deprecation.
128
+
129
+
130
+ ## 0.5.2
131
+
132
+ Automatic changed-only republish (docs/metadata drift since the last tag — see
133
+ `git diff npm/records/v0.5.1..npm/records/v0.5.2 -- apps/shared/records`).
134
+ No source changes intended and no consumer action required.
135
+
3
136
  ## 0.5.1
4
137
 
5
138
  Refreshes the generated store contract to the live 240-door registry caught by