things-api 0.18.0 → 0.19.0

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.
Files changed (191) hide show
  1. package/README.md +16 -9
  2. package/deputy/AppIcon.icns +0 -0
  3. package/deputy/VERSION +1 -1
  4. package/deputy/helpers-Info.plist +4 -0
  5. package/deputy/prebuilt/Things API Helper.app/Contents/CodeResources +0 -0
  6. package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/Info.plist +3 -1
  7. package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/MacOS/things-reader +0 -0
  8. package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/Resources/AppIcon.icns +0 -0
  9. package/deputy/prebuilt/Things API Helper.app/Contents/Helpers/things-reader.app/Contents/_CodeSignature/CodeResources +15 -2
  10. package/deputy/prebuilt/Things API Helper.app/Contents/Info.plist +5 -1
  11. package/deputy/prebuilt/Things API Helper.app/Contents/MacOS/things-deputy +0 -0
  12. package/deputy/prebuilt/Things API Helper.app/Contents/Resources/AppIcon.icns +0 -0
  13. package/deputy/prebuilt/Things API Helper.app/Contents/_CodeSignature/CodeResources +14 -2
  14. package/deputy/reader/Info.plist +2 -0
  15. package/deputy/reader/entitlements.plist +30 -0
  16. package/deputy/reader/main.swift +129 -40
  17. package/deputy/src/server.swift +25 -2
  18. package/deputy/src/tcc.swift +58 -0
  19. package/dist/audit/schema.d.ts +13 -1
  20. package/dist/audit/schema.js.map +1 -1
  21. package/dist/capability.d.ts +160 -0
  22. package/dist/capability.js +416 -0
  23. package/dist/capability.js.map +1 -0
  24. package/dist/cli/commands/doctor.js +127 -1
  25. package/dist/cli/commands/doctor.js.map +1 -1
  26. package/dist/cli/commands/helpers.js +178 -51
  27. package/dist/cli/commands/helpers.js.map +1 -1
  28. package/dist/cli/commands/op-result.js +6 -0
  29. package/dist/cli/commands/op-result.js.map +1 -1
  30. package/dist/cli/commands/reads.js +47 -1
  31. package/dist/cli/commands/reads.js.map +1 -1
  32. package/dist/cli/commands/setup.d.ts +9 -0
  33. package/dist/cli/commands/setup.js +63 -83
  34. package/dist/cli/commands/setup.js.map +1 -1
  35. package/dist/cli/commands/writes.d.ts +1 -1
  36. package/dist/cli/commands/writes.js +241 -107
  37. package/dist/cli/commands/writes.js.map +1 -1
  38. package/dist/cli/dry-run.d.ts +1 -1
  39. package/dist/cli/dry-run.js +1 -1
  40. package/dist/cli/glyphs.d.ts +23 -4
  41. package/dist/cli/glyphs.js +46 -19
  42. package/dist/cli/glyphs.js.map +1 -1
  43. package/dist/cli/help.d.ts +1 -1
  44. package/dist/cli/help.js +49 -27
  45. package/dist/cli/help.js.map +1 -1
  46. package/dist/cli/period.d.ts +3 -1
  47. package/dist/cli/period.js +1 -1
  48. package/dist/cli/period.js.map +1 -1
  49. package/dist/cli/read-driver.js +26 -1
  50. package/dist/cli/read-driver.js.map +1 -1
  51. package/dist/cli/render.d.ts +31 -4
  52. package/dist/cli/render.js +127 -15
  53. package/dist/cli/render.js.map +1 -1
  54. package/dist/client.d.ts +22 -2
  55. package/dist/client.js +36 -13
  56. package/dist/client.js.map +1 -1
  57. package/dist/contracts.d.ts +6 -2
  58. package/dist/contracts.js +1 -1
  59. package/dist/contracts.js.map +1 -1
  60. package/dist/deputy/install.d.ts +219 -5
  61. package/dist/deputy/install.js +803 -31
  62. package/dist/deputy/install.js.map +1 -1
  63. package/dist/deputy/notices.js +2 -2
  64. package/dist/deputy/notices.js.map +1 -1
  65. package/dist/deputy/protocol.d.ts +59 -5
  66. package/dist/deputy/protocol.js +48 -11
  67. package/dist/deputy/protocol.js.map +1 -1
  68. package/dist/deputy/routing.d.ts +21 -0
  69. package/dist/deputy/routing.js +111 -27
  70. package/dist/deputy/routing.js.map +1 -1
  71. package/dist/diagnose.d.ts +14 -1
  72. package/dist/diagnose.js +46 -6
  73. package/dist/diagnose.js.map +1 -1
  74. package/dist/direct-setup.d.ts +78 -0
  75. package/dist/direct-setup.js +484 -0
  76. package/dist/direct-setup.js.map +1 -0
  77. package/dist/host-access.d.ts +63 -0
  78. package/dist/host-access.js +165 -0
  79. package/dist/host-access.js.map +1 -0
  80. package/dist/index.d.ts +20 -5
  81. package/dist/index.js +14 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/mcp/server.d.ts +27 -1
  84. package/dist/mcp/server.js +285 -100
  85. package/dist/mcp/server.js.map +1 -1
  86. package/dist/op-result.d.ts +9 -0
  87. package/dist/op-result.js +5 -0
  88. package/dist/op-result.js.map +1 -1
  89. package/dist/read/filter-contract.d.ts +1 -1
  90. package/dist/read/filter-contract.js +4 -0
  91. package/dist/read/filter-contract.js.map +1 -1
  92. package/dist/read/shape.js +4 -0
  93. package/dist/read/shape.js.map +1 -1
  94. package/dist/read/views.d.ts +29 -0
  95. package/dist/read/views.js +60 -0
  96. package/dist/read/views.js.map +1 -1
  97. package/dist/session-grant.d.ts +48 -0
  98. package/dist/session-grant.js +170 -0
  99. package/dist/session-grant.js.map +1 -0
  100. package/dist/surface-copy.d.ts +8 -0
  101. package/dist/surface-copy.js +8 -0
  102. package/dist/surface-copy.js.map +1 -1
  103. package/dist/wizard.d.ts +58 -0
  104. package/dist/wizard.js +167 -0
  105. package/dist/wizard.js.map +1 -0
  106. package/dist/write/availability.d.ts +1 -1
  107. package/dist/write/availability.js +3 -3
  108. package/dist/write/availability.js.map +1 -1
  109. package/dist/write/batch.d.ts +20 -0
  110. package/dist/write/batch.js +94 -15
  111. package/dist/write/batch.js.map +1 -1
  112. package/dist/write/capabilities.d.ts +9 -0
  113. package/dist/write/capabilities.js +2 -0
  114. package/dist/write/capabilities.js.map +1 -1
  115. package/dist/write/clear-reminder.js +1 -1
  116. package/dist/write/clear-reminder.js.map +1 -1
  117. package/dist/write/commands.d.ts +12 -1
  118. package/dist/write/commands.js +112 -224
  119. package/dist/write/commands.js.map +1 -1
  120. package/dist/write/failure-hints.d.ts +3 -1
  121. package/dist/write/failure-hints.js.map +1 -1
  122. package/dist/write/guards.js +19 -2
  123. package/dist/write/guards.js.map +1 -1
  124. package/dist/write/lock.d.ts +16 -13
  125. package/dist/write/lock.js +55 -0
  126. package/dist/write/lock.js.map +1 -1
  127. package/dist/write/make-repeating-project.js +9 -13
  128. package/dist/write/make-repeating-project.js.map +1 -1
  129. package/dist/write/operations.d.ts +36 -21
  130. package/dist/write/operations.js +7 -0
  131. package/dist/write/operations.js.map +1 -1
  132. package/dist/write/opid.d.ts +14 -0
  133. package/dist/write/opid.js +22 -0
  134. package/dist/write/opid.js.map +1 -1
  135. package/dist/write/param-schema.d.ts +124 -0
  136. package/dist/write/param-schema.js +747 -0
  137. package/dist/write/param-schema.js.map +1 -0
  138. package/dist/write/pipeline.d.ts +76 -2
  139. package/dist/write/pipeline.js +190 -2
  140. package/dist/write/pipeline.js.map +1 -1
  141. package/dist/write/pre-state.d.ts +8 -0
  142. package/dist/write/pre-state.js +29 -2
  143. package/dist/write/pre-state.js.map +1 -1
  144. package/dist/write/promote-clone.js +539 -439
  145. package/dist/write/promote-clone.js.map +1 -1
  146. package/dist/write/reorder.js +25 -8
  147. package/dist/write/reorder.js.map +1 -1
  148. package/dist/write/repeat-rule.d.ts +28 -1
  149. package/dist/write/repeat-rule.js +54 -4
  150. package/dist/write/repeat-rule.js.map +1 -1
  151. package/dist/write/resolution-timestamps.d.ts +11 -0
  152. package/dist/write/resolution-timestamps.js +83 -38
  153. package/dist/write/resolution-timestamps.js.map +1 -1
  154. package/dist/write/reversibility.js +4 -0
  155. package/dist/write/reversibility.js.map +1 -1
  156. package/dist/write/template-mutation.d.ts +137 -0
  157. package/dist/write/template-mutation.js +451 -0
  158. package/dist/write/template-mutation.js.map +1 -0
  159. package/dist/write/undo.js +10 -20
  160. package/dist/write/undo.js.map +1 -1
  161. package/dist/write/update-fields.d.ts +151 -0
  162. package/dist/write/update-fields.js +427 -0
  163. package/dist/write/update-fields.js.map +1 -0
  164. package/dist/write/vectors/applescript.js +3 -0
  165. package/dist/write/vectors/applescript.js.map +1 -1
  166. package/dist/write/vectors/registry.d.ts +1 -1
  167. package/dist/write/vectors/registry.js +10 -2
  168. package/dist/write/vectors/registry.js.map +1 -1
  169. package/dist/write/vectors/shortcuts.js +2 -2
  170. package/dist/write/vectors/shortcuts.js.map +1 -1
  171. package/dist/write/vectors/simulator.js +7 -2
  172. package/dist/write/vectors/simulator.js.map +1 -1
  173. package/dist/write/vectors/types.d.ts +57 -0
  174. package/dist/write/vectors/ui-recipes.d.ts +19 -0
  175. package/dist/write/vectors/ui-recipes.js +30 -0
  176. package/dist/write/vectors/ui-recipes.js.map +1 -1
  177. package/dist/write/vectors/ui.d.ts +13 -0
  178. package/dist/write/vectors/ui.js +62 -13
  179. package/dist/write/vectors/ui.js.map +1 -1
  180. package/dist/write/verify/delta.d.ts +21 -0
  181. package/dist/write/verify/delta.js.map +1 -1
  182. package/package.json +2 -1
  183. package/schema/envelope.schema.json +5 -3
  184. package/scripts/build-helpers.sh +5 -0
  185. package/skills/things-cli/SKILL.md +5 -3
  186. package/skills/things-cli/references/contracts.md +1 -0
  187. package/skills/things-cli/references/data-model.md +3 -0
  188. package/skills/things-cli/references/errors.md +1 -1
  189. package/skills/things-cli/references/gui.md +1 -0
  190. package/skills/things-cli/references/repeating.md +6 -0
  191. package/skills/things-cli/references/tag-cleanup.md +64 -0
@@ -0,0 +1,427 @@
1
+ /**
2
+ * The ONE registry of the to-do / project UPDATE vocabulary
3
+ * ({@link UpdateFields}) — and the primitives its fields are built from.
4
+ *
5
+ * `todo.update` / `project.update` is the widest multi-consumer vocabulary in
6
+ * the write engine: the same seven fields are spoken by
7
+ *
8
+ * 1. the URL compilation (`update` / `update-project` parameters),
9
+ * 2. the expected-delta assertions (what verify — and the audit trail's
10
+ * pre-capture, which snapshots exactly the ASSERTED fields — must prove),
11
+ * 3. the undo inverse (which pre-values restore the field), and
12
+ * 4. the CLI / MCP patch builders (flags → params, including the two `clear-*`
13
+ * flags that spell a `null`).
14
+ *
15
+ * Per the exhaustive-map doctrine (decisions.md 2026-08-17, #491) none of those
16
+ * may hand-enumerate the vocabulary: each consumer derives from an EXHAUSTIVE
17
+ * `Record<keyof …, …>` here, where every field is either a producer or an
18
+ * explicit skip carrying a WRITTEN reason. A field added to {@link UpdateFields}
19
+ * breaks compilation in {@link UPDATE_FIELD_MAP} until it is consciously handled
20
+ * for all three engine legs, and in {@link UPDATE_INPUT_MAP} until both consumer
21
+ * surfaces accept it — so "accepted by the CLI, silently never reaches the URL"
22
+ * and "asserted shallowly, so a silent app no-op verifies ok" are unreachable by
23
+ * construction rather than by review.
24
+ *
25
+ * The semantic backstop the types cannot give is the DISCRIMINATION property
26
+ * test in test/unit/update-fields.test.ts (two patches sharing a requested-field
27
+ * footprint but differing in ≥1 value ⇒ asserts(A) UNSATISFIED against state(B)).
28
+ */
29
+ import { decodeReminderTime, encodeReminderTime, reminderUrlToken, } from "../model/dates.js";
30
+ import { splitWhenSugar } from "../model/when-sugar.js";
31
+ import { reminderIsLive } from "../read/stage.js";
32
+ // ------------------------------------------------------- shared field primitives
33
+ /** Round-trip normalization: "6:5"-style inputs → canonical "06:05". */
34
+ export function normalizeReminder(time) {
35
+ return decodeReminderTime(encodeReminderTime(time)) ?? time;
36
+ }
37
+ /**
38
+ * The URL `when` value with an optional reminder token appended through the
39
+ * deterministic emitter (never a bare 1–11 hour — oddity 2d).
40
+ */
41
+ export function whenWithReminder(when, reminder) {
42
+ if (reminder === undefined || reminder === null)
43
+ return when;
44
+ return `${when}@${reminderUrlToken(reminder)}`;
45
+ }
46
+ /**
47
+ * The schedule assertions a `when` value implies. Shared with the ADD verbs
48
+ * (mode "add"), which mint a fresh row rather than re-scheduling an existing one.
49
+ */
50
+ export function whenAssertions(when, todayIso, opts = { mode: "add" }) {
51
+ // Strict shape check: an unvalidated string used to flow straight into the
52
+ // URL (e.g. "2026-07-20@09:30", the raw URL grammar) — the app would SET
53
+ // date+reminder while verification asserted the literal string as the date,
54
+ // reporting a false mismatch on a write that succeeded.
55
+ if (when !== "today" &&
56
+ when !== "evening" &&
57
+ when !== "anytime" &&
58
+ when !== "someday" &&
59
+ !/^\d{4}-\d{2}-\d{2}$/.test(when)) {
60
+ throw new RangeError(when.includes("@")
61
+ ? `invalid when "${when}" — a reminder time is a separate parameter (reminder: "HH:mm"; CLI --reminder), not an @ suffix`
62
+ : `invalid when "${when}" — expected today | evening | anytime | someday | YYYY-MM-DD`);
63
+ }
64
+ switch (when) {
65
+ case "today":
66
+ // Today's non-evening section: in Today (the `today` marker) AND NOT in the
67
+ // evening sub-bucket (the presence-keyed `evening` marker absent — asserted
68
+ // as null, which valuesEqual treats as absent). Gated to Today members under
69
+ // the verify clock exactly as the retired `todaySection` was.
70
+ //
71
+ // The `startDate` assertion differs by op (field bug §0½.8):
72
+ // - ADD mints a fresh Today item with no schedule history, so the app dates
73
+ // it EXACTLY today — exact equality is right.
74
+ // - UPDATE of an item ALREADY in Today whose `startDate` has already arrived
75
+ // (past or today): the app PRESERVES that historical date rather than
76
+ // rewriting the storage byte to today (arrived-date law). Assert the
77
+ // arrived-date PREDICATE (non-null and <= today) so a preserved historical
78
+ // date verifies, while an undated deadline-only pull (null startDate) is
79
+ // still rejected — the item's Today membership then rests only on a
80
+ // deadline, not on the requested schedule.
81
+ return [
82
+ { field: "start", equals: "active" },
83
+ opts.mode === "update"
84
+ ? { field: "startDate", satisfies: { predicate: "arrived-on-or-before", date: todayIso } }
85
+ : { field: "startDate", equals: todayIso },
86
+ { field: "today", equals: true },
87
+ { field: "evening", equals: null },
88
+ ];
89
+ case "evening":
90
+ // The This-Evening sub-bucket: the `evening` marker (which implies `today`).
91
+ return [
92
+ { field: "start", equals: "active" },
93
+ { field: "startDate", equals: todayIso },
94
+ { field: "evening", equals: true },
95
+ ];
96
+ case "anytime":
97
+ return [
98
+ { field: "start", equals: "active" },
99
+ { field: "startDate", equals: null },
100
+ ];
101
+ case "someday":
102
+ return [{ field: "start", equals: "someday" }];
103
+ default:
104
+ // Concrete date: assert only the date — start-state semantics differ
105
+ // for past/today/future dates (only the date itself is invariant).
106
+ return [{ field: "startDate", equals: when }];
107
+ }
108
+ }
109
+ /**
110
+ * The effective reminder a when-bearing update should leave behind. A bare
111
+ * `when=` CLEARS an existing reminder (R07/R20), so when the caller
112
+ * re-schedules to today/evening/a date without addressing the reminder we
113
+ * auto-preserve the current one; an explicit null is the intentional clear.
114
+ *
115
+ * §9n: a reminder whose row's `startDate` is already strictly PAST is
116
+ * presentation-dead (the GUI hides its bell; the byte lingers in the DB). We do
117
+ * NOT auto-preserve such a stale byte — carrying it into the re-schedule would
118
+ * RESURRECT a reminder the user believes gone. A LIVE reminder (startDate
119
+ * today/future) is preserved as before. The liveness test is the SAME
120
+ * {@link reminderIsLive} predicate the read side gates on, consulted against the
121
+ * target's CURRENT `startDate` under the response clock.
122
+ */
123
+ export function effectiveReminder(pre, params) {
124
+ if (params.reminder !== undefined)
125
+ return params.reminder;
126
+ const when = params.when;
127
+ const schedulable = when === "today" ||
128
+ when === "evening" ||
129
+ (typeof when === "string" && /^\d{4}-\d{2}-\d{2}$/.test(when));
130
+ if (!schedulable)
131
+ return null;
132
+ const target = pre.target;
133
+ if (target === null || target.type === "heading")
134
+ return null;
135
+ if (!reminderIsLive(target.startDate, pre.todayIso))
136
+ return null;
137
+ // Read the RAW stored byte off the substrate (top-level `reminder` is
138
+ // live-gated under the LOAD clock, which can differ from `pre.todayIso` under a
139
+ // pinned THINGS_NOW). The `reminderIsLive` guard above applies liveness under
140
+ // the injected clock explicitly, so the raw byte + this gate reproduce the
141
+ // former semantics exactly.
142
+ return target.derived.reminder;
143
+ }
144
+ export function assertNotesModesExclusive(params) {
145
+ if (params.notes !== undefined &&
146
+ (params.appendNotes !== undefined || params.prependNotes !== undefined)) {
147
+ throw new RangeError("notes (replace) is exclusive with appendNotes/prependNotes");
148
+ }
149
+ if (params.appendNotes !== undefined && params.prependNotes !== undefined) {
150
+ throw new RangeError("appendNotes and prependNotes cannot be combined in one update");
151
+ }
152
+ }
153
+ /** The notes body an append/prepend leg should leave behind (E04/E05/E11/E12). */
154
+ function joinedNotes(pre, params) {
155
+ const current = pre.target !== null && pre.target.type !== "heading" ? pre.target.notes : "";
156
+ // Separator semantics probed: newline-joined, no stray newline against an
157
+ // empty note (E04/E05/E11/E12).
158
+ if (params.appendNotes !== undefined) {
159
+ return current === "" ? params.appendNotes : `${current}\n${params.appendNotes}`;
160
+ }
161
+ if (params.prependNotes !== undefined) {
162
+ return current === "" ? params.prependNotes : `${params.prependNotes}\n${current}`;
163
+ }
164
+ return undefined;
165
+ }
166
+ /**
167
+ * EXHAUSTIVE over every key of {@link UpdateFields}. The mapped-type key set
168
+ * (`-?` makes each required) is what makes a newly added field a COMPILE error
169
+ * until it earns an entry here.
170
+ */
171
+ const UPDATE_FIELD_MAP = {
172
+ title: {
173
+ wire: (p) => ({ title: p.title }),
174
+ assert: (p) => [{ field: "title", equals: p.title }],
175
+ restore: { preField: "title" },
176
+ },
177
+ notes: {
178
+ wire: (p) => ({ notes: p.notes }),
179
+ assert: (p) => [{ field: "notes", equals: p.notes }],
180
+ restore: { preField: "notes" },
181
+ },
182
+ appendNotes: {
183
+ wire: (p) => ({ "append-notes": p.appendNotes }),
184
+ assert: (p, pre) => [{ field: "notes", equals: joinedNotes(pre, p) }],
185
+ restore: {
186
+ skip: "an append asserts the RESULTING notes body, so the captured `notes` pre-value (the " +
187
+ "`notes` entry's inverse) restores it — there is no separate append to invert",
188
+ },
189
+ },
190
+ prependNotes: {
191
+ wire: (p) => ({ "prepend-notes": p.prependNotes }),
192
+ assert: (p, pre) => [{ field: "notes", equals: joinedNotes(pre, p) }],
193
+ restore: {
194
+ skip: "a prepend asserts the RESULTING notes body, so the captured `notes` pre-value (the " +
195
+ "`notes` entry's inverse) restores it — there is no separate prepend to invert",
196
+ },
197
+ },
198
+ when: {
199
+ // The reminder rides ALONG this parameter (`when=<value>@<token>`) — see the
200
+ // `reminder` entry's wire skip.
201
+ wire: (p, pre) => ({
202
+ when: p.when === undefined ? undefined : whenWithReminder(p.when, effectiveReminder(pre, p)),
203
+ }),
204
+ assert: (p, pre, ctx) => p.when === undefined ? [] : whenAssertions(p.when, ctx.todayIso, { mode: "update" }),
205
+ restore: {
206
+ skip: "the schedule axis is restored as ONE reconstructed `when=` step by undo's " +
207
+ "scheduleSteps() (start/startDate/today/evening, or an Inbox move), not field-by-field",
208
+ },
209
+ },
210
+ reminder: {
211
+ wire: {
212
+ skip: "the URL scheme has no standalone reminder parameter — a reminder rides the `when` " +
213
+ "value as its `@<token>` suffix, emitted by the `when` entry through effectiveReminder. " +
214
+ "H-REMINDER-SCOPE refuses a reminder without a schedulable when, so one can never be " +
215
+ "requested with no `when` to carry it",
216
+ },
217
+ // Asserted whenever the SCHEDULE is rewritten (a bare `when=` clears an
218
+ // existing reminder unless it is auto-preserved — R07/R20, effectiveReminder),
219
+ // and whenever a reminder is requested outright: a requested reminder that the
220
+ // wire could not carry must fail verification, never pass silently.
221
+ assertWhen: (p) => p.when !== undefined || p.reminder !== undefined,
222
+ assert: (p, pre) => {
223
+ const reminder = effectiveReminder(pre, p);
224
+ return [
225
+ { field: "reminder", equals: reminder === null ? null : normalizeReminder(reminder) },
226
+ ];
227
+ },
228
+ restore: {
229
+ skip: "carried by the schedule step undo's scheduleSteps() builds — a reminder can only be " +
230
+ "re-attached together with the `when` it hangs on (R07/R20)",
231
+ },
232
+ },
233
+ deadline: {
234
+ // The empty string is the URL's deadline CLEAR (a null deadline).
235
+ wire: (p) => ({ deadline: p.deadline === null ? "" : p.deadline }),
236
+ assert: (p) => [{ field: "deadline", equals: p.deadline }],
237
+ restore: { preField: "deadline" },
238
+ },
239
+ };
240
+ /** The vocabulary's keys, in registry order (the order consumers emit in). */
241
+ const UPDATE_FIELD_KEYS = Object.keys(UPDATE_FIELD_MAP);
242
+ /**
243
+ * The `update` / `update-project` URL parameters for a patch (the target `id` is
244
+ * the caller's). Every field either contributes here or carries a written reason
245
+ * for why it cannot — a flag accepted by a consumer can no longer be dropped on
246
+ * the way to the wire without one.
247
+ */
248
+ export function updateWireParams(params, pre) {
249
+ const out = {};
250
+ for (const key of UPDATE_FIELD_KEYS) {
251
+ const spec = UPDATE_FIELD_MAP[key];
252
+ if ("skip" in spec.wire)
253
+ continue;
254
+ Object.assign(out, spec.wire(params, pre));
255
+ }
256
+ return out;
257
+ }
258
+ /**
259
+ * The expected-delta assertions for a patch: REQUESTED-FIELDS-ONLY (a field the
260
+ * caller did not set contributes nothing, keeping its don't-care semantics), and
261
+ * every requested field contributes — the audit pre-capture snapshots exactly
262
+ * this set, so it is also what undo has to restore from.
263
+ */
264
+ export function updateAssertions(params, pre, ctx) {
265
+ const out = [];
266
+ for (const key of UPDATE_FIELD_KEYS) {
267
+ const spec = UPDATE_FIELD_MAP[key];
268
+ if ("skip" in spec.assert)
269
+ continue;
270
+ const present = spec.assertWhen !== undefined ? spec.assertWhen(params) : params[key] !== undefined;
271
+ if (present)
272
+ out.push(...spec.assert(params, pre, ctx));
273
+ }
274
+ return out;
275
+ }
276
+ /**
277
+ * The undo inverse's per-field parameters, read off an audit record's captured
278
+ * pre-state (`record.pre`). The schedule axis is NOT here — undo reconstructs it
279
+ * as one `when=` step (see the `when` / `reminder` skips).
280
+ */
281
+ export function updateRestoreParams(pre) {
282
+ const out = {};
283
+ if (pre === null)
284
+ return out;
285
+ for (const key of UPDATE_FIELD_KEYS) {
286
+ const spec = UPDATE_FIELD_MAP[key];
287
+ if ("skip" in spec.restore)
288
+ continue;
289
+ const captured = pre[spec.restore.preField];
290
+ if (captured !== undefined)
291
+ out[key] = captured;
292
+ }
293
+ return out;
294
+ }
295
+ /** CLI flag spellings. */
296
+ export const CLI_UPDATE_LABELS = {
297
+ when: "--when",
298
+ reminder: "--reminder",
299
+ notes: "--notes",
300
+ appendNotes: "--append-notes",
301
+ prependNotes: "--prepend-notes",
302
+ clearReminder: "--clear-reminder",
303
+ deadline: "--deadline",
304
+ clearDeadline: "--clear-deadline",
305
+ };
306
+ /** MCP tool-parameter spellings. */
307
+ export const MCP_UPDATE_LABELS = {
308
+ when: "when",
309
+ reminder: "reminder",
310
+ notes: "notes",
311
+ appendNotes: "append_notes",
312
+ prependNotes: "prepend_notes",
313
+ clearReminder: "clear_reminder",
314
+ deadline: "deadline",
315
+ clearDeadline: "clear_deadline",
316
+ };
317
+ /**
318
+ * EXHAUSTIVE over the consumer vocabulary — the CLI and MCP update verbs share
319
+ * this ONE mapping instead of each spelling out the field list (the drift that
320
+ * let the two surfaces validate different flag pairs).
321
+ */
322
+ const UPDATE_INPUT_MAP = {
323
+ title: { kind: "value", param: "title" },
324
+ notes: { kind: "value", param: "notes" },
325
+ appendNotes: { kind: "value", param: "appendNotes" },
326
+ prependNotes: { kind: "value", param: "prependNotes" },
327
+ when: { kind: "value", param: "when" },
328
+ reminder: { kind: "value", param: "reminder" },
329
+ clearReminder: { kind: "clear", param: "reminder" },
330
+ deadline: { kind: "value", param: "deadline" },
331
+ clearDeadline: { kind: "clear", param: "deadline" },
332
+ createdAt: { kind: "value", param: "createdAt" },
333
+ completedAt: { kind: "value", param: "completedAt" },
334
+ };
335
+ const UPDATE_INPUT_KEYS = Object.keys(UPDATE_INPUT_MAP);
336
+ /** camelCase → the snake_case spelling of the same key (`appendNotes` → `append_notes`). */
337
+ function snakeOf(key) {
338
+ return key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
339
+ }
340
+ /** Read one vocabulary key from a surface's parsed options bag (either spelling). */
341
+ function read(source, key) {
342
+ return source[key] ?? source[snakeOf(key)];
343
+ }
344
+ /**
345
+ * Build an update patch from a consumer surface's parsed options, or report the
346
+ * ONE usage error. Accepts either spelling of each key (commander's camelCase or
347
+ * MCP's snake_case) and ignores everything outside the vocabulary, so a surface
348
+ * hands its whole options bag over instead of re-listing the fields.
349
+ *
350
+ * Owns every mutually-exclusive pair in the vocabulary — the notes modes, both
351
+ * `clear-*` flags against their setters, and the `when` value's `@time` sugar
352
+ * (which is a reminder, so it collides with BOTH reminder flags). A contradiction
353
+ * is refused, never silently resolved in favor of one flag.
354
+ */
355
+ export function buildUpdatePatch(source, labels = CLI_UPDATE_LABELS) {
356
+ const bag = {};
357
+ for (const key of UPDATE_INPUT_KEYS) {
358
+ const value = read(source, key);
359
+ if (value !== undefined)
360
+ bag[key] = value;
361
+ }
362
+ const notesModes = [bag["notes"], bag["appendNotes"], bag["prependNotes"]].filter((v) => v !== undefined);
363
+ if (notesModes.length > 1) {
364
+ return {
365
+ kind: "error",
366
+ message: `${labels.notes}, ${labels.appendNotes}, ${labels.prependNotes} are exclusive`,
367
+ };
368
+ }
369
+ const clearReminder = bag["clearReminder"] === true;
370
+ const clearDeadline = bag["clearDeadline"] === true;
371
+ if (bag["reminder"] !== undefined && clearReminder) {
372
+ return {
373
+ kind: "error",
374
+ message: `pass at most one of ${labels.reminder} / ${labels.clearReminder}`,
375
+ };
376
+ }
377
+ if (bag["deadline"] !== undefined && clearDeadline) {
378
+ return {
379
+ kind: "error",
380
+ message: `pass at most one of ${labels.deadline} / ${labels.clearDeadline}`,
381
+ };
382
+ }
383
+ // The `@time` suffix IS a reminder: it collides with the clear flag exactly as
384
+ // it collides with an explicit reminder (both would otherwise be applied, and
385
+ // the loser silently dropped).
386
+ const sugar = splitWhenSugar(bag["when"], bag["reminder"] !== undefined || clearReminder, labels);
387
+ if (sugar.kind === "error")
388
+ return { kind: "error", message: sugar.message };
389
+ if (sugar.kind === "split") {
390
+ bag["when"] = sugar.when;
391
+ bag["reminder"] = sugar.reminder;
392
+ }
393
+ const patch = {};
394
+ for (const key of UPDATE_INPUT_KEYS) {
395
+ const spec = UPDATE_INPUT_MAP[key];
396
+ const value = bag[key];
397
+ if (spec.kind === "clear") {
398
+ if (value === true)
399
+ patch[spec.param] = null;
400
+ continue;
401
+ }
402
+ // The values are surface-parsed strings; the pipeline validates their SHAPE
403
+ // (whenAssertions / the reminder codec / the date parsers) and refuses a bad
404
+ // one with a named error, so no re-validation happens here. A NON-string
405
+ // present value is refused rather than skipped (#580): silently dropping it
406
+ // produced an update that reported success while leaving the field untouched
407
+ // — the same silent-degradation genus this registry exists to make
408
+ // unreachable.
409
+ if (value === undefined)
410
+ continue;
411
+ if (typeof value !== "string") {
412
+ return {
413
+ kind: "error",
414
+ message: `${labels[key] ?? key}: expected a string — received ${value === null
415
+ ? "null"
416
+ : Array.isArray(value)
417
+ ? "an array"
418
+ : typeof value === "object"
419
+ ? "an object"
420
+ : typeof value}`,
421
+ };
422
+ }
423
+ patch[spec.param] = value;
424
+ }
425
+ return { kind: "ok", patch: patch };
426
+ }
427
+ //# sourceMappingURL=update-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-fields.js","sourceRoot":"","sources":["../../src/write/update-fields.ts"],"names":[],"mappings":"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"}
@@ -249,6 +249,9 @@ export function createAppleScriptVector() {
249
249
  return {
250
250
  id: "applescript",
251
251
  matrix: APPLESCRIPT_MATRIX,
252
+ // The one transport that puts a real Apple Event on the wire — so the one
253
+ // the pipeline's app-control gate applies to (permissions doctrine).
254
+ sendsAppleEvents: true,
252
255
  execute(invocation) {
253
256
  return runOsascript(invocation.payload);
254
257
  },
@@ -1 +1 @@
1
- {"version":3,"file":"applescript.js","sourceRoot":"","sources":["../../../src/write/vectors/applescript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applescript.js","sourceRoot":"","sources":["../../../src/write/vectors/applescript.ts"],"names":[],"mappings":"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"}
@@ -13,4 +13,4 @@ import type { UiDriveAux } from "./ui-drag.ts";
13
13
  * anchors the simulator fence's equality check so the applier and the pipeline's
14
14
  * verifier can never split-brain across two different databases.
15
15
  */
16
- export declare function defaultVectors(config?: ThingsApiConfig, uiAux?: UiDriveAux, resolvedDbPath?: string): WriteVector[];
16
+ export declare function defaultVectors(config?: ThingsApiConfig, uiAux?: UiDriveAux, resolvedDbPath?: string, dbPathIsExplicit?: boolean): WriteVector[];
@@ -22,7 +22,7 @@ import { createUrlSchemeVector } from "./url-scheme.js";
22
22
  * anchors the simulator fence's equality check so the applier and the pipeline's
23
23
  * verifier can never split-brain across two different databases.
24
24
  */
25
- export function defaultVectors(config = loadConfig(), uiAux = {}, resolvedDbPath) {
25
+ export function defaultVectors(config = loadConfig(), uiAux = {}, resolvedDbPath, dbPathIsExplicit = false) {
26
26
  // Bench harness (Phase 0): THINGS_SIM_WRITES=1 REQUESTS simulated writes. When
27
27
  // it is unset (the ordinary path) the real transports are returned unchanged.
28
28
  // When it IS set, the simulator's fence MUST hold — THINGS_DB names a fenced
@@ -53,8 +53,16 @@ export function defaultVectors(config = loadConfig(), uiAux = {}, resolvedDbPath
53
53
  // point with a marked DB means the env fence is absent/incomplete (the exact
54
54
  // shape of the escape that fired real url-scheme adds at a live app while
55
55
  // verification read the fixture) — refuse rather than return real transports.
56
+ // The sweep opens each candidate to read the marker, so it may only touch
57
+ // EXPLICITLY supplied paths (Article VI plain-file world): a bench fixture
58
+ // is only ever reached via THINGS_DB or an explicit dbPath, and the LOCATED
59
+ // default container is definitionally not one. Opening the default container
60
+ // here is also an Article I violation — from a non-FDA host that open raises
61
+ // the app-data consent modal (measured live 2026-08-24: every `things` read
62
+ // from a grant-less terminal hung on this exact check, prompting as the
63
+ // host, even with reads fully routed through the reader).
56
64
  const envDb = process.env["THINGS_DB"];
57
- const markedPath = [resolvedDbPath, envDb]
65
+ const markedPath = [dbPathIsExplicit ? resolvedDbPath : undefined, envDb]
58
66
  .filter((p) => p !== undefined && p.trim() !== "")
59
67
  .find((p) => dbCarriesBenchMarker(p));
60
68
  if (markedPath !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/write/vectors/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGnG,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC5B,SAA0B,UAAU,EAAE,EACtC,QAAoB,EAAE,EACtB,cAAuB;IAEvB,+EAA+E;IAC/E,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,+EAA+E;IAC/E,2EAA2E;IAC3E,iFAAiF;IACjF,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,GAAG,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,GAAG,iBAAiB,sBAAsB,CAAC,CAAC;QAC9D,CAAC;QACD,4EAA4E;QAC5E,8EAA8E;QAC9E,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CACb,GAAG,iBAAiB,mCAAmC,cAAc,mBAAmB;gBACtF,cAAc,QAAQ,GAAG,CAC5B,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,GAAG,iBAAiB,GAAG,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,oEAAoE;IACpE,4EAA4E;IAC5E,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,wBAAwB,UAAU,sDAAsD;YACtF,iFAAiF;YACjF,8EAA8E;YAC9E,uFAAuF;YACvF,wBAAwB,CAC3B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,qBAAqB,EAAE;QACvB,uBAAuB,EAAE;QACzB,qBAAqB,EAAE;QACvB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG,2DAA2D,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/write/vectors/registry.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ export const SHORTCUTS_MATRIX = {
27
27
  evidence: ["S02"],
28
28
  notes: "`things-proxy-create-heading` — the one surface that creates a heading in an " +
29
29
  "EXISTING project (dead on URL T09/U09 and AppleScript A31). Requires the Things " +
30
- "proxy shortcuts (`things setup shortcuts`); no transactional undo (heading delete " +
30
+ "proxy shortcuts (`things setup`); no transactional undo (heading delete " +
31
31
  "is interactive-only, so undo reports irreversible)",
32
32
  },
33
33
  "todo.clear-dated-reminder": {
@@ -42,7 +42,7 @@ export const SHORTCUTS_MATRIX = {
42
42
  "(RC01/RC02) for NON-REPEATING items when it is not (the bounce when= CRASHES a repeating " +
43
43
  "template, R09 — repeating stays Shortcuts-only). The clear is REVERSIBLE either way: undo " +
44
44
  "re-attaches the reminder via the URL set path (R17/R18). Same-date bare `when=` is sticky " +
45
- "(R20/R21, oddity 2e). Requires the Things proxy shortcuts (`things setup shortcuts`)",
45
+ "(R20/R21, oddity 2e). Requires the Things proxy shortcuts (`things setup`)",
46
46
  },
47
47
  };
48
48
  function defaultRun(shortcut, inputPath, outputPath) {
@@ -1 +1 @@
1
- {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../../src/write/vectors/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,qBAAqB,EAAE;QACrB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,KAAK,EACH,+EAA+E;YAC/E,kFAAkF;YAClF,oFAAoF;YACpF,oDAAoD;KACvD;IACD,2BAA2B,EAAE;QAC3B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,KAAK,EACH,yFAAyF;YACzF,qFAAqF;YACrF,0FAA0F;YAC1F,mFAAmF;YACnF,2FAA2F;YAC3F,4FAA4F;YAC5F,4FAA4F;YAC5F,sFAAsF;KACzF;CACF,CAAC;AAaF,SAAS,UAAU,CACjB,QAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,4EAA4E;IAC5E,qEAAqE;IACrE,kEAAkE;IAClE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAuB,UAAU;IACrE,OAAO;QACL,EAAE,EAAE,WAAW;QACf,MAAM,EAAE,gBAAgB;QACxB,KAAK,CAAC,OAAO,CAAC,UAA8B;YAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC3E,uEAAuE;gBACvE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,mEAAmE;gBACrE,CAAC;gBACD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../../src/write/vectors/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,qBAAqB,EAAE;QACrB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,KAAK,CAAC;QACjB,KAAK,EACH,+EAA+E;YAC/E,kFAAkF;YAClF,0EAA0E;YAC1E,oDAAoD;KACvD;IACD,2BAA2B,EAAE;QAC3B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,KAAK,EACH,yFAAyF;YACzF,qFAAqF;YACrF,0FAA0F;YAC1F,mFAAmF;YACnF,2FAA2F;YAC3F,4FAA4F;YAC5F,4FAA4F;YAC5F,4EAA4E;KAC/E;CACF,CAAC;AAaF,SAAS,UAAU,CACjB,QAAgB,EAChB,SAAiB,EACjB,UAAkB;IAElB,4EAA4E;IAC5E,qEAAqE;IACrE,kEAAkE;IAClE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAuB,UAAU;IACrE,OAAO;QACL,EAAE,EAAE,WAAW;QACf,MAAM,EAAE,gBAAgB;QACxB,KAAK,CAAC,OAAO,CAAC,UAA8B;YAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC3E,uEAAuE;gBACvE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,mEAAmE;gBACrE,CAAC;gBACD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -26,7 +26,7 @@ import { DatabaseSync } from "node:sqlite";
26
26
  import { readDatabaseVersion } from "../../db/fingerprint.js";
27
27
  import { addDaysIso, decodePackedDate, encodePackedDate, encodeReminderTime, localToday, } from "../../model/dates.js";
28
28
  import { decodeRecurrenceRule } from "../../model/recurrence.js";
29
- import { resolveResolutionInstant } from "../commands.js";
29
+ import { assertContainerRef, resolveResolutionInstant } from "../commands.js";
30
30
  import { computeReorderPre, resolveArea, resolveHeading, resolveProject, resolveTag, } from "../pre-state.js";
31
31
  import { fixedSpawnPlan, isIsoDate } from "../repeat-anchor.js";
32
32
  import { composeRepeatRuleSpec, ruleXml } from "../recurrence-rule-blob.js";
@@ -212,8 +212,13 @@ function scheduleColumns(when, todayIso, hasContainer) {
212
212
  }
213
213
  }
214
214
  function containerUuid(sim, ref, kind) {
215
- if (ref === undefined || (ref.uuid === undefined && ref.title === undefined))
215
+ // Presence, not a duck-test the same law the engine's own `containerGiven`
216
+ // follows (#580): a present ref that names neither a uuid nor a title THROWS
217
+ // instead of reading as "no container", so the simulator can never model a
218
+ // placement-free create for a caller who asked for a placement.
219
+ if (ref === undefined || ref === null)
216
220
  return null;
221
+ assertContainerRef(ref);
217
222
  const res = kind === "project" ? resolveProject(sim, ref) : resolveArea(sim, ref);
218
223
  if (res.resolved === null)
219
224
  throw new Error(`simulator: unresolved ${kind} reference`);