{"version":3,"sources":["../../src/react/index.ts","../../src/react/hooks.ts","../../src/core/recordChanges.ts","../../src/store.generated.ts","../../src/results.ts","../../src/core/pgError.ts","../../src/core/primedBundle.ts","../../src/core/transient.ts","../../src/core/doorCall.ts","../../src/core/doors.ts","../../src/recordType.ts","../../src/aggregate.ts","../../src/archive.ts","../../src/record.ts","../../src/subscription.ts","../../src/rowLabel.ts","../../src/relation.ts","../../src/formulaLook.ts","../../src/ops.ts","../../src/scopes/types.ts","../../src/scopes/codec.ts","../../src/scopes/rules.ts","../../src/scopes/doors.ts","../../src/core/pickListDoors.ts","../../src/choice.ts","../../src/placement.ts","../../src/level.ts","../../src/core/keysetCursor.ts","../../src/table.ts","../../src/grid.ts","../../src/core/supabase.ts","../../src/drill.ts","../../src/core/query.ts","../../src/core/client.ts","../../src/relativeDays.ts","../../src/react/dataCache.ts","../../src/react/seed.tsx","../../src/core/seed.ts","../../src/react/hold.tsx","../../src/react/pageOrder.ts","../../src/react/entity-reference.ts","../../src/react/useTypedTable.ts","../../src/core/clientInOrganization.ts","../../src/core/declareTable.ts","../../src/typed-table/ensure.ts","../../src/typed-table/confidential.ts","../../src/typed-table/rows.ts","../../src/react/useStoreTable.ts","../../src/typed-table/store-table.ts","../../src/data/table-port.ts","../../src/button.ts","../../src/newerKinds.ts","../../src/typedDate.ts","../../src/typedNumber.ts","../../src/coerce.ts","../../src/data/columns.ts","../../src/data/filter.ts","../../src/data/types.ts","../../src/typed-table/define.ts","../../src/typed-table/graduate.ts","../../src/typed-table/archive.ts","../../src/typed-table/check.ts","../../src/vocabulary.ts","../../src/field.ts","../../src/retype.ts","../../src/autonumber.ts","../../src/typedMatch.ts","../../src/pipeline.ts","../../src/rule.ts","../../src/portal.ts","../../src/rowControls.ts","../../src/automation.ts","../../src/base.ts","../../src/capture-queue.ts","../../src/objectOrganization.ts","../../src/record-scope.ts","../../src/table-kind.ts","../../src/table-kind-mapping.json","../../src/alternates.ts","../../src/datedValues.ts","../../src/ai-field-presets.ts"],"sourcesContent":["\"use client\";\n\n// src/react/index.ts — @ai-matrx/records\nexport { RecordsProvider, useRecordsClient, useOptionalRecordsClient, useRecordsActor, type RecordsProviderProps } from \"./context\";\nexport {\n  useTable,\n  useTables,\n  useFields,\n  useReverseColumns,\n  useReverseLinks,\n  tableShapeChanged,\n  useRecords,\n  useRecordPage,\n  useRecord,\n  useRecordChangeRevision,\n  useRecordWrites,\n  useRecordMutation,\n  useTableArchive,\n  useFieldMutation,\n  useEntityFields,\n  useEntityRecord,\n  useEntityBackLinks,\n  useEntityTable,\n  useEntityFieldRights,\n  useRowActions,\n  useEntityFieldMutation,\n  useMergeField,\n  useMyLevel,\n  useMyLevels,\n  useSeededAnswer,\n  useSeededAnswerAt,\n  useSeededAggregate,\n  type UseRecordsOptions,\n  type UseRecordOptions,\n  type UseRecordsState,\n  type UseRecordPageOptions,\n  type UseRecordPageState,\n  type RecordPageData,\n  type UseRecordMutation,\n  type UseTableArchive,\n  type UseFieldMutation,\n  type UseEntityFieldMutation,\n  type UseEntityBackLinks,\n} from \"./hooks\";\nexport { RecordsHoldScope, useRecordsHold } from \"./hold\";\nexport { RecordsSeedProvider, SEED_FRESH_MS, useSeededSource, type RecordsSeedProviderProps } from \"./seed\";\nexport { RECORDS_CACHE_GRACE_MS, recordsCacheCounters } from \"./dataCache\";\nexport { useEntityReferenceKinds, useEntityReferenceSearch, useEntityReferenceWords, type EntityReferenceRead } from \"./entity-reference\";\nexport { useTypedTable, type UseTypedTable, type UseTypedTableOptions } from \"./useTypedTable\";\nexport { useStoreTable, type UseStoreTable } from \"./useStoreTable\";\nexport * from \"../typed-table\";\nexport * from \"../index\";\n","\"use client\";\n\n// src/react/hooks.ts — @ai-matrx/records\n//\n// The hooks. Each one is a thin, honest wrapper over `/core`: it holds loading,\n// data and REFUSAL, and it never converts a refusal into an empty answer. A\n// screen that rendered \"no records\" because the door refused would be the lie\n// this package exists to prevent, so every hook's state carries `error` with the\n// store's own sentence in it, and a UI that ignores it is the UI's defect, not\n// a hidden one.\n\nimport { use, useCallback, useEffect, useId, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport { isRecordRemoved, onRecordChanged } from \"../core/recordChanges\";\nimport { DOORS, doorReady } from \"../core/doors\";\n\nimport type { Field, FieldPatch, NewFieldDeclaration } from \"../field\";\nimport { EVERY_RECORD_TYPE, fieldAppliesToEveryType } from \"../recordType\";\nimport type { ReverseColumn, ReverseLinks } from \"../relation\";\nimport type {\n  EntityFieldRights,\n  EntityBackLinkItem,\n  EntityBackLinks,\n  EntityRecordRead,\n  EntityTableFacts,\n  NewEntityFieldDeclaration,\n} from \"../entity-field\";\nimport type { MergeFieldResolution } from \"../merge-field\";\nimport { stableFilterKey, type StoreFilter } from \"../aggregate\";\nimport type { MyLevel, PermissionLevel } from \"../level\";\nimport type { ReadRow, RecordPageSort, RecordRead, Uuid } from \"../record\";\nimport type { AggregateRow } from \"../aggregate\";\nimport type { RecordsError } from \"../results\";\nimport type { Table, TableArchiveProgress } from \"../table\";\nimport type { RowAction } from \"../grid\";\nimport { TABLE_ARCHIVE_PASS, asWriteConflict, type RecordsClient } from \"../core/client\";\nimport type { WriteConflict } from \"../results\";\nimport { useRecordsClient } from \"./context\";\nimport { acquireEntry, entryFor, identityOf, pinToHold, releaseEntry, seedEntry, type CacheEntry, type EntryLive } from \"./dataCache\";\nimport { useSeedStore } from \"./seed\";\nimport { useHoldKey } from \"./hold\";\nimport { pageOrderOf, patchMovesRows, type PageOrder } from \"./pageOrder\";\n\ninterface Async<T> {\n  data: T | null;\n  loading: boolean;\n  /** The store's own refusal. Never null-and-empty at the same time. */\n  error: RecordsError | null;\n  reload: () => void;\n  /**\n   * Replace what is held WITHOUT a round trip — for a caller that has just read fresher rows\n   * through the SAME door and would otherwise throw them away and read the page again.\n   * It is never a way to put un-doored data on a screen: everything handed in here came back\n   * from a door that applied the ladder.\n   */\n  setData: (update: (current: T | null) => T | null) => void;\n}\n\n/**\n * ONE QUESTION, ONE ENTRY — AND THE ENTRY IS THE DATA LAYER'S, NOT THE VIEW'S (owner, 2026-10-02).\n *\n * A table page mounts the same hook in several siblings at once (DOOR-SPEED, 2026-09-25: the\n * table list was fetched six times per load), and a board tile sleeps and wakes, or is removed\n * and brought back by Undo. Every hook here reads its answer from ONE cache entry per\n * (data source, who is asking, `key`) — `dataCache.ts`: siblings share it, a wake or a remount\n * inside the grace finds it as it was (zero reads), and its live half (realtime, this page's\n * own write announcements) belongs to the entry, opened once and closed once. `reload()` asks\n * the door again and every reader of the entry gets the fresh answer. A refusal is never kept\n * for the next reader. Under `<RecordsHoldScope>` the entry is pinned for as long as the host's\n * hold lives, so a sleeping view stays current while it sleeps.\n */\nfunction useAsync<T>(\n  run: (client: RecordsClient) => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n  key: string,\n  live?: EntryLive<T> | null,\n): Async<T> {\n  const client = useRecordsClient();\n  const holdKey = useHoldKey();\n  const slot = useId();\n  // Found or made during render, so a cached answer draws on the FIRST frame of a wake or a\n  // remount. Reading is what the acquire below does — rendering never touches the network.\n  // On the server there is no cache to share between requests: each render gets its own entry.\n  const entry = useMemo(\n    () => (typeof window === \"undefined\" ? serverEntry(run, client) : entryFor<T>(client, key, run, live ?? null)),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [client, key],\n  );\n  entry.run = run;\n  entry.client = client;\n  // THE SERVER'S ANSWER IN THE FIRST PASS (lane SSR-ROWS, `seed.tsx`): under a page seed, a question\n  // nobody has answered yet is run against the seed — on the server and while hydrating — and drawn\n  // from it. A miss leaves the entry as it was: \"loading\" in both passes, asked after hydration.\n  // EVERY HOOK SUSPENDS ON ITS SEED RUN WHILE THE SEED IS LIVE — whatever its entry holds (lane\n  // SSR-ROWS-2). React matches a component's awaited promises by their ORDER: a hook that skipped its\n  // `use` once its answer reached the shared cache moved the next hook's promise into its place, and\n  // React handed that hook the previous hook's answer (the grid drew a level list as its rows:\n  // `sortIgnored` undefined). The run is one promise per question per seed, so this costs nothing.\n  const seed = useSeedStore();\n  if (seed) {\n    const outcome = use(seed.run<T>(`${identityOf(client)}|${key}`, run, client.config));\n    if (outcome.seeded && entry.snapshot.data === null && !entry.snapshot.error) seedEntry(entry, outcome.data, outcome.stale);\n  }\n  const snapshot = useSyncExternalStore(entry.subscribe, entry.getSnapshot, entry.getSnapshot);\n\n  useEffect(() => {\n    acquireEntry(entry);\n    return () => releaseEntry(entry);\n  }, [entry]);\n  // A pin outlives this hook's effects on purpose: a sleeping view has none, and its data must\n  // stay open and live until the host's hold says the view is really gone.\n  useEffect(() => {\n    if (holdKey) pinToHold(holdKey, slot, entry as CacheEntry<unknown>);\n  }, [holdKey, slot, entry]);\n\n  // A NEW QUESTION KEEPS THE LAST ANSWER ON SCREEN UNTIL ITS OWN LANDS — the next page, a shape\n  // revision, a new filter — exactly as the hook did when it held its own state. Never a flash of\n  // nothing between two answers.\n  const lastData = useRef<T | null>(null);\n  if (snapshot.data !== null) lastData.current = snapshot.data;\n  const shown =\n    snapshot.data === null && snapshot.loading && !snapshot.error && lastData.current !== null\n      ? { ...snapshot, data: lastData.current }\n      : snapshot;\n\n  const reload = useCallback(() => entry.refetch(), [entry]);\n  const setData = useCallback((update: (current: T | null) => T | null) => entry.setData(update), [entry]);\n  return { ...shown, reload, setData };\n}\n\n/**\n * THE SERVER'S ANSWER TO A SCREEN'S OWN QUESTION, IN THE FIRST PASS (lane SSR-ROWS).\n *\n * For a screen that holds a read in its OWN state (filled by an effect) rather than in a records\n * hook: under a live page seed (`<RecordsSeedProvider>`), `run` is run against the seed — suspending\n * on the server and while hydrating, never touching the network — and its answer is returned so the\n * screen can START from it (`useState(() => seeded ?? …)`) and skip its first effect read. Without a\n * seed, or when `run` asks a door the seed does not hold, it answers `undefined` and the screen reads\n * exactly as before. Never cached beyond the seed: a later mount asks for itself.\n */\nexport function useSeededAnswer<T>(\n  key: string | null,\n  run: (client: RecordsClient) => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n): T | undefined {\n  return useSeededAnswerAt(key, run)?.data;\n}\n\n/**\n * `useSeededAnswer`, with when the server asked (epoch ms). A screen that starts from the answer keeps\n * that moment: while the answer is that young, a records client REBUILT underneath it (the active\n * organization resolving, a token refresh) is not a new question — the screen's question did not change —\n * so it reads nothing (lane SEED-ENTITY, charts asking again 4-7 s in).\n */\nexport function useSeededAnswerAt<T>(\n  key: string | null,\n  run: (client: RecordsClient) => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n): { data: T; at: number } | undefined {\n  const client = useRecordsClient();\n  const seed = useSeedStore();\n  if (!seed || key === null) return undefined;\n  const outcome = use(seed.run<T>(`${identityOf(client)}|own:${key}`, run, client.config));\n  return outcome.seeded ? { data: outcome.data, at: seed.at } : undefined;\n}\n\n/**\n * A TILE'S NUMBER FROM THE SERVER'S SEED (lane SEED-ENTITY): the rows of `custom.record_aggregate`\n * for `spec` over `tableId`, when the page seed holds that exact question (`askTileSeed`, records-ui\n * `/first-page`); else `undefined` and the tile reads for itself. Asks through `client.recordAggregate`,\n * so the arguments are exactly the ones the tile's own read sends.\n */\nexport function useSeededAggregate(\n  tableId: Uuid | null,\n  spec: Omit<Parameters<RecordsClient[\"recordAggregate\"]>[0], \"table_id\">,\n): AggregateRow[] | undefined {\n  return useSeededAnswer<AggregateRow[]>(tableId ? `aggregate:${tableId}:${JSON.stringify(spec)}` : null, (client) =>\n    client.recordAggregate({ table_id: tableId as Uuid, ...spec }),\n  );\n}\n\n/** A server render's throwaway entry: no cache crosses requests, and nothing is read there. */\nfunction serverEntry<T>(\n  run: (client: RecordsClient) => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n  client: RecordsClient,\n): CacheEntry<T> {\n  const entry: CacheEntry<T> = {\n    key: \"server\",\n    snapshot: { data: null, loading: true, error: null },\n    run,\n    client,\n    subscribe: () => () => {},\n    // Read through the entry: a page seed may answer it during this render (`seedEntry`).\n    getSnapshot: () => entry.snapshot,\n    refetch: () => {},\n    setData: () => {},\n  };\n  return entry;\n}\n\n/** One Table's declaration. */\nexport function useTable(tableId: Uuid | null): Async<Table | null> {\n  // A TABLE'S OWN DECLARATION MOVES WITH ITS SHAPE: its row label (`title_field`), its name, its\n  // sort. Every screen holding it re-reads on the same nudge its columns do (`tableShapeChanged`,\n  // or the realtime port's table notice), so an open record panel names its record by the new\n  // label the moment it changes — never only once reopened (merge-lane finding, 2026-09-26).\n  const revision = useShapeRevision(tableId);\n  useEffect(() => {\n    if (tableId) registerShapeInterest(tableId);\n  }, [tableId]);\n  return useAsync<Table | null>(\n    async (client) => {\n      if (!tableId) return { ok: true, data: null };\n      // ONE Table, read by id — never the whole list searched for it (the list stops at 500).\n      return client.tableRead({ table_id: tableId });\n    },\n    tableId ? `table:${tableId}:${revision}` : \"table:none\",\n  );\n}\n\n/** Every Table this person can see in this organization. */\nexport function useTables(): Async<Table[]> {\n  return useAsync((client) => client.tableList(), \"tables\");\n}\n\n/**\n * WHAT THIS PERSON MAY DO TO THESE THINGS — one call for a whole page.\n *\n * A screen asks this BEFORE it draws a control, which is the whole difference\n * between a product that offers what you may use and one that offers everything\n * and apologises afterwards. The ids are joined into the dependency key so a\n * page that re-renders with the same rows does not re-ask.\n *\n * `null` for a subject is an ANSWER (\"you hold nothing on this\"), and `loading`\n * is a third state that is neither — a caller that treated loading as \"no\"\n * would blink every control off on every reload.\n */\nexport function useMyLevels(ids: Uuid[]): Async<Record<string, PermissionLevel | null>> {\n  const key = ids.join(\",\");\n  return useAsync<Record<string, PermissionLevel | null>>(\n    async (client) => {\n      const asked = key === \"\" ? [] : key.split(\",\");\n      const answered = await client.myLevels({ ids: asked });\n      if (!answered.ok) return answered;\n      const held: Record<string, PermissionLevel | null> = {};\n      for (const row of answered.data as MyLevel[]) held[row.id] = row.level;\n      return { ok: true, data: held };\n    },\n    `levels:${key}`,\n  );\n}\n\n/** The same question about one thing. */\nexport function useMyLevel(id: Uuid | null): Async<PermissionLevel | null> {\n  return useAsync<PermissionLevel | null>(\n    async (client) => {\n      if (!id) return { ok: true, data: null };\n      const answered = await client.myLevels({ ids: [id] });\n      if (!answered.ok) return answered;\n      return { ok: true, data: answered.data[0]?.level ?? null };\n    },\n    id ? `level:${id}` : \"level:none\",\n  );\n}\n\n/**\n * WHEN A TABLE'S SHAPE CHANGES, EVERY SCREEN LOOKING AT THAT TABLE HEARS IT.\n *\n * A table's columns are read by more than one thing at once: the grid draws\n * them, the field rail lists them, a form builder offers them, a filter picks\n * among them. Each of those calls `useFields(tableId)` and each gets its OWN\n * copy, so a column added in one of them left the others drawing a table that\n * no longer exists until somebody reloaded the page.\n *\n * That is exactly what a practitioner met on 2026-09-21: \"Add field\" succeeded,\n * the panel closed on a confirmed read-back — and the grid beside it did not\n * show the column until a full reload. The screen was not lying (the column WAS\n * made) but it was showing a table that was already out of date, which is the\n * same thing to the person looking at it.\n *\n * The fix is one table-scoped revision per table id. `useFields` subscribes;\n * every door that changes a table's shape ticks it; every listener re-reads\n * THROUGH THE DOOR, because a tick is a nudge and never data. It is deliberately\n * the same shape as the realtime port's contract, so a host that binds realtime\n * and a host that does not behave identically here — a shape change is heard\n * either way, and realtime only makes it travel between browsers.\n *\n * It lives at module scope because the consumers are siblings in the tree with\n * no common owner below the mount, and a context would have made every screen\n * that reads a column re-render when any other table changed.\n */\nconst shapeRevisions = new Map<string, number>();\nconst shapeListeners = new Set<() => void>();\n\n/** Tell every screen looking at this table to read its columns again. */\n/** Every shape change anywhere in this app, counted: a reverse column on B is made by a column on A. */\nlet anyShapeRevision = 0;\n\nexport function tableShapeChanged(tableId: Uuid): void {\n  shapeRevisions.set(tableId, (shapeRevisions.get(tableId) ?? 0) + 1);\n  anyShapeRevision += 1;\n  for (const listener of shapeListeners) listener();\n}\n\n/**\n * A table a screen is looking at RIGHT NOW. Registering on read is what makes\n * \"tell everyone\" mean \"tell the few tables actually on screen\" — without it,\n * the only tables anyone knew about were the ones that had already changed.\n */\nfunction registerShapeInterest(tableId: Uuid): void {\n  if (!shapeRevisions.has(tableId)) shapeRevisions.set(tableId, 0);\n}\n\nfunction subscribeToShape(listener: () => void): () => void {\n  shapeListeners.add(listener);\n  return () => {\n    shapeListeners.delete(listener);\n  };\n}\n\n/** The current revision for one table — the dependency `useFields` re-reads on. */\nfunction useShapeRevision(tableId: Uuid | null): number {\n  const read = useCallback(() => (tableId ? (shapeRevisions.get(tableId) ?? 0) : 0), [tableId]);\n  // The server has no revisions and must not disagree with the first client\n  // render, so it is always 0 there.\n  return useSyncExternalStore(subscribeToShape, read, () => 0);\n}\n\n/**\n * FLD-10. The Fields that APPLY — the store decides, from the record type, and\n * the client asks rather than filtering a list it has.\n *\n * Re-reads whenever this table's shape changes anywhere in the app — see\n * `tableShapeChanged`.\n */\nexport function useFields(tableId: Uuid | null, recordType?: string): Async<Field[]> {\n  const revision = useShapeRevision(tableId);\n  useEffect(() => {\n    if (tableId) registerShapeInterest(tableId);\n  }, [tableId]);\n  // ONE READ FOR THE TABLE'S OWN SCREENS AND FOR \"NO TYPE\" (CLOSE-CORE CD-CORE-15). Asked with no type the\n  // store answers the columns every record has — exactly the columns of EVERY_RECORD_TYPE's answer that name\n  // no record types — so both questions share the one '*' read (same cache entry, no second round trip) and\n  // the no-type answer is that read with the typed columns left out. A record's own type is still the store's\n  // own question (it matches a type by its word, key or option id).\n  const shared = recordType === undefined || recordType === EVERY_RECORD_TYPE;\n  const asked = useAsync<Field[]>(\n    async (client) => {\n      if (!tableId) return { ok: true, data: [] };\n      return client.fields({ table_id: tableId, recordType: shared ? EVERY_RECORD_TYPE : recordType });\n    },\n    tableId ? `fields:${tableId}:${shared ? EVERY_RECORD_TYPE : recordType}:${revision}` : \"fields:none\",\n  );\n  const every = asked.data;\n  const untyped = useMemo(() => (every ? every.filter(fieldAppliesToEveryType) : null), [every]);\n  return recordType === undefined ? { ...asked, data: untyped } : asked;\n}\n\n/**\n * A data source that THROWS (a dropped connection, a replay fixture that never recorded this door)\n * becomes this read's refusal, said in the result — never an unhandled rejection that takes the\n * whole screen's test run or error report with it. The screen decides what a refusal shows.\n */\nasync function answerOrRefusal<T>(\n  ask: () => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n  where: string,\n): Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }> {\n  try {\n    return await ask();\n  } catch (thrown) {\n    return {\n      ok: false,\n      error: {\n        code: \"not_supported\",\n        message: `The record store could not be asked (${where}): ${thrown instanceof Error ? thrown.message : String(thrown)}`,\n      } as RecordsError,\n    };\n  }\n}\n\n/**\n * VIEWS-AND-FIELDS BL (REL-9). The REVERSE COLUMNS of a Table — one per relation column elsewhere\n * that links here (`client.reverseColumns`). Virtual: never in `useFields`. Re-read when any\n * table's shape changes in this app, because a new link column on ANOTHER table makes one here.\n */\nexport function useReverseColumns(tableId: Uuid | null): Async<ReverseColumn[]> {\n  const revision = useSyncExternalStore(subscribeToShape, () => anyShapeRevision, () => 0);\n  return useAsync<ReverseColumn[]>(\n    async (client) => {\n      // ONLY A DOOR THE STORE HAS IS ASKED: before the chair's apply production lacks it, and a\n      // call there would log `door_absent` on every grid. Absent → no reverse column, no call.\n      if (!tableId || !doorReady(client.config, DOORS.reverseColumns)) return { ok: true, data: [] };\n      return answerOrRefusal(() => client.reverseColumns({ table_id: tableId }), \"reverseColumns\");\n    },\n    tableId ? `reverse-columns:${tableId}:${revision}` : \"reverse-columns:none\",\n  );\n}\n\n/**\n * A page of records' links through each of `columns`, `limit` a record (1–50): `{ [column key]:\n * { [record id]: { total, links } } }`. One `reverseLinksMany` per column, shared between every\n * screen asking the same question, and re-read after any write this page makes — a link is made\n * from the OTHER table's side, so no row here changes when it is.\n */\nexport function useReverseLinks(\n  tableId: Uuid | null,\n  columns: readonly ReverseColumn[],\n  recordIds: readonly Uuid[],\n  limit = 3,\n  offset = 0,\n): Async<Record<string, Record<string, ReverseLinks>>> {\n  const [writes, setWrites] = useState(0);\n  useEffect(() => onRecordChanged(() => setWrites((n) => n + 1)), []);\n  const idsKey = recordIds.join(\",\");\n  const columnsKey = columns.map((c) => c.source_field_id).join(\",\");\n  return useAsync<Record<string, Record<string, ReverseLinks>>>(\n    async (client) => {\n      if (!tableId || columns.length === 0 || recordIds.length === 0 || !doorReady(client.config, DOORS.reverseLinksMany)) {\n        return { ok: true, data: {} };\n      }\n      const out: Record<string, Record<string, ReverseLinks>> = {};\n      // ONE CALL FOR EVERY REVERSE COLUMN of the page (`custom.reverse_links_many_fields`); a store that\n      // does not have the door is asked once per column, as before.\n      const all = await answerOrRefusal(\n        () => client.reverseLinksFields({ table_id: tableId, source_field_ids: columns.map((c) => c.source_field_id), record_ids: recordIds, limit, offset }),\n        \"reverseLinksFields\",\n      );\n      if (all.ok) {\n        for (const c of columns) out[c.key] = all.data[c.source_field_id] ?? {};\n        return { ok: true, data: out };\n      }\n      if (all.error.code !== \"door_absent\") return all;\n      const answers = await Promise.all(\n        columns.map((c) =>\n          answerOrRefusal(\n            () => client.reverseLinksMany({ table_id: tableId, source_field_id: c.source_field_id, record_ids: recordIds, limit, offset }),\n            \"reverseLinksMany\",\n          ),\n        ),\n      );\n      for (let i = 0; i < columns.length; i += 1) {\n        const answer = answers[i]!;\n        if (!answer.ok) return answer;\n        out[columns[i]!.key] = answer.data;\n      }\n      return { ok: true, data: out };\n    },\n    tableId ? `reverse-links:${tableId}:${columnsKey}:${limit}:${offset}:${idsKey}:${writes}` : \"reverse-links:none\",\n  );\n}\n\nexport interface UseRecordsOptions {\n  pageSize?: number;\n  page?: number;\n  /**\n   * THE STORE'S ONE FILTER SHAPE. Left out, this is the whole page. Supplied,\n   * the store narrows in its own query and the hook re-reads when the question\n   * changes — it is never filtered in the browser, which could only ever filter\n   * the rows it had already been handed and would silently drop the rest.\n   *\n   * This is what makes a dashboard number walkable: the same object that\n   * counted it opens it.\n   */\n  filter?: StoreFilter;\n}\n\nexport interface UseRecordsState extends Async<{ rows: ReadRow[]; total: number | null; locked?: number }> {\n  /**\n   * Whether this list is actually live. FALSE with a reason is an answer a\n   * screen can print; a list that silently stopped updating is not.\n   */\n  live: boolean;\n  liveReason: string;\n}\n\n/**\n * THE LIVE HALF OF A PAGE OF ROWS, shared by `useRecords` and `useRecordPage`: a realtime notice is a\n * NUDGE, never data. The ids it names are re-read through the read door and patched into the page\n * this reader already holds; only a row the page does not hold (a colleague's new one) costs a\n * page read, because only the page door knows where it belongs in the order.\n */\nfunction liveRowsFor<P extends { rows: ReadRow[] }>(tableId: Uuid | null, order: PageOrder = { sortFields: [], narrowed: false }): EntryLive<P> {\n  return (entry) => {\n    const client = entry.client;\n    const realtime = client.config.realtime;\n    if (!tableId) return null;\n    /*\n     * RE-READ ONLY WHAT MOVED, through the SAME door with the same ladder. A row that comes back\n     * replaces the one on screen; a named id that does NOT come back is a record this reader may no\n     * longer see (deleted, or unshared), so it leaves the page — which is exactly what the page\n     * read would have done by omission.\n     */\n    const patchIds = async (ids: readonly Uuid[]): Promise<void> => {\n      const answered = await entry.client.listByIds({ table_id: tableId, ids: [...ids] });\n      if (!answered.ok) {\n        // NOTHING FAILS SILENTLY, and the fallback is the correct read rather than a\n        // stale screen: if the subset read refuses, read the page.\n        entry.refetch();\n        return;\n      }\n      const fresh = new Map(answered.data.map((row) => [row.id, row]));\n      const held = entry.snapshot.data?.rows ?? [];\n      const onThisPage = (id: Uuid): boolean => held.some((row) => row.id === id);\n      // A RECORD THE PAGE DOES NOT HOLD AND THE DOOR DID ANSWER FOR IS NEW TO THIS\n      // READER — a colleague's first row, or one that has just been shared. Only the\n      // PAGE door knows where it belongs in the order, so this does not guess: it asks\n      // for the page. Everything else is a replacement in place and costs nothing.\n      const needsThePage = ids.some((id) => !onThisPage(id) && fresh.has(id));\n      if (needsThePage) {\n        entry.refetch();\n        return;\n      }\n      /*\n       * A ROW WHOSE PLACING VALUE CHANGED IS NOT PATCHED IN PLACE (SORT-REACTS, 2026-10-07). The\n       * store sorts, filters and groups the page; patching the new value into the old index left an\n       * edited date where it was until a reload. Only the page door knows the new place: ask it\n       * (the old page stays on screen until it lands, and the one that matters is the store's).\n       */\n      if (patchMovesRows(held, fresh, order)) {\n        entry.refetch();\n        return;\n      }\n      entry.setData((current) =>\n        current === null\n          ? current\n          : {\n              ...current,\n              rows: current.rows\n                .filter((row) => !(ids.includes(row.id) && !fresh.has(row.id)))\n                .map((row) => fresh.get(row.id) ?? row),\n            },\n      );\n    };\n    /*\n     * A WRITE THIS PAGE MADE MOVES THE WORKED-OUT COLUMNS (a rollup, a lookup, a formula keep no\n     * value in the record — the store works them out on every read). The write's own answer carries\n     * the changed record only, so a rollup over the rows of ANOTHER table (or a formula over a\n     * sibling cell) read \"—\" or its old total until a reload. Every record this page writes (no\n     * realtime port needed — `announceRecordChanged`) re-reads the rows this page holds, once per\n     * burst: the ids are the held ones, through the same subset door as a realtime notice.\n     */\n    /*\n     * THE RECORD THE WRITE NAMED IS ASKED TOO (Spaces new-row refresh, 2026-10-08). Only the held ids\n     * were re-read, so a row ADDED on this page (the grid's \"New\", a duplicate, a form, a peek) was\n     * never asked: on an empty table nothing was read at all and the grid said \"No records yet\" over\n     * the row it had just written, until a reload. The named id joins the subset read; the subset door\n     * answers it only when it lives in THIS table, and an answered id the page does not hold costs the\n     * page read (`needsThePage`) — so the new row lands in the store's own order.\n     */\n    let timer: ReturnType<typeof setTimeout> | null = null;\n    const written = new Set<Uuid>();\n    const stopLocal = onRecordChanged((changed) => {\n      written.add(changed);\n      if (timer !== null) clearTimeout(timer);\n      timer = setTimeout(() => {\n        timer = null;\n        const ids = [...new Set([...(entry.snapshot.data?.rows ?? []).map((row) => row.id), ...written])];\n        written.clear();\n        // A subset read that THROWS (a transport fault, not a refusal) falls back to the page read\n        // like a refusal does — never an unhandled rejection from a timer nobody awaits.\n        if (ids.length > 0) patchIds(ids).catch(() => entry.refetch());\n      }, 250);\n    });\n    const stopRealtime = (() => {\n      // No organization (the host's home lists across all of them) = no per-organization topic.\n      if (!realtime || !client.config.organizationId) return null;\n      /*\n       * THE SUBSCRIPTION BELONGS TO THE ENTRY, NOT TO A VIEW (owner, 2026-10-02). It is opened when\n       * the first reader acquires this page and closed when the entry closes — never per mount, per\n       * wake or per edit (lane RENDER-AUDIT, 2026-09-26, closed the per-edit half of the same\n       * class). Which rows the page holds is read from the entry at the moment a notice lands, and\n       * a notice that lands while every view of it sleeps patches the entry they will wake to.\n       */\n      return realtime.subscribeRecords(\n        { organization_id: client.config.organizationId, table_id: tableId },\n        {\n          records(ids) {\n            // `null` is the store SAYING it cannot name them — a reconnect, a tab wake, or more\n            // ids than it will list. That is the one case that costs a whole page.\n            if (ids === null) {\n              entry.refetch();\n              return;\n            }\n            if (ids.length === 0) return;\n            patchIds(ids).catch(() => entry.refetch());\n          },\n          shape() {\n            // A COLUMN IS NOT A ROW. Re-reading the rows would redraw the same table without\n            // the new column in it. The package owns this: a host never reaches around the port.\n            tableShapeChanged(tableId);\n          },\n        },\n      );\n    })();\n    return () => {\n      if (timer !== null) clearTimeout(timer);\n      stopLocal();\n      if (typeof stopRealtime === \"function\") stopRealtime();\n    };\n  };\n}\n\nfunction liveStatus(client: RecordsClient, tableId: Uuid | null): { live: boolean; liveReason: string } {\n  const realtime = client.config.realtime;\n  const live = Boolean(realtime && tableId);\n  const liveReason = realtime\n    ? tableId\n      ? \"Live: changes to this table re-read through the read door.\"\n      : \"Not live: no table selected.\"\n    : \"Not live: this host bound no realtime port, so this list updates when you reload it.\";\n  return { live, liveReason };\n}\n\n/**\n * 🚨 A REFUSED RE-READ NEVER EMPTIES THE SCREEN (merged-grid review 2026-09-26). A page read the\n * store refused — a sort it cannot do, a filter it will not ask — used to set the rows to nothing,\n * and the grid then said \"No records yet — Add the first row\" over a table that has rows, with\n * \"Unknown total\" beside it. The last page this table answered stays; the refusal travels beside\n * it in `error`, in the store's own words, for the screen to say.\n */\nfunction useKeptPage<P>(tableId: Uuid | null, base: Async<P>): Async<P> {\n  const lastGood = useRef<{ tableId: Uuid | null; data: P } | null>(null);\n  if (base.data !== null && !base.error) lastGood.current = { tableId, data: base.data };\n  if (base.error && base.data === null && lastGood.current && lastGood.current.tableId === tableId) {\n    return { ...base, data: lastGood.current.data };\n  }\n  return base;\n}\n\n/**\n * 🚨 A RE-READ PAGE KEEPS EVERY ROW THAT DID NOT CHANGE (lane RENDER-AUDIT, 2026-09-26).\n *\n * The store answers a page read with fresh objects for every row, even the ones nobody touched —\n * so a page read after ONE cell was written (the write door's own re-read, a reconnect, a\n * colleague's new row) handed a grid a new object for every record, and a grid that draws a row\n * only when its record changed drew every row again. A row the store answered exactly as before\n * (same id, same everything it carries) keeps the object the screen already holds; a changed one\n * is the new object. What is on the screen is still exactly what the door answered.\n */\nfunction sameRowAnswer(a: ReadRow, b: ReadRow): boolean {\n  if (a === b) return true;\n  if (a.id !== b.id) return false;\n  try {\n    return JSON.stringify(a) === JSON.stringify(b);\n  } catch {\n    return false;\n  }\n}\n\nfunction useSharedRows<P extends { rows: ReadRow[] }>(state: Async<P>): Async<P> {\n  const held = useRef<{ source: P | null; shared: P | null; byId: Map<string, ReadRow> }>({\n    source: null,\n    shared: null,\n    byId: new Map(),\n  });\n  const data = state.data;\n  if (data === null) return state;\n  const memo = held.current;\n  if (memo.source === data && memo.shared !== null) return { ...state, data: memo.shared };\n  let reused = 0;\n  const rows = data.rows.map((row) => {\n    const before = memo.byId.get(row.id);\n    if (before && sameRowAnswer(before, row)) {\n      reused += 1;\n      return before;\n    }\n    return row;\n  });\n  const shared = reused === 0 ? data : ({ ...data, rows } as P);\n  held.current = { source: data, shared, byId: new Map(rows.map((row) => [row.id, row])) };\n  return { ...state, data: shared };\n}\n\n/** A page of records, realtime-aware when the host bound the port. */\nexport function useRecords(tableId: Uuid | null, options: UseRecordsOptions = {}): UseRecordsState {\n  const pageSize = options.pageSize ?? 50;\n  const page = options.page ?? 0;\n  const filterKey = stableFilterKey(options.filter);\n  // A NEW COLUMN'S VALUES LOAD WITH IT (CHAIR-UI-STORE item 4, 2026-10-03): a worked-out column\n  // added a moment ago read \"—\" on every row until a reload, because the page held rows read\n  // before the column existed. The page re-reads on the same nudge its columns do.\n  const shape = useShapeRevision(tableId);\n\n  // DOOR-1: the door reads live records only. There is no `includeDeleted`\n  // here any more because there is no door that answers it — a screen that\n  // wants a deleted record asks the restore path by name.\n  const base = useAsync<{ rows: ReadRow[]; total: number | null; locked?: number }>(\n    async (c) => {\n      if (!tableId) return { ok: true, data: { rows: [], total: null } };\n      return c.list({\n        table_id: tableId,\n        ...(filterKey === \"{}\" ? {} : { filter: options.filter as StoreFilter }),\n        limit: pageSize,\n        offset: page * pageSize,\n      });\n    },\n    // The QUESTION, not the object: a parent that rebuilds `{status: \"Cancelled\"}`\n    // on every render must not re-read the page on every render, and a parent\n    // that changes the question must re-read on the first one.\n    `records:${tableId ?? \"none\"}:${pageSize}:${page}:${filterKey}:s${shape}`,\n    liveRowsFor(tableId, pageOrderOf(undefined, filterKey !== \"{}\")),\n  );\n\n  const { live, liveReason } = liveStatus(useRecordsClient(), tableId);\n  return { ...useSharedRows(useKeptPage(tableId, base)), live, liveReason };\n}\n\nexport interface UseRecordPageOptions {\n  /** Rows per page. */\n  pageSize?: number;\n  /** Zero-based page. */\n  page?: number;\n  /** The store's one filter shape (flat or a Rule expression), compiled in the store's own query. */\n  filter?: StoreFilter;\n  /** Text searched by the store over every column this reader may see (and choice words). */\n  search?: string | null;\n  /** The order; empty = the store's own (or the view's hand order when `viewId` is named). */\n  sort?: readonly RecordPageSort[];\n  /** A hand-ordered view: the page follows the positions the view keeps. */\n  viewId?: Uuid | null;\n}\n\n/** A store-read page: its rows, the matching total, and the sort keys the store skipped. */\nexport interface RecordPageData {\n  rows: ReadRow[];\n  total: number | null;\n  /** Rows listed only as a header because this person cannot open them (never in `rows`, never in `total`). */\n  locked?: number;\n  /** Sort keys naming a column this reader cannot see — skipped by the store, never a dead page. */\n  sortIgnored: string[];\n  /** Columns of a saved view's filter skipped because this reader cannot see them (WITHHELD-HONEST-2). */\n  filterIgnored?: string[];\n}\n\nexport interface UseRecordPageState extends Async<RecordPageData> {\n  live: boolean;\n  liveReason: string;\n}\n\n/**\n * DOOR-SPEED. ONE PAGE THE STORE SORTED, SEARCHED, FILTERED AND COUNTED (`client.listPage` →\n * `custom.read_records_page`), realtime-aware exactly like `useRecords`: a notice re-reads only the\n * ids it names and patches them into this page. What a grid pages with — a row on page six of a\n * thousand is found by the store's search, a sort orders the whole table, and `total` is the\n * matching set this reader may see. `tableId: null` reads nothing.\n */\nexport function useRecordPage(tableId: Uuid | null, options: UseRecordPageOptions = {}): UseRecordPageState {\n  const pageSize = options.pageSize ?? 50;\n  const page = options.page ?? 0;\n  const filterKey = stableFilterKey(options.filter);\n  const search = options.search && options.search.trim() !== \"\" ? options.search.trim() : null;\n  const sortKey = JSON.stringify(options.sort ?? []);\n  const viewId = options.viewId ?? null;\n  // Re-read when this table's shape changes — a column added here is filled on every row now.\n  const shape = useShapeRevision(tableId);\n  const base = useAsync<RecordPageData>(\n    async (c) => {\n      if (!tableId) return { ok: true, data: { rows: [], total: null, sortIgnored: [] } };\n      const answered = await c.listPage({\n        table_id: tableId,\n        ...(filterKey === \"{}\" ? {} : { filter: options.filter as StoreFilter }),\n        search,\n        sort: JSON.parse(sortKey) as RecordPageSort[],\n        view_id: viewId,\n        limit: pageSize,\n        offset: page * pageSize,\n      });\n      return answered.ok\n        ? { ok: true, data: { rows: answered.data.rows, total: answered.data.total, ...(answered.data.locked ? { locked: answered.data.locked } : {}), sortIgnored: answered.data.sort_ignored ?? [], filterIgnored: answered.data.filter_ignored ?? [] } }\n        : answered;\n    },\n    `page:${tableId ?? \"none\"}:${pageSize}:${page}:${filterKey}:${search ?? \"\"}:${sortKey}:${viewId ?? \"\"}:s${shape}`,\n    liveRowsFor(tableId, pageOrderOf(options.sort, filterKey !== \"{}\" || search !== null)),\n  );\n  const { live, liveReason } = liveStatus(useRecordsClient(), tableId);\n  return { ...useSharedRows(useKeptPage(tableId, base)), live, liveReason };\n}\n\n/**\n * HOW MANY WRITES THIS PAGE HAS MADE, counted once per burst (250 ms). For a screen that holds an\n * answer in its own state rather than in a records hook — a chart's aggregate, a tile — and must\n * ask again after any add, edit, archive or duplicate made on this page: put it in the read's\n * dependencies. A write names a record, not its table, so every write counts; a burst asks once.\n */\nexport function useRecordWrites(): number {\n  const [writes, setWrites] = useState(0);\n  useEffect(() => {\n    let timer: ReturnType<typeof setTimeout> | null = null;\n    const stop = onRecordChanged(() => {\n      if (timer !== null) clearTimeout(timer);\n      timer = setTimeout(() => {\n        timer = null;\n        setWrites((n) => n + 1);\n      }, 250);\n    });\n    return () => {\n      if (timer !== null) clearTimeout(timer);\n      stop();\n    };\n  }, []);\n  return writes;\n}\n\n/** One record, its values and (optionally) which Rule version computed each. */\n/**\n * HOW MANY TIMES THIS PAGE HAS WRITTEN THIS RECORD (lane RECORDS-UI-FIX, 2026-09-23).\n * A screen that shows a record puts this in its read's dependencies and re-reads when a\n * write through any client on the page lands on it — the record panel's history read\n * \"3 versions\" after its fourth write because nothing told it. See `core/recordChanges`.\n */\nexport function useRecordChangeRevision(recordId: Uuid | null | undefined): number {\n  const [revision, setRevision] = useState(0);\n  useEffect(() => {\n    if (!recordId) return;\n    return onRecordChanged((changed) => {\n      if (changed === recordId) setRevision((n) => n + 1);\n    });\n  }, [recordId]);\n  return revision;\n}\n\nexport interface UseRecordOptions {\n  /**\n   * The Table the record lives in. Named, the record is LIVE: a change another tab, person or\n   * agent makes to it arrives on the table's realtime notice and is re-read into the one entry\n   * every view of this record reads — including a view that is asleep. Left out, the record\n   * hears only the writes made on this page.\n   */\n  tableId?: Uuid | null;\n}\n\nexport function useRecord(\n  recordId: Uuid | null,\n  withComputed = false,\n  options: UseRecordOptions = {},\n): Async<RecordRead | null> {\n  const tableId = options.tableId ?? null;\n  return useAsync<RecordRead | null>(\n    async (client) => {\n      if (!recordId) return { ok: true, data: null };\n      return client.recordRead({ record_id: recordId, withComputed });\n    },\n    `record:${recordId ?? \"none\"}:${withComputed ? \"computed\" : \"plain\"}:${tableId ?? \"\"}`,\n    recordId ? liveRecordFor(recordId, tableId) : null,\n  );\n}\n\n/**\n * THE LIVE HALF OF ONE RECORD, owned by its entry: a write through any client on this page\n * (`onRecordChanged`) and — when the table is known — the table's realtime notice naming this\n * record (or saying it cannot name any) re-read the record once, for every view of it.\n */\nfunction liveRecordFor(recordId: Uuid, tableId: Uuid | null): EntryLive<RecordRead | null> {\n  return (entry) => {\n    const stops: Array<() => void> = [];\n    stops.push(\n      onRecordChanged((changed) => {\n        if (changed === recordId && !isRecordRemoved(recordId)) entry.refetch();\n      }),\n    );\n    const client = entry.client;\n    const realtime = client.config.realtime;\n    if (realtime && tableId && client.config.organizationId) {\n      stops.push(\n        realtime.subscribeRecords(\n          { organization_id: client.config.organizationId, table_id: tableId },\n          {\n            records(ids) {\n              if ((ids === null || ids.includes(recordId)) && !isRecordRemoved(recordId)) entry.refetch();\n            },\n            shape() {\n              tableShapeChanged(tableId);\n            },\n          },\n        ),\n      );\n    }\n    return () => {\n      for (const stop of stops) stop();\n    };\n  };\n}\n\nexport interface UseRecordMutation {\n  write: (args: { table_id: Uuid; data: Record<string, unknown> }) => Promise<Uuid | null>;\n  update: (args: {\n    record_id: Uuid;\n    patch: Record<string, unknown>;\n    expectedVersion?: number;\n  }) => Promise<number | null>;\n  remove: (args: { record_id: Uuid }) => Promise<string | null>;\n  restore: (args: { record_id: Uuid }) => Promise<boolean>;\n  saving: boolean;\n  error: RecordsError | null;\n  /**\n   * THE CONFLICT, as something a screen can SHOW rather than a toast it flashes:\n   * the version you wrote against, the version that won, and every field you\n   * touched as it stands now. Nothing was overwritten and nothing was lost —\n   * which is exactly what the store's own hint says, and it is carried here.\n   */\n  conflict: WriteConflict | null;\n  clearConflict: () => void;\n}\n\n/** Writes, with optimistic concurrency surfaced instead of swallowed. */\nexport function useRecordMutation(): UseRecordMutation {\n  const client = useRecordsClient();\n  const [saving, setSaving] = useState(false);\n  const [error, setError] = useState<RecordsError | null>(null);\n  const [conflict, setConflict] = useState<WriteConflict | null>(null);\n\n  const run = useCallback(\n    async <T,>(\n      recordId: Uuid | null,\n      call: () => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n    ): Promise<T | null> => {\n      setSaving(true);\n      setError(null);\n      try {\n        const result = await call();\n        if (result.ok) {\n          setConflict(null);\n          return result.data;\n        }\n        setError(result.error);\n        setConflict(recordId ? asWriteConflict(result.error, recordId) : null);\n        return null;\n      } finally {\n        setSaving(false);\n      }\n    },\n    [],\n  );\n\n  return useMemo(\n    () => ({\n      write: (args) =>\n        run(null, () => client.recordWrite({ table_id: args.table_id, data: args.data })),\n      update: (args) =>\n        run(args.record_id, () =>\n          client.recordUpdate({\n            record_id: args.record_id,\n            patch: args.patch,\n            ...(args.expectedVersion === undefined ? {} : { expectedVersion: args.expectedVersion }),\n          }),\n        ),\n      remove: (args) => run(args.record_id, () => client.recordDelete({ record_id: args.record_id })),\n      restore: async (args) => {\n        const result = await run(args.record_id, () => client.recordRestore({ record_id: args.record_id }));\n        return result !== null;\n      },\n      saving,\n      error,\n      conflict,\n      clearConflict: () => setConflict(null),\n    }),\n    [client, run, saving, error, conflict],\n  );\n}\n\n/**\n * GETTING RID OF A WHOLE TABLE — the loop, once, for every screen (VERIFIER-11 F3).\n *\n * `useRecordMutation().remove` is right for a record and WRONG for a Table:\n * `custom.record_delete` aimed at a Table recurses through everything it\n * contains inside one transaction, so on 1,430 records — a size the product's\n * own import reaches in half a minute — it died twelve seconds in on `57014`,\n * \"canceling statement due to statement timeout\", and the screen told the\n * person nothing had changed and to \"try a smaller page\". There is no page.\n *\n * So archiving a table is a JOB: this hook makes the passes, holds the numbers\n * the store answers each one with, and stops on `done`.\n *\n * WHAT MAKES IT RESUMABLE is that nothing here is the state of the run — the\n * store reads what remains off the records themselves every call. A refused\n * pass, a `stop()`, a closed tab or a reload all leave `interrupted` true and a\n * `carryOn()` that continues from exactly where the last pass stopped. Which is\n * also why a screen driving this may never say \"nothing was changed\" after a\n * failure: `progress.archived_total` is what actually landed, and it is the\n * number the person is owed.\n */\nexport interface UseTableArchive {\n  /** The numbers from the last pass or preview. Null until something has been asked. */\n  progress: TableArchiveProgress | null;\n  /** A loop is in flight. */\n  running: boolean;\n  /** Passes made since the last `start()`. */\n  passes: number;\n  /**\n   * The pass size in use. It STARTS at `chunk` and HALVES whenever the store\n   * runs out of time, so a screen can say the run slowed down rather than\n   * letting it look stuck. Never below ten: at that point the store is not slow,\n   * it is refusing, and a loop that kept shrinking would hide it.\n   */\n  chunkInUse: number;\n  /**\n   * The loop backed the pass size off because the store ran out of time. An\n   * automatic intervention ANNOUNCES ITSELF: a run that quietly went four times\n   * slower would read as a stuck screen.\n   */\n  slowedDown: boolean;\n  /** The refusal that stopped the loop. The work already done still stands. */\n  error: RecordsError | null;\n  /**\n   * The loop ended with records still live — because a pass was refused or\n   * because `stop()` was called. It is the screen's cue to offer carrying on\n   * rather than to claim a finished or a failed run.\n   */\n  interrupted: boolean;\n  /** Ask what would happen and change NOTHING, so a person sees the number first. */\n  preview: () => Promise<TableArchiveProgress | null>;\n  /** Run passes until done, refused, or stopped. */\n  start: () => Promise<TableArchiveProgress | null>;\n  /** Same loop, said in the word a screen uses after an interruption. */\n  carryOn: () => Promise<TableArchiveProgress | null>;\n  /** Cut cleanly after the pass in flight. Never mid-pass: a pass is one transaction. */\n  stop: () => void;\n}\n\n/**\n * The floor the pass size may back off to. Below this the store is not slow, it is\n * refusing, and a loop that kept shrinking would turn a real refusal into a hang.\n */\nconst MIN_ARCHIVE_CHUNK = 10;\n\nexport function useTableArchive(\n  tableId: Uuid,\n  options?: { chunk?: number; includeTable?: boolean },\n): UseTableArchive {\n  const client = useRecordsClient();\n  // TABLE_ARCHIVE_PASS (20), re-measured 2026-10-03 at ~150ms a record. See `tableArchive`.\n  const chunk = options?.chunk ?? TABLE_ARCHIVE_PASS;\n  const includeTable = options?.includeTable ?? true;\n\n  const [progress, setProgress] = useState<TableArchiveProgress | null>(null);\n  const [running, setRunning] = useState(false);\n  const [passes, setPasses] = useState(0);\n  const [error, setError] = useState<RecordsError | null>(null);\n  const [interrupted, setInterrupted] = useState(false);\n  const [chunkInUse, setChunkInUse] = useState(chunk);\n  const [slowedDown, setSlowedDown] = useState(false);\n  // A CUT IS ASKED FOR BETWEEN PASSES, NEVER INSIDE ONE. Each pass is one\n  // transaction in the database; abandoning it in the browser would not stop it\n  // and would only lose the count of what it did.\n  const cut = useRef(false);\n\n  const preview = useCallback(async () => {\n    setError(null);\n    const answered = await client.tableArchive({ table_id: tableId, chunk: 0, includeTable });\n    if (!answered.ok) {\n      setError(answered.error);\n      return null;\n    }\n    setProgress(answered.data);\n    // A RUN STARTED EARLIER — another tab, or this page before a reload — is one to carry on.\n    if (answered.data.in_progress) setInterrupted(true);\n    return answered.data;\n  }, [client, tableId, includeTable]);\n\n  const loop = useCallback(async () => {\n    cut.current = false;\n    setRunning(true);\n    setError(null);\n    setInterrupted(false);\n    setPasses(0);\n    let last: TableArchiveProgress | null = null;\n    // A TIMEOUT IS THE ONE REFUSAL THAT IS ABOUT SIZE, AND THE LOOP KNOWS THE\n    // ANSWER TO IT. Every table is a different weight — a record with rules,\n    // history and relations costs more than a bare one, and a busy afternoon\n    // costs more than a quiet one — so no fixed pass size is right for all of\n    // them. Rather than hand the person back the very sentence this whole fix\n    // exists to delete (\"that took too long to answer\"), the loop halves the\n    // pass and carries on. A pass that timed out changed nothing, so retrying\n    // it smaller repeats no work.\n    let size = chunk;\n    setChunkInUse(size);\n    setSlowedDown(false);\n    try {\n      for (;;) {\n        const answered = await client.tableArchive({ table_id: tableId, chunk: size, includeTable });\n        if (!answered.ok) {\n          if (answered.error.code === \"timed_out\" && size > MIN_ARCHIVE_CHUNK) {\n            size = Math.max(MIN_ARCHIVE_CHUNK, Math.floor(size / 2));\n            setChunkInUse(size);\n            setSlowedDown(true);\n            continue;\n          }\n          // THE PASSES THAT LANDED STILL LANDED. The refusal is held beside the\n          // last numbers, never instead of them.\n          setError(answered.error);\n          setInterrupted(true);\n          return last;\n        }\n        last = answered.data;\n        setProgress(answered.data);\n        setPasses((n) => n + 1);\n        if (answered.data.done) return answered.data;\n        if (cut.current) {\n          setInterrupted(true);\n          return answered.data;\n        }\n      }\n    } finally {\n      setRunning(false);\n    }\n  }, [client, tableId, chunk, includeTable]);\n\n  return useMemo(\n    () => ({\n      progress,\n      running,\n      passes,\n      chunkInUse,\n      slowedDown,\n      error,\n      interrupted,\n      preview,\n      start: loop,\n      carryOn: loop,\n      stop: () => {\n        cut.current = true;\n      },\n    }),\n    [progress, running, passes, chunkInUse, slowedDown, error, interrupted, preview, loop],\n  );\n}\n\nexport interface UseFieldMutation {\n  /** Add a column. One call; the store decides what the parity type is made of. */\n  declare: (args: { table_id: Uuid; spec: NewFieldDeclaration }) => Promise<Uuid | null>;\n  /** One field's own settings. What it HOLDS is a conversion and is refused by name. */\n  update: (args: { field_id: Uuid; patch: FieldPatch }) => Promise<Uuid | null>;\n  /** Take a column off a table. */\n  retire: (args: { field_id: Uuid }) => Promise<boolean>;\n  /** Bring a removed column back, with its values. */\n  restore: (args: { field_id: Uuid }) => Promise<boolean>;\n  saving: boolean;\n  error: RecordsError | null;\n  clearError: () => void;\n}\n\n/**\n * THE SHAPE OF A TABLE, changed through the store's own doors.\n *\n * Deliberately separate from `useRecordMutation`. A Field IS a record, but\n * adding one is not writing a record: it changes what every record of the table\n * means, it is an administrator's right rather than an editor's, and it is the\n * one write `custom.record_write` was never able to make — it cannot tell the\n * Table about the field, and the field guard refuses any definition the Table\n * has not declared. A screen that reached for the record writer here is the\n * screen that spent 19 September refusing every column a person tried to add.\n */\n/**\n * A STANDARD BUSINESS TABLE'S CUSTOM FIELDS, by its registry token.\n *\n * `useFields(tableId)` is about one of YOUR OWN tables. This is the other half:\n * the fields an organization added to a CRM contact, a deal, a note - any of the\n * 643 tables the registry types Entity or Detail - and there is no per-entity\n * code here or in any screen that uses it. `{ includeRetired: true }` adds the\n * fields taken away (each with `archived_at`), live first — the archived view.\n */\nexport function useEntityFields(token: string | null, opts?: { includeRetired?: boolean }): Async<Field[]> {\n  const includeRetired = opts?.includeRetired === true;\n  return useAsync<Field[]>(\n    (client) =>\n      token\n        ? client.entityFields(includeRetired ? { token, include_retired: true } : { token })\n        : Promise.resolve({ ok: true, data: [] as Field[] }),\n    `entity-fields:${token ?? \"none\"}${includeRetired ? \":with-retired\" : \"\"}`,\n  );\n}\n\n/**\n * REC-53 in one answer: a standard row's real columns AND its organization's\n * custom values AND the definitions that describe them. A row the person may\n * not open comes back as the store's own refusal, because the door reads it AS\n * them through the table's own row-level security.\n */\nexport function useEntityRecord(\n  token: string | null,\n  recordId: Uuid | null,\n): Async<EntityRecordRead | null> {\n  return useAsync<EntityRecordRead | null>(\n    (client) =>\n      token && recordId\n        ? client.entityRecordRead({ token, record_id: recordId })\n        : Promise.resolve({ ok: true, data: null }),\n    `entity-record:${token ?? \"none\"}:${recordId ?? \"none\"}`,\n  );\n}\n\nexport interface UseEntityBackLinks {\n  /** The custom rows linking here, first page then every loaded page, in the store's order. */\n  items: EntityBackLinkItem[];\n  /** The platform record the rows link to (label as the store names it). Null until the first page lands. */\n  target: EntityBackLinks[\"target\"] | null;\n  /** Still reading the first page. */\n  loading: boolean;\n  /** The first page's refusal, in the store's own words (door absent included). Never swallowed. */\n  error: RecordsError | null;\n  /** More pages exist. */\n  hasMore: boolean;\n  loadingMore: boolean;\n  /** The next page's refusal; the pages already loaded stay. */\n  moreError: RecordsError | null;\n  /** Ask the next page. */\n  loadMore: () => Promise<void>;\n  /** Ask the first page again (and forget the later pages). */\n  reload: () => void;\n}\n\n/**\n * AP-4: THE CUSTOM ROWS THAT LINK TO ONE PLATFORM RECORD (`custom.entity_back_links`). A CRM contact\n * or an HR employee page shows the organization's own custom rows that point at it (\"Onboarding\n * checklist\" linked to an employee). Keyed by the ROW's organization, never the active one;\n * `organizationId: null` asks nothing. The first page rides the shared cache like its siblings;\n * later pages ride `next_cursor` and are held by the hook.\n */\nexport function useEntityBackLinks(\n  token: string | null,\n  recordId: Uuid | null,\n  options: { organizationId: Uuid | null; limit?: number },\n): UseEntityBackLinks {\n  const client = useRecordsClient();\n  const { organizationId, limit } = options;\n  const asking = token && recordId && organizationId ? { token, recordId, organizationId } : null;\n  const scope = asking ? `${asking.organizationId}:${asking.token}:${asking.recordId}:${limit ?? 50}` : \"none\";\n  const first = useAsync<EntityBackLinks | null>(\n    (c) =>\n      asking\n        ? c.entityBackLinks({\n            token: asking.token,\n            record_id: asking.recordId,\n            organization_id: asking.organizationId,\n            ...(limit ? { limit } : {}),\n          })\n        : Promise.resolve({ ok: true, data: null }),\n    `entity-back-links:${scope}`,\n  );\n  const [more, setMore] = useState<{\n    scope: string;\n    items: EntityBackLinkItem[];\n    cursor: string | null | undefined;\n    busy: boolean;\n    error: RecordsError | null;\n  }>({ scope, items: [], cursor: undefined, busy: false, error: null });\n  // A new question (another record) forgets the old record's later pages.\n  const current = more.scope === scope ? more : { scope, items: [], cursor: undefined, busy: false, error: null };\n  const firstAnswer = first.data;\n  const cursor = current.cursor === undefined ? (firstAnswer?.next_cursor ?? null) : current.cursor;\n\n  const loadMore = useCallback(async () => {\n    if (!asking || !cursor) return;\n    setMore({ ...current, busy: true, error: null });\n    const answered = await client.entityBackLinks({\n      token: asking.token,\n      record_id: asking.recordId,\n      organization_id: asking.organizationId,\n      ...(limit ? { limit } : {}),\n      cursor,\n    });\n    if (!answered.ok) {\n      setMore({ ...current, busy: false, error: answered.error });\n      return;\n    }\n    setMore({\n      scope,\n      items: [...current.items, ...answered.data.items],\n      cursor: answered.data.next_cursor,\n      busy: false,\n      error: null,\n    });\n  }, [client, asking?.token, asking?.recordId, asking?.organizationId, limit, cursor, current, scope]);\n\n  const reload = useCallback(() => {\n    setMore({ scope, items: [], cursor: undefined, busy: false, error: null });\n    first.reload();\n  }, [first, scope]);\n\n  return {\n    items: [...(firstAnswer?.items ?? []), ...current.items],\n    target: firstAnswer?.target ?? null,\n    loading: first.loading,\n    error: first.error,\n    hasMore: Boolean(cursor),\n    loadingMore: current.busy,\n    moreError: current.error,\n    loadMore,\n    reload,\n  };\n}\n\n/** What the registry says about a token - and whether it can hold a value at all. */\nexport function useEntityTable(token: string | null): Async<EntityTableFacts | null> {\n  return useAsync<EntityTableFacts | null>(\n    (client) => (token ? client.entityTable({ token }) : Promise.resolve({ ok: true, data: null })),\n    `entity-table:${token ?? \"none\"}`,\n  );\n}\n\n/**\n * G2: A TABLE'S ROW ACTIONS, read once per table per tab (the remount law, 2026-10-03). Every\n * grid, page button and action picker of the table shares one entry: a board tile that sleeps\n * and wakes, a Remove + Undo or a second view reads nothing. `reload()` is the re-read (an\n * action declared in the settings rail). `null` asks nothing.\n */\nexport function useRowActions(tableId: Uuid | null): Async<{ actions: RowAction[]; stale: unknown[] } | null> {\n  return useAsync<{ actions: RowAction[]; stale: unknown[] } | null>(\n    (client) => (tableId ? client.rowActions({ table_id: tableId }) : Promise.resolve({ ok: true, data: null })),\n    `row-actions:${tableId ?? \"none\"}`,\n  );\n}\n\n/** SCR-12: the answer a screen needs to make \"Add field\" absent-or-honest. */\nexport function useEntityFieldRights(token: string | null): Async<EntityFieldRights | null> {\n  return useAsync<EntityFieldRights | null>(\n    (client) => (token ? client.entityFieldRights({ token }) : Promise.resolve({ ok: true, data: null })),\n    `entity-field-rights:${token ?? \"none\"}`,\n  );\n}\n\nexport interface UseEntityFieldMutation {\n  /** Add a column to a standard table. Refused for anybody but an organization admin. */\n  declare: (args: { token: string; spec: NewEntityFieldDeclaration }) => Promise<Uuid | null>;\n  update: (args: { field_id: Uuid; patch: Record<string, unknown> }) => Promise<Uuid | null>;\n  retire: (args: { field_id: Uuid }) => Promise<Uuid | null>;\n  /** Set custom values on one standard row. A key left out is left alone. */\n  write: (args: {\n    token: string;\n    record_id: Uuid;\n    patch: Record<string, unknown>;\n  }) => Promise<EntityRecordRead | null>;\n  saving: boolean;\n  error: RecordsError | null;\n  clearError: () => void;\n}\n\n/**\n * Changing a standard table's custom fields, and filling them in. Deliberately\n * ONE hook for both, because the store keeps them the same way: the definition\n * is a record in the field kernel and the value is in the row's own\n * `custom_fields` column, and a screen that had two mutation hooks would have\n * two places to get the refusal wording from.\n */\nexport function useEntityFieldMutation(): UseEntityFieldMutation {\n  const client = useRecordsClient();\n  const [saving, setSaving] = useState(false);\n  const [error, setError] = useState<RecordsError | null>(null);\n\n  const run = useCallback(\n    async <T,>(\n      call: () => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n      whenRefused: T,\n    ): Promise<T> => {\n      setSaving(true);\n      setError(null);\n      try {\n        const result = await call();\n        if (result.ok) return result.data;\n        setError(result.error);\n        return whenRefused;\n      } finally {\n        setSaving(false);\n      }\n    },\n    [],\n  );\n\n  return useMemo(\n    () => ({\n      declare: (args) =>\n        run<Uuid | null>(() => client.entityFieldDeclare({ token: args.token, spec: args.spec }), null),\n      update: (args) =>\n        run<Uuid | null>(\n          () => client.entityFieldUpdate({ field_id: args.field_id, patch: args.patch }),\n          null,\n        ),\n      retire: (args) => run<Uuid | null>(() => client.entityFieldRetire({ field_id: args.field_id }), null),\n      write: (args) =>\n        run<EntityRecordRead | null>(async () => {\n          // the one write door, then the row read back whole (its values, envelopes, definitions)\n          const wrote = await client.entityRowWrite({\n            token: args.token,\n            record_id: args.record_id,\n            custom: args.patch,\n          });\n          if (!wrote.ok) return wrote;\n          return client.entityRecordRead({ token: args.token, record_id: args.record_id });\n        }, null),\n      saving,\n      error,\n      clearError: () => setError(null),\n    }),\n    [client, run, saving, error],\n  );\n}\n\nexport function useFieldMutation(): UseFieldMutation {\n  const client = useRecordsClient();\n  const [saving, setSaving] = useState(false);\n  const [error, setError] = useState<RecordsError | null>(null);\n\n  const run = useCallback(\n    async <T,>(\n      call: () => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n      whenRefused: T,\n    ): Promise<T> => {\n      setSaving(true);\n      setError(null);\n      try {\n        const result = await call();\n        if (result.ok) return result.data;\n        setError(result.error);\n        return whenRefused;\n      } finally {\n        setSaving(false);\n      }\n    },\n    [],\n  );\n\n  // EVERY DOOR THAT CHANGES A TABLE'S SHAPE ANNOUNCES IT — all three, not just\n  // the one that surfaced the defect. Adding a column was what a crew caught on\n  // 2026-09-21, but retyping one and retiring one leave exactly the same stale\n  // copy in every other screen looking at that table, and a fix that only knew\n  // about `declare` would have left two thirds of the class open.\n  //\n  // `update` and `retire` name a FIELD, not a table, and asking the store which\n  // table it belongs to would be a door call per table on screen to save one.\n  // So they tell every table a screen is currently looking at — which is one\n  // table on a table page and a handful anywhere else. Re-reading a column list\n  // is cheap; drawing a table that no longer exists is not.\n  const announce = useCallback((tableId: Uuid | null) => {\n    if (tableId) {\n      tableShapeChanged(tableId);\n      return;\n    }\n    for (const id of [...shapeRevisions.keys()] as Uuid[]) tableShapeChanged(id);\n  }, []);\n\n  return useMemo(\n    () => ({\n      declare: async (args) => {\n        const made = await run<Uuid | null>(\n          () => client.fieldDeclare({ table_id: args.table_id, spec: args.spec }),\n          null,\n        );\n        if (made !== null) announce(args.table_id);\n        return made;\n      },\n      update: async (args) => {\n        const changed = await run<Uuid | null>(\n          () => client.fieldUpdate({ field_id: args.field_id, patch: args.patch }),\n          null,\n        );\n        if (changed !== null) announce(null);\n        return changed;\n      },\n      retire: async (args) => {\n        const gone = await run<boolean>(() => client.fieldRetire({ field_id: args.field_id }), false);\n        if (gone) announce(null);\n        return gone;\n      },\n      restore: async (args) => {\n        const back = await run<boolean>(() => client.fieldRestore({ field_id: args.field_id }), false);\n        if (back) announce(null);\n        return back;\n      },\n      saving,\n      error,\n      clearError: () => setError(null),\n    }),\n    [client, run, announce, saving, error],\n  );\n}\n\n/**\n * DYN-14 / AGT-N-7. A merge field's value — and while the resolver's server half\n * does not exist, `pending` WITH THE REASON. Never a blank, never a leftover\n * `{{brace}}`, never an empty string that a prompt would carry into a model.\n */\nexport function useMergeField(key: string | null, state?: Record<string, unknown>) {\n  const client = useRecordsClient();\n  const [resolution, setResolution] = useState<MergeFieldResolution | null>(null);\n  const resolver = client.config.resolver;\n\n  useEffect(() => {\n    if (!key) {\n      setResolution(null);\n      return;\n    }\n    if (!resolver || !client.config.organizationId) {\n      setResolution({\n        state: \"pending\",\n        reason:\n          `The merge field \"${key}\" cannot be resolved here yet: this host bound no resolver, and ` +\n          `the resolver's server half is W5-MERGE-B's. Nothing is shown in its place — a blank would ` +\n          `read as \"there is no value\", which is a different sentence.`,\n      });\n      return;\n    }\n    let cancelled = false;\n    void resolver\n      .resolve({\n        organization_id: client.config.organizationId,\n        merge_field_keys: [key],\n        ...(state === undefined ? {} : { state }),\n      })\n      .then((answer) => {\n        if (cancelled) return;\n        const byKey = (answer as Record<string, MergeFieldResolution> | null) ?? {};\n        setResolution(\n          byKey[key] ?? {\n            state: \"pending\",\n            reason: `The resolver answered, and it said nothing about \"${key}\". Nothing is shown in its place.`,\n          },\n        );\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, [key, resolver, client.config.organizationId, state]);\n\n  return resolution;\n}\n","// src/core/recordChanges.ts — @ai-matrx/records · lane RECORDS-UI-FIX (2026-09-23)\n//\n// EVERY SCREEN SHOWING A RECORD HEARS EVERY WRITE TO IT MADE THROUGH THIS PACKAGE.\n//\n// 🚨 WHAT A PERSON MET (VERIFIER-16 LOW, guide re-walk 2026-09-23): the record panel read\n// \"History 3 versions\" after its fourth write, while the store held four. The history\n// panel read the chain once, when it opened, and nothing told it the grid cell or the\n// form beside it had just written a new version. It is not the no-op-version class (the\n// store's history had the row; the screen never asked again) — it is a screen that\n// cannot hear the writes made on the same page.\n//\n// So every successful write door of the client announces the record it wrote, and any\n// screen showing that record re-reads on the announcement. Page-local and synchronous;\n// a write from another tab or person is realtime's job, not this one's.\n\n//\n// ONE BUS PER REALM, IN GLOBAL SLOTS: every section of the built package carries its own copy of\n// this module (and ESM/CJS are two graphs), so a module-level Set split the bus — the core client\n// announced into one copy while records/react listened on another (2026-10-08). Guarded on the\n// packed tarball by scripts/check-shared-state.mjs.\n\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\n\ntype Listener = (recordId: string) => void;\n\nconst listeners = globalSlot(\"ai-matrx.records.record-change-listeners\", () => new Set<Listener>());\n\n/** Called by the client after a write door answered yes. */\nexport function announceRecordChanged(recordId: string): void {\n  for (const listener of [...listeners]) {\n    try {\n      listener(recordId);\n    } catch (thrown) {\n      // A listener that throws must not take the write's answer with it.\n      console.error(\"[@ai-matrx/records] a record-change listener threw\", thrown);\n    }\n  }\n}\n\n// ── A RECORD THE PAGE ARCHIVED IS NOT READ AGAIN (Spaces r39) ───────────────────────────────\n//\n// `custom.read_record` refuses an archived record (400), and a screen that showed the record keeps\n// its entry live after it closes (a peek opened on a new row, then closed) — so the archive's own\n// change announcement, and the realtime echo of it, re-read a record nobody can open: two failing\n// requests per archive. `recordDelete` marks the record removed here; the live entry skips its\n// re-read while the mark stands; `recordRestore` lifts it.\n\nconst removed = globalSlot(\"ai-matrx.records.removed-records\", () => new Set<string>());\n\n/** Called by the client after `record_delete` answered yes (before it announces the change). */\nexport function markRecordRemoved(recordId: string): void {\n  removed.add(recordId);\n}\n\n/** Called by the client after `record_restore` answered yes (before it announces the change). */\nexport function markRecordRestored(recordId: string): void {\n  removed.delete(recordId);\n}\n\n/** Whether this page archived the record and has not brought it back. */\nexport function isRecordRemoved(recordId: string): boolean {\n  return removed.has(recordId);\n}\n\n/** Hear every record this page writes. Returns the unsubscribe. */\nexport function onRecordChanged(listener: Listener): () => void {\n  listeners.add(listener);\n  return () => listeners.delete(listener);\n}\n\n// ── A TABLE'S SHAPE MOVED (KINDS-GLUE wave 3 §1.4) ──────────────────────────────────────\n//\n// A record drawn as `table:<uuid>` in a chat, a note or a canvas draws through the Table's\n// Fields. When a Field is renamed, added, retired, brought back or retyped on this page, every\n// such card must re-read the Table's kind facts — so every structure door of the client\n// announces the Table here, the same page-local way record writes announce their record.\n// `null` means \"a Table changed and the door did not name which\" (a Field door is addressed by\n// the Field id alone): a listener then refreshes every Table it holds. Another tab's or\n// person's change is realtime's job (the `custom:table:<id>` notice with `kind: \"field\"`).\n\ntype TableListener = (tableId: string | null) => void;\n\nconst tableListeners = globalSlot(\"ai-matrx.records.table-structure-listeners\", () => new Set<TableListener>());\n\n/** Called by the client after a structure door (a Field or choice change) answered yes. */\nexport function announceTableStructureChanged(tableId: string | null): void {\n  for (const listener of [...tableListeners]) {\n    try {\n      listener(tableId);\n    } catch (thrown) {\n      console.error(\"[@ai-matrx/records] a table-structure listener threw\", thrown);\n    }\n  }\n}\n\n/** Hear every Table whose shape this page changes. Returns the unsubscribe. */\nexport function onTableStructureChanged(listener: TableListener): () => void {\n  tableListeners.add(listener);\n  return () => tableListeners.delete(listener);\n}\n","// src/store.generated.ts — @ai-matrx/records\n//\n// GENERATED. Do not edit by hand: `pnpm records:generate` rewrites it from the\n// live record store, and `pnpm check:store-registry` fails the build when this\n// file and the store disagree. Every literal below was read from the database's\n// own catalog — the vocabularies from the store's vocabulary functions, the\n// parity types from `custom.parity_field_types()`, the doors from `pg_proc`,\n// the kernel ids from the kernel rows themselves, the tokens from\n// `platform.entity_types`.\n//\n// Counts at generation: 3 actor words, 4 absence\n// reasons, 14 parity field types, 32 declarable field kinds,\n// 158 rule node kinds,\n// 9 kernel Tables, 1065 doors, 78 knobs,\n// 1303 entity tokens.\n\nexport const ACTOR_VOCABULARY = [\"user\", \"agent\", \"system\"] as const;\n\n/** The three words the store still accepts and rewrites, and what each becomes. */\nexport const RETIRED_ACTOR_WORDS = {\"ai\": \"agent\", \"code\": \"system\", \"human\": \"user\"} as const;\n\nexport const ABSENCE_REASONS = [\"never asked\", \"none\", \"refused\", \"conflicting\"] as const;\n\nexport const VALUE_ENVELOPE_KEYS = [\"ver\", \"src\", \"actor\", \"on_behalf_of\", \"at\", \"absent\", \"alternates\", \"dated\", \"pinned\"] as const;\n\nexport const VALUE_ALTERNATE_KEYS = [\"value\", \"src\", \"rank\"] as const;\n\nexport const STORAGE_MODES = [\"light\", \"heavy\"] as const;\n\nexport const RULE_USES = [\"validate\", \"compute\", \"membership\", \"applicability\"] as const;\n\nexport const PER_VALUE_ACCESS_WORDS = [\"visibility\", \"access\", \"share\", \"acl\", \"permission\", \"permissions\", \"secret\"] as const;\n\n/** FLD-11's parity floor, each with the behavior it is MADE OF (FLD-1). */\nexport const PARITY_FIELD_TYPES = [\n  { parity_type: \"attachment\", behavior: \"relation\", made_of: \"REC-31: a File record reached through a relation, target the kernel `File` Table\" },\n  { parity_type: \"checkbox\", behavior: \"boolean\", made_of: \"a ticked or unticked answer, stored as a REAL boolean — and a record that never answered holds neither, so filters and group-by see three states, not two\" },\n  { parity_type: \"currency\", behavior: \"range\", made_of: \"FLD-N-1: a number whose UNIT is the currency and whose format is currency — on the Field, never in presentation\" },\n  { parity_type: \"datetime\", behavior: \"range\", made_of: \"a range of kind date or datetime — the dated modifier says the VALUES are dated, which is a different question\" },\n  { parity_type: \"email\", behavior: \"text\", made_of: \"text whose format is email\" },\n  { parity_type: \"formula\", behavior: \"formula\", made_of: \"FLD-9: a declared computation, on read or on write, evaluated by custom.rule_eval\" },\n  { parity_type: \"lookup\", behavior: \"formula\", made_of: \"a Value read THROUGH a relation — config.via names the relation field, config.pick the Value on the far side\" },\n  { parity_type: \"member\", behavior: \"relation\", made_of: \"a person: a relation whose target is the kernel `Person` Table\" },\n  { parity_type: \"multi_select\", behavior: \"list\", made_of: \"many choices from the same Table — the multi modifier, never a second behaviour\" },\n  { parity_type: \"percent\", behavior: \"range\", made_of: \"a number whose unit is % and whose format is percent\" },\n  { parity_type: \"phone\", behavior: \"text\", made_of: \"text whose format is phone\" },\n  { parity_type: \"rollup\", behavior: \"formula\", made_of: \"an aggregate ALONG a relation — config.via, config.of, config.agg; far-side ids are taken DISTINCT, so nothing is counted twice\" },\n  { parity_type: \"select\", behavior: \"list\", made_of: \"one choice from a Table shown as a list (FLD-5/FLD-6)\" },\n  { parity_type: \"url\", behavior: \"text\", made_of: \"text whose format is url, with the pattern Rule that makes the format enforceable\" },\n] as const;\n\n/**\n * THE ONE REGISTRY: every kind a column can be DECLARED as, from\n * `custom.field_kinds()`. `parity` says whether the kind is one of FLD-11's parity\n * floor; the rest are the behaviors and formats the declaration door answers to and\n * nothing else enumerated — which is how `signature` came to be a shape\n * `custom.doc_sign` accepted and no screen could offer.\n */\nexport const DECLARABLE_FIELD_KINDS = [\n  { kind: \"address\", behavior: \"text\", parity: false, made_of: \"P4: behaviour text, format address; the value is {street, city, region, postal_code, country}, every part optional, at least one filled\" },\n  { kind: \"attachment\", behavior: \"relation\", parity: true, made_of: \"REC-31: a File record reached through a relation, target the kernel `File` Table\" },\n  { kind: \"barcode\", behavior: \"text\", parity: false, made_of: \"P4: behaviour text, format barcode; one printable line a scanner reads, config.symbology optional (custom.barcode_symbologies()), EAN/UPC digits and check digit enforced\" },\n  { kind: \"button\", behavior: \"text\", parity: false, made_of: \"NOTION-PROPS-2: behaviour text, format button; holds no value. config.button says what a press does through custom.button_press: open_url (url, {{field id}} filled from the row), run_automation (one of the table's automations, on this row) or run_action (one of its row actions, which sets fields), or add_row (a new row in this table or table_id's, prefilled from this row by prefill, opened); a button with no do yet is a label only\" },\n  { kind: \"checkbox\", behavior: \"boolean\", parity: true, made_of: \"a ticked or unticked answer, stored as a REAL boolean — and a record that never answered holds neither, so filters and group-by see three states, not two\" },\n  { kind: \"count\", behavior: \"formula\", parity: false, made_of: \"P4: a roll-up whose config.agg is count, with format count: how many records a many-relation points at, as a number of its own\" },\n  { kind: \"created_by\", behavior: \"formula\", parity: false, made_of: \"P4: a formula Field whose config.system is created_by: who made the record, {id, name}, filled by the store from the record's writer on read and never typed\" },\n  { kind: \"currency\", behavior: \"range\", parity: true, made_of: \"FLD-N-1: a number whose UNIT is the currency and whose format is currency — on the Field, never in presentation\" },\n  { kind: \"datetime\", behavior: \"range\", parity: true, made_of: \"a range of kind date or datetime — the dated modifier says the VALUES are dated, which is a different question\" },\n  { kind: \"duration\", behavior: \"range\", parity: false, made_of: \"P4: behaviour range, format duration, unit seconds; a length of time kept as seconds, never below zero\" },\n  { kind: \"email\", behavior: \"text\", parity: true, made_of: \"text whose format is email\" },\n  { kind: \"entity_reference\", behavior: \"relation\", parity: false, made_of: \"SC-R / P12: a relation whose target mode is any (REL-8), restricted by config.allowed_types to the platform kinds it may name (custom.entity_reference_kinds() — agents, notes, web sites, workbooks, datasets, conversations …); each value is {token, id}, the edge a platform.associations row record → <token>. File and Person stay relations to their kernel Tables\" },\n  { kind: \"formula\", behavior: \"formula\", parity: true, made_of: \"FLD-9: a declared computation, on read or on write, evaluated by custom.rule_eval\" },\n  { kind: \"json\", behavior: \"text\", parity: false, made_of: \"W2-A: behaviour text, format json; any JSON value (object, list, number, words, yes/no) kept as jsonb, shown collapsed\" },\n  { kind: \"long_text\", behavior: \"text\", parity: false, made_of: \"behaviour text with format long and config.multiline, for several lines rather than one\" },\n  { kind: \"lookup\", behavior: \"formula\", parity: true, made_of: \"a Value read THROUGH a relation — config.via names the relation field, config.pick the Value on the far side\" },\n  { kind: \"member\", behavior: \"relation\", parity: true, made_of: \"a person: a relation whose target is the kernel `Person` Table\" },\n  { kind: \"modified_by\", behavior: \"formula\", parity: false, made_of: \"P4: a formula Field whose config.system is modified_by: who last changed the record, {id, name}, filled by the store on read and never typed\" },\n  { kind: \"multi_select\", behavior: \"list\", parity: true, made_of: \"many choices from the same Table — the multi modifier, never a second behaviour\" },\n  { kind: \"number\", behavior: \"range\", parity: false, made_of: \"a plain number: behaviour range with no date kind and neither the currency nor the percent format\" },\n  { kind: \"percent\", behavior: \"range\", parity: true, made_of: \"a number whose unit is % and whose format is percent\" },\n  { kind: \"phone\", behavior: \"text\", parity: true, made_of: \"text whose format is phone\" },\n  { kind: \"rating\", behavior: \"range\", parity: false, made_of: \"P4: behaviour range, format rating; a whole number of stars from 0 to its max Rule (1 to 10, default 5), shown as stars\" },\n  { kind: \"relation\", behavior: \"relation\", parity: false, made_of: \"REL / FLD-11: a relation a person aims themselves — relation_target names a Table of this organization, and it is a BEHAVIOUR, never a parity type of its own\" },\n  { kind: \"rich_text\", behavior: \"text\", parity: false, made_of: \"P4: behaviour text, format rich_text; Markdown with no raw HTML and no script links, shown formatted\" },\n  { kind: \"rollup\", behavior: \"formula\", parity: true, made_of: \"an aggregate ALONG a relation — config.via, config.of, config.agg; far-side ids are taken DISTINCT, so nothing is counted twice\" },\n  { kind: \"select\", behavior: \"list\", parity: true, made_of: \"one choice from a Table shown as a list (FLD-5/FLD-6)\" },\n  { kind: \"signature\", behavior: \"text\", parity: false, made_of: \"VAL-10: behaviour text whose format is signature — the one shape custom.doc_sign accepts, sealed by custom.doc_signature_write and checked by custom.doc_signature_intact\" },\n  { kind: \"status\", behavior: \"list\", parity: false, made_of: \"P4: a single-choice list with format status; config.status_groups puts each choice key in todo, in_progress or done (Notion's Status)\" },\n  { kind: \"text\", behavior: \"text\", parity: false, made_of: \"plain text: behaviour text with no format — it carries no parity type, which is exactly what custom.parity_type answers for it\" },\n  { kind: \"time\", behavior: \"text\", parity: false, made_of: \"W2-A: behaviour text, format time; a time of day with no date kept as 24-hour HH:MM or HH:MM:SS (zero-padded, so its text order is its time order); HOUR, MINUTE and SECOND read it\" },\n  { kind: \"url\", behavior: \"text\", parity: true, made_of: \"text whose format is url, with the pattern Rule that makes the format enforceable\" },\n] as const;\n\n/** The node kinds `custom.rule_eval` evaluates, and the lane that owns each. */\nexport const RULE_NODE_KINDS = [\n  { node: \"actor_at_least\", evaluated_by: \"PIPELINES\" },\n  { node: \"add\", evaluated_by: \"W1-RULE\" },\n  { node: \"and\", evaluated_by: \"W1-RULE\" },\n  { node: \"concat\", evaluated_by: \"W1-RULE\" },\n  { node: \"const\", evaluated_by: \"W1-RULE\" },\n  { node: \"contains\", evaluated_by: \"NOTION-Q\" },\n  { node: \"div\", evaluated_by: \"W1-RULE\" },\n  { node: \"eq\", evaluated_by: \"W1-RULE\" },\n  { node: \"field\", evaluated_by: \"W1-RULE\" },\n  { node: \"fx.abs\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.add\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.and\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.arraycompact\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.arrayflatten\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.arrayjoin\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.arrayslice\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.arrayunique\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.at\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.autonumber\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.average\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.blank\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.ceiling\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.concatenate\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.contains\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.count\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.counta\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.countall\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.created_time\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.current\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.current1\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.current2\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.dateadd\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.datediff\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.datestr\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.datetime_diff\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.datetime_format\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.datetime_parse\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.day\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.div\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.encode_url_component\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.eq\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.error\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.even\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.every\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.exp\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.false\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.filter\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.find\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.findfirst\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.first\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.floor\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.fromnow\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.gt\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.gte\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.hour\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.if\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.includes\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.index\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.int\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.is_after\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.is_before\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.is_same\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.isblank\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.iserror\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.join\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.last\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.last_modified_time\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.left\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.len\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.length\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.log\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.lower\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.lt\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.lte\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.map\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.max\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.median\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.mid\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.min\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.minute\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.mod\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.modified_time\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.month\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.mul\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.ne\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.neg\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.not\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.now\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.odd\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.or\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.power\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.record_id\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.recprop\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.regex_extract\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.regex_match\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.regex_replace\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.regexreplace\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.replace\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.rept\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.reverse\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.right\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.round\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.rounddown\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.roundup\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.search\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.second\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.set_locale\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.set_timezone\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.slice\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.some\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.sort\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.split\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.sqrt\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.sub\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.substitute\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.sum\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.switch\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.t\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.timestr\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.today\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.tonow\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.trim\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.true\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.unique\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.upper\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.value\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.weekday\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.weeknum\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.workday\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.workday_diff\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.xor\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"fx.year\", evaluated_by: \"GRID-PRIMITIVES G3 (custom.formula_eval)\" },\n  { node: \"gt\", evaluated_by: \"W1-RULE\" },\n  { node: \"gte\", evaluated_by: \"W1-RULE\" },\n  { node: \"has_all\", evaluated_by: \"NOTION-Q\" },\n  { node: \"has_any\", evaluated_by: \"NOTION-Q\" },\n  { node: \"has_none\", evaluated_by: \"NOTION-Q\" },\n  { node: \"is_empty\", evaluated_by: \"NOTION-Q\" },\n  { node: \"is_exactly\", evaluated_by: \"NOTION-Q\" },\n  { node: \"is_not_empty\", evaluated_by: \"NOTION-Q\" },\n  { node: \"length\", evaluated_by: \"W1-RULE\" },\n  { node: \"linked\", evaluated_by: \"NOTION-Q\" },\n  { node: \"lt\", evaluated_by: \"W1-RULE\" },\n  { node: \"lte\", evaluated_by: \"W1-RULE\" },\n  { node: \"matches\", evaluated_by: \"W1-RULE\" },\n  { node: \"merge_field\", evaluated_by: \"W5-MERGE-B\" },\n  { node: \"mul\", evaluated_by: \"W1-RULE\" },\n  { node: \"ne\", evaluated_by: \"W1-RULE\" },\n  { node: \"not\", evaluated_by: \"W1-RULE\" },\n  { node: \"not_contains\", evaluated_by: \"NOTION-Q\" },\n  { node: \"or\", evaluated_by: \"W1-RULE\" },\n  { node: \"parent_field\", evaluated_by: \"W1-RULE-APPLY\" },\n  { node: \"present\", evaluated_by: \"W1-RULE\" },\n  { node: \"previous\", evaluated_by: \"PIPELINES\" },\n  { node: \"sibling_count\", evaluated_by: \"STAGE-RULES\" },\n  { node: \"stage_count\", evaluated_by: \"PIPELINES\" },\n  { node: \"sub\", evaluated_by: \"W1-RULE\" },\n  { node: \"within\", evaluated_by: \"CHAIR-FILTER\" },\n] as const;\n\n/**\n * What each formula node answers (`custom.formula_node_kinds()`): number, text, boolean, date or unknown.\n * Generated, so a function the store adds can never be missing from a screen that types a formula.\n */\nexport const FORMULA_NODE_RESULTS: Readonly<Record<string, string>> = {\n  \"fx.abs\": \"number\",\n  \"fx.add\": \"number\",\n  \"fx.and\": \"boolean\",\n  \"fx.arraycompact\": \"unknown\",\n  \"fx.arrayflatten\": \"unknown\",\n  \"fx.arrayjoin\": \"text\",\n  \"fx.arrayslice\": \"unknown\",\n  \"fx.arrayunique\": \"unknown\",\n  \"fx.at\": \"unknown\",\n  \"fx.autonumber\": \"number\",\n  \"fx.average\": \"number\",\n  \"fx.blank\": \"unknown\",\n  \"fx.ceiling\": \"number\",\n  \"fx.concatenate\": \"text\",\n  \"fx.contains\": \"boolean\",\n  \"fx.count\": \"number\",\n  \"fx.counta\": \"number\",\n  \"fx.countall\": \"number\",\n  \"fx.created_time\": \"date\",\n  \"fx.current\": \"unknown\",\n  \"fx.current1\": \"unknown\",\n  \"fx.current2\": \"unknown\",\n  \"fx.dateadd\": \"date\",\n  \"fx.datediff\": \"number\",\n  \"fx.datestr\": \"text\",\n  \"fx.datetime_diff\": \"number\",\n  \"fx.datetime_format\": \"text\",\n  \"fx.datetime_parse\": \"date\",\n  \"fx.day\": \"number\",\n  \"fx.div\": \"number\",\n  \"fx.encode_url_component\": \"text\",\n  \"fx.eq\": \"boolean\",\n  \"fx.error\": \"unknown\",\n  \"fx.even\": \"number\",\n  \"fx.every\": \"boolean\",\n  \"fx.exp\": \"number\",\n  \"fx.false\": \"boolean\",\n  \"fx.filter\": \"unknown\",\n  \"fx.find\": \"number\",\n  \"fx.findfirst\": \"unknown\",\n  \"fx.first\": \"unknown\",\n  \"fx.floor\": \"number\",\n  \"fx.fromnow\": \"number\",\n  \"fx.gt\": \"boolean\",\n  \"fx.gte\": \"boolean\",\n  \"fx.hour\": \"number\",\n  \"fx.if\": \"unknown\",\n  \"fx.includes\": \"boolean\",\n  \"fx.index\": \"number\",\n  \"fx.int\": \"number\",\n  \"fx.is_after\": \"boolean\",\n  \"fx.is_before\": \"boolean\",\n  \"fx.is_same\": \"boolean\",\n  \"fx.isblank\": \"boolean\",\n  \"fx.iserror\": \"boolean\",\n  \"fx.join\": \"text\",\n  \"fx.last\": \"unknown\",\n  \"fx.last_modified_time\": \"date\",\n  \"fx.left\": \"text\",\n  \"fx.len\": \"number\",\n  \"fx.length\": \"number\",\n  \"fx.log\": \"number\",\n  \"fx.lower\": \"text\",\n  \"fx.lt\": \"boolean\",\n  \"fx.lte\": \"boolean\",\n  \"fx.map\": \"unknown\",\n  \"fx.max\": \"number\",\n  \"fx.median\": \"number\",\n  \"fx.mid\": \"text\",\n  \"fx.min\": \"number\",\n  \"fx.minute\": \"number\",\n  \"fx.mod\": \"number\",\n  \"fx.modified_time\": \"date\",\n  \"fx.month\": \"number\",\n  \"fx.mul\": \"number\",\n  \"fx.ne\": \"boolean\",\n  \"fx.neg\": \"number\",\n  \"fx.not\": \"boolean\",\n  \"fx.now\": \"date\",\n  \"fx.odd\": \"number\",\n  \"fx.or\": \"boolean\",\n  \"fx.power\": \"number\",\n  \"fx.record_id\": \"text\",\n  \"fx.recprop\": \"unknown\",\n  \"fx.regex_extract\": \"text\",\n  \"fx.regex_match\": \"boolean\",\n  \"fx.regex_replace\": \"text\",\n  \"fx.regexreplace\": \"text\",\n  \"fx.replace\": \"text\",\n  \"fx.rept\": \"text\",\n  \"fx.reverse\": \"unknown\",\n  \"fx.right\": \"text\",\n  \"fx.round\": \"number\",\n  \"fx.rounddown\": \"number\",\n  \"fx.roundup\": \"number\",\n  \"fx.search\": \"number\",\n  \"fx.second\": \"number\",\n  \"fx.set_locale\": \"date\",\n  \"fx.set_timezone\": \"date\",\n  \"fx.slice\": \"unknown\",\n  \"fx.some\": \"boolean\",\n  \"fx.sort\": \"unknown\",\n  \"fx.split\": \"unknown\",\n  \"fx.sqrt\": \"number\",\n  \"fx.sub\": \"number\",\n  \"fx.substitute\": \"text\",\n  \"fx.sum\": \"number\",\n  \"fx.switch\": \"unknown\",\n  \"fx.t\": \"text\",\n  \"fx.timestr\": \"text\",\n  \"fx.today\": \"date\",\n  \"fx.tonow\": \"number\",\n  \"fx.trim\": \"text\",\n  \"fx.true\": \"boolean\",\n  \"fx.unique\": \"unknown\",\n  \"fx.upper\": \"text\",\n  \"fx.value\": \"number\",\n  \"fx.weekday\": \"number\",\n  \"fx.weeknum\": \"number\",\n  \"fx.workday\": \"date\",\n  \"fx.workday_diff\": \"number\",\n  \"fx.xor\": \"boolean\",\n  \"fx.year\": \"number\",\n};\n\n/** REC-27. The kernel, by name and by id, as the store holds it. */\nexport const KERNEL_TABLES = [\n  { id: \"11111111-0000-4000-8000-000000000002\", name: \"Field\" },\n  { id: \"11111111-0000-4000-8000-000000000006\", name: \"File\" },\n  { id: \"11111111-0000-4000-8000-000000000009\", name: \"Merge Field\" },\n  { id: \"11111111-0000-4000-8000-000000000004\", name: \"Organization\" },\n  { id: \"11111111-0000-4000-8000-000000000005\", name: \"Person\" },\n  { id: \"11111111-0000-4000-8000-000000000007\", name: \"Presentation\" },\n  { id: \"11111111-0000-4000-8000-000000000003\", name: \"Rule\" },\n  { id: \"11111111-0000-4000-8000-000000000001\", name: \"Table\" },\n  { id: \"11111111-0000-4000-8000-000000000008\", name: \"Widget\" },\n] as const;\n\n/**\n * Every door the store actually has, with the argument list and the result the\n * catalog reports. A client call whose door is not in this list is answered\n * `door_absent` by name — never a guess, never a silent no-op.\n */\nexport const STORE_DOORS = [\n  { name: \"absence_reasons\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"action_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_actions jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"action_run\", args: \"p_organization_id uuid, p_action_id uuid, p_record_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"actor_vocabulary\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"actor_word\", args: \"p_declared text\", returns: \"text\", security: \"invoker\" },\n  { name: \"addressed_cap\", args: \"p_user_id uuid, p_type text, p_id uuid, p_organization_id uuid DEFAULT NULL::uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"permission_level\", security: \"definer\" },\n  { name: \"addressed_cap_specific\", args: \"p_user_id uuid, p_type text, p_id uuid, p_organization_id uuid DEFAULT NULL::uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"permission_level\", security: \"definer\" },\n  { name: \"admin_all_tables\", args: \"\", returns: \"TABLE(table_id uuid, table_name text, organization_id uuid, organization_name text, updated_at timestamp with time zone, platform_owned boolean, system boolean)\", security: \"definer\" },\n  { name: \"agent_change_approval\", args: \"p_organization uuid, p_conversation uuid DEFAULT NULL::uuid, p_table uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"agent_change_trust\", args: \"p_organization_id uuid, p_approval_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"agent_context\", args: \"p_organization_id uuid, p_table_id uuid, p_limit integer DEFAULT 50\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agent_context_value\", args: \"p_doc jsonb, p_key text, p_type text, p_organization_id uuid, p_record_id uuid, p_cap bigint\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agent_context_value_cap\", args: \"p_organization_id uuid\", returns: \"bigint\", security: \"invoker\" },\n  { name: \"agent_table_claim\", args: \"p_organization uuid, p_table uuid, p_conversation uuid DEFAULT NULL::uuid\", returns: \"void\", security: \"definer\" },\n  { name: \"agg_assert_key\", args: \"p_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_bucket_ordinal\", args: \"p_by text, p_window_from timestamp without time zone, p_at timestamp without time zone, p_week_start text\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_buckets\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"agg_cadence_normalize\", args: \"p_cadence text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_calendar\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agg_compare_kinds\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"agg_compare_windows\", args: \"p_organization_id uuid, p_compare jsonb, p_bucket jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agg_deliver\", args: \"p_organization_id uuid, p_rule_id uuid, p_record_id uuid, p_channel text, p_recipient_user_id uuid, p_event_key text, p_subject text, p_body text, p_payload jsonb DEFAULT '{}'::jsonb, p_dedupe_suffix text DEFAULT NULL::text\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"agg_deliver_quietly\", args: \"p_organization_id uuid, p_rule_id uuid, p_subject_id uuid, p_channel text, p_recipient_user_id uuid, p_event_key text, p_subject text, p_body text, p_payload jsonb, p_quiet_hours jsonb, p_link text, p_dedupe_suffix text DEFAULT NULL::text\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"agg_delta\", args: \"p_current jsonb, p_prior jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agg_digest_assemble\", args: \"p_organization_id uuid, p_rule_id uuid, p_since timestamp with time zone DEFAULT NULL::timestamp with time zone, p_until timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agg_digest_due_at\", args: \"p_cadence text, p_schedule text, p_quiet jsonb, p_after timestamp with time zone\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"agg_digest_judged_at\", args: \"p_organization_id uuid, p_rule_id uuid\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"agg_digest_run\", args: \"p_organization_id uuid, p_rule_id uuid DEFAULT NULL::uuid, p_since timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_digest_run_at\", args: \"p_organization_id uuid, p_rule_id uuid, p_since timestamp with time zone, p_now timestamp with time zone\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_digest_tick\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_digest_tick_at\", args: \"p_now timestamp with time zone, p_organization_id uuid DEFAULT NULL::uuid\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_explain\", args: \"p_organization_id uuid, p_table_id uuid, p_group_by jsonb DEFAULT '[]'::jsonb, p_measures jsonb DEFAULT '[]'::jsonb, p_bucket jsonb DEFAULT NULL::jsonb, p_filter jsonb DEFAULT '{}'::jsonb, p_required text DEFAULT 'viewer'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"agg_field_kind\", args: \"p_organization_id uuid, p_table_id uuid, p_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_field_value_sql\", args: \"p_organization_id uuid, p_table_id uuid, p_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_fields_readable_assert\", args: \"p_organization_id uuid, p_table_id uuid, p_keys text[], p_required text DEFAULT 'viewer'::text\", returns: \"void\", security: \"invoker\" },\n  { name: \"agg_group_value\", args: \"p_value text, p_kind text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agg_last_digest_at\", args: \"p_organization_id uuid, p_rule_id uuid\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"agg_local_label\", args: \"p_local timestamp without time zone, p_tz text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_moment_sql\", args: \"p_key text, p_tz text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_operations\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"agg_parse_moment\", args: \"p_raw text, p_tz text, p_what text\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"agg_period_start\", args: \"p_local timestamp without time zone, p_by text, p_week_start text DEFAULT 'monday'::text\", returns: \"timestamp without time zone\", security: \"invoker\" },\n  { name: \"agg_period_step\", args: \"p_by text\", returns: \"interval\", security: \"invoker\" },\n  { name: \"agg_quiet_until\", args: \"p_quiet jsonb, p_at timestamp with time zone\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"agg_record_name\", args: \"p_organization_id uuid, p_record_id uuid, p_state jsonb DEFAULT NULL::jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_split_parts\", args: \"p_organization_id uuid, p_table_id uuid, p_key text, p_alias text\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"agg_sql\", args: \"p_organization_id uuid, p_table_id uuid, p_group_by jsonb DEFAULT '[]'::jsonb, p_measures jsonb DEFAULT '[]'::jsonb, p_bucket jsonb DEFAULT NULL::jsonb, p_filter jsonb DEFAULT '{}'::jsonb, p_limit integer DEFAULT 200, p_required text DEFAULT 'viewer'::text, p_window jsonb DEFAULT NULL::jsonb, p_search text DEFAULT NULL::text, p_time_zone text DEFAULT NULL::text, p_split_multi boolean DEFAULT false\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_subscription_cadences\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"agg_subscription_fire\", args: \"p_organization_id uuid, p_record_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_changed_field_ids jsonb DEFAULT '[]'::jsonb\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_subscription_fire_entered\", args: \"p_organization_id uuid, p_record_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_since timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_subscription_tick\", args: \"p_window interval DEFAULT '00:15:00'::interval\", returns: \"integer\", security: \"invoker\" },\n  { name: \"agg_subscriptions\", args: \"p_organization_id uuid, p_saved_view_id uuid DEFAULT NULL::uuid, p_cadence text DEFAULT NULL::text\", returns: \"TABLE(rule_id uuid, saved_view_id uuid, table_id uuid, cadence text, schedule text, quiet_hours jsonb, channel text, recipient_user_id uuid, event_key text, name text)\", security: \"invoker\" },\n  { name: \"agg_value_sql\", args: \"p_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_value_text\", args: \"p_value jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"agg_view_admits\", args: \"p_organization_id uuid, p_saved_view_id uuid, p_record_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"agg_view_admits_state\", args: \"p_definition jsonb, p_state jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"agg_withheld_marker\", args: \"p_organization_id uuid, p_table_id uuid, p_key text, p_required text DEFAULT 'viewer'::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"agg_zero\", args: \"p_measures jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"anon_capture\", args: \"p_organization_id uuid, p_client_key text, p_table_id uuid, p_payload jsonb, p_device text DEFAULT NULL::text, p_captured_at timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"uuid\", security: \"definer\" },\n  { name: \"anon_clear\", args: \"p_organization_id uuid, p_submission_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"anon_inbound_land\", args: \"p_address text, p_secret text, p_payload jsonb, p_raw_payload jsonb DEFAULT '{}'::jsonb, p_client_key text DEFAULT NULL::text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"anon_publish\", args: \"p_organization_id uuid, p_form_id uuid, p_published boolean DEFAULT true\", returns: \"timestamp with time zone\", security: \"definer\" },\n  { name: \"anon_rate_take\", args: \"p_organization_id uuid, p_form_id uuid, p_bucket text, p_token_id uuid DEFAULT NULL::uuid\", returns: \"integer\", security: \"definer\" },\n  { name: \"anon_submissions\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_state text DEFAULT NULL::text, p_limit integer DEFAULT 100, p_offset integer DEFAULT 0\", returns: \"TABLE(id uuid, form_id uuid, inbound_id uuid, table_id uuid, source text, state text, payload jsonb, raw_payload jsonb, client_key text, record_id uuid, remote_origin text, rejection_reason text, created_at timestamp with time zone, cleared_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"anon_token_issue\", args: \"p_organization_id uuid, p_mode text, p_allowed_origins jsonb, p_form_id uuid DEFAULT NULL::uuid, p_saved_view_id uuid DEFAULT NULL::uuid, p_record_id uuid DEFAULT NULL::uuid, p_expires_at timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"TABLE(token_id uuid, secret text)\", security: \"definer\" },\n  { name: \"anon_token_revoke\", args: \"p_organization_id uuid, p_token_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"anon_token_verify\", args: \"p_secret text, p_origin text, p_required_mode text\", returns: \"TABLE(token_id uuid, organization_id uuid, form_id uuid, saved_view_id uuid, record_id uuid, mode text)\", security: \"definer\" },\n  { name: \"anon_write\", args: \"p_secret text, p_origin text, p_payload jsonb, p_client_key text DEFAULT NULL::text, p_raw_payload jsonb DEFAULT '{}'::jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"applicable_fields\", args: \"p_organization_id uuid, p_table_id uuid, p_record_type text DEFAULT NULL::text\", returns: \"SETOF custom.record\", security: \"definer\" },\n  { name: \"archive_event_of\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"history.migration_log\", security: \"definer\" },\n  { name: \"archive_guard_count\", args: \"p_value jsonb\", returns: \"integer\", security: \"invoker\" },\n  { name: \"archive_guard_decide\", args: \"p_organization_id uuid, p_scope text, p_live_before integer, p_ids text[], p_confirm text, p_log jsonb, p_now timestamp with time zone DEFAULT now(), p_share numeric DEFAULT NULL::numeric, p_hours numeric DEFAULT NULL::numeric\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"archive_guard_knob\", args: \"p_key text, p_organization_id uuid\", returns: \"numeric\", security: \"invoker\" },\n  { name: \"archive_guard_log_add\", args: \"p_log jsonb, p_entry jsonb, p_organization_id uuid, p_now timestamp with time zone DEFAULT now()\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"archive_guard_when\", args: \"p_value jsonb\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"archive_hold_answer\", args: \"p_organization_id uuid, p_table_id uuid, p_answer text, p_token text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"archived_tables_everywhere\", args: \"p_lane text DEFAULT 'org'::text, p_limit integer DEFAULT 100, p_offset integer DEFAULT 0, p_sort text DEFAULT 'archived_at'::text, p_desc boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"assert_client_may_change\", args: \"p_organization_id uuid, p_subject_id uuid, p_door text, p_required permission_level DEFAULT 'editor'::permission_level, p_subject_word text DEFAULT 'record'::text\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_client_may_open\", args: \"p_organization_id uuid, p_subject_id uuid, p_door text, p_required permission_level DEFAULT 'viewer'::permission_level, p_subject_word text DEFAULT 'record'::text\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_client_may_reach\", args: \"p_organization_id uuid, p_door text\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_columns_are_defined\", args: \"p_organization_id uuid, p_record_id uuid, p_patch jsonb\", returns: \"void\", security: \"definer\" },\n  { name: \"assert_entity_door\", args: \"p_organization_id uuid, p_door text\", returns: \"void\", security: \"definer\" },\n  { name: \"assert_entity_is_organization_scoped\", args: \"p_token text, p_label text, p_scoped boolean\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_may_know_table\", args: \"p_organization_id uuid, p_table_id uuid, p_door text\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_organization_admin\", args: \"p_organization_id uuid, p_door text, p_what text\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_organization_wall\", args: \"p_kind text, p_organization_id uuid, p_row jsonb\", returns: \"void\", security: \"invoker\" },\n  { name: \"assert_public_reader_names_a_public_table\", args: \"p_organization_id uuid, p_table_id uuid, p_door text\", returns: \"void\", security: \"definer\" },\n  { name: \"assert_scope_door\", args: \"p_organization_id uuid, p_door text\", returns: \"void\", security: \"definer\" },\n  { name: \"assert_store_door\", args: \"p_organization_id uuid, p_door text\", returns: \"void\", security: \"invoker\" },\n  { name: \"automation_app_event\", args: \"p_automation_id uuid, p_items jsonb, p_cursor jsonb, p_expected_owner text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_app_may_edit\", args: \"p_automation_id uuid, p_user_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"automation_app_note\", args: \"p_automation_id uuid, p_says text, p_cursor jsonb, p_expected_owner text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_app_stop\", args: \"p_automation_id uuid, p_says text, p_expected_owner text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_app_watch\", args: \"p_automation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_archive\", args: \"p_organization_id uuid, p_automation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_claim_pending\", args: \"p_worker text, p_limit integer DEFAULT 5, p_lease_seconds integer DEFAULT 180\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_spec jsonb, p_automation_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_delivery_tick\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"automation_note\", args: \"p_run_id uuid, p_says text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_restore\", args: \"p_organization_id uuid, p_automation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_resume\", args: \"p_run_id uuid, p_output jsonb, p_error text DEFAULT NULL::text, p_logs jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_revision_restore\", args: \"p_organization_id uuid, p_automation_id uuid, p_revision_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_revisions\", args: \"p_organization_id uuid, p_automation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_runs\", args: \"p_automation_id uuid, p_limit integer DEFAULT 50, p_cursor timestamp with time zone DEFAULT NULL::timestamp with time zone, p_organization_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_set_enabled\", args: \"p_organization_id uuid, p_automation_id uuid, p_enabled boolean\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_step_mark\", args: \"p_run_id uuid, p_n integer, p_state text, p_output jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_test\", args: \"p_organization_id uuid, p_automation_id uuid, p_record_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automation_time_tick\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"automation_webhook_receive\", args: \"p_automation_id uuid, p_secret text, p_body jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"automations\", args: \"p_table_id uuid, p_organization_id uuid DEFAULT NULL::uuid, p_include_archived boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"autonumber_backfill\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"barcode_symbologies\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"base_activity\", args: \"p_organization_id uuid, p_subject_id uuid, p_limit integer DEFAULT 50, p_before bigint DEFAULT NULL::bigint\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"base_copy_finish\", args: \"p_organization_id uuid, p_pairs jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"base_move\", args: \"p_home_id uuid, p_to_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"base_move_access_kept\", args: \"p_home_id uuid, p_to_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"base_move_remove_access\", args: \"p_home_id uuid, p_user_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"booking_busy_due\", args: \"p_form_id uuid\", returns: \"TABLE(feed text, due boolean, timezone text, days integer, read_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"booking_busy_set\", args: \"p_form_id uuid, p_busy jsonb, p_problem text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"booking_cancel\", args: \"p_booking_ref text, p_origin text DEFAULT NULL::text\", returns: \"TABLE(booking_ref text, record_id uuid, slot_key text, state text, message text)\", security: \"definer\" },\n  { name: \"booking_confirm\", args: \"p_form_id uuid, p_hold_id uuid, p_origin text, p_payload jsonb, p_bucket text, p_honeypot text DEFAULT NULL::text, p_client_key text DEFAULT NULL::text\", returns: \"TABLE(booking_ref text, record_id uuid, submission_id uuid, slot_key text, slot_at timestamp with time zone, state text, message text)\", security: \"definer\" },\n  { name: \"booking_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_title text, p_questions jsonb, p_availability jsonb DEFAULT '{}'::jsonb, p_presentation jsonb DEFAULT '{}'::jsonb, p_submission_cap integer DEFAULT NULL::integer, p_quarantine_rule_id uuid DEFAULT NULL::uuid, p_notify_rule_id uuid DEFAULT NULL::uuid, p_form_id uuid DEFAULT NULL::uuid, p_slug text DEFAULT NULL::text, p_home_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"booking_hold\", args: \"p_form_id uuid, p_slot_key text, p_origin text, p_bucket text, p_client_key text DEFAULT NULL::text\", returns: \"TABLE(hold_id uuid, slot_key text, expires_at timestamp with time zone, member_user_id uuid, state text, message text)\", security: \"definer\" },\n  { name: \"booking_manage\", args: \"p_booking_ref text, p_days integer DEFAULT NULL::integer\", returns: \"TABLE(booking_ref text, form_id uuid, title text, slot_key text, slot_at timestamp with time zone, status text, slots jsonb, availability jsonb, state text, message text)\", security: \"definer\" },\n  { name: \"booking_messages\", args: \"p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid, p_event text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"booking_notify\", args: \"p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid, p_event text, p_when text\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"booking_public\", args: \"p_form_id uuid, p_days integer DEFAULT NULL::integer\", returns: \"TABLE(form_id uuid, organization_id uuid, table_id uuid, title text, presentation jsonb, fields jsonb, honeypot_key text, availability jsonb, slots jsonb, state text, message text)\", security: \"definer\" },\n  { name: \"booking_reschedule\", args: \"p_booking_ref text, p_slot_key text, p_origin text, p_bucket text DEFAULT NULL::text\", returns: \"TABLE(booking_ref text, record_id uuid, slot_key text, slot_at timestamp with time zone, state text, message text)\", security: \"definer\" },\n  { name: \"booking_sms_consent\", args: \"p_booking_ref text, p_phone text, p_text_shown text, p_origin text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"bookings\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(form_id uuid, table_id uuid, title text, slug text, published_at timestamp with time zone, closed_at timestamp with time zone, slot_minutes integer, timezone text, slot_table_id uuid, booked bigint, cancelled bigint, upcoming bigint, held bigint, next_at timestamp with time zone, state text)\", security: \"definer\" },\n  { name: \"bump_epoch\", args: \"p_entity_type text, p_entity_id uuid, p_organization_id uuid DEFAULT NULL::uuid\", returns: \"bigint\", security: \"definer\" },\n  { name: \"button_press\", args: \"p_organization_id uuid, p_record_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"cache_lookup\", args: \"p_container_type text, p_container_id uuid, p_item_type text, p_item_id uuid\", returns: \"permission_level\", security: \"definer\" },\n  { name: \"caller_role\", args: \"\", returns: \"name\", security: \"invoker\" },\n  { name: \"capture_open\", args: \"p_organization_id uuid, p_sheet_id uuid\", returns: \"TABLE(sheet_id uuid, organization_id uuid, table_id uuid, title text, presentation jsonb, fields jsonb, state text, may_capture boolean, message text)\", security: \"definer\" },\n  { name: \"capture_publish\", args: \"p_organization_id uuid, p_sheet_id uuid, p_open boolean DEFAULT true\", returns: \"timestamp with time zone\", security: \"definer\" },\n  { name: \"capture_sheet_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_title text, p_questions jsonb, p_presentation jsonb DEFAULT '{}'::jsonb, p_sheet_id uuid DEFAULT NULL::uuid, p_notify_rule_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"capture_sheets\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(sheet_id uuid, table_id uuid, title text, slug text, state text, opened_at timestamp with time zone, captures bigint, replays bigint, last_capture_at timestamp with time zone, presentation jsonb)\", security: \"definer\" },\n  { name: \"capture_submit\", args: \"p_organization_id uuid, p_sheet_id uuid, p_client_key text, p_payload jsonb, p_files jsonb DEFAULT '[]'::jsonb, p_device text DEFAULT NULL::text, p_captured_at timestamp with time zone DEFAULT NULL::timestamp with time zone, p_location jsonb DEFAULT NULL::jsonb\", returns: \"TABLE(record_id uuid, state text, message text, replay boolean, file_ids uuid[])\", security: \"definer\" },\n  { name: \"carry_unchanged_value_stamps\", args: \"p_old jsonb, p_new jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"carrying_edges_in\", args: \"p_organization_id uuid\", returns: \"TABLE(container_type text, container_id uuid, item_type text, item_id uuid, conveys_max permission_level)\", security: \"definer\" },\n  { name: \"carrying_edges_of\", args: \"p_item_type text, p_item_id uuid\", returns: \"TABLE(container_type text, container_id uuid, conveys_max permission_level)\", security: \"definer\" },\n  { name: \"checklist_declare\", args: \"p_organization_id uuid, p_spec jsonb, p_template_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"checklist_refusal\", args: \"p_spec jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"checklist_run\", args: \"p_organization_id uuid, p_run_id uuid\", returns: \"TABLE(step_id uuid, step_order integer, ref text, title text, role text, assignee_name text, assignee_user_id uuid, due_on timestamp with time zone, due_state text, status text, finished boolean, requires text, requires_key text, requires_label text, requires_id uuid, evidence jsonb, blocked_by text[], may_complete boolean, refusal text)\", security: \"definer\" },\n  { name: \"checklist_runs\", args: \"p_organization_id uuid, p_about_table_id uuid DEFAULT NULL::uuid, p_about_record_id uuid DEFAULT NULL::uuid, p_include_closed boolean DEFAULT true, p_limit integer DEFAULT 100\", returns: \"TABLE(run_id uuid, name text, template_id uuid, template text, about_record_id uuid, about text, about_table_id uuid, started_at timestamp with time zone, started_by uuid, origin text, step_count integer, done integer, overdue integer, next_step text, next_due timestamp with time zone, closed_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"checklist_start\", args: \"p_organization_id uuid, p_template_id uuid, p_about_record_id uuid DEFAULT NULL::uuid, p_roles jsonb DEFAULT '{}'::jsonb, p_starting_at timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"checklist_step_complete\", args: \"p_organization_id uuid, p_step_id uuid, p_evidence jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"checklist_step_refusal\", args: \"p_organization_id uuid, p_step_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"checklist_steps_table\", args: \"p_organization_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"checklist_template_shape\", args: \"p_organization_id uuid, p_template_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"checklist_templates\", args: \"p_organization_id uuid, p_about_table_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 100\", returns: \"TABLE(template_id uuid, name text, about_table_id uuid, about_table text, steps integer, roles integer, trigger_kind text, trigger_status text, open_runs integer, total_runs integer, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"checklist_templates_archived\", args: \"p_organization_id uuid, p_about_table_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 100\", returns: \"TABLE(template_id uuid, name text, about_table_id uuid, about_table text, steps integer, archived_at timestamp with time zone, archived_by uuid, table_archived boolean)\", security: \"definer\" },\n  { name: \"choice_census\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"choice_field_map\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_filter_normalize\", args: \"p_map jsonb, p_filter jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_key_for\", args: \"p_organization_id uuid, p_options_table_id uuid, p_title text, p_exclude uuid DEFAULT NULL::uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"choice_key_of\", args: \"p_field jsonb, p_token text\", returns: \"text\", security: \"invoker\" },\n  { name: \"choice_nudge\", args: \"p_organization_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"choice_options\", args: \"p_organization_id uuid, p_options_table_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_render\", args: \"p_organization_id uuid, p_table_id uuid, p_doc jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_render_groups\", args: \"p_map jsonb, p_groups jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_render_note\", args: \"p_field jsonb, p_value jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_render_plan\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_render_value\", args: \"p_field jsonb, p_value jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_render_with\", args: \"p_organization_id uuid, p_table_id uuid, p_doc jsonb, p_plan jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"choice_slug\", args: \"p_word text\", returns: \"text\", security: \"invoker\" },\n  { name: \"choice_synonyms\", args: \"p_organization_id uuid, p_table_id uuid, p_token text\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"choice_synonyms_in\", args: \"p_map jsonb, p_token text\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"choice_value_keys\", args: \"p_field jsonb, p_value jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"choice_words\", args: \"p_field jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"choice_words_normalize\", args: \"p_field jsonb, p_const jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"client_write_grants\", args: \"\", returns: \"TABLE(role_name text, object_name text, privilege text)\", security: \"invoker\" },\n  { name: \"comment_counts\", args: \"p_organization_id uuid, p_record_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"comment_mention_deliver\", args: \"p_organization_id uuid, p_record_id uuid, p_table_id uuid, p_comment_id uuid, p_recipient uuid, p_author_name text, p_record_title text, p_body text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"comment_thread\", args: \"p_organization_id uuid, p_record_id uuid, p_include_resolved boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"comment_write\", args: \"p_organization_id uuid, p_record_id uuid, p_body text, p_anchor jsonb DEFAULT '{}'::jsonb, p_parent_comment_id uuid DEFAULT NULL::uuid, p_mentions uuid[] DEFAULT NULL::uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"computed_block\", args: \"p_block jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"computed_provenance\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(field_key text, field_id uuid, value jsonb, rule_id uuid, rule_version integer, computed_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"computed_refresh\", args: \"p_org uuid, p_table uuid, p_ids uuid[]\", returns: \"integer\", security: \"invoker\" },\n  { name: \"computed_refresh\", args: \"p_table_id uuid, p_max_rows integer DEFAULT 200\", returns: \"integer\", security: \"definer\" },\n  { name: \"computed_refresh_drain\", args: \"p_ms integer DEFAULT 8000\", returns: \"integer\", security: \"invoker\" },\n  { name: \"computed_refresh_progress\", args: \"p_org uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"computed_sort_ceiling\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"computed_warm\", args: \"p_table_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"confidential_anchor\", args: \"p_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"confidential_answer\", args: \"p_user uuid, p_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"boolean\", security: \"definer\" },\n  { name: \"confidential_header\", args: \"p_user uuid, p_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"confidential_names\", args: \"p_organization_id uuid, p_value jsonb, p_user uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"containment_chain\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(ancestor_id uuid, depth integer)\", security: \"invoker\" },\n  { name: \"containment_depth_ceiling\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"integer\", security: \"invoker\" },\n  { name: \"containment_edges\", args: \"p_organization_id uuid\", returns: \"TABLE(parent_id uuid, child_id uuid, via text)\", security: \"invoker\" },\n  { name: \"containment_parent\", args: \"p_data jsonb\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"context_archived_types\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_class_for_checkout\", args: \"p_scope_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_compare_facts\", args: \"p_user_id uuid, p_record_ids uuid[], p_item_ids uuid[] DEFAULT NULL::uuid[], p_cells jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_item_archive\", args: \"p_item_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_item_restore\", args: \"p_item_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_item_row_of\", args: \"p_field custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"context_item_write\", args: \"p_item_id uuid, p_scope_type_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_items\", args: \"p_scope_type_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_policy_rank\", args: \"p_policy text\", returns: \"integer\", security: \"invoker\" },\n  { name: \"context_resolve\", args: \"p_bindings jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_scope_archive\", args: \"p_scope_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_scope_restore\", args: \"p_scope_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_scope_write\", args: \"p_organization_id uuid, p_scope_id uuid, p_type_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_scopes\", args: \"p_scope_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_system_items\", args: \"\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_tags_set\", args: \"p_entity_type text, p_entity_id uuid, p_scope_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_template_define\", args: \"p_organization_id uuid, p_definition jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"context_templates\", args: \"\", returns: \"SETOF jsonb\", security: \"invoker\" },\n  { name: \"context_tree\", args: \"p_organization_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_tree_search\", args: \"p_organization_ids uuid[], p_query text, p_limit integer DEFAULT 100\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_tree_type_scopes\", args: \"p_scope_type_id uuid, p_offset integer DEFAULT 0, p_limit integer DEFAULT 200\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_tree_types\", args: \"p_organization_ids uuid[], p_with_counts boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_type_archive\", args: \"p_type_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_type_restore\", args: \"p_type_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_type_write\", args: \"p_organization_id uuid, p_type_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"context_value_write\", args: \"p_payload jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"context_values\", args: \"p_scope_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"conversation_scope\", args: \"p_organization_id uuid, p_conversation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"conversation_scope_bind\", args: \"p_organization_id uuid, p_conversation_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"conversation_scope_context\", args: \"p_organization_id uuid, p_conversation_id uuid, p_relations integer DEFAULT 12, p_history integer DEFAULT 15, p_siblings integer DEFAULT 8\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"conversation_scope_unbind\", args: \"p_organization_id uuid, p_conversation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"copy_table_extras\", args: \"p_organization_id uuid, p_pairs jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"count_records_archived\", args: \"p_organization_id uuid, p_table_ids uuid[], p_lane text DEFAULT 'org'::text\", returns: \"TABLE(table_id uuid, n integer)\", security: \"definer\" },\n  { name: \"cross_organization_links_open\", args: \"p_source_organization_id uuid, p_target_organization_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"custom_fields_on\", args: \"p_organization_id uuid, p_table_token text\", returns: \"TABLE(field_id uuid, field_key text, field_label text, field_type text, field_source text, field_required boolean, field_sort numeric, table_label text)\", security: \"definer\" },\n  { name: \"custom_fields_tables\", args: \"\", returns: \"TABLE(token text, schema_name text, table_name text)\", security: \"invoker\" },\n  { name: \"dashboard_block_normalize\", args: \"p_organization_id uuid, p_subject_table_id uuid, p_block jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"dashboard_class\", args: \"\", returns: \"text\", security: \"invoker\" },\n  { name: \"dashboard_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_name text, p_blocks jsonb DEFAULT '[]'::jsonb, p_presentation jsonb DEFAULT '{}'::jsonb, p_dashboard_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"dashboard_delete\", args: \"p_organization_id uuid, p_dashboard_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"dashboard_field_keys\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"text[]\", security: \"definer\" },\n  { name: \"dashboard_kinds\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"dashboard_moment_sql\", args: \"p_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"dashboard_restore\", args: \"p_organization_id uuid, p_dashboard_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"dashboard_run\", args: \"p_organization_id uuid, p_dashboard_id uuid, p_filter jsonb DEFAULT '{}'::jsonb, p_compare jsonb DEFAULT NULL::jsonb, p_grain text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"dashboard_stuck\", args: \"p_organization_id uuid, p_table_id uuid, p_state_key text, p_days integer DEFAULT 14, p_filter jsonb DEFAULT '{}'::jsonb, p_limit integer DEFAULT 50, p_required text DEFAULT 'viewer'::text\", returns: \"TABLE(record_id uuid, title text, state text, last_changed_at timestamp with time zone, days_unchanged numeric, measured_from text)\", security: \"definer\" },\n  { name: \"dashboard_target_field_assert\", args: \"p_organization_id uuid, p_table_id uuid, p_field_key text\", returns: \"void\", security: \"invoker\" },\n  { name: \"dashboard_window_sql\", args: \"p_key text, p_window jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"dashboards\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(dashboard_id uuid, table_id uuid, name text, blocks jsonb, presentation jsonb, block_count integer, version integer, created_at timestamp with time zone, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"data_home\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_search text DEFAULT NULL::text, p_include_platform_tables boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"data_home_changed_by\", args: \"p_asks jsonb\", returns: \"TABLE(organization_id uuid, id uuid, at timestamp with time zone, who text)\", security: \"definer\" },\n  { name: \"data_home_custom_fields\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(organization_id uuid, organization_name text, table_token text, table_label text, field_count integer, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"data_home_first\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_include_platform_tables boolean DEFAULT false, p_limit integer DEFAULT 100\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"data_home_items\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(kind text, organization_id uuid, organization_name text, item_id uuid, table_id uuid, table_name text, item_row jsonb)\", security: \"definer\" },\n  { name: \"data_home_slim\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_search text DEFAULT NULL::text, p_include_platform_tables boolean DEFAULT false\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"data_home_tables\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(table_id uuid, table_name text, organization_id uuid, organization_name text, member boolean, visibility text, updated_at timestamp with time zone, mine boolean, shared_with_me boolean, platform_owned boolean, kind text, team boolean, system boolean, created_by uuid)\", security: \"definer\" },\n  { name: \"data_home_tables\", args: \"p_organization_id uuid, p_include_platform_tables boolean\", returns: \"TABLE(table_id uuid, table_name text, organization_id uuid, organization_name text, member boolean, visibility text, updated_at timestamp with time zone, mine boolean, shared_with_me boolean, platform_owned boolean, kind text, team boolean, system boolean, created_by uuid)\", security: \"invoker\" },\n  { name: \"day_zone\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"declared_conversation\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"decoration_colors\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"decoration_rule_ops\", args: \"\", returns: \"TABLE(op text, takes_value boolean, label text)\", security: \"invoker\" },\n  { name: \"delete_cascade_closure\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"uuid[]\", security: \"invoker\" },\n  { name: \"delete_preview\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"delete_rule\", args: \"p_organization_id uuid, p_record_id uuid, p_apply boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"dependency_cycle\", args: \"p_organization_id uuid, p_row custom.record\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"dependency_label\", args: \"p_organization_id uuid, p_node text\", returns: \"text\", security: \"invoker\" },\n  { name: \"derive_visibility\", args: \"p_container_type text, p_container_id uuid\", returns: \"TABLE(item_type text, item_id uuid, depth integer, max_level permission_level)\", security: \"definer\" },\n  { name: \"derived_value\", args: \"p_organization_id uuid, p_record_id uuid, p_field_data jsonb, p_values jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"derived_values\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"derived_values_of\", args: \"v_rec custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"display_format_ids\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"doc_content_hash\", args: \"p_body text\", returns: \"text\", security: \"invoker\" },\n  { name: \"doc_format_value\", args: \"p_field_data jsonb, p_value jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"doc_letterhead\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"doc_name_token_pattern\", args: \"\", returns: \"text\", security: \"invoker\" },\n  { name: \"doc_name_tokens\", args: \"p_body text\", returns: \"TABLE(ordinal integer, raw text)\", security: \"invoker\" },\n  { name: \"doc_render_body\", args: \"p_organization_id uuid, p_template_id uuid, p_record_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"doc_render_delete\", args: \"p_organization_id uuid, p_render_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"doc_render_document\", args: \"p_organization_id uuid, p_template_id uuid, p_record_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"doc_render_read\", args: \"p_organization_id uuid, p_render_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"doc_render_restore\", args: \"p_organization_id uuid, p_render_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"doc_render_write\", args: \"p_organization_id uuid, p_template_id uuid, p_record_id uuid, p_table_id uuid, p_template_version integer, p_body text, p_content_hash text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"doc_renders\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(render_id uuid, template_id uuid, record_id uuid, table_id uuid, template_version integer, body text, content_hash text, rendered_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"doc_sign\", args: \"p_organization_id uuid, p_render_id uuid, p_field_key text, p_signer_name text, p_signer_user_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"doc_signature_field_ok\", args: \"p_field_data jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"doc_signature_intact\", args: \"p_organization_id uuid, p_signature_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"doc_signature_read\", args: \"p_organization_id uuid, p_signature_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"doc_signature_write\", args: \"p_organization_id uuid, p_render_id uuid, p_record_id uuid, p_field_key text, p_signer_name text, p_signer_user_id uuid, p_document_hash text, p_document_version integer\", returns: \"uuid\", security: \"definer\" },\n  { name: \"doc_signatures\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(signature_id uuid, render_id uuid, record_id uuid, field_key text, signer_name text, signer_user_id uuid, signed_at timestamp with time zone, document_hash text, document_version integer)\", security: \"definer\" },\n  { name: \"doc_template_delete\", args: \"p_organization_id uuid, p_template_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"doc_template_read\", args: \"p_organization_id uuid, p_template_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"doc_template_restore\", args: \"p_organization_id uuid, p_template_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"doc_template_save\", args: \"p_organization_id uuid, p_table_id uuid, p_name text, p_body text, p_template_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"doc_templates\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(template_id uuid, renders_table_id uuid, name text, body text, template_version integer, token_count bigint, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"doc_token_pattern\", args: \"\", returns: \"text\", security: \"invoker\" },\n  { name: \"doc_tokens\", args: \"p_body text\", returns: \"TABLE(ordinal integer, raw text, field_id uuid)\", security: \"invoker\" },\n  { name: \"doc_unresolved_tokens\", args: \"p_organization_id uuid, p_table_id uuid, p_body text\", returns: \"TABLE(raw text, field_id uuid, why text)\", security: \"invoker\" },\n  { name: \"door_reads_only\", args: \"p_door text\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"doors_not_deciding_the_caller\", args: \"\", returns: \"TABLE(function_name text, identity_args text)\", security: \"invoker\" },\n  { name: \"doors_not_deciding_the_record\", args: \"\", returns: \"TABLE(function_name text, identity_args text, why text)\", security: \"invoker\" },\n  { name: \"doors_not_masking_fields\", args: \"\", returns: \"TABLE(function_name text, identity_args text, why text)\", security: \"invoker\" },\n  { name: \"doors_not_on_one_ladder\", args: \"\", returns: \"TABLE(function_name text, identity_args text, why text)\", security: \"invoker\" },\n  { name: \"doors_refusing_in_another_doors_name\", args: \"\", returns: \"TABLE(function_name text, identity_args text, why text)\", security: \"invoker\" },\n  { name: \"drill_resolve\", args: \"p_organization_id uuid, p_table_id uuid, p_group_by jsonb, p_measures jsonb, p_bucket jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"effective_level\", args: \"p_user_id uuid, p_organization_id uuid, p_id uuid, p_type text DEFAULT 'record'::text\", returns: \"permission_level\", security: \"definer\" },\n  { name: \"effective_level_many\", args: \"p_user_id uuid, p_ids uuid[], p_type text DEFAULT 'record'::text\", returns: \"TABLE(id uuid, level permission_level)\", security: \"definer\" },\n  { name: \"enrich_cells\", args: \"p_organization_id uuid, p_table_id uuid, p_field_keys text[] DEFAULT NULL::text[], p_record_ids uuid[] DEFAULT NULL::uuid[]\", returns: \"TABLE(record_id uuid, field_key text, agent_owned boolean, value jsonb, value_version integer, actor text, on_behalf_of text, written_at timestamp with time zone, source jsonb, absent_reason text, alternates jsonb, pinned boolean, stale boolean, due_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"enrich_data_source\", args: \"p_ds jsonb, p_inputs jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"enrich_declare\", args: \"p_organization_id uuid, p_field_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"enrich_due\", args: \"p_organization_id uuid, p_field_id uuid, p_limit integer DEFAULT 50, p_include_fresh boolean DEFAULT false, p_record_ids uuid[] DEFAULT NULL::uuid[]\", returns: \"TABLE(record_id uuid, title text, inputs jsonb, current_value jsonb, written_at timestamp with time zone, reason text, trimmed_to integer)\", security: \"definer\" },\n  { name: \"enrich_land\", args: \"p_organization_id uuid, p_field_id uuid, p_results jsonb, p_run jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"enrich_normalize\", args: \"p_organization_id uuid, p_table_id uuid, p_field_key text, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"enrich_pin\", args: \"p_organization_id uuid, p_record_id uuid, p_field_key text, p_pinned boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"enrich_refill_due_tick\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"enrich_run_class\", args: \"\", returns: \"text\", security: \"invoker\" },\n  { name: \"enrich_runs\", args: \"p_organization_id uuid, p_field_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50\", returns: \"TABLE(run_id uuid, field_id uuid, field_key text, model text, trigger_word text, rows_seen integer, rows_written integer, rows_absent integer, rows_below_floor integer, rows_pinned integer, rows_refused integer, cost_cents numeric, cost_per_row_cents numeric, ran_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"enrich_sensitivity_rank\", args: \"p_word text\", returns: \"integer\", security: \"invoker\" },\n  { name: \"enrich_triggers\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"enrichments\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(field_id uuid, table_id uuid, field_key text, label text, enrichment jsonb, enabled boolean, review_interval_days integer, rows_total integer, rows_filled integer, rows_stale integer, rows_pinned integer, rows_absent integer, runs integer, cost_cents numeric, cost_per_row_cents numeric, last_run_at timestamp with time zone, last_run jsonb)\", security: \"definer\" },\n  { name: \"entity_back_links\", args: \"p_organization_id uuid, p_token text, p_record_id uuid, p_limit integer DEFAULT 50, p_cursor text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_custom_value_apply\", args: \"p_organization_id uuid, p_token text, p_record_id uuid, p_clear text[], p_patch jsonb, p_expected_version integer DEFAULT NULL::integer\", returns: \"integer\", security: \"definer\" },\n  { name: \"entity_custom_values_lock\", args: \"p_token text\", returns: \"TABLE(locked boolean, reason text)\", security: \"definer\" },\n  { name: \"entity_field_declare\", args: \"p_organization_id uuid, p_token text, p_spec jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"entity_field_protect_arman_explicitly_approved\", args: \"p_field_id uuid, p_readers jsonb, p_arman_words text, p_approved_on date\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_field_retire\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"entity_field_rights\", args: \"p_organization_id uuid, p_token text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_field_update\", args: \"p_organization_id uuid, p_field_id uuid, p_patch jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"entity_fields\", args: \"p_organization_id uuid, p_token text, p_include_retired boolean DEFAULT false\", returns: \"SETOF custom.record\", security: \"definer\" },\n  { name: \"entity_fields_across\", args: \"p_token text, p_organization_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_read_mask\", args: \"p_organization_id uuid, p_token text, p_level permission_level, p_action text DEFAULT 'read'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_record_home\", args: \"p_token text, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_record_read\", args: \"p_organization_id uuid, p_token text, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_records_find\", args: \"p_organization_id uuid, p_token text, p_key text, p_value jsonb DEFAULT NULL::jsonb, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_reference_fields\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_reference_kinds\", args: \"\", returns: \"TABLE(token text, label text, category text)\", security: \"definer\" },\n  { name: \"entity_reference_render\", args: \"p_organization_id uuid, p_table_id uuid, p_doc jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_reference_render_with\", args: \"p_organization_id uuid, p_table_id uuid, p_doc jsonb, p_fields jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_reference_rows\", args: \"p_organization_id uuid, p_token text, p_ids uuid[]\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_reference_search\", args: \"p_organization_id uuid, p_tokens text[], p_search text DEFAULT NULL::text, p_limit integer DEFAULT 20\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_reference_target\", args: \"p_token text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_reference_words\", args: \"p_organization_id uuid, p_refs jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"entity_row_propose\", args: \"p_organization_id uuid, p_token text, p_record_id uuid, p_columns jsonb DEFAULT '{}'::jsonb, p_custom jsonb DEFAULT '{}'::jsonb, p_expected_version integer DEFAULT NULL::integer, p_archive boolean DEFAULT NULL::boolean, p_note text DEFAULT NULL::text, p_conversation_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_row_write\", args: \"p_organization_id uuid, p_token text, p_record_id uuid, p_columns jsonb DEFAULT '{}'::jsonb, p_custom jsonb DEFAULT '{}'::jsonb, p_expected_version integer DEFAULT NULL::integer, p_archive boolean DEFAULT NULL::boolean\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"entity_seat_level\", args: \"p_organization_id uuid, p_token text, p_record_id uuid\", returns: \"permission_level\", security: \"invoker\" },\n  { name: \"entity_table\", args: \"p_token text\", returns: \"TABLE(token text, schema_name text, table_name text, type text, title_column text, label text, has_organization boolean, has_deleted_at boolean)\", security: \"definer\" },\n  { name: \"entity_value_write\", args: \"p_organization_id uuid, p_token text, p_record_id uuid, p_patch jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"export_ceiling\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"integer\", security: \"invoker\" },\n  { name: \"export_records\", args: \"p_organization_id uuid, p_table_id uuid, p_limit integer DEFAULT 1000\", returns: \"TABLE(id uuid, document jsonb)\", security: \"invoker\" },\n  { name: \"external_foreign_table_findings\", args: \"\", returns: \"SETOF text\", security: \"definer\" },\n  { name: \"external_history_event\", args: \"p_organization_id uuid, p_link_id uuid, p_operation text\", returns: \"bigint\", security: \"definer\" },\n  { name: \"external_rows\", args: \"p_organization_id uuid, p_source_id uuid\", returns: \"SETOF jsonb\", security: \"definer\" },\n  { name: \"external_source_declare\", args: \"p_organization_id uuid, p_tier text, p_connection_token text, p_external_schema text, p_external_table text, p_link_template text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"external_stub_upsert\", args: \"p_organization_id uuid, p_source_id uuid, p_table_id uuid, p_external_key text, p_link_url text, p_cached_title text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"external_tier_contract\", args: \"\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"external_write_through\", args: \"p_organization_id uuid, p_record_id uuid, p_patch jsonb\", returns: \"void\", security: \"definer\" },\n  { name: \"external_writes_set\", args: \"p_organization_id uuid, p_source_id uuid, p_enabled boolean\", returns: \"boolean\", security: \"definer\" },\n  { name: \"far_value\", args: \"p_organization_id uuid, p_record_id uuid, p_key text, p_reader jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"field_access\", args: \"p_user uuid, p_field_id uuid, p_token text, p_row_id uuid, p_action text, p_audit boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_access_set\", args: \"p_field_id uuid, p_part text, p_word text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_access_setup\", args: \"p_field_id uuid, p_proposed jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_add_rung\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"permission_level\", security: \"invoker\" },\n  { name: \"field_behaviour\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"field_choice_usage\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_context_policy_floor\", args: \"p_organization_id uuid, p_field_data jsonb, p_self uuid DEFAULT NULL::uuid\", returns: \"TABLE(context_policy text, reads jsonb)\", security: \"definer\" },\n  { name: \"field_cycle\", args: \"p_organization_id uuid, p_field_data jsonb, p_self uuid\", returns: \"text[]\", security: \"definer\" },\n  { name: \"field_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_spec jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"field_declare_many\", args: \"p_organization_id uuid, p_table_id uuid, p_specs jsonb\", returns: \"uuid[]\", security: \"invoker\" },\n  { name: \"field_dependants\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"TABLE(kind text, dependant_id uuid, label text, how text)\", security: \"definer\" },\n  { name: \"field_duplicate\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_history\", args: \"p_organization_id uuid, p_table_id uuid, p_field_key text, p_limit integer DEFAULT 100, p_offset integer DEFAULT 0, p_record_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(record_id uuid, record_title text, version integer, occurred_at timestamp with time zone, operation_label text, actor jsonb, before jsonb, after jsonb)\", security: \"definer\" },\n  { name: \"field_input_closure\", args: \"p_organization_id uuid, p_field_data jsonb, p_self uuid DEFAULT NULL::uuid\", returns: \"TABLE(input_id uuid, input_key text, input_label text, input_table uuid, sensitivity text, retired boolean, depth integer)\", security: \"definer\" },\n  { name: \"field_input_closure_many\", args: \"p_organization_id uuid, p_ids uuid[]\", returns: \"TABLE(root_id uuid, input_id uuid, retired boolean, depth integer)\", security: \"definer\" },\n  { name: \"field_inputs_of\", args: \"p_organization_id uuid, p_field_data jsonb\", returns: \"TABLE(input_id uuid, input_key text, input_label text, input_table uuid, sensitivity text, retired boolean, how text)\", security: \"definer\" },\n  { name: \"field_is_protected\", args: \"p_data jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"field_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"field_kind_of\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"field_kinds\", args: \"\", returns: \"TABLE(kind text, behavior text, parity boolean, made_of text)\", security: \"invoker\" },\n  { name: \"field_make_automatic\", args: \"p_organization_id uuid, p_field_id uuid, p_kind text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_notify_on_assign\", args: \"p_organization_id uuid, p_field_id uuid, p_on boolean\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_options\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"SETOF custom.record\", security: \"definer\" },\n  { name: \"field_protection_refusal\", args: \"p_op text, p_old jsonb, p_new jsonb, p_field_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"field_restore\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"field_retire\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"field_retype_preview\", args: \"p_organization_id uuid, p_field_id uuid, p_patch jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_rules\", args: \"p_field_data jsonb\", returns: \"TABLE(kind text, spec jsonb)\", security: \"invoker\" },\n  { name: \"field_sensitivity_floor\", args: \"p_organization_id uuid, p_field_data jsonb, p_self uuid DEFAULT NULL::uuid\", returns: \"TABLE(sensitivity text, reads jsonb)\", security: \"definer\" },\n  { name: \"field_source_archived\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_update\", args: \"p_organization_id uuid, p_field_id uuid, p_patch jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"field_update_rehoming_choices\", args: \"p_organization_id uuid, p_field_id uuid, p_patch jsonb, p_rehome jsonb DEFAULT NULL::jsonb, p_cells_back jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"field_value_convert\", args: \"p_to jsonb, p_value jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"field_value_kind\", args: \"p_organization_id uuid, p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"field_words\", args: \"p_organization_id uuid, p_field_id uuid, p_value jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"file_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"filter_is_rule\", args: \"p_filter jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"filter_list_op\", args: \"p_op text, p_a jsonb, p_b jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"filter_list_op_words\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"find_duplicates\", args: \"p_organization_id uuid, p_table_id uuid, p_fields text[], p_limit integer DEFAULT 50\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_archive\", args: \"p_organization_id uuid, p_form_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_title text, p_questions jsonb, p_presentation jsonb DEFAULT '{}'::jsonb, p_submission_cap integer DEFAULT NULL::integer, p_quarantine_rule_id uuid DEFAULT NULL::uuid, p_notify_rule_id uuid DEFAULT NULL::uuid, p_form_id uuid DEFAULT NULL::uuid, p_slug text DEFAULT NULL::text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"form_draft_read\", args: \"p_form_id uuid, p_secret text\", returns: \"TABLE(answers jsonb, saved_at timestamp with time zone, expires_at timestamp with time zone, state text, message text)\", security: \"definer\" },\n  { name: \"form_draft_save\", args: \"p_form_id uuid, p_answers jsonb, p_secret text DEFAULT NULL::text, p_bucket text DEFAULT NULL::text, p_origin text DEFAULT NULL::text\", returns: \"TABLE(draft_secret text, saved_at timestamp with time zone, expires_at timestamp with time zone, state text, message text)\", security: \"definer\" },\n  { name: \"form_knobs\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_look_options\", args: \"p_organization_id uuid, p_presentation jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_notify\", args: \"p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"form_preview_asks\", args: \"p_organization_id uuid, p_table_id uuid, p_questions jsonb, p_values jsonb\", returns: \"TABLE(field_key text, asked boolean, decided boolean, said text)\", security: \"definer\" },\n  { name: \"form_preview_route\", args: \"p_organization_id uuid, p_table_id uuid, p_questions jsonb, p_endings jsonb, p_values jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_public\", args: \"p_form_id uuid\", returns: \"TABLE(form_id uuid, organization_id uuid, table_id uuid, title text, presentation jsonb, fields jsonb, honeypot_key text, state text, message text)\", security: \"definer\" },\n  { name: \"form_public_asks\", args: \"p_form_id uuid, p_values jsonb, p_secret text DEFAULT NULL::text, p_origin text DEFAULT NULL::text\", returns: \"TABLE(field_key text, asked boolean, decided boolean, said text)\", security: \"definer\" },\n  { name: \"form_public_options\", args: \"p_form_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_public_route\", args: \"p_form_id uuid, p_values jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_redirect_domains\", args: \"p_organization_id uuid\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"form_redirect_refusal\", args: \"p_organization_id uuid, p_url text\", returns: \"text\", security: \"invoker\" },\n  { name: \"form_respondent_copy\", args: \"p_organization_id uuid, p_form_id uuid, p_record_id uuid, p_submission_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_response_read\", args: \"p_form_id uuid, p_edit text, p_unlock text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_response_update\", args: \"p_form_id uuid, p_edit text, p_origin text, p_payload jsonb, p_bucket text\", returns: \"TABLE(submission_id uuid, record_id uuid, state text, message text)\", security: \"definer\" },\n  { name: \"form_restore\", args: \"p_organization_id uuid, p_form_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_results\", args: \"p_organization_id uuid, p_form_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_set_password\", args: \"p_organization_id uuid, p_form_id uuid, p_password text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_slug\", args: \"p_organization_id uuid, p_title text, p_form_id uuid DEFAULT NULL::uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"form_submit\", args: \"p_form_id uuid, p_origin text, p_payload jsonb, p_bucket text, p_honeypot text DEFAULT NULL::text, p_client_key text DEFAULT NULL::text\", returns: \"TABLE(submission_id uuid, record_id uuid, state text, message text)\", security: \"definer\" },\n  { name: \"form_theme_options\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"form_unlock\", args: \"p_form_id uuid, p_password text DEFAULT NULL::text, p_unlock text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"form_visit\", args: \"p_form_id uuid, p_visit text, p_event text, p_field text DEFAULT NULL::text\", returns: \"text\", security: \"definer\" },\n  { name: \"form_visit_admit\", args: \"p_form_id uuid, p_bucket text\", returns: \"boolean\", security: \"definer\" },\n  { name: \"forms\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(form_id uuid, table_id uuid, title text, slug text, published_at timestamp with time zone, closed_at timestamp with time zone, submission_cap integer, responses bigint, in_table bigint, held bigint, rejected bigint, state text, quarantine_rule_id uuid, notify_rule_id uuid, presentation jsonb)\", security: \"definer\" },\n  { name: \"forms_archived\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 100\", returns: \"TABLE(form_id uuid, table_id uuid, table_name text, kind text, title text, slug text, archived_at timestamp with time zone, archived_by uuid, table_archived boolean, can_restore boolean)\", security: \"definer\" },\n  { name: \"forms_archived_everywhere\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"formula_compile_sql\", args: \"p_organization_id uuid, p_expr jsonb, p_values_sql text\", returns: \"text\", security: \"invoker\" },\n  { name: \"formula_eval\", args: \"p_organization_id uuid, p_expr jsonb, p_values jsonb, p_context jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"formula_field_keys\", args: \"p_organization_id uuid, p_expr jsonb\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"formula_history\", args: \"p_organization_id uuid, p_record_id uuid, p_field_key text, p_limit integer DEFAULT 100\", returns: \"TABLE(occurred_at timestamp with time zone, cause text, record_version integer, formula_version integer, formula_text text, value jsonb, refused text, actor jsonb)\", security: \"definer\" },\n  { name: \"formula_node_kinds\", args: \"\", returns: \"TABLE(node text, min_args integer, max_args integer, result text, signature text, says text)\", security: \"invoker\" },\n  { name: \"formula_parse\", args: \"p_organization_id uuid, p_table_id uuid, p_text text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"formula_preview\", args: \"p_organization_id uuid, p_table_id uuid, p_record_id uuid, p_text text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"formula_result_kind\", args: \"p_organization_id uuid, p_expr jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"formula_translate_notion\", args: \"p_text text, p_types jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"formula_value\", args: \"p_organization_id uuid, p_record_id uuid, p_field_data jsonb, p_values jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"freshness_verdict\", args: \"p_written_at timestamp with time zone, p_ceiling_seconds numeric\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"grid_layout\", args: \"p_organization_id uuid, p_table_id uuid, p_view_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"grid_layout_check\", args: \"p_layout jsonb, p_scope text DEFAULT 'view'::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"guard_refusals_are_complete\", args: \"\", returns: \"TABLE(guard text, said text)\", security: \"invoker\" },\n  { name: \"has_visibility\", args: \"p_user_id uuid, p_type text, p_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"boolean\", security: \"definer\" },\n  { name: \"has_visibility_at\", args: \"p_user_id uuid, p_type text, p_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level, p_organization_id uuid DEFAULT NULL::uuid, p_min_version bigint DEFAULT NULL::bigint\", returns: \"boolean\", security: \"definer\" },\n  { name: \"hidden_field_notice\", args: \"p_field custom.record, p_action text DEFAULT 'read'::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"history_actor\", args: \"p_tier text, p_document jsonb, p_actor_id uuid, p_people jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"history_changes\", args: \"p_organization_id uuid, p_table_id uuid, p_old jsonb, p_new jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"history_people\", args: \"p_organization_id uuid, p_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"history_prune\", args: \"p_organization_id uuid, p_scope text DEFAULT 'values'::text, p_table_id uuid DEFAULT NULL::uuid, p_dry_run boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"history_restore_body\", args: \"p_current jsonb, p_target jsonb, p_field_key text DEFAULT NULL::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"history_restore_body\", args: \"p_current jsonb, p_target jsonb, p_field_key text, p_author jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"history_retention\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"history_retention_floor_raise\", args: \"p_organization_id uuid, p_days integer\", returns: \"integer\", security: \"definer\" },\n  { name: \"history_retention_set\", args: \"p_organization_id uuid, p_table_id uuid, p_days integer\", returns: \"integer\", security: \"definer\" },\n  { name: \"home_add\", args: \"p_organization_id uuid, p_table_id uuid, p_home_record_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"home_relations\", args: \"\", returns: \"TABLE(table_id uuid, home_record_id uuid, organization_id uuid, relation_id uuid)\", security: \"invoker\" },\n  { name: \"hot_doors_6_on\", args: \"p_person uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"hot_doors_7_on\", args: \"p_person uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"hub_changed_by\", args: \"p_organization_id uuid, p_kind text, p_ids uuid[]\", returns: \"TABLE(id uuid, at timestamp with time zone, who text)\", security: \"definer\" },\n  { name: \"hub_changed_by_many\", args: \"p_asks jsonb, p_door text DEFAULT NULL::text\", returns: \"TABLE(organization_id uuid, id uuid, at timestamp with time zone, who text)\", security: \"definer\" },\n  { name: \"hub_row_asked_alone\", args: \"p_org uuid, p_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"inbound_addresses\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbound_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_label text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbound_domain\", args: \"p_organization_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"inbound_mail_land\", args: \"p_address text, p_mail jsonb, p_secret text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbound_mail_map\", args: \"p_organization_id uuid, p_table_id uuid, p_mail jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"inbound_set\", args: \"p_organization_id uuid, p_inbound_id uuid, p_enabled boolean\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbox_clear\", args: \"p_organization_id uuid, p_item_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbox_counts\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(organization_id uuid, organization_name text, waiting integer, snoozed integer, cleared integer, overdue integer, oldest_waiting_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"inbox_remind_tick\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"inbox_snooze\", args: \"p_organization_id uuid, p_item_id uuid, p_until timestamp with time zone\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbox_unclear\", args: \"p_organization_id uuid, p_item_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"inbox_unsnooze\", args: \"p_organization_id uuid, p_item_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"index_payload\", args: \"p_organization_id uuid, p_table_id uuid, p_limit integer DEFAULT 1000\", returns: \"TABLE(id uuid, searchable text)\", security: \"invoker\" },\n  { name: \"interface_chart\", args: \"p_interface_id uuid, p_chart_id text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"interface_chart_formula_ok\", args: \"p_org uuid, p_table uuid, p_key text, p_allowed text[], p_depth integer\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"interface_read\", args: \"p_interface_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"interface_rows\", args: \"p_interface_id uuid, p_element_id text, p_record_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"intern_provenance\", args: \"p_data jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_cell\", args: \"p_organization_id uuid, p_field jsonb, p_word text, p_date_order text DEFAULT 'mdy'::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_change_actor\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_change_fields\", args: \"p_keys text[], p_old jsonb, p_new jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_change_via\", args: \"\", returns: \"text\", security: \"invoker\" },\n  { name: \"io_changed_field_ids\", args: \"p_organization_id uuid, p_table_id uuid, p_old jsonb, p_new jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_changed_keys\", args: \"p_old jsonb, p_new jsonb\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"io_comment_resolve\", args: \"p_organization_id uuid, p_comment_id uuid, p_resolved boolean DEFAULT true\", returns: \"boolean\", security: \"definer\" },\n  { name: \"io_comment_write\", args: \"p_organization_id uuid, p_record_id uuid, p_body text, p_anchor jsonb DEFAULT '{}'::jsonb, p_parent_comment_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"io_comments\", args: \"p_organization_id uuid, p_record_id uuid, p_include_resolved boolean DEFAULT false\", returns: \"TABLE(id uuid, body text, anchor jsonb, parent_comment_id uuid, created_by uuid, created_at timestamp with time zone, resolved_at timestamp with time zone, resolved_by uuid)\", security: \"definer\" },\n  { name: \"io_csv_escape\", args: \"p_value text, p_delimiter text DEFAULT ','::text\", returns: \"text\", security: \"invoker\" },\n  { name: \"io_csv_parse\", args: \"p_text text, p_delimiter text DEFAULT NULL::text\", returns: \"TABLE(row_number integer, cells text[])\", security: \"invoker\" },\n  { name: \"io_export\", args: \"p_organization_id uuid, p_table_id uuid, p_columns text[] DEFAULT NULL::text[], p_limit integer DEFAULT 10000, p_required text DEFAULT 'viewer'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_export_csv\", args: \"p_organization_id uuid, p_table_id uuid, p_columns text[] DEFAULT NULL::text[], p_limit integer DEFAULT 10000, p_delimiter text DEFAULT chr(44), p_required text DEFAULT 'viewer'::text\", returns: \"text\", security: \"definer\" },\n  { name: \"io_import_begin\", args: \"p_organization_id uuid, p_table_id uuid, p_format text DEFAULT 'csv'::text, p_source_name text DEFAULT NULL::text, p_source_columns jsonb DEFAULT '[]'::jsonb, p_file_hash text DEFAULT NULL::text, p_policy jsonb DEFAULT '{}'::jsonb, p_dedupe_key text DEFAULT NULL::text, p_file_bytes bigint DEFAULT NULL::bigint, p_force boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_import_declare_columns\", args: \"p_organization_id uuid, p_table_id uuid, p_rows jsonb, p_mapping jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_import_finish\", args: \"p_organization_id uuid, p_import_id uuid, p_unmapped text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_import_forget\", args: \"p_organization_id uuid, p_import_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"io_import_open\", args: \"p_organization_id uuid, p_table_id uuid, p_format text DEFAULT 'csv'::text, p_source_name text DEFAULT NULL::text, p_source_columns jsonb DEFAULT '[]'::jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"io_import_plan\", args: \"p_organization_id uuid, p_table_id uuid, p_columns jsonb DEFAULT '[]'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_import_report\", args: \"p_organization_id uuid, p_import_id uuid, p_state text DEFAULT NULL::text, p_limit integer DEFAULT 100, p_offset integer DEFAULT 0\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_import_rows\", args: \"p_organization_id uuid, p_import_id uuid, p_rows jsonb, p_mapping jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_imports\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 25\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_infer_column\", args: \"p_organization_id uuid, p_table_id uuid, p_header text, p_samples jsonb DEFAULT '[]'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"io_infer_type\", args: \"p_samples jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"io_money_unit\", args: \"p_word text\", returns: \"text\", security: \"invoker\" },\n  { name: \"io_outbox_announce\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"io_outbox_backlog\", args: \"p_consumer text, p_event_key text, p_older_than interval DEFAULT '00:00:00'::interval\", returns: \"TABLE(organization_id uuid, waiting bigint, oldest timestamp with time zone, last_carried timestamp with time zone)\", security: \"definer\" },\n  { name: \"io_outbox_broadcast_stmt\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"io_outbox_consumed_by\", args: \"p_event_id uuid, p_consumer text, p_consumed_at timestamp with time zone\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"io_outbox_drain\", args: \"p_organization_id uuid, p_consumer text, p_limit integer DEFAULT 100, p_event_key text DEFAULT 'records.changed'::text\", returns: \"TABLE(outbox_id uuid, record_id uuid, table_id uuid, operation text, changed_field_ids jsonb, actor jsonb, occurred_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"io_outbox_last_consumed\", args: \"p_consumer text, p_event_key text, p_organization_id uuid\", returns: \"timestamp with time zone\", security: \"invoker\" },\n  { name: \"io_outbox_pending_organizations\", args: \"p_consumer text, p_event_key text\", returns: \"SETOF uuid\", security: \"definer\" },\n  { name: \"io_outbox_per_consumer\", args: \"\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"io_outbox_rearm\", args: \"p_organization_id uuid, p_dedupe_key text\", returns: \"void\", security: \"definer\" },\n  { name: \"io_outbox_release\", args: \"p_organization_id uuid, p_consumer text, p_older_than interval DEFAULT '00:15:00'::interval\", returns: \"integer\", security: \"definer\" },\n  { name: \"io_outbox_release_claimed\", args: \"p_organization_id uuid, p_consumer text, p_ids uuid[]\", returns: \"integer\", security: \"definer\" },\n  { name: \"io_outbox_subscribe\", args: \"p_consumer text, p_event_key text\", returns: \"timestamp with time zone\", security: \"definer\" },\n  { name: \"io_proposal_accept\", args: \"p_organization_id uuid, p_import_id uuid, p_column text, p_type text DEFAULT NULL::text, p_label text DEFAULT NULL::text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"io_proposal_reject\", args: \"p_organization_id uuid, p_import_id uuid, p_column text\", returns: \"boolean\", security: \"definer\" },\n  { name: \"io_proposal_spec\", args: \"p_proposal jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_record_changed\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"io_record_changed_stmt_delete\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"io_record_changed_stmt_insert\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"io_record_changed_stmt_update\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"io_relation_candidate\", args: \"p_organization_id uuid, p_table_id uuid, p_words text[]\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"io_restore\", args: \"p_organization_id uuid, p_record_id uuid, p_version integer\", returns: \"integer\", security: \"definer\" },\n  { name: \"io_restore\", args: \"p_organization_id uuid, p_record_id uuid, p_version integer, p_author jsonb\", returns: \"integer\", security: \"definer\" },\n  { name: \"io_revisions\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(version integer, changed_at timestamp with time zone, changed_by uuid, summary text, operation text, changed_fields jsonb)\", security: \"definer\" },\n  { name: \"io_sample_words\", args: \"p_samples jsonb\", returns: \"TABLE(word text)\", security: \"invoker\" },\n  { name: \"io_value_shape\", args: \"p_envelope jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"io_workflow_chain\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"is_a_retirement\", args: \"p_old_deleted timestamp with time zone, p_new_deleted timestamp with time zone, p_old_data jsonb, p_new_data jsonb, p_old_table uuid, p_new_table uuid, p_old_org uuid, p_new_org uuid, p_old_class text, p_new_class text\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"kernel_viewer_sets\", args: \"p_user uuid, p_orgs uuid[]\", returns: \"TABLE(organization_id uuid, fallback boolean, all_visible boolean, granted_all uuid[], carried_visible uuid[])\", security: \"definer\" },\n  { name: \"ladder_replanners\", args: \"p_roots text[] DEFAULT ARRAY['custom.has_visibility'::text, 'custom.effective_level'::text, 'custom.reaches_directly'::text, 'custom.visible_set'::text]\", returns: \"TABLE(fn text, lang text, why text, remedy text)\", security: \"definer\" },\n  { name: \"level_floor\", args: \"\", returns: \"permission_level\", security: \"definer\" },\n  { name: \"levels_of\", args: \"p_user_id uuid, p_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"levels_raised_by_a_less_specific_rung\", args: \"\", returns: \"TABLE(organization_id uuid, organization_name text, member_id uuid, member_email text, record_id uuid, addressed_level permission_level, answered_level permission_level)\", security: \"definer\" },\n  { name: \"list_door_disagreements\", args: \"p_pretend text DEFAULT NULL::text, p_only_organization uuid DEFAULT NULL::uuid, p_sample integer DEFAULT 200\", returns: \"TABLE(organization_id uuid, organization_name text, member_id uuid, table_id uuid, record_id uuid, door text, why text)\", security: \"invoker\" },\n  { name: \"list_door_disagreements\", args: \"p_pretend text, p_only_organization uuid, p_sample integer, p_exhaustive boolean\", returns: \"TABLE(organization_id uuid, organization_name text, member_id uuid, table_id uuid, record_id uuid, door text, why text)\", security: \"invoker\" },\n  { name: \"list_portals\", args: \"p_organization_id uuid, p_archived text DEFAULT 'active'::text\", returns: \"TABLE(portal_id uuid, title text, slug text, client_table_id uuid, client_table text, is_active boolean, tables integer, invited integer, signed_in integer, sign_in_method text, opened_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"list_portals_everywhere\", args: \"p_archived text DEFAULT 'active'::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"listed_predicate_sql\", args: \"p_user uuid, p_organization_id uuid, p_table_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level, p_alias text DEFAULT 'r'::text\", returns: \"text\", security: \"invoker\" },\n  { name: \"lookup_value\", args: \"p_organization_id uuid, p_record_id uuid, p_field_data jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"mask_document\", args: \"p_document jsonb, p_visible_keys text[], p_notices jsonb, p_by_id boolean DEFAULT false, p_key_ids jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"mask_document\", args: \"p_document jsonb, p_visible_keys text[], p_notices jsonb, p_by_id boolean DEFAULT false, p_key_ids jsonb DEFAULT '{}'::jsonb, p_declared_keys text[] DEFAULT NULL::text[]\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"mask_history_data\", args: \"p_data jsonb, p_mask jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"mask_says_withheld\", args: \"p_mask jsonb, p_key text\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"may_invite_outside\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"may_see_table_structure\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"member_personal_tables\", args: \"p_organization_id uuid, p_person uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"member_records_take_over\", args: \"p_organization_id uuid, p_from uuid, p_to uuid, p_reason text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"merge_field_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"migrate_choice_keys\", args: \"p_organization_id uuid, p_table_id uuid, p_dry_run boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_delete\", args: \"p_organization_id uuid, p_record_id uuid, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_demote\", args: \"p_organization_id uuid, p_table_id uuid, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_extract_parent\", args: \"p_organization_id uuid, p_id uuid, p_parent_table_id uuid, p_moved_keys text[], p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_merge\", args: \"p_organization_id uuid, p_winner_id uuid, p_loser_id uuid, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_promote\", args: \"p_organization_id uuid, p_table_id uuid, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_purge\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_dry_run boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_purge_hard\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_compliance_reason text DEFAULT NULL::text, p_chunk integer DEFAULT 200, p_dry_run boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_purge_hard_request\", args: \"p_organization_id uuid, p_table_id uuid, p_compliance_reason text\", returns: \"void\", security: \"definer\" },\n  { name: \"migrate_reclass\", args: \"p_organization_id uuid, p_id uuid, p_to text DEFAULT 'field'::text, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_rename\", args: \"p_organization_id uuid, p_id uuid, p_to text, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_reparent\", args: \"p_organization_id uuid, p_id uuid, p_parent_id uuid, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_retype\", args: \"p_organization_id uuid, p_id uuid, p_to text, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_split\", args: \"p_organization_id uuid, p_record_id uuid, p_moved_keys text[], p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrate_undo\", args: \"p_organization_id uuid, p_log_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"migrations\", args: \"p_organization_id uuid, p_target_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 100\", returns: \"TABLE(id uuid, verb text, target_kind text, target_id uuid, note text, applied_at timestamp with time zone, applied_by uuid, undone_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"mirror_asks_the_whole_database\", args: \"\", returns: \"TABLE(schema_name text, table_name text, policy_name text, why text)\", security: \"invoker\" },\n  { name: \"my_level\", args: \"p_organization_id uuid, p_id uuid, p_type text DEFAULT 'record'::text\", returns: \"permission_level\", security: \"definer\" },\n  { name: \"my_levels\", args: \"p_organization_id uuid, p_ids jsonb, p_type text DEFAULT 'record'::text\", returns: \"TABLE(id uuid, level permission_level)\", security: \"definer\" },\n  { name: \"my_levels_across\", args: \"p_asks jsonb\", returns: \"TABLE(organization_id uuid, id uuid, level permission_level, refused text)\", security: \"definer\" },\n  { name: \"opening_view_shape\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"organization_clear\", args: \"p_organization_id uuid, p_confirm text, p_and_destroy boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"organization_contents\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"organization_has_a_public_table\", args: \"p_organization_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"organization_home_id\", args: \"p_organization_id uuid\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"organization_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"organization_pick_lists\", args: \"p_organization_id uuid\", returns: \"TABLE(id uuid, list_name text, description text, updated_at timestamp with time zone, lives_in text)\", security: \"definer\" },\n  { name: \"organization_references\", args: \"p_kind text, p_organization_id uuid, p_row jsonb\", returns: \"TABLE(site text, what text, ref_id uuid, openable boolean)\", security: \"invoker\" },\n  { name: \"owning_table\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"owning_table_gone\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"page_ceiling\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"integer\", security: \"invoker\" },\n  { name: \"page_contract\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"page_size\", args: \"p_organization_id uuid, p_door text, p_limit integer, p_default integer DEFAULT NULL::integer, p_ceiling integer DEFAULT NULL::integer\", returns: \"integer\", security: \"invoker\" },\n  { name: \"parity_field_types\", args: \"\", returns: \"TABLE(parity_type text, behavior text, made_of text)\", security: \"invoker\" },\n  { name: \"parity_type\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"parity_values\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(field_key text, field_id uuid, parity_type text, behavior text, unit text, format text, value jsonb, value_version integer, actor text, written_at timestamp with time zone)\", security: \"invoker\" },\n  { name: \"per_value_access_words\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"person_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"phone_canonical\", args: \"p_text text\", returns: \"text\", security: \"invoker\" },\n  { name: \"phone_display\", args: \"p_text text\", returns: \"text\", security: \"invoker\" },\n  { name: \"phone_pattern\", args: \"\", returns: \"text\", security: \"invoker\" },\n  { name: \"pick_list_create\", args: \"p_organization_id uuid, p_list_name text, p_description text DEFAULT NULL::text, p_items jsonb DEFAULT '[]'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pick_list_for_selection\", args: \"p_list_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pick_list_get\", args: \"p_list_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pick_list_index\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pick_list_index_everywhere\", args: \"\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pick_list_update\", args: \"p_list_id uuid, p_list_name text DEFAULT NULL::text, p_description text DEFAULT NULL::text, p_items jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pin_agent_cells\", args: \"p_new jsonb, p_old jsonb, p_agent_keys text[]\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"pipeline_board\", args: \"p_organization_id uuid, p_table_id uuid, p_measure text DEFAULT NULL::text\", returns: \"TABLE(stage_key text, stage_label text, stage_position integer, cards bigint, total numeric, wip_limit integer, over_limit boolean)\", security: \"definer\" },\n  { name: \"pipeline_board\", args: \"p_organization_id uuid, p_table_id uuid, p_measure text, p_filter jsonb\", returns: \"TABLE(stage_key text, stage_label text, stage_position integer, cards bigint, total numeric, wip_limit integer, over_limit boolean)\", security: \"definer\" },\n  { name: \"pipeline_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipeline_gate_preview\", args: \"p_organization_id uuid, p_table_id uuid, p_stage text, p_gate jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipeline_move\", args: \"p_organization_id uuid, p_record_id uuid, p_to text, p_also jsonb DEFAULT '{}'::jsonb, p_expected_version integer DEFAULT NULL::integer\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipeline_move_many\", args: \"p_organization_id uuid, p_moves jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipeline_pending\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipeline_read\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipeline_transition_refusal\", args: \"p_organization_id uuid, p_record_id uuid, p_to text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"pipelines\", args: \"p_organization_id uuid\", returns: \"TABLE(table_id uuid, table_name text, stage_field text, stage_label text, stages integer, rules integer, broken text, updated_at timestamp with time zone, updated_by uuid)\", security: \"definer\" },\n  { name: \"plural_of\", args: \"p_word text\", returns: \"text\", security: \"invoker\" },\n  { name: \"portal_accents\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"portal_admits\", args: \"p_organization_id uuid, p_user_id uuid DEFAULT NULL::uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"portal_archive\", args: \"p_organization_id uuid, p_portal_id uuid, p_confirm_title text, p_reason text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_card\", args: \"p_organization_id uuid, p_portal_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_declare\", args: \"p_organization_id uuid, p_title text, p_client_table_id uuid, p_tables jsonb, p_portal_id uuid DEFAULT NULL::uuid, p_slug text DEFAULT NULL::text, p_sign_in_method text DEFAULT 'magic_link'::text, p_config jsonb DEFAULT NULL::jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"portal_field_map\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(field_id uuid, field_key text, field_type text, points_at uuid)\", security: \"definer\" },\n  { name: \"portal_form\", args: \"p_organization_id uuid, p_portal_id uuid, p_form_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_form_submit\", args: \"p_organization_id uuid, p_portal_id uuid, p_form_id uuid, p_payload jsonb, p_client_key text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_invitation\", args: \"p_slug text, p_email text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_invite\", args: \"p_organization_id uuid, p_portal_id uuid, p_client_record_id uuid, p_email text, p_user_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_invite_accept\", args: \"p_token text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_me\", args: \"\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_preview\", args: \"p_organization_id uuid, p_portal_id uuid, p_principal_id uuid, p_table_id uuid\", returns: \"TABLE(record_id uuid, title text)\", security: \"definer\" },\n  { name: \"portal_principal_bind\", args: \"p_organization_id uuid, p_principal_id uuid, p_user_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_public\", args: \"p_slug text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_record_title\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"portal_restore\", args: \"p_organization_id uuid, p_portal_id uuid, p_confirm_title text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_revoke\", args: \"p_organization_id uuid, p_portal_id uuid, p_principal_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_self_signup\", args: \"p_slug text, p_email text, p_name text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"portal_slug\", args: \"p_organization_id uuid, p_title text, p_portal_id uuid DEFAULT NULL::uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"portal_tables\", args: \"p_organization_id uuid\", returns: \"TABLE(portal_id uuid, table_id uuid, name text)\", security: \"definer\" },\n  { name: \"portals\", args: \"p_organization_id uuid\", returns: \"TABLE(portal_id uuid, title text, slug text, client_table_id uuid, client_table text, is_active boolean, tables integer, invited integer, signed_in integer, sign_in_method text, opened_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"presentation_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"promote_field\", args: \"p_organization_id uuid, p_table_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"promote_table\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"promoted_field_cap\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"promoted_fields\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(field_id uuid, field_key text, parity_type text, is_unique boolean, value_path text, index_arm text, index_expr text, index_name text, indexable boolean, why_not text)\", security: \"invoker\" },\n  { name: \"promoted_index_arm\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"promoted_index_ddl\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(step integer, purpose text, statement text)\", security: \"invoker\" },\n  { name: \"promoted_index_expr\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"promoted_index_name\", args: \"p_table_id uuid, p_field_key text, p_unique boolean\", returns: \"text\", security: \"invoker\" },\n  { name: \"promoted_query_sql\", args: \"p_organization_id uuid, p_table_id uuid, p_field_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"promoted_read\", args: \"p_organization_id uuid, p_table_id uuid, p_field_key text, p_value text\", returns: \"SETOF uuid\", security: \"invoker\" },\n  { name: \"promoted_value_path\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"promotion_inline_ceiling\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"protected_field_notice\", args: \"p_field custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"protected_field_query_refusal\", args: \"p_field_id uuid, p_verb text\", returns: \"text\", security: \"definer\" },\n  { name: \"protected_field_rule\", args: \"p_token text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"protected_matches\", args: \"p_field_id uuid, p_value jsonb DEFAULT NULL::jsonb\", returns: \"TABLE(row_id uuid, value jsonb)\", security: \"definer\" },\n  { name: \"protected_readers_problem\", args: \"p_token text, p_readers jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"protected_value\", args: \"p_token text, p_row_id uuid, p_field_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"protected_value_leaks\", args: \"p_field_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(place text, table_token text, field_key text, row_id uuid, ref text)\", security: \"definer\" },\n  { name: \"protected_values\", args: \"p_organization_id uuid, p_token text, p_row_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"provenance_prune\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_dry_run boolean DEFAULT true, p_limit integer DEFAULT 200000\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"provenance_retention_days\", args: \"p_organization_id uuid\", returns: \"integer\", security: \"definer\" },\n  { name: \"provenance_write\", args: \"p_organization_id uuid, p_conversation_id uuid, p_turn_id text, p_rows jsonb\", returns: \"integer\", security: \"definer\" },\n  { name: \"public_definition_owner\", args: \"p_organization_id uuid, p_table_id uuid, p_record_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"publish_bind\", args: \"p_organization_id uuid, p_kind text, p_resource_id uuid, p_slug text, p_render_mode text DEFAULT 'page'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"published_view_read\", args: \"p_slug text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"query_access_ids\", args: \"p_organization_id uuid, p_required text DEFAULT 'viewer'::text\", returns: \"uuid[]\", security: \"invoker\" },\n  { name: \"query_across_homes\", args: \"p_organization_id uuid, p_table_id uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0, p_required text DEFAULT 'viewer'::text\", returns: \"TABLE(record_id uuid, home_record_id uuid, data jsonb, created_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"query_by_coordinates\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_coordinates jsonb DEFAULT '[]'::jsonb, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0, p_required text DEFAULT 'viewer'::text\", returns: \"TABLE(record_id uuid, table_id uuid, data jsonb, coordinates_matched integer)\", security: \"definer\" },\n  { name: \"query_can_see\", args: \"p_organization_id uuid, p_record_id uuid, p_required text DEFAULT 'viewer'::text\", returns: \"boolean\", security: \"definer\" },\n  { name: \"query_hot_paths\", args: \"\", returns: \"TABLE(name text, statement text)\", security: \"invoker\" },\n  { name: \"query_hot_paths_prepared\", args: \"\", returns: \"TABLE(name text, prepared boolean, generic_plans bigint)\", security: \"invoker\" },\n  { name: \"query_is_store_owner\", args: \"\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"query_prepare_hot\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"query_principal\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"query_record_as_of\", args: \"p_organization_id uuid, p_record_id uuid, p_recorded_at timestamp with time zone DEFAULT NULL::timestamp with time zone, p_world_on date DEFAULT NULL::date, p_required text DEFAULT 'viewer'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"query_record_document\", args: \"p_principal uuid, p_row custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"query_relation_edges\", args: \"p_organization_id uuid, p_flavor text DEFAULT NULL::text, p_role text DEFAULT NULL::text\", returns: \"TABLE(parent_id uuid, child_id uuid, role text, flavor text)\", security: \"definer\" },\n  { name: \"query_rollup\", args: \"p_organization_id uuid, p_roots uuid[], p_flavor text DEFAULT NULL::text, p_role text DEFAULT NULL::text, p_max_depth integer DEFAULT 33, p_required text DEFAULT 'viewer'::text\", returns: \"TABLE(record_id uuid, depth integer)\", security: \"definer\" },\n  { name: \"query_rollup_sum\", args: \"p_organization_id uuid, p_roots uuid[], p_field_key text, p_flavor text DEFAULT NULL::text, p_role text DEFAULT NULL::text, p_max_depth integer DEFAULT 33, p_required text DEFAULT 'viewer'::text\", returns: \"numeric\", security: \"definer\" },\n  { name: \"query_table_as_of\", args: \"p_organization_id uuid, p_table_id uuid, p_recorded_at timestamp with time zone DEFAULT NULL::timestamp with time zone, p_world_on date DEFAULT NULL::date, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0, p_required text DEFAULT 'viewer'::text\", returns: \"TABLE(record_id uuid, data jsonb)\", security: \"definer\" },\n  { name: \"query_table_homes\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"SETOF uuid\", security: \"definer\" },\n  { name: \"query_visibility_parity\", args: \"p_organization_id uuid\", returns: \"TABLE(side text, container_type text, container_id uuid, item_type text, item_id uuid, stored_level permission_level, derived_level permission_level, reason text)\", security: \"definer\" },\n  { name: \"query_visible_ids\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid, p_required text DEFAULT 'viewer'::text\", returns: \"SETOF uuid\", security: \"definer\" },\n  { name: \"reachable_from\", args: \"p_organization_id uuid, p_roots uuid[]\", returns: \"TABLE(record_id uuid, depth integer, via text)\", security: \"invoker\" },\n  { name: \"reaches_directly\", args: \"p_user_id uuid, p_type text, p_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"boolean\", security: \"definer\" },\n  { name: \"reaches_directly_many\", args: \"p_user_id uuid, p_targets uuid[], p_type text DEFAULT 'record'::text, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"TABLE(target uuid, reaches boolean)\", security: \"definer\" },\n  { name: \"read_door_carried_ids\", args: \"p_user uuid, p_organization_id uuid, p_table_id uuid, p_required permission_level, OUT o_ids uuid[], OUT o_containers integer\", returns: \"record\", security: \"definer\" },\n  { name: \"read_door_granted_ids\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"uuid[]\", security: \"definer\" },\n  { name: \"read_door_ladder_ceiling\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"read_door_parity\", args: \"p_organization_id uuid, p_table_id uuid, p_user uuid, p_required permission_level, p_sample integer\", returns: \"TABLE(record_id uuid, set_based boolean, per_row boolean, verdict text)\", security: \"definer\" },\n  { name: \"read_mask\", args: \"p_organization_id uuid, p_record_id uuid, p_action text DEFAULT 'read'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"read_mask_at\", args: \"p_record_id uuid, p_level_given boolean, p_level permission_level, p_action text DEFAULT 'read'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"read_mask_for\", args: \"p_user_id uuid, p_organization_id uuid, p_table_id uuid, p_level permission_level, p_action text DEFAULT 'read'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"read_paths_outside_the_door\", args: \"\", returns: \"TABLE(object_name text, why text)\", security: \"invoker\" },\n  { name: \"read_record\", args: \"p_organization_id uuid, p_record_id uuid, p_by_id boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"read_records\", args: \"p_organization_id uuid, p_table_id uuid, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0\", returns: \"TABLE(id uuid, document jsonb, level permission_level)\", security: \"definer\" },\n  { name: \"read_records_archived\", args: \"p_organization_id uuid, p_table_id uuid, p_lane text DEFAULT 'org'::text, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0\", returns: \"TABLE(id uuid, document jsonb, level permission_level, archived_at timestamp with time zone, archived_by uuid, archived_by_name text)\", security: \"definer\" },\n  { name: \"read_records_by_ids\", args: \"p_organization_id uuid, p_table_id uuid, p_record_ids uuid[], p_by_id boolean DEFAULT false\", returns: \"TABLE(id uuid, document jsonb, level permission_level)\", security: \"definer\" },\n  { name: \"read_records_in_view_order\", args: \"p_organization_id uuid, p_view_id uuid, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0, p_filter jsonb DEFAULT NULL::jsonb\", returns: \"TABLE(id uuid, document jsonb, level permission_level, \\\"position\\\" numeric)\", security: \"definer\" },\n  { name: \"read_records_keyset\", args: \"p_organization_id uuid, p_table_id uuid, p_filter jsonb DEFAULT '{}'::jsonb, p_search text DEFAULT NULL::text, p_sort jsonb DEFAULT '[]'::jsonb, p_after jsonb DEFAULT NULL::jsonb, p_limit integer DEFAULT 50, p_time_zone text DEFAULT NULL::text, p_ids uuid[] DEFAULT NULL::uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"read_records_matching\", args: \"p_organization_id uuid, p_table_id uuid, p_filter jsonb DEFAULT '{}'::jsonb, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0\", returns: \"TABLE(id uuid, document jsonb, level permission_level)\", security: \"definer\" },\n  { name: \"read_records_page\", args: \"p_organization_id uuid, p_table_id uuid, p_filter jsonb DEFAULT '{}'::jsonb, p_search text DEFAULT NULL::text, p_sort jsonb DEFAULT '[]'::jsonb, p_view_id uuid DEFAULT NULL::uuid, p_by_id boolean DEFAULT false, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0, p_time_zone text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"realtime_presence_topic_admits\", args: \"p_topic text\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"realtime_topic_admits\", args: \"p_topic text\", returns: \"boolean\", security: \"definer\" },\n  { name: \"record_aggregate\", args: \"p_organization_id uuid, p_table_id uuid, p_group_by jsonb DEFAULT '[]'::jsonb, p_measures jsonb DEFAULT '[]'::jsonb, p_bucket jsonb DEFAULT NULL::jsonb, p_filter jsonb DEFAULT '{}'::jsonb, p_limit integer DEFAULT 200, p_required text DEFAULT 'viewer'::text, p_compare jsonb DEFAULT NULL::jsonb, p_search text DEFAULT NULL::text, p_time_zone text DEFAULT NULL::text, p_split_multi boolean DEFAULT false\", returns: \"TABLE(groups jsonb, measures jsonb, row_count bigint, prior_groups jsonb, prior_measures jsonb, prior_row_count bigint, delta jsonb, compare jsonb)\", security: \"definer\" },\n  { name: \"record_aggregate_as_of\", args: \"p_organization_id uuid, p_table_id uuid, p_recorded_at timestamp with time zone, p_measure text DEFAULT 'count'::text, p_field_key text DEFAULT NULL::text, p_group_by text DEFAULT NULL::text, p_match jsonb DEFAULT '{}'::jsonb\", returns: \"TABLE(bucket text, result numeric, row_count bigint, not_numbers bigint, a_non_number text)\", security: \"definer\" },\n  { name: \"record_applicability\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(rule_id uuid, rule_name text, rule_version integer, applies boolean, answer jsonb)\", security: \"invoker\" },\n  { name: \"record_archiver\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"record_as_of\", args: \"p_organization_id uuid, p_record_id uuid, p_at timestamp with time zone\", returns: \"TABLE(state jsonb, replayed boolean)\", security: \"definer\" },\n  { name: \"record_card\", args: \"p_viewer uuid, p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_carrying_edges\", args: \"p_id uuid, p_data_class text, p_data jsonb, p_deleted_at timestamp with time zone\", returns: \"TABLE(container_id uuid, item_id uuid, edge_role text)\", security: \"invoker\" },\n  { name: \"record_change_actions\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_change_many\", args: \"p_organization_id uuid, p_table_id uuid, p_changes jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_changes_drain\", args: \"p_organization_id uuid, p_consumer text, p_limit integer DEFAULT 100\", returns: \"TABLE(event_id uuid, organization_id uuid, table_id uuid, record_id uuid, kind text, operation text, version integer, fields jsonb, changed_field_ids jsonb, actor jsonb, chain jsonb, op_id uuid, occurred_at timestamp with time zone, via text)\", security: \"definer\" },\n  { name: \"record_delete\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"timestamp with time zone\", security: \"definer\" },\n  { name: \"record_drill\", args: \"p_organization_id uuid, p_table_id uuid, p_question jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_entity_edges\", args: \"p_organization_id uuid, p_id uuid, p_table_id uuid, p_data_class text, p_data jsonb, p_deleted_at timestamp with time zone\", returns: \"TABLE(target_type text, target_id uuid, edge_role text, field_id uuid, ord integer)\", security: \"invoker\" },\n  { name: \"record_filter_sql\", args: \"p_filter jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"record_filter_sql\", args: \"p_organization_id uuid, p_table_id uuid, p_filter jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"record_follow_set\", args: \"p_organization_id uuid, p_record_id uuid, p_follow boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_followers\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_headers\", args: \"p_organization_id uuid, p_ids uuid[]\", returns: \"TABLE(id uuid, table_id uuid, created_at timestamp with time zone, updated_at timestamp with time zone, version integer, deleted_at timestamp with time zone, mine boolean, created_by uuid)\", security: \"definer\" },\n  { name: \"record_history\", args: \"p_organization_id uuid, p_record_id uuid, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0\", returns: \"TABLE(version integer, occurred_at timestamp with time zone, operation text, operation_label text, actor jsonb, changes jsonb, migration_id uuid, undoable boolean)\", security: \"definer\" },\n  { name: \"record_org_hint\", args: \"p_id uuid, p_organization_id uuid\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"record_page_bundle\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"record_platform_keys\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"record_relation_edges\", args: \"p_organization_id uuid, p_id uuid, p_table_id uuid, p_data_class text, p_data jsonb, p_deleted_at timestamp with time zone\", returns: \"TABLE(target_id uuid, edge_role text, field_id uuid, ord integer)\", security: \"invoker\" },\n  { name: \"record_reparent\", args: \"p_organization_id uuid, p_record_id uuid, p_parent_id uuid\", returns: \"void\", security: \"definer\" },\n  { name: \"record_resolve\", args: \"p_organization_id uuid, p_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_restore\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_restore_preview\", args: \"p_organization_id uuid, p_record_id uuid, p_version integer, p_field_key text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_restore_version\", args: \"p_organization_id uuid, p_record_id uuid, p_version integer\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_restore_version\", args: \"p_organization_id uuid, p_record_id uuid, p_version integer, p_author jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_row_controls\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_row_controls_set\", args: \"p_organization_id uuid, p_record_id uuid, p_controls jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_runs\", args: \"p_organization_id uuid, p_record_id uuid, p_limit integer DEFAULT 50\", returns: \"TABLE(run_id uuid, kind text, name text, trigger_name text, status text, started_at timestamp with time zone, finished_at timestamp with time zone, steps integer, says text, ran_by uuid)\", security: \"definer\" },\n  { name: \"record_scope_context\", args: \"p_organization_id uuid, p_record_id uuid, p_relations integer DEFAULT 12, p_history integer DEFAULT 15, p_siblings integer DEFAULT 8\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_search_sql\", args: \"p_organization_id uuid, p_table_id uuid, p_search text, p_alias text DEFAULT 'r'::text, p_time_zone text DEFAULT NULL::text\", returns: \"text\", security: \"invoker\" },\n  { name: \"record_source_key\", args: \"p_table_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"record_source_keys\", args: \"p_table_id uuid\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"record_source_table\", args: \"p_key text\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"record_stage_pending\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_state_as_of\", args: \"p_record_id uuid, p_at timestamp with time zone\", returns: \"TABLE(state jsonb, replayed boolean)\", security: \"definer\" },\n  { name: \"record_table\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"record_triggers\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(trigger_id uuid, name text, definition_id uuid, definition_name text, table_id uuid, event text, operations jsonb, field_ids jsonb, via jsonb, is_active boolean, last_fired_at timestamp with time zone, fire_count integer, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"record_update\", args: \"p_organization_id uuid, p_record_id uuid, p_patch jsonb, p_expected_version integer DEFAULT NULL::integer\", returns: \"integer\", security: \"definer\" },\n  { name: \"record_update_adding_choices\", args: \"p_organization_id uuid, p_record_id uuid, p_patch jsonb, p_add jsonb, p_expected_version integer DEFAULT NULL::integer\", returns: \"integer\", security: \"definer\" },\n  { name: \"record_upsert\", args: \"p_organization_id uuid, p_table_id uuid, p_key text[], p_data jsonb, p_expected_version integer DEFAULT NULL::integer\", returns: \"uuid\", security: \"definer\" },\n  { name: \"record_value_one\", args: \"p_organization_id uuid, p_record_id uuid, p_key text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"record_values\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"record_values_of\", args: \"p_row custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"record_values_step\", args: \"p_row custom.record, p_cache jsonb DEFAULT '{}'::jsonb, OUT o_doc jsonb, OUT o_cache jsonb\", returns: \"record\", security: \"invoker\" },\n  { name: \"record_values_versioned\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(field_key text, field_id uuid, value jsonb, value_version integer, source jsonb, absent_reason text, actor text, on_behalf_of text, written_at timestamp with time zone, alternates jsonb)\", security: \"definer\" },\n  { name: \"record_words\", args: \"p_organization_id uuid, p_record_id uuid, p_noun text DEFAULT NULL::text\", returns: \"text\", security: \"definer\" },\n  { name: \"record_write\", args: \"p_organization_id uuid, p_table_id uuid, p_data jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"record_write_graph\", args: \"p_organization_id uuid, p_table_id uuid, p_parent jsonb, p_edges jsonb DEFAULT '[]'::jsonb, p_children jsonb DEFAULT '[]'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_write_graph_superseding\", args: \"p_organization_id uuid, p_table_id uuid, p_lock_key text, p_idempotence jsonb DEFAULT NULL::jsonb, p_parent jsonb DEFAULT NULL::jsonb, p_edges jsonb DEFAULT '[]'::jsonb, p_children jsonb DEFAULT '[]'::jsonb, p_chain jsonb DEFAULT '{\\\"mode\\\": \\\"first\\\"}'::jsonb, p_rows_state jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"record_write_many\", args: \"p_organization_id uuid, p_table_id uuid, p_rows jsonb[], p_ids uuid[] DEFAULT NULL::uuid[]\", returns: \"uuid[]\", security: \"definer\" },\n  { name: \"records_limits\", args: \"p_organization_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"records_search\", args: \"p_search text, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0, p_table_ids uuid[] DEFAULT NULL::uuid[], p_organization_ids uuid[] DEFAULT NULL::uuid[], p_include_platform_tables boolean DEFAULT false\", returns: \"TABLE(record_id uuid, table_id uuid, table_name text, name text, organization_id uuid, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"refusals_claiming_a_level_never_asked\", args: \"\", returns: \"TABLE(function_name text, identity_args text, why text)\", security: \"invoker\" },\n  { name: \"relation_carry\", args: \"p_organization_id uuid, p_container_id uuid, p_item_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"relation_edges_withdraw\", args: \"p_organization_id uuid, p_field_ids uuid[], p_why text\", returns: \"integer\", security: \"definer\" },\n  { name: \"relation_halves_disagreements\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_record_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(organization_id uuid, record_id uuid, field_key text, field_id uuid, target_id uuid, direction text, remedy text, why text)\", security: \"definer\" },\n  { name: \"relation_halves_repair\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"relation_kernel_record\", args: \"p_organization_id uuid, p_kernel_table_id uuid, p_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"relation_name_key\", args: \"p_text text\", returns: \"text\", security: \"invoker\" },\n  { name: \"relation_names_match\", args: \"p_organization_id uuid, p_table_id uuid, p_names text[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"relation_own\", args: \"p_organization_id uuid, p_owner_id uuid, p_target_id uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"relation_restore\", args: \"p_organization_id uuid, p_relation_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"relation_reverse_field\", args: \"p_organization_id uuid, p_field_id uuid, p_label text DEFAULT NULL::text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"relation_reverse_set\", args: \"p_organization_id uuid, p_record_id uuid, p_field_id uuid, p_add uuid[] DEFAULT '{}'::uuid[], p_remove uuid[] DEFAULT '{}'::uuid[]\", returns: \"integer\", security: \"definer\" },\n  { name: \"relation_target_card\", args: \"p_organization_id uuid, p_record_id uuid, p_via_key text DEFAULT NULL::text\", returns: \"TABLE(target_id uuid, target_organization_id uuid, is_foreign boolean, masked boolean, reader_level permission_level, card jsonb, why text)\", security: \"definer\" },\n  { name: \"relation_target_external\", args: \"p_connection_token text, p_external_table text, p_external_key text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"relation_target_ours\", args: \"p_entity_token text, p_row_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"relation_targets\", args: \"p_organization_id uuid, p_record_id uuid, p_via_key text\", returns: \"SETOF uuid\", security: \"definer\" },\n  { name: \"relation_uncarry\", args: \"p_organization_id uuid, p_container_id uuid, p_item_id uuid\", returns: \"integer\", security: \"definer\" },\n  { name: \"relation_value_target_ok\", args: \"p_organization_id uuid, p_field_id uuid, p_field_data jsonb, p_target_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"relation_words\", args: \"p_organization_id uuid, p_field_id uuid, p_value text\", returns: \"text\", security: \"definer\" },\n  { name: \"relation_words_many\", args: \"p_organization_id uuid, p_field_id uuid, p_record_ids uuid[]\", returns: \"TABLE(record_id uuid, words text, archived boolean)\", security: \"definer\" },\n  { name: \"relation_words_with_icons_many\", args: \"p_organization_id uuid, p_field_id uuid, p_record_ids uuid[]\", returns: \"TABLE(record_id uuid, words text, archived boolean, icon text, table_icon text)\", security: \"definer\" },\n  { name: \"relative_window_for_reader\", args: \"p_window jsonb, p_organization_id uuid, p_instants boolean DEFAULT false\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"relative_window_resolve\", args: \"p_window jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"reopen_declared_doors\", args: \"\", returns: \"TABLE(reopened text)\", security: \"definer\" },\n  { name: \"required_epoch\", args: \"p_container_type text, p_container_id uuid, p_item_type text, p_item_id uuid\", returns: \"bigint\", security: \"definer\" },\n  { name: \"resolve_context\", args: \"p_entity_type text, p_entity_id uuid, p_record_ids uuid[] DEFAULT NULL::uuid[], p_table_ids uuid[] DEFAULT NULL::uuid[], p_system_item_refs text[] DEFAULT NULL::text[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"resolve_first_match\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"resolve_id\", args: \"p_organization_id uuid, p_id uuid\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"retired_actor_words\", args: \"\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"reverse_columns\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(key text, label text, source_field_id uuid, source_field_key text, source_field_label text, source_table_id uuid, source_table_name text, cardinality text, read_only boolean)\", security: \"definer\" },\n  { name: \"reverse_links_many\", args: \"p_organization_id uuid, p_table_id uuid, p_field_id uuid, p_record_ids uuid[], p_limit integer DEFAULT 10, p_offset integer DEFAULT 0\", returns: \"TABLE(record_id uuid, total integer, links jsonb)\", security: \"definer\" },\n  { name: \"reverse_links_many_fields\", args: \"p_organization_id uuid, p_table_id uuid, p_field_ids uuid[], p_record_ids uuid[], p_limit integer DEFAULT 10, p_offset integer DEFAULT 0\", returns: \"TABLE(field_id uuid, record_id uuid, total integer, links jsonb)\", security: \"invoker\" },\n  { name: \"revoke_view_share_link\", args: \"p_link_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"rollup_value\", args: \"p_organization_id uuid, p_record_id uuid, p_field_data jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"row_actions\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"row_sits_in_a_personal_table\", args: \"p_type text, p_organization_id uuid, p_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"row_template_bodies\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(template_id uuid, body jsonb)\", security: \"definer\" },\n  { name: \"row_template_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_spec jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"row_template_default\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(template_id uuid, name text, \\\"values\\\" jsonb, body jsonb)\", security: \"definer\" },\n  { name: \"row_templates\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(template_id uuid, name text, table_id uuid, \\\"values\\\" jsonb, created_at timestamp with time zone, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"rule_applies\", args: \"p_organization_id uuid, p_rule_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_context\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_declare\", args: \"p_organization_id uuid, p_spec jsonb, p_rule_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"rule_dependency_edges\", args: \"p_organization_id uuid, p_row custom.record DEFAULT NULL::custom.record\", returns: \"TABLE(needs text, needed text)\", security: \"invoker\" },\n  { name: \"rule_eval\", args: \"p_organization_id uuid, p_expr jsonb, p_values jsonb, p_context jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_field_key\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"rule_field_label\", args: \"p_organization_id uuid, p_field_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"rule_filter_node_sql\", args: \"p_organization_id uuid, p_table_id uuid, p_node jsonb, p_map jsonb, p_visible text[]\", returns: \"text\", security: \"invoker\" },\n  { name: \"rule_filter_skip_withheld\", args: \"p_organization_id uuid, p_table_id uuid, p_node jsonb, p_visible text[]\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_is_me\", args: \"p_op text, p_a jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_is_me\", args: \"p_op text, p_a jsonb, p_organization_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"rule_members\", args: \"p_organization_id uuid, p_rule_id uuid\", returns: \"SETOF custom.record\", security: \"invoker\" },\n  { name: \"rule_members_visible\", args: \"p_organization_id uuid, p_rule_id uuid, p_limit integer DEFAULT 200, p_offset integer DEFAULT 0\", returns: \"TABLE(id uuid, document jsonb, level permission_level)\", security: \"definer\" },\n  { name: \"rule_membership\", args: \"p_organization_id uuid, p_rule_id uuid, p_record_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_node_kinds\", args: \"\", returns: \"TABLE(node text, evaluated_by text, note text)\", security: \"invoker\" },\n  { name: \"rule_restore\", args: \"p_organization_id uuid, p_rule_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"rule_run\", args: \"p_organization_id uuid, p_rule_id uuid, p_values jsonb, p_context jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_sql_op\", args: \"p_op text, p_a jsonb, p_b jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"rule_truth\", args: \"p_answer jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"rule_uses\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"rule_version\", args: \"p_organization_id uuid, p_rule_id uuid\", returns: \"integer\", security: \"invoker\" },\n  { name: \"said\", args: \"p_value text, p_when_there_is_none text\", returns: \"text\", security: \"invoker\" },\n  { name: \"scope_item_row_of\", args: \"p_field custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"scope_item_value_type\", args: \"p_field jsonb, p_carried jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"scope_items_of\", args: \"p_org uuid, p_table uuid\", returns: \"SETOF custom.record\", security: \"invoker\" },\n  { name: \"scope_member_reaches\", args: \"p_user_id uuid, p_record_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"scope_row_of\", args: \"p_rec custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"scope_rows_of\", args: \"p_org uuid, p_types uuid[] DEFAULT NULL::uuid[]\", returns: \"TABLE(id uuid, table_id uuid, type_sort integer, sort_order integer, name text, type_doc jsonb, row_doc jsonb)\", security: \"invoker\" },\n  { name: \"scope_setting_back\", args: \"p_value jsonb, p_behavior text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"scope_table_provision\", args: \"p_organization_id uuid, p_item_id uuid, p_scope_id uuid, p_home_id uuid DEFAULT NULL::uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"scope_type_row_of\", args: \"p_table custom.record\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"scope_value_columns\", args: \"p_org uuid, p_field jsonb, p_value_type text, p_value jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"seen_among\", args: \"p_user_id uuid, p_ids uuid[]\", returns: \"uuid[]\", security: \"definer\" },\n  { name: \"sensitivity_rank\", args: \"p_sensitivity text\", returns: \"integer\", security: \"invoker\" },\n  { name: \"set_table_confidential\", args: \"p_table_id uuid, p_readers jsonb, p_reason text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"set_table_confidential_arman_explicitly_approved\", args: \"p_table_id uuid, p_readers jsonb, p_arman_words text, p_approved_on date, p_maker_is_reader boolean DEFAULT NULL::boolean\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"set_table_organization\", args: \"p_table_id uuid, p_reason text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"set_view_share_link_copy\", args: \"p_link_id uuid, p_restrict boolean\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"set_view_share_link_protection\", args: \"p_link_id uuid, p_password text DEFAULT NULL::text, p_change_expiry boolean DEFAULT false, p_expires_at timestamp with time zone DEFAULT NULL::timestamp with time zone\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"share_access\", args: \"p_organization_id uuid, p_subject_id uuid\", returns: \"TABLE(principal_kind text, principal_id uuid, principal_label text, level permission_level, reason text, reason_detail text, via_type text, via_id uuid, revocable boolean)\", security: \"definer\" },\n  { name: \"share_grant\", args: \"p_organization_id uuid, p_subject_id uuid, p_principal_kind text, p_principal_id uuid, p_level permission_level DEFAULT 'viewer'::permission_level\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"share_lane_set\", args: \"p_organization_id uuid, p_subject_id uuid, p_choice text, p_level permission_level DEFAULT NULL::permission_level\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"share_lanes\", args: \"\", returns: \"TABLE(choice text, lane text, discoverable boolean, label text, means text)\", security: \"definer\" },\n  { name: \"share_levels\", args: \"\", returns: \"TABLE(level permission_level, ordinal integer, label text, means text)\", security: \"definer\" },\n  { name: \"share_lists_row\", args: \"p_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"share_people\", args: \"p_organization_id uuid, p_subject_id uuid DEFAULT NULL::uuid, p_query text DEFAULT NULL::text, p_limit integer DEFAULT 25\", returns: \"TABLE(user_id uuid, email text, display_name text, membership text, already_at permission_level, already_why text)\", security: \"definer\" },\n  { name: \"share_revoke\", args: \"p_organization_id uuid, p_subject_id uuid, p_principal_kind text, p_principal_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"share_subject_name\", args: \"p_organization_id uuid, p_type text, p_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"shared_only_disagreements\", args: \"p_pretend text DEFAULT NULL::text\", returns: \"TABLE(organization_id uuid, organization_name text, member_id uuid, record_id uuid, table_id uuid, ladder boolean, read_door boolean, rls_mirror boolean, why text)\", security: \"invoker\" },\n  { name: \"shared_view_read\", args: \"p_token text, p_password text DEFAULT NULL::text, p_unlock text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"shares_outside\", args: \"p_organization_id uuid\", returns: \"TABLE(invitation_id uuid, table_id uuid, table_name text, email text, level text, level_label text, status text, joined boolean, expired boolean, invited_at timestamp with time zone, expires_at timestamp with time zone, say text)\", security: \"definer\" },\n  { name: \"sign_request_sentence\", args: \"p_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"sign_request_state\", args: \"p_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"sign_requests\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(request_id uuid, render_id uuid, record_id uuid, field_key text, document_title text, signer_name text, signer_email text, signer_has_account boolean, state text, sentence text, document_version integer, document_hash text, sent_at timestamp with time zone, expires_at timestamp with time zone, viewed_at timestamp with time zone, signed_at timestamp with time zone, declined_at timestamp with time zone, invalidated_at timestamp with time zone, signature_id uuid, signature_mark text, reminder_count integer)\", security: \"definer\" },\n  { name: \"silent_page_doors\", args: \"\", returns: \"TABLE(door text, why text)\", security: \"definer\" },\n  { name: \"size_refusal\", args: \"p_organization_id uuid, p_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"source_next_pointer\", args: \"p_sources jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"source_pointer\", args: \"p_sources jsonb, p_source jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"space_templates\", args: \"p_filter jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"stage_rule_enforcement\", args: \"p_organization_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"stage_rule_on_fail_kinds\", args: \"\", returns: \"TABLE(behaviour text, note text)\", security: \"invoker\" },\n  { name: \"stamp_value_envelopes\", args: \"p_data jsonb, p_actor text, p_on_behalf_of text, p_at timestamp with time zone\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"status_groups_keyed\", args: \"p_organization_id uuid, p_options_table_id uuid, p_groups jsonb, p_kept jsonb, p_label text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"status_groups_of\", args: \"p_groups jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"storage_modes\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"store_census_pair_ceiling\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"store_field_part\", args: \"p_field_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"store_is_open\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"store_off_sentence\", args: \"p_organization_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"store_part_notice\", args: \"p_field custom.record, p_action text DEFAULT 'read'::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"store_part_who\", args: \"p_cells jsonb, p_action text DEFAULT 'read'::text\", returns: \"text\", security: \"definer\" },\n  { name: \"store_row_visible\", args: \"p_person uuid, p_table uuid, p_row custom.record, p_visible text[]\", returns: \"text[]\", security: \"definer\" },\n  { name: \"store_row_visible_with\", args: \"p_reveals jsonb, p_person uuid, p_row custom.record, p_visible text[]\", returns: \"text[]\", security: \"definer\" },\n  { name: \"store_seat_fallback\", args: \"p_org uuid\", returns: \"SETOF uuid\", security: \"definer\" },\n  { name: \"store_seat_has\", args: \"p_person uuid, p_record uuid, p_seat jsonb\", returns: \"boolean\", security: \"definer\" },\n  { name: \"store_seat_holders\", args: \"p_record uuid, p_seat jsonb\", returns: \"TABLE(user_id uuid, source text)\", security: \"definer\" },\n  { name: \"store_seat_invalid\", args: \"p_seat jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"store_seat_records\", args: \"p_person uuid, p_table uuid, p_seat jsonb\", returns: \"SETOF uuid\", security: \"definer\" },\n  { name: \"subscription_cadences\", args: \"p_organization_id uuid\", returns: \"text[]\", security: \"definer\" },\n  { name: \"subscription_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_spec jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"subscription_mute\", args: \"p_organization_id uuid, p_rule_id uuid, p_muted boolean DEFAULT true\", returns: \"boolean\", security: \"definer\" },\n  { name: \"subscription_preview\", args: \"p_organization_id uuid, p_rule_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"subscriptions\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(rule_id uuid, name text, table_id uuid, saved_view_id uuid, cadence text, schedule text, quiet_hours jsonb, channel text, recipient_user_id uuid, event_key text, muted boolean, mine boolean, i_may_mute boolean, last_sent_at timestamp with time zone, next_digest_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"synced_source_archive_log\", args: \"p_id uuid, p_job text DEFAULT NULL::text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"synced_source_archive_log_add\", args: \"p_id uuid, p_job text, p_entry jsonb, p_now timestamp with time zone DEFAULT now()\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"synced_source_by_ref\", args: \"p_organization_id uuid, p_source_kinds text[], p_source_ref text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"synced_source_finish\", args: \"p_id uuid, p_cursor jsonb, p_synced_at timestamp with time zone, p_report jsonb, p_mapping jsonb, p_run_id uuid\", returns: \"void\", security: \"definer\" },\n  { name: \"synced_source_read\", args: \"p_organization_id uuid, p_source_kind text, p_target uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"synced_source_save\", args: \"p_organization_id uuid, p_source_kind text, p_source_ref text, p_title text, p_target uuid, p_owner uuid, p_connector jsonb, p_actor uuid\", returns: \"uuid\", security: \"definer\" },\n  { name: \"synced_sources_for\", args: \"p_source_ref text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_access_setup\", args: \"p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_access_setup_preview\", args: \"p_table_id uuid, p_setup jsonb, p_moves jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_access_setup_revert\", args: \"p_table_id uuid, p_audit_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_access_setup_set\", args: \"p_table_id uuid, p_setup jsonb, p_moves jsonb DEFAULT '{}'::jsonb, p_reason text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_add_rung\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"permission_level\", security: \"invoker\" },\n  { name: \"table_agent_writable_set\", args: \"p_organization_id uuid, p_table_id uuid, p_agent_writable boolean\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_archive\", args: \"p_organization_id uuid, p_table_id uuid, p_chunk integer DEFAULT 50, p_include_table boolean DEFAULT true\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_archive_deliberately\", args: \"p_organization_id uuid, p_table_id uuid, p_typed_slug text, p_reason text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_capacity\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_carries_its_rows\", args: \"p_user_id uuid, p_table_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"boolean\", security: \"definer\" },\n  { name: \"table_column_source\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"table_contents\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(record_id uuid, kind text, goes_at integer)\", security: \"invoker\" },\n  { name: \"table_copies_in_progress\", args: \"\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_copy_sync\", args: \"p_organization_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_create\", args: \"p_organization_id uuid, p_spec jsonb, p_fields jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"table_declare\", args: \"p_organization_id uuid, p_spec jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"table_decorate\", args: \"p_organization_id uuid, p_table_id uuid, p_path text[], p_value jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_decorations\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_dimensions\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_dimensions_set\", args: \"p_organization_id uuid, p_table_id uuid, p_overrides jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_duplicate\", args: \"p_table_id uuid, p_with_records boolean DEFAULT false, p_name text DEFAULT NULL::text, p_organization_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_duplicate_continue\", args: \"p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_ensure\", args: \"p_organization_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_facts\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(table_id uuid, visibility text, mine boolean, platform_owned boolean, kept_for text, offered_as_context boolean, keeper_group text, keeper_says text, used_in_kind text, used_in_id uuid, used_in_table_id uuid, foundation boolean)\", security: \"definer\" },\n  { name: \"table_find\", args: \"p_organization_id uuid, p_slug text DEFAULT NULL::text, p_name text DEFAULT NULL::text, p_kept_for text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_find_many\", args: \"p_organization_ids uuid[], p_slug text, p_kept_for text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_from_example\", args: \"p_organization_id uuid, p_home_id uuid, p_example jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_has_a_visible_record\", args: \"p_user uuid, p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"table_home\", args: \"p_table_id uuid, p_to_organization_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_homes_named\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(home_id uuid, name text, declared boolean)\", security: \"definer\" },\n  { name: \"table_is_foundation\", args: \"p_data jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"table_is_live\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"table_is_options_table\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"table_is_platform_context\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"table_kept_for_derived\", args: \"p_data jsonb, p_is_kernel boolean, p_is_options boolean\", returns: \"text\", security: \"invoker\" },\n  { name: \"table_kept_out_of_lists\", args: \"p_kept_for text\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"table_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"table_kind_facts\", args: \"p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_level_facts\", args: \"p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_list_everywhere\", args: \"p_organization_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_list_everywhere\", args: \"p_organization_id uuid, p_include_platform_tables boolean\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"table_map_fields\", args: \"p_organization_id uuid, p_table_ids uuid[]\", returns: \"TABLE(table_id uuid, field_key text, field_label text, field_type text, relation_target uuid, inverse_key text, field_sort numeric, is_link boolean)\", security: \"definer\" },\n  { name: \"table_move\", args: \"p_table_id uuid, p_to_organization_id uuid, p_expected_version integer DEFAULT NULL::integer\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_page_bundle\", args: \"p_organization_id uuid, p_table_id uuid, p_view_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"table_placement\", args: \"p_organization_id uuid, p_table_id uuid, p_data jsonb, p_is_kernel boolean DEFAULT false\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"table_record_ceiling\", args: \"\", returns: \"integer\", security: \"invoker\" },\n  { name: \"table_record_ceiling\", args: \"p_organization_id uuid\", returns: \"integer\", security: \"invoker\" },\n  { name: \"table_restore\", args: \"p_organization_id uuid, p_table_id uuid, p_chunk integer DEFAULT 20\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_row_counts\", args: \"p_organization_id uuid, p_table_ids uuid[]\", returns: \"TABLE(table_id uuid, visible_rows bigint)\", security: \"definer\" },\n  { name: \"table_row_defaults\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_row_defaults_apply\", args: \"p_organization_id uuid, p_table_id uuid, p_after uuid DEFAULT NULL::uuid, p_budget_ms integer DEFAULT 4000\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_row_defaults_set\", args: \"p_organization_id uuid, p_table_id uuid, p_defaults jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_row_label\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_row_label_set\", args: \"p_organization_id uuid, p_table_id uuid, p_formula text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_rules\", args: \"p_organization_id uuid, p_table_id uuid, p_use text, p_record_type text DEFAULT NULL::text\", returns: \"SETOF custom.record\", security: \"invoker\" },\n  { name: \"table_share_outside\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_share_outside_accept\", args: \"p_token text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_share_outside_for_me\", args: \"\", returns: \"TABLE(invitation_id uuid, organization_id uuid, organization text, table_id uuid, table_name text, level text, level_label text, token text, expires_at timestamp with time zone, say text)\", security: \"definer\" },\n  { name: \"table_share_outside_grant\", args: \"p_organization_id uuid, p_table_id uuid, p_person text, p_level permission_level DEFAULT 'viewer'::permission_level\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_share_outside_invite\", args: \"p_organization_id uuid, p_table_id uuid, p_email text, p_level permission_level DEFAULT 'viewer'::permission_level\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_share_outside_resend\", args: \"p_organization_id uuid, p_invitation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_share_outside_revoke\", args: \"p_organization_id uuid, p_invitation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_stage_field\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"table_storage\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"table_sync\", args: \"p_organization_id uuid, p_home_id uuid, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_sync_cell\", args: \"p_organization_id uuid, p_record_id uuid, p_key text, p_land jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_sync_due_tick\", args: \"\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_sync_settings_set\", args: \"p_organization_id uuid, p_table_id uuid, p_settings jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_template_declare\", args: \"p_org_id uuid, p_name text, p_description text, p_fields jsonb\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"table_templates\", args: \"p_org_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_transfer_owner\", args: \"p_table_id uuid, p_to_person uuid, p_reason text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_type_field\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"table_unique_rule_fields\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"table_webhook_archive\", args: \"p_organization_id uuid, p_webhook_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"table_webhook_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_target_url text, p_events text[] DEFAULT NULL::text[], p_description text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"table_webhooks\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(webhook_id uuid, target_url text, description text, events text[], is_active boolean, last_attempt_at timestamp with time zone, last_success_at timestamp with time zone, consecutive_failures integer, owner_id uuid, created_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"table_work_kind\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"tables_at_home\", args: \"p_organization_id uuid, p_home_ids uuid[]\", returns: \"TABLE(table_id uuid, home_record_id uuid, kind text)\", security: \"definer\" },\n  { name: \"tables_described_without_asking\", args: \"\", returns: \"TABLE(function_name text, identity_args text, why text)\", security: \"invoker\" },\n  { name: \"tables_i_can_open\", args: \"\", returns: \"TABLE(table_id uuid, table_name text, organization_id uuid, organization_name text, member boolean, visibility text, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"tables_listed_among\", args: \"p_organization_id uuid, p_tables uuid[]\", returns: \"SETOF uuid\", security: \"invoker\" },\n  { name: \"tables_seen_among\", args: \"p_user_id uuid, p_organization_ids uuid[], p_among uuid[]\", returns: \"TABLE(organization_id uuid, id uuid, seen boolean)\", security: \"definer\" },\n  { name: \"tables_seen_once_per_group\", args: \"p_user_id uuid, p_organization_ids uuid[]\", returns: \"TABLE(organization_id uuid, id uuid, seen boolean)\", security: \"definer\" },\n  { name: \"tables_shared_with_me\", args: \"\", returns: \"TABLE(table_id uuid, organization_id uuid, organization text, table_name text, level text, level_label text, shared_at timestamp with time zone, opens boolean, say text)\", security: \"definer\" },\n  { name: \"template_archive\", args: \"p_template_id uuid, p_restore boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_declare\", args: \"p_scope text, p_spec jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_from_tables\", args: \"p_organization_id uuid, p_table_ids uuid[], p_include_rows boolean DEFAULT false, p_rows_per_table integer DEFAULT 25\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_install\", args: \"p_organization_id uuid, p_template_id uuid, p_budget_ms integer DEFAULT 4000\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_install_claim\", args: \"p_organization_id uuid, p_install_id uuid, p_kind text, p_label text, p_source_id uuid DEFAULT NULL::uuid, p_lease_seconds integer DEFAULT NULL::integer\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_install_fresh\", args: \"p_organization_id uuid, p_template_id uuid, p_title text DEFAULT NULL::text, p_install_id uuid DEFAULT NULL::uuid, p_budget_ms integer DEFAULT 4000\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_install_note\", args: \"p_organization_id uuid, p_install_id uuid, p_kind text, p_id uuid, p_label text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_instance_of_page\", args: \"p_organization_id uuid, p_page_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_instances\", args: \"p_organization_id uuid, p_catalogue_id text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_keep\", args: \"p_template_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_restore\", args: \"p_organization_id uuid, p_install_id uuid, p_budget_ms integer DEFAULT 4000\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_uninstall\", args: \"p_organization_id uuid, p_install_id uuid, p_budget_ms integer DEFAULT 4000\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"template_upgrade\", args: \"p_organization_id uuid, p_install_id uuid, p_template_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"templates\", args: \"p_filter jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"text_head_bytes\", args: \"p_text text, p_bytes bigint\", returns: \"text\", security: \"invoker\" },\n  { name: \"timeline_dependency_shift\", args: \"p_organization_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"trg_associations_bump_visibility\", args: \"\", returns: \"trigger\", security: \"definer\" },\n  { name: \"undeclared_keys\", args: \"p_organization_id uuid, p_table_id uuid, p_data jsonb\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"unmatched_people_resolve\", args: \"p_organization_id uuid, p_user_id uuid\", returns: \"integer\", security: \"definer\" },\n  { name: \"unresolved_sources_of\", args: \"p_sources jsonb, p_visible text[], p_by_id boolean DEFAULT false, p_key_ids jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"validate_custom_fields\", args: \"p_token text, p_organization_id uuid, p_values jsonb\", returns: \"void\", security: \"invoker\" },\n  { name: \"validate_value_envelope\", args: \"p_organization_id uuid, p_fields custom.record[], p_data jsonb\", returns: \"void\", security: \"invoker\" },\n  { name: \"validate_values\", args: \"p_organization_id uuid, p_fields custom.record[], p_values jsonb, p_record_type text DEFAULT NULL::text\", returns: \"void\", security: \"invoker\" },\n  { name: \"value_alternate_keys\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"value_envelope_keys\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"value_envelope_ok\", args: \"p_data jsonb\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"value_envelope_refusal\", args: \"p_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"value_read\", args: \"p_organization_id uuid, p_record_id uuid, p_key text\", returns: \"TABLE(field_key text, field_id uuid, value jsonb, value_version integer, source jsonb, absent_reason text, actor text, on_behalf_of text, written_at timestamp with time zone, alternates jsonb)\", security: \"definer\" },\n  { name: \"value_restore\", args: \"p_organization_id uuid, p_record_id uuid, p_field_key text, p_version integer\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"value_restore\", args: \"p_organization_id uuid, p_record_id uuid, p_field_key text, p_version integer, p_author jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"value_versions\", args: \"p_old jsonb, p_new jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"view_declare\", args: \"p_organization_id uuid, p_table_id uuid, p_spec jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"view_designate\", args: \"p_organization_id uuid, p_table_id uuid, p_view_id uuid, p_layout text DEFAULT NULL::text\", returns: \"uuid\", security: \"definer\" },\n  { name: \"view_keys\", args: \"\", returns: \"TABLE(path text, shape text, layouts text[], writer text, sentence text)\", security: \"invoker\" },\n  { name: \"view_keys_check\", args: \"p_organization_id uuid, p_table_id uuid, p_set jsonb, p_old jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"view_look_read\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"view_look_set\", args: \"p_organization_id uuid, p_table_id uuid, p_view_id uuid, p_look jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"view_record_order_set\", args: \"p_organization_id uuid, p_view_id uuid, p_record_ids uuid[]\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"view_share_links\", args: \"p_view_id uuid\", returns: \"TABLE(id uuid, token text, permission_level text, label text, expires_at timestamp with time zone, use_count integer, last_used_at timestamp with time zone, created_at timestamp with time zone, created_by uuid, created_by_name text, made_by_me boolean, has_password boolean, restrict_copy boolean)\", security: \"definer\" },\n  { name: \"views\", args: \"p_organization_id uuid, p_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(view_id uuid, name text, table_id uuid, filters jsonb, definition jsonb, created_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"visibility_ancestors\", args: \"p_item_type text, p_item_id uuid\", returns: \"TABLE(container_type text, container_id uuid, depth integer, max_level permission_level)\", security: \"definer\" },\n  { name: \"visibility_as_of\", args: \"p_organization_id uuid, p_record_id uuid, p_at timestamp with time zone\", returns: \"TABLE(principal_kind text, principal_id uuid, level permission_level, through_kind text, through_id uuid, reason text, replayed boolean, held_from timestamp with time zone, held_to timestamp with time zone)\", security: \"definer\" },\n  { name: \"visibility_cache_rebuild\", args: \"\", returns: \"integer\", security: \"definer\" },\n  { name: \"visibility_parity\", args: \"\", returns: \"TABLE(side text, container_type text, container_id uuid, item_type text, item_id uuid, stored_level permission_level, derived_level permission_level, reason text)\", security: \"definer\" },\n  { name: \"visibility_warm\", args: \"p_container_type text, p_container_id uuid\", returns: \"integer\", security: \"definer\" },\n  { name: \"visible_predicate_sql\", args: \"p_user uuid, p_organization_id uuid, p_table_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level, p_alias text DEFAULT 'r'::text\", returns: \"text\", security: \"definer\" },\n  { name: \"visible_record_ids\", args: \"p_user_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level\", returns: \"TABLE(id uuid)\", security: \"definer\" },\n  { name: \"visible_set\", args: \"p_user uuid, p_organization_id uuid, p_table_id uuid, p_required permission_level DEFAULT 'viewer'::permission_level, OUT o_all_visible boolean, OUT o_true_visibility platform.visibility[], OUT o_granted_all uuid[], OUT o_granted_visible uuid[], OUT o_carried_visible uuid[], OUT o_ladder_calls integer, OUT o_fallback boolean, OUT o_note text\", returns: \"record\", security: \"definer\" },\n  { name: \"where_id_opens\", args: \"p_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"where_lists_live\", args: \"p_list_ids uuid[]\", returns: \"TABLE(list_id uuid, lives_in text, address text, why text)\", security: \"definer\" },\n  { name: \"where_tables_live\", args: \"p_table_ids uuid[]\", returns: \"TABLE(table_id uuid, lives_in text, why text)\", security: \"definer\" },\n  { name: \"who_could_see_on\", args: \"p_record_id uuid, p_at timestamp with time zone\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"whole_value_ceiling\", args: \"p_organization_id uuid\", returns: \"bigint\", security: \"invoker\" },\n  { name: \"whole_value_complete\", args: \"p_organization_id uuid, p_record_id uuid, p_field_key text, p_file_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"whole_value_head\", args: \"p_text text\", returns: \"text\", security: \"invoker\" },\n  { name: \"whole_value_park\", args: \"p_organization_id uuid, p_table_id uuid, p_record_id uuid, p_owner_id uuid, p_visibility platform.visibility, p_data jsonb, p_park jsonb\", returns: \"void\", security: \"invoker\" },\n  { name: \"whole_value_pointer_of\", args: \"p_values jsonb, p_sources jsonb, p_key text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"whole_value_source\", args: \"p_text text, p_writer_src jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"whole_values_waiting\", args: \"p_organization_id uuid, p_record_ids uuid[]\", returns: \"TABLE(record_id uuid, field_key text, pointer text, value_version integer, sha256 text, bytes bigint, chars bigint, owner_id uuid, record_visibility text, table_id uuid, table_name text)\", security: \"definer\" },\n  { name: \"widget_kernel_id\", args: \"\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"with_retired\", args: \"p_doc jsonb, p_retired jsonb, p_visible text[], p_declared text[]\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"with_whole_value_pointers\", args: \"p_document jsonb, p_values jsonb, p_sources jsonb, p_visible text[], p_by_id boolean DEFAULT false, p_key_ids jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"withheld_marker\", args: \"p_mask jsonb, p_key text\", returns: \"jsonb\", security: \"invoker\" },\n  { name: \"withheld_sentence\", args: \"p_mask jsonb, p_key text\", returns: \"text\", security: \"invoker\" },\n  { name: \"work_approval_approvers\", args: \"p_organization_id uuid, p_subject_id uuid, p_approver_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(user_id uuid, name text, why text)\", security: \"definer\" },\n  { name: \"work_approval_decide\", args: \"p_organization_id uuid, p_approval_id uuid, p_approve boolean, p_note text DEFAULT NULL::text\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_approval_host_run\", args: \"p_organization_id uuid, p_fingerprint text, p_conversation_id uuid DEFAULT NULL::uuid, p_approval_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_approval_host_run_done\", args: \"p_organization_id uuid, p_approval_id uuid, p_ok boolean, p_outcome text, p_report jsonb DEFAULT NULL::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_approval_is_approver\", args: \"p_organization_id uuid, p_subject_id uuid, p_approver_id uuid, p_user_id uuid\", returns: \"boolean\", security: \"invoker\" },\n  { name: \"work_approval_kinds\", args: \"\", returns: \"text[]\", security: \"invoker\" },\n  { name: \"work_approval_may_decide\", args: \"p_organization_id uuid, p_approval_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"work_approval_read\", args: \"p_organization_id uuid, p_approval_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_approval_request\", args: \"p_organization_id uuid, p_subject_id uuid, p_change jsonb, p_note text DEFAULT NULL::text, p_approver_id uuid DEFAULT NULL::uuid, p_origin text DEFAULT 'person'::text, p_conversation_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_approval_withdrawal\", args: \"p_organization_id uuid, p_data jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"work_assign\", args: \"p_organization_id uuid, p_record_id uuid, p_assignee_user_id uuid, p_due_date timestamp with time zone DEFAULT NULL::timestamp with time zone, p_clear_due boolean DEFAULT false\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_assignment_fields\", args: \"p_options_table_id uuid DEFAULT NULL::uuid\", returns: \"TABLE(key text, label text, spec jsonb)\", security: \"invoker\" },\n  { name: \"work_decide_many\", args: \"p_organization_id uuid, p_decisions jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_has_assignment\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"work_inbox\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0, p_include_decided boolean DEFAULT false, p_view text DEFAULT 'inbox'::text\", returns: \"TABLE(item_id uuid, kind text, origin text, title text, subject_id uuid, subject_kind text, summary text, state text, due_on timestamp with time zone, due_state text, actionable boolean, requested_by uuid, requested_by_name text, at timestamp with time zone, table_id uuid, table_name text, decided_by uuid, decided_by_name text, decided_at timestamp with time zone, outcome text, snoozed_until timestamp with time zone, cleared_at timestamp with time zone, snoozed_count integer, cleared_count integer, undo_seconds integer, undo_refusal text)\", security: \"definer\" },\n  { name: \"work_instantiation_shape\", args: \"p_organization_id uuid, p_instantiation_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_list\", args: \"p_organization_id uuid DEFAULT NULL::uuid, p_flavour text DEFAULT 'mine'::text, p_include_finished boolean DEFAULT false, p_limit integer DEFAULT 100, p_offset integer DEFAULT 0\", returns: \"TABLE(record_id uuid, table_id uuid, table_name text, title text, assignee_id uuid, assignee_name text, assignee_user_id uuid, due_on timestamp with time zone, due_state text, status text, terminal boolean, assigned_by uuid, updated_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"work_person\", args: \"p_organization_id uuid, p_user_id uuid, p_create boolean DEFAULT true\", returns: \"uuid\", security: \"definer\" },\n  { name: \"work_record_states\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"TABLE(state_id uuid, name text, sort integer, terminal boolean, is_current boolean, allowed boolean, refusal text)\", security: \"definer\" },\n  { name: \"work_relation_kinds\", args: \"\", returns: \"TABLE(kind text, available boolean, why text)\", security: \"invoker\" },\n  { name: \"work_set_state\", args: \"p_organization_id uuid, p_record_id uuid, p_state_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_slot_expire\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"integer\", security: \"definer\" },\n  { name: \"work_slot_hold\", args: \"p_organization_id uuid, p_table_id uuid, p_slot_key text, p_holder text, p_ttl interval DEFAULT '00:15:00'::interval\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_slot_holds\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"TABLE(hold_id uuid, slot_key text, holder text, expires_at timestamp with time zone, expired boolean)\", security: \"definer\" },\n  { name: \"work_slot_index_name\", args: \"p_table_id uuid\", returns: \"text\", security: \"invoker\" },\n  { name: \"work_slot_release\", args: \"p_organization_id uuid, p_hold_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"work_slots_declare\", args: \"p_organization_id uuid, p_name text, p_slug text, p_home_id uuid DEFAULT NULL::uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_state_id\", args: \"p_organization_id uuid, p_table_id uuid, p_value text\", returns: \"uuid\", security: \"invoker\" },\n  { name: \"work_states\", args: \"\", returns: \"TABLE(sort integer, name text, terminal boolean, next text[])\", security: \"invoker\" },\n  { name: \"work_take_assignment\", args: \"p_organization_id uuid, p_table_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_template_declare\", args: \"p_organization_id uuid, p_name text, p_graph jsonb\", returns: \"uuid\", security: \"definer\" },\n  { name: \"work_template_instantiate\", args: \"p_organization_id uuid, p_template_id uuid, p_overrides jsonb DEFAULT '{}'::jsonb\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_template_refusal\", args: \"p_graph jsonb\", returns: \"text\", security: \"invoker\" },\n  { name: \"work_template_shape\", args: \"p_organization_id uuid, p_template_id uuid\", returns: \"jsonb\", security: \"definer\" },\n  { name: \"work_templates\", args: \"p_organization_id uuid, p_limit integer DEFAULT 100\", returns: \"TABLE(template_id uuid, name text, nodes integer, relations integer, created_at timestamp with time zone)\", security: \"definer\" },\n  { name: \"work_transition_refusal\", args: \"p_organization_id uuid, p_from_state_id uuid, p_to_state_id uuid\", returns: \"text\", security: \"definer\" },\n  { name: \"work_whose_turn\", args: \"p_organization_id uuid, p_table_id uuid, p_include_finished boolean DEFAULT false\", returns: \"TABLE(record_id uuid, title text, assignee_id uuid, turn text, due_on timestamp with time zone, state text, status text, terminal boolean)\", security: \"definer\" },\n  { name: \"world_reader_may_know_row\", args: \"p_organization_id uuid, p_record_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"world_reader_only\", args: \"p_organization_id uuid\", returns: \"boolean\", security: \"definer\" },\n  { name: \"world_reader_reads_public_definition\", args: \"p_organization_id uuid, p_table_id uuid, p_record_ids uuid[]\", returns: \"boolean\", security: \"definer\" },\n] as const;\n\n/** The campaign's own knobs, with the value the store resolves them to today. */\nexport const STORE_KNOBS = [\n  { key: \"accessible_entity_ids_guard\", value: \"true\", type: \"boolean\" },\n  { key: \"action_run_records_max\", value: \"5000\", type: \"integer\" },\n  { key: \"agent_context_value_cap_bytes\", value: \"0\", type: \"integer\" },\n  { key: \"agent_schema_changes\", value: \"\\\"never_ask\\\"\", type: \"string\" },\n  { key: \"ai_column_decision_engine\", value: \"false\", type: \"boolean\" },\n  { key: \"ai_fill_default_rows\", value: \"3\", type: \"integer\" },\n  { key: \"ai_fill_rows_max\", value: \"50\", type: \"integer\" },\n  { key: \"ai_fill_try_max\", value: \"10\", type: \"integer\" },\n  { key: \"archive_confirm_over\", value: \"1000\", type: \"integer\" },\n  { key: \"automation_catch_up_hours\", value: \"48\", type: \"integer\" },\n  { key: \"back_links\", value: \"true\", type: \"boolean\" },\n  { key: \"base_snapshot_keep\", value: \"30\", type: \"integer\" },\n  { key: \"batch_items_max\", value: \"500\", type: \"integer\" },\n  { key: \"choice_nudge\", value: \"\\\"ask\\\"\", type: \"string\" },\n  { key: \"closed_custom_field_tables\", value: \"[\\\"party\\\"]\", type: \"json\" },\n  { key: \"code_paths_enabled\", value: \"true\", type: \"boolean\" },\n  { key: \"consumer_chat_seeding_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_checkout_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_context_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_education_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_extension_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_grid_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_retirement_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_saved_ai_outputs_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"consumer_scopes_enabled\", value: \"false\", type: \"boolean\" },\n  { key: \"containment_depth_ceiling\", value: \"16\", type: \"integer\" },\n  { key: \"copy_stall_passes\", value: \"20\", type: \"integer\" },\n  { key: \"cross_organization_links\", value: \"false\", type: \"boolean\" },\n  { key: \"data_home_default_kind\", value: \"\\\"all\\\"\", type: \"string\" },\n  { key: \"data_home_default_order\", value: \"\\\"updated\\\"\", type: \"enum\" },\n  { key: \"data_home_default_scope\", value: \"\\\"all\\\"\", type: \"enum\" },\n  { key: \"data_home_default_view\", value: \"\\\"table\\\"\", type: \"enum\" },\n  { key: \"decision_undo_seconds\", value: \"5\", type: \"integer\" },\n  { key: \"decoration_rules_max\", value: \"50\", type: \"integer\" },\n  { key: \"decorations_max_bytes\", value: \"262144\", type: \"integer\" },\n  { key: \"document_letterhead\", value: \"{}\", type: \"json\" },\n  { key: \"document_max_bytes\", value: \"1048576\", type: \"integer\" },\n  { key: \"enrichment_batch_ceiling\", value: \"200\", type: \"integer\" },\n  { key: \"enrichment_confidence_floor\", value: \"0.6\", type: \"number\" },\n  { key: \"enrichment_cost_cap_cents\", value: \"2000\", type: \"integer\" },\n  { key: \"enrichment_estimate_output_tokens\", value: \"200\", type: \"integer\" },\n  { key: \"enrichment_sensitivity_ceiling\", value: \"\\\"internal\\\"\", type: \"string\" },\n  { key: \"entity_types_guard\", value: \"false\", type: \"boolean\" },\n  { key: \"example_rows_max\", value: \"500\", type: \"integer\" },\n  { key: \"export_rows_ceiling\", value: \"100000\", type: \"integer\" },\n  { key: \"external_principal_enabled\", value: \"true\", type: \"boolean\" },\n  { key: \"field_sensitivity_levels\", value: \"{\\\"edit\\\": {\\\"public\\\": \\\"edit_content\\\", \\\"internal\\\": \\\"edit_content\\\", \\\"restricted\\\": \\\"admin\\\", \\\"confidential\\\": \\\"admin\\\"}, \\\"read\\\": {\\\"public\\\": \\\"viewer\\\", \\\"internal\\\": \\\"viewer\\\", \\\"restricted\\\": \\\"admin\\\", \\\"confidential\\\": \\\"admin\\\"}}\", type: \"json\" },\n  { key: \"form_draft_days\", value: \"30\", type: \"integer\" },\n  { key: \"form_draft_max_bytes\", value: \"65536\", type: \"integer\" },\n  { key: \"form_draft_saves_per_hour\", value: \"240\", type: \"integer\" },\n  { key: \"form_redirect_domains\", value: \"[]\", type: \"json\" },\n  { key: \"grid_layout\", value: \"{\\\"mode\\\": \\\"auto\\\", \\\"wrap\\\": false, \\\"row_height\\\": \\\"normal\\\", \\\"fit_max_columns\\\": 8, \\\"freeze_first_column\\\": false}\", type: \"json\" },\n  { key: \"host_run_approval_days\", value: \"7\", type: \"integer\" },\n  { key: \"inbound_domain\", value: \"\\\"inbound.matrxserver.com\\\"\", type: \"string\" },\n  { key: \"inbox_reminder_after_days\", value: \"3\", type: \"integer\" },\n  { key: \"member_default_level\", value: \"\\\"editor\\\"\", type: \"enum\" },\n  { key: \"outside_invite_who\", value: \"\\\"org_admins_and_table_owners\\\"\", type: \"string\" },\n  { key: \"page_size_ceiling\", value: \"1000\", type: \"integer\" },\n  { key: \"protected_field_rules\", value: \"{\\\"hr_employee\\\": {\\\"arm\\\": \\\"hr.arm_write\\\", \\\"rule\\\": \\\"hr.custom_field_access\\\", \\\"readers\\\": [{\\\"field\\\": \\\"subject\\\"}, {\\\"capability\\\": \\\"hr.identity.read\\\"}, {\\\"capability\\\": \\\"hr.working_record.write\\\"}, {\\\"level\\\": \\\"editor\\\", \\\"capability\\\": \\\"hr.identity.write\\\"}]}, \\\"hr_candidate\\\": {\\\"arm\\\": \\\"hr.arm_write\\\", \\\"rule\\\": \\\"hr.custom_field_access\\\", \\\"readers\\\": [{\\\"field\\\": \\\"subject\\\"}, {\\\"capability\\\": \\\"hr.identity.read\\\"}, {\\\"capability\\\": \\\"hr.working_record.write\\\"}, {\\\"level\\\": \\\"editor\\\", \\\"capability\\\": \\\"hr.identity.write\\\"}]}, \\\"hr_position_assignment\\\": {\\\"arm\\\": \\\"hr.arm_write\\\", \\\"rule\\\": \\\"hr.custom_field_access\\\", \\\"readers\\\": [{\\\"field\\\": \\\"subject\\\"}, {\\\"capability\\\": \\\"hr.identity.read\\\"}, {\\\"capability\\\": \\\"hr.working_record.write\\\"}, {\\\"level\\\": \\\"editor\\\", \\\"capability\\\": \\\"hr.identity.write\\\"}]}, \\\"hr_training_assignment\\\": {\\\"arm\\\": \\\"hr.arm_write\\\", \\\"rule\\\": \\\"hr.custom_field_access\\\", \\\"readers\\\": [{\\\"field\\\": \\\"subject\\\"}, {\\\"capability\\\": \\\"hr.identity.read\\\"}, {\\\"capability\\\": \\\"hr.working_record.write\\\"}, {\\\"level\\\": \\\"editor\\\", \\\"capability\\\": \\\"hr.identity.write\\\"}]}}\", type: \"json\" },\n  { key: \"provenance_retention_days\", value: \"30\", type: \"number\" },\n  { key: \"retype_preview_bytes_max\", value: \"2000000\", type: \"integer\" },\n  { key: \"retype_preview_values_max\", value: \"100\", type: \"integer\" },\n  { key: \"row_action_steps_max\", value: \"60\", type: \"integer\" },\n  { key: \"row_actions_max\", value: \"24\", type: \"integer\" },\n  { key: \"sandbox_message_bytes\", value: \"65536\", type: \"integer\" },\n  { key: \"sandbox_org_components\", value: \"true\", type: \"boolean\" },\n  { key: \"scope_members_admitted\", value: \"true\", type: \"boolean\" },\n  { key: \"sheets_write_through\", value: \"true\", type: \"boolean\" },\n  { key: \"signup_provisioning_guard\", value: \"false\", type: \"boolean\" },\n  { key: \"stage_rule_enforcement\", value: \"\\\"refuse\\\"\", type: \"enum\" },\n  { key: \"table_record_ceiling\", value: \"150000\", type: \"integer\" },\n  { key: \"table_sync_rows_max\", value: \"20000\", type: \"integer\" },\n  { key: \"table_webhooks_max\", value: \"10\", type: \"integer\" },\n  { key: \"time_zone\", value: \"\\\"UTC\\\"\", type: \"string\" },\n  { key: \"value_max_bytes\", value: \"100000\", type: \"integer\" },\n  { key: \"view_record_order_max\", value: \"20000\", type: \"integer\" },\n  { key: \"week_start\", value: \"\\\"monday\\\"\", type: \"enum\" },\n  { key: \"world_publish_enabled\", value: \"true\", type: \"boolean\" },\n] as const;\n\n/**\n * Every SQLSTATE the store's own function bodies raise, with the functions that\n * raise it. This is the list the client's refusal mapper is checked against: a\n * code the store can raise and the package cannot name is a hole, and the\n * real-door suite says so by name.\n */\nexport const STORE_REFUSAL_CODES = [\n  { code: \"02000\", raised_by: \"_checklist_instantiate,_entity_change_file,_org_admin_table_gate,_portal_config_judge,_portal_invite_payload,_read_record_with,_record_restore_one,_share_write_person,_table_share_invite_payload,checklist_declare,checklist_run,checklist_step_complete,checklist_step_refusal,checklist_template_shape,conversation_scope_bind,dashboard_delete,dashboard_restore,dashboard_run,doc_letterhead,doc_render_body,doc_render_delete,doc_render_document,doc_render_read,doc_render_restore,doc_sign,doc_signature_intact,doc_signature_read,doc_template_delete,doc_template_read,doc_template_restore,doc_template_save,enrich_pin,entity_back_links,entity_custom_value_apply,entity_field_protect_arman_explicitly_approved,entity_field_retire,entity_field_update,entity_record_read,entity_row_propose,entity_row_write,entity_value_write,external_history_event,external_rows,external_stub_upsert,external_writes_set,field_choice_usage,field_duplicate,field_restore,field_retype_preview,field_update_rehoming_choices,form_archive,form_response_update,form_restore,form_set_password,io_restore,migrate_delete,migrate_extract_parent,migrate_merge,migrate_reclass,migrate_rename,migrate_reparent,migrate_retype,migrate_split,migrate_undo,organization_clear,pick_list_update,portal_archive,portal_card,portal_declare,portal_form,portal_form_submit,portal_invite,portal_invite_accept,portal_preview,portal_principal_bind,portal_restore,portal_revoke,record_change_many,record_delete,record_restore_preview,record_row_controls,record_row_controls_set,record_table,record_update,record_write_graph_superseding,relation_halves_repair,relation_restore,relation_uncarry,rule_restore,set_table_confidential_arman_explicitly_approved,share_access,share_grant,share_lane_set,share_people,share_revoke,table_agent_writable_set,table_archive,table_archive_deliberately,table_restore,table_row_defaults,table_row_defaults_apply,table_row_defaults_set,table_row_label,table_row_label_set,table_share_outside_accept,table_share_outside_grant,table_share_outside_invite,table_share_outside_resend,table_share_outside_revoke,template_from_tables,visibility_as_of,work_approval_decide,work_approval_host_run,work_approval_host_run_done,work_approval_read,work_approval_request,work_assign,work_record_states,work_set_state\" },\n  { code: \"0A000\", raised_by: \"checklist_step_complete,entity_custom_value_apply,entity_row_write,external_rows,external_source_declare,external_write_through,promote_field,promoted_index_expr,promoted_query_sql,promoted_read,read_records_keyset,rule_eval,rule_filter_node_sql,template_restore,work_assign\" },\n  { code: \"22003\", raised_by: \"context_resolve\" },\n  { code: \"22004\", raised_by: \"_entity_change_file,_entity_custom_fields_guard,_io_outbox_claim,_org_admin_table_gate,_portal_config_judge,_record_restore_one,_share_write_person,_value_envelope,actor_word,agg_assert_key,agg_compare_windows,agg_sql,anon_capture,anon_token_issue,anon_write,assert_client_may_reach,assert_scope_door,base_copy_finish,base_move,booking_declare,capture_submit,checklist_declare,context_resolve,context_template_define,context_type_write,copy_table_extras,dashboard_block_normalize,dashboard_declare,dashboard_window_sql,doc_render_write,doc_sign,doc_signature_write,doc_template_save,enrich_land,enrich_normalize,entity_field_protect_arman_explicitly_approved,entity_row_propose,entity_row_write,external_history_event,external_rows,external_source_declare,external_stub_upsert,external_write_through,external_writes_set,field_history,form_declare,form_look_options,form_response_update,form_submit,home_add,inbox_snooze,io_comment_write,io_import_begin,io_infer_column,io_outbox_drain,io_outbox_release_claimed,io_outbox_subscribe,io_restore,migrate_choice_keys,migrate_purge,migrate_purge_hard,migrate_reclass,migrate_split,migrate_undo,organization_clear,organization_contents,pipeline_declare,pipeline_gate_preview,portal_declare,portal_form_submit,portal_invite,portal_principal_bind,provenance_retention_days,provenance_write,query_across_homes,query_by_coordinates,query_rollup,record_aggregate_as_of,record_delete,record_reparent,record_resolve,record_restore,record_update,record_upsert,record_write,record_write_graph,record_write_graph_superseding,record_write_many,relation_carry,relation_halves_repair,relation_own,row_template_declare,rule_declare,set_table_confidential_arman_explicitly_approved,share_grant,subscription_declare,table_agent_writable_set,table_archive,table_archive_deliberately,table_declare,table_duplicate,table_move,table_restore,table_share_outside_grant,table_share_outside_invite,template_declare,value_restore,view_declare,view_designate,view_look_read,view_look_set,whole_value_complete,work_approval_decide,work_approval_host_run,work_approval_request,work_template_declare\" },\n  { code: \"22007\", raised_by: \"_template_date,agg_parse_moment,dashboard_window_sql\" },\n  { code: \"22012\", raised_by: \"formula_eval,rule_eval,rule_sql_op\" },\n  { code: \"22023\", raised_by: \"_action_check,_automation_advance,_automation_cond_norm,_automation_step,_booking_availability,_ctx_reference_value_holds,_ctx_store_scope,_ctx_table_template_field_holds,_ctx_tree_part,_decorations_check,_entity_change_file,_entity_custom_fields_guard,_form_flow_judge,_form_look_judge,_fx_date,_fx_datetime_parse,_fx_dl,_fx_ext,_fx_listop,_fx_num,_fx_recprop,_fx_regex,_fx_unit,_fx_unit_norm,_fxp_level,_fxp_resolve,_fxp_tokens,_nfx_arglist,_nfx_bin,_nfx_call,_nfx_expr,_nfx_primary,_nfx_tokens,_nfx_unary,_portal_config_judge,_rule_eval_seated,_schedules_stand_down,_stamp_check,_table_dimensions_check,_take_op_id,_template_bind,_template_install_core,_value_envelope,_view_field_key,_view_key_value,_work_shape_guard,_write_via_mark,action_run,actor_word,agent_change_trust,agg_assert_key,agg_calendar,agg_compare_windows,agg_sql,anon_token_issue,archive_guard_decide,archive_hold_answer,automation_test,base_activity,base_move,booking_busy_set,booking_declare,booking_sms_consent,button_press,containment_parent,context_scope_archive,context_scope_write,context_scopes,context_template_define,context_type_archive,context_type_write,context_values,count_records_archived,dashboard_block_normalize,dashboard_run,dashboard_target_field_assert,dashboard_window_sql,data_home,data_home_changed_by,doc_render_body,doc_render_write,doc_signature_write,drill_resolve,enrich_data_source,enrich_declare,enrich_land,enrich_normalize,enrich_pin,entity_back_links,entity_custom_value_apply,entity_fields_across,entity_read_mask,entity_reference_rows,entity_reference_search,entity_reference_words,entity_row_write,entity_value_write,external_history_event,external_source_declare,external_stub_upsert,external_write_through,field_access,field_access_set,field_declare_many,field_duplicate,field_history,field_notify_on_assign,field_update,filter_list_op,find_duplicates,form_declare,form_draft_save,form_response_update,form_set_password,form_visit,formula_eval,formula_history,formula_parse,formula_preview,formula_translate_notion,grid_layout_check,hub_changed_by,hub_changed_by_many,inbound_domain,inbox_snooze,io_export,io_import_begin,io_import_finish,io_import_plan,io_import_report,io_proposal_accept,list_portals,listed_predicate_sql,member_records_take_over,migrate_merge,migrate_reclass,my_levels,my_levels_across,organization_clear,page_size,pick_list_create,pick_list_update,pin_agent_cells,pipeline_move,pipeline_move_many,portal_declare,portal_form_submit,provenance_write,publish_bind,query_by_coordinates,query_rollup,query_rollup_sum,read_records_archived,read_records_in_view_order,read_records_keyset,read_records_page,record_aggregate_as_of,record_change_many,record_drill,record_filter_sql,record_row_controls_set,record_search_sql,record_update,record_upsert,record_write_graph,record_write_graph_superseding,record_write_many,records_search,relation_carry,relation_names_match,relation_reverse_field,relation_reverse_set,relative_window_for_reader,relative_window_resolve,reverse_links_many_fields,row_template_declare,rule_eval,rule_filter_node_sql,rule_members,rule_members_visible,rule_sql_op,scope_table_provision,set_table_confidential,set_table_organization,share_grant,share_lane_set,subscription_declare,table_access_setup_set,table_archive_deliberately,table_copy_sync,table_create,table_ensure,table_find,table_find_many,table_from_example,table_move,table_row_defaults_set,table_row_label_set,table_rules,table_share_outside_grant,table_sync,table_sync_cell,table_sync_settings_set,table_template_declare,table_transfer_owner,table_webhook_declare,template_declare,template_from_tables,template_install_claim,template_install_note,template_upgrade,templates,view_declare,view_designate,view_keys_check,view_look_set,view_record_order_set,visibility_as_of,where_lists_live,where_tables_live,work_approval_host_run,work_approval_request,work_decide_many,work_inbox,work_list,work_slot_hold\" },\n  { code: \"23502\", raised_by: \"synced_source_save\" },\n  { code: \"23503\", raised_by: \"_action_check,_automation_advance,_automation_flip,_automation_step,_automation_time_item,_automation_view_rule,_booking_availability,_checklist_instantiate,_containment_guard,_ctx_store_value,_decorations_check,_display_spec_for,_field_document_for,_field_type_parity_guard,_form_flow_judge,_pipeline_stage_key,_record_rule_uses,action_declare,action_run,agg_digest_assemble,anon_publish,anon_rate_take,anon_token_issue,anon_write,assert_organization_wall,automation_declare,automation_revision_restore,automation_revisions,automation_runs,automation_test,automations,autonumber_backfill,booking_busy_set,booking_cancel,booking_confirm,booking_declare,booking_hold,booking_reschedule,booking_sms_consent,button_press,capture_publish,checklist_declare,checklist_steps_table,comment_write,dashboard_declare,delete_rule,doc_sign,doc_template_save,enrich_declare,enrich_due,enrich_land,field_make_automatic,field_notify_on_assign,field_update,form_declare,form_draft_save,form_response_update,form_results,form_submit,grid_layout,home_add,inbound_declare,inbound_mail_land,inbound_set,io_comment_write,io_import_begin,io_import_finish,io_import_report,io_import_rows,io_proposal_accept,migrate_demote,migrate_promote,migrate_purge_hard,pipeline_board,pipeline_declare,pipeline_move,pipeline_read,pipeline_transition_refusal,promote_field,promote_table,read_records_in_view_order,read_records_page,record_applicability,record_reparent,record_write_graph_superseding,relation_carry,relation_own,resolve_first_match,row_template_declare,rule_applies,rule_declare,rule_eval,rule_filter_node_sql,rule_members,rule_members_visible,rule_run,subscription_mute,subscription_preview,table_decorate,table_dimensions_set,table_from_example,table_webhook_archive,table_webhook_declare,view_declare,view_designate,view_look_set,view_record_order_set,whole_value_complete,work_set_state,work_take_assignment,work_template_instantiate\" },\n  { code: \"23505\", raised_by: \"_booking_seat_take,_ctx_store_item,_ctx_store_scope,_ctx_store_type,_portal_config_judge,_restore_guard_one,_share_write_person,_unique_rule_holds,doc_sign,doc_signature_write,entity_field_declare,field_declare,field_restore,field_update,form_restore,home_add,inbound_declare,io_proposal_accept,relation_carry,relation_own,relation_restore,table_share_outside_resend,work_approval_decide,work_slot_hold\" },\n  { code: \"23514\", raised_by: \"_checklist_instantiate,_checklist_step_guard,_containment_guard,_ctx_scope_parent_holds,_ctx_store_item,_ctx_table_template_field_holds,_ctx_value_fits_its_scope,_dated_values_guard,_derived_fields,_display_format_check,_display_spec_for,_entity_choice_keys,_entity_custom_fields_guard,_field_choices_save,_field_class_guard,_field_default_fitted,_field_document_for,_field_kind_shape_ok,_field_shape_guard,_field_type_parity_guard,_kind_value_ok,_merge_field_shape_guard,_merge_field_temporal_guard,_promoted_field_cap_guard,_record_restore_one,_record_rule_uses,_record_source_key_is_record,_relation_halves_agree,_relation_kernel_targets,_resolve_choice_words,_rule_shape_guard,_rule_topology_guard,_store_relation_edge_names_its_field,_table_columns_word_guard,_table_shape_guard,_undeclared_key_guard,_value_envelope,_with_display,_work_shape_guard,_workdoors_approval_guard,action_run,assert_columns_are_defined,assert_entity_is_organization_scoped,booking_declare,capture_publish,capture_sheet_declare,checklist_declare,checklist_step_complete,dashboard_restore,doc_sign,doc_signature_write,doc_template_restore,doc_template_save,entity_field_protect_arman_explicitly_approved,entity_field_retire,entity_field_update,entity_records_find,entity_table,entity_value_write,field_declare,field_make_automatic,field_restore,field_retire,field_update,field_update_rehoming_choices,form_restore,home_add,io_comment_write,io_import_rows,migrate_merge,migrate_purge_hard,portal_archive,portal_restore,record_reparent,record_update_adding_choices,record_upsert,record_write_graph,record_write_graph_superseding,relation_carry,relation_halves_repair,relation_own,relation_restore,rollup_value,row_template_declare,rule_restore,status_groups_keyed,status_groups_of,table_access_setup_set,table_from_example,table_restore,template_upgrade,validate_value_envelope,validate_values,whole_value_complete,work_set_state,work_slots_declare,work_take_assignment,work_template_instantiate\" },\n  { code: \"42501\", raised_by: \"_agent_change_gate,_computed_door_org,_context_copy_fence,_copy_evaluation_note,_copy_evaluation_reimage,_copy_in_progress_guard,_doc_render_immutable,_doc_signature_immutable,_entity_change_file,_entity_custom_fields_guard,_field_definition_write,_field_write_door,_io_outbox_server_only,_not_a_member_refusal,_org_admin_table_gate,_portal_config_judge,_portal_principal_here,_read_record_with,_rule_definition_write,_share_write_person,_stamp_token,_store_door,_table_dimensions_infer,_table_duplicate_step,_table_shape_guard,_template_bind,_template_call,_template_install_core,_value_envelope,_withdraw_approvals_for_batch,_workdoors_approval_guard,admin_all_tables,agent_change_trust,agent_table_claim,agg_fields_readable_assert,anon_capture,anon_inbound_land,anon_publish,anon_token_issue,anon_token_verify,anon_write,assert_client_may_change,assert_client_may_open,assert_may_know_table,assert_organization_admin,assert_scope_door,assert_store_door,automation_app_watch,automation_claim_pending,automation_note,automation_resume,automation_step_mark,automation_webhook_receive,base_copy_finish,base_move,base_move_access_kept,base_move_remove_access,booking_confirm,booking_declare,booking_hold,capture_submit,checklist_run,comment_write,computed_refresh,context_item_archive,context_item_restore,context_item_write,context_resolve,context_scope_archive,context_scope_restore,context_scope_write,context_tags_set,context_type_archive,context_type_restore,context_type_write,conversation_scope_bind,conversation_scope_unbind,copy_table_extras,count_records_archived,dashboard_target_field_assert,doc_sign,enrich_declare,enrich_due,enrich_land,enrich_normalize,entity_custom_value_apply,entity_field_declare,entity_field_retire,entity_field_update,entity_row_propose,entity_row_write,entity_value_write,external_write_through,field_access_set,field_restore,field_update,form_declare,form_draft_save,form_public_asks,form_response_update,form_set_password,form_submit,formula_history,inbound_mail_land,inbox_clear,inbox_snooze,inbox_unclear,inbox_unsnooze,io_comment_resolve,io_comment_write,io_import_begin,io_import_finish,io_restore,member_personal_tables,migrate_purge,migrate_purge_hard,migrate_purge_hard_request,migrate_reclass,my_levels,my_levels_across,organization_clear,organization_contents,pick_list_get,pick_list_update,portal_declare,portal_form,portal_form_submit,portal_invitation,portal_invite,portal_invite_accept,portal_principal_bind,portal_self_signup,promote_table,protected_matches,query_visibility_parity,read_record,read_records,read_records_archived,read_records_by_ids,read_records_keyset,read_records_matching,read_records_page,record_delete,record_follow_set,record_row_controls,record_table,record_write_graph,relation_halves_disagreements,relation_halves_repair,resolve_context,reverse_links_many,scope_table_provision,share_grant,share_lane_set,space_templates,subscription_mute,subscription_preview,table_access_setup_set,table_agent_writable_set,table_archive_deliberately,table_copies_in_progress,table_copy_sync,table_duplicate,table_duplicate_continue,table_kind_facts,table_level_facts,table_move,table_row_defaults_apply,table_row_defaults_set,table_row_label_set,table_share_outside_accept,table_share_outside_grant,table_share_outside_invite,table_share_outside_resend,table_sync,table_sync_cell,table_templates,table_transfer_owner,table_webhook_declare,template_declare,template_from_tables,template_instances,template_restore,template_upgrade,templates,view_declare,view_look_set,view_record_order_set,visibility_as_of,where_lists_live,where_tables_live,whole_value_complete,work_approval_decide,work_approval_host_run,work_approval_host_run_done,work_approval_read,work_approval_request,work_person\" },\n  { code: \"42703\", raised_by: \"entity_table,portal_declare\" },\n  { code: \"42883\", raised_by: \"_template_call\" },\n  { code: \"42P17\", raised_by: \"_field_reads_what_it_reads,far_value\" },\n  { code: \"53400\", raised_by: \"anon_rate_take,delete_cascade_closure,enrich_due,enrich_land,promote_field\" },\n  { code: \"54000\", raised_by: \"_table_dimensions_check,action_run,comment_counts,data_home_changed_by,form_draft_save,hub_changed_by,hub_changed_by_many,pipeline_move_many,read_records_page,record_change_many,record_headers,relation_names_match,reverse_links_many,table_copy_sync,table_decorate,table_from_example,table_map_fields,table_row_counts,table_sync,table_webhook_declare,view_record_order_set,work_decide_many\" },\n  { code: \"54001\", raised_by: \"record_delete\" },\n  { code: \"55000\", raised_by: \"_code_depends_refuse,_io_outbox_claim,_template_install_core,base_move,entity_field_protect_arman_explicitly_approved,inbox_clear,inbox_snooze,io_outbox_release,io_outbox_subscribe,table_duplicate,table_ensure,table_move,template_restore,template_upgrade,work_approval_decide,work_approval_host_run_done,work_approval_request\" },\n  { code: \"57014\", raised_by: \"formula_eval\" },\n  { code: \"MXD01\", raised_by: \"_held_change_refusal\" },\n  { code: \"MXD02\", raised_by: \"entity_row_propose\" },\n  { code: \"MXPV1\", raised_by: \"field_retype_preview\" },\n  { code: \"P0001\", raised_by: \"_guest_record_ceiling,action_run,context_scope_write\" },\n  { code: \"P0002\", raised_by: \"_template_install_core,inbox_clear,inbox_snooze,publish_bind,template_archive,template_install_claim,template_install_note,template_keep,template_restore,template_uninstall,template_upgrade,whole_value_complete\" },\n  { code: \"P0R01\", raised_by: \"template_upgrade\" },\n  { code: \"PT409\", raised_by: \"entity_row_write,has_visibility_at,record_change_many,record_update,record_upsert,record_write_graph_superseding,table_move,whole_value_complete\" },\n  { code: \"PT428\", raised_by: \"_record_rule_uses\" },\n] as const;\n\n/** `platform.entity_types` — the registered tokens a Table or relation may name. */\nexport const ENTITY_TOKENS = [\n  \"access_delta_probe\",\n  \"access_delta_run\",\n  \"access_request\",\n  \"access_shadow_log\",\n  \"access_version\",\n  \"access_version_event\",\n  \"account_addon\",\n  \"account_closure\",\n  \"account_facts\",\n  \"acquisition_block\",\n  \"activity\",\n  \"admin_audit_log\",\n  \"admin_email_log\",\n  \"admin_markdown_sample\",\n  \"admin_user\",\n  \"admin_user_owned_resources_cache\",\n  \"admission_config\",\n  \"agent\",\n  \"agent_card\",\n  \"agent_definition_version\",\n  \"agent_drift_alert\",\n  \"agent_exemplar\",\n  \"agent_mandate_note\",\n  \"agent_prompt_block\",\n  \"agent_prompt_block_variant\",\n  \"agent_prompt_remediation\",\n  \"agent_required_flag_change\",\n  \"agent_run\",\n  \"agent_run_stage\",\n  \"agent_schedule\",\n  \"agent_schedule_claim\",\n  \"agent_shortcut\",\n  \"agent_surface_binding\",\n  \"agent_template\",\n  \"agent_term_list\",\n  \"agent_test_result\",\n  \"agent_test_run\",\n  \"agent_usage\",\n  \"agent_user_kv\",\n  \"ai_api\",\n  \"ai_calls\",\n  \"ai_device_model_file\",\n  \"ai_device_model_root\",\n  \"ai_endpoint\",\n  \"ai_media_generation_cache\",\n  \"ai_model\",\n  \"ai_model_alias\",\n  \"ai_model_artifact\",\n  \"ai_model_candidate\",\n  \"ai_model_presentation\",\n  \"ai_model_upstream\",\n  \"ai_model_variant\",\n  \"ai_model_verification_run\",\n  \"ai_model_want\",\n  \"ai_offering\",\n  \"ai_person_model_want\",\n  \"ai_provider\",\n  \"ai_request_latency\",\n  \"ai_runtime\",\n  \"ai_runtime_build\",\n  \"ai_runtime_compat\",\n  \"ai_setting\",\n  \"ai_setting_profile\",\n  \"ai_translation_cell\",\n  \"ai_usage_execution_facts\",\n  \"ai_usage_executions\",\n  \"ai_usage_hourly\",\n  \"ai_usage_hourly_watermark\",\n  \"analysis_result\",\n  \"anon_form\",\n  \"anon_form_password\",\n  \"anon_form_visit\",\n  \"anon_function_birth_grandfather\",\n  \"anon_hit\",\n  \"anon_inbound\",\n  \"anon_replay\",\n  \"anon_submission\",\n  \"anon_token\",\n  \"api_field_warning\",\n  \"api_request_log\",\n  \"app\",\n  \"app_config\",\n  \"app_config_history\",\n  \"app_definition_version\",\n  \"app_error\",\n  \"app_execution\",\n  \"app_instance\",\n  \"app_log\",\n  \"app_log_hourly\",\n  \"app_log_hourly_watermark\",\n  \"app_log_lines\",\n  \"app_log_muted_pattern\",\n  \"app_log_norm_exception\",\n  \"app_log_requests_hourly\",\n  \"app_rate_limit\",\n  \"app_setting\",\n  \"app_sync_status\",\n  \"applet_visitor_binding\",\n  \"approach\",\n  \"artifact\",\n  \"assessment\",\n  \"assessment_item\",\n  \"assessment_result\",\n  \"assignment_session\",\n  \"assist\",\n  \"assist_producer_policy\",\n  \"assist_producer_policy_history\",\n  \"association_type\",\n  \"assurance_level\",\n  \"attempt\",\n  \"attention_audience_rule\",\n  \"attention_audit\",\n  \"attention_item_state\",\n  \"attention_showing\",\n  \"audit_broken_functions\",\n  \"audit_canonical_findings\",\n  \"audit_exemption\",\n  \"audit_function_deps\",\n  \"audit_function_runtime_probe\",\n  \"audit_m2m_candidates\",\n  \"audit_refresh_log\",\n  \"audit_stale_registry\",\n  \"audit_unregistered_candidates\",\n  \"automation_delivery\",\n  \"automation_fired\",\n  \"base_entity_template\",\n  \"batch_cost_event\",\n  \"batch_provider_batch\",\n  \"batch_work_item\",\n  \"billing_capability\",\n  \"billing_capability_limit\",\n  \"billing_ci_package_build\",\n  \"billing_connect_account\",\n  \"billing_coupon\",\n  \"billing_coupon_redemption\",\n  \"billing_customer\",\n  \"billing_external_call_vendor\",\n  \"billing_free_network_counter\",\n  \"billing_free_period_grant\",\n  \"billing_free_use_counter\",\n  \"billing_hard_cost_reconciliation\",\n  \"billing_held_run\",\n  \"billing_org_payment_account\",\n  \"billing_payment\",\n  \"billing_payment_ask\",\n  \"billing_plan\",\n  \"billing_plan_limit\",\n  \"billing_price\",\n  \"billing_product\",\n  \"billing_provider_balance_snapshot\",\n  \"billing_spend_alarm\",\n  \"billing_spend_alarm_occurrence\",\n  \"billing_spend_approval\",\n  \"billing_spend_guardrail\",\n  \"billing_spend_hold\",\n  \"billing_stripe_event\",\n  \"billing_subscription\",\n  \"billing_usage_ledger\",\n  \"billing_usage_reset\",\n  \"billing_user_plan\",\n  \"block_state\",\n  \"board\",\n  \"browser_account_binding\",\n  \"browser_action_event\",\n  \"browser_authenticator_window\",\n  \"browser_capture\",\n  \"browser_control_request\",\n  \"browser_handoff\",\n  \"browser_login_attempt\",\n  \"browser_login_recipe\",\n  \"browser_profile\",\n  \"browser_profile_checkpoint\",\n  \"browser_run\",\n  \"browser_site_observation\",\n  \"browser_site_policy\",\n  \"browser_stream_ticket\",\n  \"build_lock\",\n  \"calendar_event\",\n  \"campaign_watch_ramp_gate_run\",\n  \"campaign_watch_switch_outbox\",\n  \"campaign_watch_switch_window\",\n  \"canvas_comment\",\n  \"canvas_comment_like\",\n  \"canvas_item\",\n  \"canvas_item_state\",\n  \"canvas_like\",\n  \"canvas_score\",\n  \"canvas_view\",\n  \"capture_window\",\n  \"carrying_rule\",\n  \"catalog_entries_history\",\n  \"catalog_entry\",\n  \"category\",\n  \"change_item\",\n  \"change_job\",\n  \"change_job_row\",\n  \"change_plan\",\n  \"change_type_default\",\n  \"change_work\",\n  \"chat_user_usage_summary\",\n  \"citations\",\n  \"class_purchase\",\n  \"classifier_revision_ledger\",\n  \"client_callable_door\",\n  \"client_callable_door_retirement\",\n  \"client_excluded_column_unregistered\",\n  \"cmp_entry\",\n  \"cmp_feedback\",\n  \"code_file\",\n  \"code_folder\",\n  \"code_repository\",\n  \"coding_session\",\n  \"coding_session_entry\",\n  \"collab_checkpoint\",\n  \"collab_op\",\n  \"collab_room\",\n  \"comment\",\n  \"commerce_asset_allocation\",\n  \"commerce_asset_grading\",\n  \"commerce_asset_identifier\",\n  \"commerce_asset_lot_event\",\n  \"commerce_asset_mandate_result\",\n  \"commerce_asset_price_factor\",\n  \"commerce_asset_reshoot_request\",\n  \"commerce_asset_review\",\n  \"commerce_asset_unknown\",\n  \"commerce_certified_printer\",\n  \"commerce_cloud_sync_connection\",\n  \"commerce_ebay_business_policy\",\n  \"commerce_ebay_category\",\n  \"commerce_ebay_category_aspect\",\n  \"commerce_ebay_category_tree\",\n  \"commerce_ebay_custom_policy\",\n  \"commerce_ebay_inventory_item\",\n  \"commerce_ebay_inventory_item_group\",\n  \"commerce_ebay_inventory_item_group_member\",\n  \"commerce_ebay_inventory_location\",\n  \"commerce_ebay_listing\",\n  \"commerce_ebay_marketplace_policy\",\n  \"commerce_ebay_media_asset\",\n  \"commerce_ebay_notification_destination\",\n  \"commerce_ebay_notification_event\",\n  \"commerce_ebay_notification_subscription\",\n  \"commerce_ebay_notification_topic\",\n  \"commerce_ebay_offer\",\n  \"commerce_ebay_order\",\n  \"commerce_ebay_order_line_item\",\n  \"commerce_ebay_shipping_fulfillment\",\n  \"commerce_ebay_store_category\",\n  \"commerce_human_correction\",\n  \"commerce_intake_artifact\",\n  \"commerce_intake_asset\",\n  \"commerce_intake_batch\",\n  \"commerce_label_batch\",\n  \"commerce_label_code\",\n  \"commerce_marketplace_account\",\n  \"commerce_marketplace_account_deletion_audit\",\n  \"commerce_marketplace_api_call\",\n  \"commerce_marketplace_rate_budget\",\n  \"commerce_marketplace_site\",\n  \"commerce_marketplace_sync_run\",\n  \"commerce_prediction_outcome\",\n  \"commerce_print_order\",\n  \"commerce_product\",\n  \"commerce_product_channel_ref\",\n  \"commerce_product_media\",\n  \"commerce_product_variant\",\n  \"commerce_recall_audit\",\n  \"communication_calendar_selected_snapshot_state\",\n  \"communication_channel_readiness\",\n  \"comparison_set\",\n  \"component_group\",\n  \"computed_org_mark\",\n  \"computed_reader_cols\",\n  \"computed_reader_judgement\",\n  \"config_manifest\",\n  \"config_read_bucket\",\n  \"contact_medium\",\n  \"contact_submission\",\n  \"content_certification\",\n  \"content_ir_converter_definition\",\n  \"content_ir_converter_run\",\n  \"content_ir_kind\",\n  \"content_ir_kind_component\",\n  \"content_ir_kind_component_incident\",\n  \"content_ir_kind_component_layer\",\n  \"content_ir_kind_conformance\",\n  \"content_ir_kind_edge\",\n  \"content_ir_kind_example\",\n  \"content_ir_kind_instance\",\n  \"content_ir_kind_surface\",\n  \"content_ir_render_inspection\",\n  \"content_lane\",\n  \"context_access_log\",\n  \"context_item\",\n  \"context_item_suggestion\",\n  \"context_item_value\",\n  \"context_value_refs\",\n  \"conversation\",\n  \"conversation_value\",\n  \"courts\",\n  \"credential_attachment\",\n  \"credential_item\",\n  \"credential_mutation_receipt\",\n  \"crm_address\",\n  \"crm_affiliation\",\n  \"crm_blocklist_entry\",\n  \"crm_contact_candidate\",\n  \"crm_deal\",\n  \"crm_deal_stage_event\",\n  \"crm_enrichment_call\",\n  \"crm_interaction\",\n  \"crm_merge_candidate\",\n  \"crm_outreach_list\",\n  \"crm_outreach_list_member\",\n  \"crm_party_merge\",\n  \"crm_party_research\",\n  \"crm_registry_ingest_run\",\n  \"crm_registry_source\",\n  \"crm_sending_claim\",\n  \"crm_sending_event\",\n  \"crm_sending_identity\",\n  \"crm_sending_identity_check\",\n  \"crm_sending_policy\",\n  \"custom_agent_table_origin\",\n  \"custom_agent_table_trust\",\n  \"custom_agg_digest_checked\",\n  \"custom_anon_form_draft\",\n  \"custom_base\",\n  \"custom_base_snapshot\",\n  \"custom_entity_definition\",\n  \"custom_field_definition\",\n  \"custom_field_target\",\n  \"custom_inbox_item_state\",\n  \"custom_io_outbox_consumer\",\n  \"custom_io_outbox_consumption\",\n  \"custom_portal\",\n  \"custom_portal_principal\",\n  \"custom_portal_table\",\n  \"custom_record\",\n  \"custom_share_tails_mine_repair\",\n  \"custom_synced_source\",\n  \"custom_template\",\n  \"custom_template_install\",\n  \"custom_whole_value_parked\",\n  \"cx_agent_memory\",\n  \"cx_agent_plan\",\n  \"cx_agent_task\",\n  \"cx_code_edit\",\n  \"cx_code_message_file\",\n  \"cx_conversation_documents\",\n  \"cx_media\",\n  \"cx_observational_memory\",\n  \"cx_observational_memory_event\",\n  \"cx_pending_injection\",\n  \"cx_request\",\n  \"cx_request_snapshot\",\n  \"cx_request_values\",\n  \"cx_tool_trace\",\n  \"cx_user_request\",\n  \"cx_user_todo\",\n  \"dashboard_saved_view\",\n  \"data_rights_event\",\n  \"data_store\",\n  \"data_store_members\",\n  \"dataset\",\n  \"ddl_guard_log\",\n  \"deck_suggestion\",\n  \"definer_class_exemption\",\n  \"definer_client_grant_grandfather\",\n  \"definer_grant_baseline\",\n  \"deprecated_relation\",\n  \"derive_run\",\n  \"desktop_app_account\",\n  \"desktop_app_instance\",\n  \"desktop_app_profile\",\n  \"dev_login_audit\",\n  \"device_handoff\",\n  \"dict_entry\",\n  \"dict_provider_publication\",\n  \"dict_setting\",\n  \"dm_conversation\",\n  \"dm_message\",\n  \"dm_participant\",\n  \"dm_session_member\",\n  \"doc_render\",\n  \"doc_signature\",\n  \"dockets\",\n  \"document\",\n  \"document_version\",\n  \"domain_classification\",\n  \"edge_payload_kind\",\n  \"egress_device\",\n  \"egress_pairing\",\n  \"egress_ticket\",\n  \"emails\",\n  \"embedding_cache\",\n  \"embeddings_google_gemini_2_1536\",\n  \"embeddings_oai_3_small_1536\",\n  \"embeddings_voyage_4_large_1024\",\n  \"embeddings_voyage_code_3_1024\",\n  \"endpoint_family_sweep_state\",\n  \"engine_owner_task\",\n  \"entity_grant\",\n  \"entity_protected_value\",\n  \"entity_protected_value_version\",\n  \"entity_relationship\",\n  \"entity_type\",\n  \"esign_campaign\",\n  \"esign_campaign_member\",\n  \"esign_consent_disclosure\",\n  \"esign_envelope\",\n  \"esign_envelope_certificate\",\n  \"esign_envelope_document\",\n  \"esign_envelope_draft\",\n  \"esign_envelope_event\",\n  \"esign_envelope_external_ref\",\n  \"esign_envelope_signer\",\n  \"esign_provider\",\n  \"esign_provider_binding\",\n  \"esign_saved_signature\",\n  \"esign_signing_key\",\n  \"esign_template\",\n  \"execution_event_cursor\",\n  \"extension_auth_code\",\n  \"external_api_reservation\",\n  \"external_conversation\",\n  \"external_delivery_event\",\n  \"external_inbox\",\n  \"external_link\",\n  \"external_message\",\n  \"external_provider_receipt\",\n  \"external_source\",\n  \"extract_sweep_state\",\n  \"fc_card\",\n  \"fc_detail\",\n  \"fc_set\",\n  \"feature_doc\",\n  \"feature_knob\",\n  \"feedback_comments\",\n  \"feedback_user_messages\",\n  \"field_component\",\n  \"file\",\n  \"file_analysis\",\n  \"file_entities\",\n  \"file_overrides\",\n  \"file_page_annotations\",\n  \"file_pages\",\n  \"file_rag_job\",\n  \"file_template\",\n  \"file_version\",\n  \"files_account_tier\",\n  \"files_machine_written_prefix\",\n  \"files_sync_mapping\",\n  \"files_user_account\",\n  \"flashcard_data\",\n  \"flashcard_history\",\n  \"flashcard_sets\",\n  \"flexible_data\",\n  \"folder\",\n  \"function_contract\",\n  \"game_badge\",\n  \"game_result\",\n  \"game_room\",\n  \"global_execution\",\n  \"global_execution_checkpoint\",\n  \"global_execution_control\",\n  \"global_execution_event\",\n  \"global_meter_entry\",\n  \"global_origin\",\n  \"global_request\",\n  \"google_document\",\n  \"growth_loop_event\",\n  \"growth_loop_run\",\n  \"growth_loop_stage_run\",\n  \"guardian_link\",\n  \"guest_conversion_audit\",\n  \"guest_execution_log\",\n  \"guest_executions\",\n  \"guided_checklist_run\",\n  \"heatmap_save\",\n  \"hindsight_enrollment\",\n  \"hindsight_finding\",\n  \"hindsight_regression_case\",\n  \"hindsight_replay\",\n  \"hindsight_replay_step\",\n  \"hindsight_review\",\n  \"hr_access_audit\",\n  \"hr_access_role\",\n  \"hr_accommodation_request\",\n  \"hr_ai_evidence\",\n  \"hr_alert_routing_rule\",\n  \"hr_application\",\n  \"hr_approval_authority\",\n  \"hr_approval_delegation\",\n  \"hr_asset\",\n  \"hr_asset_assignment\",\n  \"hr_attendance_exception\",\n  \"hr_auto_close_rule\",\n  \"hr_availability\",\n  \"hr_background_check\",\n  \"hr_benefits_event\",\n  \"hr_calculation_snapshot\",\n  \"hr_candidate\",\n  \"hr_candidate_conversion\",\n  \"hr_candidate_message\",\n  \"hr_careers_portal\",\n  \"hr_checklist_item\",\n  \"hr_checklist_run\",\n  \"hr_checklist_template\",\n  \"hr_checklist_template_item\",\n  \"hr_compensation\",\n  \"hr_corrective_action\",\n  \"hr_course\",\n  \"hr_course_version\",\n  \"hr_credential\",\n  \"hr_crew\",\n  \"hr_deduction_code\",\n  \"hr_department\",\n  \"hr_derived_grant\",\n  \"hr_disposition_event\",\n  \"hr_earning_code\",\n  \"hr_eeo_response\",\n  \"hr_emergency_contact\",\n  \"hr_employee\",\n  \"hr_employee_private\",\n  \"hr_employer_profile\",\n  \"hr_employment\",\n  \"hr_employment_pin\",\n  \"hr_engagement\",\n  \"hr_establishment\",\n  \"hr_external_identity\",\n  \"hr_field_policy\",\n  \"hr_goal\",\n  \"hr_holiday\",\n  \"hr_holiday_calendar\",\n  \"hr_i9\",\n  \"hr_i9_document\",\n  \"hr_incident\",\n  \"hr_incident_party\",\n  \"hr_interview\",\n  \"hr_interview_kit\",\n  \"hr_job_title\",\n  \"hr_jurisdiction\",\n  \"hr_jurisdiction_rule\",\n  \"hr_jurisdiction_rule_class\",\n  \"hr_jurisdiction_rule_org_decision\",\n  \"hr_jurisdiction_rule_test\",\n  \"hr_kiosk_device\",\n  \"hr_kiosk_session\",\n  \"hr_labor_target\",\n  \"hr_leave_case\",\n  \"hr_leave_enrollment\",\n  \"hr_leave_ledger\",\n  \"hr_leave_policy\",\n  \"hr_leave_request\",\n  \"hr_legal_hold\",\n  \"hr_legal_hold_item\",\n  \"hr_location\",\n  \"hr_new_hire_report\",\n  \"hr_offer\",\n  \"hr_opening\",\n  \"hr_overtime_alert\",\n  \"hr_overtime_alert_rule\",\n  \"hr_overtime_preapproval\",\n  \"hr_pay_group\",\n  \"hr_pay_period\",\n  \"hr_pay_period_employment\",\n  \"hr_payroll_export\",\n  \"hr_payroll_export_line\",\n  \"hr_position_assignment\",\n  \"hr_posting\",\n  \"hr_posting_publication\",\n  \"hr_provider_binding\",\n  \"hr_provider_event\",\n  \"hr_provisioning_result\",\n  \"hr_punch\",\n  \"hr_recalculation_batch\",\n  \"hr_record_class\",\n  \"hr_records_request\",\n  \"hr_reference_check\",\n  \"hr_reporting_line\",\n  \"hr_requisition\",\n  \"hr_restricted_note\",\n  \"hr_retention_rule\",\n  \"hr_review\",\n  \"hr_review_cycle\",\n  \"hr_review_peer_nomination\",\n  \"hr_review_response\",\n  \"hr_review_template\",\n  \"hr_role_assignment\",\n  \"hr_schedule\",\n  \"hr_schedule_change\",\n  \"hr_schedule_guidance\",\n  \"hr_schedule_template\",\n  \"hr_schedule_template_shift\",\n  \"hr_scorecard\",\n  \"hr_separation\",\n  \"hr_shift\",\n  \"hr_shift_claim\",\n  \"hr_staffing_requirement\",\n  \"hr_survey\",\n  \"hr_survey_invitation\",\n  \"hr_survey_question\",\n  \"hr_survey_response\",\n  \"hr_tax_registration\",\n  \"hr_tax_withholding\",\n  \"hr_time_adjustment\",\n  \"hr_training_assignment\",\n  \"hr_training_attempt\",\n  \"hr_transcript_entry\",\n  \"hr_verification_letter_request\",\n  \"hr_work_interval\",\n  \"hr_workflow_binding\",\n  \"hr_workflow_decision\",\n  \"hr_workflow_definition\",\n  \"hr_workflow_event\",\n  \"hr_workflow_failure\",\n  \"hr_workflow_flow_type\",\n  \"hr_workflow_instance\",\n  \"hr_workflow_step\",\n  \"hr_workflow_step_definition\",\n  \"hr_workweek\",\n  \"html_extraction\",\n  \"iam_access_audit\",\n  \"iam_access_setup\",\n  \"iam_api_key\",\n  \"iam_emergency_door_request\",\n  \"iam_oauth_app\",\n  \"iam_org_availability_key\",\n  \"iam_org_domain\",\n  \"iam_org_domain_route\",\n  \"iam_publish_binding\",\n  \"iam_publisher_verification\",\n  \"iam_read_lane_v2_rollout\",\n  \"iam_record_seat_change\",\n  \"iam_sign_in_event\",\n  \"iam_world_namespace\",\n  \"iam_world_publish_admission\",\n  \"idempotency\",\n  \"industry\",\n  \"industry_curator\",\n  \"infra_status\",\n  \"ingest_runs\",\n  \"integration_connection\",\n  \"integration_connection_resource\",\n  \"interview_decision_interview\",\n  \"interview_decision_question\",\n  \"interview_document_revision\",\n  \"interview_hole\",\n  \"interview_question\",\n  \"interview_session\",\n  \"interview_turn\",\n  \"invitation\",\n  \"invitation_code\",\n  \"invitation_request\",\n  \"io_comment\",\n  \"io_contract\",\n  \"io_import\",\n  \"io_outbox\",\n  \"item\",\n  \"item_mastery\",\n  \"judge_verdict\",\n  \"jurisdiction_policy\",\n  \"keyword_classification_queue\",\n  \"kg_alert\",\n  \"kg_chunk_entities\",\n  \"kg_chunks\",\n  \"kg_clusters\",\n  \"kg_edges\",\n  \"kg_entities\",\n  \"kg_entity_aliases\",\n  \"kg_suggestion_ack\",\n  \"kg_sweep_queue\",\n  \"kg_sweep_run\",\n  \"kg_sweep_state\",\n  \"kg_value_match\",\n  \"knob_override\",\n  \"knob_override_audit\",\n  \"knob_rung_lock\",\n  \"knob_scope_kind\",\n  \"knob_write_door\",\n  \"league_membership\",\n  \"learn_doc\",\n  \"library_doc\",\n  \"lifecycle_archive\",\n  \"lifecycle_archive_row\",\n  \"lifecycle_audit\",\n  \"lifecycle_entity_plan\",\n  \"lifecycle_map_build\",\n  \"lifecycle_reference_map\",\n  \"lifecycle_run\",\n  \"lifecycle_tier_ledger\",\n  \"location\",\n  \"mandate\",\n  \"mandate_advance_batch_row\",\n  \"mandate_binding\",\n  \"mandate_candidate\",\n  \"mandate_candidate_run\",\n  \"mandate_candidate_run_payload\",\n  \"mandate_goal_clauses\",\n  \"mandate_observation\",\n  \"mandate_proposal\",\n  \"mandate_readiness_verdict\",\n  \"mandate_reference\",\n  \"mandate_scan\",\n  \"mandate_treatment\",\n  \"marketing_initiative\",\n  \"masterwork_corpus_item\",\n  \"masterwork_run\",\n  \"masterwork_run_kind\",\n  \"masterwork_source\",\n  \"math_course_structure\",\n  \"math_problem\",\n  \"matrx_action_ledger\",\n  \"mcp_config\",\n  \"mcp_server\",\n  \"mcp_user_conn\",\n  \"media_capture_handoff\",\n  \"media_catalog_setting\",\n  \"media_library_item\",\n  \"media_selection_item\",\n  \"media_selection_job\",\n  \"media_source_library\",\n  \"meet_call_invite\",\n  \"meet_chat_message\",\n  \"meet_connection\",\n  \"meet_invitee\",\n  \"meet_meeting\",\n  \"meet_note\",\n  \"meet_occurrence_override\",\n  \"meet_participant\",\n  \"meet_recording\",\n  \"meet_session\",\n  \"meet_transcript_segment\",\n  \"membership\",\n  \"membership_grant\",\n  \"memory_trial\",\n  \"memory_trial_step\",\n  \"merge_field_provenance\",\n  \"message\",\n  \"message_template\",\n  \"message_template_detail\",\n  \"meta_excluded_schema\",\n  \"meta_table_stats_history\",\n  \"metadata_reserved_keys\",\n  \"microservice_project\",\n  \"migration_log\",\n  \"mtx_media_heal_queue\",\n  \"mtx_public_url_guard\",\n  \"ner_shadow\",\n  \"note\",\n  \"note_folder\",\n  \"notification\",\n  \"notification_channel_preference\",\n  \"notification_event_override\",\n  \"notification_event_type\",\n  \"notification_preference\",\n  \"notification_submission\",\n  \"notify_outsider_door_baseline\",\n  \"oauth_handoff_claim\",\n  \"opinion_clusters\",\n  \"opinions\",\n  \"ops_auth_lock_watchdog_log\",\n  \"ops_check_item\",\n  \"ops_check_run\",\n  \"ops_db_host_sample\",\n  \"ops_issue_class\",\n  \"ops_issue_event\",\n  \"ops_perf_client_event\",\n  \"ops_perf_sample\",\n  \"ops_perf_statement_snapshot\",\n  \"ops_proof_check\",\n  \"ops_proof_run\",\n  \"ops_proof_scenario\",\n  \"ops_source_read_cache\",\n  \"ops_test_replay_cache\",\n  \"org_admin_audit\",\n  \"org_change_policy\",\n  \"org_chart_publication\",\n  \"org_context_ledger\",\n  \"org_industries\",\n  \"org_member_control\",\n  \"org_module_config\",\n  \"org_move_txn\",\n  \"org_plan\",\n  \"org_sweep_list\",\n  \"organization\",\n  \"organization_preferences\",\n  \"organization_visibility_version\",\n  \"output_feedback\",\n  \"outreach_acceptance\",\n  \"page_extraction_job\",\n  \"page_extraction_page_run\",\n  \"page_extraction_results\",\n  \"page_extraction_runs\",\n  \"page_intent_queue\",\n  \"page_mapping_queue\",\n  \"page_vitals\",\n  \"part_config\",\n  \"part_config_sub\",\n  \"party\",\n  \"party_contact_point\",\n  \"passkey_credential\",\n  \"pb_claim_appeals_fd31de\",\n  \"pb_insurance_claims_fd31de\",\n  \"pc_article\",\n  \"pc_episode\",\n  \"pc_show\",\n  \"pc_studio_run\",\n  \"pc_studio_run_asset\",\n  \"pdf_consolidation_log\",\n  \"pdf_redaction_audit\",\n  \"pdf_redaction_key_escrow\",\n  \"permission_grant\",\n  \"personal_data_column\",\n  \"plan_cms_fill_item\",\n  \"plan_cms_fill_job\",\n  \"plan_entity\",\n  \"plan_node\",\n  \"plan_node_artifact\",\n  \"plan_node_step\",\n  \"plan_profile\",\n  \"platform_action_request\",\n  \"platform_actor_session\",\n  \"platform_actor_token\",\n  \"platform_actor_token_event\",\n  \"platform_class_approval_by_arman\",\n  \"platform_class_approval_by_org_admin\",\n  \"platform_continued_access\",\n  \"platform_cutover_census_run\",\n  \"platform_cutover_evaluation_replaced\",\n  \"platform_cutover_evaluation_write\",\n  \"platform_cutover_seam\",\n  \"platform_cutover_seam_measure\",\n  \"platform_cutover_seam_press\",\n  \"platform_dated_change\",\n  \"platform_doors_only_pending_cutover\",\n  \"platform_google_calendar_event_create_intent\",\n  \"platform_google_task_create_intent\",\n  \"platform_hidden_item\",\n  \"platform_kernel_fingerprint_record\",\n  \"platform_org_knob_override\",\n  \"platform_outcome_event\",\n  \"platform_outsider_consumer\",\n  \"platform_provision_base_contract_pending\",\n  \"platform_reachability\",\n  \"platform_reachability_rebuild_pending\",\n  \"platform_realtime_topic_prefix\",\n  \"platform_reference_category\",\n  \"platform_reference_declaration\",\n  \"platform_repo\",\n  \"platform_saved_view\",\n  \"platform_schema\",\n  \"platform_secure_delivery\",\n  \"platform_share_link\",\n  \"platform_strict_class_probe\",\n  \"platform_user_knob_override\",\n  \"podcast_race\",\n  \"position\",\n  \"presentation\",\n  \"processed_document\",\n  \"processed_document_page\",\n  \"product_capture_file\",\n  \"product_capture_item\",\n  \"product_capture_payload\",\n  \"product_capture_product\",\n  \"product_capture_question\",\n  \"profile\",\n  \"project\",\n  \"prompt\",\n  \"provider_account\",\n  \"provider_account_credential\",\n  \"provision\",\n  \"provision_generate_target\",\n  \"provision_grant\",\n  \"provision_marker\",\n  \"provision_rule_message\",\n  \"provision_schema\",\n  \"provision_shape_debt\",\n  \"provision_snapshot\",\n  \"provision_spec\",\n  \"provision_spec_grandfather\",\n  \"provision_vocabulary\",\n  \"provlock_recall_visits_all8u5\",\n  \"public_compat_wrapper\",\n  \"public_placement_baseline\",\n  \"public_placement_census\",\n  \"public_placement_domain\",\n  \"public_restore_permit\",\n  \"purpose\",\n  \"quiz_session\",\n  \"rag_ingest_run\",\n  \"rag_library_audit_log\",\n  \"rate_limit_buckets\",\n  \"reachability_pending\",\n  \"read_mask_kept\",\n  \"recompute_queue\",\n  \"record\",\n  \"record_alias\",\n  \"record_computed\",\n  \"record_follow\",\n  \"redaction_mapping\",\n  \"relationship_rule\",\n  \"research_analysis\",\n  \"research_content\",\n  \"research_context_bundle\",\n  \"research_document\",\n  \"research_intent\",\n  \"research_keyword\",\n  \"research_media\",\n  \"research_source\",\n  \"research_synthesis\",\n  \"research_tag\",\n  \"research_template\",\n  \"research_topic\",\n  \"retention_policy\",\n  \"retrieval_audit\",\n  \"review_queue\",\n  \"route_manifest_entry\",\n  \"row_version\",\n  \"rulebook\",\n  \"run_approval\",\n  \"run_approval_event\",\n  \"runtime_operation_stream\",\n  \"runtime_operation_stream_batch\",\n  \"sandbox_instance\",\n  \"sch_agent_task\",\n  \"sch_run\",\n  \"sch_task\",\n  \"sch_trigger\",\n  \"scheduler_automation_run_subject\",\n  \"schema_client_exposure\",\n  \"schema_migration_ledger\",\n  \"schema_migration_legacy\",\n  \"schema_migration_slot_grandfather\",\n  \"schema_templates\",\n  \"scope\",\n  \"scope_association_suggestion\",\n  \"scope_dataset_instance\",\n  \"scope_door_registry\",\n  \"scope_item_value_suggestion\",\n  \"scope_suggestion\",\n  \"scope_type\",\n  \"scrape_domain\",\n  \"scrape_domain_settings\",\n  \"scrape_failure_log\",\n  \"scrape_parsed_page\",\n  \"scrape_path_override\",\n  \"scrape_path_pattern\",\n  \"scrape_retry_queue\",\n  \"scraper_comparison_run\",\n  \"scraper_data_fetch_job\",\n  \"scraper_data_fetch_job_row\",\n  \"scraper_data_source\",\n  \"search_item\",\n  \"seo_ai_capability\",\n  \"seo_ai_visibility_brand_check\",\n  \"seo_ai_visibility_citation\",\n  \"seo_ai_visibility_claim\",\n  \"seo_ai_visibility_design_artifact\",\n  \"seo_ai_visibility_panel\",\n  \"seo_ai_visibility_panel_version\",\n  \"seo_ai_visibility_response\",\n  \"seo_ai_visibility_signal\",\n  \"seo_backlink\",\n  \"seo_backlink_change_event\",\n  \"seo_backlink_dimension_snapshot\",\n  \"seo_backlink_observation\",\n  \"seo_backlink_snapshot\",\n  \"seo_change_assessment\",\n  \"seo_change_event\",\n  \"seo_change_item\",\n  \"seo_change_metric\",\n  \"seo_change_set\",\n  \"seo_change_theory\",\n  \"seo_collection_run\",\n  \"seo_competitor\",\n  \"seo_competitor_observation\",\n  \"seo_competitor_opportunity\",\n  \"seo_coverage_mention\",\n  \"seo_coverage_tracker\",\n  \"seo_dimension_value_matcher\",\n  \"seo_engine_schedule\",\n  \"seo_geo_place\",\n  \"seo_gsc_dig_rule\",\n  \"seo_keyword\",\n  \"seo_keyword_class_rule\",\n  \"seo_keyword_edge\",\n  \"seo_keyword_facet\",\n  \"seo_keyword_market\",\n  \"seo_keyword_market_observation\",\n  \"seo_keyword_place\",\n  \"seo_keyword_saved_view\",\n  \"seo_keyword_topic\",\n  \"seo_landscape_brief\",\n  \"seo_link_gap_domain\",\n  \"seo_link_gap_match\",\n  \"seo_map_facet\",\n  \"seo_map_facet_value\",\n  \"seo_map_topic\",\n  \"seo_page_measurement_health\",\n  \"seo_page_performance\",\n  \"seo_pr_moment\",\n  \"seo_provider_call\",\n  \"seo_provider_task\",\n  \"seo_rank_observation\",\n  \"seo_rank_target\",\n  \"seo_raw_payload\",\n  \"seo_referring_domain_profile\",\n  \"seo_reputation_case\",\n  \"seo_search_performance_daily\",\n  \"seo_serp_mention\",\n  \"seo_serp_opportunity\",\n  \"seo_serp_result\",\n  \"seo_serp_snapshot\",\n  \"seo_site_geo_area\",\n  \"seo_site_keyword_offering\",\n  \"seo_site_keyword_value\",\n  \"seo_site_offering_value\",\n  \"seo_site_topic_value\",\n  \"seo_site_value_combo\",\n  \"seo_site_value_worth\",\n  \"seo_site_vocabulary\",\n  \"seo_source_request\",\n  \"seo_starter_pack\",\n  \"seo_starter_pack_item\",\n  \"seo_story_angle\",\n  \"seo_topic\",\n  \"seo_topical_map\",\n  \"seo_tracker_story\",\n  \"seo_web_analytics_daily\",\n  \"share_link\",\n  \"share_link_password\",\n  \"shareable_resource_registry\",\n  \"shared_canvas_item\",\n  \"short_link\",\n  \"shortcut_category\",\n  \"sign_in_fk_legacy\",\n  \"skill\",\n  \"skill_category\",\n  \"skill_detail\",\n  \"skill_render_definition\",\n  \"sms_consent\",\n  \"sms_conversation\",\n  \"sms_message\",\n  \"sms_message_media\",\n  \"sms_notification\",\n  \"sms_notification_preference\",\n  \"sms_phone_number\",\n  \"sms_rate_limits\",\n  \"sms_webhook_logs\",\n  \"social_account_insight_daily\",\n  \"social_ad\",\n  \"social_captured_post\",\n  \"social_kpi_goal\",\n  \"social_own_post_metric\",\n  \"social_post\",\n  \"social_post_analysis\",\n  \"social_post_comment\",\n  \"social_post_metric_snapshot\",\n  \"social_post_stat\",\n  \"social_post_transcript\",\n  \"social_profile\",\n  \"social_profile_snapshot\",\n  \"social_remix_output\",\n  \"social_swipe_collection\",\n  \"social_tracked_account\",\n  \"social_video_composition_version\",\n  \"social_video_project\",\n  \"social_video_variant\",\n  \"social_watchlist_hit\",\n  \"soft_delete_cascade_job\",\n  \"soft_delete_edge\",\n  \"source_authority\",\n  \"space_payload\",\n  \"stage_ref_kind\",\n  \"stamped_write_table\",\n  \"structure\",\n  \"structured_list\",\n  \"studio_cleaned_segments\",\n  \"studio_concept_items\",\n  \"studio_documents\",\n  \"studio_module_segments\",\n  \"studio_raw_segments\",\n  \"studio_recording_chunks\",\n  \"studio_recording_segments\",\n  \"studio_run\",\n  \"studio_session\",\n  \"studio_session_settings\",\n  \"study_attempt\",\n  \"study_goal\",\n  \"study_media\",\n  \"study_plan\",\n  \"study_plan_block\",\n  \"study_plan_day\",\n  \"study_reminder_context\",\n  \"study_reminder_delivery\",\n  \"study_session\",\n  \"study_source_chunk\",\n  \"study_streak\",\n  \"study_structured_section\",\n  \"superseded_policy\",\n  \"support_session\",\n  \"support_session_event\",\n  \"surface\",\n  \"system_announcement\",\n  \"system_context_item\",\n  \"system_context_item_org_value\",\n  \"system_error\",\n  \"system_orgs\",\n  \"system_write_failure\",\n  \"t13_backfill_ledger\",\n  \"t13_default_ledger\",\n  \"t13_row_column_events\",\n  \"tag\",\n  \"task\",\n  \"task_user_state\",\n  \"taxonomy_node\",\n  \"team\",\n  \"template_context_items\",\n  \"template_scope_types\",\n  \"templates\",\n  \"test_handset_inbox\",\n  \"test_handset_verification\",\n  \"thread\",\n  \"tool\",\n  \"tool_battle\",\n  \"tool_battle_cell\",\n  \"tool_binding\",\n  \"tool_bundle\",\n  \"tool_call\",\n  \"tool_call_facts\",\n  \"tool_canary_run\",\n  \"tool_catalog_cache\",\n  \"tool_catalog_call\",\n  \"tool_catalog_call_attempt\",\n  \"tool_catalog_call_detail\",\n  \"tool_catalog_endpoint\",\n  \"tool_catalog_entry\",\n  \"tool_catalog_provider\",\n  \"tool_definition_version\",\n  \"tool_executor\",\n  \"tool_feature_scorecard\",\n  \"tool_surface_defaults\",\n  \"tool_test_sample\",\n  \"tool_ui\",\n  \"tool_ui_incident\",\n  \"tool_ui_version\",\n  \"topic_placement_queue\",\n  \"transcript\",\n  \"trigger_event\",\n  \"udt_dataset_fields\",\n  \"udt_dataset_row_versions\",\n  \"udt_dataset_rows\",\n  \"udt_dataset_template\",\n  \"udt_dataset_template_fields\",\n  \"udt_document\",\n  \"udt_document_snapshot\",\n  \"udt_structured_list_items\",\n  \"udt_workbook_snapshot\",\n  \"ui_client\",\n  \"ui_decision_pick\",\n  \"ui_surface_action\",\n  \"ui_surface_agent_pref\",\n  \"ui_surface_agent_role\",\n  \"ui_surface_client_tool\",\n  \"ui_surface_config\",\n  \"ui_surface_item_type\",\n  \"ui_surface_value\",\n  \"ui_surface_write_target\",\n  \"univer_payload\",\n  \"unsubscribe_token\",\n  \"uploads_inflight\",\n  \"user\",\n  \"user_achievement\",\n  \"user_acquisition_facts\",\n  \"user_acquisition_facts_stored\",\n  \"user_acquisition_facts_stored_watermark\",\n  \"user_active_context\",\n  \"user_analysis_preference\",\n  \"user_email_preference\",\n  \"user_entity_state\",\n  \"user_feedback\",\n  \"user_follows\",\n  \"user_form_profile\",\n  \"user_markdown_sample\",\n  \"user_memory\",\n  \"user_preference\",\n  \"user_profile\",\n  \"user_secret\",\n  \"user_secret_audit\",\n  \"user_secret_grant\",\n  \"user_stat\",\n  \"user_storage_usage\",\n  \"user_surface_state\",\n  \"users_calendar_feed\",\n  \"users_notion_sync_source\",\n  \"vault_fill_approvals\",\n  \"vault_fill_devices\",\n  \"vault_fill_nonces\",\n  \"visibility_cache\",\n  \"visibility_epoch\",\n  \"voice\",\n  \"war_room\",\n  \"wbx_demo\",\n  \"wbx_guidance\",\n  \"wbx_highlight\",\n  \"wbx_pattern\",\n  \"wbx_recipe\",\n  \"wbx_screenshot\",\n  \"wbx_seo_audit\",\n  \"wc_claim\",\n  \"wc_impairment_definition\",\n  \"wc_injury\",\n  \"wc_report\",\n  \"web_analysis_item\",\n  \"web_brand\",\n  \"web_brand_asset\",\n  \"web_brand_choice\",\n  \"web_brand_exclusion\",\n  \"web_brand_offering\",\n  \"web_brand_persona\",\n  \"web_brand_relation_kind\",\n  \"web_brand_review\",\n  \"web_brand_testimony\",\n  \"web_business_fact\",\n  \"web_business_location\",\n  \"web_channel_analytics_daily\",\n  \"web_crawl_event\",\n  \"web_crawl_preset\",\n  \"web_crawl_schedule\",\n  \"web_crawl_session\",\n  \"web_crawl_url\",\n  \"web_discovered_item\",\n  \"web_domain_category\",\n  \"web_domain_category_observation\",\n  \"web_finding\",\n  \"web_gsc_page_stat\",\n  \"web_link_edge\",\n  \"web_listing_publisher\",\n  \"web_location_listing\",\n  \"web_news_item\",\n  \"web_offering_template\",\n  \"web_page\",\n  \"web_page_content\",\n  \"web_page_evidence\",\n  \"web_page_sitemap\",\n  \"web_property\",\n  \"web_provider\",\n  \"web_result\",\n  \"web_screenshot\",\n  \"web_site\",\n  \"web_site_endpoint_rule\",\n  \"web_site_item_config\",\n  \"web_site_offering\",\n  \"web_sitemap\",\n  \"web_snapshot\",\n  \"web_tag_manager_snapshot\",\n  \"web_temp_brand_firmographic\",\n  \"web_temp_brand_presence\",\n  \"web_temp_brand_recognition\",\n  \"web_voice_fingerprint\",\n  \"web_youtube_video\",\n  \"webhook_deliveries\",\n  \"webhook_dispatch_state\",\n  \"webhook_test_receipt\",\n  \"webhooks\",\n  \"wf_node_data_slot\",\n  \"work_claim\",\n  \"work_item\",\n  \"workbook\",\n  \"worker_heartbeat\",\n  \"workflow\",\n  \"workflow_card\",\n  \"workflow_checkpoint\",\n  \"workflow_checkpoint_value\",\n  \"workflow_comparison\",\n  \"workflow_definition_overview\",\n  \"workflow_definition_version\",\n  \"workflow_idempotency\",\n  \"workflow_job\",\n  \"workflow_node_events\",\n  \"workflow_node_outcome\",\n  \"workflow_plan\",\n  \"workflow_plan_event\",\n  \"workflow_plan_sample\",\n  \"workflow_recovery_audit\",\n  \"workflow_review_issue\",\n  \"workflow_run\",\n  \"workflow_run_cost\",\n  \"workflow_run_facts\",\n  \"workflow_run_log\",\n  \"workflow_runtime_surface\",\n  \"workflow_template\",\n  \"workflow_trigger\",\n  \"workflow_trigger_fire\",\n  \"workflow_work_item\",\n  \"working_document\",\n  \"write_guard_key\",\n  \"youtube_quota_day\",\n  \"youtube_search\",\n  \"youtube_video\",\n] as const;\n\nexport type StoreRefusalCode = (typeof STORE_REFUSAL_CODES)[number][\"code\"];\nexport type StoreDoorName = (typeof STORE_DOORS)[number][\"name\"];\nexport type EntityToken = (typeof ENTITY_TOKENS)[number];\nexport type KernelTableName = (typeof KERNEL_TABLES)[number][\"name\"];\n","// src/results.ts — @ai-matrx/records\n//\n// THE NEVER-THROW RESULT ENVELOPE, and the refusal vocabulary behind it.\n//\n// This package's whole posture toward the store is in one sentence: THE CLIENT\n// MIRRORS THE STORE'S CONTRACT AND NEVER RE-IMPLEMENTS A RULE THE STORE\n// ENFORCES. When the store refuses, the client hands back the store's OWN\n// message, the store's OWN hint and the store's OWN SQLSTATE, under a code a\n// screen can branch on. It never rewrites the sentence, never swallows it, and\n// never invents a friendlier one — the store's refusals were written to be read\n// by a person, and a client that paraphrases them is lying about what happened.\n\nimport type { PerValueAccessWord } from \"./vocabulary\";\nimport type { Uuid } from \"./record\";\n\n/**\n * What KIND of refusal it was. The mapping from SQLSTATE to code lives in\n * `/core`, and it is checked against `STORE_REFUSAL_CODES` — the list of every\n * SQLSTATE the store's own bodies raise, generated from the live catalog. A\n * code the store can raise and this union cannot name is a hole, and the\n * real-door suite fails on it.\n */\nexport type RecordsErrorCode =\n  /** `PT409` — somebody else's write won. The record clock moved under you. */\n  | \"stale_write\"\n  /**\n   * The call needs an organization and none was carried (the platform's `organization_required`; the entity\n   * doors' MX002). Never resolved by guessing one: the person is shown their memberships and picks.\n   */\n  | \"organization_required\"\n  /** `42501` — a door. Either the schema is revoked, or the store is switched off, or this principal may not pass. */\n  | \"door\"\n  /** `23514` — a Rule, a shape guard, or a validation the store enforces refused it. */\n  | \"refused_by_rule\"\n  /**\n   * `22004` / `22023` / `22P02` — the call itself was malformed: a missing id, a\n   * patch that is not an object, or a value that does not fit the type the\n   * store holds for that Field. The store's own message names the value and the\n   * type it could not be read as.\n   */\n  | \"invalid_argument\"\n  /** `02000` — the record is not here (deleted, never existed, or another organization's). */\n  | \"not_found\"\n  /** `23503` — something it points at is not there. */\n  | \"missing_reference\"\n  /** `23505` — that thing is already here. */\n  | \"already_exists\"\n  /** `0A000` — the store does not do this yet, and says which part. */\n  | \"not_supported\"\n  /** `53400` / `22012` — the store ran out of something, or the arithmetic could not be done. */\n  | \"store_limit\"\n  /**\n   * `40001` — the read-access snapshot this connection carries is older than a\n   * write the reader has already observed, so the store refused to answer at\n   * all rather than hand back something they just lost. Retry on a fresh\n   * connection; it is the one refusal in this list that is worth repeating.\n   */\n  | \"stale_read\"\n  /**\n   * `57014` — the store cancelled the statement at its own timeout. Nothing was\n   * refused on its merits and nothing was written; the same call can succeed on\n   * a smaller page or a quieter moment. With `stale_read`, one of the only two\n   * refusals in this list worth repeating.\n   */\n  | \"timed_out\"\n  /**\n   * THE DOOR THAT DOES NOT EXIST YET. Not an error condition in the database —\n   * this package asked for a door that is not in the live catalogue, so it\n   * refused to guess. `door_absent` always names the door and the lane that\n   * owns it; it is never a silent no-op and never an empty list.\n   */\n  | \"door_absent\"\n  /**\n   * `PGRST202` / `PGRST205` — PostgREST could not find the function or the\n   * schema. The database this client is pointed at is not serving the record\n   * store: the schema is not exposed, or the grants are not there.\n   */\n  | \"store_not_served\"\n  /**\n   * `PT428` — the move was not refused and it did not happen: a stage gate whose\n   * `on_fail` is `require_approval` filed a request with the people who can\n   * answer it, and left the record exactly where it was. The store's own\n   * sentence is the gate's own sentence, and the DETAIL carries the approval.\n   *\n   * It is the one code in this list that is not a failure. A screen that drew it\n   * as one would tell somebody their work was rejected when it is being\n   * considered; a screen that drew it as success would move the card while\n   * somebody is still deciding. `custom.pipeline_move` answers an object on this\n   * path rather than raising, so a caller only meets PT428 when the move went\n   * through the ORDINARY write door — which is most of them.\n   */\n  | \"needs_approval\"\n  /**\n   * THE CALL NEVER REACHED THE STORE. Not a refusal — a transport failure: the\n   * browser lost the network, the gateway answered with an HTTP status and no\n   * body, the request was cancelled. supabase-js hands these back with an EMPTY\n   * `code` (a `FetchError`) or with the HTTP status in it (`\"404\"`, `\"502\"`),\n   * neither of which is a SQLSTATE, and until 2026-09-22 they all landed in\n   * `internal` — which is the one classification that tells a screen nothing,\n   * and which made the package print a sentence about ITSELF to the person\n   * (lane TAILS-6). Nothing was written, and the same call can simply be made\n   * again, which is what separates it from `internal`.\n   */\n  | \"unreachable\"\n  /** Anything the mapper could not place. It still carries the store's own words. */\n  | \"internal\";\n\n/** A refusal, in the store's own words. */\nexport interface RecordsError {\n  code: RecordsErrorCode;\n  /** THE STORE'S message, verbatim. Never paraphrased. */\n  message: string;\n  /** THE STORE'S hint, verbatim — this is where the remedy is written. */\n  hint?: string;\n  /** The SQLSTATE, so a caller can be exact when a code is not exact enough. */\n  sqlstate?: string;\n  /** Whatever the store put in DETAIL, parsed when it was json. */\n  detail?: unknown;\n  /**\n   * TRUE when this package did not recognize the class it was handed, so a\n   * caller can say so instead of reading the silence as \"handled\".\n   *\n   * 🚨 IT IS A FLAG AND A SEPARATE SENTENCE, NEVER AN APPENDIX TO `hint`\n   * (lane TAILS-6, 2026-09-22). `mapPgError` used to append \"@ai-matrx/records\n   * did not recognize SQLSTATE … from checklistTemplates\" ONTO `hint`, and\n   * `hint` is the field every screen treats as THE REMEDY — the sentence a\n   * person is told to act on. So a dropped connection on the Checklists tab\n   * showed a plumbing company \"Something went wrong at our end\" over a line\n   * about a TypeScript package and a SQLSTATE. A note this package writes about\n   * ITSELF is for whoever debugs it and belongs nowhere a person reads.\n   */\n  unmapped?: boolean;\n  /**\n   * THIS PACKAGE'S OWN NOTE, for an engineer. Never the store's words and never\n   * a person's: screens render it out of sight (a `title` attribute, a\n   * screen-reader line) or not at all.\n   */\n  diagnostic?: string;\n}\n\nexport type RecordsResult<T> = { ok: true; data: T } | { ok: false; error: RecordsError };\n\n/** Narrowing helper for hosts compiled without `strictNullChecks`. */\nexport function isRecordsErr<T>(\n  result: RecordsResult<T>,\n): result is { ok: false; error: RecordsError } {\n  return result.ok === false;\n}\n\n/**\n * A result's data, or THROW its refusal as an `Error` carrying the store's sentence — for the places\n * a throw is the contract (a `createAsyncThunk` body, a loader whose caller catches and shows it).\n */\nexport function unwrapRecords<T>(result: RecordsResult<T>): T {\n  if (result.ok) return result.data;\n  throw new Error(result.error.message);\n}\n\nexport const ok = <T>(data: T): RecordsResult<T> => ({ ok: true, data });\nexport const err = <T>(error: RecordsError): RecordsResult<T> => ({ ok: false, error });\n\n/**\n * A `stale_write` carries everything the screen needs to show the conflict\n * rather than a toast: which version you wrote against, which one won, and the\n * value of every field you touched as it stands now. The store builds this and\n * this type is its shape — nothing is reconstructed on the client.\n */\nexport interface StaleWriteDetail {\n  expected_version: number;\n  current_version: number;\n  contested_fields: Record<string, unknown>;\n}\n\n/** The parsed form of a `stale_write`, for `useRecordMutation`'s conflict state. */\nexport interface WriteConflict extends StaleWriteDetail {\n  record_id: Uuid;\n  /** The store's own sentence — what the screen shows. */\n  message: string;\n  /** The store's own remedy. */\n  hint: string;\n}\n\n/**\n * The structural shape of a PostgREST failure as supabase-js resolves it: a\n * PLAIN OBJECT parsed from the response body, NOT an `Error`. Reading\n * `.message` off `instanceof Error` discards the real database message on every\n * genuine failure.\n */\nexport interface PgError {\n  code?: string | null;\n  message: string;\n  details?: string | null;\n  hint?: string | null;\n}\n\n/** What the validation mirror answers: the same sentence the trigger would raise. */\nexport interface PredictedRefusal {\n  /** The field key the store would name, when it names one. */\n  field_key?: string;\n  /** The message the store's own body would raise, word for word. */\n  message: string;\n  hint?: string;\n  /** The store's structured detail, when its refusal carries one (e.g. `{ example }`). */\n  detail?: Record<string, unknown>;\n  sqlstate: string;\n  /**\n   * Which of the store's bodies would raise it, so a reader can go and check\n   * that this mirror still tells the truth.\n   */\n  predicted_by: string;\n}\n\n/** VAL-5 / VAL-6, named so a caller can say which word was the problem. */\nexport interface ForbiddenEnvelopeWord {\n  field_key: string;\n  word: PerValueAccessWord;\n}\n","// src/core/pgError.ts — @ai-matrx/records\n//\n// THE ONE FUNNEL from what the database said to what a caller reads. Every\n// method in this package's client goes through it, and it does exactly three\n// things: it classifies the SQLSTATE, it carries the store's message and hint\n// VERBATIM, and it parses the DETAIL when the store put json there.\n//\n// It never writes a sentence of its own about a refusal the store already\n// explained. The store's messages were written to be read by the person who hit\n// them — \"Someone else changed this record while you were working on it\" is the\n// screen's text, not a code the screen has to translate.\n\nimport type { PgError, RecordsError, RecordsErrorCode, StaleWriteDetail } from \"../results\";\n\n/**\n * SQLSTATE -> code. Every entry here answers one of the codes\n * `STORE_REFUSAL_CODES` reports the store raising; the real-door suite asserts\n * that this map covers all of them, so a new refusal class in the store shows\n * up as a red test rather than an `internal` in somebody's console.\n */\nconst BY_SQLSTATE: Record<string, RecordsErrorCode> = {\n  // Also what custom.has_visibility_at / table_move / whole_value_complete raise since 2026-10-21 (they\n  // raised 40001, which PostgREST retries without limit — the outage that day).\n  PT409: \"stale_write\",\n  \"42501\": \"door\",\n  \"23514\": \"refused_by_rule\",\n  \"22004\": \"invalid_argument\",\n  \"22023\": \"invalid_argument\",\n  // MX005 — a value the store cannot take as asked: since 2026-10-06 (AP-3 U3) a word that names more than one\n  // choice or linked record raises it (it used to borrow PT409 and read as somebody else's write winning).\n  MX005: \"invalid_argument\",\n  // MXD01 — the held-change door tried the proposed values before filing an\n  // approval request and the store refused them. Nothing is waiting for a\n  // person to decide; correct the value before asking again, which is the same\n  // caller-side condition as the other invalid-argument refusals.\n  MXD01: \"invalid_argument\",\n  // 22P02 — a value does not fit the type the store holds for it. The class is\n  // real and was hit live: an organization whose copy of a package table grew\n  // `status` as a uuid-valued Field was sent the text \"open\", and the store\n  // answered `invalid input syntax for type uuid: \"open\"`. It is the CALL that\n  // is wrong for the shape the store holds, which is what `invalid_argument`\n  // already means — the store's own sentence names the value and the type.\n  \"22P02\": \"invalid_argument\",\n  // 42703 — a column that is not there. The store raises it from\n  // `custom.entity_table`, which is asked for a column by NAME, so the class is\n  // exactly \"the call named something the shape does not have\": the same thing\n  // `invalid_argument` already means, and the store's own sentence names the\n  // column. Added 2026-09-20 (lane FORMS) because the package's live-door suite\n  // caught it raised by a door this package did not know about — which is the\n  // suite working, and is why the map is a census rather than a guess.\n  \"42703\": \"invalid_argument\",\n  // 22007 — a date or a time the store could not read as one. It is raised by\n  // `custom.dashboard_window_sql`, which is handed a window a caller wrote\n  // (\"last 30 days\", a literal date), so the class is again \"the call named\n  // something the shape does not accept\" and the store's own sentence names the\n  // text it could not read. Added 2026-09-20 (lane SCREEN-BREAK) after the\n  // live-door census caught it — the same way 42703 arrived, which is the\n  // census working rather than a guess.\n  \"22007\": \"invalid_argument\",\n  // 22003 — a number the store could not hold at the size it was handed. It is\n  // raised by `custom.context_resolve`, which is given a window or a depth a\n  // caller wrote, so the class is the same one 22P02, 42703 and 22007 already\n  // are: the CALL named a value the shape does not accept, and the store's own\n  // sentence names the number and the range. Added 2026-09-20 (lane GRID-TWO)\n  // when the live-door census caught the release gate red on it — which is the\n  // census working, and the fourth time it has been the thing that found a new\n  // refusal class rather than a person guessing one.\n  \"22003\": \"invalid_argument\",\n  // 42883 — `custom._template_call` (the template family, 2026-10-03) was handed a step that\n  // names a door the store does not have, or an argument that door does not take. The TEMPLATE\n  // named something the shape does not have — the same class 42703 is — and the store's own\n  // sentence names the door or the argument. Caught by the live-door census on records 0.68.1's\n  // tag, the eighth time the census found a class before a person did. (A bare 42883 on a door\n  // this package itself asks for is still `door_absent`, mapped before this funnel in\n  // `owedDoor`.)\n  \"42883\": \"invalid_argument\",\n  \"02000\": \"not_found\",\n  // P0002 — `custom.inbox_snooze` / `custom.inbox_clear` (lane S5-PRIME-2, 2026-09-24): \"There is\n  // nothing in your inbox with that id\". An invented id, another person's item and another\n  // organization's all answer it alike, so it reads exactly as 02000 does: not found.\n  \"P0002\": \"not_found\",\n  // 23502 — `custom.synced_source_save` (the synced-source registry, 2026-10-16) refuses a source\n  // saved without a value it cannot do without (its door, its table), in its own sentence naming\n  // the value. The CALL left out something the shape requires: the same class as 22004.\n  \"23502\": \"invalid_argument\",\n  \"23503\": \"missing_reference\",\n  \"23505\": \"already_exists\",\n  \"0A000\": \"not_supported\",\n  \"53400\": \"store_limit\",\n  \"22012\": \"store_limit\",\n  // 54001 — `custom.record_delete` stops a cascade that nests past sixty-four\n  // levels of containment, because that is a loop somebody built rather than a\n  // hierarchy, and saying so beats recursing until the server runs out of\n  // stack. It is a LIMIT of the store, and the store's own sentence names what\n  // to do about it, so it reads as one.\n  \"54001\": \"store_limit\",\n  // 54000 — the grid primitives' organization ceilings (GRID-PRIMITIVES, 2026-09-23):\n  // `custom.action_run` on a selection past its knob, `custom.table_decorate` past the\n  // rule count, `custom.table_from_example` past `custom/example_rows_max`,\n  // `custom.table_webhook_declare` past `custom/table_webhooks_max`, and\n  // `custom.hub_changed_by`. Each names its knob in the hint and writes nothing, so it\n  // reads exactly like 54001: a limit of the store, in the store's own sentence.\n  \"54000\": \"store_limit\",\n  // VIS: `custom.has_visibility_at` refuses to answer from a snapshot older\n  // than a write this reader has already seen, rather than returning something\n  // they just lost access to. It is retryable on a fresher connection, which is\n  // a different instruction from every other refusal here.\n  // 55000 — `custom.table_move` (SC-1', 2026-09-24) refuses a move the table's present state\n  // does not allow: a destination that cannot take it, a table something else holds, contents\n  // that point at themselves in a circle. The store's own sentence names the reason and nothing\n  // moves, so it reads as a refusal on the merits. Caught by the live-door census on records\n  // 0.58.3's tag, the seventh time the census found a class before a person did.\n  \"55000\": \"refused_by_rule\",\n  // 42P17 — a worked-out column that would read itself round a circle (STORE-TAILS-3,\n  // 2026-09-25): `custom._field_reads_what_it_reads` refuses the declaration or edit that would\n  // close the circle, naming every column in it, and `custom.far_value` refuses a circle stored\n  // before that rule when a lookup or rollup is worked out. Refused on its merits, in the store's\n  // own sentence, nothing written — so it reads as 55000 does.\n  \"42P17\": \"refused_by_rule\",\n  // P0001 — `custom.context_scope_write` (2026-10-03) refuses a scope whose parent breaks the\n  // parent rule in the old trigger's own class and words (manager ruling H6). Refused on its\n  // merits, nothing written. Caught by the live-door census on records 0.65.0's tag.\n  P0001: \"refused_by_rule\",\n  \"40001\": \"stale_read\",\n  // 57014 — the store canceled the statement at its own timeout. Like\n  // `stale_read` and unlike every other refusal here, the call was never\n  // refused on its merits: the same call on a smaller page, or once the\n  // organization's kernel is not being rewritten, can succeed. It gets its own\n  // code so a screen can offer \"try again\" honestly instead of showing a\n  // failure sentence the caller cannot act on.\n  \"57014\": \"timed_out\",\n  // PostgREST's own two: the store is not being SERVED, which is a different\n  // thing from the store refusing. `custom` absent from `pgrst.db_schemas`, or\n  // the grants not copied, land here.\n  PGRST202: \"store_not_served\",\n  PGRST205: \"store_not_served\",\n  PGRST301: \"door\",\n  // PT428 — NOT A FAILURE, and the release gate's live census is what found it\n  // missing: the store raises it and this package answered `internal`, which is\n  // the one classification that tells a screen nothing. A stage gate whose\n  // `on_fail` is `require_approval` files the request and leaves the record\n  // where it was; the transaction is rolled back to the pipeline's own block, so\n  // \"nothing was written\" is a fact rather than a promise. Landed by lane\n  // STAGE-RULES; mapped here by STAGE-RULES-2 the day after, when the census\n  // caught it — the sixth time that census has been the thing that found a\n  // refusal class rather than a person guessing one.\n  PT428: \"needs_approval\",\n};\n\n/** The SQLSTATEs this package claims to understand. Exported for the guard. */\nexport const MAPPED_SQLSTATES = Object.keys(BY_SQLSTATE);\n\nfunction parseDetail(details: string | null | undefined): unknown {\n  if (!details) return undefined;\n  const trimmed = details.trim();\n  if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return details;\n  try {\n    return JSON.parse(trimmed) as unknown;\n  } catch {\n    return details;\n  }\n}\n\n/**\n * A CODE THAT IS NOT A SQLSTATE AT ALL — so it is not read as one.\n *\n * A SQLSTATE is five characters. supabase-js puts something else in `code` in\n * exactly two situations, and BOTH of them mean the call never reached the\n * store rather than the store refusing it:\n *\n *   `\"\"`        a `FetchError` — no network, a canceled request, CORS.\n *   `\"404\"`…    an HTTP status, when the gateway answered with no JSON body.\n *\n * Lane TAILS-6 (2026-09-22) found both landing in `internal`, which is the one\n * classification that tells a screen nothing: a person on the Checklists tab of\n * a plumbing company's jobs table was shown \"Something went wrong at our end\"\n * with nothing to do about it, over a sentence naming this package. They are\n * `unreachable`, which a screen can honestly offer \"try again\" for.\n */\nfunction isNotASqlstate(code: string | undefined): boolean {\n  if (!code) return true;\n  return /^[0-9]{3}$/.test(code);\n}\n\n/** What a person reads when the store cancelled a call at its statement timeout (57014, code `timed_out`). */\nexport const TIMED_OUT_MESSAGE = \"That took too long. Nothing was lost; try again.\";\n\n/** Map a PostgREST/supabase-js failure into the package's refusal shape. */\n/**\n * THE DOOR'S NAME NEVER REACHES A PERSON (lane AT-REVIEW-3). The store's refusals are written for the\n * engineer and name the door that refused (\"…and custom.doc_template_save needs Full access\", \"…so\n * custom.read_record has nothing to do there\"). A person reads plain words; the store's own sentence goes\n * to the diagnostic. One place, so every door and every screen inherits it.\n */\nexport function plainDoorWords(text: string, where: string): string {\n  const bare = where.replace(/^custom\\./, \"\");\n  const names = [where, bare].filter((n, i, all) => n && /^[A-Za-z0-9_.]+$/.test(n) && all.indexOf(n) === i);\n  const door = `(?:custom\\\\.[a-z0-9_]+${names.map((n) => `|${n.replace(/\\./g, \"\\\\.\")}`).join(\"\")})`;\n  const rules: Array<[RegExp, string]> = [\n    [new RegExp(`, so ${door} has nothing to do there( until an owner restores it)?\\\\.`, \"g\"), \", so there is nothing for you to do there$1.\"],\n    [new RegExp(`, so ${door} has nothing to show you\\\\.`, \"g\"), \", so there is nothing to show you.\"],\n    [new RegExp(`, so ${door} may not write to it\\\\.`, \"g\"), \", so you cannot change it.\"],\n    [new RegExp(`, and ${door} needs `, \"g\"), \", and changing it needs \"],\n    [new RegExp(`, so ${door} is not taking writes\\\\.`, \"g\"), \", so it is not taking changes.\"],\n    // The store now names the ACTION here (\"Changing a record\", or \"Making this change\" for a door outside its\n    // map), not the door — so the sentence is matched by its shape, whatever words lead it.\n    [/^custom: .+? was called without an organization, and the store is keyed \\(organization_id, id\\)\\./, \"Say which organization you are working in.\"],\n    [new RegExp(`\\\\b${door} needs `, \"g\"), \"That needs \"],\n    [new RegExp(`\\\\b${door}\\\\b`, \"g\"), \"that\"],\n  ];\n  let out = text;\n  for (const [re, to] of rules) out = out.replace(re, to);\n  return out;\n}\n\nexport function mapPgError(error: PgError, where: string): RecordsError {\n  // `code: \"\"` is supabase-js's own value for a transport failure, and `\"\"` is\n  // not nullish — so it has to be emptied deliberately or it becomes a SQLSTATE\n  // nobody can look up.\n  const raw = error.code ?? undefined;\n  const sqlstate = raw && raw !== \"\" ? raw : undefined;\n  const mapped: RecordsError = {\n    code: \"internal\",\n    message: error.message,\n    ...(error.hint ? { hint: error.hint } : {}),\n    ...(sqlstate ? { sqlstate } : {}),\n  };\n  // TEMPLATE-INSTALL-3: PGRST001/PGRST002 (\"Could not query the database for the schema cache\") are the API being away, the same\n  // thing a 503 is: never raw text on a screen, and never \"internal\".\n  if (isNotASqlstate(sqlstate) || sqlstate === \"PGRST001\" || sqlstate === \"PGRST002\") {\n    mapped.code = \"unreachable\";\n  } else {\n    mapped.code = BY_SQLSTATE[sqlstate!] ?? \"internal\";\n  }\n  const detail = parseDetail(error.details);\n  if (detail !== undefined) mapped.detail = detail;\n  if (mapped.code === \"internal\") {\n    // 🚨 THE NOTE GOES IN ITS OWN FIELD, NEVER ONTO `hint` (lane TAILS-6).\n    // `hint` is THE REMEDY — the sentence screens hand a person to act on — so\n    // a note this package writes about ITSELF being surprised belonged nowhere\n    // near it. It is still said out loud, so nobody reads the silence as\n    // \"handled\"; it is said to whoever debugs this and to nobody else.\n    mapped.unmapped = true;\n    mapped.diagnostic =\n      `@ai-matrx/records did not recognize SQLSTATE ${sqlstate ?? \"(none)\"} from ${where}; ` +\n      `the store's own message is the thing to act on.`;\n  } else if (mapped.code === \"unreachable\") {\n    mapped.unmapped = true;\n    mapped.diagnostic =\n      `@ai-matrx/records never reached the store from ${where}: ` +\n      `${raw ? `the transport answered ${raw}` : \"no response\"} — ${error.message}`;\n    // 🚨 THE ONE PLACE THIS PACKAGE WRITES A MESSAGE OF ITS OWN, and it is the\n    // one place where there is no store message to carry: the store never\n    // answered. `TypeError: Failed to fetch` is the browser talking to itself,\n    // not a sentence anybody should read, so it goes to the engineer's line\n    // above and the person gets what actually happened.\n    mapped.message = \"We could not reach your data.\";\n    // Whatever the transport said was never a remedy either; the remedy is to ask again (the one-line message plus Try again).\n    mapped.hint = \"Try again.\";\n  } else if (mapped.code === \"door\") {\n    const said = plainDoorWords(error.message, where);\n    if (said !== error.message) {\n      mapped.diagnostic = `${where} refused: ${error.message}`;\n      mapped.message = said;\n    }\n    if (mapped.hint) mapped.hint = plainDoorWords(mapped.hint, where);\n  } else if (mapped.code === \"timed_out\") {\n    // 🚨 THE SECOND PLACE THIS PACKAGE WRITES ITS OWN SENTENCE (lane AT-SLOW, 2026-10-19). 57014 is\n    // Postgres talking about itself — \"canceling statement due to statement timeout\" — not a refusal\n    // the store wrote for a person, and it reached people raw on base move, Kanban \"Make it work\" and\n    // base rename. The cancelled statement rolled back, so nothing was written. The store's words go\n    // to the engineer's line; the person gets what happened and what to do.\n    mapped.diagnostic = `${where} was cancelled at the store's statement timeout: ${error.message}`;\n    mapped.message = TIMED_OUT_MESSAGE;\n    delete mapped.hint;\n  }\n  return mapped;\n}\n\n/**\n * Anything a host caught (a supabase-js error object, a thrown `Error`, a string) as the package's\n * refusal, through `mapPgError` — so a host service's `catch` speaks the same words as its doors.\n */\nexport function mapThrownError(thrown: unknown, where: string): RecordsError {\n  const o = thrown && typeof thrown === \"object\" ? (thrown as { code?: unknown; message?: unknown; details?: unknown; hint?: unknown }) : {};\n  const message = typeof o.message === \"string\" && o.message ? o.message : thrown == null ? \"Unknown error\" : String(thrown);\n  const code = typeof o.code === \"string\" ? o.code : null;\n  // A supabase-js answer (it carries a code) and a transport failure are the store's / the\n  // network's; anything else a host threw is its own sentence and is kept as said.\n  if (code !== null || (thrown instanceof TypeError && /fetch|network/i.test(message))) {\n    return mapPgError(\n      { code, message, details: typeof o.details === \"string\" ? o.details : null, hint: typeof o.hint === \"string\" ? o.hint : null },\n      where,\n    );\n  }\n  return {\n    code: \"internal\",\n    message,\n    unmapped: true,\n    diagnostic: `@ai-matrx/records: ${where} threw outside the store.`,\n  };\n}\n\n/** Pull the conflict out of a `stale_write`, when the store sent one. */\nexport function staleWriteDetail(error: RecordsError): StaleWriteDetail | null {\n  if (error.code !== \"stale_write\") return null;\n  const detail = error.detail as Partial<StaleWriteDetail> | undefined;\n  if (\n    !detail ||\n    typeof detail.expected_version !== \"number\" ||\n    typeof detail.current_version !== \"number\"\n  ) {\n    return null;\n  }\n  return {\n    expected_version: detail.expected_version,\n    current_version: detail.current_version,\n    contested_fields: detail.contested_fields ?? {},\n  };\n}\n\n/**\n * HONEST-REFUSALS 1 — a member of an ARCHIVED organization is refused with the store's own sentence\n * (\"This organization is archived, …\") and DETAIL `organization_archived:<organization id>`. The sentence\n * and the restore hint ride `message` and `hint` verbatim like every refusal; this reads the organization out\n * so a screen can offer \"Restore\" (the owner's `iam.organization_restore` door) instead of a dead end.\n * Null for every other refusal, including the non-member's \"You are not a member of that organization\".\n */\nexport function archivedOrganizationId(error: RecordsError): string | null {\n  if (error.code !== \"door\" || typeof error.detail !== \"string\") return null;\n  const m = /^organization_archived:([0-9a-f-]{36})$/i.exec(error.detail.trim());\n  return m ? m[1]! : null;\n}\n","// src/core/primedBundle.ts — A TABLE PAGE'S BUNDLE, ASKED BEFORE THE PAGE'S SCRIPT HAS BOOTED (lane PAGE-BUNDLE-2).\n//\n// THE USE CASE: Dr. Patel's front desk opens \"Visits\" from a link. The server that renders the page\n// already holds her session, so it asks `custom.table_page_bundle` AS HER while the browser is still\n// downloading the page's script, and hands the answer (a promise, streamed) to the page. The records\n// client that mounts a moment later finds it here and asks nothing: its first wave of doors is already\n// answered. Without this the bundle was asked only after the whole app had booted (~1 s on production).\n//\n// HOW IT STAYS THE SAME: the primed answer is exactly what `custom.table_page_bundle` answered for the\n// same organization, Table and view, so `callDoor`'s part-by-part matching (name and every argument)\n// is unchanged. It is used ONCE and only while fresh (PRIMED_TTL_MS); an answer that is an error, or\n// not a bundle, is ignored and the bundle is asked as it always was. A primed answer never turns a\n// refusal into \"empty\": a refusing part is still asked by its own door.\n\n/** What a data source's `rpc` answers for `custom.table_page_bundle` (PostgREST's `{ data, error }`). */\nexport interface PrimedBundleAnswer {\n  data: unknown;\n  error: unknown;\n}\n\nconst PRIMED_TTL_MS = 15_000;\n\n/**\n * ONE REGISTRY FOR EVERY COPY OF THIS FILE. The package's entries (`/core`, `/react`, `/data`,\n * `/typed-table`) are bundled separately and each carries its own copy of the client, so a module-level\n * Map here would be FOUR maps: the host primes `/core`'s and the `RecordsProvider` (`/react`) never\n * sees it (measured on /data/<table>, 2026-10-07: the bundle was asked again). The registry lives\n * on `globalThis` under one well-known symbol, so every copy reads the same one.\n */\nconst REGISTRY = Symbol.for(\"@ai-matrx/records/primed-table-page-bundles\");\ntype Registry = Map<string, { answer: Promise<PrimedBundleAnswer>; at: number }>;\nfunction registry(): Registry {\n  const g = globalThis as unknown as Record<symbol, Registry | undefined>;\n  return (g[REGISTRY] ??= new Map());\n}\n\nconst primedKey = (organizationId: string, tableId: string, viewId: string | null | undefined): string =>\n  `${organizationId}|${tableId}|${viewId ?? \"\"}`;\n\n/**\n * Hand the records client a table page's bundle that was asked elsewhere (the server render, as the\n * same person). The next records client that opens this Table in this organization uses it instead of\n * asking — once, within PRIMED_TTL_MS.\n */\nexport function primeTablePageBundle(input: {\n  organizationId: string;\n  tableId: string;\n  viewId?: string | null;\n  answer: Promise<PrimedBundleAnswer> | PrimedBundleAnswer;\n}): void {\n  const answer = Promise.resolve(input.answer).catch((thrown: unknown) => ({ data: null, error: thrown }));\n  registry().set(primedKey(input.organizationId, input.tableId, input.viewId), { answer, at: Date.now() });\n}\n\n/** The primed answer for this page, once — or null (none, or stale). */\nexport function takePrimedTablePageBundle(\n  organizationId: string | null | undefined,\n  tableId: string,\n  viewId: string | null | undefined,\n): Promise<PrimedBundleAnswer> | null {\n  if (!organizationId) return null;\n  const key = primedKey(organizationId, tableId, viewId);\n  const primed = registry();\n  const held = primed.get(key);\n  if (!held) return null;\n  primed.delete(key);\n  return Date.now() - held.at < PRIMED_TTL_MS ? held.answer : null;\n}\n\n/**\n * A WRITE HAPPENED ON THIS TABLE: its primed page bundle (asked by the server before the write, never\n * used because the page opened from the seed) would answer the next read with the table as it WAS.\n * Forget the Table's (`tableId`), or every one when the write did not name a Table (`null`).\n */\nexport function forgetPrimedTablePageBundlesOf(tableId: string | null): void {\n  const primed = registry();\n  for (const key of [...primed.keys()]) if (tableId === null || key.split(\"|\")[1] === tableId) primed.delete(key);\n}\n\n/** Tests only: forget every primed answer. */\nexport function forgetPrimedTablePageBundles(): void {\n  registry().clear();\n}\n\n/**\n * A RECORD PAGE'S BUNDLE (`custom.record_page_bundle`), asked elsewhere as the same person — the\n * record-page twin of `primeTablePageBundle`, held in the same registry, used once, while fresh.\n */\nexport function primeRecordPageBundle(input: {\n  organizationId: string;\n  recordId: string;\n  answer: Promise<PrimedBundleAnswer> | PrimedBundleAnswer;\n}): void {\n  primeTablePageBundle({ organizationId: input.organizationId, tableId: `record:${input.recordId}`, answer: input.answer });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────────────────────\n// ANY DOOR'S ANSWER, ASKED ON THE SERVER, SERVED TO THE BROWSER'S OWN CALL, WHILE IT IS YOUNG (lane SEED-ENTITY)\n//\n// THE USE CASE: a grouped Visits table. Its group counts and its link labels are read by the grid in\n// effects, after the first paint — not in a first pass a seed can suspend. The server asked them too\n// (`askTablePageSeed`), so the provider hands every seeded answer here; the records client's own\n// `callDoor` finds the exact call (door name and every argument) and answers it while it is\n// young (10 s). A call that differs by any argument is asked of the store as always. A write (any door that\n// is not a read) empties the registry, so nothing stale is ever served after a change.\n// ─────────────────────────────────────────────────────────────────────────────────────────────\n\nconst DOOR_REGISTRY = Symbol.for(\"@ai-matrx/records/primed-door-answers\");\ntype DoorRegistry = Map<string, { data: unknown; at: number }>;\nfunction doorRegistry(): DoorRegistry {\n  const g = globalThis as unknown as Record<symbol, DoorRegistry | undefined>;\n  return (g[DOOR_REGISTRY] ??= new Map());\n}\n\n/** How long a primed door answer stays servable, counted from when the server asked. */\nexport const PRIMED_DOOR_TTL_MS = 10_000;\n\n/** Keep one door's answer (`key` = door name + canonical arguments, as `seedKey` builds it). */\nexport function primeDoorAnswer(key: string, data: unknown, at: number): void {\n  doorRegistry().set(key, { data, at });\n}\n\n/**\n * The primed answer to this exact call — or null (none, or older than the window). Served for the whole\n * window, not once: a grid's effect runs again when its rows land (same call, same answer). A write drops it.\n */\nexport function takePrimedDoorAnswer(key: string): { data: unknown } | null {\n  const registry = doorRegistry();\n  const held = registry.get(key);\n  if (!held) return null;\n  if (Date.now() - held.at < PRIMED_DOOR_TTL_MS) return { data: held.data };\n  registry.delete(key);\n  return null;\n}\n\n/**\n * A write happened: nothing primed is trusted any more — or, with `doors`, only what those doors answered\n * (a saved view changes the views and the layout, never a record's value or a count of records).\n */\nexport function dropPrimedDoorAnswers(doors?: readonly string[]): void {\n  const registry = doorRegistry();\n  if (!doors) {\n    registry.clear();\n    return;\n  }\n  for (const key of [...registry.keys()]) if (doors.some((door) => key.startsWith(`${door}|`))) registry.delete(key);\n}\n\n/** Writes that change only how a table is LOOKED AT: they drop these reads, and no others. */\nexport const LOOK_WRITES: Record<string, readonly string[]> = {\n  view_declare: [\"views\", \"view_look_read\", \"grid_layout\", \"table_page_bundle\"],\n  view_designate: [\"views\", \"view_look_read\", \"grid_layout\", \"table_page_bundle\"],\n  view_look_set: [\"views\", \"view_look_read\", \"grid_layout\", \"table_page_bundle\"],\n  view_record_order_set: [\"views\", \"view_look_read\", \"grid_layout\", \"table_page_bundle\"],\n};\n\n/**\n * A door that WRITES, by the verbs the store names its writers with. Anything this matches drops the\n * registry; a read that merely looks like a writer only costs a primed answer, never a stale one.\n */\nexport function isWritingDoor(door: string): boolean {\n  return /(_declare|_set(_|$)|_update|_write|_delete|_restore|_archive|_upsert|_reparent|_change|_duplicate|_move|_decide|_run$|_submit|_publish|_import_|_start$|_complete|_sign$|_add$|_retire|_propose|_promote|_land$|_pin$|_mute|_snooze|_unsnooze|_clear|_unclear|_revoke|_issue|_bind|_unbind|_apply|_backfill|_sync$|_decorate|_designate|_ensure|^migrate_|^set_table_|^home_add|^capture_|^claim_|^record_stage|^anon_|^io_import_|^io_comment_resolve|^enrich_(declare|land|pin)|^field_(declare|duplicate|propose|restore|retire|update)|^table_(declare|ensure|from_example|move|sync)|^value_restore|^relation_own)/.test(door);\n}\n","// src/core/transient.ts — @ai-matrx/records · WHAT IS TRANSIENT, AND HOW TO ASK AGAIN (HEADLESS)\n//\n// The store's API goes away for a few seconds now and then (a PostgREST restart answers PGRST002 \"Could not\n// query the database for the schema cache\", PGRST001, or a bare 502/503/504; a deploy or a proxy resets the\n// connection; a statement is cancelled or loses a lock race). None of those is the store REFUSING anything, and\n// a person who pressed a button should not be handed the weather.\n//\n// ONE PLACE (TEMPLATE-INSTALL-3). The classification and the backoff live here and are read by the one door\n// call (`createDoorCall`, so every method of the records client and every light door client inherits them) and\n// by the template door runners. Before this, `runTemplateDoor` retried lock and timeout errors but not PGRST002,\n// and every other door did not retry at all: during a PostgREST outage 4 of 5 fresh installs stopped on raw text.\n//\n// WHICH CALLS MAY BE ASKED AGAIN. A read always may. A write only when asking twice is the same as asking once:\n// its door is idempotent, or the call carries a caller-chosen id (`p_install_id`) the store answers the same way\n// however many times it is asked. Every other write is NOT retried blindly: a 503 or a reset can arrive after the\n// store did the work, and a second ask would do it again. It is refused once, in one plain sentence with \"Try\n// again\" (`mapPgError`), and the person decides.\n\nimport type { PgError } from \"../results\";\nimport { isWritingDoor } from \"./primedBundle\";\n\n/** SQLSTATEs and PostgREST codes that mean \"the same call may succeed in a moment\". */\nexport const TRANSIENT_CODES: ReadonlySet<string> = new Set([\n  \"PGRST001\", // PostgREST cannot reach the database\n  \"PGRST002\", // PostgREST cannot build its schema cache (a restart, a reload)\n  \"57014\", // statement cancelled at its timeout\n  \"55P03\", // lock not available\n  \"40001\", // serialization failure\n  \"40P01\", // deadlock detected\n]);\n\n/** HTTP statuses a gateway answers while the API is down or restarting (supabase-js puts them in `code` when the body is not JSON). */\nconst TRANSIENT_STATUS = /^(502|503|504)$/;\n\n/** A dropped connection, in whatever words the runtime used (node, undici, a browser's fetch). */\nconst TRANSIENT_WORDS = /connection reset|econnreset|socket hang up|schema cache|bad gateway|service unavailable|gateway time-?out/i;\n\n/** True when `error` is the store's weather, not an answer about the call. */\nexport function isTransientStoreError(error: { code?: string | null; message?: string | null } | null | undefined): boolean {\n  if (!error) return false;\n  const code = error.code ?? \"\";\n  if (TRANSIENT_CODES.has(code) || TRANSIENT_STATUS.test(code)) return true;\n  return TRANSIENT_WORDS.test(error.message ?? \"\");\n}\n\n/** Codes whose cause is the API being away (said \"We could not reach your data.\" to a person), as opposed to a busy statement. */\nexport function isStoreAwayError(error: { code?: string | null; message?: string | null } | null | undefined): boolean {\n  if (!error) return false;\n  const code = error.code ?? \"\";\n  if (code === \"PGRST001\" || code === \"PGRST002\" || TRANSIENT_STATUS.test(code)) return true;\n  return code !== \"57014\" && code !== \"55P03\" && code !== \"40001\" && code !== \"40P01\" && TRANSIENT_WORDS.test(error.message ?? \"\");\n}\n\n/** The waits between asks, before jitter: 0.5, 1, 2 and 4 seconds (7.5 s in all). */\nexport const RETRY_DELAYS_MS: readonly number[] = [500, 1000, 2000, 4000];\n\n/**\n * A statement cancelled at its timeout already spent its whole budget; asking it four more times is a\n * half-minute of hanging. It gets ONE more ask (the common case is a cold cache that the first ask warmed).\n */\nconst TIMEOUT_RETRIES = 1;\n\n/** One wait: the base delay with +/-25 % jitter, so a crowd of callers does not come back in the same instant. */\nexport function backoffDelay(attempt: number, random: () => number = Math.random, delays: readonly number[] = RETRY_DELAYS_MS): number {\n  const base = delays[Math.min(attempt, delays.length - 1)] ?? 0;\n  return Math.round(base * (0.75 + random() * 0.5));\n}\n\n/** Doors whose second ask is the same as their first (they resume from the store's own record of the work). */\nconst IDEMPOTENT_DOORS: ReadonlySet<string> = new Set([\n  \"template_install_fresh\",\n  \"template_uninstall\",\n  \"template_restore\",\n  \"template_upgrade\",\n  \"template_install_note\",\n]);\n\n/** A door the name-based writing test does not recognise, but that makes something new on every ask. */\nconst ALWAYS_NEW = /^template_install$/;\n\n/** May this call be asked again after a transient answer? Reads: yes. Writes: only an idempotent door or a call with a caller-chosen id. */\nexport function isRetrySafe(door: string, args: Record<string, unknown>): boolean {\n  if (IDEMPOTENT_DOORS.has(door)) return true;\n  if (typeof args[\"p_install_id\"] === \"string\" && args[\"p_install_id\"] !== \"\") return true;\n  if (ALWAYS_NEW.test(door)) return false;\n  return !isWritingDoor(door);\n}\n\nexport interface RetryOptions {\n  /** False: ask once and hand back whatever came. */\n  safe: boolean;\n  /** Tests pass a fake. */\n  sleep?: (ms: number) => Promise<void>;\n  /** Tests pass a fixed source. */\n  random?: () => number;\n  delays?: readonly number[];\n  /** Told before each wait (attempt counts from 1), so a screen can say it is still trying. */\n  onRetry?: (info: { attempt: number; waitMs: number; error: PgError }) => void;\n}\n\nconst nap = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\n/** The answer a thrown ask (a rejected fetch) is read as. */\nfunction thrownAsError(thrown: unknown): PgError {\n  const o = thrown && typeof thrown === \"object\" ? (thrown as { code?: unknown; message?: unknown }) : {};\n  return {\n    code: typeof o.code === \"string\" ? o.code : \"\",\n    message: typeof o.message === \"string\" && o.message ? o.message : String(thrown),\n  };\n}\n\n/**\n * Ask `call` until it answers without a transient error, or the waits run out. Never throws: a rejected ask\n * becomes an `error` answer. Returns the LAST answer, so the caller maps it exactly as it mapped a first one.\n */\nexport async function retryTransient<T extends { data: unknown; error: PgError | null }>(\n  call: () => PromiseLike<T>,\n  options: RetryOptions,\n): Promise<T> {\n  const sleep = options.sleep ?? nap;\n  const delays = options.delays ?? RETRY_DELAYS_MS;\n  let attempt = 0;\n  for (;;) {\n    let answer: T;\n    try {\n      answer = await call();\n    } catch (thrown) {\n      answer = { data: null, error: thrownAsError(thrown) } as T;\n    }\n    const error = answer.error;\n    if (!error || !options.safe || !isTransientStoreError(error)) return answer;\n    const limit = error.code === \"57014\" ? Math.min(TIMEOUT_RETRIES, delays.length) : delays.length;\n    if (attempt >= limit) return answer;\n    const waitMs = backoffDelay(attempt, options.random, delays);\n    attempt++;\n    options.onRetry?.({ attempt, waitMs, error });\n    await sleep(waitMs);\n  }\n}\n","// src/core/doorCall.ts — @ai-matrx/records · THE ONE DOOR CALL (HEADLESS, LIGHT)\n//\n// Every typed method of the records client, and the light door clients a host's shell uses\n// (`@ai-matrx/records/door-call`: the scope doors, the pick-list doors, `storeDoors`), ask the store\n// through THIS function. It holds the door-call semantics once:\n//\n//   - a primed answer (the server render asked the same door as the same person) is served first;\n//   - a write empties what was primed (all of it, or only a look write's reads);\n//   - ONE READ IN FLIGHT, ONE ANSWER FOR EVERY ASKER (lane DEDUPE-READS): two askers of the same\n//     door with the same arguments in the same moment share one request; a writing door always goes\n//     out on its own, and a flight is forgotten the moment it lands;\n//   - the schema is said out loud (`custom`), never PostgREST's `public` default;\n//   - a door the store lacks is refused `door_absent` (never an empty answer), and every other\n//     refusal is the store's own words (`mapPgError`), said once through the error sink.\n//\n// What only the full client has (the table/record page bundle, the generated door catalog) is\n// handed in as hooks, so this file imports no table registry, no field-kind vocabulary and no UI:\n// a shell that only reads scopes or a pick list never carries the store client.\n\nimport type { RecordsDataSource, RecordsErrorSink } from \"../ports\";\nimport type { RecordsError, RecordsErrorCode, RecordsResult } from \"../results\";\nimport { err, ok } from \"../results\";\nimport { mapPgError } from \"./pgError\";\nimport { isRetrySafe, retryTransient, type RetryOptions } from \"./transient\";\nimport { LOOK_WRITES, dropPrimedDoorAnswers, forgetPrimedTablePageBundlesOf, isWritingDoor, takePrimedDoorAnswer } from \"./primedBundle\";\n\n/** The schema every door of the record store lives in, unless the host's config says otherwise. */\nexport const DEFAULT_DOOR_SCHEMA = \"custom\";\n\n/** An argument object as one stable string: keys sorted at every depth (PAGE-BUNDLE's match key). */\nexport function canonicalArgs(value: unknown): string {\n  return JSON.stringify(value, (_key, held) =>\n    held && typeof held === \"object\" && !Array.isArray(held)\n      ? Object.fromEntries(Object.keys(held as object).sort().map((k) => [k, (held as Record<string, unknown>)[k]]))\n      : held,\n  );\n}\n\n/**\n * 🚨 A REFUSAL IS NOT AN APP ERROR (lane RECORDS-UI-FIX, guide re-walk 2026-09-23).\n *\n * A person typing `-3` into a column that takes \"at least 0\" is the store WORKING: the\n * rule said no, the screen said so in the one notice, and the person fixed it. The default\n * sink printed every one of those through `console.error`, and the app's error capture\n * (matrx-frontend `lib/diagnostics/globalErrorCapture.ts`) counts every `console.error` —\n * so one refused value lit a red \"2 errors\" pill in the corner, telling an admin the\n * product had failed when a person had simply been told no.\n *\n * These are the codes a PERSON causes by what they typed or when they typed it; each one\n * is already drawn on the screen that asked. They are still said (`console.info`), never\n * silenced. Everything else — a door, the store switched off, a timeout, a class this\n * package did not recognize — is a failure of the system and stays `console.error`.\n */\nexport const A_PERSONS_REFUSAL: ReadonlySet<RecordsErrorCode> = new Set<RecordsErrorCode>([\n  \"refused_by_rule\",\n  \"stale_write\",\n  \"invalid_argument\",\n  \"already_exists\",\n  \"missing_reference\",\n]);\n\nexport function isAPersonsRefusal(code: RecordsErrorCode | string): boolean {\n  return A_PERSONS_REFUSAL.has(code as RecordsErrorCode);\n}\n\n/** The host's error sink, or the default one: the store's own words, naming where it happened. */\nexport function recordsErrorSink(onError: RecordsErrorSink | undefined): RecordsErrorSink {\n  return (\n    onError ??\n    ((e) => {\n      // The defined degradation, stated: with the store's own words, and naming where it\n      // happened. Never silence — but a person's refusal is information, not an error.\n      const line = `[@ai-matrx/records] ${e.where}: ${e.code} — ${e.message}${e.hint ? ` (${e.hint})` : \"\"}`;\n      if (isAPersonsRefusal(e.code)) console.info(line);\n      else console.error(line);\n    })\n  );\n}\n\n/** The refusal a missing door gets. It always says who owes it (`owedBy`, when a lane claims it). */\nexport function doorAbsentRefusal(name: string, owedBy?: string): RecordsError {\n  return {\n    code: \"door_absent\",\n    message:\n      `The record store has no door \\`custom.${name}\\` yet, so this call was not made. ` +\n      `Nothing was read and nothing was written.`,\n    hint: owedBy\n      ? `That door is ${owedBy}. Until it lands, this call refuses rather than guessing: ` +\n        `an empty answer here would read like \"there is nothing\", which is a different sentence.`\n      : `No lane in the build book claims this door. Either the name is wrong, or the door was ` +\n        `removed from the store and this package has not been regenerated — run \\`pnpm records:generate\\`.`,\n  };\n}\n\n/**\n * What the server render already asked as this person, for this exact door and arguments — or null.\n * A write (or a look write) empties what is primed instead, and is never answered from it.\n */\nexport function primedDoorAnswer(door: string, args: Record<string, unknown>): { data: unknown } | null {\n  const look = LOOK_WRITES[door];\n  if (look) {\n    dropPrimedDoorAnswers(look);\n    return null;\n  }\n  if (isWritingDoor(door)) {\n    dropPrimedDoorAnswers();\n    return null;\n  }\n  return takePrimedDoorAnswer(`${door}|${canonicalArgs(args)}`);\n}\n\n/** One door call: the door's name, its arguments, and where the caller is (for the refusal). */\nexport type DoorCall = <T>(\n  door: string,\n  args: Record<string, unknown>,\n  where: string,\n  /**\n   * `quiet`: this refusal is an ANSWER the caller already draws (a door that says \"not yours\" to a\n   * person who only has table-level access), not a failure of the system. It is returned to the\n   * caller and said once with `console.info` - never through the error sink, which lights the\n   * error badge. Everything else about the call is unchanged.\n   */\n  opts?: { quiet?: boolean },\n) => Promise<RecordsResult<T>>;\n\nexport interface DoorCallOptions {\n  /** The store's data seam (`asRecordsDataSource(supabase)`). */\n  dataSource: RecordsDataSource;\n  /** Defaults to `custom`. */\n  schema?: string;\n  /** The host's error sink (defaults to `recordsErrorSink(undefined)`). */\n  onError?: RecordsErrorSink;\n  /**\n   * MAY THIS DOOR BE ASKED AT ALL (the full client's generated catalog). False refuses with\n   * `absent(door)` and asks nobody. Absent ⇒ every door is asked, and a store that answers \"no such\n   * function\" (PostgREST's PGRST202 or Postgres's 42883) is refused `door_absent` all the same.\n   */\n  doorReady?: (door: string) => boolean;\n  /** The refusal a missing door gets (defaults to `doorAbsentRefusal(door)`). */\n  absent?: (door: string) => RecordsError;\n  /** An answer this page already holds for the exact call (the full client's page bundle), else null. */\n  held?: (door: string, args: Record<string, unknown>) => Promise<{ data: unknown } | null | undefined>;\n  /** A write landed: drop what this page still holds of it (the full client's page bundle). */\n  wrote?: (door: string, args: Record<string, unknown>) => void;\n  /**\n   * TRANSIENT STORE ERRORS ARE ASKED AGAIN, HERE, FOR EVERY DOOR (TEMPLATE-INSTALL-3). PGRST001/PGRST002, a 502/503/504, a\n   * reset connection, a cancelled statement, a lock wait, a serialization failure and a deadlock are the store's weather, not an\n   * answer: a read (or a write that is safe to repeat: an idempotent door, or a call carrying `p_install_id`) waits 0.5, 1, 2\n   * and 4 s with jitter and asks again. Any other write is asked once and refused in one plain sentence. Tests inject the waits;\n   * `false` turns it off.\n   */\n  retry?: false | Pick<RetryOptions, \"sleep\" | \"random\" | \"delays\" | \"onRetry\">;\n}\n\n/** Build the one door call over a data source. Every records client, light or full, asks through this. */\nexport function createDoorCall(options: DoorCallOptions): DoorCall {\n  const { dataSource, doorReady, held, wrote } = options;\n  const schema = options.schema ?? DEFAULT_DOOR_SCHEMA;\n  const scream = recordsErrorSink(options.onError);\n  const absent = options.absent ?? ((door: string) => doorAbsentRefusal(door));\n  const retryOptions = options.retry === false ? null : (options.retry ?? {});\n  const readsInFlight = new Map<string, Promise<Awaited<ReturnType<RecordsDataSource[\"rpc\"]>>>>();\n\n  const say = (refusal: RecordsError, where: string): void =>\n    scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where });\n\n  return async function callDoor<T>(\n    door: string,\n    args: Record<string, unknown>,\n    where: string,\n    opts?: { quiet?: boolean },\n  ): Promise<RecordsResult<T>> {\n    // A WRITE EMPTIES WHAT THE SERVER ASKED; A READ FINDS ITS EXACT ANSWER THERE FIRST (lane SEED-ENTITY).\n    const primed = primedDoorAnswer(door, args);\n    if (primed) return ok(primed.data as T);\n    if (held) {\n      const bundled = await held(door, args);\n      if (bundled) return ok(bundled.data as T);\n    }\n    // The generated catalog, or a store the host says already has the door (`knownDoors`) —\n    // the bridge between a chair's production apply and the next `pnpm records:generate`.\n    if (doorReady && !doorReady(door)) {\n      const refusal = absent(door);\n      say(refusal, where);\n      return err(refusal);\n    }\n    // THE SCHEMA IS SAID OUT LOUD. A door of the store is `custom.<name>`, and\n    // a host's supabase client resolves an unqualified `rpc()` against its own\n    // default PostgREST profile — `public` in every client we ship. Leaving it\n    // off therefore asked `public.store_is_open`, which the browser extension\n    // found for us on its first real turn (2026-09-18, W6-EXT): \"Could not find\n    // the function public.store_is_open(p_organization_id) in the schema cache\".\n    // The package knows which schema it lives in, so it is the package that\n    // says so, once, here — never every host remembering to.\n    // ONE READ IN FLIGHT, ONE ANSWER FOR EVERY ASKER (lane DEDUPE-READS). Two hooks asking the same\n    // door with the same arguments in the same moment (`custom.enrich_cells` fired twice in one\n    // millisecond) share ONE request. Only reads share; a writing door always goes out on its own.\n    // The flight is forgotten the moment it lands, so the next ask is a fresh read.\n    const flightKey = isWritingDoor(door) ? null : `${door}|${canonicalArgs(args)}`;\n    const flying = flightKey ? readsInFlight.get(flightKey) : undefined;\n    const response = await (flying ??\n      (() => {\n        const ask = () => Promise.resolve(dataSource.rpc(`${door}`, args, { schema }));\n        const call = retryOptions ? retryTransient(ask, { ...retryOptions, safe: isRetrySafe(door, args) }) : ask();\n        if (flightKey) {\n          readsInFlight.set(flightKey, call);\n          const forget = (): void => {\n            if (readsInFlight.get(flightKey) === call) readsInFlight.delete(flightKey);\n          };\n          call.then(forget, forget);\n        }\n        return call;\n      })());\n    if (response.error) {\n      const code = (response.error as { code?: string }).code;\n      // AN ARGUMENT LEFT UNDEFINED NEVER TRAVELS (JSON drops it), so PostgREST finds no function of that\n      // shape and says PGRST202 - which reads as \"the store is not served\". It is the CALLER's slip\n      // (AT-FIX-G1: a cleanup passed `d.id` for `dashboard_id`), so say that, naming the argument.\n      const missing = Object.keys(args).filter((k) => args[k] === undefined);\n      const refusal: RecordsError =\n        (code === \"PGRST202\" || code === \"42883\") && missing.length > 0\n          ? {\n              code: \"invalid_argument\",\n              message: `${door} was asked without ${missing.join(\", \")}, so it was not run.`,\n              hint: \"Name what it should act on and ask again.\",\n              sqlstate: code,\n            }\n          : // Without a catalog, \"no such function\" is the store saying it lacks the door.\n            !doorReady && (code === \"PGRST202\" || code === \"42883\")\n            ? absent(door)\n            : mapPgError(response.error, where);\n      if (opts?.quiet) console.info(`[@ai-matrx/records] ${where}: ${refusal.code} - ${refusal.message}`);\n      else say(refusal, where);\n      return err(refusal);\n    }\n    // A WRITE THAT LANDED EMPTIES WHAT THE PAGE STILL HOLDS OF THE TABLE (lane COPY-VIEW): \"Copy\n    // settings from…\" saved the view and the bar's re-read of the views was answered from the bundle, as\n    // of before the write — no request left the page and the grid kept the old filter until a reload.\n    if (isWritingDoor(door) || LOOK_WRITES[door]) {\n      const tableId = args[\"p_table_id\"];\n      wrote?.(door, args);\n      forgetPrimedTablePageBundlesOf(typeof tableId === \"string\" ? tableId : null);\n      dropPrimedDoorAnswers(LOOK_WRITES[door]);\n    }\n    return ok(response.data as T);\n  };\n}\n","// src/core/doors.ts — @ai-matrx/records\n//\n// THE DOOR TABLE. Every call this package can make names a door, and every door\n// it names is checked against `STORE_DOORS` — which is generated from `pg_proc`\n// on the live store, not written by a person.\n//\n// A door that is not there yet is answered `door_absent`, naming the door AND\n// the lane that owns it. That is the whole of \"nothing fails silently\" for this\n// package: there is no empty array standing in for a search nobody built, and\n// no `true` standing in for a proposal nobody can approve.\n\nimport { STORE_DOORS } from \"../store.generated\";\nimport type { RecordsError } from \"../results\";\nimport { doorAbsentRefusal } from \"./doorCall\";\n\n/** Which lane owes each door that does not exist yet (BUILD-BOOK \"Packages\"). */\nconst OWED_BY: Record<string, string> = {\n  table_archive_deliberately: \"lane 12 PLATFORM-APP-DATA P5 — matrx-frontend migrations/campaign/lane12_h_a_table_the_code_depends_on_is_archived_only_on_purpose.sql (chair's production apply)\",\n  entity_fields_across: \"lane 7 STANDARD-TABLES W2 — matrx-frontend migrations/campaign/lane7w2_b_one_read_of_a_tables_fields_across_organizations.sql (chair's production apply)\",\n  table_home: \"SC-1' — matrx-frontend migrations/campaign/sc1p_a_table_says_where_it_lives_and_its_owner_can_move_it.sql (and its grant file), applied by the chair\",\n  table_move: \"SC-1' / SC-1-TAILS — sc1p_a_table_says_where_it_lives_and_its_owner_can_move_it.sql, then sc1t_a_table_moves_with_the_tables_inside_it.sql, applied by the chair\",\n  record_aggregate: \"W5-SRV / W5-AGENT — `record_aggregate` is one of the eight verbs\",\n  field_propose: \"W5-AGENT — AGT-4/AGT-8, the proposal and its approvers\",\n  table_propose: \"W5-AGENT — AGT-8, the proposal and its approvers\",\n  merge_field_resolve: \"W5-MERGE-B — the resolver's server half\",\n  record_query: \"W1-INDEX / W5-SRV — the promoted-field query path\",\n  // Lane GRID-PRIMITIVES (2026-09-22): on the rehearsal branch; they reach the main database at\n  // the chair's 01:00–04:00 PT apply, and `pnpm records:generate` then lists them in\n  // STORE_DOORS. Until then each call answers door_absent naming this line — never a guess.\n  table_decorate: \"GRID-PRIMITIVES G1 — gridprim_a_table_wears_its_colors_and_its_layout.sql (chair's production apply)\",\n  table_decorations: \"GRID-PRIMITIVES G1 — gridprim_a_table_wears_its_colors_and_its_layout.sql (chair's production apply)\",\n  grid_layout: \"GRID-PRIMITIVES G1 — gridprim_a_table_wears_its_colors_and_its_layout.sql (chair's production apply)\",\n  formula_parse: \"GRID-PRIMITIVES G3 — gridprim_a_formula_is_typed_and_the_store_works_it_out.sql (chair's production apply)\",\n  action_declare: \"GRID-PRIMITIVES G2 — gridprim_a_row_action_runs_the_whole_selection_at_once.sql (chair's production apply)\",\n  row_actions: \"GRID-PRIMITIVES G2 — gridprim_a_row_action_runs_the_whole_selection_at_once.sql (chair's production apply)\",\n  action_run: \"GRID-PRIMITIVES G2 — gridprim_a_row_action_runs_the_whole_selection_at_once.sql (chair's production apply)\",\n  table_webhook_declare: \"GRID-PRIMITIVES G4 — gridprim_every_row_change_reaches_the_webhook.sql (chair's production apply)\",\n  table_webhooks: \"GRID-PRIMITIVES G4 — gridprim_every_row_change_reaches_the_webhook.sql (chair's production apply)\",\n  table_webhook_archive: \"GRID-PRIMITIVES G4 — gridprim_every_row_change_reaches_the_webhook.sql (chair's production apply)\",\n  table_from_example: \"GRID-PRIMITIVES G5 — gridprim_a_table_can_start_from_a_real_example.sql (chair's production apply)\",\n  autonumber_backfill: \"GRID-PRIMITIVES G5 — gridprim_a_table_can_start_from_a_real_example.sql (chair's production apply)\",\n  entity_row_write: \"lane 7 W3a — matrx-frontend migrations/campaign/lane7w3a_the_table_api_reaches_crm_people.sql (on the clone; chair's production apply)\",\n  table_list_everywhere: \"GRID-PRIMITIVES G9 — gridprim_every_picker_lists_both_stores.sql (chair's production apply)\",\n  table_sync: \"GRID-PRIMITIVES G10 — gridprim_a_synced_sheet_is_one_table_that_refreshes.sql (chair's production apply)\",\n  scope_table_provision: \"GRID-PRIMITIVES G11 — gridprim_a_scope_provisions_its_table_in_the_store.sql (chair's production apply)\",\n  table_row_counts: \"GRID-PRIMITIVES G12 — gridprim_every_table_counts_its_rows_and_every_row_shows_its_header.sql + its grant file (chair's production apply)\",\n  view_record_order_set: \"GRID-PRIMITIVES G13 — gridprim_a_view_keeps_the_order_a_person_dragged.sql + its grant file (chair's production apply)\",\n  table_share_outside_grant: \"GRID-PRIMITIVES G14 — gridprim_a_known_outsider_is_granted_at_once.sql + gridprim_a_signed_in_person_may_share_with_a_known_outsider.sql (chair's production apply)\",\n  read_records_in_view_order: \"GRID-PRIMITIVES G13 — gridprim_a_view_keeps_the_order_a_person_dragged.sql + its grant file (chair's production apply)\",\n  rule_members_visible: \"S2-PRIME FILTER-GROUPS — filtergroups_a_views_nested_question_is_one_where_clause.sql + its grant file (chair's production apply)\",\n  record_headers: \"GRID-PRIMITIVES G12 — gridprim_every_table_counts_its_rows_and_every_row_shows_its_header.sql + its grant file (chair's production apply)\",\n  pipeline_move_many: \"UI-CHAMPIONS S4 — uichamp_s4_a_selection_moves_and_decides_in_one_call.sql + its grant file (chair's production apply)\",\n  work_decide_many: \"UI-CHAMPIONS S4 — uichamp_s4_a_selection_moves_and_decides_in_one_call.sql + its grant file (chair's production apply)\",\n  portal_form: \"UI-CHAMPIONS S6 — uichamp_s6_a_portal_carries_its_look_and_its_forms.sql + uichamp_s6_a_signed_in_person_may_open_a_portals_look_and_forms.sql (chair's production apply)\",\n  portal_form_submit: \"UI-CHAMPIONS S6 — uichamp_s6_a_portal_carries_its_look_and_its_forms.sql + uichamp_s6_a_signed_in_person_may_open_a_portals_look_and_forms.sql (chair's production apply)\",\n  form_preview_asks: \"FORMS-FIX-1 — formsfix1_the_owners_preview_asks_the_store_the_same_question.sql + its grant file (chair's production apply)\",\n  // Lane PLATFORM-APP-DATA wave 1 (2026-10-02): proven on the nightly clone; they reach the main\n  // database when the chair applies them with Arman watching (new functions + their grant).\n  table_copies_in_progress: \"TABLE-ACTIONS — matrx-frontend migrations/campaign/tableactions_a_table_can_be_duplicated.sql (chair's production apply)\",\n  table_duplicate_continue: \"TABLE-ACTIONS — matrx-frontend migrations/campaign/tableactions_a_table_can_be_duplicated.sql (chair's production apply)\",\n  table_duplicate: \"TABLE-ACTIONS — matrx-frontend migrations/campaign/tableactions_a_table_can_be_duplicated.sql (chair's production apply)\",\n  table_restore: \"TABLE-ACTIONS — matrx-frontend migrations/campaign/tableactions_c_a_table_comes_back_in_passes_too.sql (chair's production apply)\",\n  table_find: \"PLATFORM-APP-DATA — matrx-frontend migrations/campaign/lane12_one_table_is_found_by_its_slug.sql + lane12_the_new_table_and_record_doors_can_be_reached.sql (chair's production apply)\",\n  table_ensure: \"PLATFORM-APP-DATA — matrx-frontend migrations/campaign/lane12_two_first_saves_make_one_table.sql + lane12_the_new_table_and_record_doors_can_be_reached.sql (chair's production apply)\",\n  record_upsert: \"PLATFORM-APP-DATA — matrx-frontend migrations/campaign/lane12_a_record_is_written_or_updated_by_its_key.sql + lane12_the_new_table_and_record_doors_can_be_reached.sql (chair's production apply)\",\n  // Lane VIEWS-AND-FIELDS sublane BL (2026-10-02): the reverse column (REL-9). Proven on the nightly\n  // clone; they reach the main database when the chair applies them, after\n  // visionreach_w4_a_the_store_asks_before_an_agent_changes_a_table.sql (its field_declare body).\n  reverse_columns: \"VIEWS-AND-FIELDS BL — matrx-frontend migrations/campaign/viewsfields_bl_a_link_shows_on_both_tables.sql (chair's production apply)\",\n  reverse_links_many: \"VIEWS-AND-FIELDS BL — matrx-frontend migrations/campaign/viewsfields_bl_a_link_shows_on_both_tables.sql (chair's production apply)\",\n  // Live on Matrx Main since 2026-10-06 (applied through the Supabase MCP); STORE_DOORS lists it at the\n  // next `pnpm records:generate`, until then `listKeyset` asks it as an owed door.\n  read_records_keyset: \"AP3-KEYSET-DOOR — the Supabase MCP migration ap3_keyset_the_page_door_pages_by_cursor (applied 2026-10-06)\",\n  rule_declare:\n    \"W1-RULE — `custom.record_write` writes `data_class = 'record'`, so the ONE write door cannot \" +\n    \"make a Rule record; declaring a Rule (and therefore a DOOR-18 subscription) needs a door of its own\",\n};\n\n/**\n * THE TRUST DOORS, AND WHY THEY ARE A SEPARATE TABLE.\n *\n * `iam.is_external_principal`, the publish binding and the world lane are NOT\n * the record store's. They are the platform's answer to \"who is this person to\n * us?\" and \"does this thing have a public address?\", and W2-TRUST owns them.\n * They live in schema `iam`, so `pnpm records:generate` — which reads `custom`\n * and only `custom` — does not and should not see them.\n *\n * They are therefore named here by hand, once, with the schema they belong to\n * said out loud. A client that pretended they were store doors would be lying\n * about which system answered it: when the world lane is closed, the sentence a\n * person reads is `iam`'s, not the store's.\n */\nexport const TRUST_SCHEMA = \"iam\";\n\nexport const TRUST_DOORS = {\n  /** VIS-31. A signed-in outsider: an account with no NON-personal organization. */\n  isExternalPrincipal: \"is_external_principal\",\n  /** The same answer with the plain-English reason attached. */\n  externalPrincipalCard: \"external_principal_card\",\n  /** EXACTLY the resources Visibility gave that outsider — never \"their organization's\". */\n  externalPrincipalReach: \"external_principal_reach\",\n  /** VIS-32. A record or a view bound to a public address with a declared render mode. */\n  publishBindingCreate: \"publish_binding_create\",\n  publishBindingRevoke: \"publish_binding_revoke\",\n  /** What a SIGNED-OUT visitor resolves. Returns nothing for an invented or revoked address. */\n  resolvePublishBinding: \"resolve_publish_binding\",\n  /** The same resolution plus WHAT the address holds: table | record | dashboard | page | view. */\n  resolvePublishBindingKind: \"resolve_publish_binding_kind\",\n  /** D-15. The one sentence that admits nothing was scanned — one function, so it cannot drift. */\n  worldPublishGapNotice: \"world_publish_gap_notice\",\n  publishToWorld: \"publish_to_world\",\n  worldPublishAdmit: \"world_publish_admit\",\n  claimWorldNamespace: \"claim_world_namespace\",\n} as const;\n\nexport type TrustDoorKey = keyof typeof TRUST_DOORS;\n\nconst DOOR_NAMES = new Set<string>(STORE_DOORS.map((d) => d.name));\n\nexport function doorExists(name: string): boolean {\n  return DOOR_NAMES.has(name);\n}\n\n/**\n * MAY A SCREEN ASK THIS DOOR AT ALL. True when the generated catalog lists it, or the config says\n * this store already has it (`RecordsConfig.knownDoors`). A door that is only OWED is not asked — so\n * before the chair's apply nothing is called and nothing is logged, and on the day the regenerated\n * catalog lists it the same screen starts asking with no code change.\n */\nexport function doorReady(config: { knownDoors?: readonly string[] | undefined } | null | undefined, name: string): boolean {\n  return DOOR_NAMES.has(name) || Boolean(config?.knownDoors?.includes(name));\n}\n\n/** The lane that owes a door the generated catalog does not list yet, or undefined. */\nexport function doorOwedBy(name: string): string | undefined {\n  return OWED_BY[name];\n}\n\n/** The refusal a missing door gets. It always says who owes it. */\nexport function doorAbsent(name: string): RecordsError {\n  return doorAbsentRefusal(name, OWED_BY[name]);\n}\n\n/** The doors this package calls, one place, so the suite can walk them. */\nexport const DOORS = {\n  // THE READ DOOR (DOOR-1). Every read of a record's values goes through these\n  // two and nothing else: they resolve the reader from the session, ask\n  // read access once per set, and mask the fields this reader may not see with a\n  // notice under `_hidden`. Selecting `custom.record` directly is the thing\n  // they exist to replace — it returns rows and fields the store never agreed\n  // this person could see.\n  readRecord: \"read_record\",\n  readRecords: \"read_records\",\n  // THE SAME READ DOOR, ADDRESSED BY AN ID SET. A realtime notice names the exact ids that\n  // moved; before this existed the only door that took them was the PAGE door, so a\n  // three-cell change re-read fifty rows in every watching browser. It is a separate NAME\n  // rather than a sixth argument to `read_records` because adding a defaulted argument to a\n  // live Postgres function makes every existing call ambiguous — `is not unique`. Same\n  // ladder, same level, same masking, same page ceiling.\n  readRecordsByIds: \"read_records_by_ids\",\n  // THE SAME READ DOOR, ADDRESSED BY A QUESTION. `custom.read_records_matching`\n  // takes the store's one filter shape (`RecordFilter` — the object\n  // `platform.saved_view` carries as `filters` and `custom.record_aggregate`\n  // takes as `p_filter`) and narrows the page INSIDE its own query, in the same\n  // WHERE as Visibility. A separate NAME for the same reason as above. It is\n  // what makes a number on a dashboard walkable: the filter is evaluated by\n  // `custom.record_filter_sql`, the one body `custom.agg_sql` also calls, so the\n  // rows it opens are the rows the number counted.\n  readRecordsMatching: \"read_records_matching\",\n  // THE SAME READ DOOR, ASKED FOR ONE PAGE THE STORE SORTED, SEARCHED AND COUNTED (DOOR-SPEED,\n  // 2026-09-25). `custom.read_records_page` takes the same filter, adds a sort (by the words a\n  // person sees on a choice column), a search over the columns this reader may see, a hand-ordered\n  // view's order, and answers the TOTAL of the matching visible set — the record-store twin of the\n  // older store's `get_user_table_data_paginated_v2`, so a grid never reads a whole table to draw\n  // one page. Its documents are built by `read_records_by_ids`. A separate NAME for the reason above.\n  readRecordsPage: \"read_records_page\",\n  // THE SAME PAGE, PAGED BY A CURSOR (AP3-KEYSET-DOOR, 2026-10-06). `custom.read_records_keyset` answers\n  // exactly the rows and order of `read_records_page` (same wall, ladder, mask, filter, search, sort),\n  // but the next page starts AFTER the last row's sort values + id instead of at an offset, so a write\n  // landing mid-read never skips or repeats a row. Each row also carries its `version` and\n  // `organization_id`, and `p_ids` re-reads exactly the named rows. A separate NAME for the reason above.\n  readRecordsKeyset: \"read_records_keyset\",\n  // THE SAME READ DOOR, ADDRESSED BY ABSENCE. Every door above answers LIVE rows\n  // only — each of them hard-codes `and r.deleted_at is null` — so until this one\n  // existed no screen could list an archived record however it was written, and\n  // `record_restore` below had nothing that could reach it (VERIFIER-10 F4).\n  // `custom.read_records_archived` is that body with the sign of one comparison\n  // flipped, plus the two facts only an archive needs: who archived it and when.\n  // A separate NAME for the same reason as its two siblings above.\n  readRecordsArchived: \"read_records_archived\",\n  // DOOR-8, the two clocks. `p_recorded_at` is what the store SAID then;\n  // `p_world_on` is what was TRUE of the world on that date, read out of dated\n  // values. A client that answered either one itself would be guessing.\n  queryRecordAsOf: \"query_record_as_of\",\n  // Rule 10 / test 14: how long value history is kept. The floor is a raise-only knob; the table's\n  // own days never go below it; both refusals are the store's sentences.\n  historyRetention: \"history_retention\",\n  historyRetentionSet: \"history_retention_set\",\n  historyRetentionFloorRaise: \"history_retention_floor_raise\",\n  queryTableAsOf: \"query_table_as_of\",\n  recordWrite: \"record_write\",\n  recordWriteMany: \"record_write_many\",\n  // MANY CHANGES TO ONE TABLE, ONE TRANSACTION (DOOR-SPEED, 2026-09-25). `custom.record_change_many`\n  // takes inserts, updates and archives: inserts through `record_write_many`, every update in ONE\n  // UPDATE statement (each record asked its editor rung, CAS honored), archives through\n  // `record_delete`. One refused change refuses the batch and nothing is saved; the hint names it.\n  recordChangeMany: \"record_change_many\",\n  // A PARENT, THE EDGES IT STANDS ON AND THE ROWS THAT BELONG TO IT — ALL OR NOTHING.\n  // `recordWrite` and `recordWriteMany` are each ONE statement, so a caller that needs a\n  // parent, its provenance edge and its child rows to land together had no door at all: a\n  // loop is N transactions, and a failure on child nineteen leaves a parent standing without\n  // the lines it promised. `custom.record_write_graph` is one statement, so it is one\n  // transaction — and it is not a second write path: it CALLS `custom.record_write_many` for\n  // the rows, `public.assoc_add` for an edge that points out of the store, and\n  // `platform.relation_set` for the parent's own declared relation to its children. Every\n  // guard, every trigger and the same editor rung, once. A refusal anywhere refuses the whole\n  // graph, by name, and nothing is written.\n  recordWriteGraph: \"record_write_graph\",\n  recordUpdate: \"record_update\",\n  // A NEW CHOICE AND THE CELL THAT TAKES IT, ONE TRANSACTION (lane CHOICE-COLUMN-EDIT,\n  // 2026-09-27). `p_add` is `{\"<column key>\": [\"words\", ...]}`: the words are added to that\n  // column's choices through `field_update`'s `options_add` (which needs the right to change\n  // the table's columns), then the cell is saved through `record_update`. Answers the new\n  // version, as `record_update` does.\n  recordUpdateAddingChoices: \"record_update_adding_choices\",\n  // THE FEATURE KNOB `custom/choice_nudge`, resolved for the signed-in person: `ask` (default),\n  // `always_add` or `never_add` — what a choice cell does with words that are not a choice.\n  choiceNudge: \"choice_nudge\",\n  // REMOVING A CHOICE THAT RECORDS HOLD (lane CHOICE-TAILS, 2026-09-27). How many records hold\n  // each choice of a column, and ONE save of the column's choices that also moves, keeps or\n  // clears the cells of each removed one (the column through `field_update`, every cell through\n  // `record_update`); it answers its own undo, which goes back through the same door.\n  fieldChoiceUsage: \"field_choice_usage\",\n  fieldUpdateRehomingChoices: \"field_update_rehoming_choices\",\n  recordDelete: \"record_delete\",\n  recordRestore: \"record_restore\",\n  // CHANGE WHAT A COLUMN HOLDS (FLD-4 / T12; merged-grid review 2, C3). The store converts every\n  // value that converts and keeps each one that does not in the record's `_retired`, with the\n  // reason — neither coerced nor deleted — and records the migration so it can be undone.\n  migrateRetype: \"migrate_retype\",\n  // T5 / REC-21: merge one record into another (values kept as alternates, links moved, the other\n  // archived and aliased), and put any recorded Migration back.\n  migrateMerge: \"migrate_merge\",\n  migrateUndo: \"migrate_undo\",\n  // CORE-VISION (2026-10-10): the structural Migrations a person runs on ONE record from its menu.\n  // Split moves the named values to a new record of the same Table (the original keeps its id);\n  // extract parent copies the named values up into a new record of another Table and puts this\n  // record under it. Both answer a `migration_id` that `migrateUndo` takes. `migrations` lists\n  // the Migration log for one target, newest first.\n  migrateSplit: \"migrate_split\",\n  migrateExtractParent: \"migrate_extract_parent\",\n  migrations: \"migrations\",\n  recordValues: \"record_values\",\n  recordValuesVersioned: \"record_values_versioned\",\n  valueRead: \"value_read\",\n  computedProvenance: \"computed_provenance\",\n  recordApplicability: \"record_applicability\",\n  applicableFields: \"applicable_fields\",\n  fieldOptions: \"field_options\",\n  pickListIndex: \"pick_list_index\",\n  pickListGet: \"pick_list_get\",\n  pickListForSelection: \"pick_list_for_selection\",\n  pickListUpdate: \"pick_list_update\",\n  parityValues: \"parity_values\",\n  tableDeclare: \"table_declare\",\n  // TABLE-CREATE-SPEED-2: a new Table, its Home and its columns in ONE call and ONE transaction.\n  tableCreate: \"table_create\",\n  // GETTING RID OF A TABLE — which is a JOB, NOT A STATEMENT (VERIFIER-11 F3).\n  // `record_delete` above is the store's one soft-delete door and it is right\n  // for a record; aimed at a TABLE it recurses through everything the Table\n  // contains inside one transaction, and that is unbounded by construction. A\n  // person pressing \"Delete this table\" on 1,430 records the product itself\n  // had just imported waited twelve seconds and was told `57014`, \"canceling\n  // statement due to statement timeout … Nothing was changed. Try a smaller\n  // page\" — advice that means nothing when what you are doing is getting rid\n  // of a table. `custom.table_archive` does the same work in passes and\n  // answers each one with numbers, so a screen shows a sentence and a count\n  // instead of a spinner and an SQLSTATE. It is STATELESS, so a run cut in\n  // half resumes exactly where it stopped: there is no job row to lose.\n  tableArchive: \"table_archive\",\n  // A TABLE THE APP'S CODE DEPENDS ON (`code_depends: true`, lane 12 P5) refuses every archive,\n  // rename, move and unmark door; this is the one way through: the typed slug, a reason, a person.\n  tableArchiveDeliberately: \"table_archive_deliberately\",\n  tableRestore: \"table_restore\",\n  // ADDING A COLUMN — the first thing anybody does with a table, and until\n  // 2026-09-19 there was no door for it. A Field is a record (REC-25), so a\n  // screen wrote one with `record_write`; that door writes ONE row with\n  // `data_class = 'record'` and cannot also add the key to the Table record's\n  // `fields` array, which the field guard requires before it accepts any\n  // definition at all. So every \"Add field\" ended on \"the table does not\n  // declare a field called … — declare it there first\". These three doors take\n  // what a person knows — a field type, a name, and for a choice list the\n  // choices themselves — and the STORE turns that into the document its own\n  // guards demand, so every client inherits one answer instead of each one\n  // re-deriving thirteen and getting them wrong.\n  fieldDeclare: \"field_declare\",\n  // TABLE-CREATE-SPEED: a new table's columns in ONE call, each through field_declare, one transaction.\n  fieldDeclareMany: \"field_declare_many\",\n  fieldUpdate: \"field_update\",\n  // F2 D11: what a change of a column's kind will do — the store runs the change and rolls it back.\n  fieldRetypePreview: \"field_retype_preview\",\n  fieldRetire: \"field_retire\",\n  // THE UNDO OF field_retire (lane STORE-RESTORE-DOORS): the set that went together comes back\n  // whole, the Table declares the columns again, and the values never left the records.\n  fieldRestore: \"field_restore\",\n  // DUPLICATE PROPERTY (Notion N5): the copy declared and every record's value copied, in one door.\n  fieldDuplicate: \"field_duplicate\",\n  // CHAIR-ROLLUP-HONEST: is a column a lookup or roll-up reads archived, and which.\n  fieldSourceArchived: \"field_source_archived\",\n  // KINDS-GLUE wave 3 N1: a Table as a kind — its Fields, choices and stamp, as the reader.\n  tableKindFacts: \"table_kind_facts\",\n  // CONFIDENTIAL-BY-ORG-ADMIN (Arman 2026-10-08): a table's level, and the organization admin's two doors.\n  tableLevelFacts: \"table_level_facts\",\n  setTableConfidential: \"set_table_confidential\",\n  setTableOrganization: \"set_table_organization\",\n  // CUSTOM FIELDS ON A STANDARD BUSINESS TABLE. Every door above is keyed by a\n  // custom Table's uuid, and a standard table has no Table record - so until\n  // 2026-09-20 `custom.applicable_fields(org, 'party', null)` answered `22P02\n  // invalid input syntax for uuid` and there was no other way in. These are\n  // keyed by the REGISTRY TOKEN instead, and they are one set for all 643\n  // tables the registry types Entity or Detail. The three value doors are\n  // SECURITY INVOKER in the database on purpose: the standard table's own\n  // row-level security is what decides who may read and write its rows, and a\n  // definer wrapper would replace it with a second access system.\n  entityTable: \"entity_table\",\n  entityFields: \"entity_fields\",\n  // Lane 7 W2: one read of a standard table's Fields (and their choices) across every\n  // organization a list spans — instead of entity_fields + field_options once per organization.\n  entityFieldsAcross: \"entity_fields_across\",\n  entityFieldDeclare: \"entity_field_declare\",\n  entityFieldUpdate: \"entity_field_update\",\n  entityFieldRetire: \"entity_field_retire\",\n  entityFieldRights: \"entity_field_rights\",\n  entityRecordRead: \"entity_record_read\",\n  // AP-4: the custom rows that link to one platform record, paged by an opaque cursor.\n  entityBackLinks: \"entity_back_links\",\n  entityRowWrite: \"entity_row_write\",\n  entityRecordsFind: \"entity_records_find\",\n  tableCapacity: \"table_capacity\",\n  tableStorage: \"table_storage\",\n  promoteTable: \"promote_table\",\n  promoteField: \"promote_field\",\n  promotedFields: \"promoted_fields\",\n  promotedRead: \"promoted_read\",\n  relationTargets: \"relation_targets\",\n  relationOwn: \"relation_own\",\n  // REL-DISP, 2026-09-21. WHAT A RELATION CELL READS, through that column's own\n  // display spec. `custom.record_words` is declared server_only — it takes a bare\n  // record id with no field to scope it — so these are how a screen gets the\n  // words, and they are the ONE way in: three separate copies of \"read tableList,\n  // find title_field, call rowName\" lived in labels.tsx, RelationPicker.tsx and\n  // PortalsPanel.tsx, and none of them could ever have shown two columns joined.\n  // The `_many` door is the batch TAILS-2 recorded as missing (\"there is still no\n  // batch door on the store\"), which is why the browser resolved labels one id at\n  // a time. The ladder is NOT batched: the store asks it per record inside\n  // `custom._words_for`, so batching buys a round trip and never a disclosure.\n  relationWords: \"relation_words\",\n  relationWordsMany: \"relation_words_many\",\n  // CHAIR-EMBEDDED-FIDELITY 14: the same answer plus each record's icon and its table's icon, one call.\n  relationWordsWithIconsMany: \"relation_words_with_icons_many\",\n  // VISION-REACH G1 (2026-10-02). Which records a column of NAMES names — asked once per column by\n  // the import panel and the grid's paste before they write, so a name matching nothing, or two\n  // records, is shown with a choice first. The write doors resolve the same names with the same\n  // matcher (`custom._relation_names_resolve`), so what the screen showed is what is written.\n  relationNamesMatch: \"relation_names_match\",\n  // VIEWS-AND-FIELDS BL (REL-9). The reverse columns of a Table, and a page of records' inbound\n  // links through one of them. Called through `owedDoor` until `pnpm records:generate` lists them.\n  reverseColumns: \"reverse_columns\",\n  reverseLinksMany: \"reverse_links_many\",\n  reverseLinksManyFields: \"reverse_links_many_fields\",\n  relationReverseField: \"relation_reverse_field\",\n  formulaPreview: \"formula_preview\",\n  relationReverseSet: \"relation_reverse_set\",\n  homeAdd: \"home_add\",\n  // CLOSE-LINK (CD-LINK-10): every Home a Table lives in, named for the reader, the declared one first.\n  tableHomesNamed: \"table_homes_named\",\n  recordReparent: \"record_reparent\",\n  containmentChain: \"containment_chain\",\n  storeIsOpen: \"store_is_open\",\n  // DOOR-1, from the screen's side. What level the CALLER holds on the subjects\n  // they name — the one question a screen has to answer BEFORE it draws a\n  // control, and the only one the store had no client answer to.\n  myLevels: \"my_levels\",\n  // DOOR-11. The record's own revision list. A screen that offers an optimistic\n  // save needs the version it LOADED, and the read door answers documents, not\n  // versions — so the version comes from here, once, for the one record being\n  // edited, and never for a whole list.\n  ioRevisions: \"io_revisions\",\n  resolveFirstMatch: \"resolve_first_match\",\n  // The kernels a package-owned Table needs to exist at all: a Home is a record\n  // in the person kernel, a Field is a record in the field kernel (REC-1).\n  personKernelId: \"person_kernel_id\",\n  fieldKernelId: \"field_kernel_id\",\n  ruleKernelId: \"rule_kernel_id\",\n  // And the Table kernel, which is how `tableList` asks the READ DOOR for this\n  // organization's Tables: a Table is a record like any other, so listing them\n  // is `read_records(org, table_kernel_id())` and never a select on a table.\n  tableKernelId: \"table_kernel_id\",\n  // A saved view references its membership Rule, and the STORE decides who is\n  // in it — the screen never re-implements the predicate.\n  pipelineDeclare: \"pipeline_declare\",\n  pipelineRead: \"pipeline_read\",\n  pipelineBoard: \"pipeline_board\",\n  pipelineTransitionRefusal: \"pipeline_transition_refusal\",\n  pipelineMove: \"pipeline_move\",\n  /** Lane S4: many cards, one call, a verdict and a version per card. */\n  pipelineMoveMany: \"pipeline_move_many\",\n  tableStageField: \"table_stage_field\",\n  // STAGE-RULES. A gate can refuse or it can hand the change to the approvals queue; the\n  // closed list is the store's, the knob is the organization's, and what is WAITING on a\n  // card has to be askable or a card that did not move looks like a card nobody dragged.\n  stageRuleOnFailKinds: \"stage_rule_on_fail_kinds\",\n  stageRuleEnforcement: \"stage_rule_enforcement\",\n  recordStagePending: \"record_stage_pending\",\n  pipelinePending: \"pipeline_pending\",\n  pipelineGatePreview: \"pipeline_gate_preview\",\n  ruleMembers: \"rule_members\",\n  ruleMembersVisible: \"rule_members_visible\",\n  ruleMembership: \"rule_membership\",\n  ruleRun: \"rule_run\",\n  ruleEval: \"rule_eval\",\n  // REC-15: the door that makes a Rule a RULE. `custom.record_write` into the\n  // Rule kernel produces a valid Rule document carrying `data_class = 'record'`,\n  // and every reader that goes LOOKING for a Rule looks for the class — so a\n  // subscription written that way was invisible to DOOR-18 and nothing fired.\n  // PRODUCTS row 1 — a form is a view on a real Table. `forms` lists an\n  // organization's own, `formDeclare` writes one, and `anonPublish` is the one\n  // act that opens it to people with no account. The PUBLIC pair\n  // (`custom.form_public`, `custom.form_submit`) is deliberately absent: those\n  // are server-lane doors and a browser never calls them.\n  forms: \"forms\",\n  formDeclare: \"form_declare\",\n  /**\n   * WHICH QUESTIONS THE OWNER'S PREVIEW ASKS NEXT (lane FORMS-FIX-1). The same store answer a\n   * stranger's form gets (`custom._form_questions_asked` → `custom.rule_eval`), behind the\n   * organization wall and the caller's own rung on the Table — never `rule_eval` from a browser.\n   */\n  formPreviewAsks: \"form_preview_asks\",\n  /** TYPEFORM-DUP: the owner's preview of the whole route — jumps, ending, score (`custom._form_route`). */\n  formPreviewRoute: \"form_preview_route\",\n  /** TYPEFORM-DUP: views, starts, completions, drop-off and answers per question. */\n  formResults: \"form_results\",\n  formKnobs: \"form_knobs\",\n  formLookOptions: \"form_look_options\",\n  /** CD-PAGE-08: set, clear or read a public form's password (only its hash is kept). */\n  formSetPassword: \"form_set_password\",\n  // PRODUCTS row 14 — \"let clients book a 30-minute consult\". A booking page IS an\n  // `anon_form`, so it is opened and closed by `anonPublish` like any other; this is\n  // the owner's list of them with the numbers that make it worth opening. The\n  // VISITOR's three (`booking_public`, `booking_hold`, `booking_confirm`) are\n  // deliberately absent: they are server-lane and a browser never calls them.\n  bookings: \"bookings\",\n  // The OWNER's side of a booking page, and the door that had no client method at\n  // all until 2026-09-21: without it the only way to get a booking page was to ask\n  // an agent, which made the agent the ONLY path rather than the faster one.\n  bookingDeclare: \"booking_declare\",\n  // PRODUCTS row 9 — \"pull my spreadsheet in\". W4-IO built `io_import_open` and\n  // `io_import_rows`; lane IMPORT gave a run an IDENTITY (the file's sha-256, so\n  // a re-import doubles nothing), a duplicate key, a policy, per-row outcomes\n  // with the source row on them, and the type inference that reads THIS\n  // organization — an address that belongs to a member is a person, a few\n  // repeating words are a dropdown, a column of names that are all records of\n  // another Table points at it. `importOpen` (the older, narrower way in) is\n  // deliberately absent from this catalog: `importBegin` is a superset and two\n  // ways to start an import from one client is how they drift.\n  importPlan: \"io_import_plan\",\n  importBegin: \"io_import_begin\",\n  importDeclareColumns: \"io_import_declare_columns\",\n  importRows: \"io_import_rows\",\n  importFinish: \"io_import_finish\",\n  importReport: \"io_import_report\",\n  imports: \"io_imports\",\n  importForget: \"io_import_forget\",\n  inferColumn: \"io_infer_column\",\n  // DOOR-19 (P8) — the address a Table owns. `inboundMailLand` is deliberately\n  // absent: it is the mail gateway's door, granted to `service_role` alone and\n  // declared `non_client_lane`, and a browser that could land mail at an\n  // arbitrary address would be writing into any table of any organization.\n  inboundDeclare: \"inbound_declare\",\n  inboundAddresses: \"inbound_addresses\",\n  inboundSet: \"inbound_set\",\n  // THE CLIENT PORTAL, OWNER'S SIDE (VIS-31 / PORTAL). A portal is how somebody\n  // with NO membership is let in to see the records that name them. `portals`\n  // lists them, `portalCard` opens one, `portalDeclare` states what it exposes,\n  // `portalInvite` and `portalRevoke` are the two acts on a person, and\n  // `portalPreview` is \"view as this client\" — it asks `custom.visible_set` for\n  // HER user id, the same call `custom.read_records` makes when she opens the\n  // page, so the preview cannot disagree with what she sees. The CLIENT-side\n  // pair (`custom.portal_public`, `custom.portal_invitation`, `custom.portal_me`)\n  // is deliberately absent here: those belong to the outsider's own shell.\n  portals: \"portals\",\n  // WHICH TABLES EACH PORTAL SHOWS (TAILS-3). The Portals RAIL lives on a\n  // Table's page beside Forms, Bookings and Dashboards, all of which are\n  // table-scoped; `custom.portals` takes no table, so an organization with one\n  // portal over Jobs saw that portal's cards on its Parts table, the empty\n  // state never rendered, and the whole build/ask offer was unreachable\n  // everywhere in that organization. This is the one question the rail has to\n  // ask, under the same wall and read-access gate as `portals` itself.\n  portalTables: \"portal_tables\",\n  tableFacts: \"table_facts\",\n  tablesLiveWhere: \"where_tables_live\",\n  // WHERE A TABLE LIVES, AND MOVING IT (SC-1' / SC-1-TAILS). `table_home` answers only when the\n  // caller may open the Table (custom.where_id_opens) and names its organization FROM THE TABLE;\n  // `table_move` moves it into another organization the caller belongs to, with every Table\n  // inside it, or refuses with one sentence.\n  tableHome: \"table_home\",\n  tableMove: \"table_move\",\n  // MOVING A WHOLE BASE (AT-NOTIFY-MOVE): `base_move` takes the Home and every table in it through `table_move`, then the Home and its base row follow.\n  baseMove: \"base_move\",\n  portalCard: \"portal_card\",\n  portalDeclare: \"portal_declare\",\n  portalInvite: \"portal_invite\",\n  portalRevoke: \"portal_revoke\",\n  portalPreview: \"portal_preview\",\n  // S6 — the CLIENT's two form doors. They are store doors (schema `custom`), called by a\n  // signed-in portal principal, and each refuses anybody who is not a live principal of that\n  // live portal — so, unlike the sign-in pair above, they belong in this table.\n  portalForm: \"portal_form\",\n  portalFormSubmit: \"portal_form_submit\",\n  // ORG-CLEANUP, 2026-09-22 — A PORTAL IS ARCHIVED, NEVER DELETED.\n  // `portals` keeps its signature and HIDES archived portals (the law's default\n  // is to hide); `list_portals(org, 'active'|'archived'|'all')` is the\n  // archive-aware reader, taking the platform archive filter's own three values\n  // so one door serves both lanes and no screen has to invent a second control.\n  // `portal_archive` / `portal_restore` are the way out and the way back; both\n  // take the portal's own title typed back, because ten portals can carry one\n  // title and the title alone is not what picks this one.\n  listPortals: \"list_portals\",\n  portalArchive: \"portal_archive\",\n  portalRestore: \"portal_restore\",\n  // MAKE-HOME wave 6a (2026-10-03) — the archive of forms, booking pages and checklist\n  // templates (CHAIR-DOORS-3B), and the row controls of a custom table (CHAIR-DOORS-2).\n  formArchive: \"form_archive\",\n  formRestore: \"form_restore\",\n  formsArchived: \"forms_archived\",\n  checklistTemplatesArchived: \"checklist_templates_archived\",\n  tableRowDefaults: \"table_row_defaults\",\n  tableRowDefaultsSet: \"table_row_defaults_set\",\n  tableRowDefaultsApply: \"table_row_defaults_apply\",\n  // ROW-LABEL-FORMULA (2026-10-10). The formula a Table names its records by, beside its single title\n  // column: read it back, and set or clear it. Every surface that names a record reads the result.\n  tableRowLabel: \"table_row_label\",\n  tableRowLabelSet: \"table_row_label_set\",\n  recordRowControls: \"record_row_controls\",\n  recordRowControlsSet: \"record_row_controls_set\",\n  // SCR-16 — the canvas. A dashboard is a record in the presentation kernel\n  // whose blocks are saved SPECS for the eighth verb; `dashboardRun` walks them\n  // under the CALLER'S principal, so nothing here is precomputed and nothing is\n  // summed in a browser. `dashboardStuck` is the seventh block kind on its own,\n  // because \"what has not moved in fourteen days\" is a question a screen asks\n  // outside a canvas too.\n  dashboards: \"dashboards\",\n  dashboardDeclare: \"dashboard_declare\",\n  dashboardRun: \"dashboard_run\",\n  dashboardStuck: \"dashboard_stuck\",\n  dashboardDelete: \"dashboard_delete\",\n  // AT-INTERFACE — an Interface opened by anybody it is shared with, and the rows one of its published elements exposes.\n  interfaceRead: \"interface_read\",\n  interfaceRows: \"interface_rows\",\n  // AT-FIX-G1b — one published chart of an Interface drawn for anybody it is shared with (members and outsiders alike).\n  interfaceChart: \"interface_chart\",\n  // PRODUCTS row 10 — \"fill in each company's industry and headcount, and keep\n  // it fresh\". An Enrichment is not an object of its own: it is a Field saying\n  // `source = agent`, with its instruction, inputs, model, confidence floor and\n  // freshness in `source_config` (AGT-6). `enrichCells` is the one a GRID calls —\n  // the badge data for a whole page in one round trip, because a badge asked per\n  // cell is fifty round trips to draw fifty badges. `enrichPin` is the half of\n  // this product that decides whether anybody ever trusts it: the moment a\n  // person types over an agent-owned cell the store pins it, and the next run\n  // leaves it exactly as they left it.\n  // PRODUCTS row 15 — \"let my crew photograph each bin and log the weight on\n  // site\". A capture sheet is the ONE Form object saying `audience = 'crew'`,\n  // opened by `capture_opened_at`; these five are SIGNED-IN doors granted to\n  // `authenticated`, unlike the public form's two, because a crew member has an\n  // account and their own level on the Table is the whole access decision.\n  captureSheetDeclare: \"capture_sheet_declare\",\n  capturePublish: \"capture_publish\",\n  captureSheets: \"capture_sheets\",\n  captureOpen: \"capture_open\",\n  captureSubmit: \"capture_submit\",\n  enrichments: \"enrichments\",\n  enrichDeclare: \"enrich_declare\",\n  enrichDue: \"enrich_due\",\n  enrichCells: \"enrich_cells\",\n  enrichLand: \"enrich_land\",\n  enrichPin: \"enrich_pin\",\n  enrichRuns: \"enrich_runs\",\n  // PRODUCTS row 4 — \"Who changed this price, and can I put it back?\" The\n  // history has been in the store since W3-HIST; until 2026-09-20 the only way\n  // to ask for it was `io_revisions`, which answers a raw uuid for the author\n  // and a list of KEYS for what moved. `recordHistory` answers the person (or\n  // the agent AND the person it acted for), the operation in the word somebody\n  // used, and every field with its before, its after, the Rule version that\n  // produced it and its source. `fieldHistory` is the other half nobody ships:\n  // one column's history across the whole Table.\n  recordHistory: \"record_history\",\n  fieldHistory: \"field_history\",\n  // A worked-out column's history, naming the formula version that produced each answer (CD-FORMULA-08).\n  formulaHistory: \"formula_history\",\n  // THE PUT-IT-BACK THREE. `restorePreview` names what will change BEFORE it\n  // does; `restoreVersion` puts the whole record back and `valueRestore` puts\n  // one column back (HIS-N-2). All three write a NEW version through the\n  // record's own write path — no stored version is ever altered.\n  restorePreview: \"record_restore_preview\",\n  restoreVersion: \"record_restore_version\",\n  valueRestore: \"value_restore\",\n  // SCR-18. The store has had comment doors at the `commenter` rung all along;\n  // these two add the people's NAMES and a mention that reaches somebody.\n  // AGT-N-9 / PRODUCTS row 11 — \"What's the history with this customer?\" A\n  // conversation can be ABOUT one record, and `recordScopeContext` is the ONE\n  // door that answers everything such a chat is allowed to know in a single\n  // round trip: the Fields with their (record, field, value version) triples,\n  // the relations one hop out, the history, the comments and the Table's other\n  // records — every piece assembled INSIDE the database through the read door\n  // under this person's own field-level security. A Field the store masks is\n  // named as withheld with the store's reason and never valued.\n  recordScopeContext: \"record_scope_context\",\n  conversationScope: \"conversation_scope\",\n  conversationScopeBind: \"conversation_scope_bind\",\n  conversationScopeUnbind: \"conversation_scope_unbind\",\n  conversationScopeContext: \"conversation_scope_context\",\n  commentThread: \"comment_thread\",\n  commentCounts: \"comment_counts\",\n  commentWrite: \"comment_write\",\n  commentResolve: \"io_comment_resolve\",\n  // AT-FIX-G2. Follow ONE record: the bell tells the follower when somebody else changes it or comments on it.\n  recordFollowSet: \"record_follow_set\",\n  recordFollowers: \"record_followers\",\n  // The eighth verb (AGT-N-8): a grouped, bucketed, filtered count/sum/avg/\n  // min/max computed INSIDE the read door's own query, so a chart shows exactly\n  // the rows this person may see and never fetches the ones they may not.\n  recordAggregate: \"record_aggregate\",\n  recordAggregateAsOf: \"record_aggregate_as_of\",\n  aggOperations: \"agg_operations\",\n  aggBuckets: \"agg_buckets\",\n  aggCalendar: \"agg_calendar\",\n  // DOOR-18: a subscription is a Rule record carrying a `subscription` block\n  // over a saved view. There is no subscription TABLE and no second notifier.\n  aggSubscriptions: \"agg_subscriptions\",\n  aggSubscriptionCadences: \"agg_subscription_cadences\",\n  // The OWNER's side of DOOR-18. `agg_subscriptions` is the notifier's reader\n  // and is not client-callable; these two are what a person reaches: what am I\n  // being told about, and switch this one off. A form's notify Rule is one of\n  // these rows, so \"tell me when a patient arrives\" can also be un-told.\n  subscriptions: \"subscriptions\",\n  subscriptionMute: \"subscription_mute\",\n  // The two DOOR-18 acts that had no door at all until 2026-09-20: WRITE a\n  // subscription (a Rule is declared, never written as a record — REC-72) and SEE\n  // the summary it would send right now without sending it.\n  subscriptionDeclare: \"subscription_declare\",\n  subscriptionPreview: \"subscription_preview\",\n  // A SUBSCRIPTION IS OVER A SAVED VIEW, so a person who has never saved one has\n  // nothing to subscribe to. These two are the saved-view pair (lane DIGESTS'\n  // `digests_a_saved_view_has_a_door.sql`), unreachable from this client until\n  // 2026-09-21: `views` lists this Table's, `viewDeclare` writes one. A LIST IS A\n  // DOOR, never a grant on `platform.saved_view` behind it.\n  views: \"views\",\n  viewDeclare: \"view_declare\",\n  // ROW-TEMPLATES (2026-10-04): a Table's row templates — list (viewer), declare/archive (editor).\n  rowTemplates: \"row_templates\",\n  rowTemplateDeclare: \"row_template_declare\",\n  // VIEW-SWITCH-NOT-DESIGNATION (2026-09-25): how a Table opens is designated by an EDITOR through\n  // this one door; `view_declare` refuses the default view's layout and is_default by name.\n  viewDesignate: \"view_designate\",\n  // VIEW-LOOK (lane VIEW-STATE-PERSONAL, VERIFIER-23 item 1, 2026-09-25): how ONE person is looking at\n  // a shared view — its grouping, date field, sort, filter, hidden columns, widths, layout — is her\n  // own look until an editor saves it onto the view (`view_declare`). Viewer on the Table.\n  viewLookRead: \"view_look_read\",\n  viewLookSet: \"view_look_set\",\n  // The cadence CATALOG a person's screen may ask for. `agg_subscription_cadences`\n  // above is the notifier's own and holds no client grant; this door delegates to\n  // it, so a picker and the digest runner can never offer different words.\n  subscriptionCadences: \"subscription_cadences\",\n  // The doc doors: a template is saved, a render is written once and frozen,\n  // and a signature is checked against the exact bytes that were signed.\n  docTemplateSave: \"doc_template_save\",\n  docRenderBody: \"doc_render_body\",\n  docRenderDocument: \"doc_render_document\",\n  docTokens: \"doc_tokens\",\n  docUnresolvedTokens: \"doc_unresolved_tokens\",\n  docSign: \"doc_sign\",\n  // THE SEAL IS ASKED THROUGH ITS OWN DOOR. `custom.doc_signature_intact` is the INTERNAL\n  // half of this pair — SECURITY INVOKER over a doors-only table, so a browser that calls it\n  // gets `42501 permission denied for table doc_signature`, which is what every SignBlock\n  // seal check got until 2026-09-22 (FIX-10B). `custom.doc_signature_read` is the definer\n  // door built for a client: it asks may_reach and may_open on the RECORD by name and\n  // returns the seal AND the verdict in one answer, because a seal a person can read and a\n  // verdict they cannot is how a changed agreement keeps wearing somebody's signature.\n  docSignatureRead: \"doc_signature_read\",\n  // THE PLURAL ACTS. Until 2026-09-20 this package read `custom.doc_template`,\n  // `custom.doc_render` and `custom.doc_signature` with a direct PostgREST\n  // `.from()`, and all three hold NO client SELECT — so every list in product #5\n  // opened on \"permission denied for view doc_template\". A list is a DOOR, never\n  // a grant on the thing behind it (DOORS-TWO).\n  docTemplates: \"doc_templates\",\n  docTemplateDelete: \"doc_template_delete\",\n  docTemplateRestore: \"doc_template_restore\",\n  // A saved document has a way out (FS4, 2026-10-23): soft, editor on its record, undone by restore.\n  docRenderDelete: \"doc_render_delete\",\n  docRenderRestore: \"doc_render_restore\",\n  docRenders: \"doc_renders\",\n  docSignatures: \"doc_signatures\",\n  // THE ANONYMOUS LANE (W4-ANON). It landed, and it landed as SEVEN doors\n  // rather than the one this package had guessed at: a token is issued and\n  // verified separately from the write it authorises, a form is published\n  // separately from being declared, and an offline capture by a SIGNED-IN\n  // person is a different door from a write by a stranger.\n  //\n  // This package used to name a door `anon_record_write`, which never existed —\n  // so `FormRunner` told every person that the public link was \"pending\" for a\n  // lane that had already shipped. A screen calling a live feature pending is\n  // the same silent failure as a screen calling a missing one live, and the fix\n  // is to name the doors the store actually has.\n  anonTokenIssue: \"anon_token_issue\",\n  anonTokenVerify: \"anon_token_verify\",\n  anonTokenRevoke: \"anon_token_revoke\",\n  /** The stranger's write. The TOKEN names the organization; a caller never does. */\n  anonWrite: \"anon_write\",\n  /** SCR-30. The signed-in OFFLINE path: the client mints the key, the store dedupes on it. */\n  anonCapture: \"anon_capture\",\n  anonPublish: \"anon_publish\",\n\n  // WORK (W4-WORK): a template instantiated as real records, whose turn it is,\n  // and a slot somebody is holding. `ChecklistRunner` and `BookingSlots` are\n  // screens over these and hold no state of their own.\n  workStates: \"work_states\",\n  workTemplateDeclare: \"work_template_declare\",\n  workTemplateInstantiate: \"work_template_instantiate\",\n  workTemplateShape: \"work_template_shape\",\n  /** Why a graph would be refused — asked BEFORE it is written, never after. */\n  workTemplateRefusal: \"work_template_refusal\",\n  workWhoseTurn: \"work_whose_turn\",\n  workTakeAssignment: \"work_take_assignment\",\n  workHasAssignment: \"work_has_assignment\",\n  workAssignmentFields: \"work_assignment_fields\",\n  workTransitionRefusal: \"work_transition_refusal\",\n  workInstantiationShape: \"work_instantiation_shape\",\n  workSlotsDeclare: \"work_slots_declare\",\n  workSlotHold: \"work_slot_hold\",\n  workSlotRelease: \"work_slot_release\",\n  workSlotHolds: \"work_slot_holds\",\n  workSlotExpire: \"work_slot_expire\",\n\n  // THE WORK LAYER'S OWN DOORS (lane WORK-DOORS, 2026-09-20). Until this lane\n  // all nineteen `custom.work_*` functions were SECURITY INVOKER with no client\n  // grant: REC-69, REC-70 and REC-71 were live in the store and unreachable\n  // from a browser. These are the verbs a person actually uses.\n  workPerson: \"work_person\",\n  workAssign: \"work_assign\",\n  workRecordStates: \"work_record_states\",\n  workSetState: \"work_set_state\",\n  workList: \"work_list\",\n  workTemplates: \"work_templates\",\n  /** THE ONE QUEUE: assignments, approvals and the agent's proposals together. */\n  workInbox: \"work_inbox\",\n  workApprovalApprovers: \"work_approval_approvers\",\n  workApprovalRequest: \"work_approval_request\",\n  workApprovalMayDecide: \"work_approval_may_decide\",\n  workApprovalDecide: \"work_approval_decide\",\n  /** Lane S4: many inbox decisions, one call, a verdict per item. */\n  workDecideMany: \"work_decide_many\",\n  /** Lane S5-PRIME-2: one person's own inbox state — snooze, clear, and the counts. */\n  inboxSnooze: \"inbox_snooze\",\n  inboxUnsnooze: \"inbox_unsnooze\",\n  inboxClear: \"inbox_clear\",\n  inboxUnclear: \"inbox_unclear\",\n  inboxCounts: \"inbox_counts\",\n  workApprovalRead: \"work_approval_read\",\n\n  // PRODUCTS row 13 — checklists and SOP runs.\n  checklistRefusal: \"checklist_refusal\",\n  checklistDeclare: \"checklist_declare\",\n  checklistTemplates: \"checklist_templates\",\n  checklistTemplateShape: \"checklist_template_shape\",\n  checklistStart: \"checklist_start\",\n  checklistRun: \"checklist_run\",\n  checklistRuns: \"checklist_runs\",\n  checklistStepComplete: \"checklist_step_complete\",\n  checklistStepRefusal: \"checklist_step_refusal\",\n\n  // THE GRID (lane GRID-PRIMITIVES, 2026-09-22) — what the /data grid rebuild calls. See ../grid.ts.\n  tableDecorate: \"table_decorate\",\n  tableDecorations: \"table_decorations\",\n  gridLayout: \"grid_layout\",\n  formulaParse: \"formula_parse\",\n  actionDeclare: \"action_declare\",\n  rowActions: \"row_actions\",\n  actionRun: \"action_run\",\n  // NOTION-PROPS-2/3 — a button column pressed on a row; the timeline dependency knob.\n  buttonPress: \"button_press\",\n  timelineDependencyShift: \"timeline_dependency_shift\",\n  recordsLimits: \"records_limits\",\n  // AUTOMATION-DOOR (2026-10-07) — automations on a table. See ../automation.ts.\n  automationDeclare: \"automation_declare\",\n  automations: \"automations\",\n  automationArchive: \"automation_archive\",\n  automationRestore: \"automation_restore\",\n  automationSetEnabled: \"automation_set_enabled\",\n  automationRuns: \"automation_runs\",\n  // AUTOMATIONS-AIRTABLE (2026-10-10) — run one automation once now on a picked row.\n  automationTest: \"automation_test\",\n  // AT-AUTO2 (2026-10-15) — every save of an automation, and restoring one.\n  automationRevisions: \"automation_revisions\",\n  automationRevisionRestore: \"automation_revision_restore\",\n  tableWebhookDeclare: \"table_webhook_declare\",\n  tableWebhooks: \"table_webhooks\",\n  tableWebhookArchive: \"table_webhook_archive\",\n  tableFromExample: \"table_from_example\",\n  autonumberBackfill: \"autonumber_backfill\",\n  // AT-SHARE-B (2026-10-17) — a Person column's \"Notify people when they're added\" switch (two automations).\n  fieldNotifyOnAssign: \"field_notify_on_assign\",\n  ioExport: \"io_export\",\n  tableListEverywhere: \"table_list_everywhere\",\n  dataHomeTables: \"data_home_tables\",\n  // CLOSE-LINK (2026-10-23): the same rows as ONE jsonb value, which PostgREST's 1,000-row cut never touches.\n  dataHome: \"data_home\",\n  adminAllTables: \"admin_all_tables\",\n  tableSync: \"table_sync\",\n  tableCopySync: \"table_copy_sync\",\n  tableSyncSettingsSet: \"table_sync_settings_set\",\n  scopeTableProvision: \"scope_table_provision\",\n  tableRowCounts: \"table_row_counts\",\n  recordHeaders: \"record_headers\",\n  viewRecordOrderSet: \"view_record_order_set\",\n  readRecordsInViewOrder: \"read_records_in_view_order\",\n  tableShareOutsideGrant: \"table_share_outside_grant\",\n\n  // FIND ONE TABLE, FIND-OR-MAKE ONE, WRITE-OR-UPDATE A RECORD BY ITS KEY (lane PLATFORM-APP-DATA).\n  // Called through `owedDoor` in client.ts: on a store whose generated catalog does not list them\n  // yet they are still ASKED, and a store that answers \"no such function\" is turned into this\n  // package's `door_absent` (naming the owing file above) — so the clone, which has them, works,\n  // and the main database, which does not yet, refuses by name.\n  // DUPLICATE A TABLE (lane TABLE-ACTIONS): a new Table with the source's fields, choice lists,\n  // views and (when asked) records, every id inside them remapped to the copy. Owed until the\n  // chair applies it; asked through `owedDoor` like the three below.\n  tableDuplicate: \"table_duplicate\",\n  tableDuplicateContinue: \"table_duplicate_continue\",\n  // AT-BASE — the last step of Duplicate base: the copies' links point at each other.\n  baseCopyFinish: \"base_copy_finish\",\n  // COPY-EXTRAS — the one step that carries a copied table's automations (OFF) and pages onto its copy.\n  copyTableExtras: \"copy_table_extras\",\n  tableCopiesInProgress: \"table_copies_in_progress\",\n  tableFind: \"table_find\",\n  // ONE CALL FOR EVERY ORGANIZATION (custom-experience lane F, 2026-10-19): table_find across many.\n  tableFindMany: \"table_find_many\",\n  tableEnsure: \"table_ensure\",\n  recordUpsert: \"record_upsert\",\n\n  // Declared here BECAUSE they do not exist yet: naming them is what makes the\n  // absence visible to `pnpm check:store-registry` and to the suite.\n  ruleDeclare: \"rule_declare\",\n  fieldPropose: \"field_propose\",\n  tablePropose: \"table_propose\",\n  mergeFieldResolve: \"merge_field_resolve\",\n} as const;\n\nexport type DoorKey = keyof typeof DOORS;\n\n/** Which of this package's doors the live store actually has, and which it does not. */\nexport function doorCensus(): { present: string[]; absent: string[] } {\n  const present: string[] = [];\n  const absent: string[] = [];\n  for (const name of Object.values(DOORS)) {\n    (doorExists(name) ? present : absent).push(name);\n  }\n  return { present: present.sort(), absent: absent.sort() };\n}\n","// src/recordType.ts — @ai-matrx/records · lane CLOSE-CORE (CD-CORE-15, acceptance test 8 \"Type field\")\n//\n// A TABLE WHOSE TYPE FIELD DECIDES ITS COLUMNS. A Shape table whose Kind is its type field: a Circle has a\n// Radius, a Rectangle a Width and a Height. Which columns one record has is the STORE's answer\n// (`custom.applicable_fields` with that record's type, `client.fields({ recordType })`); these helpers are only\n// the pure facts a screen needs around that answer:\n//   · which type a record IS (its type field's value),\n//   · the question a table's OWN screens ask (`EVERY_RECORD_TYPE`: the grid's columns, Column settings,\n//     filters list Radius and Width side by side), and\n//   · whether a column a screen already holds applies to a record's type, so a grid draws a Rectangle's Radius\n//     cell as \"does not apply\" instead of an empty box that invites a value the store would put away.\n\n/** Anything that names the record types it applies to: a Field, or one of its Rules. */\nexport interface NamesRecordTypes {\n  applies_to_types?: readonly string[] | null | undefined;\n}\n\n/** Asked of `client.fields` / `useFields`: every column of the table, whichever record types it applies to. */\nexport const EVERY_RECORD_TYPE = \"*\";\n\n/** The words of a type as a person may have written them: \"Big circle\", \"big_circle\" and \"BIG-CIRCLE\" agree. */\nfunction typeWord(value: string): string {\n  return value.trim().toLowerCase().replace(/[\\s_-]+/g, \" \");\n}\n\n/**\n * The record type of one record: the value of its table's type field (a choice's key), or undefined when the\n * table has no type field or the record has no type yet. A list value reads as its first choice.\n */\nexport function recordTypeOf(\n  table: { type_field?: string | null | undefined } | null | undefined,\n  document: Record<string, unknown> | null | undefined,\n): string | undefined {\n  const key = table?.type_field;\n  if (!key || !document) return undefined;\n  const raw = document[key];\n  const value = Array.isArray(raw) ? raw[0] : raw;\n  return typeof value === \"string\" && value.trim() !== \"\" ? value : undefined;\n}\n\n/** A column every record has (it names no record types). */\nexport function fieldAppliesToEveryType(field: NamesRecordTypes): boolean {\n  return !Array.isArray(field.applies_to_types) || field.applies_to_types.length === 0;\n}\n\n/**\n * Whether a column applies to a record of this type. A column that names no types applies to every record; one\n * that names types applies only to a record whose type is one of them, compared as words (the store also\n * matches a choice's id, so a column declared by option id may read as applying here only after the store says\n * so — a screen asks the store when it matters).\n */\nexport function fieldAppliesToType(field: NamesRecordTypes, recordType: string | null | undefined): boolean {\n  if (fieldAppliesToEveryType(field)) return true;\n  if (recordType === undefined || recordType === null || recordType === \"\") return false;\n  if (recordType === EVERY_RECORD_TYPE) return true;\n  const wanted = typeWord(recordType);\n  return (field.applies_to_types ?? []).some((t) => typeof t === \"string\" && typeWord(t) === wanted);\n}\n\n/** The record types a column names, as they were written. Empty for a column every record has. */\nexport function typesOfField(field: NamesRecordTypes): string[] {\n  return fieldAppliesToEveryType(field) ? [] : (field.applies_to_types ?? []).filter((t): t is string => typeof t === \"string\");\n}\n","// src/aggregate.ts — @ai-matrx/records\n//\n// THE EIGHTH VERB (AGT-N-8). `custom.record_aggregate` groups, buckets, filters\n// and measures INSIDE the read door's own query: the aggregate node sits above\n// the join to `custom.query_visible_ids`, so a chart is computed over the rows\n// this principal may see and the rest are never fetched at all.\n//\n// That is why a chart in this platform is not \"read everything, then sum in the\n// browser\". Summing in the browser would either read rows a person may not see\n// or quietly under-count them, and both of those are a screen telling a lie.\n\nimport type { HiddenFieldNotice } from \"./record\";\nimport type { RuleExpression } from \"./rule\";\n\n/** The measures the store offers. Asked of `custom.agg_operations()` at run time too. */\nexport type AggregateOperation =\n  | \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\"\n  /** GRID-PRIMITIVES G1: the summary bar's other four. Blank = no value, JSON null or \"\". */\n  | \"median\" | \"filled\" | \"empty\" | \"unique\"\n  /**\n   * Notion's calculation row (Spaces N6): the share of the rows asked with no value / a value, as a\n   * percent 0..100 (NULL over no rows); and the RANGE, largest minus smallest (a date column: the days\n   * between its earliest and latest moment).\n   */\n  | \"percent_empty\" | \"percent_filled\" | \"range\";\n\n/** The periods a date Field can be bucketed into (`custom.agg_buckets()`). */\nexport type AggregateBucket = \"day\" | \"week\" | \"month\" | \"quarter\" | \"year\";\n\n/**\n * A HALF-OPEN MOMENT WINDOW: `from` is inclusive, `to` is exclusive. Half-open\n * is the only shape that makes \"September\" and \"October\" meet exactly once —\n * an inclusive `to` either double-counts the boundary moment or drops it,\n * depending on the reader, and both of those are a chart telling a lie.\n */\nexport interface AggregateWindow {\n  from?: string | null;\n  to?: string | null;\n}\n\n/**\n * ONE FILTER VALUE, as `custom.record_aggregate` and `custom.dashboard_run`\n * both read it: a SCALAR is an equality, and an OBJECT is a window. It is not\n * `unknown` on purpose — a filter value the store cannot read is a refusal a\n * caller should get from the compiler, not from the database.\n */\nexport type AggregateFilter = string | number | boolean | null | AggregateWindow;\n\n/**\n * 🚨 THE STORE'S ONE FILTER SHAPE, AND THE ONLY NAME FOR IT.\n *\n * An object of Field key -> value. A scalar is an equality, `null` is UNSET\n * (the third state of a tick box), an object is a half-open time window.\n *\n * It is not the aggregate's private shape and never was. `platform.saved_view`\n * has carried exactly this as `definition -> 'filters'` across five live\n * surface keys since DOOR-18; `custom.view_declare` writes it;\n * `custom.agg_view_admits` reads it to decide whether a change belongs to a\n * saved view; `custom.record_aggregate` takes it as `p_filter` to COMPUTE a\n * dashboard number; and `custom.read_records_matching` takes it to OPEN the\n * rows behind that number. One `custom.record_filter_sql` in the database turns\n * it into SQL for the last two, so the number and the rows cannot disagree.\n *\n * Invent a second one and a chart can compute a total whose drill-through\n * lands somewhere else, which is the only way a drill-through can lie.\n */\nexport type RecordFilter = Record<string, AggregateFilter>;\n\n/**\n * S2-PRIME FILTER-GROUPS — A READ DOOR'S QUESTION, IN EITHER OF ITS TWO SHAPES.\n *\n * The flat `RecordFilter` above (field key → scalar / `null` / window, AND only) is what\n * dashboards, drill-throughs and the notifier carry. A `RuleExpression` — `{op, args}`, ALL / ANY /\n * NOT groups nested to any depth, fields by id — is what the condition builder, a view's own\n * filter and every membership Rule speak. `custom.record_filter_sql(org, table, filter)` turns\n * EITHER into the one WHERE clause the grid (`list`), the aggregate and the board all use, so the\n * three can never disagree about which records a view holds.\n */\nexport type StoreFilter = RecordFilter | RuleExpression;\n\n/**\n * Is this filter a Rule expression? The store's own test (`custom.filter_is_rule`): an object\n * whose `op` is a word and which carries `args`.\n */\nexport function isRuleFilter(filter: unknown): filter is RuleExpression {\n  if (!filter || typeof filter !== \"object\" || Array.isArray(filter)) return false;\n  const node = filter as { op?: unknown; args?: unknown };\n  return typeof node.op === \"string\" && Array.isArray(node.args);\n}\n\n/** One measure. `count` counts rows and needs no Field; the rest read one. */\nexport interface AggregateMeasure {\n  op: AggregateOperation;\n  /** The Field's key. Required for every operation except `count`. */\n  key?: string;\n}\n\n/**\n * One row of an aggregate: which group it is, what each measure came to, and\n * how many records it was worked out from. The measure keys are the store's\n * own (`count`, `sum_amount`, `avg_amount`, …), never renamed on the way out.\n */\n/**\n * One group's key, as the column holds it (CHAIR-SHEET-STORE b): a number column's key is a number, a\n * yes/no column's true/false, a date its ISO text, a date period its first moment, everything else text.\n */\nexport type AggregateGroupValue = string | number | boolean | null;\n\nexport interface AggregateRow {\n  groups: Record<string, AggregateGroupValue>;\n  measures: Record<string, number | null>;\n  /**\n   * AGG-WITHHELD — a measure over a column this reader may not read is `null` in `measures` (the\n   * \"no value\" every number reader already handles) and its reason rides HERE by measure name: the\n   * same notice a withheld cell carries (`reason`, `needs`, `or`) plus the store's own sentence in\n   * `says`. The store never errors a read for a withheld column; it says so. A question that\n   * GROUPS or FILTERS by such a column answers one row with every measure null and `row_count` 0.\n   * Absent when nothing was withheld.\n   */\n  withheld?: Record<string, HiddenFieldNotice & { says?: string; label?: string; field_key?: string }>;\n  row_count: number;\n  /**\n   * S3 — present only when the question carried a comparison. The same group\n   * in the PRIOR window: a bucket is matched by its position in its own window\n   * (week 1 of September beside week 1 of August), so `prior_groups` names the\n   * prior bucket's own date. `null` when the prior window had no such group.\n   */\n  prior_groups?: Record<string, string | null> | null;\n  /** The prior window's measures, keyed exactly like `measures`. */\n  prior_measures?: Record<string, number | null> | null;\n  prior_row_count?: number | null;\n  /** Every measure now and before, the change, and the change as a percent of before. */\n  delta?: Record<string, AggregateDelta> | null;\n  /** The two windows this row was worked out over, and the calendar that cut them. */\n  compare?: AggregateCompareWindows | null;\n  /**\n   * S3 — a compared, bucketed row's POSITION in its window (0 = the first\n   * bucket). A row the current window has not reached yet has a position and\n   * no current bucket, so a chart names it \"Week 6\" rather than inventing a date.\n   */\n  position?: number | null;\n}\n\n/**\n * S3 — WHAT A PERIOD IS COMPARED AGAINST (`custom.agg_compare_kinds()`).\n * `previous_period` is the period before, of the same length (August before\n * September; an explicit window shifted back by its own length);\n * `same_period_last_year`; `range` is a fixed `baseline`.\n */\nexport type AggregateCompareKind = \"previous_period\" | \"same_period_last_year\" | \"range\";\n\n/**\n * S3 — ONE COMPARISON, as `custom.record_aggregate(p_compare)` and a\n * dashboard block's `compare` both take it. The current window is either the\n * calendar `period` holding `at` (default: now, in the organization's time\n * zone) or an explicit `from`/`to`. A date alone (\"2026-09-01\") is that local\n * day in the organization's time zone.\n */\nexport interface AggregateCompare {\n  against?: AggregateCompareKind;\n  /** The date Field the period runs along. Defaults to the bucket's key. */\n  key?: string;\n  period?: AggregateBucket;\n  at?: string;\n  from?: string;\n  to?: string;\n  /** Compare the part of the period that has happened (\"month to date\"). */\n  to_date?: boolean;\n  /** The fixed period `range` compares against. Half-open: `to` is excluded. */\n  baseline?: { from: string; to: string };\n}\n\n/** One measure now and before. `change_pct` is null when before was nothing or zero. */\nexport interface AggregateDelta {\n  current: number | null;\n  prior: number | null;\n  change: number | null;\n  change_pct: number | null;\n}\n\n/**\n * S3 — THE TWO WINDOWS the store actually ran, as local ISO moments with the\n * organization's offset (\"2026-09-01T00:00:00-07:00\"), and the calendar that\n * cut them. A screen labels the comparison from THIS, never from its own clock.\n */\nexport interface AggregateCompareWindows {\n  key: string;\n  against: AggregateCompareKind;\n  period: AggregateBucket | null;\n  to_date: boolean;\n  time_zone: string;\n  week_start: string;\n  /** The bucket grain the windows were counted in, when the question had a bucket. */\n  grain: AggregateBucket | null;\n  /** How many buckets the current window holds — what a target's pace is shared over. */\n  bucket_count: number | null;\n  window: { from: string; to: string };\n  prior_window: { from: string; to: string };\n  /** On a row from `recordAggregate`: that row's bucket position (see `AggregateRow.position`). */\n  position?: number | null;\n}\n\n/** The measure key the store answers with, so a chart can find its own series. */\nexport function measureKey(measure: AggregateMeasure): string {\n  return measure.op === \"count\" ? \"count\" : `${measure.op}_${measure.key ?? \"\"}`;\n}\n\n/**\n * THE QUESTION, AS A STABLE STRING — key-sorted JSON of a `RecordFilter`.\n *\n * A React parent that rebuilds `{ status: \"Cancelled\" }` on every render hands\n * a NEW object every time, and a hook that depends on the object re-reads the\n * whole page on every render forever. Depending on this instead means the page\n * is re-read exactly when the QUESTION changed, which is what a person means.\n *\n * Nested window objects are sorted too, so `{from, to}` and `{to, from}` are\n * one question. `undefined` and an empty filter are both `\"{}\"` — the caller\n * asked nothing, and there is only one way to ask nothing.\n */\nexport function stableFilterKey(filter: StoreFilter | null | undefined): string {\n  if (!filter) return \"{}\";\n  // A Rule expression is ORDERED — the evaluator asks its arguments in order — so its own JSON is\n  // already the question; only a flat map's keys need sorting.\n  if (isRuleFilter(filter)) return JSON.stringify(filter);\n  const keys = Object.keys(filter).sort();\n  if (keys.length === 0) return \"{}\";\n  const parts = keys.map((key) => {\n    const value = filter[key];\n    if (value !== null && typeof value === \"object\") {\n      const window = value as AggregateWindow;\n      return `${JSON.stringify(key)}:{\"from\":${JSON.stringify(window.from ?? null)},\"to\":${JSON.stringify(window.to ?? null)}}`;\n    }\n    return `${JSON.stringify(key)}:${JSON.stringify(value ?? null)}`;\n  });\n  return `{${parts.join(\",\")}}`;\n}\n\n/**\n * AGG-WITHHELD — the store's answer, with the withheld state lifted out of `measures`.\n * `custom.record_aggregate` puts a withheld measure's notice under `measures._withheld`\n * (null beside it); no consumer should ever meet that key among the numbers, so the one door\n * that reads the answer moves it to `row.withheld` and zeroes a count the store left out.\n */\nexport function liftWithheld(rows: AggregateRow[]): AggregateRow[] {\n  // HONEST-REFUSALS 2 — the store says the withheld explanation ONCE, on the first row's `measures._withheld`\n  // (older answers repeated it on every row). Whichever row carries it, every row of the answer gets the same\n  // `withheld`, so a total or a chart reads `row.withheld` exactly as before.\n  let shared: unknown;\n  for (const row of rows) {\n    const m = ((row.measures ?? {}) as Record<string, unknown>)[\"_withheld\"];\n    if (m !== undefined && m !== null && typeof m === \"object\") {\n      shared = m;\n      break;\n    }\n  }\n  return rows.map((row) => {\n    const measures = (row.measures ?? {}) as Record<string, unknown>;\n    const own = measures[\"_withheld\"];\n    const marker = own !== undefined && own !== null && typeof own === \"object\" ? own : shared;\n    const rowCount = (row.row_count as number | null) ?? 0;\n    if (marker === undefined || marker === null || typeof marker !== \"object\") {\n      return rowCount === row.row_count ? row : { ...row, row_count: rowCount };\n    }\n    const { _withheld: _drop, ...rest } = measures;\n    const withheld: NonNullable<AggregateRow[\"withheld\"]> = {};\n    for (const [name, raw] of Object.entries(marker as Record<string, unknown>)) {\n      const m = (raw ?? {}) as { withheld?: Partial<HiddenFieldNotice>; says?: string; label?: string; field_key?: string };\n      withheld[name] = {\n        reason: m.withheld?.reason ?? null,\n        needs: m.withheld?.needs ?? null,\n        or: m.withheld?.or ?? null,\n        ...(m.says ? { says: m.says } : {}),\n        ...(m.label ? { label: m.label } : {}),\n        ...(m.field_key ? { field_key: m.field_key } : {}),\n      };\n    }\n    return { ...row, measures: rest as Record<string, number | null>, withheld, row_count: rowCount };\n  });\n}\n\n/**\n * ROLLUP-FILTER (2026-10-18) — SEVERAL VALUES FOR ONE COLUMN, IN A FLAT FILTER.\n *\n * Beside a single value (`{status: \"Paid\"}`) and a window (`{paid_on: {relative: \"this_month\"}}`), a\n * column of a flat filter (a roll-up's `config.filter`, a saved view's filters) takes\n *   - an any-of list   `{status: [\"Sent\", \"Overdue\"]}`              (the store's list branch, has_any)\n *   - a not-in form    `{status: {not: [\"Draft\", \"Cancelled\"]}}`    (one word works too; list question is_not)\n * Each word is a choice's key or label, any case. This is the ONE reading of that grammar for the TypeScript\n * twins of `custom.record_filter_sql` (the memory world, the template checker); the store's own is the SQL.\n * A blank cell is none of the words, so a not-in form keeps it.\n */\nexport type FilterWords = { mode: \"any\" | \"none\"; words: string[] };\n\n/** `{not: ...}` / a list as the words it asks about, or `null` when the value is neither (a scalar, a window, null). */\nexport function filterWordsOf(want: unknown): FilterWords | null {\n  const strings = (v: unknown): string[] | null => {\n    if (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") return [String(v)];\n    if (Array.isArray(v) && v.every((x) => typeof x === \"string\" || typeof x === \"number\" || typeof x === \"boolean\")) return v.map(String);\n    return null;\n  };\n  if (Array.isArray(want)) {\n    const words = strings(want);\n    return words ? { mode: \"any\", words } : null;\n  }\n  if (want && typeof want === \"object\") {\n    const o = want as Record<string, unknown>;\n    const keys = Object.keys(o);\n    if (keys.length === 1 && keys[0] === \"not\") {\n      const words = strings(o[\"not\"]);\n      return words ? { mode: \"none\", words } : null;\n    }\n  }\n  return null;\n}\n\n/**\n * Does a cell (one value, a list, or nothing) satisfy an any-of / not-in question? `aliases` maps a word to the other\n * words that name the same choice (its key and label), so a filter written with the key reads a cell kept as the label.\n */\nexport function cellMatchesWords(cell: unknown, q: FilterWords, aliases?: (word: string) => readonly string[]): boolean {\n  const cellWords = (Array.isArray(cell) ? cell : [cell])\n    .filter((x) => x !== null && x !== undefined && String(x).trim() !== \"\")\n    .map((x) => String(x).trim().toLowerCase());\n  const asked = new Set(q.words.flatMap((w) => [w, ...(aliases?.(w) ?? [])]).map((w) => w.trim().toLowerCase()));\n  const hit = cellWords.some((w) => asked.has(w));\n  return q.mode === \"any\" ? hit : !hit;\n}\n","// src/archive.ts — @ai-matrx/records · THE ARCHIVE, HEADLESS\n//\n// 🚨 THE DEFECT THIS EXISTS FOR (VERIFIER-10 F4, measured 2026-09-22 on Rincon\n// Plumbing Co's \"Truck 1 dispatch backlog\" as admin@admin.com):\n//\n//   \"The grid's row action is Delete… Pressing it soft-deletes correctly:\n//    deleted_at set, version 1 → 2, nothing removed, and the row leaves the\n//    grid. Then it is gone for good as far as any screen is concerned. The\n//    store's own custom.record_restore exists and does exactly the right thing.\n//    The door is there; nothing reaches it.\"\n//\n// It could not have been reached. Every read door this store had answered LIVE\n// ROWS ONLY — `custom.read_records`, `read_records_by_ids` and\n// `read_records_matching` each hard-code `and r.deleted_at is null` — so no\n// screen could list an archived record however it was written. The store grew\n// `custom.read_records_archived` (migration\n// `fix10a_the_archive_has_a_read_door.sql`) and this module is its client half:\n// the vocabulary, the row shape, and the sentences a screen says about it.\n//\n// WHY THE SENTENCES LIVE HERE AND NOT IN THE UI. \"Archived by Maria Delgado on\n// 22 September\" is an answer about STORED FACTS, not a layout, and the desktop\n// app, the extension, an agent's reply and the web grid must all say it the\n// same way. A screen that composed its own would be a second answer to one\n// question, reached by knowing which client you are using.\n\nimport type { RecordDocument, ReadRow, Timestamp, Uuid } from \"./record\";\n\n/**\n * THE TWO LANES THE ARCHIVED-ITEMS LAW NAMES (Arman, 2026-09-09) — the same\n * split every other list in the platform makes between what is mine and what\n * is the organization's.\n *\n *   · `mine` — what I archived.\n *   · `org`  — what anybody in this organization archived.\n *\n * `mine` is by construction a SUBSET of `org`: the store applies it as a\n * narrowing conjunct beside the read-access ladder, so a lane can never show a\n * record the ladder would have refused.\n */\nexport const ARCHIVE_LANES = [\"mine\", \"org\"] as const;\nexport type ArchiveLane = (typeof ARCHIVE_LANES)[number];\n\n/** THE DEFAULT LANE. The organization's archive, because \"where did that job go?\" is almost never a question about yourself. */\nexport const DEFAULT_ARCHIVE_LANE: ArchiveLane = \"org\";\n\n/** What each lane is called on a screen, and what it actually answers. */\nexport const ARCHIVE_LANE_LABEL: Record<ArchiveLane, string> = {\n  mine: \"Archived by me\",\n  org: \"Archived by anyone\",\n};\n\nexport const ARCHIVE_LANE_MEANS: Record<ArchiveLane, string> = {\n  mine: \"The records you archived yourself.\",\n  org: \"Everything anybody in this organization archived, including you.\",\n};\n\n/** A word that is not a lane is not silently answered as one. */\nexport function isArchiveLane(word: unknown): word is ArchiveLane {\n  return typeof word === \"string\" && (ARCHIVE_LANES as readonly string[]).includes(word);\n}\n\n/**\n * One archived record, as `custom.read_records_archived` answers it: an\n * ordinary `ReadRow` — same id, same masked document, same level, same hidden\n * notices as it had while it was live — plus the two facts that only an archive\n * needs.\n *\n * `archivedBy` is null when the archiver is not a member of this organization\n * any more (their name is not this screen's to learn) or when the history\n * partition that held the SOFT_DELETE has rolled away. Null is an ANSWER and\n * gets its own sentence; it is never printed as an empty space.\n */\nexport interface ArchivedRow extends ReadRow {\n  archivedAt: Timestamp;\n  archivedBy: Uuid | null;\n  archivedByName: string | null;\n}\n\n/** The row shape the door returns over the wire, before it is folded. */\nexport interface ArchivedDoorRow {\n  id: Uuid;\n  document: unknown;\n  level: string;\n  archived_at: Timestamp;\n  archived_by: Uuid | null;\n  archived_by_name: string | null;\n}\n\n/**\n * WHEN IT WAS ARCHIVED, THE WAY A PERSON SAYS IT — \"22 September 2026 at 01:53\".\n * Not an ISO string, and never a bare relative word like \"yesterday\" on its\n * own: somebody deciding whether to bring a record back is deciding about a\n * particular day's work.\n */\nexport function archivedWhen(at: Timestamp, locale = \"en-GB\"): string {\n  const when = new Date(at);\n  if (Number.isNaN(when.getTime())) return \"a moment nobody recorded\";\n  return new Intl.DateTimeFormat(locale, {\n    day: \"numeric\",\n    month: \"long\",\n    year: \"numeric\",\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n  }).format(when);\n}\n\n/**\n * THE WHOLE SENTENCE A ROW IN THE ARCHIVE CARRIES. Both halves of the question\n * the archived-items law asks — who, and when — and an honest sentence when the\n * store could not answer the first half, rather than a blank where a name goes.\n */\nexport function archivedByLine(row: Pick<ArchivedRow, \"archivedAt\" | \"archivedByName\">, locale = \"en-GB\"): string {\n  const when = archivedWhen(row.archivedAt, locale);\n  const who = (row.archivedByName ?? \"\").trim();\n  if (who === \"\") {\n    return `Archived on ${when}. The store does not know who archived it — whoever did is no longer in this organization, or it happened before this table kept that.`;\n  }\n  return `Archived by ${who} on ${when}.`;\n}\n\n/**\n * WHAT AN EMPTY ARCHIVE SAYS, PER LANE. An empty list is an answer and it names\n * the lane it is empty for, so \"nothing here\" can never be read as \"nothing was\n * ever archived\" while the other lane holds twenty records.\n */\nexport function emptyArchiveLine(lane: ArchiveLane): string {\n  return lane === \"mine\"\n    ? \"You have not archived anything in this table. Switch to “Archived by anyone” to see what the rest of the organization has.\"\n    : \"Nothing in this table has been archived. Records you remove from the grid arrive here, and nothing is ever destroyed.\";\n}\n\n/** A document that survived the round trip is the same document — used by the guard. */\nexport function sameDocument(a: RecordDocument, b: RecordDocument): boolean {\n  return JSON.stringify(a) === JSON.stringify(b);\n}\n","// src/record.ts — @ai-matrx/records\n//\n// THE RECORD, AND THE ONE DOCUMENT IT IS. REC-36: a record is one jsonb\n// document, never one row per value. Everything a record knows about a value —\n// what it is, where it came from, why it is missing, what else was a candidate,\n// which version of it this is — lives inside that one document, in the value\n// envelope the store writes and validates.\n//\n// Nothing in this module is a convenience re-description of the store. Each\n// shape is the store's own shape: the envelope keys are\n// `custom.value_envelope_keys()`, the absence words are\n// `custom.absence_reasons()`, and `custom.value_envelope_refusal` refuses by\n// name anything this file would let through.\n\nimport type { Actor, AbsenceReason } from \"./vocabulary\";\nimport type { RecordsError } from \"./results\";\n\n/** A `uuid` as the store writes it. */\nexport type Uuid = string;\n\n/** An ISO-8601 timestamp, as jsonb carries it. */\nexport type Timestamp = string;\n\n/**\n * VAL-1. WHERE a value came from, addressed by a pointer the STORE interns —\n * `s1`, `s2`, `s3`. A writer supplies the source itself and the store interns\n * it; a writer that invents a pointer is refused by name. Interned once per\n * save: two pointers holding the same description is the defect the word\n * \"interned\" exists to prevent, and the store refuses that too.\n */\nexport type ProvenancePointer = string;\n\n/** The description a pointer resolves to. Free-shaped by design: the store checks that it is an object, and the organization decides what it says. */\nexport type ValueSource = Record<string, unknown>;\n\n/**\n * VAL-3 / VAL-4. Another candidate for the same value, with the source it came\n * from and the RANK — the order an organization trusts its sources in, never a\n * score or a confidence a machine invented. Ranks are whole, start at 1, and\n * two alternates never claim the same one. They live INSIDE this record's\n * document; there is never a row per value.\n */\nexport interface ValueAlternate {\n  value: unknown;\n  /** A pointer this record's `_sources` block resolves. */\n  src?: ProvenancePointer | null;\n  rank: number;\n}\n\n/**\n * The value envelope. One per field key, in the record's `_values` block, with\n * the value itself sitting at the top level under the same key.\n *\n * The key set is CLOSED (`custom.value_envelope_keys()`). In particular it can\n * never carry any of the per-value access words (`PER_VALUE_ACCESS_WORDS`): VAL-5 puts those on the Field and on the Record, and VAL-6 says a\n * value that must be secret goes in a contained record with its own access.\n * The store refuses each of those words by name.\n */\nexport interface ValueEnvelope {\n  /** The per-value version, 1 or more. THE STORE WRITES IT — no caller sets it. */\n  ver: number;\n  /** A provenance pointer this record's `_sources` block resolves. */\n  src?: ProvenancePointer | null;\n  /** VAL-8. Who wrote it. */\n  actor: Actor;\n  /** Only an agent acts on behalf of a person; a person's id. */\n  on_behalf_of?: Uuid | null;\n  at?: Timestamp | null;\n  /** VAL-2. Why it is missing. A value either holds something or says this. */\n  absent?: AbsenceReason | null;\n  alternates?: ValueAlternate[] | null;\n  /**\n   * FLD-2's `dated` modifier: the WORLD clock for this value — when it was true\n   * of the world, which is a different question from when it was written. Added\n   * to the store's closed key set after this package's first generation, and\n   * caught by `pnpm check:store-registry` rather than by anybody noticing.\n   */\n  dated?: string | null;\n}\n\n/**\n * The one jsonb document. Field keys sit at the top level; the store's own\n * blocks are underscore-prefixed and are never a writer's value.\n */\nexport interface RecordDocument {\n  /** The store's interned provenance table: pointer -> source. */\n  _sources?: Record<ProvenancePointer, ValueSource>;\n  /** The envelopes, keyed by field key. */\n  _values?: Record<string, ValueEnvelope>;\n  /** FLD-10. Which type of record this is, selecting the Fields and Rules that apply. */\n  _type?: string;\n  /** REC-7. Zero or one parent. Never two. */\n  _parent?: Uuid | null;\n  [fieldKey: string]: unknown;\n}\n\n/** `custom.record` as the store holds it — the row around the document. */\n/**\n * What `custom.record_write_graph` wrote — a parent, the rows that belong to it, and the\n * edges it stands on, all in one transaction.\n *\n * `edges` counts BOTH writers: the edges written through `public.assoc_add` (whose ids are\n * in `edge_ids`) and the relation targets written through `platform.relation_set`, which\n * answers a count rather than ids because a relation is one field's worth of targets and\n * not a list of independent edges. `relations` is that second number on its own, so a\n * caller can tell them apart instead of subtracting.\n */\nexport interface RecordGraphWritten {\n  parent_id: Uuid;\n  table_id: Uuid | null;\n  child_ids: Uuid[];\n  edge_ids: Uuid[];\n  children: number;\n  edges: number;\n  relations: number;\n  /** The door's own sentence about what it did. Shown, never re-worded. */\n  how: string;\n}\n\nexport interface StoredRecord {\n  id: Uuid;\n  organization_id: Uuid;\n  table_id: Uuid | null;\n  /** `record` for ordinary rows, `kernel` for the nine kernel Tables (REC-27). */\n  data_class: string;\n  data: RecordDocument;\n  created_by: Uuid | null;\n  updated_by: Uuid | null;\n  created_at: Timestamp;\n  updated_at: Timestamp;\n  /** REC-23: soft, and reversible within `retention`. */\n  deleted_at: Timestamp | null;\n  /** The RECORD clock. `recordUpdate` writes against it (optimistic concurrency). */\n  version: number;\n  metadata: Record<string, unknown>;\n  custom_fields: Record<string, unknown>;\n  visibility: string;\n}\n\n/**\n * One value read back with everything the store knows about it — the shape\n * `custom.record_values_versioned` and `custom.value_read` answer in. This is\n * what a screen needs to explain a value (DYN-24) without a second query.\n */\nexport interface ReadValue {\n  field_key: string;\n  field_id: Uuid | null;\n  value: unknown;\n  value_version: number | null;\n  source: ValueSource | null;\n  absent_reason: AbsenceReason | null;\n  actor: Actor | null;\n  on_behalf_of: Uuid | null;\n  written_at: Timestamp | null;\n  alternates: ValueAlternate[] | null;\n}\n\n/**\n * Why one field of a record came back empty — `custom.hidden_field_notice`, as\n * the read door attaches it under `_hidden`. It is the store's own sentence, so\n * a screen says \"you need X to see this\" instead of drawing a blank cell.\n */\nexport interface HiddenFieldNotice {\n  /** The field's sensitivity word. */\n  reason: string | null;\n  /** The level this person would need. */\n  needs: string | null;\n  /** The other way in — \"a share of this one field with you\". */\n  or: string | null;\n}\n\n/**\n * One row as the read door `custom.read_records` answers it: the id, the\n * document the store decided this reader may see, and the reader's level on the\n * Table. A field this reader may not see is PRESENT and null, with its reason\n * in `hidden` — the masking is the store's, never this client's.\n */\nexport interface ReadRow {\n  id: Uuid;\n  document: RecordDocument;\n  /** `public.permission_level` — the caller's level on the Table. */\n  level: string;\n  hidden: Record<string, HiddenFieldNotice>;\n  /**\n   * A kept table's device copy holds a change to this row that has not reached the store yet (made\n   * offline, or not sent so far). Only the offline data source sets it; a read from the store never does.\n   */\n  waiting?: true;\n}\n\n/**\n * A ROW THE PERSON CANNOT OPEN (CHAIR-ACCESS b, by design): a row of a Confidential Table that the\n * reader is not named on comes back from the list doors as a bare header `{id, exists: true,\n * submitted_at}`, no values and no level. It is a fact (\"it exists\"), never a record to draw: a\n * screen that drew it painted a blank row. The client splits these out of `rows` and counts them in\n * `locked`; this is the one test for \"is this the header\".\n */\nexport function isLockedStub(row: { document?: unknown; level?: unknown } | null | undefined): boolean {\n  if (!row) return false;\n  if (row.level !== null && row.level !== undefined) return false;\n  const doc = row.document;\n  if (!doc || typeof doc !== \"object\") return false;\n  const keys = Object.keys(doc as Record<string, unknown>);\n  if (keys.length === 0 || keys.length > 3) return false;\n  const d = doc as Record<string, unknown>;\n  return d[\"exists\"] === true && keys.every((k) => k === \"id\" || k === \"exists\" || k === \"submitted_at\");\n}\n\n/** Split a read page into the rows a person can open and the count of header-only stubs. */\nexport function splitLockedRows<R extends { document?: unknown; level?: unknown }>(rows: readonly R[]): { rows: R[]; locked: number } {\n  const open: R[] = [];\n  let locked = 0;\n  for (const row of rows) {\n    if (isLockedStub(row)) locked += 1;\n    else open.push(row);\n  }\n  return { rows: open, locked };\n}\n\n/**\n * DOOR-SPEED. One key of a page's order, as `custom.read_records_page` takes it. `as` is the\n * column's own type — `number` sorts numerically (text that is not a number sorts last),\n * `date` sorts ISO dates and instants, `text` (the default) sorts by lower-cased text. A choice\n * column always sorts by the WORD a person sees; the store knows which columns are choices.\n * NULLS LAST both ways, record id as the tie-breaker.\n */\nexport interface RecordPageSort {\n  field: string;\n  direction?: \"asc\" | \"desc\";\n  as?: \"text\" | \"number\" | \"date\";\n}\n\n/** One page the store sorted, searched and counted: `total` is the matching set this reader may see. */\nexport interface RecordPage {\n  /** The rows this person can open. Header-only stubs of rows they cannot open are never in here. */\n  rows: ReadRow[];\n  /**\n   * The matching set this reader can OPEN (stubs left out). Absent `locked` and `total` agree with\n   * the old meaning.\n   */\n  total: number;\n  /** Rows the store listed only as a header (a Confidential row this person is not named on), across the whole table. */\n  locked?: number;\n  limit: number;\n  offset: number;\n  /**\n   * Sort keys the store SKIPPED because this reader cannot see that column (removed, or masked\n   * from their seat). The page is still read; the screen says the sort was not applied.\n   */\n  sort_ignored: string[];\n  /**\n   * Columns of a SAVED VIEW's own filter the store SKIPPED because this reader cannot see them (WITHHELD-HONEST-2).\n   * Only a filter marked `skip_withheld` is skipped; an explicit filter on such a column is refused by name.\n   */\n  filter_ignored?: string[];\n}\n\n/**\n * A row as the keyset door answers it: the read row plus the `version` and `organization_id` the\n * store read it at, in the same statement as its values (so a document and its version never\n * disagree). `version` is null only on a Confidential header row, which says nothing but \"it exists\".\n */\nexport type KeysetRow = ReadRow & { version: number | null; organization_id: Uuid };\n\n/**\n * AP3-KEYSET-DOOR. One page of `custom.read_records_keyset`: the same rows and order as `RecordPage`,\n * paged by an opaque `cursor` (null on the last page) instead of an offset, so nothing is skipped or\n * repeated while others write. Re-reading named rows (`ids`) answers `total: null` and no cursor.\n */\nexport interface RecordKeysetPage {\n  rows: KeysetRow[];\n  total: number | null;\n  /** Header-only stubs this page carried (rows this person cannot open); never in `rows`. */\n  locked?: number;\n  limit: number;\n  cursor: string | null;\n  /** As on `RecordPage`: sort keys skipped because this reader cannot see that column. */\n  sort_ignored: string[];\n  /** As on `RecordPage`: filter columns of a saved view skipped because this reader cannot see them. */\n  filter_ignored?: string[];\n}\n\n/** DOOR-SPEED. One change in a `recordChangeMany` batch. */\nexport type RecordChange =\n  | { op: \"insert\"; data: RecordDocument }\n  | { op: \"update\"; record_id: Uuid; patch: RecordDocument; expected_version?: number | null }\n  | { op: \"archive\"; record_id: Uuid };\n\n/** What one change did, in the order the changes were handed in. */\nexport type RecordChangeResult =\n  | { op: \"insert\"; id: Uuid }\n  | { op: \"update\"; id: Uuid; version: number }\n  | { op: \"archive\"; id: Uuid; archived_at: string };\n\n/**\n * One revision of one record, as `custom.io_revisions` answers it, newest\n * first. `version` is the record's own version at that point — the number a\n * screen hands back as `expectedVersion` so the store, not the screen, decides\n * whether someone else got there first.\n */\nexport interface RecordRevision {\n  version: number;\n  changed_at: string;\n  changed_by: Uuid | null;\n  summary: string | null;\n}\n\n/** A whole record as `recordRead` answers it, through `custom.read_record`. */\nexport interface RecordRead {\n  record_id: Uuid;\n  /** The masked document. A hidden field is present and null. */\n  document: RecordDocument;\n  /** Why each masked field is masked, in the store's words. */\n  hidden: Record<string, HiddenFieldNotice>;\n  /**\n   * FLD-9 / REC-19. Which Rule version produced each computed value. Present\n   * only where the store has computed provenance for this record.\n   */\n  computed: Array<{\n    field_key: string;\n    field_id: Uuid;\n    value: unknown;\n    rule_id: Uuid;\n    rule_version: number;\n    computed_at: Timestamp;\n  }>;\n  /**\n   * WHY `computed` IS EMPTY, when it is empty because nobody could read it.\n   *\n   * `custom.computed_provenance` is a footnote beside the record and its door is not\n   * open to a person's seat (no EXECUTE for `authenticated`, measured 2026-09-21). It\n   * used to fail the WHOLE read, so an organization's own owner was told \"You do not\n   * have access to this\" about a record he could read — see `core/client.ts`. The\n   * record comes back now, and this carries what the footnote's door said, so a screen\n   * that draws rule provenance can say it could not read it rather than draw nothing\n   * and mean two different things by it. `null` means the footnote was read fine (or\n   * was never asked for).\n   */\n  computedUnavailable?: RecordsError | null;\n  /**\n   * Asked with `withVersion: true`: the version this read saw, so a safe edit (`recordUpdate` with `expected_version`) needs no\n   * second call. Read beside the document in the same round of requests; `null` when the store\n   * could not answer it (a write then refuses as \"version unread\", never as last-write-wins).\n   */\n  version?: number | null;\n}\n","// src/subscription.ts — @ai-matrx/records\n//\n// DOOR-18. A SUBSCRIPTION IS A RULE RECORD, NOT A TABLE.\n//\n// \"Tell me when something in this view changes\" is a Rule carrying a\n// `subscription` block that names a saved view, a cadence, a channel and a\n// recipient. There is no subscriptions table and no second notifier: the store\n// answers `custom.agg_subscriptions`, fires through `custom.agg_subscription_fire`\n// and delivers through `communication.notification`.\n//\n// AND THE ADMISSION TEST RUNS AS THE SUBSCRIBER, not as the writer\n// (`custom.agg_view_admits`): a change to a record the subscriber may not see\n// is not a notification they are entitled to, because the notification's mere\n// existence would leak the record.\n\nimport type { RecordFilter } from \"./aggregate\";\nimport type { Uuid } from \"./record\";\n\n/**\n * HOW OFTEN. `instant` fires the moment a record ENTERS the view; the other three\n * are summaries, assembled by the store at that cadence and sent as ONE message\n * naming what entered, left and changed since the last one.\n *\n * `immediate` and `digest` — the two words this store wrote before 2026-09-20 —\n * are still accepted everywhere and normalized by `custom.agg_cadence_normalize`\n * to `instant` and `daily`, so a Rule written then and a Rule written by the\n * picker now mean the same thing to the same runner.\n */\nexport type SubscriptionCadence = \"instant\" | \"hourly\" | \"daily\" | \"weekly\";\n\n/**\n * THE HOURS NOT TO BE TOLD IN. A send inside them is not dropped — the store moves\n * it to the moment they end through the notification system's own `next_attempt_at`,\n * so there is still one sender and one retry policy and nothing disappears because\n * of the clock.\n */\nexport interface QuietHours {\n  /** \"22:00\". Left out (with `end`), the block names no night — only the clock. */\n  start?: string;\n  /** \"07:00\" — earlier than `start` means the block crosses midnight, which is the ordinary case. */\n  end?: string;\n  /**\n   * An IANA zone name, e.g. \"America/Chicago\". Left out, UTC. THIS IS ALSO THE CLOCK THE\n   * SCHEDULE IS READ IN: `custom.agg_digest_due_at` reads \"monday 08:00\" in this zone, so a\n   * block carrying only `tz` means \"no quiet hours, and 08:00 is my 08:00\".\n   */\n  tz?: string;\n}\n\n/** True when the block names a night (both ends), not only the clock the schedule is read in. */\nexport function hasQuietHours(\n  quiet: QuietHours | null | undefined,\n): quiet is QuietHours & { start: string; end: string } {\n  return Boolean(quiet?.start && quiet?.end);\n}\n\n/** The zone of the person at the keyboard, or null where the runtime cannot say. */\nexport function callersTimeZone(): string | null {\n  try {\n    return Intl.DateTimeFormat().resolvedOptions().timeZone || null;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * A SUBSCRIPTION IS READ IN ITS OWNER'S CLOCK (lane HANDOVER, 2026-09-28).\n *\n * The store reads a schedule's \"08:00\" in `quiet_hours.tz` and falls back to UTC. Every caller\n * that set no quiet hours sent no zone, so Cedar Ridge Physical Therapy's \"every Monday at 8\"\n * went at 1 AM in California. `subscriptionDeclare` passes every spec through this: a spec that\n * names a zone is kept as it is; one that names none gets the caller's own.\n */\nexport function withCallersClock<T extends { quiet_hours?: QuietHours | null }>(\n  spec: T,\n  zone: string | null = callersTimeZone(),\n): T {\n  if (!zone || spec.quiet_hours?.tz) return spec;\n  return { ...spec, quiet_hours: { ...(spec.quiet_hours ?? {}), tz: zone } };\n}\n\n/** One subscription, exactly as `custom.agg_subscriptions` reports it. */\nexport interface Subscription {\n  rule_id: Uuid;\n  saved_view_id: Uuid | null;\n  cadence: string;\n  /** The digest's schedule. Null for `immediate`. */\n  schedule: string | null;\n  channel: string;\n  /** Null means this subscription fires at nobody, and the store says so. */\n  recipient_user_id: Uuid | null;\n  event_key: string;\n  name: string;\n}\n\n/**\n * ONE SUBSCRIPTION AS ITS OWNER SEES IT — `custom.subscriptions`.\n *\n * `custom.agg_subscriptions` is the NOTIFIER's reader: it answers the whole\n * organization's firing subscriptions so the delivery path can run, and it is\n * not callable by a client. This is the other side of the same rows — narrowed\n * to Tables the caller can already open, so the list never reveals a Table —\n * and it carries the two things a screen needs and the notifier does not: is it\n * switched off, and may I switch it off.\n */\nexport interface MySubscription extends Subscription {\n  table_id: Uuid | null;\n  /** Off. `custom.agg_subscriptions` already excludes a muted one, so this is the truth. */\n  muted: boolean;\n  /** It is addressed to me. */\n  mine: boolean;\n  /** I may switch it off: mine, or I hold admin on the Table it watches. */\n  i_may_mute: boolean;\n  /** The hours it will not tell me in. Null means any time. */\n  quiet_hours: QuietHours | null;\n  /** When this last told me anything at all. Null means it never has. */\n  last_sent_at: string | null;\n  /**\n   * When the next summary is due — computed by the SAME store functions the runner\n   * uses, so this and the moment it actually fires cannot drift. Null for `instant`,\n   * which has no due time, and null for a muted one, because saying \"next Monday\"\n   * beside a switch that is off is a screen that lies.\n   */\n  next_digest_at: string | null;\n}\n\n/**\n * THE SUMMARY THIS SUBSCRIPTION WOULD SEND RIGHT NOW — `custom.subscription_preview`.\n *\n * It assembles and returns: nothing is delivered, nothing is recorded and the\n * watermark does not move, so \"show me one now\" never costs somebody a text and\n * never robs the real Monday summary of a week of news.\n */\nexport interface DigestPreview {\n  rule_id: Uuid;\n  name: string;\n  cadence: string;\n  schedule: string | null;\n  quiet_hours: QuietHours | null;\n  channel: string;\n  recipient_user_id: Uuid | null;\n  muted: boolean;\n  table_id: Uuid | null;\n  saved_view_id: Uuid | null;\n  window_start: string;\n  window_end: string;\n  entered: Array<{ record_id: Uuid; name: string }>;\n  left: Array<{ record_id: Uuid; name: string }>;\n  changed: Array<{ record_id: Uuid; name: string }>;\n  counts: { entered: number; left: number; changed: number; in_view: number | null };\n  /** The grid, filtered by the very view this subscription is over. */\n  link: string | null;\n  subject: string;\n  body: string;\n  /**\n   * NOTHING FAILS SILENTLY. A subscription that cannot produce a summary — nobody to\n   * tell, no view, a view somebody deleted — says which piece is missing, in the\n   * sentence a person reads, instead of returning an empty summary that looks calm.\n   */\n  incomplete: string | null;\n}\n\n/**\n * ONE SAVED VIEW — `custom.views`. A subscription is written OVER one of these, so\n * a person with no saved view has nothing to be told about; `viewDeclare` is how a\n * screen gives them one without leaving the screen they are on.\n *\n * `filters` is written in the ONE shape `custom.agg_view_admits` reads, so a view\n * saved here needs no translation before the notifier can admit records to it.\n */\n/**\n * A ROW TEMPLATE (ROW-TEMPLATES, 2026-10-04) — Notion's database templates: a named preset of a\n * Table's values (\"New Instagram post\": Status=Idea, Platform=[Instagram], Page content = a\n * Hook/Script/Hashtags skeleton) that \"New from template\" starts a row from. Kept beside the\n * Table's views in `platform.saved_view` (surface `custom/records/template`); `values` by Field key.\n */\nexport interface RowTemplateRow {\n  template_id: Uuid;\n  name: string;\n  table_id: Uuid;\n  values: Record<string, unknown>;\n  created_at: string;\n  updated_at: string;\n}\n\nexport interface SavedViewRow {\n  view_id: Uuid;\n  name: string;\n  table_id: Uuid | null;\n  filters: RecordFilter;\n  /**\n   * THE WHOLE VIEW (S0 ONE-SAVED-VIEW, 2026-09-23): `platform.saved_view` is the ONE saved-view\n   * store, so this is what the view bar, the board, the calendar and the gallery draw from —\n   * `layout` (the kind), `group_field`, `measure`, `date_field`, `start_field`, `end_field`,\n   * `image_field`, `sorts`, `rule_id`,\n   * `is_default`, `presentation`, G7's `grid`, G13's `order`, the mover's `moved_from`.\n   */\n  definition: SavedViewDefinition;\n  created_at: string;\n}\n\n/** Every kind of view the store keeps (`custom.view_keys()` row `layout`). */\nexport type SavedViewLayout = \"grid\" | \"kanban\" | \"calendar\" | \"gallery\" | \"sheet\" | \"timeline\";\n\n/** `presentation.style.colorBy`: a choice or yes/no Field whose colors paint the cards, the calendar and the timeline. */\nexport interface SavedViewColorBy {\n  field: string;\n  target?: string;\n}\n\n/**\n * THE KEYS OF ONE SAVED VIEW, as `custom.view_keys()` declares them. Fields are named by key\n * (the store accepts an id and stores the key). Every key the store judges is listed here; the\n * index signature keeps the rest (`grid`, `order`, `moved_from`, the presentation details) open.\n */\nexport interface SavedViewDefinition {\n  layout?: SavedViewLayout;\n  /** The board's columns (kanban) or the timeline's rows: any Field. */\n  group_field?: string | null;\n  swimlane_field?: string | null;\n  measure?: string | null;\n  /** Calendar: the date Field that places a record. */\n  date_field?: string | null;\n  /** Timeline: the date Field where a record's bar starts. */\n  start_field?: string | null;\n  /** Calendar and timeline: the date Field where a record ends. Absent, a record is one day. */\n  end_field?: string | null;\n  /** Gallery: the Field drawn as the card's cover. */\n  image_field?: string | null;\n  presentation?: {\n    style?: { colorBy?: SavedViewColorBy | null; [key: string]: unknown } | null;\n    /** Gallery and grids: the Fields hidden from this view, by key. */\n    hiddenFields?: string[] | null;\n    [key: string]: unknown;\n  } | null;\n  [key: string]: unknown;\n}\n\n/**\n * What `custom.view_declare` is asked for. With `view_id` the door MERGES: `name` changes only\n * when sent, `filters` only when the key is sent, each `definition` key replaces that one key and\n * a key sent as `null` is removed — so a screen sends only what it changed.\n */\nexport interface SavedViewSpecIn {\n  name?: string;\n  filters?: RecordFilter | null;\n  definition?: SavedViewDefinition | Record<string, unknown> | null;\n  view_id?: Uuid | null;\n}\n\n/** What `custom.subscription_declare` is asked for. The store refuses the rest BY NAME. */\nexport interface SubscriptionSpec {\n  name: string;\n  saved_view_id: Uuid;\n  cadence: SubscriptionCadence;\n  /** \"monday 08:00\", \"09:30\". Meaningless for `instant`. */\n  schedule?: string | null;\n  channel?: \"in_app\" | \"email\" | \"sms\";\n  quiet_hours?: QuietHours | null;\n  /** Left out, the person setting it up — \"tell ME\". */\n  recipient_user_id?: Uuid | null;\n  event_key?: string;\n  /** Re-state an existing subscription rather than making a second one. */\n  rule_id?: Uuid | null;\n}\n\n/** The `subscription` block a Rule record carries. Written through `record_write`. */\nexport interface SubscriptionBlock {\n  saved_view_id: Uuid;\n  cadence: SubscriptionCadence;\n  schedule?: string | null;\n  channel?: string;\n  recipient_user_id?: Uuid | null;\n  event_key?: string;\n}\n","// src/rowLabel.ts — @ai-matrx/records\n//\n// A TABLE NAMES ITS RECORDS BY A FORMULA (ROW-LABEL-FORMULA, 2026-10-10).\n//\n// The older Sheet could name a row by several columns joined, `{First} & \" \" & {Last}`. The store keeps,\n// beside a table's single title column (`title_field`), an optional ROW-LABEL FORMULA over the table's own\n// columns. It is parsed by the formula field's own parser (`custom.formula_parse`) and worked out by the\n// formula field's own evaluator, so there is no second language. When it is set and returns words for a\n// record, those words are the record's name EVERYWHERE the store names a record - link chips, peeks,\n// pickers, back-links, search results, a notification's subject, the record page's title - because every\n// one of them reads the one resolver. A blank result, or a formula that cannot be worked out for one\n// record, names that record by the title column. Clearing the formula falls back to the title column.\n//\n// Nothing is copied: names are read live, so changing Last is the next read's name.\n\n/** What `tableRowLabel` / `tableRowLabelSet` answer. */\nexport interface TableRowLabel {\n  /** The formula as it was typed, or null when the table names its records by its title column. */\n  formula: string | null;\n  /** The single-column label the table falls back to (its `title_field` key). */\n  title_field: string | null;\n  /** Which of the two names records now: the formula, or the title column. */\n  effective: \"formula\" | \"column\";\n  /** The type the formula answers (text, number, ...), when it still reads. */\n  result_type: string | null;\n  /** False when the stored formula text no longer parses against the table's columns (a column was renamed or retired). */\n  valid: boolean;\n  /** The parser's sentence when `valid` is false. */\n  error: string | null;\n  /** Whether the caller may set or clear it (the table's maker, or someone with full access). */\n  can_change: boolean;\n}\n\n/** The longest formula the store keeps. */\nexport const ROW_LABEL_FORMULA_MAX_LENGTH = 2000;\n\n/** True when a value handed to `tableRowLabelSet` clears the formula (null, empty, or only spaces). */\nexport function clearsRowLabel(formula: string | null | undefined): boolean {\n  return formula == null || formula.trim() === \"\";\n}\n","// src/relation.ts — @ai-matrx/records\n//\n// THE RELATION. REL-1 … REL-16 and REL-N-1.\n//\n// A Relation is SEVEN independent properties, and the reason they are seven\n// separate fields rather than one enum is REL-1/REL-2: ownership and what\n// happens on delete are different questions, and a system that fuses them ends\n// up unable to say \"referenced, but cascade\".\n//\n// REL-10/REL-11: a relation is stored as an association with `role` = the field\n// key. NOTHING about a relation is stored in the value. REL-9: it is visible\n// from both ends and the reverse is not a second Field.\n\nimport type { Timestamp, Uuid } from \"./record\";\nimport type { RecordsDataSource } from \"./ports\";\nimport { err, ok, type RecordsResult } from \"./results\";\nimport { mapPgError } from \"./core/pgError\";\nimport type {\n  OnDelete,\n  RelationBinding,\n  RelationCardinality,\n  RelationFlavor,\n} from \"./vocabulary\";\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\n\n/**\n * REL-6. Whether Visibility flows along this relation and the MAXIMUM access\n * level it carries. Default off on `referenced`, on for `owned`.\n */\nexport interface RelationCarries {\n  carries: boolean;\n  /** The ceiling — a relation never carries more access than this. */\n  max_access: string | null;\n}\n\n/** The seven properties, each its own question. */\nexport interface RelationProperties {\n  /** REL-1. Stored once on the contained table, read from the field's side. */\n  flavor: RelationFlavor;\n  /** REL-2. Separate from flavour. */\n  on_delete: OnDelete;\n  /** REL-3. A snapshot is a frozen copy in the relation's payload — never a pointer into History. */\n  binding: RelationBinding;\n  /** REL-4. */\n  ordered: boolean;\n  /** REL-5. */\n  loops: \"allowed\" | \"refused\";\n  /** REL-6. */\n  carries: RelationCarries;\n  /** REL-7. */\n  cardinality: RelationCardinality;\n}\n\n/**\n * REL-8 / REL-N-1. A target is a REFERENCE, written that way from the first\n * line of code, because it may name a row outside our database. One Table,\n * several, or any — polymorphic without restriction. External targets are\n * read-only in v1.\n */\nexport type RelationTarget =\n  | { kind: \"ours\"; entity_token: string; row_id: Uuid }\n  | {\n      kind: \"external\";\n      connection_token: string;\n      external_table: string;\n      external_key: string;\n    }\n  | { kind: \"any\" };\n\n/** One edge, as the store holds it in `platform.associations`. */\nexport interface Relation {\n  id: Uuid;\n  organization_id: Uuid;\n  /** REL-10. The field key, which is what `role` holds. */\n  role: string;\n  source: RelationTarget;\n  target: RelationTarget;\n  properties: RelationProperties;\n  /** REL-4. Meaningful only when `ordered`. */\n  position: number | null;\n  /** REL-3. The frozen copy, when `binding` is `snapshot`. */\n  payload: Record<string, unknown> | null;\n  /** REL-14. Hydrated from the target's title field AT READ — never stored. */\n  label: string | null;\n  created_at: Timestamp;\n  updated_at: Timestamp;\n  /** REL-13 / REL-16. Associations are versioned, so relation history exists. */\n  version: number;\n}\n\n/**\n * DOOR-6. A query coordinate: \"related to THIS, along THAT role, in that\n * direction\". Any combination, and any subset of them.\n */\nexport interface RelationCoordinate {\n  /** The record at the other end. */\n  record_id: Uuid;\n  /** The field key the edge carries as its role. Omit to mean any role. */\n  role?: string;\n  /** Which way to walk. `out` is this record's own relation fields. */\n  direction?: \"out\" | \"in\" | \"either\";\n}\n\n/**\n * The arguments of the ONE relation-words resolver: the FIELD, because that is where its display\n * spec is declared and judged (`custom._display_of_field` reads it server-side; the caller never\n * carries it), and the ids of a page of cells.\n */\n/** A linked record's icon, and its table's icon for a record that has none (`relationWordsMany`). */\nexport interface RelationIcons {\n  icon: string | null;\n  tableIcon: string | null;\n}\n\nexport interface RelationWordsManyArgs {\n  field_id: Uuid;\n  record_ids: Uuid[];\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// SC-R / P12 — A FIELD THAT POINTS AT A PLATFORM ENTITY\n// ───────────────────────────────────────────────────────────────────────────\n//\n// An ENTITY REFERENCE is a relation (FLD-1's five behaviors hold) whose target\n// mode is `any` (REL-8), restricted by `config.allowed_types` to the platform\n// kinds it may name — an agent, a note, a web site, a workbook, a dataset, a\n// conversation. Its value is REL-N-1's reference shape, `{token, id}`, a list\n// like every relation's (REL-7); the edge beside it is ONE\n// `platform.associations` row record → <token>, written by the store. Every\n// read door answers `{token, id, label}`, the label read — never stored\n// (REL-14) — from the thing's own title, WITHHELD for a reader who may not open\n// the thing. File and Person are not entity references: they are relations to\n// their kernel Tables (`attachment`, `member`).\n\n/** One reference as the store keeps it. */\nexport interface EntityRef {\n  /** The `platform.entity_types` token: `note`, `web_site`, `agent` … */\n  token: string;\n  id: Uuid;\n}\n\n/** One reference as a read door answers it. */\nexport interface EntityRefWithWords extends EntityRef {\n  /**\n   * The thing's own title — or the store's withheld sentence when the reader\n   * may not open it; `null` when the kind names no title.\n   */\n  label: string | null;\n}\n\n/** One kind of platform thing a record may point at (`custom.entity_reference_kinds`). */\nexport interface EntityReferenceKind {\n  token: string;\n  /** What a person reads: \"Note\", \"Site\", \"Agent\". */\n  label: string;\n  /** The picker's grouping: the admin-assigned reference category, else the schema. */\n  category: string;\n}\n\nfunction isRefLike(value: unknown): value is { token: unknown; id: unknown } {\n  return typeof value === \"object\" && value !== null && \"token\" in value && \"id\" in value;\n}\n\n/**\n * The references a cell holds, whichever shape it arrived in — one object, a\n * list, or what a read door rendered (with labels). Anything that is not a\n * reference is left out, never guessed at.\n */\nexport function entityRefsOf(value: unknown): EntityRefWithWords[] {\n  const items = Array.isArray(value) ? value : value == null ? [] : [value];\n  const out: EntityRefWithWords[] = [];\n  for (const item of items) {\n    if (!isRefLike(item)) continue;\n    const token = String(item.token ?? \"\").trim().toLowerCase();\n    const id = String(item.id ?? \"\").trim();\n    if (!token || !isUuidShape(id)) continue;\n    const label = (item as { label?: unknown }).label;\n    out.push({ token, id: id.toLowerCase(), label: typeof label === \"string\" ? label : null });\n  }\n  return out;\n}\n\n/**\n * What to WRITE for an entity-reference cell: `{token, id}` only, each thing\n * once, first mention first — the label a read door added is dropped, because\n * the store reads it and never keeps it (REL-14). A single-valued column gets\n * the one object (or `null`), a multi-valued one the list.\n */\nexport function entityRefsToWrite(value: unknown, multi: boolean): EntityRef | EntityRef[] | null {\n  const seen = new Set<string>();\n  const refs: EntityRef[] = [];\n  for (const ref of entityRefsOf(value)) {\n    const k = `${ref.token}:${ref.id}`;\n    if (seen.has(k)) continue;\n    seen.add(k);\n    refs.push({ token: ref.token, id: ref.id });\n  }\n  if (multi) return refs;\n  return refs[0] ?? null;\n}\n\n/**\n * The kinds of platform thing a record may point at — what the field editor's\n * kind picker lists. `custom.entity_reference_kinds()`.\n */\nexport async function entityReferenceKinds(\n  source: RecordsDataSource,\n): Promise<RecordsResult<EntityReferenceKind[]>> {\n  const { data, error } = await source.rpc(\"entity_reference_kinds\", {}, { schema: \"custom\" });\n  if (error) return err(mapPgError(error, \"entityReferenceKinds\"));\n  return ok(Array.isArray(data) ? (data as EntityReferenceKind[]) : []);\n}\n\n/**\n * THE SEARCH DOOR (lane REFERENCE-CARRY). The platform things of these kinds whose words hold\n * `search`, that THIS person may point a record at — each one a thing the store's own write check\n * (`custom._entity_reference_target_ok`) would accept, so a picked reference is never refused on\n * save. `custom.entity_reference_search`. An empty search lists the first things by name.\n */\nexport async function entityReferenceSearch(\n  source: RecordsDataSource,\n  organizationId: Uuid | null,\n  tokens: readonly string[],\n  search: string,\n  limit = 20,\n): Promise<RecordsResult<EntityRefWithWords[]>> {\n  if (tokens.length === 0) return ok([]);\n  const { data, error } = await source.rpc(\n    \"entity_reference_search\",\n    { p_organization_id: organizationId, p_tokens: [...tokens], p_search: search.trim() || null, p_limit: limit },\n    { schema: \"custom\" },\n  );\n  if (error) return err(mapPgError(error, \"entityReferenceSearch\"));\n  return ok(entityRefsOf(data));\n}\n\n/**\n * THE WORDS HELPER. The words of each `{token, id}` for a picker or a chip\n * before anything is saved — each label read by the store for THIS person and\n * withheld when they may not open the thing. `custom.entity_reference_words`.\n * A saved cell needs no call: every read door already answers its labels.\n */\nexport async function entityReferenceWords(\n  source: RecordsDataSource,\n  organizationId: Uuid | null,\n  refs: readonly EntityRef[],\n): Promise<RecordsResult<EntityRefWithWords[]>> {\n  if (refs.length === 0) return ok([]);\n  const { data, error } = await source.rpc(\n    \"entity_reference_words\",\n    { p_organization_id: organizationId, p_refs: refs.map((r) => ({ token: r.token, id: r.id })) },\n    { schema: \"custom\" },\n  );\n  if (error) return err(mapPgError(error, \"entityReferenceWords\"));\n  return ok(entityRefsOf(data));\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// VIEWS-AND-FIELDS BL — THE REVERSE COLUMN (REL-9, Airtable's back-link)\n// ───────────────────────────────────────────────────────────────────────────\n//\n// When a column of table A links to table B, B shows a column listing the A\n// records that point at each B record. REL-9: the reverse is NOT a second Field,\n// so it is never in `applicableFields(B)` — it is VIRTUAL, listed by\n// `custom.reverse_columns` and read a page at a time by\n// `custom.reverse_links_many`. Read-only: a link is made or broken from A's side.\n\n/** One reverse column of a Table, as `custom.reverse_columns` answers it. */\nexport interface ReverseColumn {\n  /** Stable key: the linking Field's `inverse_key`, else `linked_<field id>`. Never a Field key of B. */\n  key: string;\n  /** What the column is called on B: the linking table's name (plus the column's when ambiguous). */\n  label: string;\n  /** The relation Field on the linking table. */\n  source_field_id: Uuid;\n  source_field_key: string;\n  source_field_label: string;\n  /** The linking table. */\n  source_table_id: Uuid;\n  source_table_name: string;\n  /** Always `many`: any number of records may link to one. */\n  cardinality: \"many\";\n  /**\n   * True for a virtual back-link (written only from the linking table's side). False for a TWO-WAY\n   * LINK (NOTION-PROPS): the reverse end is a real Field on this table — `key` is its key, `label`\n   * its label — and `relationReverseSet` writes its links from here.\n   */\n  read_only: boolean;\n}\n\n/**\n * NOTION-PROPS. A two-way link's reverse Field: a relation whose `config.reverse_of` names the\n * forward relation it mirrors. It holds no value of its own — its links are the forward Field's.\n */\nexport function isReverseField(field: { type?: unknown; config?: unknown } | null | undefined): boolean {\n  if (!field || field.type !== \"relation\") return false;\n  const config = field.config as { reverse_of?: unknown } | null | undefined;\n  return typeof config?.reverse_of === \"string\" && config.reverse_of.length > 0;\n}\n\n/** One linking record, as a chip shows it. */\nexport interface ReverseLink {\n  id: Uuid;\n  /** The linking record's name, read by the store for this reader. */\n  words: string;\n}\n\n/** The links of one record through one reverse column: how many the reader may see, and one page. */\nexport interface ReverseLinks {\n  total: number;\n  links: ReverseLink[];\n}\n\nexport interface ReverseLinksManyArgs {\n  /** The Table whose records are being shown (B). */\n  table_id: Uuid;\n  /** `ReverseColumn.source_field_id`. */\n  source_field_id: Uuid;\n  /** A page of B's record ids — up to 200 a call; more are sent in groups by the client. */\n  record_ids: readonly Uuid[];\n  /** Links per record, 1–50 (the store holds it there). Default 10. */\n  limit?: number;\n  /** Skip this many links of each record — the next page of one hub record. Default 0. */\n  offset?: number;\n}\n\n/** `reverseLinksFields`: the links of a page through several reverse columns, in one call. */\nexport interface ReverseLinksFieldsArgs {\n  table_id: Uuid;\n  /** Each `ReverseColumn.source_field_id` — at most 20. */\n  source_field_ids: readonly Uuid[];\n  record_ids: readonly Uuid[];\n  limit?: number;\n  offset?: number;\n}\n\n/** The store's per-call ceiling on records for `custom.reverse_links_many`. */\nexport const REVERSE_LINKS_RECORDS_PER_CALL = 200;\n/** The store's ceiling on links a record per call. */\nexport const REVERSE_LINKS_PAGE_MAX = 50;\n\n// ── A WORKED-OUT COLUMN WHOSE SOURCE IS ARCHIVED (CHAIR-ROLLUP-HONEST) ─────────\n//\n// `custom.rollup_value` / `custom.lookup_value` answer this object, in the value's own place,\n// when the link a roll-up or lookup reads through (a forward link, or the linking column of a\n// back-link) or the far column it totals or borrows is archived — never a 0 or an empty that\n// looks like \"nothing linked\". `custom.field_source_archived` answers the same object for a\n// column with no record to read (Column settings). `custom.field_restore(field_id)` brings it back.\n\n/** The store's typed \"source archived\" answer for a lookup or roll-up. */\nexport interface SourceArchived {\n  __unavailable: \"source_archived\";\n  /** `link`: the relation it reads through is archived; `column`: the far column it reads is. */\n  reads: \"link\" | \"column\";\n  /** The archived Field. Absent when the reader may not know its Table. */\n  field_id?: Uuid;\n  /** Its label. Absent when the reader may not know its Table. */\n  label?: string;\n  table_id?: Uuid;\n  /** Its Table's name. Absent when the reader may not know that Table. */\n  table?: string;\n}\n\n/** The typed \"source archived\" answer, when `value` is one; null for any other value. */\nexport function sourceArchivedOf(value: unknown): SourceArchived | null {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n  const v = value as Record<string, unknown>;\n  if (v[\"__unavailable\"] !== \"source_archived\") return null;\n  const text = (k: string) => (typeof v[k] === \"string\" && v[k] ? (v[k] as string) : undefined);\n  const out: SourceArchived = { __unavailable: \"source_archived\", reads: v[\"reads\"] === \"column\" ? \"column\" : \"link\" };\n  const fieldId = text(\"field_id\");\n  const label = text(\"label\");\n  const tableId = text(\"table_id\");\n  const table = text(\"table\");\n  if (fieldId) out.field_id = fieldId as Uuid;\n  if (label) out.label = label;\n  if (tableId) out.table_id = tableId as Uuid;\n  if (table) out.table = table;\n  return out;\n}\n","// src/formulaLook.ts — THE ONE HOME of the number format a formula (or rollup / lookup) column shows.\n//\n// A formula column carries no look of its own unless one is DECLARED on the field (`display_format`, like any other\n// column's \"Shows as\"). This module answers what that look is when nobody declared it: the template preview, the\n// template installer (it writes the answer onto the field at install time) and the table display of an older or\n// hand-made formula (`withFormulaLooks`, applied where the client reads a table's fields) all call it. Never copy it.\n\ntype Json = Record<string, unknown>;\n\nconst NUMBER_LOOKS = new Set([\"number\", \"decimal\", \"currency\", \"percent\", \"progress\", \"integer\", \"duration\", \"file_size\"]);\nconst CURRENCY_CODES: Record<string, string> = { $: \"USD\", \"£\": \"GBP\", \"€\": \"EUR\", \"¥\": \"JPY\", \"₹\": \"INR\", R$: \"BRL\", C$: \"CAD\", A$: \"AUD\" };\n\n/**\n * THE NUMBER FORMAT A ROLLUP OR LOOKUP INHERITS from the column it reads (BUTTON-STAMPS; the store's\n * custom._picked_look twin): the column's own chosen number look whole, else money keeps its currency, a percent\n * stays a percent and a number keeps its unit as a suffix. `undefined` when the column has no number format worth\n * carrying.\n */\nexport function pickedLookOf(field: Json): { id: string; options?: Json } | undefined {\n  const df = field[\"display_format\"] as { id?: unknown; options?: Json } | undefined;\n  if (df && typeof df === \"object\" && typeof df.id === \"string\" && NUMBER_LOOKS.has(df.id)) return df as { id: string; options?: Json };\n  const unit = typeof field[\"unit\"] === \"string\" && field[\"unit\"].trim() ? field[\"unit\"].trim() : null;\n  const parity = String(field[\"parity_type\"] ?? \"\");\n  if (parity === \"currency\") return { id: \"currency\", options: { currency: CURRENCY_CODES[unit ?? \"$\"] ?? (unit ?? \"USD\").toUpperCase() } };\n  if (parity === \"percent\") return { id: \"percent\" };\n  if ((parity === \"number\" || parity === \"integer\" || parity === \"decimal\") && unit) return { id: \"number\", options: { suffix: ` ${unit}` } };\n  return undefined;\n}\n\n/** A label that says its column is a percent: \"Margin (%)\", \"Fee percent\", \"Win pct\". */\nconst PERCENT_LABEL = /\\(%\\)|%\\s*$|\\bpercent(age)?\\b|\\bpct\\b/i;\n\n/**\n * THE NUMBER FORMAT A FORMULA COLUMN SHOWS when the template declares none: a label that says percent is a\n * percent; otherwise a formula that does arithmetic with money columns (and never divides by one: a ratio is not\n * money) shows money in that currency — \"Net to client\" = offer − fee − costs − liens reads \"$18,247\", not\n * \"18,247\" (ADVERSARIAL-3 D8). `fields` are the table's columns as the store keeps them (their `display_format`\n * already inherited). `undefined` when nothing is worth carrying — a formula answering words stays words.\n */\nexport function formulaLookOf(formula: string, field: Json, fields: readonly Json[]): { id: string; options?: Json } | undefined {\n  const label = String(field[\"label\"] ?? field[\"key\"] ?? \"\");\n  const unit = typeof field[\"unit\"] === \"string\" ? field[\"unit\"].trim() : \"\";\n  if (unit === \"%\" || PERCENT_LABEL.test(label)) return { id: \"percent\" };\n  if (unit && CURRENCY_CODES[unit]) return { id: \"currency\", options: { currency: CURRENCY_CODES[unit] } };\n  if (/^[A-Z]{3}$/.test(unit)) return { id: \"currency\", options: { currency: unit } };\n  const lookOf = (f: Json) => {\n    const df = f[\"display_format\"] as { id?: unknown; options?: Json } | undefined;\n    return df && typeof df.id === \"string\" && NUMBER_LOOKS.has(df.id) ? (df as { id: string; options?: Json }) : pickedLookOf(f);\n  };\n  const escape = (x: string) => x.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n  let money: { id: string; options?: Json } | undefined;\n  for (const m of formula.matchAll(/\\{([^}]+)\\}/g)) {\n    const name = m[1]!;\n    const ref = fields.find((f) => f[\"label\"] === name || f[\"key\"] === name);\n    const look = ref ? lookOf(ref) : undefined;\n    if (look?.id !== \"currency\") continue;\n    const at = `\\\\{${escape(name)}\\\\}`;\n    // Dividing BY money is a ratio (margin / quote), never money.\n    if (new RegExp(`/\\\\s*${at}`).test(formula)) return undefined;\n    // Money is the answer only when the formula computes with it (or is it): a comparison inside IF is not.\n    if (new RegExp(`${at}\\\\s*[-+*/]|[-+*/]\\\\s*${at}`).test(formula) || formula.trim() === `{${name}}`) money ??= look;\n  }\n  return money;\n}\n\n/** The aggregates whose answer is in the unit of the column they read; count, countall, filled, unique… stay plain numbers. */\nconst UNIT_KEEPING_AGGS = new Set([\"sum\", \"min\", \"max\", \"avg\"]);\n\n/** Does this stored field read as a rollup or a lookup (a column that reads another table's column)? */\nexport function isDerivedField(f: Json): boolean {\n  const parity = String(f[\"parity_type\"] ?? \"\");\n  return parity === \"rollup\" || parity === \"lookup\";\n}\n\n/**\n * THE NUMBER FORMAT A ROLLUP OR LOOKUP SHOWS when it declares none (ROLLUP-FORMAT): that of the column it reads\n * (\"Material cost per unit (USD)\" = sum of the BOM lines' \"Line cost\" reads \"$56\", a lookup of a money column reads\n * \"$\"). sum / min / max / avg keep the source's look; count and the other measures stay plain numbers. `farFieldsOf`\n * answers the candidate far tables' columns (their own looks already worked out) for the field's `via` link; the\n * first candidate that holds the picked column and has a look worth carrying wins. `undefined` otherwise.\n */\nexport function derivedLookOf(field: Json, farFieldsOf: (via: string) => ReadonlyArray<readonly Json[]>): { id: string; options?: Json } | undefined {\n  const parity = String(field[\"parity_type\"] ?? \"\");\n  const cfg = (field[\"config\"] ?? {}) as Json;\n  if (parity !== \"rollup\" && parity !== \"lookup\") return undefined;\n  if (parity === \"rollup\" && !UNIT_KEEPING_AGGS.has(String(cfg[\"agg\"] ?? \"\"))) return undefined;\n  const via = String(cfg[\"via\"] ?? \"\");\n  const pick = String((parity === \"rollup\" ? cfg[\"of\"] : cfg[\"pick\"]) ?? \"\");\n  if (!via || !pick) return undefined;\n  for (const far of farFieldsOf(via)) {\n    const source = far.find((f) => f[\"key\"] === pick);\n    const look = source ? pickedLookOf(source) : undefined;\n    if (look) return look;\n  }\n  return undefined;\n}\n\n/** Does this stored field read as a formula column (a typed expression, not a rollup or lookup)? */\nfunction isPlainFormula(f: Json): boolean {\n  if (String(f[\"type\"] ?? \"\") !== \"formula\" && String(f[\"parity_type\"] ?? \"\") !== \"formula\") return false;\n  const cfg = (f[\"config\"] ?? {}) as Json;\n  return !cfg[\"agg\"] && !cfg[\"pick\"] && !cfg[\"via\"];\n}\n\n/**\n * THE DISPLAY FALLBACK: every formula column with no declared `display_format` gets the inferred one, so an older\n * install or a hand-made formula reads \"$18,247\" / \"42%\" like a new one. A declared format is never touched; a\n * formula with nothing worth carrying stays as it is. Returns the same array when nothing changed.\n */\nexport function withFormulaLooks<F extends object>(fields: readonly F[]): F[] {\n  const work = [...(fields as unknown as Json[])];\n  let changed = false;\n  work.forEach((f, i) => {\n    if (!isPlainFormula(f) || (f[\"display_format\"] && typeof f[\"display_format\"] === \"object\")) return;\n    const text = String(((f[\"config\"] ?? {}) as Json)[\"formula_text\"] ?? \"\");\n    const look = formulaLookOf(text, f, work);\n    if (!look) return;\n    work[i] = { ...f, display_format: look };\n    changed = true;\n  });\n  return (changed ? work : (fields as unknown as Json[])) as unknown as F[];\n}\n\n/**\n * THE DISPLAY FALLBACK FOR ROLLUPS AND LOOKUPS: every rollup / lookup with no declared `display_format` gets the\n * look of the column it reads (`derivedLookOf`). A formula that reads such a column is worked out again after, so\n * chains (lookup -> formula -> rollup) settle. Never touches a declared format.\n */\nexport function withDerivedLooks<F extends object>(fields: readonly F[], farFieldsOf: (via: string) => ReadonlyArray<readonly Json[]>): F[] {\n  let work = withFormulaLooks(fields) as unknown as Json[];\n  for (let pass = 0; pass < 3; pass++) {\n    let changed = false;\n    work = work.map((f) => {\n      if (!isDerivedField(f) || (f[\"display_format\"] && typeof f[\"display_format\"] === \"object\")) return f;\n      const look = derivedLookOf(f, farFieldsOf);\n      if (!look) return f;\n      changed = true;\n      return { ...f, display_format: look };\n    });\n    if (!changed) break;\n    work = withFormulaLooks(work) as unknown as Json[];\n  }\n  return work as unknown as F[];\n}\n","/**\n * THE CLIENT OPERATION LEDGER — how a browser recognizes the echo of its own write.\n *\n * Every private-channel notice the record store broadcasts reaches EVERY browser watching that\n * Table, including the one that caused it. Until now the writer had no way to tell its own\n * change from a colleague's: the notice carried ids and nothing about who moved them, so\n * `recordsRealtimePort.ts` declared `acceptEchoFromSelf: true` and the writer re-read a page it\n * had already updated. It was named honestly rather than faked, and this is the other half.\n *\n * THE SHAPE. Every write through `RecordsClient` mints a uuid, sends it to the store as the\n * platform envelope key `_op_id`, and remembers it here. The store lifts that key out before\n * storage — it is never written onto the record — carries it on the change-feed row, and puts\n * it in the notice as `op_id`. A notice whose `op_id` is in this ledger is this browser's own\n * echo and is dropped.\n *\n * WHY A TIME WINDOW RATHER THAN A DELETE-ON-MATCH. One write can produce MORE THAN ONE notice:\n * a record write that also moves a column produces a `record` notice and a `field` notice, and\n * a statement touching two Tables produces one per Table. Forgetting an op the first time it\n * came back would make the second notice look like somebody else's and cost the re-read this\n * exists to avoid. So an op is remembered for a window and expires on its own.\n *\n * 🚨 THE WINDOW IS A CORRECTNESS BOUNDARY, NOT A TUNING KNOB, AND IT FAILS IN THE SAFE\n * DIRECTION BY CONSTRUCTION. Too SHORT and a late echo is treated as a stranger's change: one\n * extra read of a page that is already correct — invisible. Too LONG and a stranger's change\n * that happened to reuse our uuid would be dropped — which cannot happen, because it is a v4\n * uuid nobody else has ever seen. The only real cost of a long window is memory, so it is\n * bounded by COUNT as well as by time.\n *\n * WHAT THIS IS NOT. It is not a replacement for the store's optimistic concurrency, and it\n * never decides what is true — a dropped echo means \"I already know about this\", and every\n * path that could be wrong about that (a reconnect, a tab wake, a notice with no `op_id` at\n * all) re-reads through the door as it always did.\n */\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\n\nimport type { Uuid } from \"./core/index\";\n\n/** How long an operation stays recognizable as ours. See the header: it fails safe both ways. */\nconst REMEMBER_MS = 30_000;\n\n/** A ceiling so a long-lived tab that writes constantly cannot grow this without bound. */\nconst REMEMBER_MAX = 500;\n\n/**\n * One client's memory of its own operations. `mint()` names a write and remembers it; `isOwn(opId)`\n * answers whether a notice is that write's echo.\n *\n * OWN-WRITE DETECTION IS PER CLIENT INSTANCE. Two setups in ONE process (a server holding two\n * identities, a worker beside a UI) must hear each other: a realm-wide ledger made A's write \"ours\" to\n * B as well, and B dropped it as an echo (2026-10-08, the README proof). `createRecords` gives every\n * setup its own ledger and hands it to its client, its entity port and its live-changes port.\n */\nexport interface OpLedger {\n  mint(): Uuid;\n  isOwn(opId: string | null | undefined): boolean;\n  /** Test seam: forget everything. */\n  clear(): void;\n  /** Test seam: how many operations are currently remembered. */\n  readonly size: number;\n}\n\nfunction ledgerOver(ours: Map<string, number>): OpLedger {\n  function trim(now: number): void {\n    // A Map iterates in insertion order and ids are minted in time order, so the first entry\n    // that is still inside the window means every entry after it is too.\n    for (const [id, at] of ours) {\n      if (now - at <= REMEMBER_MS) break;\n      ours.delete(id);\n    }\n    // Then the ceiling, oldest first, for a tab that writes faster than the window expires.\n    while (ours.size > REMEMBER_MAX) {\n      const oldest = ours.keys().next();\n      if (oldest.done === true) break;\n      ours.delete(oldest.value);\n    }\n  }\n  return {\n    mint() {\n      const id = crypto.randomUUID();\n      const now = Date.now();\n      ours.set(id, now);\n      trim(now);\n      return id as Uuid;\n    },\n    isOwn(opId) {\n      if (!opId) return false;\n      const at = ours.get(opId);\n      if (at === undefined) return false;\n      if (Date.now() - at > REMEMBER_MS) {\n        ours.delete(opId);\n        return false;\n      }\n      return true;\n    },\n    clear() {\n      ours.clear();\n    },\n    get size() {\n      return ours.size;\n    },\n  };\n}\n\n/** A ledger of one client's own: hand the SAME one to the client that writes and the port that listens. */\nexport function createOpLedger(): OpLedger {\n  return ledgerOver(new Map<string, number>());\n}\n\n/**\n * THE REALM'S DEFAULT LEDGER, IN A GLOBAL SLOT — for hosts that mount one client per realm (a browser\n * tab) and never name a ledger. Every section of the built package (root, core, react, realtime, data,\n * typed-table) carries its own copy of this module, and the ESM and CJS builds are two more graphs; a\n * module-level Map split it so `records/core` minted in one and `records/realtime` checked another — own\n * writes came back as strangers' changes (2026-10-08). Guarded on the packed tarball by\n * scripts/check-shared-state.mjs.\n */\nexport const defaultOpLedger: OpLedger = ledgerOver(globalSlot(\"ai-matrx.records.op-ledger\", () => new Map<string, number>()));\n\n/**\n * Mint the id for one client operation and remember it as ours (the realm's default ledger).\n *\n * ONE CALL IS ONE OPERATION. A fifty-row paste through `recordWriteMany` is ONE op id, because\n * the store announces one statement once — and it REFUSES a batch carrying two different ones\n * by name, for exactly that reason.\n */\nexport function mintOpId(): Uuid {\n  return defaultOpLedger.mint();\n}\n\n/**\n * Is this notice the echo of a write this realm's default ledger made?\n *\n * `undefined`/`null` is NOT ours and never has been: a notice with no `op_id` came from a\n * server-side write, an agent tool, another client, or a store older than this mechanism —\n * all of which are changes this browser has not seen and must read.\n */\nexport function isOwnOp(opId: string | null | undefined): boolean {\n  return defaultOpLedger.isOwn(opId);\n}\n\n/** Test seam: forget everything. Never called by product code. */\nexport function forgetAllOps(): void {\n  defaultOpLedger.clear();\n}\n\n/** Test seam: how many operations are currently remembered. */\nexport function rememberedOpCount(): number {\n  return defaultOpLedger.size;\n}\n","// src/scopes/types.ts — @ai-matrx/records/scopes\n//\n// SCOPES ARE CUSTOM DATA (Arman, 2026-10-09: \"Scopes are now nothing more than custom data… A scope\n// type is nothing more than a row [a custom Table flagged kept_for='context'], a context item is\n// nothing more than a column.\").\n//\n//   scope type      a Table of the store kept for context (`kept_for = 'context'`)\n//   scope           a Record of that Table\n//   context field   a Field (column) of that Table — what the old screens called a \"context item\"\n//   context value   the Record's cell under the Field's key\n//\n// These are the shapes the `custom.context_*` doors answer, in the store's words. Nothing here is a\n// row of the archived `context.*` tables, and nothing re-creates one: a value is the cell (`value`),\n// never a set of `value_text` / `value_number` / … columns; a field says `context_policy` and the\n// store's `sensitivity`, never the old `fetch_hint` words.\n\nimport type { Uuid } from \"../record\";\n\n/**\n * What a context field holds, as a person thinks of it — derived from the Field's behavior, `multi`,\n * `format`, display format and `config.kind` (`contextFieldKind`). The value is always `value`; the\n * kind says how to read and edit it.\n */\nexport type ContextFieldKind =\n  | \"string\"\n  | \"markdown\"\n  | \"email\"\n  | \"url\"\n  | \"phone\"\n  | \"color\"\n  | \"number\"\n  | \"percent\"\n  | \"currency\"\n  | \"boolean\"\n  | \"date\"\n  | \"datetime\"\n  | \"time\"\n  | \"object\"\n  | \"array\"\n  | \"reference\"\n  | \"document\";\n\nexport const CONTEXT_FIELD_KINDS: readonly ContextFieldKind[] = [\n  \"string\",\n  \"markdown\",\n  \"email\",\n  \"url\",\n  \"phone\",\n  \"color\",\n  \"number\",\n  \"percent\",\n  \"currency\",\n  \"boolean\",\n  \"date\",\n  \"datetime\",\n  \"time\",\n  \"object\",\n  \"array\",\n  \"reference\",\n  \"document\",\n];\n\n/** The store's context policy on a Field: whether an agent receives it every turn, on request, or never. */\nexport type ContextPolicy = \"include\" | \"on_request\" | \"exclude\";\n\n/** The store's sensitivity words on a Field. */\nexport type ContextSensitivity = \"public\" | \"internal\" | \"confidential\" | \"restricted\";\n\n/** A scope type: a Table kept for context. */\nexport interface ScopeType {\n  id: Uuid;\n  organization_id: Uuid;\n  label_singular: string;\n  label_plural: string;\n  icon: string;\n  color: string;\n  /** The Table's slug in the store's grammar (`practice_areas`). */\n  slug: string | null;\n  description: string;\n  sort_order: number;\n  max_assignments_per_entity: number | null;\n  default_variable_keys: string[];\n  /** Who made the type: with the organization's owners and admins, they shape it (`canShapeScopeType`). */\n  created_by: Uuid | null;\n  created_at: string;\n  updated_at: string;\n}\n\n/** A scope type with its live scopes, as the tree doors answer it. */\nexport interface ScopeTypeWithScopes extends ScopeType {\n  scopes: Scope[];\n}\n\n/** A scope: a Record of its type's Table. */\nexport interface Scope {\n  id: Uuid;\n  scope_type_id: Uuid;\n  organization_id: Uuid;\n  name: string;\n  description: string;\n  slug: string | null;\n  sort_order: number;\n  parent_scope_id: Uuid | null;\n  /** Free settings keys of the scope (each a Field of its Table the scope door derived). */\n  settings: Record<string, unknown>;\n  created_by: Uuid | null;\n  created_at: string;\n  updated_at: string;\n}\n\n/** A scope with its type's presentation (`custom.context_scopes`). */\nexport interface ScopeWithType extends Scope {\n  scope_type: ScopeTypeLabel | null;\n}\n\n/** The presentation of a scope type: what a chip or a breadcrumb shows. */\nexport interface ScopeTypeLabel {\n  id: Uuid;\n  /** The type's slug in the store's grammar (`practice_areas`), when it has one. */\n  slug: string | null;\n  label_singular: string;\n  label_plural: string;\n  icon: string | null;\n  color: string | null;\n}\n\n/** A scope type that was archived, with how many scopes went with it. */\nexport interface ArchivedScopeType {\n  id: Uuid;\n  organization_id: Uuid;\n  label_singular: string;\n  label_plural: string;\n  icon: string;\n  color: string;\n  archived_at: string;\n  created_by: Uuid | null;\n  archived_scope_count: number;\n}\n\n/** A scope that was archived (a Record in the archive of its type's Table). */\nexport interface ArchivedScope {\n  id: Uuid;\n  name: string | null;\n  slug: string | null;\n  archived_at: string | null;\n}\n\n/** A context field: a Field (column) of a scope type's Table. */\nexport interface ContextField {\n  id: Uuid;\n  scope_type_id: Uuid;\n  organization_id: Uuid;\n  key: string;\n  label: string;\n  description: string;\n  kind: ContextFieldKind;\n  /** The Field's own words, for a caller that needs them (`type` is the store's behavior word). */\n  type: string;\n  multi: boolean;\n  format: string | null;\n  config: Record<string, unknown>;\n  relation_target: Uuid | null;\n  /** Its place among the type's context fields, from 0. */\n  sort: number;\n  context_policy: ContextPolicy;\n  sensitivity: ContextSensitivity;\n  source: string;\n  status: string;\n  status_note: string | null;\n  category: string | null;\n  tags: string[];\n  max_items: number;\n  custom_component: unknown;\n  reference_source: unknown;\n  allowed_scope_type_ids: Uuid[] | null;\n  allowed_reference_types: string[] | null;\n  review_interval_days: number | null;\n  depends_on: string[];\n  /** The store's clock on this Field. */\n  version: number;\n  created_by: Uuid | null;\n  created_at: string;\n  updated_at: string;\n}\n\n/** One thing a reference cell points at. */\nexport interface ContextReference {\n  /** The record id (for a file: the File record's id). */\n  id: Uuid;\n  /** What it is: `scope`, `file`, `table`, or another entity token. */\n  type: string;\n  /** Its name, where the door named it to this caller. */\n  label?: string;\n  /** For a file: the `files.files` id a viewer opens. */\n  file_id?: Uuid;\n}\n\n/** The cell holds only the first words of a text kept as a file, and the whole could not be read. */\nexport interface IncompleteValue {\n  /** The cell's own first words. */\n  head: string;\n  /** The whole text's length in characters, when known. */\n  chars: number | null;\n  /** The file holding the whole text, when it has one yet. */\n  file_id: Uuid | null;\n  /** Why the whole text is not here, in one sentence. */\n  why: string;\n}\n\n/** A context value: one cell of a scope's Record. */\nexport interface ContextValue {\n  scope_id: Uuid;\n  field_id: Uuid;\n  key: string;\n  kind: ContextFieldKind;\n  /**\n   * THE CELL, as the store holds it (a text, a number, a boolean, an ISO date, a list, an object).\n   * A reference or document cell is its `references` (ids here). A text kept as a file is its whole\n   * text when the read could open the file (`completeWholeValues`), else the first words and `incomplete`.\n   */\n  value: unknown;\n  /** A reference / document cell, decoded: what it points at, with names the caller may see. */\n  references: ContextReference[];\n  /** The version a PERSON made (system rewrites never move it). */\n  version: number;\n  set_at: string | null;\n  source_type: string | null;\n  authored_by: Uuid | null;\n  /** The pointer to the file holding a text too big for one cell, when the cell holds only its start. */\n  whole_value: StoreWholeValue | null;\n  /** Present only when `value` is not the whole text — never save it back as the value. */\n  incomplete: IncompleteValue | null;\n}\n\n/** The file fields of a whole-value pointer, as `custom.context_values` answers them. */\nexport interface StoreWholeValue {\n  kind: string;\n  file_id?: Uuid | null;\n  file_record?: Uuid | null;\n  bytes?: number | null;\n  chars?: number | null;\n  sha256?: string | null;\n  shown_chars?: number | null;\n  mime?: string | null;\n  pending?: boolean | null;\n  in_value?: boolean | null;\n}\n\n/** The scope types of some organizations, without their scopes, and how many each holds. */\nexport interface ScopeTypeSkeleton {\n  types: ScopeType[];\n  /** type id → how many scopes the caller sees in it; null when asked without counts. */\n  counts: Record<Uuid, number> | null;\n}\n\n/** One page of one type's scopes. */\nexport interface ScopePage {\n  scopes: Scope[];\n  total: number;\n  next_offset: number | null;\n}\n\n/**\n * The pseudo scope-type id a System Context field carries. System Context (what is simply TRUE on the\n * platform) has no scope type; its fields share this sentinel so a holder can keep them beside a\n * type's fields. A client-side key only — a binding to one of these carries `scope_type_id: null`.\n */\nexport const SYSTEM_CONTEXT_TYPE_ID = \"__system__\";\n\n/** What a System Context item is: a curated fact, an ambient fact of the moment, or a dataset. */\nexport type SystemContextItemClass = \"curated\" | \"ambient\" | \"dataset\" | (string & {});\n\n/**\n * A System Context item (`custom.context_system_items`), as a `ContextField` of the\n * `SYSTEM_CONTEXT_TYPE_ID` pseudo-type, plus its class.\n */\nexport interface SystemContextField extends ContextField {\n  item_class: SystemContextItemClass | null;\n}\n\n/** One column of a table template. */\nexport interface TableTemplateField {\n  field_name: string;\n  display_name: string;\n  data_type: string;\n  field_order: number;\n  is_required: boolean;\n}\n\n/**\n * A table template (a `custom.template` of kind `table`) a scope's dataset field may lock its\n * table's columns to: the organization's own or a platform one, as `custom.table_templates` answers it.\n */\nexport interface TableTemplate {\n  id: Uuid;\n  organization_id: Uuid | null;\n  name: string;\n  description: string;\n  version: number;\n  is_platform: boolean;\n  fields: TableTemplateField[];\n}\n\n/** One scope template of the gallery, as `custom.context_templates` answers it. */\nexport interface ScopeTemplate {\n  [key: string]: unknown;\n}\n\n// ─── writes ──────────────────────────────────────────────────────────────────────────────────────\n\n/** A new scope type, or the parts of one to change (`undefined` = leave as it is). */\nexport interface ScopeTypeSpec {\n  label_singular?: string;\n  label_plural?: string;\n  icon?: string;\n  color?: string;\n  description?: string;\n  sort_order?: number;\n  max_assignments_per_entity?: number | null;\n  default_variable_keys?: string[];\n  /** Any spelling; the package writes it in the store's grammar. Absent on create = from the label. */\n  slug?: string;\n}\n\n/** A new scope, or the parts of one to change. */\nexport interface ScopeSpec {\n  name?: string;\n  description?: string;\n  settings?: Record<string, unknown>;\n  parent_scope_id?: Uuid | null;\n  slug?: string;\n  sort_order?: number;\n}\n\n/** A new context field, or the parts of one to change (`null` clears). */\nexport interface ContextFieldSpec {\n  key?: string;\n  label?: string;\n  kind?: ContextFieldKind;\n  description?: string;\n  category?: string | null;\n  context_policy?: ContextPolicy;\n  sensitivity?: ContextSensitivity;\n  tags?: string[];\n  sort?: number;\n  status?: string;\n  status_note?: string | null;\n  custom_component?: unknown;\n  review_interval_days?: number | null;\n  allowed_reference_types?: string[] | null;\n  max_items?: number | null;\n  allowed_scope_type_ids?: Uuid[] | null;\n  reference_source?: unknown;\n}\n\n/** One cell to write. `value` is the cell as `ContextValue.value` reads it; a reference cell takes `references`. */\nexport interface ContextValueWrite {\n  scope_id: Uuid;\n  field_id: Uuid;\n  kind: ContextFieldKind;\n  value?: unknown;\n  /** A reference / document cell: the things it points at (replaces the cell). */\n  references?: ContextReference[];\n  /** Who wrote it: `manual` from a person's own edit (the store's default is `ai_enriched`). */\n  source_type?: string;\n  change_summary?: string;\n}\n\n/** What a written cell answers. */\nexport interface ContextValueWritten {\n  scope_id: Uuid;\n  field_id: Uuid;\n  version: number;\n  source_type: string;\n}\n","// src/scopes/codec.ts — @ai-matrx/records/scopes\n//\n// THE ONE PLACE THE SCOPE DOORS' WORDS ARE READ AND WRITTEN.\n//\n// The `custom.context_*` doors answer the store's rows (a Table, a Record, a Field document, a\n// cell) and, for the write doors, still TAKE a few of the words the old screens wrote\n// (`display_name`, `value_type`, `fetch_hint`, `value_text`…) and answer the field they wrote in\n// those words. That grammar is the door's contract, so it is spoken here, once, and never by a\n// caller: everything above this file holds `ScopeType`, `Scope`, `ContextField` and `ContextValue`.\n// The server's reader (aidream `matrx_records/store/scopes.py`) reads the same doors.\n\nimport type { Uuid } from \"../record\";\nimport type {\n  ArchivedScopeType,\n  ContextField,\n  ContextFieldKind,\n  ContextFieldSpec,\n  ContextPolicy,\n  ContextReference,\n  ContextSensitivity,\n  ContextValue,\n  ContextValueWrite,\n  Scope,\n  ScopeType,\n  ScopeTypeLabel,\n  ScopeWithType,\n  StoreWholeValue,\n  SystemContextField,\n} from \"./types\";\nimport { SYSTEM_CONTEXT_TYPE_ID } from \"./types\";\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\n\n// ─── the doors' answers ─────────────────────────────────────────────────────────────────────────\n\n/** A scope type as the tree doors answer it. */\nexport interface StoreTypeRow {\n  id: string;\n  organization_id: string;\n  label_singular?: string | null;\n  label_plural?: string | null;\n  name?: string | null;\n  icon?: string | null;\n  color?: string | null;\n  slug?: string | null;\n  description?: string | null;\n  sort_order?: number | null;\n  max_assignments_per_entity?: number | null;\n  default_variable_keys?: string[] | null;\n  created_by?: string | null;\n  created_at?: string | null;\n  updated_at?: string | null;\n  scope_count?: number | null;\n}\n\n/** A scope as the tree and scope doors answer it. */\nexport interface StoreScopeRow {\n  id: string;\n  scope_type_id: string;\n  organization_id: string;\n  name?: string | null;\n  description?: string | null;\n  slug?: string | null;\n  sort_order?: number | string | null;\n  parent_scope_id?: string | null;\n  settings?: Record<string, unknown> | null;\n  created_by?: string | null;\n  created_at?: string | null;\n  updated_at?: string | null;\n  scope_type?: (Partial<StoreTypeRow> & { id: string }) | null;\n}\n\n/** A Field document, as `custom.context_items` / `custom.context_values` answer it. */\nexport interface StoreFieldDoc {\n  key?: string;\n  label?: string;\n  type?: string;\n  multi?: boolean | null;\n  format?: string | null;\n  display_format?: { id?: string } | null;\n  config?: ({ kind?: string } & Record<string, unknown>) | null;\n  relation_target?: string | null;\n  sort?: number | string | null;\n  description?: string | null;\n  sensitivity?: string | null;\n  context_policy?: string | null;\n  source?: string | null;\n  status?: string | null;\n  status_note?: string | null;\n  category?: string | null;\n  tags?: string[] | null;\n  max_items?: number | null;\n  custom_component?: unknown;\n  reference_source?: unknown;\n  allowed_scope_type_ids?: string[] | null;\n  allowed_reference_types?: string[] | null;\n  review_interval_days?: number | null;\n  depends_on?: string[] | null;\n  [extra: string]: unknown;\n}\n\n/** What the store remembers about a field it moved from the old tables and could not type. */\nexport interface StoreCarried {\n  value_type?: string;\n  as_text?: boolean;\n  is_active?: boolean;\n}\n\n/** A context field as `custom.context_items` answers it. */\nexport interface StoreItemRow {\n  id: string;\n  scope_type_id: string;\n  organization_id: string;\n  data: StoreFieldDoc;\n  carried?: StoreCarried | null;\n  created_by?: string | null;\n  created_at?: string | null;\n  updated_at?: string | null;\n  version?: number | null;\n}\n\n/** A cell as `custom.context_values` answers it. */\nexport interface StoreValueRow {\n  scope_id: string;\n  context_item_id: string;\n  key: string;\n  value: unknown;\n  field?: (Pick<StoreFieldDoc, \"type\" | \"multi\" | \"format\" | \"display_format\" | \"config\" | \"relation_target\"> & {\n    carried?: StoreCarried | null;\n  }) | null;\n  version?: number | null;\n  store_version?: number | null;\n  set_at?: string | null;\n  source_type?: string | null;\n  value_id?: string | null;\n  authored_by?: string | null;\n  labels?: Record<string, string> | null;\n  files?: Record<string, string> | null;\n  whole_value?: StoreWholeValue | null;\n}\n\n/** An archived scope type as `custom.context_archived_types` answers it. */\nexport interface StoreArchivedTypeRow {\n  id: string;\n  organization_id: string;\n  label_singular?: string | null;\n  label_plural?: string | null;\n  icon?: string | null;\n  color?: string | null;\n  deleted_at?: string | null;\n  created_by?: string | null;\n  archived_scope_count?: number | null;\n}\n\n// ─── reading ────────────────────────────────────────────────────────────────────────────────────\n\nconst str = (v: unknown, fallback = \"\"): string => (typeof v === \"string\" ? v : fallback);\nconst strOrNull = (v: unknown): string | null => (typeof v === \"string\" ? v : null);\nconst num = (v: unknown, fallback = 0): number => {\n  const n = typeof v === \"number\" ? v : typeof v === \"string\" ? Number(v) : NaN;\n  return Number.isFinite(n) ? n : fallback;\n};\n\nexport function scopeTypeFromStore(row: StoreTypeRow): ScopeType {\n  const singular = row.label_singular ?? row.name ?? \"\";\n  return {\n    id: row.id,\n    organization_id: row.organization_id,\n    label_singular: singular,\n    label_plural: row.label_plural ?? singular,\n    icon: row.icon ?? \"folder\",\n    color: row.color ?? \"\",\n    slug: row.slug ?? null,\n    description: row.description ?? \"\",\n    sort_order: num(row.sort_order),\n    max_assignments_per_entity: row.max_assignments_per_entity ?? null,\n    default_variable_keys: Array.isArray(row.default_variable_keys) ? row.default_variable_keys : [],\n    created_by: row.created_by ?? null,\n    created_at: row.created_at ?? \"\",\n    updated_at: row.updated_at ?? \"\",\n  };\n}\n\nexport function scopeTypeLabelFromStore(t: Partial<StoreTypeRow> & { id: string }): ScopeTypeLabel {\n  const singular = t.label_singular ?? t.name ?? \"\";\n  return { id: t.id, slug: t.slug ?? null, label_singular: singular, label_plural: t.label_plural ?? singular, icon: t.icon ?? null, color: t.color ?? null };\n}\n\n/**\n * A settings value as it was written. The scope door keeps a list-of-objects setting (a class's exam\n * dates) as a list of their JSON texts (`custom._ctx_words`); read back, each is the object again.\n */\nexport function settingFromStore(value: unknown): unknown {\n  if (!Array.isArray(value)) return value;\n  return value.map((el) => {\n    if (typeof el !== \"string\") return el;\n    const t = el.trim();\n    if (!(t.startsWith(\"{\") && t.endsWith(\"}\")) && !(t.startsWith(\"[\") && t.endsWith(\"]\"))) return el;\n    try {\n      return JSON.parse(t) as unknown;\n    } catch {\n      return el;\n    }\n  });\n}\n\nexport function scopeFromStore(row: StoreScopeRow): Scope {\n  const settings: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(row.settings ?? {})) settings[k] = settingFromStore(v);\n  return {\n    id: row.id,\n    scope_type_id: row.scope_type_id,\n    organization_id: row.organization_id,\n    name: row.name ?? \"\",\n    description: row.description ?? \"\",\n    slug: row.slug ?? null,\n    sort_order: num(row.sort_order),\n    parent_scope_id: row.parent_scope_id ?? null,\n    settings,\n    created_by: row.created_by ?? null,\n    created_at: row.created_at ?? \"\",\n    updated_at: row.updated_at ?? \"\",\n  };\n}\n\nexport function scopeWithTypeFromStore(row: StoreScopeRow): ScopeWithType {\n  return { ...scopeFromStore(row), scope_type: row.scope_type ? scopeTypeLabelFromStore(row.scope_type) : null };\n}\n\nexport function archivedScopeTypeFromStore(row: StoreArchivedTypeRow): ArchivedScopeType {\n  const singular = row.label_singular ?? \"\";\n  return {\n    id: row.id,\n    organization_id: row.organization_id,\n    label_singular: singular,\n    label_plural: row.label_plural ?? singular,\n    icon: row.icon ?? \"folder\",\n    color: row.color ?? \"\",\n    archived_at: row.deleted_at ?? \"\",\n    created_by: row.created_by ?? null,\n    archived_scope_count: row.archived_scope_count ?? 0,\n  };\n}\n\n/** The file kernel: a relation at it is a document (a file), never a reference to a row. */\nexport const FILE_KERNEL_ID = \"11111111-0000-4000-8000-000000000006\";\n\nconst KINDS = new Set<string>([\n  \"string\", \"markdown\", \"email\", \"url\", \"phone\", \"color\", \"number\", \"percent\", \"currency\", \"boolean\",\n  \"date\", \"datetime\", \"time\", \"object\", \"array\", \"reference\", \"document\",\n]);\n\n/** What a Field holds, as a person thinks of it. */\nexport function contextFieldKind(\n  doc: Pick<StoreFieldDoc, \"type\" | \"multi\" | \"format\" | \"display_format\" | \"config\" | \"relation_target\">,\n  carried?: StoreCarried | null,\n): ContextFieldKind {\n  // A field the store landed as text keeps the word it had (custom._ctx_store_item carries it).\n  if (carried?.as_text && carried.value_type && KINDS.has(carried.value_type)) return carried.value_type as ContextFieldKind;\n  const behavior = String(doc.type ?? \"text\");\n  const fmt = doc.format ? String(doc.format) : \"\";\n  const shown = doc.display_format && typeof doc.display_format === \"object\" ? String(doc.display_format.id ?? \"\") : \"\";\n  const kind = String(doc.config?.kind ?? \"\");\n  const multi = Boolean(doc.multi);\n  if (behavior === \"boolean\") return \"boolean\";\n  if (behavior === \"relation\") return doc.relation_target === FILE_KERNEL_ID && !multi ? \"document\" : \"reference\";\n  if (behavior === \"range\") {\n    if (kind === \"date\") return \"date\";\n    if (kind === \"datetime\") return \"datetime\";\n    if (fmt === \"percent\" || fmt === \"currency\") return fmt;\n    return \"number\";\n  }\n  if (behavior === \"text\") {\n    if (multi) return \"array\";\n    if (fmt === \"json\") return \"object\";\n    for (const word of [fmt, shown]) {\n      if (word === \"time\" || word === \"email\" || word === \"url\" || word === \"phone\" || word === \"color\" || word === \"markdown\") return word;\n    }\n  }\n  return \"string\";\n}\n\nconst POLICIES = new Set<string>([\"include\", \"on_request\", \"exclude\"]);\nconst SENSITIVITIES = new Set<string>([\"public\", \"internal\", \"confidential\", \"restricted\"]);\n\nexport function contextFieldFromStore(row: StoreItemRow): ContextField {\n  const d = row.data ?? {};\n  const key = str(d.key);\n  const policy = str(d.context_policy, \"include\");\n  const sensitivity = str(d.sensitivity, \"internal\");\n  return {\n    id: row.id,\n    scope_type_id: row.scope_type_id,\n    organization_id: row.organization_id,\n    key,\n    label: str(d.label, key),\n    description: str(d.description),\n    kind: contextFieldKind(d, row.carried),\n    type: str(d.type, \"text\"),\n    multi: Boolean(d.multi),\n    format: strOrNull(d.format),\n    config: (d.config ?? {}) as Record<string, unknown>,\n    relation_target: strOrNull(d.relation_target),\n    // The store's sort counts the scope's own two columns first (custom._ctx_store_item: + 2).\n    sort: Math.max(0, num(d.sort) - 2),\n    context_policy: (POLICIES.has(policy) ? policy : \"include\") as ContextPolicy,\n    sensitivity: (SENSITIVITIES.has(sensitivity) ? sensitivity : \"internal\") as ContextSensitivity,\n    source: str(d.source, \"manual\"),\n    status: str(d.status, \"active\"),\n    status_note: strOrNull(d.status_note),\n    category: strOrNull(d.category),\n    tags: Array.isArray(d.tags) ? d.tags : [],\n    max_items: typeof d.max_items === \"number\" ? d.max_items : 1,\n    custom_component: d.custom_component ?? null,\n    reference_source: d.reference_source ?? null,\n    allowed_scope_type_ids: Array.isArray(d.allowed_scope_type_ids) ? d.allowed_scope_type_ids : null,\n    allowed_reference_types: Array.isArray(d.allowed_reference_types) ? d.allowed_reference_types : null,\n    review_interval_days: typeof d.review_interval_days === \"number\" ? d.review_interval_days : null,\n    depends_on: Array.isArray(d.depends_on) ? d.depends_on : [],\n    version: num(row.version, 1),\n    created_by: row.created_by ?? null,\n    created_at: row.created_at ?? \"\",\n    updated_at: row.updated_at ?? \"\",\n  };\n}\n\n// The write doors still speak three old words for a field; these are their meanings, both ways.\nconst POLICY_TO_DOOR: Record<ContextPolicy, string> = { include: \"always\", on_request: \"on_demand\", exclude: \"never\" };\nconst POLICY_FROM_DOOR: Record<string, ContextPolicy> = { always: \"include\", on_demand: \"on_request\", never: \"exclude\" };\nconst SENSITIVITY_TO_DOOR: Record<ContextSensitivity, string> = {\n  public: \"public\",\n  internal: \"internal\",\n  confidential: \"restricted\",\n  restricted: \"privileged\",\n};\nconst SENSITIVITY_FROM_DOOR: Record<string, ContextSensitivity> = {\n  public: \"public\",\n  internal: \"internal\",\n  restricted: \"confidential\",\n  privileged: \"restricted\",\n};\n\n/** The field a write door answered (`custom.context_item_row_of`), as a `ContextField`. */\nexport function contextFieldFromWriteAnswer(row: Record<string, unknown>, organizationId: Uuid): ContextField {\n  const key = str(row.key);\n  const kind = str(row.value_type, \"string\");\n  return {\n    id: str(row.id),\n    scope_type_id: str(row.scope_type_id),\n    organization_id: organizationId,\n    key,\n    label: str(row.display_name, key),\n    description: str(row.description),\n    kind: (KINDS.has(kind) ? kind : \"string\") as ContextFieldKind,\n    type: \"\",\n    multi: kind === \"array\",\n    format: null,\n    config: {},\n    relation_target: null,\n    sort: num(row.sort_order),\n    context_policy: POLICY_FROM_DOOR[str(row.fetch_hint)] ?? \"include\",\n    sensitivity: SENSITIVITY_FROM_DOOR[str(row.sensitivity)] ?? \"internal\",\n    source: \"manual\",\n    status: str(row.status, \"active\"),\n    status_note: strOrNull(row.status_note),\n    category: strOrNull(row.category),\n    tags: Array.isArray(row.tags) ? (row.tags as string[]) : [],\n    max_items: typeof row.max_items === \"number\" ? row.max_items : 1,\n    custom_component: row.custom_component ?? null,\n    reference_source: row.reference_source ?? null,\n    allowed_scope_type_ids: Array.isArray(row.allowed_scope_type_ids) ? (row.allowed_scope_type_ids as string[]) : null,\n    allowed_reference_types: Array.isArray(row.allowed_reference_types) ? (row.allowed_reference_types as string[]) : null,\n    review_interval_days: typeof row.review_interval_days === \"number\" ? row.review_interval_days : null,\n    depends_on: Array.isArray(row.depends_on) ? (row.depends_on as string[]) : [],\n    version: num(row.version, 1),\n    created_by: strOrNull(row.created_by),\n    created_at: str(row.created_at),\n    updated_at: str(row.updated_at),\n  };\n}\n\n/** A System Context item, as `custom.context_system_items` answers it (the door's own words). */\nexport interface StoreSystemItemRow {\n  id?: string | null;\n  key?: string | null;\n  display_name?: string | null;\n  description?: string | null;\n  item_class?: string | null;\n  value_type?: string | null;\n  sensitivity?: string | null;\n  sort_order?: number | null;\n}\n\n/** A System Context item as a field of the `SYSTEM_CONTEXT_TYPE_ID` pseudo-type, with its class. */\nexport function systemContextFieldFromStore(row: StoreSystemItemRow, index: number): SystemContextField {\n  const key = str(row.key);\n  const kind = str(row.value_type, \"string\");\n  return {\n    id: str(row.id),\n    scope_type_id: SYSTEM_CONTEXT_TYPE_ID,\n    organization_id: \"\",\n    key,\n    label: str(row.display_name, key),\n    description: str(row.description),\n    kind: (KINDS.has(kind) ? kind : \"string\") as ContextFieldKind,\n    type: \"system\",\n    multi: kind === \"array\",\n    format: null,\n    config: {},\n    relation_target: null,\n    sort: typeof row.sort_order === \"number\" ? row.sort_order : index,\n    context_policy: \"include\",\n    // The system table keeps the old sensitivity words (`restricted`/`privileged`), like the write doors.\n    sensitivity: SENSITIVITY_FROM_DOOR[str(row.sensitivity)] ?? \"public\",\n    source: \"system\",\n    status: \"active\",\n    status_note: null,\n    category: null,\n    tags: [],\n    max_items: 0,\n    custom_component: null,\n    reference_source: null,\n    allowed_scope_type_ids: null,\n    allowed_reference_types: null,\n    review_interval_days: null,\n    depends_on: [],\n    version: 0,\n    created_by: null,\n    created_at: \"\",\n    updated_at: \"\",\n    item_class: strOrNull(row.item_class),\n  };\n}\n\n\n/** A reference / document cell's targets, with the names and files the door gave this caller. */\nexport function referencesOf(row: Pick<StoreValueRow, \"value\" | \"field\" | \"labels\" | \"files\">): ContextReference[] {\n  const v = row.value;\n  const list = Array.isArray(v) ? v : v == null ? [] : [v];\n  const labels = row.labels ?? {};\n  const files = row.files ?? {};\n  const toFile = row.field?.relation_target === FILE_KERNEL_ID;\n  const out: ContextReference[] = [];\n  for (const el of list) {\n    let ref: ContextReference | null = null;\n    if (typeof el === \"string\" && isUuidShape(el)) ref = { id: el, type: toFile ? \"file\" : \"scope\" };\n    else if (el && typeof el === \"object\" && typeof (el as { id?: unknown }).id === \"string\") {\n      const token = String((el as { token?: unknown }).token ?? \"\");\n      const own = (el as { label?: unknown }).label;\n      ref = { id: (el as { id: string }).id, type: token === \"dataset\" ? \"table\" : token || (toFile ? \"file\" : \"scope\") };\n      // A reference outside the scope system carries its own label in the store; the door names scopes only.\n      if (typeof own === \"string\" && own) ref.label = own;\n    }\n    if (!ref) continue;\n    const label = labels[ref.id];\n    if (label) ref.label = label;\n    const fileId = files[ref.id];\n    if (fileId) ref.file_id = fileId;\n    out.push(ref);\n  }\n  return out;\n}\n\n/** One cell, as a `ContextValue` (its whole text not yet read — see `completeWholeValues`). */\nexport function contextValueFromStore(row: StoreValueRow): ContextValue {\n  const kind = contextFieldKind(row.field ?? {}, row.field?.carried);\n  const carriedText = Boolean(row.field?.carried?.as_text);\n  const isRef = !carriedText && (kind === \"reference\" || kind === \"document\");\n  return {\n    scope_id: row.scope_id,\n    field_id: row.context_item_id,\n    key: row.key,\n    kind,\n    value: row.value ?? null,\n    references: isRef ? referencesOf(row) : [],\n    version: num(row.version, 1),\n    set_at: row.set_at ?? null,\n    source_type: row.source_type ?? null,\n    authored_by: row.authored_by ?? null,\n    whole_value: row.whole_value ?? null,\n    incomplete: null,\n  };\n}\n\n// ─── whole texts kept as files ──────────────────────────────────────────────────────────────────\n\n/** Reads a file's whole text as the person (the host's one file reader). */\nexport type ReadContextFileText = (fileId: Uuid) => Promise<string>;\n\nasync function sha256Hex(text: string): Promise<string | null> {\n  const subtle = globalThis.crypto?.subtle;\n  if (!subtle) return null;\n  const digest = await subtle.digest(\"SHA-256\", new TextEncoder().encode(text));\n  return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * A CELL THAT HOLDS ONLY THE FIRST WORDS OF A TEXT KEPT AS A FILE GETS ITS WHOLE TEXT.\n *\n * The store keeps a value over its one-cell ceiling as a file and the cell holds its first words;\n * `custom.context_values` names the file (`whole_value`). Each such value is given the file's whole\n * text — read once per file through the host's reader, checked against the size and SHA-256 the\n * pointer names. A file that cannot be read, or does not match, leaves the first words AND sets\n * `incomplete` (with why) — never the first words passed off as the value. Mutates `values`.\n */\nexport async function completeWholeValues(values: ContextValue[], read: ReadContextFileText | null): Promise<void> {\n  const texts = new Map<string, Promise<string>>();\n  await Promise.all(\n    values.map(async (cell) => {\n      const w = cell.whole_value;\n      if (!w || w.in_value || typeof cell.value !== \"string\") return;\n      const head = cell.value;\n      const chars = typeof w.chars === \"number\" ? w.chars : null;\n      const incomplete = (fileId: string | null, why: string): void => {\n        cell.incomplete = { head, chars, file_id: fileId, why };\n      };\n      if (!w.file_id) return incomplete(null, \"The rest of this text is still being saved.\");\n      if (!read) return incomplete(w.file_id, \"This place cannot open the file that holds the whole text.\");\n      if (!texts.has(w.file_id)) texts.set(w.file_id, read(w.file_id));\n      try {\n        const text = await texts.get(w.file_id)!;\n        if (chars !== null && [...text].length !== chars) {\n          return incomplete(w.file_id, `The file holds ${[...text].length} characters, not ${chars}.`);\n        }\n        if (w.sha256) {\n          const sha = await sha256Hex(text);\n          if (sha === null) return incomplete(w.file_id, \"This browser cannot check the file.\");\n          if (sha !== w.sha256) return incomplete(w.file_id, \"The file's content is not the text the cell points at.\");\n        }\n        cell.value = text;\n      } catch (thrown) {\n        incomplete(w.file_id, thrown instanceof Error ? thrown.message : String(thrown));\n      }\n    }),\n  );\n}\n\n/** The refusal a person sees when saving would cut a value that was not read whole. */\nexport const INCOMPLETE_SAVE_REFUSAL = \"Only the start of this value loaded. Paste the whole text to replace it.\";\n\n/**\n * The refusal sentence when saving `draft` over a cell that was not read whole would cut the real\n * value — else `null`. Refused: the first words unchanged, and a draft built on them that is shorter\n * than the whole. Allowed: a draft that replaces the text, an explicit clear.\n */\nexport function incompleteSaveRefusal(cell: Pick<ContextValue, \"incomplete\"> | undefined, draft: unknown): string | null {\n  const incomplete = cell?.incomplete;\n  if (!incomplete || typeof draft !== \"string\" || draft === \"\") return null;\n  if (draft === incomplete.head) return INCOMPLETE_SAVE_REFUSAL;\n  if (incomplete.head && draft.startsWith(incomplete.head)) {\n    const whole = incomplete.chars ?? Number.POSITIVE_INFINITY;\n    if ([...draft].length < whole) return INCOMPLETE_SAVE_REFUSAL;\n  }\n  return null;\n}\n\n// ─── writing ────────────────────────────────────────────────────────────────────────────────────\n\n/** Drop keys whose value is `undefined`, keep `null` (a clear). */\nexport function definedOnly(fields: Record<string, unknown>): Record<string, unknown> {\n  const out: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(fields)) if (v !== undefined) out[k] = v;\n  return out;\n}\n\n/** A field spec in the words `custom.context_item_write` takes. */\nexport function fieldSpecForDoor(spec: ContextFieldSpec): Record<string, unknown> {\n  return definedOnly({\n    key: spec.key,\n    display_name: spec.label,\n    value_type: spec.kind,\n    description: spec.description,\n    category: spec.category,\n    fetch_hint: spec.context_policy ? POLICY_TO_DOOR[spec.context_policy] : undefined,\n    sensitivity: spec.sensitivity ? SENSITIVITY_TO_DOOR[spec.sensitivity] : undefined,\n    tags: spec.tags,\n    sort_order: spec.sort,\n    status: spec.status,\n    status_note: spec.status_note,\n    custom_component: spec.custom_component,\n    review_interval_days: spec.review_interval_days,\n    allowed_reference_types: spec.allowed_reference_types,\n    max_items: spec.max_items,\n    allowed_scope_type_ids: spec.allowed_scope_type_ids,\n    reference_source: spec.reference_source,\n  });\n}\n\n/** The canonical reference fence (the same grammar `@ai-matrx/agents/envelope` builds). */\nexport function referenceFence(references: readonly ContextReference[]): string {\n  const kinds = [...new Set(references.map((r) => r.type))];\n  const type = kinds.length === 1 ? kinds[0]! : \"mixed\";\n  const items = references.map((r) => {\n    if (r.type === \"file\" && r.file_id) return r.label ? { file_id: r.file_id, label: r.label } : { file_id: r.file_id };\n    const item: { id: string; label?: string; type?: string } = { id: r.id };\n    if (r.label) item.label = r.label;\n    if (kinds.length > 1) item.type = r.type;\n    return item;\n  });\n  return \"```matrx\\n\" + JSON.stringify({ matrx_version: 1, kind: \"reference\", type, items }, null, 2) + \"\\n```\";\n}\n\nconst FENCE_BODY = /```matrx[^\\n]*\\n([\\s\\S]*?)\\n?```/;\n\n/**\n * The things a reference fence points at (the inverse of `referenceFence`). Reads the canonical\n * grammar `{ kind: \"reference\", type, items }`, with or without the ```matrx wrapper; anything that\n * is not a reference fence answers `[]`.\n */\nexport function referencesFromFence(text: string | null | undefined): ContextReference[] {\n  if (typeof text !== \"string\" || text.trim() === \"\") return [];\n  const body = FENCE_BODY.exec(text)?.[1] ?? text;\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(body.trim());\n  } catch {\n    return [];\n  }\n  if (!parsed || typeof parsed !== \"object\") return [];\n  const fence = parsed as { kind?: unknown; type?: unknown; items?: unknown };\n  if (fence.kind !== \"reference\" || !Array.isArray(fence.items)) return [];\n  const noun = typeof fence.type === \"string\" ? fence.type : \"\";\n  return fence.items.flatMap((raw): ContextReference[] => {\n    if (!raw || typeof raw !== \"object\") return [];\n    const item = raw as { id?: unknown; file_id?: unknown; label?: unknown; type?: unknown };\n    const label = typeof item.label === \"string\" && item.label ? { label: item.label } : {};\n    if (typeof item.file_id === \"string\" && item.file_id) {\n      return [{ id: typeof item.id === \"string\" ? item.id : item.file_id, type: \"file\", file_id: item.file_id, ...label }];\n    }\n    if (typeof item.id !== \"string\" || !item.id) return [];\n    const type = typeof item.type === \"string\" && item.type ? item.type : noun || \"scope\";\n    return [{ id: item.id, type, ...label }];\n  });\n}\n\nconst isContextReference = (v: unknown): v is ContextReference =>\n  !!v && typeof v === \"object\" && typeof (v as { id?: unknown }).id === \"string\" && typeof (v as { type?: unknown }).type === \"string\";\n\n/**\n * THE ONE WRITE AN EDIT BECOMES: an editor's raw value for `field` on `scopeId`, as a\n * `ContextValueWrite`. A reference / document field takes a fence (what the reference picker edits)\n * or a list of `ContextReference`s and writes `references`; a clear (`null`, `undefined`, `\"\"`)\n * writes no references. Any other field writes `value`, with `\"\"` and `undefined` a clear (`null`).\n * Written by a person (`source_type: \"manual\"`) unless `options` says otherwise.\n */\nexport function contextValueWrite(\n  field: Pick<ContextField, \"id\" | \"kind\">,\n  scopeId: Uuid,\n  raw: unknown,\n  options: { source_type?: string; change_summary?: string } = {},\n): ContextValueWrite {\n  const base: ContextValueWrite = {\n    scope_id: scopeId,\n    field_id: field.id,\n    kind: field.kind,\n    source_type: options.source_type ?? \"manual\",\n    ...(options.change_summary ? { change_summary: options.change_summary } : {}),\n  };\n  if (field.kind === \"reference\" || field.kind === \"document\") {\n    if (typeof raw === \"string\") return { ...base, references: referencesFromFence(raw) };\n    if (Array.isArray(raw)) {\n      return {\n        ...base,\n        references: raw.flatMap((el): ContextReference[] =>\n          isContextReference(el) ? [el] : typeof el === \"string\" ? referencesFromFence(el) : [],\n        ),\n      };\n    }\n    return { ...base, references: [] };\n  }\n  return { ...base, value: raw === \"\" || raw === undefined ? null : raw };\n}\n\n/**\n * One cell in the payload `custom.context_value_write` takes: the value lands in the slot the door\n * reads for the field's kind; a reference cell is the canonical fence the door's reference rule reads.\n */\nexport function valuePayloadForDoor(write: ContextValueWrite): Record<string, unknown> {\n  const base: Record<string, unknown> = definedOnly({\n    scope_id: write.scope_id,\n    context_item_id: write.field_id,\n    source_type: write.source_type,\n    change_summary: write.change_summary,\n  });\n  const v = write.value;\n  if (write.kind === \"reference\" || write.kind === \"document\") {\n    if (write.references) return { ...base, value_text: write.references.length ? referenceFence(write.references) : null };\n    // A document cell may also be written as a url.\n    if (write.kind === \"document\" && typeof v === \"string\") return { ...base, value_document_url: v || null };\n    return { ...base, value_text: typeof v === \"string\" ? v || null : null };\n  }\n  if (v === null || v === undefined || v === \"\") {\n    return { ...base, value_text: null };\n  }\n  switch (write.kind) {\n    case \"number\":\n    case \"percent\":\n      return typeof v === \"number\" ? { ...base, value_number: v } : { ...base, value_text: String(v) };\n    case \"currency\":\n      return typeof v === \"object\" ? { ...base, value_json: v } : typeof v === \"number\" ? { ...base, value_number: v } : { ...base, value_text: String(v) };\n    case \"boolean\":\n      return typeof v === \"boolean\" ? { ...base, value_boolean: v } : { ...base, value_text: String(v) };\n    case \"date\":\n      return { ...base, value_date: String(v) };\n    case \"datetime\":\n      return { ...base, value_timestamp: String(v) };\n    case \"time\":\n      return { ...base, value_time: String(v) };\n    case \"object\":\n    case \"array\":\n      return typeof v === \"object\" ? { ...base, value_json: v } : { ...base, value_text: String(v) };\n    default:\n      return typeof v === \"object\" ? { ...base, value_json: v } : { ...base, value_text: String(v) };\n  }\n}\n","// src/scopes/rules.ts — @ai-matrx/records/scopes\n//\n// The few rules a screen needs BEFORE it asks a door, each a mirror of what the door itself decides\n// (the door is the authority; this only spares a person a button that would be refused).\n\nimport type { RecordsResult } from \"../results\";\nimport type { Uuid } from \"../record\";\n\n/** An organization role, as `iam.organization_member` holds it. */\nexport type ScopeSeatRole = \"owner\" | \"admin\" | \"member\" | string;\n\n/**\n * WHO MAY CHANGE A SCOPE TYPE'S STRUCTURE — rename it, add/edit/archive its fields, archive or restore\n * it: an organization owner or admin, or the person who made the type. Every member works the DATA\n * (adds, renames, archives and restores scopes, writes values). Arman 2026-10-07: \"structure is the\n * org admins' and the creator's\". Mirrors `custom.context_type_write` / `_archive` / `_restore` and\n * `custom.context_item_write` / `_archive` / `_restore`.\n */\nexport function canShapeScopeType(\n  role: ScopeSeatRole | null | undefined,\n  userId: Uuid | null | undefined,\n  type: { created_by?: Uuid | null } | null | undefined,\n): boolean {\n  if (role === \"owner\" || role === \"admin\") return true;\n  return !!userId && !!type?.created_by && type.created_by === userId;\n}\n\n/** Display name → kebab URL slug. */\nexport function toSlug(name: string): string {\n  return name\n    .toLowerCase()\n    .trim()\n    .replace(/[^a-z0-9]+/g, \"-\")\n    .replace(/^-+|-+$/g, \"\");\n}\n\n/** Display name → snake_case field key. */\nexport function toFieldKey(name: string): string {\n  return name\n    .toLowerCase()\n    .trim()\n    .replace(/[\\s-]+/g, \"_\")\n    .replace(/[^a-z0-9_]/g, \"\")\n    .replace(/_+/g, \"_\")\n    .replace(/^_|_$/g, \"\");\n}\n\n/** True when `s` is a clean slug: a-z, 0-9, single hyphens or underscores between words. */\nexport function isValidSlug(s: string): boolean {\n  return /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/.test(s);\n}\n\n/** Route segments that are literal pages of the scope screens; no slug may equal one. */\nexport const RESERVED_SCOPE_SLUGS: ReadonlySet<string> = new Set([\"context-items\", \"scopes\", \"edit\", \"manage\", \"new\", \"settings\"]);\n\nexport function isReservedSlug(s: string): boolean {\n  return RESERVED_SCOPE_SLUGS.has(s.toLowerCase().replace(/_/g, \"-\"));\n}\n\n/**\n * Two slugs name the same thing when they differ only by `-` ↔ `_` (the store's Table grammar is\n * `practice_areas`; a link a person typed may say `practice-areas`).\n */\nexport function sameSlug(a: string | null | undefined, b: string | null | undefined): boolean {\n  if (!a || !b) return false;\n  return a.toLowerCase().replace(/_/g, \"-\") === b.toLowerCase().replace(/_/g, \"-\");\n}\n\n/** The slug a write sends: the one supplied, else one made from the name; refused when unusable. */\nexport function resolveSlug(supplied: string | undefined, fallbackName: string): RecordsResult<string> {\n  const slug = supplied?.trim() || toSlug(fallbackName);\n  if (!slug || !isValidSlug(slug)) {\n    return {\n      ok: false,\n      error: { code: \"invalid_argument\", message: \"Use letters, numbers and single hyphens for the short name.\" },\n    };\n  }\n  if (isReservedSlug(slug)) {\n    return { ok: false, error: { code: \"invalid_argument\", message: `\"${slug}\" is a page name here. Pick another short name.` } };\n  }\n  return { ok: true, data: slug };\n}\n","// src/scopes/doors.ts — @ai-matrx/records/scopes\n//\n// THE SCOPE DOORS, ONE CALL EACH, THROUGH THE RECORDS CLIENT'S OWN DOOR PATH.\n//\n// `client.scopes` is built from the same `callDoor` every other method of the client uses, so a scope\n// read gets what every store read gets: the schema said out loud, one request in flight per question,\n// a door the store lacks refused as `door_absent` (never an empty list), and every refusal in the\n// store's own words (`RecordsError`). Nothing here talks to Supabase itself.\n//\n// The doors take explicit organizations (a scope read spans every organization the person belongs\n// to; a write names its own), so the client's `organizationId` is never used here.\n\nimport type { RecordsErrorCode, RecordsResult } from \"../results\";\nimport type { Uuid } from \"../record\";\nimport {\n  archivedScopeTypeFromStore,\n  completeWholeValues,\n  contextFieldFromStore,\n  contextValueFromStore,\n  definedOnly,\n  fieldSpecForDoor,\n  scopeFromStore,\n  scopeTypeFromStore,\n  scopeWithTypeFromStore,\n  systemContextFieldFromStore,\n  valuePayloadForDoor,\n  type ReadContextFileText,\n  type StoreArchivedTypeRow,\n  type StoreItemRow,\n  type StoreScopeRow,\n  type StoreSystemItemRow,\n  type StoreTypeRow,\n  type StoreValueRow,\n} from \"./codec\";\nimport { resolveSlug } from \"./rules\";\nimport type {\n  ArchivedScope,\n  ArchivedScopeType,\n  ContextField,\n  ContextFieldSpec,\n  ContextValue,\n  ContextValueWrite,\n  ContextValueWritten,\n  Scope,\n  ScopePage,\n  ScopeSpec,\n  ScopeTemplate,\n  ScopeType,\n  ScopeTypeSkeleton,\n  ScopeTypeSpec,\n  ScopeTypeWithScopes,\n  ScopeWithType,\n  SystemContextField,\n  TableTemplate,\n} from \"./types\";\n\n/** The client's one door call (`callDoor` in core/client.ts). */\nexport type ScopeDoorCall = <T>(door: string, args: Record<string, unknown>, where: string) => Promise<RecordsResult<T>>;\n\n/** The kernel Table every Field is a record of. */\nexport const FIELD_KERNEL_ID = \"11111111-0000-4000-8000-000000000002\";\n\n/** How many ids one call of each batched door takes. */\nexport const SCOPES_PER_CALL = 500;\nexport const SCOPE_TYPES_PER_FIELDS_CALL = 100;\n/** `custom.context_values` refuses more than this many scopes in one call. */\nexport const SCOPES_PER_VALUES_CALL = 200;\n/** One page of a type's scopes (the door's default; it answers at most 1000). */\nexport const TYPE_SCOPES_PAGE = 200;\n/** The archive answers at most this many rows a call (`custom.page_size` ceiling). */\nexport const ARCHIVED_SCOPES_PAGE = 200;\n\nexport interface ScopeDoors {\n  // ── reads ──────────────────────────────────────────────────────────────────────────────────\n  /** Every live scope type of these organizations, each with its live scopes. */\n  tree(organizationIds: readonly Uuid[]): Promise<RecordsResult<ScopeTypeWithScopes[]>>;\n  /** The scope types of these organizations without their scopes (the first paint), with or without counts. */\n  types(organizationIds: readonly Uuid[], options?: { withCounts?: boolean }): Promise<RecordsResult<ScopeTypeSkeleton>>;\n  /** One page of one type's scopes, in the tree's order. */\n  typeScopesPage(scopeTypeId: Uuid, offset?: number, limit?: number): Promise<RecordsResult<ScopePage>>;\n  /** The scopes whose name holds `query` (case-insensitive), across these organizations. */\n  search(organizationIds: readonly Uuid[], query: string, limit?: number): Promise<RecordsResult<{ scopes: Scope[]; total: number }>>;\n  /** Scopes by id, each with its type's label, in whichever organization each lives. */\n  scopes(ids: readonly Uuid[]): Promise<RecordsResult<ScopeWithType[]>>;\n  /**\n   * The context fields (columns) of these scope types, each type's fields in their order (`sort`,\n   * then label) as the door answers them.\n   */\n  fields(scopeTypeIds: readonly Uuid[]): Promise<RecordsResult<ContextField[]>>;\n  /**\n   * One context field by its id, read in whichever of these organizations holds it (a Field is a\n   * record of the field kernel; its scope type is the Table it is defined on). Refused `not_found`\n   * when no organization answers it.\n   */\n  field(fieldId: Uuid, organizationIds: readonly Uuid[]): Promise<RecordsResult<ContextField>>;\n  /**\n   * The cells of these scopes. A text kept as a file is read whole through `readFileText`; without\n   * one (or when the file cannot be read) the cell keeps its first words and says so (`incomplete`).\n   */\n  values(scopeIds: readonly Uuid[], options?: { readFileText?: ReadContextFileText | null }): Promise<RecordsResult<ContextValue[]>>;\n  /** The archived scope types of one organization. */\n  archivedTypes(organizationId: Uuid): Promise<RecordsResult<ArchivedScopeType[]>>;\n  /** Of these scope ids, the ones that are ARCHIVED scopes of this type. */\n  archivedScopesOfType(organizationId: Uuid, scopeTypeId: Uuid, wanted: ReadonlySet<Uuid>): Promise<RecordsResult<ArchivedScope[]>>;\n  /** The System Context items (not scopes: the platform's own ambient context). */\n  systemItems(): Promise<RecordsResult<SystemContextField[]>>;\n  /** The table templates an organization's scope dataset fields may use (its own and the platform's). */\n  tableTemplates(organizationId: Uuid): Promise<RecordsResult<TableTemplate[]>>;\n  /** The scope templates of the gallery. */\n  templates(): Promise<RecordsResult<ScopeTemplate[]>>;\n\n  // ── writes ─────────────────────────────────────────────────────────────────────────────────\n  /** A new scope type in `organizationId`. */\n  createType(organizationId: Uuid, spec: ScopeTypeSpec): Promise<RecordsResult<ScopeType>>;\n  /** Change a scope type (only the keys given). */\n  updateType(typeId: Uuid, spec: ScopeTypeSpec): Promise<RecordsResult<ScopeType>>;\n  /** Archive a scope type; its scopes and fields come back with a restore. */\n  archiveType(typeId: Uuid): Promise<RecordsResult<{ id: Uuid }>>;\n  restoreType(typeId: Uuid): Promise<RecordsResult<{ id: Uuid }>>;\n  /** A new scope of `typeId` in `organizationId`. */\n  createScope(organizationId: Uuid, typeId: Uuid, spec: ScopeSpec): Promise<RecordsResult<Scope>>;\n  updateScope(scopeId: Uuid, spec: ScopeSpec): Promise<RecordsResult<Scope>>;\n  archiveScope(scopeId: Uuid): Promise<RecordsResult<{ id: Uuid }>>;\n  restoreScope(scopeId: Uuid): Promise<RecordsResult<{ id: Uuid }>>;\n  /** A new context field (column) on a scope type. Answers the field as the read door does. */\n  createField(scopeTypeId: Uuid, spec: ContextFieldSpec): Promise<RecordsResult<ContextField>>;\n  /** Change a context field (`null` clears a key). Answers the field as the read door does. */\n  updateField(fieldId: Uuid, scopeTypeId: Uuid, spec: ContextFieldSpec): Promise<RecordsResult<ContextField>>;\n  archiveField(fieldId: Uuid): Promise<RecordsResult<{ id: Uuid }>>;\n  restoreField(fieldId: Uuid): Promise<RecordsResult<{ id: Uuid }>>;\n  /** Write one cell. */\n  writeValue(write: ContextValueWrite): Promise<RecordsResult<ContextValueWritten>>;\n  /**\n   * G11. The record-store Table a context scope's template-bound item provisions — one per item and\n   * scope (`custom.scope_table_provision`). A scope provisioned before the move answers with its moved\n   * Table (same id); the Home defaults to the organization's own. `organization_id` null lets the door\n   * read the scope's own organization.\n   */\n  tableProvision(args: { organization_id: Uuid | null; item_id: Uuid; scope_id: Uuid; home_id?: Uuid | null }): Promise<RecordsResult<Uuid>>;\n}\n\nconst uniq = (ids: readonly string[]): string[] => [...new Set(ids.filter(Boolean))];\n\n/** The ids in batches of `size`, each batch one call, answers concatenated in order. */\nasync function inBatches<T>(\n  ids: readonly string[],\n  size: number,\n  call: (batch: string[]) => Promise<RecordsResult<T[] | null>>,\n): Promise<RecordsResult<T[]>> {\n  const unique = uniq(ids);\n  const batches: string[][] = [];\n  for (let i = 0; i < unique.length; i += size) batches.push(unique.slice(i, i + size));\n  const answers = await Promise.all(batches.map(call));\n  const out: T[] = [];\n  for (const a of answers) {\n    if (!a.ok) return a;\n    out.push(...(a.data ?? []));\n  }\n  return { ok: true, data: out };\n}\n\n/** A write door's answer: `{ ok, writer, row, store }`. */\ninterface WriteAnswer {\n  ok?: boolean;\n  row?: Record<string, unknown> | null;\n}\n\nfunction noRow<T>(door: string): RecordsResult<T> {\n  return { ok: false, error: { code: \"internal\", message: `${door} answered without the row it wrote.`, diagnostic: `@ai-matrx/records/scopes: ${door}` } };\n}\n\n/** The value door answers its own envelope; its codes, as the package's. */\nconst VALUE_DOOR_CODES: Record<string, RecordsErrorCode> = {\n  unauthorized: \"door\",\n  forbidden: \"door\",\n  forbidden_org: \"door\",\n  not_found: \"not_found\",\n  invalid_argument: \"invalid_argument\",\n  conflict: \"stale_write\",\n  unavailable: \"not_supported\",\n};\n\nexport function createScopeDoors(call: ScopeDoorCall): ScopeDoors {\n  async function write(door: string, args: Record<string, unknown>): Promise<RecordsResult<Record<string, unknown>>> {\n    const res = await call<WriteAnswer>(door, args, `scopes.${door}`);\n    if (!res.ok) return res;\n    const row = res.data?.row;\n    if (!row || typeof row !== \"object\") return noRow(door);\n    return { ok: true, data: row };\n  }\n\n  async function archiveOrRestore(door: string, args: Record<string, unknown>, id: Uuid): Promise<RecordsResult<{ id: Uuid }>> {\n    const res = await call<unknown>(door, args, `scopes.${door}`);\n    return res.ok ? { ok: true, data: { id } } : res;\n  }\n\n  async function fieldById(scopeTypeId: Uuid, fieldId: Uuid, door: string): Promise<RecordsResult<ContextField>> {\n    const fields = await doors.fields([scopeTypeId]);\n    if (!fields.ok) return fields;\n    const field = fields.data.find((f) => f.id === fieldId);\n    return field ? { ok: true, data: field } : noRow(door);\n  }\n\n  const doors: ScopeDoors = {\n    async tree(organizationIds) {\n      const ids = uniq(organizationIds);\n      if (ids.length === 0) return { ok: true, data: [] };\n      const res = await call<{ types?: StoreTypeRow[]; scopes?: StoreScopeRow[] } | null>(\"context_tree\", { p_organization_ids: ids }, \"scopes.tree\");\n      if (!res.ok) return res;\n      const byType = new Map<string, Scope[]>();\n      for (const s of res.data?.scopes ?? []) {\n        const scope = scopeFromStore(s);\n        const list = byType.get(scope.scope_type_id) ?? [];\n        list.push(scope);\n        byType.set(scope.scope_type_id, list);\n      }\n      return { ok: true, data: (res.data?.types ?? []).map((t) => ({ ...scopeTypeFromStore(t), scopes: byType.get(t.id) ?? [] })) };\n    },\n\n    async types(organizationIds, options) {\n      const withCounts = options?.withCounts ?? true;\n      const ids = uniq(organizationIds);\n      if (ids.length === 0) return { ok: true, data: { types: [], counts: withCounts ? {} : null } };\n      const res = await call<{ types?: StoreTypeRow[] } | null>(\"context_tree_types\", { p_organization_ids: ids, p_with_counts: withCounts }, \"scopes.types\");\n      if (!res.ok) return res;\n      const rows = res.data?.types ?? [];\n      const counts: Record<string, number> | null = withCounts ? {} : null;\n      if (counts) for (const r of rows) counts[r.id] = Number(r.scope_count ?? 0);\n      return { ok: true, data: { types: rows.map(scopeTypeFromStore), counts } };\n    },\n\n    async typeScopesPage(scopeTypeId, offset = 0, limit = TYPE_SCOPES_PAGE) {\n      const res = await call<{ scopes?: StoreScopeRow[]; total?: number; next_offset?: number | null } | null>(\n        \"context_tree_type_scopes\",\n        { p_scope_type_id: scopeTypeId, p_offset: offset, p_limit: limit },\n        \"scopes.typeScopesPage\",\n      );\n      if (!res.ok) return res;\n      return {\n        ok: true,\n        data: { scopes: (res.data?.scopes ?? []).map(scopeFromStore), total: Number(res.data?.total ?? 0), next_offset: res.data?.next_offset ?? null },\n      };\n    },\n\n    async search(organizationIds, query, limit = 100) {\n      const ids = uniq(organizationIds);\n      const q = query.trim();\n      if (ids.length === 0 || q === \"\") return { ok: true, data: { scopes: [], total: 0 } };\n      const res = await call<{ scopes?: StoreScopeRow[]; total?: number } | null>(\n        \"context_tree_search\",\n        { p_organization_ids: ids, p_query: q, p_limit: limit },\n        \"scopes.search\",\n      );\n      if (!res.ok) return res;\n      return { ok: true, data: { scopes: (res.data?.scopes ?? []).map(scopeFromStore), total: Number(res.data?.total ?? 0) } };\n    },\n\n    async scopes(ids) {\n      const res = await inBatches(ids, SCOPES_PER_CALL, (batch) => call<StoreScopeRow[]>(\"context_scopes\", { p_scope_ids: batch }, \"scopes.scopes\"));\n      return res.ok ? { ok: true, data: res.data.map(scopeWithTypeFromStore) } : res;\n    },\n\n    async fields(scopeTypeIds) {\n      const res = await inBatches(scopeTypeIds, SCOPE_TYPES_PER_FIELDS_CALL, (batch) =>\n        call<StoreItemRow[]>(\"context_items\", { p_scope_type_ids: batch }, \"scopes.fields\"),\n      );\n      return res.ok ? { ok: true, data: res.data.map(contextFieldFromStore) } : res;\n    },\n\n    async field(fieldId, organizationIds) {\n      const orgs = uniq(organizationIds);\n      const answers = await Promise.all(\n        orgs.map((org) =>\n          call<Array<{ id: string; document?: { entity_definition_id?: unknown } | null }> | null>(\n            \"read_records_by_ids\",\n            { p_organization_id: org, p_table_id: FIELD_KERNEL_ID, p_record_ids: [fieldId], p_by_id: false },\n            \"scopes.field\",\n          ),\n        ),\n      );\n      let refusal: RecordsResult<ContextField> | null = null;\n      for (const answer of answers) {\n        if (!answer.ok) {\n          refusal ??= answer;\n          continue;\n        }\n        const typeId = answer.data?.find((r) => r.id === fieldId)?.document?.entity_definition_id;\n        if (typeof typeId !== \"string\") continue;\n        const fields = await doors.fields([typeId]);\n        if (!fields.ok) return fields;\n        const field = fields.data.find((f) => f.id === fieldId);\n        if (field) return { ok: true, data: field };\n      }\n      return (\n        refusal ?? {\n          ok: false,\n          error: { code: \"not_found\", message: \"This context field could not be found.\", diagnostic: `@ai-matrx/records/scopes: field ${fieldId}` },\n        }\n      );\n    },\n\n    async values(scopeIds, options) {\n      const res = await inBatches(scopeIds, SCOPES_PER_VALUES_CALL, (batch) =>\n        call<StoreValueRow[]>(\"context_values\", { p_scope_ids: batch }, \"scopes.values\"),\n      );\n      if (!res.ok) return res;\n      const cells = res.data.map(contextValueFromStore);\n      await completeWholeValues(cells, options?.readFileText ?? null);\n      return { ok: true, data: cells };\n    },\n\n    async archivedTypes(organizationId) {\n      const res = await call<StoreArchivedTypeRow[] | null>(\"context_archived_types\", { p_organization_id: organizationId }, \"scopes.archivedTypes\");\n      return res.ok ? { ok: true, data: (res.data ?? []).map(archivedScopeTypeFromStore) } : res;\n    },\n\n    async archivedScopesOfType(organizationId, scopeTypeId, wanted) {\n      const out: ArchivedScope[] = [];\n      for (let offset = 0; out.length < wanted.size; offset += ARCHIVED_SCOPES_PAGE) {\n        const res = await call<Array<{ id: string; document?: { name?: unknown; slug?: unknown } | null; archived_at?: string | null }> | null>(\n          \"read_records_archived\",\n          { p_organization_id: organizationId, p_table_id: scopeTypeId, p_lane: \"org\", p_by_id: false, p_limit: ARCHIVED_SCOPES_PAGE, p_offset: offset },\n          \"scopes.archivedScopesOfType\",\n        );\n        if (!res.ok) return res;\n        const rows = res.data ?? [];\n        for (const r of rows) {\n          if (!wanted.has(r.id)) continue;\n          out.push({\n            id: r.id,\n            name: typeof r.document?.name === \"string\" ? r.document.name : null,\n            slug: typeof r.document?.slug === \"string\" ? r.document.slug : null,\n            archived_at: r.archived_at ?? null,\n          });\n        }\n        if (rows.length < ARCHIVED_SCOPES_PAGE) break;\n      }\n      return { ok: true, data: out };\n    },\n\n    async systemItems() {\n      const res = await call<StoreSystemItemRow[] | null>(\"context_system_items\", {}, \"scopes.systemItems\");\n      return res.ok ? { ok: true, data: (res.data ?? []).map(systemContextFieldFromStore) } : res;\n    },\n\n    async tableTemplates(organizationId) {\n      const res = await call<TableTemplate[] | null>(\"table_templates\", { p_org_id: organizationId }, \"scopes.tableTemplates\");\n      return res.ok ? { ok: true, data: Array.isArray(res.data) ? res.data : [] } : res;\n    },\n\n    async templates() {\n      const res = await call<ScopeTemplate[] | null>(\"context_templates\", {}, \"scopes.templates\");\n      return res.ok ? { ok: true, data: res.data ?? [] } : res;\n    },\n\n    async createType(organizationId, spec) {\n      const slug = resolveSlug(spec.slug, spec.label_plural || spec.label_singular || \"\");\n      if (!slug.ok) return slug;\n      const res = await write(\"context_type_write\", {\n        p_organization_id: organizationId,\n        p_type_id: null,\n        p_spec: definedOnly({\n          label_singular: spec.label_singular,\n          label_plural: spec.label_plural,\n          icon: spec.icon ?? \"folder\",\n          description: spec.description ?? \"\",\n          sort_order: spec.sort_order ?? 0,\n          max_assignments: spec.max_assignments_per_entity ?? undefined,\n          default_variable_keys: spec.default_variable_keys ?? [],\n          color: spec.color,\n          slug: slug.data,\n        }),\n      });\n      return res.ok ? { ok: true, data: scopeTypeFromStore(res.data as unknown as StoreTypeRow) } : res;\n    },\n\n    async updateType(typeId, spec) {\n      let slug: string | undefined;\n      if (spec.slug !== undefined) {\n        const resolved = resolveSlug(spec.slug, spec.label_plural ?? spec.label_singular ?? \"\");\n        if (!resolved.ok) return resolved;\n        slug = resolved.data;\n      }\n      const res = await write(\"context_type_write\", {\n        p_organization_id: null,\n        p_type_id: typeId,\n        p_spec: definedOnly({\n          label_singular: spec.label_singular,\n          label_plural: spec.label_plural,\n          icon: spec.icon,\n          description: spec.description,\n          sort_order: spec.sort_order,\n          max_assignments: spec.max_assignments_per_entity,\n          color: spec.color,\n          slug,\n        }),\n      });\n      return res.ok ? { ok: true, data: scopeTypeFromStore(res.data as unknown as StoreTypeRow) } : res;\n    },\n\n    archiveType: (typeId) => archiveOrRestore(\"context_type_archive\", { p_type_id: typeId }, typeId),\n    restoreType: (typeId) => archiveOrRestore(\"context_type_restore\", { p_type_id: typeId }, typeId),\n\n    async createScope(organizationId, typeId, spec) {\n      const slug = resolveSlug(spec.slug, spec.name ?? \"\");\n      if (!slug.ok) return slug;\n      const res = await write(\"context_scope_write\", {\n        p_organization_id: organizationId,\n        p_scope_id: null,\n        p_type_id: typeId,\n        p_spec: definedOnly({\n          name: spec.name,\n          parent_scope_id: spec.parent_scope_id,\n          description: spec.description ?? \"\",\n          settings: spec.settings ?? {},\n          slug: slug.data,\n          sort_order: spec.sort_order,\n        }),\n      });\n      return res.ok ? { ok: true, data: scopeFromStore(res.data as unknown as StoreScopeRow) } : res;\n    },\n\n    async updateScope(scopeId, spec) {\n      let slug: string | undefined;\n      if (spec.slug !== undefined) {\n        const resolved = resolveSlug(spec.slug, spec.name ?? \"\");\n        if (!resolved.ok) return resolved;\n        slug = resolved.data;\n      }\n      const res = await write(\"context_scope_write\", {\n        p_organization_id: null,\n        p_scope_id: scopeId,\n        p_type_id: null,\n        p_spec: definedOnly({ name: spec.name, description: spec.description, settings: spec.settings, slug, sort_order: spec.sort_order }),\n      });\n      return res.ok ? { ok: true, data: scopeFromStore(res.data as unknown as StoreScopeRow) } : res;\n    },\n\n    archiveScope: (scopeId) => archiveOrRestore(\"context_scope_archive\", { p_scope_id: scopeId }, scopeId),\n    restoreScope: (scopeId) => archiveOrRestore(\"context_scope_restore\", { p_scope_id: scopeId }, scopeId),\n\n    async createField(scopeTypeId, spec) {\n      const res = await write(\"context_item_write\", {\n        p_item_id: null,\n        p_scope_type_id: scopeTypeId,\n        p_spec: fieldSpecForDoor({ kind: \"string\", description: \"\", context_policy: \"on_request\", sensitivity: \"internal\", tags: [], ...spec }),\n      });\n      if (!res.ok) return res;\n      return fieldById(scopeTypeId, String(res.data.id), \"context_item_write\");\n    },\n\n    async updateField(fieldId, scopeTypeId, spec) {\n      const res = await write(\"context_item_write\", { p_item_id: fieldId, p_scope_type_id: null, p_spec: fieldSpecForDoor(spec) });\n      if (!res.ok) return res;\n      return fieldById(scopeTypeId, fieldId, \"context_item_write\");\n    },\n\n    archiveField: (fieldId) => archiveOrRestore(\"context_item_archive\", { p_item_id: fieldId }, fieldId),\n    restoreField: (fieldId) => archiveOrRestore(\"context_item_restore\", { p_item_id: fieldId }, fieldId),\n\n    async writeValue(cell) {\n      const res = await call<{ ok?: boolean; data?: { version?: number; source_type?: string }; error?: { code?: string; message?: string } } | null>(\n        \"context_value_write\",\n        { p_payload: { source_type: \"ai_enriched\", ...valuePayloadForDoor(cell) } },\n        \"scopes.writeValue\",\n      );\n      if (!res.ok) return res;\n      const envelope = res.data ?? {};\n      if (!envelope.ok) {\n        const code = VALUE_DOOR_CODES[envelope.error?.code ?? \"\"] ?? \"internal\";\n        return { ok: false, error: { code, message: envelope.error?.message ?? \"The value was not saved.\" } };\n      }\n      return {\n        ok: true,\n        data: {\n          scope_id: cell.scope_id,\n          field_id: cell.field_id,\n          version: Number(envelope.data?.version ?? 1),\n          source_type: String(envelope.data?.source_type ?? cell.source_type ?? \"ai_enriched\"),\n        },\n      };\n    },\n\n    tableProvision({ organization_id, item_id, scope_id, home_id }) {\n      return call<Uuid>(\n        \"scope_table_provision\",\n        { p_organization_id: organization_id, p_item_id: item_id, p_scope_id: scope_id, p_home_id: home_id ?? null },\n        \"scopeTableProvision\",\n      );\n    },\n  };\n  return doors;\n}\n","// src/core/pickListDoors.ts — @ai-matrx/records · THE PICK-LIST DOORS (HEADLESS, LIGHT)\n//\n// One call each, through the one door call (./doorCall). The records client spreads these into\n// itself; `@ai-matrx/records/door-call` hands them to a shell that only reads or rewrites a pick\n// list, so it never carries the store client. The list is read by its own id; its organization is\n// the list's own, never the client's.\n\nimport type { Uuid } from \"../record\";\nimport type { RecordsResult } from \"../results\";\nimport type { PickListDocument, PickListIndexDocument, PickListItemInput } from \"../pick-list\";\nimport type { DoorCall } from \"./doorCall\";\n\nexport interface PickListDoors {\n  /**\n   * PICK-LISTS: every pick list a person may open in ONE organization (`custom.pick_list_index`): id, name and\n   * choice count, nothing else. Read only when a picker opens (the load law), never with the screen.\n   */\n  pickListIndex(args: { organization_id: Uuid }): Promise<RecordsResult<PickListIndexDocument | null>>;\n  /**\n   * PICK-LISTS: a pick list with its choices, grouped (`custom.pick_list_get`; viewer access on the list).\n   * The list is read by its own id; its organization is the list's own, never the client's.\n   */\n  pickListGet(args: { list_id: Uuid }): Promise<RecordsResult<PickListDocument | null>>;\n  /** PICK-LISTS: a pick list for a selection control (`custom.pick_list_for_selection`): labels, help, groups, icons, NEVER the secret description. */\n  pickListForSelection(args: { list_id: Uuid }): Promise<RecordsResult<PickListDocument | null>>;\n  /**\n   * PICK-LISTS: rename / describe a pick list and, with `items`, REPLACE its choices\n   * (`custom.pick_list_update`; editor access). The replaced choices are archived, soft and restorable.\n   */\n  pickListUpdate(args: {\n    list_id: Uuid;\n    list_name?: string | null;\n    description?: string | null;\n    items?: readonly PickListItemInput[] | null;\n  }): Promise<RecordsResult<PickListDocument | null>>;\n}\n\n/** The door names (guard: each is in the generated catalog — `door-call-entry.test.ts`). */\nexport const PICK_LIST_DOORS = {\n  pickListIndex: \"pick_list_index\",\n  pickListGet: \"pick_list_get\",\n  pickListForSelection: \"pick_list_for_selection\",\n  pickListUpdate: \"pick_list_update\",\n} as const;\n\nexport function createPickListDoors(callDoor: DoorCall): PickListDoors {\n  return {\n    async pickListIndex({ organization_id }) {\n      return callDoor<PickListIndexDocument | null>(\n        PICK_LIST_DOORS.pickListIndex,\n        { p_organization_id: organization_id },\n        \"pickListIndex\",\n      );\n    },\n\n    async pickListGet({ list_id }) {\n      return callDoor<PickListDocument | null>(PICK_LIST_DOORS.pickListGet, { p_list_id: list_id }, \"pickListGet\");\n    },\n\n    async pickListForSelection({ list_id }) {\n      return callDoor<PickListDocument | null>(\n        PICK_LIST_DOORS.pickListForSelection,\n        { p_list_id: list_id },\n        \"pickListForSelection\",\n      );\n    },\n\n    async pickListUpdate({ list_id, list_name, description, items }) {\n      return callDoor<PickListDocument | null>(\n        PICK_LIST_DOORS.pickListUpdate,\n        {\n          p_list_id: list_id,\n          p_list_name: list_name ?? null,\n          p_description: description ?? null,\n          p_items: items ? [...items] : null,\n        },\n        \"pickListUpdate\",\n      );\n    },\n  };\n}\n","// src/choice.ts — @ai-matrx/records\n//\n// WHAT A CHOICE VALUE IS, in one place, for every screen and every caller.\n//\n// A pick-list is a Table and an option is a Record of it (FLD-5 / FLD-6) — that part is\n// unchanged and is the store being right. What a CELL holds is not the option record's id: it\n// is the option's own stable key, a short word derived from its title when the option is born,\n// unique within its list and never rewritten. So renaming \"Circle\" to \"Round\" rewrites no row,\n// and nothing — no person, no agent, no import — is ever asked to know a uuid for a word the\n// product showed them.\n//\n// The read doors hand back the LABEL in the cell and name the key beside it in `_choices`:\n//\n//   { \"kind\": \"Circle\",\n//     \"_choices\": { \"kind\": { \"key\": \"circle\", \"label\": \"Circle\", \"id\": \"…\",\n//                             \"retired\": false, \"reason\": null } } }\n//\n// A multi-choice cell reads as an array of labels and its `_choices` entry is an array in the\n// same order. A RETIRED option is in there too, with `retired: true` and the reason — a value\n// whose choice was retired reads as its label and says what happened rather than vanishing.\n//\n// WRITING takes the label, the key, or (so nothing that worked yesterday breaks) the option\n// record's id. The store normalizes all three to the key on the way in and refuses a word that\n// names no choice, naming the choices themselves.\n\nimport type { RecordDocument, StoredRecord } from \"./record\";\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\n\n/** One option, as `_choices` names it and as `optionsOf` returns it. */\nexport interface ChoiceOption {\n  /** The stable key the cell actually holds. */\n  key: string;\n  /** What a person reads. */\n  label: string;\n  /** The option RECORD's id, for a caller that needs the row itself. */\n  id?: string;\n  /** True when the option was retired: still readable, no longer pickable. */\n  retired?: boolean;\n  /** Why it is no longer offered, in a sentence, when it is retired. */\n  reason?: string | null;\n}\n\n/**\n * The stable key of an option RECORD as `custom.field_options` returns it.\n *\n * It lives in `metadata.option_key`, not in the document: FLD-5 keeps a category to one title\n * field, and the key is the store's own bookkeeping rather than a column anybody declared.\n * The fallback is the same slug the store derives, so an option written by something that has\n * not caught up still answers.\n */\nexport function optionKey(option: StoredRecord): string {\n  const stored = option.metadata?.[\"option_key\"];\n  if (typeof stored === \"string\" && stored.trim() !== \"\") return stored;\n  return choiceSlug(optionLabel(option));\n}\n\n/** What a person reads on an option record. */\nexport function optionLabel(option: StoredRecord): string {\n  const doc = option.data as RecordDocument | undefined;\n  const title = doc?.[\"title\"] ?? doc?.[\"name\"];\n  if (typeof title === \"string\" && title.trim() !== \"\") return title;\n  return \"Unnamed choice\";\n}\n\n/**\n * The store's own slug, mirrored so a client can predict a key without a round trip.\n * `custom.choice_slug` is the original; a title with nothing a-z0-9 in it gets a short hash of\n * itself there, and this returns the empty-ish fallback rather than guessing a hash — a caller\n * that needs the real key for such a title reads it off the option.\n */\nexport function choiceSlug(word: string): string {\n  const slug = word\n    .trim()\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"_\")\n    .replace(/^_+|_+$/g, \"\")\n    .slice(0, 55);\n  return slug === \"\" ? \"choice\" : slug;\n}\n\n/**\n * Does this stored (or typed) value name this option? The key, the label and the option's own\n * id all name the same choice, and a control has to recognize every one of them: what the read\n * door hands it is the LABEL, what the store holds is the KEY, and what a screen written before\n * this contract sends is the ID.\n */\nexport function isTheChosen(option: StoredRecord, value: unknown): boolean {\n  if (typeof value !== \"string\") return false;\n  const asked = value.trim().toLowerCase();\n  if (asked === \"\") return false;\n  return (\n    asked === optionKey(option).toLowerCase() ||\n    asked === optionLabel(option).toLowerCase() ||\n    asked === option.id.toLowerCase()\n  );\n}\n\n/** Every value of one cell, as strings, whether the Field is multi or not. */\nexport function choiceValuesOf(value: unknown): string[] {\n  if (Array.isArray(value)) return value.filter((v): v is string => typeof v === \"string\");\n  if (typeof value === \"string\" && value !== \"\") return [value];\n  return [];\n}\n\n/**\n * What the read door said about one column's choices: the key behind the label, and whether the\n * option was retired and why. Returns an empty array when the document carries no `_choices`\n * entry for that column, which is also what a document written before this contract looks like.\n */\nexport function choicesOf(document: RecordDocument | undefined, fieldKeyOrId: string): ChoiceOption[] {\n  const block = document?.[\"_choices\"];\n  if (!block || typeof block !== \"object\") return [];\n  const entry = (block as Record<string, unknown>)[fieldKeyOrId];\n  if (!entry) return [];\n  const list = Array.isArray(entry) ? entry : [entry];\n  return list.filter((x): x is ChoiceOption => !!x && typeof x === \"object\" && typeof (x as ChoiceOption).key === \"string\");\n}\n\n/** True when this cell's value points at a choice that has since been retired. */\nexport function holdsARetiredChoice(document: RecordDocument | undefined, fieldKeyOrId: string): boolean {\n  return choicesOf(document, fieldKeyOrId).some((c) => c.retired === true);\n}\n\n/** True when a token looks like a uuid — which a choice value is no longer allowed to be. */\nexport function looksLikeAnId(value: unknown): boolean {\n  return typeof value === \"string\" && isUuidShape(value);\n}\n\n/* ═══ WORDS TYPED INTO A CHOICE CELL THAT ARE NOT A CHOICE (lane CHOICE-COLUMN-EDIT) ═══════════\n *\n * A software team's \"Account Type\" column offers Cursor · Claude · Codex, and somebody types\n * \"Gemini\". Three answers are possible and the store has a door for each: add it to the choices\n * and the cell takes it (`recordUpdateAddingChoices`), keep it as typed on a column that takes\n * other values (`config.allow_other` — an ordinary `recordUpdate`), or refuse it. Which one is\n * the Feature Knob `custom/choice_nudge` (`choiceNudge()`), and this is the ONE place that\n * reads it, so the grid, the record form and every other surface answer the same way.\n */\n\n/** The Feature Knob `custom/choice_nudge`: ask (the default), always add, or never add. */\nexport type ChoiceNudge = \"ask\" | \"always_add\" | \"never_add\";\n\nexport const CHOICE_NUDGES: readonly ChoiceNudge[] = [\"ask\", \"always_add\", \"never_add\"];\n\n/** Any answer the knob door gives, as one of the three; anything unknown is the default, `ask`. */\nexport function asChoiceNudge(value: unknown): ChoiceNudge {\n  return typeof value === \"string\" && (CHOICE_NUDGES as readonly string[]).includes(value) ? (value as ChoiceNudge) : \"ask\";\n}\n\n/** What `decideTypedChoice` answers. */\nexport type TypedChoiceDecision =\n  /** Nothing was typed. */\n  | { decision: \"empty\" }\n  /** The words name a live choice (by its words or its key, any case): write `key`. */\n  | { decision: \"chosen\"; key: string; label: string }\n  /** Ask the person. `keepOffered` is true only when the column takes other values. */\n  | { decision: \"ask\"; words: string; keepOffered: boolean }\n  /** Add the words to the choices and the cell takes them — without asking (`always_add`). */\n  | { decision: \"add\"; words: string }\n  /** Keep the words as typed, an \"other\" value (`never_add` on a column that takes other values). */\n  | { decision: \"keep_as_typed\"; words: string }\n  /** The words are not one of the choices and nothing may add them (`never_add`, closed column). */\n  | { decision: \"not_a_choice\"; words: string };\n\n/** A choice as either door hands it: an option record (`fieldOptions`) or a `_choices` entry. */\nexport type ChoiceLike = StoredRecord | ChoiceOption;\n\nfunction choiceKeyAndLabel(option: ChoiceLike): { key: string; label: string; retired: boolean } {\n  if (typeof (option as ChoiceOption).key === \"string\" && typeof (option as ChoiceOption).label === \"string\") {\n    const o = option as ChoiceOption;\n    return { key: o.key, label: o.label, retired: o.retired === true };\n  }\n  // `custom.field_options` answers LIVE options only, so an option record is never retired.\n  const record = option as StoredRecord;\n  return { key: optionKey(record), label: optionLabel(record), retired: false };\n}\n\n/**\n * THE ONE DECISION for words typed into a choice cell.\n *\n * `options` are the column's choices; a retired one is not pickable, so words naming only a\n * retired choice are treated as new (adding them brings the retired choice back, which is what\n * the store does). `nudge` absent or unknown is `ask`.\n */\nexport function decideTypedChoice(args: {\n  words: string;\n  options: readonly ChoiceLike[];\n  allowOther: boolean;\n  nudge?: ChoiceNudge | string | null | undefined;\n}): TypedChoiceDecision {\n  const words = args.words.trim();\n  if (words === \"\") return { decision: \"empty\" };\n  const asked = words.toLowerCase();\n  for (const option of args.options) {\n    const { key, label, retired } = choiceKeyAndLabel(option);\n    if (retired) continue;\n    if (label.toLowerCase() === asked || key.toLowerCase() === asked) return { decision: \"chosen\", key, label };\n  }\n  const nudge = asChoiceNudge(args.nudge);\n  if (nudge === \"always_add\") return { decision: \"add\", words };\n  if (nudge === \"never_add\") return args.allowOther ? { decision: \"keep_as_typed\", words } : { decision: \"not_a_choice\", words };\n  return { decision: \"ask\", words, keepOffered: args.allowOther };\n}\n\n/* ═══ REMOVING A CHOICE THAT RECORDS STILL HOLD (lane CHOICE-TAILS, 2026-09-27) ════════════════\n *\n * A dental front desk's \"Visit Type\" offers Cleaning · Exam · X-ray · Whitening, and the office\n * stops booking X-rays as their own visit. Removing X-ray used to leave every record that held it\n * holding a retired choice, with nobody asked. Now the column editor asks, Notion-style:\n * \"3 records use “X-ray”.\" — move them to another choice, keep the words as other values (only\n * where the column takes other values), or clear them. The answer goes in the SAME save as the\n * list (`fieldUpdateRehomingChoices`), and that save answers its own undo.\n */\n\n/** How many records hold one choice (`custom.field_choice_usage`), keyed by the option's id. */\nexport interface ChoiceUsage {\n  key: string;\n  words: string;\n  retired: boolean;\n  /** Live records the caller may see whose cell holds the choice. */\n  records: number;\n}\n\n/** Where the records of a removed choice go. */\nexport type ChoiceRehome =\n  | { then: \"move\"; to: string }\n  | { then: \"keep\" }\n  | { then: \"clear\" };\n\n/** One cell as it was before a rehoming save — what its undo writes back. */\nexport interface ChoiceCellBack {\n  record_id: string;\n  value: unknown;\n}\n\n/** What `fieldUpdateRehomingChoices` answers. */\nexport interface ChoicesRehomed {\n  field_id: string;\n  rehomed: Array<{ choice_id: string; words: string; then: ChoiceRehome[\"then\"]; to: string | null; records: number }>;\n  cells_back: number;\n  /** Send `{ patch: { options: undo.options }, cells_back: undo.cells_back }` to put it all back. */\n  undo: { options: Array<{ id: string; words: string }>; cells_back: ChoiceCellBack[] };\n}\n\n/**\n * THE CHOICES A LIST NO LONGER NAMES THAT RECORDS STILL HOLD — the ones the editor must ask about.\n * `beforeIds` is the list as the store answered it, `afterIds` the list as the person has it now.\n */\nexport function removedChoicesInUse(\n  beforeIds: readonly string[],\n  afterIds: readonly string[],\n  usage: Readonly<Record<string, ChoiceUsage>> | null | undefined,\n): Array<{ id: string; words: string; records: number }> {\n  if (!usage) return [];\n  const kept = new Set(afterIds);\n  return beforeIds\n    .filter((id) => !kept.has(id))\n    .map((id) => ({ id, words: usage[id]?.words ?? \"\", records: usage[id]?.records ?? 0 }))\n    .filter((c) => c.records > 0);\n}\n\n/** “1 record uses “X-ray”.” · “3 records use “X-ray”.” — the question's first line. */\nexport function recordsUseSentence(records: number, words: string): string {\n  return `${records} ${records === 1 ? \"record uses\" : \"records use\"} “${words}”.`;\n}\n\n/** What the answer will do, said before Save: “3 records move to “Exam”.” */\nexport function rehomeSentence(records: number, words: string, rehome: ChoiceRehome, toWords?: string): string {\n  const n = `${records} ${records === 1 ? \"record\" : \"records\"}`;\n  if (rehome.then === \"move\") return `${n} that ${records === 1 ? \"holds\" : \"hold\"} “${words}” ${records === 1 ? \"moves\" : \"move\"} to “${toWords ?? \"another choice\"}”.`;\n  if (rehome.then === \"keep\") return `${n} ${records === 1 ? \"keeps\" : \"keep\"} “${words}” as another value.`;\n  return `${n} that ${records === 1 ? \"holds\" : \"hold\"} “${words}” ${records === 1 ? \"is\" : \"are\"} cleared.`;\n}\n","// src/placement.ts — @ai-matrx/records\n//\n// WHO KEEPS A TABLE, AND WHETHER THE CONTEXT PICKER OFFERS IT (lane SC-1 PLACEMENT,\n// SCOPES-CONTEXT-TRANSITION.md §2.3 P1/P2 as amended by the plan attack, H5).\n//\n// The store answers these facts; this file only carries their shape and the two questions\n// every screen asks of them. It re-derives nothing — which tables a feature keeps is decided\n// ONCE, by `custom.table_placement` in the database, from the Table document's own keys and\n// the facts the door that made it already wrote (a column's choices, a scope's own table, a\n// checklist's steps, a booking page's holds, a workflow's states, the app's own tables).\n//\n//   platform_owned     the store's one flag. true = the app or one of its features keeps it,\n//                       and a person's list of tables shows it only behind \"Show everything\".\n//   kept_for            WHICH feature: context · choices · checklists · bookings · workflow ·\n//                       app · store, or whatever word the next feature brings. Null when the\n//                       organization keeps the table.\n//   offered_as_context  whether the context picker offers the Table. Only a Table somebody\n//                       marked (a scope type the scopes mover lands) is offered.\n//   foundation          lane 10 FD: part of the business's day-one data (Patients, Therapists,\n//                       Services). Independent of who keeps the table. Absent is false.\n//\n// Import-inert: types and pure functions, nothing else.\n\nimport type { Uuid } from \"./record\";\n\n/** The placement facts, as the Table document or `custom.table` carries them. */\nexport interface TablePlacement {\n  platform_owned?: boolean | null;\n  kept_for?: string | null;\n  offered_as_context?: boolean | null;\n  foundation?: boolean | null;\n}\n\n/**\n * One row of `custom.table_facts` since SC-1 — the two lane facts it always answered\n * (`visibility`, `mine`) and the placement, with the sentence a person reads and where the\n * table is used. A store without the SC-1 door answers the first three columns only; every\n * placement column is then `undefined`, and the readers below treat the table as the\n * organization's own — exactly what that store's older screens did.\n */\nexport interface TablePlacementFact extends TablePlacement {\n  table_id: Uuid;\n  visibility: string;\n  mine: boolean;\n  /** The heading a kept table is listed under: \"The context system\", \"The choices behind your columns\", … */\n  keeper_group?: string | null;\n  /** One plain sentence: who keeps it and where it opens from. Null for the organization's own. */\n  keeper_says?: string | null;\n  /** Where the table is used: `table` (another Table, or itself) or `scope` (a context scope). */\n  used_in_kind?: \"table\" | \"scope\" | null;\n  used_in_id?: Uuid | null;\n  /** The Table that page belongs to, when `used_in_kind` is `table`. */\n  used_in_table_id?: Uuid | null;\n}\n\n/** Whether a person's list of tables keeps this one out of sight until \"Show everything\". */\nexport function keptOutOfSight(placement: TablePlacement | null | undefined): boolean {\n  return placement?.platform_owned === true;\n}\n\n/** Whether the Table is part of the business's day-one data (lane 10 FD). Absent is no. */\nexport function isFoundation(placement: TablePlacement | null | undefined): boolean {\n  return placement?.foundation === true;\n}\n\n/** Whether the context picker may offer this Table. Absent is no. */\nexport function offeredAsContext(placement: TablePlacement | null | undefined): boolean {\n  return placement?.offered_as_context === true;\n}\n\n/**\n * The placement facts folded onto a table list, by id. Pure — returns new objects and leaves\n * the list it was given alone. A table the facts do not name is returned unchanged.\n */\nexport function withTablePlacement<T extends { id: Uuid }>(\n  tables: readonly T[],\n  facts: readonly TablePlacementFact[] | null | undefined,\n): Array<T & Partial<TablePlacementFact>> {\n  if (!facts) return [...tables];\n  const byId = new Map(facts.map((f) => [f.table_id, f]));\n  return tables.map((table) => {\n    const fact = byId.get(table.id);\n    if (!fact || fact.platform_owned === undefined) return table;\n    return {\n      ...table,\n      platform_owned: fact.platform_owned,\n      kept_for: fact.kept_for ?? null,\n      offered_as_context: fact.offered_as_context ?? false,\n      foundation: fact.foundation ?? false,\n      keeper_group: fact.keeper_group ?? null,\n      keeper_says: fact.keeper_says ?? null,\n      used_in_kind: fact.used_in_kind ?? null,\n      used_in_id: fact.used_in_id ?? null,\n      used_in_table_id: fact.used_in_table_id ?? null,\n    };\n  });\n}\n\n/**\n * THE KEPT TABLES, GROUPED UNDER THEIR KEEPER, in the order each group first appears. A kept\n * table the store gave no heading goes under \"Platform tables\" — never dropped.\n */\nexport function keptGroups<T extends TablePlacement & Partial<TablePlacementFact>>(\n  tables: readonly T[],\n): Array<{ group: string; tables: T[] }> {\n  const out: Array<{ group: string; tables: T[] }> = [];\n  const at = new Map<string, number>();\n  for (const table of tables) {\n    if (!keptOutOfSight(table)) continue;\n    const group = table.keeper_group?.trim() || \"Platform tables\";\n    let i = at.get(group);\n    if (i === undefined) {\n      i = out.length;\n      at.set(group, i);\n      out.push({ group, tables: [] });\n    }\n    out[i]!.tables.push(table);\n  }\n  return out;\n}\n\n/**\n * WHERE A KEPT TABLE OPENS FROM (THE DOOR LAW): the host's own addresses for a table and for a\n * context scope, chosen by what the store said the table is used in. With nothing said, the\n * table's own page — a kept table is never a row with nowhere to go.\n */\nexport function keptTableHref(\n  fact: { table_id: Uuid } & Partial<TablePlacementFact>,\n  hrefs: { table: (tableId: Uuid) => string; scope: (scopeId: Uuid) => string },\n): string {\n  if (fact.used_in_kind === \"scope\" && fact.used_in_id) return hrefs.scope(fact.used_in_id);\n  if (fact.used_in_kind === \"table\" && (fact.used_in_table_id || fact.used_in_id)) {\n    return hrefs.table((fact.used_in_table_id || fact.used_in_id)!);\n  }\n  return hrefs.table(fact.table_id);\n}\n\n// ── WHERE A TABLE LIVES, AND MOVING IT (lane SC-1-TAILS; the owner, 2026-09-23: \"I am not seeing\n// how I can see what org this data is in … make it easy to see and set the org for something\") ──\n//\n// `custom.table_home` says which organization a Table lives in — read FROM THE TABLE, never from\n// the organization the person is working in — whether this person may move it and where to, and\n// what holds it in place; `custom.table_move` moves it (with every Table inside it or its rows)\n// or refuses with one sentence. These are the shapes and the two pure readers every screen uses:\n// `parseTableHome` reads the store's answer strictly (an answer it cannot read is \"could not\n// ask\", never a guess) and `moveConsequence` says what a move does before it happens (the\n// destructive-and-expensive-actions law). The client's `tableHome` / `tableMove` are the calls.\n\n/** One of the person's other organizations, and whether the Table can go there. */\nexport interface TableHomeDestination {\n  id: Uuid;\n  name: string;\n  /**\n   * The organization's web address (UI-FIX-19). A screen draws it beside a name another\n   * destination also carries, so two organizations with one name can be told apart. `null` when\n   * the store's answer predates it.\n   */\n  slug: string | null;\n  /** The person's role there: owner · admin · member. */\n  role: string;\n  /** False when the store says the Table cannot go there; `why` says why, in its words. */\n  ok: boolean;\n  why: string | null;\n}\n\n/** `custom.table_home`'s answer, read. */\nexport interface TableHome {\n  table: { id: Uuid; name: string; version: number };\n  /** Where it lives, from the Table itself. */\n  organization: { id: Uuid; name: string };\n  /** The Table's maker, or an owner/admin of its organization. */\n  mayMove: boolean;\n  /** When `mayMove` is false: the sentence that says who can. */\n  whyNot: string | null;\n  /** Sentences for what holds it where it is. Empty when nothing does. */\n  heldBy: string[];\n  /** Every other organization this person belongs to. */\n  destinations: TableHomeDestination[];\n  carries: {\n    fields: number;\n    records: number;\n    inTrash: number;\n    choiceLists: number;\n    withIt: number;\n    /** Tables that ride along because they live inside it or inside its rows. */\n    tablesInside: number;\n    /** Links between its rows and rows that stay, which will reach back across the wall. */\n    linksAcross: number;\n  };\n}\n\n/** What `custom.table_move` answered when the move landed. */\nexport interface TableMoved {\n  to: { id: Uuid; name: string };\n  from: { id: Uuid; name: string };\n  tableName: string;\n}\n\nfunction countOf(value: unknown): number {\n  return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nfunction wordsOf(value: unknown): string | null {\n  return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\n/** Read the store's answer strictly: an answer this cannot read is `null`, never a guess. */\nexport function parseTableHome(raw: unknown): TableHome | null {\n  if (!raw || typeof raw !== \"object\") return null;\n  const row = raw as Record<string, unknown>;\n  const table = row.table as Record<string, unknown> | undefined;\n  const org = row.organization as Record<string, unknown> | undefined;\n  if (!table || !org || !wordsOf(table.id) || !wordsOf(org.id) || !wordsOf(org.name)) return null;\n  const carries = (row.carries ?? {}) as Record<string, unknown>;\n  const destinations = Array.isArray(row.destinations) ? row.destinations : [];\n  return {\n    table: { id: String(table.id), name: wordsOf(table.name) ?? \"This table\", version: countOf(table.version) },\n    organization: { id: String(org.id), name: String(org.name) },\n    mayMove: row.may_move === true,\n    whyNot: wordsOf(row.why_not),\n    heldBy: Array.isArray(row.held_by) ? row.held_by.filter((s): s is string => typeof s === \"string\") : [],\n    destinations: destinations\n      .filter((d): d is Record<string, unknown> => !!d && typeof d === \"object\" && !!wordsOf((d as Record<string, unknown>).id))\n      .map((d) => ({\n        id: String(d.id),\n        name: wordsOf(d.name) ?? \"An organization\",\n        slug: wordsOf(d.slug),\n        role: wordsOf(d.role) ?? \"member\",\n        ok: d.ok === true,\n        why: wordsOf(d.why),\n      })),\n    carries: {\n      fields: countOf(carries.fields),\n      records: countOf(carries.records),\n      inTrash: countOf(carries.in_trash),\n      choiceLists: countOf(carries.choice_lists),\n      withIt: countOf(carries.with_it),\n      tablesInside: countOf(carries.tables_inside),\n      linksAcross: countOf(carries.links_across),\n    },\n  };\n}\n\n/** Read `custom.table_move`'s answer; `null` when it is not a landed move. */\nexport function parseTableMoved(raw: unknown): TableMoved | null {\n  const row = (raw ?? {}) as Record<string, unknown>;\n  const to = (row.to ?? {}) as Record<string, unknown>;\n  const from = (row.from ?? {}) as Record<string, unknown>;\n  const table = (row.table ?? {}) as Record<string, unknown>;\n  if (row.moved !== true || !wordsOf(to.id)) return null;\n  return {\n    to: { id: String(to.id), name: wordsOf(to.name) ?? \"the new organization\" },\n    from: { id: wordsOf(from.id) ?? \"\", name: wordsOf(from.name) ?? \"its old organization\" },\n    tableName: wordsOf(table.name) ?? \"The table\",\n  };\n}\n\n/**\n * What `custom.table_duplicate` answered when the copy landed (lane TABLE-ACTIONS). The copy is a\n * NEW Table in `organization`; `copied` counts what came with it and `notCopied` names, in the\n * store's own words, what a copy never carries (history, forms, portals, dashboards, rules, …).\n */\nexport interface TableDuplicated {\n  table: { id: Uuid; name: string };\n  from: { id: Uuid; name: string; organizationId: Uuid };\n  /**\n   * Where the copy lives. `null` only for a copy carried on by its id (`tableDuplicateContinue`\n   * after a reload): the carry-on door's answer names the copy, not its organization, and the\n   * first answer that did is gone. `tableDuplicate` always fills it from its first answer.\n   */\n  organization: { id: Uuid; name: string } | null;\n  copied: {\n    fields: number;\n    choiceLists: number;\n    choices: number;\n    views: number;\n    records: number;\n    withRecords: boolean;\n  };\n  /** Archived columns of the source, which stay behind with it. */\n  archivedFieldsLeft: number;\n  /** Archived (or quarantined) records left behind; `null` when records were not copied. */\n  archivedRecordsLeft: number | null;\n  /** Records this person is not handed (the ladder, then \"Shown to\"); `null` when records were not copied. */\n  recordsNotYoursLeft: number | null;\n  /** Columns this person may not read: copied as columns, values left empty — column name → values left behind. */\n  hiddenColumns: Record<string, number>;\n  /** Another person's \"only me\" views of the source, which stay theirs. */\n  privateViewsLeft: number;\n  /** Where a reference to a row that was not copied was taken out (\"view …\", \"column …\", the table's look). */\n  rowReferencesDropped: string[];\n  /** Views whose source was \"only me\": copied as new views are made, still \"Shown to: only me\". */\n  viewsSharedAsNewViews: string[];\n  /** Views the house door for a new view refused, each with its sentence. */\n  viewsNotCopied: string[];\n  /** What moved in the source while it was copied (the copy keeps what was fixed when it started). */\n  changedDuringCopy: {\n    columnsArchivedSince: string[];\n    rowsChangedAfterCopied: number;\n    rowsArchivedSince: number | null;\n    rowsAddedSince: number | null;\n  };\n  notCopied: string[];\n  path: string;\n}\n\n/** One pass of a paged copy (`custom.table_duplicate` / `custom.table_duplicate_continue`). */\nexport interface TableDuplicateProgress {\n  tableId: Uuid;\n  tableName: string;\n  /** \"busy\": another pass of this copy is running (wait, then carry on). \"failed\": the source was\n   *  archived while it was copied — not handed over; discard it. \"discarded\": its half table was archived. */\n  status: \"copying\" | \"done\" | \"busy\" | \"failed\" | \"discarded\";\n  /** What the pass stopped on: \"choices\" | \"fields\" | \"views\" | \"records\" | \"links\" | \"done\". */\n  step: string;\n  /** The store's sentence for busy / failed / discarded. */\n  sentence: string | null;\n  /** This pass: how long before its first unit, how many units, how long in all (ms). */\n  pass: { setupMs: number; units: number; ms: number } | null;\n  choiceLists: { done: number; total: number };\n  fields: { done: number; total: number };\n  views: { done: number; total: number };\n  /** `null` when records are not being copied. */\n  records: { done: number; total: number } | null;\n}\n\nfunction doneTotal(value: unknown): { done: number; total: number } {\n  const v = (value ?? {}) as Record<string, unknown>;\n  return { done: countOf(v.done), total: countOf(v.total) };\n}\n\n/** Read one pass's answer strictly; `null` when the shape is not a copy's progress. */\nexport function parseTableDuplicateProgress(raw: unknown): TableDuplicateProgress | null {\n  if (!raw || typeof raw !== \"object\") return null;\n  const row = raw as Record<string, unknown>;\n  const table = (row.table ?? {}) as Record<string, unknown>;\n  const progress = (row.progress ?? {}) as Record<string, unknown>;\n  const statuses = [\"copying\", \"done\", \"busy\", \"failed\", \"discarded\"] as const;\n  const status = statuses.find((s) => s === row.status);\n  if (row.duplicated !== true || !wordsOf(table.id) || !status) return null;\n  const pass = (row.pass ?? null) as Record<string, unknown> | null;\n  return {\n    tableId: String(table.id),\n    tableName: wordsOf(table.name) ?? \"The copy\",\n    status,\n    step: wordsOf(row.step) ?? \"\",\n    sentence: wordsOf(row.sentence),\n    pass: pass ? { setupMs: countOf(pass.setup_ms), units: countOf(pass.units), ms: countOf(pass.ms) } : null,\n    choiceLists: doneTotal(progress.choice_lists),\n    fields: doneTotal(progress.fields),\n    views: doneTotal(progress.views),\n    records: progress.records && typeof progress.records === \"object\" ? doneTotal(progress.records) : null,\n  };\n}\n\n/** One of the caller's unfinished copies (`custom.table_copies_in_progress`). */\nexport interface TableCopyInProgress {\n  tableId: Uuid;\n  tableName: string;\n  organization: { id: Uuid; name: string };\n  from: { id: Uuid; name: string };\n  /** \"copying\" (carry it on) or \"failed\" (the source was archived meanwhile — discard it). */\n  status: \"copying\" | \"failed\";\n  sentence: string | null;\n  startedAt: string | null;\n  records: { done: number; total: number } | null;\n}\n\nexport function parseTableCopiesInProgress(raw: unknown): TableCopyInProgress[] {\n  if (!Array.isArray(raw)) return [];\n  return raw\n    .filter((x): x is Record<string, unknown> => !!x && typeof x === \"object\")\n    .map((x) => {\n      const t = (x.table ?? {}) as Record<string, unknown>;\n      const o = (x.organization ?? {}) as Record<string, unknown>;\n      const f = (x.from ?? {}) as Record<string, unknown>;\n      return {\n        tableId: String(t.id ?? \"\"),\n        tableName: wordsOf(t.name) ?? \"A copy\",\n        organization: { id: String(o.id ?? \"\"), name: wordsOf(o.name) ?? \"its organization\" },\n        from: { id: String(f.id ?? \"\"), name: wordsOf(f.name) ?? \"the table it was copied from\" },\n        status: x.status === \"failed\" ? (\"failed\" as const) : (\"copying\" as const),\n        sentence: wordsOf(x.sentence),\n        startedAt: wordsOf(x.started_at),\n        records: x.records && typeof x.records === \"object\" ? doneTotal(x.records) : null,\n      };\n    })\n    .filter((x) => x.tableId.length > 0);\n}\n\n/** Read `custom.table_duplicate`'s answer strictly; `null` when it is not a landed copy. */\nexport function parseTableDuplicated(raw: unknown): TableDuplicated | null {\n  if (!raw || typeof raw !== \"object\") return null;\n  const row = raw as Record<string, unknown>;\n  const table = (row.table ?? {}) as Record<string, unknown>;\n  const from = (row.from ?? {}) as Record<string, unknown>;\n  const organization = (row.organization ?? {}) as Record<string, unknown>;\n  const copied = (row.copied ?? {}) as Record<string, unknown>;\n  const left = (row.left_behind ?? {}) as Record<string, unknown>;\n  // THE CARRY-ON DOOR'S \"done\" (W4 snapshot defect, 2026-10-18): `custom.table_duplicate_continue`\n  // answers {duplicated, table, path, status, progress, copied, left_behind, changed_during_copy}\n  // and never `from` / `organization` — only the first door says those. Requiring\n  // `organization.id` here refused EVERY copy that took more than one pass (any table past a few\n  // hundred rows) after the store had finished and handed it over, so a snapshot left a visible\n  // table and said nothing was left. `tableDuplicate` merges its first answer's header in;\n  // a resumed copy reads `organization: null`.\n  if (row.duplicated !== true || row.status !== \"done\" || !wordsOf(table.id)) return null;\n  return {\n    table: { id: String(table.id), name: wordsOf(table.name) ?? \"The copy\" },\n    from: {\n      id: wordsOf(from.id) ?? \"\",\n      name: wordsOf(from.name) ?? \"the table it was copied from\",\n      organizationId: wordsOf(from.organization_id) ?? \"\",\n    },\n    organization: wordsOf(organization.id)\n      ? { id: String(organization.id), name: wordsOf(organization.name) ?? \"its organization\" }\n      : null,\n    copied: {\n      fields: countOf(copied.fields),\n      choiceLists: countOf(copied.choice_lists),\n      choices: countOf(copied.choices),\n      views: countOf(copied.views),\n      records: countOf(copied.records),\n      withRecords: copied.with_records === true,\n    },\n    archivedFieldsLeft: countOf(left.archived_fields),\n    archivedRecordsLeft: typeof left.archived_records === \"number\" ? left.archived_records : null,\n    recordsNotYoursLeft: typeof left.records_not_yours_to_open === \"number\" ? left.records_not_yours_to_open : null,\n    hiddenColumns: Object.fromEntries(\n      Object.entries((left.hidden_columns ?? {}) as Record<string, unknown>).map(([name, n]) => [name, countOf(n)]),\n    ),\n    privateViewsLeft: countOf(left.private_views),\n    rowReferencesDropped: Array.isArray(left.row_references_dropped)\n      ? left.row_references_dropped.filter((s): s is string => typeof s === \"string\")\n      : [],\n    viewsSharedAsNewViews: Array.isArray(left.views_shared_as_new_views)\n      ? left.views_shared_as_new_views.filter((s): s is string => typeof s === \"string\")\n      : [],\n    changedDuringCopy: (() => {\n      const ch = (row.changed_during_copy ?? {}) as Record<string, unknown>;\n      return {\n        columnsArchivedSince: Array.isArray(ch.columns_archived_since)\n          ? ch.columns_archived_since.filter((s): s is string => typeof s === \"string\")\n          : [],\n        rowsChangedAfterCopied: countOf(ch.rows_changed_after_copied),\n        rowsArchivedSince: typeof ch.rows_archived_since === \"number\" ? ch.rows_archived_since : null,\n        rowsAddedSince: typeof ch.rows_added_since === \"number\" ? ch.rows_added_since : null,\n      };\n    })(),\n    viewsNotCopied: Array.isArray(left.views_not_copied)\n      ? left.views_not_copied.filter((s): s is string => typeof s === \"string\")\n      : [],\n    notCopied: Array.isArray(left.not_copied) ? left.not_copied.filter((s): s is string => typeof s === \"string\") : [],\n    path: wordsOf(row.path) ?? `/data/${String(table.id)}`,\n  };\n}\n\nfunction plural(n: number, one: string, many: string): string {\n  return `${n} ${n === 1 ? one : many}`;\n}\n\n/** The consequence of a move, said before it happens (destructive-and-expensive-actions law). */\nexport function moveConsequence(home: TableHome, to: Pick<TableHomeDestination, \"name\">): string {\n  const c = home.carries;\n  const parts = [plural(c.fields, \"column\", \"columns\"), plural(c.records, \"row\", \"rows\")];\n  if (c.inTrash > 0) parts.push(`${c.inTrash} in the trash`);\n  const extra = c.choiceLists + c.withIt;\n  return (\n    `${home.table.name} moves to ${to.name} with its ${parts.join(\", \")}` +\n    (c.tablesInside > 0\n      ? `, the ${plural(c.tablesInside, \"table\", \"tables\")} that live${c.tablesInside === 1 ? \"s\" : \"\"} inside it or its rows (with their own rows)`\n      : \"\") +\n    (extra > 0\n      ? `, and ${plural(extra, \"thing\", \"things\")} built only on it (choice lists, rules, dashboards, templates)`\n      : \"\") +\n    `, its comments, forms, saved views and history. ` +\n    (c.linksAcross > 0\n      ? `${plural(c.linksAcross, \"link\", \"links\")} to rows that stay in ${home.organization.name} keep${c.linksAcross === 1 ? \"s\" : \"\"} pointing there, across the two organizations. `\n      : \"\") +\n    `People who see it only because they are in ${home.organization.name} stop seeing it; people it ` +\n    `was shared with by name keep it. You can move it back from the same place.`\n  );\n}\n","// src/level.ts — @ai-matrx/records\n//\n// THE FOUR WORDS, AND THEIR ORDER. `public.permission_level` is a closed enum —\n// viewer < commenter < edit_content < editor < admin — and the store says so in its own\n// refusals (\"This needs the admin level (viewer < commenter < editor < admin)\").\n//\n// It lives here, in the headless package, for one reason: a screen that has to\n// decide whether to DRAW a control needs the same ordering the door uses to\n// decide whether to accept the call. Two orderings is two answers to one\n// question, and the second one is always the wrong one.\n//\n// Nothing here decides policy. `atLeast` compares two words the store defined;\n// which word a door requires is the door's business and is never restated here.\n\nimport { PERMISSION_LEVELS } from \"@ai-matrx/data/access/levels\";\n\n/** `public.permission_level`, in the store's own order. */\n/**\n * `edit_content` (Notion's \"Can edit content\") sits between `commenter` and `editor`: it may change\n * the rows and page content of a thing, never its structure (columns, views, settings) or its\n * sharing — those stay with `editor` and `admin`.\n */\nexport type PermissionLevel = \"viewer\" | \"commenter\" | \"edit_content\" | \"editor\" | \"admin\";\n\n// The ladder is `@ai-matrx/data/access/levels` (viewer < commenter < editor < admin), a subpath that imports\n// nothing, so this headless package never needs auth or supabase-js (the whole `/access` section would: the\n// packed-consumer canary failed with ERR_MODULE_NOT_FOUND). The store's enum adds the retired `edit_content`\n// rung directly above `commenter` (it normalizes to `editor`, so it sits below it); that one insertion is the\n// only thing this file adds to the ladder.\nconst RETIRED_RUNG_ABOVE: PermissionLevel = \"commenter\";\n\n/** The order the store writes them in, lowest first — `public.permission_level` itself, retired `edit_content` included (the code ladder that labels and offers levels is `@ai-matrx/data/access` PERMISSION_LEVELS). */\nexport const STORE_PERMISSION_LEVELS: readonly PermissionLevel[] = PERMISSION_LEVELS.flatMap(\n  (level): PermissionLevel[] => (level === RETIRED_RUNG_ABOVE ? [level, \"edit_content\"] : [level]),\n);\n\n/** 1-based rank of each store word (viewer 1 … admin 5). A plain object on purpose: `asPermissionLevel` reads it with `in`. */\nconst ORDINAL: Record<PermissionLevel, number> = Object.fromEntries(\n  STORE_PERMISSION_LEVELS.map((level, index) => [level, index + 1]),\n) as Record<PermissionLevel, number>;\n\n/** Whether `held` is the same rung as `needed` or a higher one. Nothing held is never enough. */\nexport function atLeast(held: PermissionLevel | null | undefined, needed: PermissionLevel): boolean {\n  if (!held) return false;\n  const have = ORDINAL[held];\n  return have !== undefined && have >= ORDINAL[needed];\n}\n\n/** A level word the store sent, or null when it sent something this package does not know. */\nexport function asPermissionLevel(word: unknown): PermissionLevel | null {\n  return typeof word === \"string\" && word in ORDINAL ? (word as PermissionLevel) : null;\n}\n\n/** The higher of two levels — what a person holds when two ways in both let them through. */\nexport function highestLevel(\n  left: PermissionLevel | null | undefined,\n  right: PermissionLevel | null | undefined,\n): PermissionLevel | null {\n  if (!left) return right ?? null;\n  if (!right) return left;\n  return ORDINAL[left] >= ORDINAL[right] ? left : right;\n}\n\n/**\n * What one subject's level is, as `custom.my_levels` answers it. `null` is an\n * ANSWER — \"you hold nothing on this\" — and never a missing row: a screen that\n * could not tell \"no access\" from \"not asked yet\" would draw one of them as the\n * other.\n */\nexport interface MyLevel {\n  id: string;\n  level: PermissionLevel | null;\n}\n","// src/core/keysetCursor.ts — @ai-matrx/records\n//\n// THE KEYSET CURSOR AT THE CLIENT EDGE (AP3-KEYSET-DOOR, 2026-10-06). `custom.read_records_keyset`\n// answers its cursor as a small JSON object (the last row's sort values, its id, and a fingerprint of\n// the question it was made under). Screens never read it: it travels as one opaque base64url string\n// and is handed back unchanged. It carries nothing secret — the store re-applies the row predicate on\n// every page and refuses, by name, a cursor made under a different sort, filter or search.\n\nfunction utf8ToBinary(text: string): string {\n  let out = \"\";\n  for (const byte of new TextEncoder().encode(text)) out += String.fromCharCode(byte);\n  return out;\n}\n\nfunction binaryToUtf8(binary: string): string {\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);\n  return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n}\n\n/** The store's cursor object as one opaque base64url string. */\nexport function encodeKeysetCursor(cursor: unknown): string {\n  return btoa(utf8ToBinary(JSON.stringify(cursor))).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/**\n * The string back into the object the store made, or `null` when it is not one of its cursors (not\n * base64url, not JSON, or not an object). A null is refused at the edge; it is never sent as \"page 1\".\n */\nexport function decodeKeysetCursor(cursor: string): Record<string, unknown> | null {\n  if (!/^[A-Za-z0-9_-]+$/.test(cursor)) return null;\n  try {\n    const padded = cursor.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"=\".repeat((4 - (cursor.length % 4)) % 4);\n    const value: unknown = JSON.parse(binaryToUtf8(atob(padded)));\n    return value !== null && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n  } catch {\n    return null;\n  }\n}\n","// src/table.ts — @ai-matrx/records\n//\n// THE TABLE AND THE HOME. REC-1, REC-3, REC-14, REC-26, REC-32, REC-33.\n// A Table is a Record (REC-25), which is why every shape here carries the\n// record contract as well as its own columns: `custom.table` is a VIEW over\n// `custom.record`, and this is that view's shape.\n\nimport type { Timestamp, Uuid } from \"./record\";\nimport type {\n  StorageMode,\n  TableDisplay,\n  TableOrigin,\n  TableType,\n} from \"./vocabulary\";\n\n/**\n * REC-1. A Table declares its fields, exactly one Home, and the properties\n * `display`, `ordered`, `heavy` | `light`, `retention` and `detail`.\n */\nexport interface Table {\n  id: Uuid;\n  organization_id: Uuid;\n  /**\n   * The access ladder's Table \"Level\": organization · public · confidential · private. Absent is\n   * the organization's own. Confidential and Private records have no \"Shown to\".\n   */\n  level?: string | null;\n  /** The token this Table is addressed by. */\n  slug: string;\n  name: string;\n  label_singular: string | null;\n  label_plural: string | null;\n  icon: string | null;\n  color: string | null;\n  /** REC-32. One of the seven, closed. */\n  type: TableType;\n  /** REC-11. A detail Table inherits only: no direct shares, never a Home. */\n  detail: boolean;\n  parent_token: string | null;\n  /** AGT-1 / AGT-2. On by default for a custom table; an organization turns it off. */\n  agent_writable: boolean;\n  display: TableDisplay | null;\n  ordered: boolean;\n  /** REC-4. `heavy` is indexed with Rules on write; `light` is the whole document with Rules on read. */\n  weight: StorageMode;\n  /** REC-23. How long a soft delete stays reversible. */\n  retention_days: number | null;\n  /** REC-2. Every Table has one; without it a record cannot be a chip. */\n  title_field: string | null;\n  /**\n   * T8 / CD-CORE-15. The Field KEY whose value is each record's type (a Shape's Kind); which columns a record\n   * has follows it (`applies_to_types` on a Field). Absent or null: every record has every column.\n   */\n  type_field?: string | null;\n  /** The field ids this Table declares, in declaration order. */\n  fields: Uuid[];\n  default_sort: string | null;\n  row_order: string | null;\n  /** REC-14. Where this Table lives. Exactly one primary Home. */\n  home_id: Uuid | null;\n  /** The feature that keeps this Table out of the person's lists (`snapshot`, `copying`, …); absent for a person's own table. */\n  kept_for?: string | null;\n  /** REC-27. One of the nine, defined in code and not editable by Migration. */\n  is_kernel: boolean;\n  created_by: Uuid | null;\n  updated_by: Uuid | null;\n  created_at: Timestamp;\n  updated_at: Timestamp;\n  version: number;\n  metadata: Record<string, unknown>;\n  /** The old lane word; read `shown_to` and `published_to_web` (access ladder), which the store answers now. */\n  visibility: string;\n  /** Access ladder \"Shown to\" (which lists show it; never a lock). Absent on a store that does not answer it. */\n  shown_to?: string | null;\n  /** Access ladder \"Published to the web\". Absent on a store that does not answer it. */\n  published_to_web?: boolean;\n  /**\n   * Lane 10 FD. Part of the business's day-one data (Patients, Therapists, Services) — a mark, not\n   * storage. Absent is false. Only admin on the Table changes it (custom._table_shape_guard).\n   */\n  foundation?: boolean;\n  /**\n   * Present only on what `tableFind({ …, keptFor })` answers for an ARCHIVED table of that slug and\n   * kept_for (the store's `archived_at`); such an answer carries only `id`, `organization_id` and this.\n   */\n  archived_at?: Timestamp | null;\n}\n\n/**\n * REC-33. `origin` is `standard` or `custom`, and it is orthogonal to `type`.\n * A Table we ship in schema `custom` is `standard` — the schema name is not the\n * origin.\n */\nexport interface RegisteredTable {\n  token: string;\n  type: TableType;\n  origin: TableOrigin;\n  /** REC-34. Carried per table type: true for Entity and Detail, false for the other five. */\n  custom_fields_enabled: boolean;\n}\n\n/**\n * REC-3 / REC-26. A Home is where a Table appears. The declared organization\n * Home is the tree's root; every additional Home is a referenced carrying\n * relation from the Home record to the Table record, which is why this shape\n * names a relation id rather than a second placement column.\n */\nexport interface Home {\n  table_id: Uuid;\n  home_record_id: Uuid;\n  organization_id: Uuid;\n  /** `declared` for the Table's own Home, `carried` for an additional one. */\n  kind: string;\n  relation_id: Uuid | null;\n}\n\n/** What `tablePropose` / `tableList` hands back about how full a Table is (REC-N-5). */\nexport interface TableCapacity {\n  records: number;\n  ceiling: number;\n  full: boolean;\n  /** The knob that decides the ceiling, named so a person can act on it. */\n  knob: string;\n}\n\n/**\n * WHAT ONE PASS OF `custom.table_archive` ANSWERS WITH — the numbers a screen\n * needs to draw a bar and write a sentence, instead of a spinner and an\n * SQLSTATE (VERIFIER-10 F3, VERIFIER-11 F3).\n *\n * Archiving a table is a JOB, NOT A STATEMENT. `custom.record_delete` on a\n * Table recurses through everything the Table contains inside one transaction,\n * which is unbounded by construction: at 1,430 records it dies on `57014`,\n * \"canceling statement due to statement timeout\", and nothing is changed. The\n * remedy for a thing that cannot finish in one statement is more statements,\n * never a longer one — so the caller loops, passing its own `chunk`, until\n * `done`.\n *\n * IT IS RESUMABLE BECAUSE IT IS STATELESS. There is no job row to lose:\n * `remaining` is read off the records themselves on every call, so a browser\n * closed halfway, a failed pass or a deploy mid-run all leave a table that is\n * half archived and a next call that picks up exactly where the last stopped.\n * Which is why a screen driving this may NEVER say \"nothing was changed\" after\n * a pass that moved rows — `archived_total` is what really landed.\n *\n * NOTHING IS DELETED. Every row goes through `custom.record_delete`, so every\n * guard, history capture and outbox row still happens and `recordRestore`\n * still brings any of them back.\n */\nexport interface TableArchiveProgress {\n  table_id: Uuid;\n  /** The table's own name, so a sentence can use it rather than an id. */\n  table_name: string;\n  /** What THIS pass archived. */\n  archived: number;\n  /** Records of this table still live. Zero is the end of the row work. */\n  remaining: number;\n  /** Records this table has ever held: `remaining` + `archived_total`. */\n  total: number;\n  /** Records of this table already archived, across every pass ever made. */\n  archived_total: number;\n  /** Whether the Table record itself has been archived. */\n  table_archived: boolean;\n  /** Nothing live is left to do. The caller's loop ends here. */\n  done: boolean;\n  /** The chunk the door actually took on — it clamps what it is handed. */\n  chunk: number;\n  /** The store's own sentence about this pass, in the product's voice. */\n  message: string;\n  /**\n   * An earlier run of this archive was started and has not finished (an open archive event). A\n   * screen reading this after a reload offers to carry on, never a fresh button (BREAKER-1 B-F13).\n   * Absent from a store that predates it.\n   */\n  in_progress?: boolean;\n  /**\n   * THE REVERSIBLE ACTION'S SIZE LINE (knob `custom/archive_confirm_over`, organization-overridable):\n   * a table with at most this many live records is archived at once and announced with Undo; one\n   * with more is asked about first, with the count. Absent from a store that predates it — a screen\n   * then asks first, as it always did.\n   */\n  confirm_over?: number;\n}\n\n/**\n * BRINGING A WHOLE TABLE BACK — ONE PASS OF IT (`custom.table_restore`, lane TABLE-ACTIONS).\n *\n * The mirror of {@link TableArchiveProgress}: the Table and its structure come back in the first\n * pass, then its records in the order they went, then what was built on it, all from the one\n * archive event. The CALLER LOOPS until `done` (`client.tableRestoreWhole` does it).\n */\nexport interface TableRestoreProgress {\n  table_id: Uuid;\n  table_name: string;\n  /** Records THIS pass brought back. */\n  restored: number;\n  /** The Table, its Fields, rules and views THIS pass brought back (the first pass). */\n  structure_restored: number;\n  /** Forms, views, portals, child Tables… built on the Table THIS pass brought back. */\n  built_on_restored: number;\n  /** Rows the archive took that are still waiting. */\n  remaining: number;\n  built_on_remaining: number;\n  /** Rows refused on their own now (a value another row took since): left archived and named. */\n  left: number;\n  left_ids?: Uuid[];\n  /** Each row left archived, with the store's own reason for it. */\n  left_reasons?: Record<Uuid, string>;\n  /** Restoring events of this table still open (a re-archive mid-restore leaves two). */\n  events_open?: number;\n  /** Whether the Table record itself is live. */\n  table_restored: boolean;\n  /** Nothing the archive took is still waiting. The caller's loop ends here. */\n  done: boolean;\n  chunk: number;\n  archive_event: Uuid | null;\n  message: string;\n}\n\n/**\n * WHAT A STORED COLUMN DIFFERS FROM THE SPEC THAT ASKED FOR IT IN (lane PLATFORM-APP-DATA).\n *\n * `custom.table_ensure` never retypes, relabels or drops a column a table already has — a retype is\n * a conversion a person decides. It used to ignore the difference without a word; now it names\n * each one, aspect by aspect, and still changes nothing. This shape is the contract a release-time\n * drift check will read, so it stays this small:\n *\n * - `type`     the column's kind: its parity type when it has one, else its behavior (`text`, `range`, …)\n * - `format`   how it is shown (`long`, `phone`, `currency`, …); `null` when it has none\n * - `label`    the column's name\n * - `multi` / `required`   booleans (absent = `false`)\n * - `unique`   whether it holds a `unique` rule\n * - `spec`     the spec for that column could not be read at all; `declared` is the store's sentence\n *\n * The declared side is the spec as the store WOULD store it, so `long_text` compares as the\n * `text` + `long` it is stored as — never a false difference.\n */\n/** `extra`: a column the table holds that the spec no longer declares (kept, never removed). */\nexport type FieldDriftAspect = \"type\" | \"format\" | \"label\" | \"multi\" | \"required\" | \"unique\" | \"spec\" | \"extra\";\n\nexport interface FieldDrift {\n  /** The column's key. */\n  field: string;\n  aspect: FieldDriftAspect;\n  /** What the column holds now. */\n  stored: string | boolean | null;\n  /** What the spec asked for (for `spec`, the store's sentence about why it could not be read). */\n  declared: string | boolean | null;\n}\n\nconst DRIFT_ASPECTS: readonly FieldDriftAspect[] = [\"type\", \"format\", \"label\", \"multi\", \"required\", \"unique\", \"spec\", \"extra\"];\n\n/**\n * The store's `drift` answer, typed. `null` when the store did not send one — a `table_ensure`\n * body older than `lane12_c_an_ensured_table_says_what_differs_from_its_spec.sql` — which means\n * \"not compared\", never \"no difference\". An entry of an aspect this package does not know is kept\n * as `spec`, so a newer store is never silenced.\n */\nexport function parseFieldDrift(raw: unknown): FieldDrift[] | null {\n  if (!Array.isArray(raw)) return null;\n  const scalar = (v: unknown): string | boolean | null =>\n    typeof v === \"string\" || typeof v === \"boolean\" ? v : v === null || v === undefined ? null : JSON.stringify(v);\n  return raw\n    .filter((d): d is Record<string, unknown> => Boolean(d) && typeof d === \"object\")\n    .map((d) => ({\n      field: String(d.field ?? \"\"),\n      aspect: DRIFT_ASPECTS.includes(d.aspect as FieldDriftAspect) ? (d.aspect as FieldDriftAspect) : \"spec\",\n      stored: scalar(d.stored),\n      declared: scalar(d.declared),\n    }));\n}\n","// src/grid.ts — @ai-matrx/records\n//\n// THE GRID'S STORE PRIMITIVES (lane GRID-PRIMITIVES, 2026-09-22).\n//\n// The /data grid is being rebuilt on the record store with its UI and behavior unchanged. The\n// older grid kept five things the store could not say; each is now a door, and these are the\n// shapes those doors answer:\n//\n//   G1  a Table's colors (row color by a choice column, ordered color rules, hand highlights),\n//       its layout (organization default + per-view override) and the summary bar's nine\n//       measures                           → custom.table_decorate / table_decorations,\n//                                             custom.grid_layout, custom.record_aggregate\n//   G2  row actions, run on a whole selection in one transaction\n//                                          → custom.action_declare / row_actions / action_run\n//   G3  the formula language a person types, worked out by the store\n//                                          → custom.formula_parse (+ formula_text on a Field)\n//   G4  every record change out to a signed webhook\n//                                          → custom.table_webhook_declare / table_webhooks /\n//                                             table_webhook_archive\n//   G5  autonumber / created / modified time columns, display formats, example tables, Excel\n//                                          → field kinds, custom.autonumber_backfill,\n//                                             custom.io_export\n//\n// Fields and records are named BY ID everywhere here (REC-17): a column renamed keeps its\n// color, its width and its place in a formula.\n\nimport type { WorkbookJson } from \"@ai-matrx/print/xlsx\";\nimport type { Uuid } from \"./record\";\nimport type { RecordsError } from \"./results\";\n\n// ── G1: colors ──────────────────────────────────────────────────────────────────────────\n\n/** `custom.decoration_colors()` — the palette, in the order an uncolored choice takes. */\nexport type DecorationColor = \"slate\" | \"green\" | \"amber\" | \"red\" | \"blue\" | \"violet\" | \"teal\" | \"orange\" | \"yellow\" | \"pink\" | \"brown\" | \"gray\";\n\n/** `custom.decoration_rule_ops()` — the tests a color rule may ask. */\nexport type DecorationRuleOp =\n  | \"is\" | \"is_not\" | \"contains\" | \"is_empty\" | \"not_empty\" | \"is_true\" | \"is_false\"\n  | \"gt\" | \"gte\" | \"lt\" | \"lte\";\n\nexport type DecorationTarget = \"row\" | \"cell\";\n\nexport interface DecorationRule {\n  /** Given by the store when omitted; keep it to edit the rule in place. */\n  id?: string;\n  /** The Field id the rule reads. */\n  field: Uuid;\n  op: DecorationRuleOp;\n  /** Compared as text for is / is_not / contains, as a number for gt / gte / lt / lte. */\n  value?: string | number;\n  color: DecorationColor;\n  target: DecorationTarget;\n}\n\nexport interface TableDecorations {\n  version: 1;\n  colors: DecorationColor[];\n  rule_ops: Array<{ op: DecorationRuleOp; takes_value: boolean; label: string }>;\n  color_by?: { field: Uuid; target: DecorationTarget };\n  rules: DecorationRule[];\n  /** Hand highlights: record id → color. */\n  rows: Record<Uuid, DecorationColor>;\n  /** Hand highlights: Field id → color. */\n  columns: Record<Uuid, DecorationColor>;\n  /** Hand highlights: record id → Field id → color. */\n  cells: Record<Uuid, Record<Uuid, DecorationColor>>;\n  /** What stopped painting because its column is gone — said, never silently dropped. */\n  stale: Array<{ part: string; field?: Uuid; rule_id?: string; record_id?: Uuid; says: string }>;\n}\n\n/**\n * ONE LEAF of a Table's colors — the older door's own path shape\n * (`public.udt_set_table_style`), so two people highlighting two rows never overwrite each other.\n */\nexport type DecorationPath =\n  | [\"color_by\"]\n  | [\"rules\"]\n  | [\"rows\", Uuid]\n  | [\"columns\", Uuid]\n  | [\"cells\", Uuid, Uuid];\n\n// ── G1: layout ──────────────────────────────────────────────────────────────────────────\n\nexport type GridLayoutMode = \"auto\" | \"fit\" | \"scroll\";\n/**\n * Airtable's four heights are short (1 line), medium (2), tall (4), extra_tall (6). `compact` and `normal`\n * are the older words and still read: both are a one-line row.\n */\nexport type GridRowHeight = \"compact\" | \"short\" | \"normal\" | \"medium\" | \"tall\" | \"extra_tall\";\n\n/** A saved view's own grid choices, kept at `definition.grid` (custom.view_declare judges them). `definition.layout` is the view's KIND (grid / kanban / calendar / gallery), never these. */\nexport interface ViewLayout {\n  mode?: GridLayoutMode;\n  row_height?: GridRowHeight;\n  freeze_first_column?: boolean;\n  wrap?: boolean;\n  /** Field id → pixels, 60–1200. */\n  widths?: Record<Uuid, number>;\n}\n\nexport interface GridLayout {\n  layout: Required<Omit<ViewLayout, \"widths\">> & { fit_max_columns: number; widths?: Record<Uuid, number> };\n  /** Where each choice came from. */\n  source: Record<string, \"platform\" | \"organization\" | \"view\">;\n  view_id: Uuid | null;\n  /** A stored choice the grid cannot honor, named. */\n  refused: Array<{ from: \"organization\" | \"view\"; choice: string; value: unknown; says: string }>;\n}\n\n// ── G2: row actions ─────────────────────────────────────────────────────────────────────\n\nexport type RowActionStep =\n  | { field: Uuid; set: \"value\"; value: unknown }\n  | { field: Uuid; set: \"clear\" }\n  /** Worked out by the store on each record: the older grid's formula text, or an expression. */\n  | { field: Uuid; set: \"compute\"; formula_text?: string; expr?: Record<string, unknown> };\n\nexport interface RowAction {\n  /** Given by the store when omitted. */\n  id?: Uuid;\n  name: string;\n  kind?: \"update\" | \"agent\";\n  color?: DecorationColor | null;\n  icon?: string;\n  /** Ask before running. */\n  confirm?: boolean;\n  steps?: RowActionStep[];\n  /** `agent` only: what the record chat opens with. */\n  prompt?: string;\n  /** On read: whether custom.action_run can run it. */\n  runnable?: boolean;\n}\n\nexport interface ActionRunResult {\n  action_id: Uuid;\n  action: string;\n  table_id: Uuid;\n  ran: number;\n  records: Array<{ record_id: Uuid; version: number }>;\n}\n\n/** One record (and, when it can be named, one field) that refused a row action. */\nexport interface ActionRefusal {\n  record_id: Uuid;\n  record: string | null;\n  field_id: Uuid | null;\n  field: string | null;\n  code?: string;\n  says: string;\n}\n\n/**\n * Every refusal of an action run, read off the store's refusal. A run that any record refused\n * changed NOTHING; this is the list a screen shows so the person can fix those and run again.\n */\nexport function actionRefusals(error: RecordsError): ActionRefusal[] {\n  return Array.isArray(error.detail) ? (error.detail as ActionRefusal[]) : [];\n}\n\n// ── G3: formulas ────────────────────────────────────────────────────────────────────────\n\nexport type FormulaParse =\n  | {\n      ok: true;\n      text: string;\n      /** The store's expression shape — what `config.expr` holds. */\n      expr: Record<string, unknown>;\n      references: Array<{ name: string; field_id: Uuid }>;\n      result_type: \"number\" | \"text\" | \"boolean\" | \"date\" | \"unknown\";\n    }\n  | { ok: false; text: string; error: string; position: number };\n\n/** NOTION-PROPS: `formulaPreview` — the parse, and what it works out to on one record. */\nexport type FormulaPreview = FormulaParse & {\n  /** The answer on `record_id`, as the formula column would show it; null when nothing was sampled. */\n  value?: unknown;\n  record_id?: Uuid | null;\n  /** It parses, and could not be worked out on that record (a division by zero, a bad date …). */\n  error?: string;\n};\n\n// ── G4: webhooks ────────────────────────────────────────────────────────────────────────\n\nexport type RecordEvent = \"record.created\" | \"record.updated\" | \"record.archived\" | \"record.restored\" | \"record.purged\";\n\nexport interface TableWebhookDeclared {\n  webhook_id: Uuid;\n  table_id: Uuid;\n  target_url: string;\n  events: RecordEvent[];\n  /** Shown this once: X-Matrx-Signature is sha256=HMAC-SHA256(secret, body). */\n  secret: string;\n  says: string;\n}\n\nexport interface TableWebhook {\n  webhook_id: Uuid;\n  target_url: string;\n  description: string | null;\n  events: RecordEvent[] | null;\n  is_active: boolean;\n  last_attempt_at: string | null;\n  last_success_at: string | null;\n  consecutive_failures: number;\n  owner_id: Uuid;\n  created_at: string;\n}\n\n// ── G5: export ──────────────────────────────────────────────────────────────────────────\n\n/** One page of `custom.io_export`: exactly what the read door serves this person. */\nexport interface IoExportPage {\n  table_id: Uuid;\n  token: string;\n  columns: string[];\n  rows: Array<Record<string, unknown>>;\n  /** A column the store withheld from this reader, with the store's reason. */\n  withheld: Record<string, unknown>;\n  page: { requested: number; returned: number; ceiling: number; next: number | null };\n  choices: unknown;\n}\n\nfunction exportCellText(value: unknown): string | number | boolean {\n  if (value === null || value === undefined) return \"\";\n  if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") return value;\n  return JSON.stringify(value);\n}\n\n/**\n * THE .XLSX OF AN EXPORT PAGE. Numbers stay numbers and booleans stay booleans in the sheet; a\n * column the store withheld is NAMED on a second sheet with the store's reason, so a person\n * never mistakes a withheld column for an empty one. `labels` maps a column key to its header\n * (the Field's label); a key with no label is its own header.\n */\nexport async function exportPageXlsx(\n  page: IoExportPage,\n  labels: Record<string, string> = {},\n  sheetLabel = \"Records\",\n): Promise<Uint8Array> {\n  // Alchemy's one workbook engine (SheetJS behind it), loaded on first export.\n  const { writeWorkbookBytes } = await import(\"@ai-matrx/print/xlsx\");\n  const header = page.columns.map((c) => labels[c] ?? c);\n  const body = page.rows.map((row) => page.columns.map((c) => exportCellText(row[c])));\n  const name = sheetLabel.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Records\";\n  const sheets: WorkbookJson[\"sheets\"] = [{ name, rows: [header, ...body] }];\n  const withheld = Object.entries(page.withheld ?? {});\n  if (withheld.length > 0) {\n    sheets.push({\n      name: \"Withheld columns\",\n      rows: [\n        [\"Column\", \"Why it is empty in this export\"],\n        ...withheld.map(([k, v]) => [labels[k] ?? k, typeof v === \"string\" ? v : JSON.stringify(v)]),\n      ],\n    });\n  }\n  if (page.page?.next !== null && page.page?.next !== undefined) {\n    sheets.push({\n      name: \"More rows\",\n      rows: [[\n        `This file holds the first ${page.page.returned} rows. The table has more; export again from row ${page.page.next + 1}.`,\n      ]],\n    });\n  }\n  return writeWorkbookBytes({ sheets });\n}\n\n// ── G8: \"when a row changes, run an agent\" on a record-store table ──────────────────────\n\n/**\n * THE EVENT-SOURCE KEY of a record-store table: `record:<table id>` — what its changes carry on the\n * activity spine, what a webhook's `resource_types` names and what a schedule's `event` trigger\n * listens for (`custom.record_source_key` in the store). The store's token is `record`; the older\n * key `custom_record:<table id>` named the retired tier-2 table and is never written.\n */\nexport function recordSourceKey(tableId: Uuid): string {\n  return `record:${tableId}`;\n}\n\nconst SOURCE_KEY = /^(record|custom_record):([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n\n/**\n * The table a stored event-source key names, or `null` when the key is not a record-store key.\n * Reads the older `custom_record:<table id>` too, for rows saved before the key moved (the store\n * reads both for one release: `custom.record_source_table`).\n */\nexport function recordSourceTable(key: string | null | undefined): Uuid | null {\n  const m = key ? SOURCE_KEY.exec(key) : null;\n  return m ? (m[2] as Uuid) : null;\n}\n\n/** A record-store row event, as the activity spine carries it (and a schedule matches it). */\nexport type RecordChangeAction = RecordEvent;\n\n/**\n * THE SCHEDULE TRIGGER for \"when a row of this record-store table changes, run …\" — the same\n * `event` trigger the older store's tables use, pointed at this store's events:\n * `entity_type` `record:<table id>` ({@link recordSourceKey}), actions `record.*`, `changed_fields`\n * by column KEY.\n * `scheduler.sch_match_event` matches it against the event\n * `custom._record_events_to_activity` writes (GRID-PRIMITIVES G8), so one matcher serves both\n * stores. Omit `actions` to hear every change; omit `changedFields` to hear every column.\n */\nexport function recordChangeTrigger(\n  tableId: Uuid,\n  options: { actions?: RecordChangeAction[]; changedFields?: string[] } = {},\n): {\n  type: \"event\";\n  entity_type: string;\n  table_id: Uuid;\n  actions?: RecordChangeAction[];\n  changed_fields?: string[];\n} {\n  return {\n    type: \"event\",\n    entity_type: recordSourceKey(tableId),\n    table_id: tableId,\n    ...(options.actions && options.actions.length > 0 ? { actions: options.actions } : {}),\n    ...(options.changedFields && options.changedFields.length > 0 ? { changed_fields: options.changedFields } : {}),\n  };\n}\n\n// ── G9: every table picker lists both stores ───────────────────────────────────────────\n\n/**\n * One entry of `custom.table_list_everywhere` — `public.get_user_tables`' own shape plus\n * `store`, so a picker swaps one call and keeps its code. `store` says which home opens it.\n */\nexport interface TableListEntry {\n  id: Uuid;\n  table_name: string;\n  description: string | null;\n  version: number | null;\n  user_id: Uuid | null;\n  is_public: boolean | null;\n  visibility: string | null;\n  organization_id: Uuid;\n  created_at: string;\n  updated_at: string | null;\n  last_activity_at: string | null;\n  row_count: number;\n  field_count: number;\n  store: \"older\" | \"records\";\n}\n\n/**\n * One row of `custom.data_home_tables` — every table the person reaches, with the store's own\n * answers for the organization's name, who made it, and whether the app keeps it. `system` is a\n * system organization's table (reached on the admin lane only).\n */\nexport interface DataHomeTable {\n  table_id: Uuid;\n  table_name: string;\n  organization_id: Uuid;\n  organization_name: string;\n  member: boolean;\n  visibility: string | null;\n  updated_at: string | null;\n  mine: boolean;\n  shared_with_me: boolean;\n  platform_owned: boolean;\n  kind: string | null;\n  team?: boolean;\n  system?: boolean;\n  created_by?: Uuid | null;\n}\n\n/**\n * One row of `custom.admin_all_tables` — a table in ANY organization, for the admin section only\n * (the store's walls admit a platform admin to system organizations alone, so `DataHomeTable` cannot\n * list the rest). Answered only on the admin lane for a platform admin; any other caller is refused.\n */\nexport interface AdminTable {\n  table_id: Uuid;\n  table_name: string;\n  organization_id: Uuid;\n  organization_name: string | null;\n  updated_at: string | null;\n  platform_owned: boolean;\n  system: boolean;\n}\n\n// ── G10: a synced sheet is one table that refreshes ────────────────────────────────────\n\n/** Where a synced table comes from. `external_id` is the source's own id (a spreadsheet id). */\nexport interface TableSyncSource {\n  provider: string;\n  external_id: string;\n  tab_id?: string | null;\n  synced_at?: string | null;\n}\n\n/** What `custom.table_sync` takes: the source, its columns, and every row it has NOW. */\nexport interface TableSyncSpec {\n  source: TableSyncSource;\n  table_name: string;\n  columns: string[];\n  rows: { ref: string; values: Record<string, string | number | boolean | null> }[];\n}\n\nexport interface TableSyncResult {\n  table_id: Uuid;\n  created: boolean;\n  fields_added: number;\n  rows_inserted: number;\n  rows_updated: number;\n  rows_archived: number;\n  source_system: string;\n}\n\n/**\n * A sheet tab's cells (header row first) → the spec `custom.table_sync` takes. Every row is\n * named by its sheet row number (`row-2` is the first row under the header) unless\n * `refColumn` names a column holding a stable id; a blank or repeated ref is refused here, so\n * the store never sees two rows claiming to be the same source row. Wholly blank rows are\n * skipped. Pure.\n */\nexport function sheetSyncSpec(args: {\n  source: TableSyncSource;\n  tableName: string;\n  cells: readonly (readonly (string | number | boolean | null | undefined)[])[];\n  refColumn?: string;\n}): TableSyncSpec {\n  const [header = [], ...body] = args.cells;\n  const columns = header.map((c, i) => {\n    const name = c == null ? \"\" : String(c).trim();\n    return name === \"\" ? `Column ${i + 1}` : name;\n  });\n  if (columns.length === 0) {\n    throw new Error(\"The sheet has no header row, so there are no columns to sync. Nothing was sent.\");\n  }\n  const seenCol = new Set<string>();\n  for (const c of columns) {\n    if (seenCol.has(c)) throw new Error(`The sheet has two columns named \"${c}\". Rename one and sync again.`);\n    seenCol.add(c);\n  }\n  const refIdx = args.refColumn == null ? -1 : columns.indexOf(args.refColumn);\n  if (args.refColumn != null && refIdx < 0) {\n    throw new Error(`The id column \"${args.refColumn}\" is not in the sheet's header. Nothing was sent.`);\n  }\n  const seen = new Set<string>();\n  const rows: TableSyncSpec[\"rows\"] = [];\n  body.forEach((cells, i) => {\n    if (cells.every((v) => v == null || String(v).trim() === \"\")) return;\n    const ref = refIdx >= 0 ? String(cells[refIdx] ?? \"\").trim() : `row-${i + 2}`;\n    if (ref === \"\") throw new Error(`Sheet row ${i + 2} has no value in the id column \"${args.refColumn}\".`);\n    if (seen.has(ref)) throw new Error(`Two sheet rows share the id \"${ref}\"; each row needs its own.`);\n    seen.add(ref);\n    const values: Record<string, string | number | boolean | null> = {};\n    columns.forEach((c, j) => {\n      const v = cells[j];\n      values[c] = v === undefined || v === \"\" ? null : v;\n    });\n    rows.push({ ref, values });\n  });\n  return { source: args.source, table_name: args.tableName, columns, rows };\n}\n\n/**\n * What `custom.table_copy_sync` takes (lane SYNC-AIRTABLE): a table synced from another table's\n * view — read as the caller, so the copy holds only what that view shows them. Lands through\n * `custom.table_sync` in the caller's active organization (`home_id` defaults to its data home).\n */\nexport interface TableCopySpec {\n  source_organization_id: Uuid;\n  source_table_id: Uuid;\n  view_id?: Uuid | null;\n  table_name?: string | null;\n  home_id?: Uuid | null;\n  /** `on_change` (default): the store's time tick refreshes the copy when the source changes. */\n  auto_refresh?: \"on_change\" | \"off\";\n}\n\n/** Every `custom.table_sync` answer also says when the sync happened and what it could not do. */\nexport interface TableSyncAnswer extends TableSyncResult {\n  rows_restored?: number;\n  rows_kept_archived?: number;\n  rows_total?: number;\n  warnings?: string[];\n  synced_at?: string;\n}\n\n/** How often a synced table refreshes on its own (`sync_source.auto_refresh`). */\nexport type SyncAutoRefresh = \"off\" | \"hourly\" | \"daily\" | \"on_change\";\n\n/** What `custom.table_sync_settings_set` changes on one synced table. */\nexport interface TableSyncSettings {\n  auto_refresh?: SyncAutoRefresh;\n  /** Google Sheets through a connected account only: edits go back to the sheet. */\n  write_back?: boolean;\n}\n\n/** The `sync_source` a synced Table carries (what the store wrote, read back). */\nexport interface TableSyncSourceDocument extends TableSyncSource {\n  label?: string | null;\n  url?: string | null;\n  access?: \"link\" | null;\n  header_row?: number | null;\n  set_by?: Uuid | null;\n  auto_refresh?: SyncAutoRefresh | null;\n  write_back?: boolean | null;\n  source_organization_id?: Uuid | null;\n  due_at?: string | null;\n}\n\n// ── G12: every table counts its rows, every row shows its header ───────────────────────\n\n/** One row of `custom.table_row_counts`: the rows of that Table this reader may see. */\nexport interface TableRowCount {\n  table_id: Uuid;\n  visible_rows: number;\n}\n\n/**\n * One row of `custom.record_headers`: the row's own columns the document door does not answer.\n * `created_by` is the caller's own id on rows the caller made and null on every other; `mine`\n * says which.\n */\nexport interface RecordHeader {\n  id: Uuid;\n  table_id: Uuid;\n  created_at: string;\n  updated_at: string;\n  version: number;\n  deleted_at: string | null;\n  mine: boolean;\n  created_by: Uuid | null;\n}\n\n/**\n * Fold `table_row_counts` onto a table list: `row_count` set on every Table the counts name.\n * A Table the counts do not name keeps what it had — the store answers no row for a Table this\n * reader may not know, and that is never turned into a zero. Pure.\n */\nexport function withRowCounts<T extends { id: Uuid; row_count?: number | null }>(\n  tables: readonly T[],\n  counts: readonly TableRowCount[] | null | undefined,\n): T[] {\n  if (!counts) return [...tables];\n  const byId = new Map(counts.map((c) => [c.table_id, Number(c.visible_rows)]));\n  return tables.map((t) => (byId.has(t.id) ? { ...t, row_count: byId.get(t.id) as number } : t));\n}\n\n// ── G13: a view keeps the order a person dragged ───────────────────────────────────────\n\n/** What `custom.view_record_order_set` answers. */\nexport interface ViewOrderSet {\n  view_id: Uuid;\n  table_id: Uuid;\n  order: \"manual\";\n  named: number;\n  positioned: number;\n}\n\n/**\n * The order to send after a drag: `order` with `moved` taken out and put at `toIndex` (clamped).\n * The store keeps every row the call does not name in its old place after the named ones, so a\n * screen may send only the rows it shows. Pure.\n */\nexport function moveInOrder(order: readonly Uuid[], moved: Uuid, toIndex: number): Uuid[] {\n  const rest = order.filter((id) => id !== moved);\n  const at = Math.max(0, Math.min(Math.trunc(toIndex), rest.length));\n  return [...rest.slice(0, at), moved, ...rest.slice(at)];\n}\n\n// ── G14: a known outsider is granted at once ───────────────────────────────────────────\n\n/**\n * What `custom.table_share_outside_grant` answers. `person` says which path ran:\n * `outside_account` (granted at once and notified — never made a member), `member` (a plain\n * share), `no_account` (the invitation door's own answer, with its link and delivery).\n */\nexport interface OutsideShareAnswer {\n  granted: boolean;\n  invited: boolean;\n  joined: boolean;\n  person: \"outside_account\" | \"member\" | \"no_account\";\n  email: string;\n  table: string;\n  level: string;\n  level_label: string;\n  say: string;\n  user_id?: Uuid;\n  permission_id?: Uuid;\n  invitation_id?: Uuid | null;\n  accept_path?: string | null;\n  delivery_say?: string | null;\n}\n","// src/core/supabase.ts — @ai-matrx/records (HEADLESS)\n//\n// THE ONE ADAPTER FROM A SUPABASE CLIENT TO THIS PACKAGE'S DATA SEAM.\n//\n// Why it exists, and what it cost to learn (2026-09-19, the independent verdict\n// on /data): `RecordsDataSource.rpc(fn, args, { schema })` says the schema\n// out loud, because every door of this store is `custom.<name>` and every door\n// of the trust layer is `iam.<name>`. supabase-js's own\n// `rpc(fn, args, options)` HAS NO `schema` OPTION — its third argument is\n// `{ head, get, count }`, and an unknown key is dropped in silence. So a\n// supabase client handed straight to `config.dataSource` as a structural cast\n// asked its default PostgREST profile, `public`, for every door, and the store\n// answered correctly and uselessly:\n//\n//   PGRST202 — Could not find the function public.table_kernel_id(...) in the\n//   schema cache\n//\n// Every screen in the record store was dead from a browser because of it, while\n// the desktop app and the browser extension each grew their own way of asking.\n// The class fix is ONE adapter, here, in the headless core, that every host\n// inherits — never three hosts remembering the same thing.\n//\n// The schema is chosen the ONE way supabase-js offers: `client.schema(name)`\n// returns a client bound to that PostgREST profile (it sets the\n// `Accept-Profile` / `Content-Profile` headers), and `.rpc()` on THAT is the\n// call. There is no per-call option that does it.\n//\n// This file holds no key and opens no connection: the host hands in a client\n// that already carries the operating person's session, which is what makes\n// DOOR-5 and AGT-N-4 true — the store sees the person, not us.\n\nimport type { PgError } from \"../results\";\nimport type { RecordsDataSource } from \"../ports\";\n\n/**\n * The structural shape of the supabase client this adapter needs. Deliberately\n * NOT `SupabaseClient<Database>`: a generated `Database` type makes\n * `schema().from().select()` enormous, and a host app that passed its typed\n * client in got `TS2589: Type instantiation is excessively deep and possibly\n * infinite` in its own build (matrx-frontend, 2026-09-18, on all three campaign\n * routes at once). The cast lives here, once, where it is explained.\n */\nexport interface SupabaseLike {\n  schema(name: string): {\n    rpc(\n      fn: string,\n      args?: Record<string, unknown>,\n    ): PromiseLike<{ data: unknown; error: PgError | null }>;\n    from(table: string): unknown;\n  };\n}\n\n/** The refusal a caller sees rather than a silent call to the wrong schema. */\nfunction refuse(code: string, message: string, hint: string): { data: null; error: PgError } {\n  return { data: null, error: { code, message, hint, details: \"\" } as unknown as PgError };\n}\n\n/**\n * Bind a supabase-js client (or anything with the same `schema(name).rpc()`\n * shape) as this package's data seam.\n *\n * Two things never happen here, both of them loudly:\n *\n *  - A call with NO schema is never sent. It is refused by name, because\n *    sending it would reach `public` and get the store's PGRST202 several\n *    layers away from the mistake.\n *  - A client with no `.schema()` is never used. supabase-js has had it since\n *    v2.0; a host that binds something else is told exactly what is missing\n *    instead of throwing `undefined is not a function` inside a render.\n */\nexport function supabaseDataSource(client: object): RecordsDataSource {\n  if (isBound(client)) return client;\n  const supabase = client as unknown as Partial<SupabaseLike>;\n  const hasSchema = typeof supabase.schema === \"function\";\n\n  const bound: RecordsDataSource = {\n    // PAGE-BUNDLE: the real adapter opens a table page with one `custom.table_page_bundle` call.\n    opensInOneCall: true,\n    rpc(fn, args, options) {\n      if (!hasSchema) {\n        return Promise.resolve(\n          refuse(\n            \"data_source_unbound\",\n            `The records client was given something that is not a supabase client: it has no schema() ` +\n              `method, so the door ${fn} cannot be called in the schema it lives in.`,\n            \"Pass a supabase-js v2 client (createClient(...)) to supabaseDataSource().\",\n          ),\n        );\n      }\n      const name = options?.schema;\n      if (!name) {\n        return Promise.resolve(\n          refuse(\n            \"schema_unsaid\",\n            `The door ${fn} was called without saying which schema it lives in. ` +\n              `Every door of this store is custom.${fn} and every trust door is iam.${fn}; ` +\n              `an unqualified call reaches PostgREST's default profile (public) and is refused there.`,\n            \"This is a bug in the caller, not in your data: /core says the schema on every call.\",\n          ),\n        );\n      }\n      return (supabase as SupabaseLike).schema(name).rpc(fn, args) as ReturnType<\n        RecordsDataSource[\"rpc\"]\n      >;\n    },\n    schema(name) {\n      return (supabase as SupabaseLike).schema(name) as ReturnType<RecordsDataSource[\"schema\"]>;\n    },\n  };\n  Object.defineProperty(bound, BOUND, { value: true, enumerable: false });\n  return bound;\n}\n\n/** Marks a data source this adapter made, so binding it twice is a no-op, never a double wrap. */\nconst BOUND = Symbol.for(\"@ai-matrx/records/supabaseDataSource\");\n\nfunction isBound(source: object): source is RecordsDataSource {\n  return (source as Record<symbol, unknown>)[BOUND] === true;\n}\n\n/**\n * WHAT `createRecordsClient` DOES WITH WHATEVER IT IS HANDED (lane PLATFORM-APP-DATA, 2026-10-02).\n *\n * The README has always shown `dataSource: supabase` — a PLAIN supabase-js client — and that\n * exact line answered every call \"Could not find the function public.table_kernel_id\" (PGRST202),\n * because supabase-js's own `rpc()` drops the `{ schema }` option in silence (see the header).\n * Measured on the clone as admin@admin.com, 2026-10-02. The example is now true:\n *\n *  - Already bound by `supabaseDataSource` → used as it is.\n *  - A supabase-js client (it has `schema()`, `from()` and an `auth` client) → bound here, once.\n *  - Nothing callable at all (no `rpc()`) → bound here too, so every call is REFUSED by name with\n *    the remedy (`data_source_unbound`) instead of throwing `rpc is not a function` in a render.\n *  - Anything else that has its own `rpc(fn, args, { schema })` — a host's adapter, a test\n *    double — is the host's own data seam and is used as it is: it promised to honor `schema`.\n */\nexport function asRecordsDataSource(source: unknown): RecordsDataSource {\n  if (source === null || typeof source !== \"object\") return supabaseDataSource({});\n  if (isBound(source)) return source;\n  const candidate = source as Partial<SupabaseLike> & { rpc?: unknown; from?: unknown; auth?: unknown };\n  const looksLikeSupabaseJs =\n    typeof candidate.schema === \"function\" &&\n    typeof candidate.from === \"function\" &&\n    candidate.auth !== null &&\n    typeof candidate.auth === \"object\";\n  if (looksLikeSupabaseJs || typeof candidate.rpc !== \"function\") return supabaseDataSource(source);\n  return source as RecordsDataSource;\n}\n","// src/drill.ts — @ai-matrx/records\n//\n// THE ONE READ CONTRACT FOR EVERY TABLE (lane DRILL-STANDARD-DOOR, DRILL-DOWN-DESIGN.md §d).\n//\n// A question — group by these Dimensions, show these Measures, cut time by day…year in the\n// organization's calendar, compare with a prior window, pivot one Dimension across — asked of\n// a SOURCE, and answered in one shape whichever kind of source it is:\n//\n//   { kind: \"table\",  id }      a custom Table in the record store (custom.record_aggregate,\n//                               its Dimensions from custom.table_dimensions)\n//   { kind: \"entity\", token }   a standard Postgres table by its registry token (\"agent\",\n//                               \"ai_model\"), or a DECLARED definition by its key (a fact over\n//                               several tables joined by their foreign keys, e.g. \"agents_by_model\")\n//\n// Three doors, all in schema `platform`, all SECURITY INVOKER: a standard table is counted by a\n// statement running as the person, so the table's own row security decides every row counted —\n// an answer never holds a number she could not assemble from rows she can open. Groups past the\n// cap (\"Groups shown before Other\", knob drill/groups_per_level) fold into ONE Other row, and the\n// total row says so in words.\n//\n// Vocabulary (Arman, 2026-09-29): \"Dimension\" and \"Measure\" are platform words; a saved\n// exploration is a Saved view. \"Drill definition\" is still a working label (DRILL-DOWN-DESIGN D0).\n\nimport type { Uuid } from \"./record\";\nimport type { RuleExpression } from \"./rule\";\n\n/** Where a question is asked. */\nexport type DrillSource =\n  | { kind: \"table\"; id: Uuid }\n  | { kind: \"entity\"; token: string };\n\n/** Who a question is asked for (the access lanes, applied to counting). */\nexport type DrillLane = \"mine\" | \"organization\" | \"platform\";\n\nexport type DrillGrain = \"hour\" | \"day\" | \"week\" | \"month\" | \"quarter\" | \"year\";\n\nexport type DrillMeasureOp =\n  | \"count\"\n  | \"count_distinct\"\n  | \"sum\"\n  | \"avg\"\n  | \"min\"\n  | \"max\"\n  | \"median\"\n  | \"percentile\"\n  | \"rate\"\n  | \"filled\"\n  | \"empty\"\n  | \"ratio\"\n  | \"sum_of\"\n  | \"span\";\n\n/**\n * The operations a question may ask ad hoc (`{op, of}`); a ratio, a percentile and a run rate are\n * declared, never ad hoc (each needs more than a column: its parts, its p, its per).\n */\nexport type DrillAdHocOp = Exclude<DrillMeasureOp, \"ratio\" | \"percentile\" | \"rate\" | \"sum_of\">;\n\n/**\n * A color a choice keeps on every chart and share bar (lane DRILL-PARITY-LAST): one of the package's\n * semantic chart tokens (light and dark), never a raw color — the old usage page's origin colors.\n */\nexport type DrillChartToken =\n  | \"--matrx-chart-1\"\n  | \"--matrx-chart-2\"\n  | \"--matrx-chart-3\"\n  | \"--matrx-chart-4\"\n  | \"--matrx-chart-5\"\n  | \"--matrx-chart-6\"\n  | \"--matrx-chart-7\"\n  | \"--matrx-chart-8\"\n  | \"--matrx-chart-9\"\n  | \"--matrx-chart-10\"\n  | \"--matrx-chart-other\";\n\n/** Every chart token a choice may name (the validator's list). */\nexport const DRILL_CHART_TOKENS: readonly DrillChartToken[] = [\n  \"--matrx-chart-1\", \"--matrx-chart-2\", \"--matrx-chart-3\", \"--matrx-chart-4\", \"--matrx-chart-5\",\n  \"--matrx-chart-6\", \"--matrx-chart-7\", \"--matrx-chart-8\", \"--matrx-chart-9\", \"--matrx-chart-10\", \"--matrx-chart-other\",\n];\n\n/** A value a Measure's own `where` narrows by: a value, null (\"not set\") or a list of them. */\nexport type DrillMeasureWhereValue = string | number | boolean | null | Array<string | number | boolean | null>;\n\n/** An axis a question can cut by. */\nexport interface DrillDimension {\n  key: string;\n  label: string;\n  /** The column (fact) or `join.column` it reads. */\n  from: string;\n  kind: \"choice\" | \"relation\" | \"boolean\" | \"text\" | \"time\";\n  cardinality?: \"low\" | \"medium\" | \"high\";\n  /** A code's words; `color` keeps the value one chart token on every chart and share bar. */\n  choices?: Array<{ value: string; label: string; color?: DrillChartToken }>;\n  /** A relation's target: a registry token (standard) or a Table id (custom). */\n  relation?: { token?: string; table_id?: Uuid; person?: boolean };\n  /** A time's grains, coarsest first. */\n  grains?: DrillGrain[];\n  /** The words the empty group reads (\"No embedding (nothing new to embed)\"); a screen's own default otherwise. */\n  empty_label?: string;\n  /**\n   * What the Dimension groups by, at most 140 characters (lane DRILL-FLIP-FIXES, the Spend cut tables'\n   * explanations): a screen shows it as the column header's tooltip, never as text on the page.\n   */\n  description?: string;\n  /**\n   * WHAT A LEVEL OF IT LOOKS LIKE (lane DRILL-LEVELS) — the same shape as the design-system's\n   * `MatrxDrillLevel`; judged by platform.drill_definition_problems and handed to a screen by\n   * drill_describe. Absent = the screen infers it.\n   */\n  level?: DrillLevel;\n}\n\n/**\n * A DIMENSION'S LEVEL PROFILE (lane DRILL-LEVELS): what a drilled value of it offers and says.\n *   breakouts  — Dimension references (`at:day` for a time) offered as one-click \"By …\" chips, in order;\n *                `<definition>:<dimension>` names a SIBLING definition's Dimension (`ai_usage_executions:conversation`):\n *                the screen switches the source there carrying the trail (lane DRILL-PRIMITIVE-2)\n *   show       — the Measures shown while grouping by it\n *   attributes — Dimension keys each value holds ONE of (a conversation's agent, a model's provider):\n *                columns while grouping by it, and the drilled value's header\n *   records    — the columns \"See these records\" shows at this level (a subset of `records.columns`)\n */\nexport interface DrillLevel {\n  breakouts?: string[];\n  show?: string[];\n  attributes?: string[];\n  records?: string[];\n}\n\n/** The longest a Dimension's or a Measure's `description` may be (a tooltip's budget). */\nexport const DRILL_DESCRIPTION_MAX = 140;\n\n/** A number a question can show. */\nexport interface DrillMeasure {\n  key: string;\n  label: string;\n  op: DrillMeasureOp;\n  /**\n   * The column it reads (absent for `count`, `ratio` and `sum_of`). A `max` / `min` of a time column\n   * is a MOMENT (\"Last active\"): it declares `unit: \"time\"`, is never additive, and no threshold reads it.\n   */\n  of?: string;\n  /**\n   * `ratio` only: (the sum of these Measures) / (the sum of `den`), recomputed for every group, Other\n   * and the total from their parts (never averaged). Each part is a `sum` or `count` Measure of the\n   * same definition (optionally narrowed by its own `where`), or another ratio — e.g. cost per request\n   * = `{op: \"ratio\", num: [\"cost\"], den: \"requests\"}`; cache-hit rate = `{num: [\"hits\"], den: [\"hits\",\n   * \"calls\"]}`; the enrichment multiplier = `{num: [\"avg_enriched\"], den: \"avg_plain\"}` (two ratios).\n   */\n  num?: string[];\n  /**\n   * `sum_of` only: these Measures added up, recomputed for every group, Other and the total from\n   * their own rows — total tokens = `{op: \"sum_of\", parts: [\"tokens_in\", \"tokens_cached\", \"tokens_out\"]}`.\n   * Each part is a `sum` or `count` that adds up, or another `sum_of`; at least two.\n   */\n  parts?: string[];\n  /** `ratio` only: the Measure (or the list of Measures, added up) it is divided by; null where that is zero. */\n  den?: string | string[];\n  /**\n   * `ratio` or `rate`: a multiplier, bound by the door — `1000` makes cost per character cost per\n   * 1,000 characters; `10` makes a monthly projection \"at ten times today's load\".\n   */\n  scale?: number;\n  /** `percentile` only: the fraction, above 0 and below 1 (`0.9` = p90). Recomputed for Other and the total from their own rows. */\n  p?: number;\n  /**\n   * `rate` only: the run rate's period. A run rate is the window's sum of `of` ÷ the window's length\n   * × one `per` (\"day\", or \"month\" = 30 days — the old KG projection's rule). A question showing one\n   * must have a window with a start; a window reaching past now counts only the time that has passed.\n   */\n  per?: \"day\" | \"month\";\n  /**\n   * This Measure only, narrowed to the rows whose Dimensions hold these values (Dimension key → a\n   * value, null or a list; never a time): \"cost of successful enriched runs\". Bound by the door.\n   */\n  where?: Record<string, DrillMeasureWhereValue>;\n  /**\n   * How a screen reads the number: usd, count, tokens, ms, share, times, …; `time` = a moment (ISO);\n   * `duration` = a length of time in milliseconds — what a `span` (`of` a time column: the latest\n   * minus the earliest moment, never additive, recomputed for Other and the total) declares.\n   */\n  unit?: string;\n  /** Counted once per this column's value (a measure on the \"one\" side of a join). */\n  at_grain?: string;\n  /** May it be summed across groups? */\n  additive?: boolean;\n  /**\n   * What the number counts, at most 140 characters (lane DRILL-FLIP-FIXES): a screen shows it as the\n   * column header's tooltip — \"Requests a person or an API caller made; automated runs count as Calls\".\n   */\n  description?: string;\n  /**\n   * (lane DRILL-ENGINE, 2026-10-18) How a summary-backed distinct count that is NOT exact over groups or hours is\n   * answered exactly, definer definitions only. `per_hour`: registry token of a per-hour total (the time column,\n   * `everyone`, this Measure's `of` column, each lane rule's column) read for an ungrouped question — exact to the\n   * hour. `raw_of`: the records column counted distinct, the whole question read from the records relation when the\n   * window is at most `raw_within_hours` long. Any other question showing it says \"not exact\".\n   */\n  exact?: { per_hour?: string; raw_of?: string; raw_within_hours?: number };\n}\n\n/** A named drill path: the levels a click walks, e.g. [\"created_at:year\", \"created_at:month\"]. */\nexport interface DrillPath {\n  key: string;\n  label: string;\n  levels: string[];\n}\n\n/**\n * A threshold on the groups of an answer (`having`). Judged on the current window, and applied\n * BEFORE the cut into Other: a group that misses any threshold is added into Other with the groups\n * past the limit, so the answer still adds up to its total; `distinct_groups` counts the groups that\n * met every threshold and the total row says how many did (\"3 of 41 groups meet the rule …\").\n * Exactly one of `value` / `share_of_total` / `times_median`.\n */\nexport interface DrillHaving {\n  /** A Measure the question shows (a screen shows the number it filters on). */\n  measure: string;\n  /** At least / more than; at most / less than (lane DRILL-FLIP-FIXES: \"groups where cost ≤ 5\"). */\n  op: \">=\" | \">\" | \"<=\" | \"<\";\n  /** The group's value against a number. */\n  value?: number;\n  /** The group's value against this percent (0–100] of the window's total; additive Measures only. */\n  share_of_total?: number;\n  /** The group's value against this multiple of the median group's value. */\n  times_median?: number;\n  /** With `times_median`: the median of the groups above zero only. */\n  median_nonzero?: boolean;\n  /**\n   * The address of the drill setting that holds the line (organizations and people decide):\n   * `drill.finding.<definition>.<finding>.<knob>` inside a finding. When present the setting's value\n   * is the threshold and the number written beside it is its default. Resolved by the door through\n   * platform.drill_knob; clients read the same value from platform.knob_snapshot.\n   */\n  knob?: string;\n}\n\n/** A question — what a Saved view stores and the explorer's URL encodes. */\nexport interface DrillQuestion {\n  /** Dimension keys, outermost first; a time as `key:grain` (\"created_at:week\"). At most four. */\n  by?: string[];\n  /** One Dimension drawn as the columns of a pivot. */\n  across?: string;\n  /** Measure keys, or an ad hoc `{op, of}` over a column the definition reads. */\n  show?: Array<string | { op: DrillAdHocOp; of?: string }>;\n  /**\n   * The store's own filter shape: a scalar is an equality, `null` is \"not set\", a list is any of\n   * them, `{from, to}` is a half-open range; `key:grain` = one period by its label.\n   */\n  where?: Record<string, unknown>;\n  /**\n   * A custom Table only: the view's Rule expression, which must hold beside `where`\n   * (custom.record_drill ANDs the two). A standard source refuses it.\n   */\n  rule?: RuleExpression;\n  window?: { key?: string; preset?: string; from?: string; to?: string };\n  compare?:\n    | \"previous_period\"\n    | \"same_period_last_year\"\n    | { against: \"previous_period\" | \"same_period_last_year\" | \"range\"; period?: DrillGrain; from?: string; to?: string; baseline?: { from: string; to: string }; to_date?: boolean };\n  sort?: { key: string; direction?: \"asc\" | \"desc\" };\n  /** Groups per level before Other; the knob's value when absent, never above the page ceiling. */\n  limit?: number;\n  lane?: DrillLane;\n  /** The drill path a screen's default click follows. */\n  path?: string;\n  /** Thresholds on the groups, applied before the cut into Other (see DrillHaving). */\n  having?: DrillHaving[];\n  /** Records only: the page's start. */\n  offset?: number;\n  /** Records only: which columns a record shows (a definer definition's records: of its declared columns). */\n  columns?: string[];\n}\n\n/** A definition's built-in Saved view: read-only; \"Save a copy\" makes a person's own. */\nexport interface DrillView {\n  key: string;\n  label: string;\n  question: DrillQuestion;\n  /**\n   * AT A GLANCE (lane DRILL-FLIP-FIXES, the Spend Explorer's costliest requests): Dimensions each group\n   * of the view's outer grouping has ONE value of — a request's person, agent, model — shown as text\n   * columns beside its numbers, no click required. A screen reads them by asking the same door with\n   * the group and these Dimensions (the group's values listed), so they obey the same lane and filters.\n   * A group holding several values of one says so.\n   */\n  attributes?: string[];\n  /**\n   * How the view's chart draws (lane DRILL-FLIP-FIXES, the CX tab's input vs output tokens): `stack`\n   * names two or more Measures that add up, drawn as one stacked bar per period (no split).\n   */\n  chart?: { stack?: string[] };\n}\n\n/**\n * A finding (\"dig here\"): a question whose `having` thresholds are the rule. Its lines are settings\n * at `drill.finding.<definition>.<finding>.<knob>`, seeded from `knobs` by the drill sync; a\n * threshold that reads one writes the setting's default beside it. A finding with no group says so.\n */\nexport interface DrillFinding {\n  key: string;\n  label: string;\n  question: DrillQuestion;\n  knobs: Record<string, { default: number; label: string; unit: string }>;\n}\n\n/**\n * The records behind a DEFINER definition's numbers: a registry relation carrying the fact's column\n * names (e.g. `bucket`), read by the door definer with the SAME filter compiler and the SAME lane\n * rule as the number, for a window (required), and never past the number's `as_of` (rows created\n * after it are not listed). The number and its records are the SAME counted rows, equal as of the\n * count (`as_of`); a value that changes afterwards reaches both at the next count.\n *\n * An INVOKER definition may declare records too (lane DRILL-GAPS): they are its own rows (`fact` is\n * the definition's own fact), read as the person through the table's row security, among the columns\n * the definition already reads — so a screen shows \"the recent runs\" without a host link.\n */\nexport interface DrillRecords {\n  /** The registry token of the records relation (e.g. \"ai_usage_executions\"). */\n  fact: string;\n  /** The columns a record shows, in order. */\n  columns: string[];\n  /** The words a person reads for a column, where its name would mislead (\"Request's top model\"). */\n  labels?: Record<string, string>;\n  /**\n   * What ONE record is, singular (\"execution\", \"log line\"): the noun \"See these records\" and their\n   * count read in. REQUIRED when the records are another relation's rows (`fact` is not the\n   * definition's own fact: an hourly summary's records are its executions, never \"hours\"); optional\n   * otherwise, where the definition's own grain (\"one row per deal\") already names it.\n   */\n  noun?: string;\n}\n\n/** The address of a finding's setting: `drill.finding.<definition>.<finding>.<knob>`. */\nexport function drillFindingKnob(definition: string, finding: string, knob: string): string {\n  return `drill.finding.${definition}.${finding}.${knob}`;\n}\n\nexport interface DrillDefinition {\n  key: string;\n  label: string;\n  source: DrillSource;\n  /** One sentence: \"one row per agent\". */\n  grain: string;\n  lanes: DrillLane[];\n  dimensions: DrillDimension[];\n  measures: DrillMeasure[];\n  paths: DrillPath[];\n  detail: { columns: string[]; open?: string };\n  default: DrillQuestion;\n  /** Keys that came from inference, so a screen can say so. */\n  inferred?: string[];\n  mode?: \"invoker\" | \"definer\";\n  /** Honest notes about what inference could not offer, in words. */\n  says?: string[];\n  /** Built-in Saved views, listed first and read-only. */\n  views?: DrillView[];\n  /** Findings (\"dig here\"), answered by the same door. */\n  findings?: DrillFinding[];\n  /** The records relation (what \"See these records\" reads): a definer definition's declared relation, or an invoker definition's own rows. */\n  records?: DrillRecords;\n  /**\n   * The drill setting (minutes) after which the definition's `as_of` is old enough for a screen to say\n   * \"the schedule is behind\" — null when the definition is counted live.\n   */\n  stale_after_knob: string | null;\n}\n\n/** One row of an answer. */\nexport interface DrillAnswerRow {\n  /** `group` a shown group · `other` every group past the cap · `total` the whole answer (or a pivot column's total). */\n  kind: \"group\" | \"other\" | \"total\";\n  /** Each asked Dimension -> its value (a period by its label). A pivot cell also carries the `across` key. */\n  groups: Record<string, unknown> | null;\n  measures: Record<string, number | string | null> | null;\n  row_count: number;\n  prior_groups: Record<string, unknown> | null;\n  prior_measures: Record<string, number | string | null> | null;\n  prior_row_count: number | null;\n  delta: Record<string, { current: number | null; prior: number | null; change: number | null; change_pct: number | null }> | null;\n  compare: Record<string, unknown> | null;\n  /** How many groups there were before the cap (current window). */\n  distinct_groups: number | null;\n  /** Relation Dimensions' labels, read as the person through the target's own row security. */\n  labels: Record<string, string>;\n  /** The answer's honest sentences (the cut, a column past its cap, a name that could not be read). */\n  says: string | null;\n  /** The moment a summary fact counted through (ISO); null when counted live from the table. */\n  as_of: string | null;\n}\n\nexport interface DrillAnswer {\n  rows: DrillAnswerRow[];\n  /** Every sentence the rows carry, once. */\n  says: string[];\n  /** The total row (kind total, no group). */\n  total: DrillAnswerRow | null;\n  /** The moment the answer counted through (the rows' `as_of`); null when counted live. */\n  as_of: string | null;\n}\n\n/** The records behind a number (\"see these records\"): the same filter, read as the person. */\nexport interface DrillRowsPage {\n  total: number;\n  limit: number;\n  offset: number;\n  rows: Array<Record<string, unknown>>;\n  next_offset?: number;\n  columns?: string[];\n  says?: string;\n  /** The moment these records are cut at — the number's `as_of`; null when read live. */\n  as_of: string | null;\n  /**\n   * A definer definition's records, first page only: every Measure that adds up (sum, count, ratio)\n   * summed over the SAME filter — what these records add up to, which is the number they open.\n   */\n  measures?: Record<string, number | string | null>;\n}\n\n/**\n * A DECLARED drill definition (a `*.drill.ts` file): an override of one standard table (its key\n * IS that table's registry token) or a fact over several tables (a key of its own). The one sync\n * script (scripts/drill-sync.ts) compiles each into `platform.drill_def__<key>()`; the store's\n * validator, platform.drill_definition_problems, judges it at sync, at census and on every ask.\n */\nexport interface DrillDeclaration {\n  key: string;\n  label: string;\n  grain: string;\n  /** The fact's registry token. */\n  fact: string;\n  /** invoker (default): the fact's own row security decides. definer: the lane rules below do. */\n  mode?: \"invoker\" | \"definer\";\n  lanes: DrillLane[];\n  /** invoker: which columns narrow the organization and mine lanes. */\n  lane_columns?: { organization?: string; mine?: string };\n  /** definer ONLY, and required for every lane: a closed vocabulary, never SQL. */\n  lane_rules?: {\n    mine?: { column: string };\n    organization?: { column: string; rule: \"member\" | \"admin\" };\n    platform?: { rule: \"super_admin\" };\n  };\n  /** Star joins along a real foreign key, many-to-one only. `from` is a fact column or `join.column`. */\n  joins?: Array<{ as: string; token: string; from: string }>;\n  dimensions: DrillDimension[];\n  measures: DrillMeasure[];\n  paths?: DrillPath[];\n  detail?: { columns: string[]; open?: string };\n  default?: DrillQuestion;\n  /** An override may hide inferred keys. */\n  hide?: string[];\n  /** Built-in Saved views (every question judged against this definition by the validator). */\n  views?: DrillView[];\n  /** Findings: questions with thresholds whose lines are settings. */\n  findings?: DrillFinding[];\n  /**\n   * definer: the relation its records are read from (the same filter and lane rule); invoker: its own\n   * fact, read as the person (lane DRILL-GAPS).\n   */\n  records?: DrillRecords;\n  /** definer ONLY, and only over a fact that keeps a `<table>_watermark`: the stale line's setting. */\n  stale_after_knob?: string;\n}\n\n/** Identity with a type: the one way a `*.drill.ts` file declares a definition. */\nexport function declareDrillDefinition<const T extends DrillDeclaration>(declaration: T): T {\n  return declaration;\n}\n\n/** Decode the door's rows into an answer: the total row found, every sentence once. */\nexport function drillAnswerOf(rows: DrillAnswerRow[]): DrillAnswer {\n  const says: string[] = [];\n  for (const row of rows) {\n    if (row.says && !says.includes(row.says)) says.push(row.says);\n  }\n  const total =\n    rows.find((r) => r.kind === \"total\" && (!r.groups || Object.keys(r.groups).length === 0)) ?? null;\n  const as_of = rows.find((r) => r.as_of != null)?.as_of ?? null;\n  return { rows, says, total, as_of };\n}\n\n/** The door's name for each call (schema `platform`). */\nexport const DRILL_SCHEMA = \"platform\";\nexport const DRILL_DOORS = {\n  describe: \"drill_describe\",\n  ask: \"drill_ask\",\n  rows: \"drill_rows\",\n} as const;\n","// src/core/query.ts — @ai-matrx/records\n//\n// THE QUERY. DOOR-6 … DOOR-10.\n//\n// Query by any combination of relation coordinates and any subset of them; as-of\n// a date on EITHER clock; promoted-field predicates. DOOR-10 is the one that\n// shapes this module: every query is filtered by Visibility INSIDE the query,\n// never post-filtered — which is why nothing here ever reads rows and then drops\n// some. The filtering happens in the store's own policies and in the doors; this\n// builder only describes what to ask for.\n//\n// DOOR-N-3: every hot read runs as a PREPARED statement. A client cannot prepare\n// anything itself, so the builder never concatenates a value into SQL: relation\n// coordinates resolve through `custom.relation_targets`, promoted predicates\n// through `custom.promoted_read`, and both are functions with typed parameters —\n// which is what \"prepared\" means on this side of the wire.\n\nimport type { RelationCoordinate } from \"../relation\";\nimport type { Timestamp, Uuid } from \"../record\";\n\n/**\n * DOOR-8. As-of on EITHER clock, and they are different questions:\n *   · `record` — the record clock: what this record looked like at version time.\n *   · `world` — the world clock: which values were true of the world then\n *     (the Field's `dated` modifier).\n */\nexport interface AsOf {\n  clock: \"record\" | \"world\";\n  at: Timestamp;\n}\n\n/** A predicate over a PROMOTED field (REC-5: promotion light -> heavy). */\nexport interface PromotedPredicate {\n  field_key: string;\n  /** The value as text, exactly as `custom.promoted_read` takes it. */\n  equals: string;\n}\n\nexport interface RecordQuery {\n  table_id: Uuid;\n  /** DOOR-6. Any combination, any subset. An empty list means \"no relation constraint\". */\n  relations?: RelationCoordinate[];\n  /** Predicates the store can answer from an index. */\n  promoted?: PromotedPredicate[];\n  /** DOOR-8. */\n  asOf?: AsOf;\n  /** DOOR-9. Ask across EVERY Home of this Table in one answer. */\n  acrossHomes?: boolean;\n  /** REC-23. Soft-deleted rows are out unless you say otherwise. */\n  includeDeleted?: boolean;\n  /** FLD-10. */\n  recordType?: string;\n  orderBy?: { column: \"created_at\" | \"updated_at\"; ascending?: boolean };\n  limit?: number;\n  offset?: number;\n}\n\n/**\n * What a query decomposes into: a set of door calls whose answers INTERSECT,\n * then one filtered read. Kept as data rather than hidden inside the client so\n * the suite can assert the plan as well as the answer — a query that quietly\n * stopped applying one of its coordinates is otherwise invisible.\n */\nexport interface QueryPlan {\n  /** One `relation_targets` call per coordinate; the id sets are intersected. */\n  relationCalls: Array<{ door: \"relation_targets\"; record_id: Uuid; via_key: string | null }>;\n  /** One `promoted_read` call per predicate; intersected with the above. */\n  promotedCalls: Array<{ door: \"promoted_read\"; field_key: string; value: string }>;\n  /** The filtered read over `custom.record`, which the store's policies gate. */\n  read: {\n    table_id: Uuid;\n    includeDeleted: boolean;\n    recordType: string | null;\n    asOf: AsOf | null;\n    acrossHomes: boolean;\n    orderBy: { column: string; ascending: boolean };\n    limit: number;\n    offset: number;\n  };\n  /**\n   * Stated so nobody has to guess: when this is true the answer is the\n   * intersection of the id sets above, and when it is false the read stands\n   * alone.\n   */\n  intersects: boolean;\n}\n\nexport const DEFAULT_PAGE_SIZE = 50;\n\nexport function planQuery(query: RecordQuery): QueryPlan {\n  const relationCalls = (query.relations ?? []).map((coordinate) => ({\n    door: \"relation_targets\" as const,\n    record_id: coordinate.record_id,\n    via_key: coordinate.role ?? null,\n  }));\n  const promotedCalls = (query.promoted ?? []).map((predicate) => ({\n    door: \"promoted_read\" as const,\n    field_key: predicate.field_key,\n    value: predicate.equals,\n  }));\n  return {\n    relationCalls,\n    promotedCalls,\n    read: {\n      table_id: query.table_id,\n      includeDeleted: query.includeDeleted ?? false,\n      recordType: query.recordType ?? null,\n      asOf: query.asOf ?? null,\n      acrossHomes: query.acrossHomes ?? false,\n      orderBy: {\n        column: query.orderBy?.column ?? \"created_at\",\n        ascending: query.orderBy?.ascending ?? false,\n      },\n      limit: query.limit ?? DEFAULT_PAGE_SIZE,\n      offset: query.offset ?? 0,\n    },\n    intersects: relationCalls.length + promotedCalls.length > 0,\n  };\n}\n\n/** The intersection of the id sets a plan's calls produced. Order is preserved from the first set. */\nexport function intersectIds(sets: Uuid[][]): Uuid[] {\n  if (sets.length === 0) return [];\n  const [first, ...rest] = sets as [Uuid[], ...Uuid[][]];\n  const others = rest.map((s) => new Set(s));\n  return first.filter((id) => others.every((set) => set.has(id)));\n}\n","// src/core/client.ts — @ai-matrx/records\n//\n// THE TYPED CLIENT OVER THE STORE'S DOORS, AND NOTHING ELSE.\n//\n// Every write in this file goes through `custom.record_write`,\n// `custom.record_update`, `custom.record_delete` or `custom.record_restore`.\n// There is no `insert`, no `update` and no `delete` against `custom.record`\n// anywhere in this package, and there is no code path that adds one: DOOR-N-1\n// says there is exactly one write door and `authenticated` holds no direct\n// INSERT, UPDATE or DELETE grant on the store — a client that tried would be\n// refused, and a client that TRIES is a defect even when it is refused.\n//\n// Reads go through the read door too (DOOR-1, DOOR-10): the filtered select over\n// `custom.record` is gated by the store's own policies, and this file never\n// takes rows and then drops some of them. Where it needs an id set it asks a\n// door for one.\n//\n// Nothing here throws. Every method answers `RecordsResult`, and every refusal\n// carries the store's own sentence.\n\nimport { EVERY_RECORD_TYPE, fieldAppliesToEveryType } from \"../recordType\";\nimport { takePrimedTablePageBundle } from \"./primedBundle\";\nimport { canonicalArgs, createDoorCall, primedDoorAnswer, recordsErrorSink, type DoorCall } from \"./doorCall\";\nimport { onRecordChanged } from \"./recordChanges\";\nimport type { ArchivedDoorRow, ArchivedRow, ArchiveLane } from \"../archive\";\nimport { DEFAULT_ARCHIVE_LANE } from \"../archive\";\nimport type {\n  AggregateBucket,\n  AggregateCompare,\n  AggregateMeasure,\n  AggregateRow,\n  RecordFilter,\n  StoreFilter,\n} from \"../aggregate\";\nimport { liftWithheld, stableFilterKey } from \"../aggregate\";\nimport { isLockedStub, splitLockedRows } from \"../record\";\nimport type {\n  CaptureFileRef,\n  CaptureOutcome,\n  CaptureSheetFace,\n  CaptureSheetSummary,\n} from \"../capture\";\nimport type {\n  DashboardBlock,\n  DashboardBlockResult,\n  DashboardRunResult,\n  DashboardSummary,\n  InterfaceRead,\n  InterfaceRows,\n  StuckRow,\n} from \"../dashboard\";\nimport type { DocRenderRow, DocSignatureRow, DocTemplateRow, DocToken, DocUnresolvedToken } from \"../doc\";\nimport type {\n  EnrichCell,\n  EnrichDeclared,\n  EnrichDueRow,\n  EnrichRun,\n  EnrichmentSummary,\n} from \"../enrich\";\nimport type {\n  CommentThreadRead,\n  CommentWritten,\n  RecordFollowers,\n  RecordFollowSet,\n  FieldHistoryEntry,\n  FormulaHistoryEntry,\n  RecordHistoryEntry,\n  RestorePreview,\n  RestoreResult,\n} from \"../history\";\nimport type {\n  DigestPreview,\n  MySubscription,\n  RowTemplateRow,\n  SavedViewRow,\n  SavedViewSpecIn,\n  Subscription,\n  SubscriptionSpec,\n} from \"../subscription\";\nimport { withCallersClock } from \"../subscription\";\nimport type {\n  AnonTokenBinding,\n  WorkApprovalDecision,\n  WorkDecideMany,\n  WorkDecideManyItem,\n  WorkInboxView,\n  InboxStateChange,\n  InboxCounts,\n  WorkApprovalFiled,\n  WorkApprover,\n  WorkAssignment,\n  WorkAssignmentField,\n  WorkChange,\n  WorkInboxItem,\n  WorkListFlavour,\n  WorkListItem,\n  WorkRecordState,\n  WorkGraph,\n  WorkInstantiation,\n  WorkSlotHold,\n  WorkState,\n  WorkTurn,\n} from \"../work\";\nimport type {\n  ChecklistDeclared,\n  ChecklistRunStarted,\n  ChecklistRunStep,\n  ChecklistRunSummary,\n  ChecklistSpec,\n  ChecklistStepCompleted,\n  ChecklistTemplateShape,\n  ChecklistTemplateSummary,\n} from \"../checklist\";\nimport type { TableRowLabel } from \"../rowLabel\";\nimport { clearsRowLabel } from \"../rowLabel\";\nimport type {\n  ArchivedChecklistTemplate,\n  ArchivedForm,\n  FormArchiveAnswer,\n  RecordRowControls,\n  RowDefaultsApplied,\n  TableRowDefaults,\n  TableRowDefaultsPatch,\n} from \"../rowControls\";\nimport type { ExternalPrincipalCard, PublishBinding, ResolvedPublishBinding, ResolvedPublishBindingKind } from \"../trust\";\nimport type { RelationIcons, RelationWordsManyArgs, ReverseColumn, ReverseLinks, ReverseLinksFieldsArgs, ReverseLinksManyArgs, SourceArchived } from \"../relation\";\nimport { isReverseField, sourceArchivedOf } from \"../relation\";\nimport { isDerivedField, withDerivedLooks, withFormulaLooks } from \"../formulaLook\";\nimport { REVERSE_LINKS_RECORDS_PER_CALL } from \"../relation\";\nimport type { RelationNamesAnswer } from \"../coerce\";\nimport { defaultOpLedger } from \"../ops\";\nimport { createScopeDoors, type ScopeDoors } from \"../scopes/doors\";\nimport type { Field } from \"../field\";\nimport type { FieldRetyped, FieldRetypePreview, HistoryRetention, MigrationEntry, MigrationUndone, ParentExtracted, RecordMoved, RecordSplit, RecordsMerged } from \"../retype\";\nimport type { FieldDuplicated } from \"../field\";\nimport { createPickListDoors, type PickListDoors } from \"./pickListDoors\";\nimport { asChoiceNudge, type ChoiceCellBack, type ChoiceNudge, type ChoiceRehome, type ChoicesRehomed, type ChoiceUsage } from \"../choice\";\nimport { parseTableCopiesInProgress, parseTableDuplicated, parseTableDuplicateProgress, parseTableHome, parseTableMoved, type TableCopyInProgress, type TableDuplicated, type TableDuplicateProgress, type TableHome, type TableMoved } from \"../placement\";\nimport type {\n  Pipeline,\n  PipelineColumn,\n  PipelineDeclared,\n  PipelineMoveResult,\n  PipelineMoveMany,\n  PipelineMoveManyItem,\n  PipelineSpec,\n  PipelineVerdict,\n  StagePending,\n  StagePendingOnBoard,\n  PipelineGate,\n  PipelineGatePreview,\n  StageRuleEnforcement,\n  StageRuleOnFail,\n} from \"../pipeline\";\nimport type {\n  EntityFieldRights,\n  EntityFieldsAcross,\n  EntityBackLinks,\n  EntityRecordRead,\n  EntityRowWritten,\n  EntityRecordsFound,\n  EntityTableFacts,\n  NewEntityFieldDeclaration,\n} from \"../entity-field\";\nimport type { BookingAvailability, BookingDeclared, BookingSummary, FormResults, FormRoute, FormSummary } from \"../rule\";\nimport type {\n  ImportColumnsDeclared,\n  ImportBatchResult,\n  ImportFinished,\n  ImportOpened,\n  ImportPlan,\n  ImportPolicy,\n  ImportReport,\n  ImportRun,\n  InboundAddress,\n  InboundDeclared,\n} from \"../import\";\nimport type {\n  ConversationScope,\n  ConversationScopeContext,\n  RecordScopeContext,\n} from \"../record-scope\";\nimport type {\n  FormLookOptions,\n  PortalArchiveAnswer,\n  PortalArchiveFilter,\n  PortalCard,\n  PortalConfigInput,\n  PortalFormAnswer,\n  PortalFormSpec,\n  PortalInvitation,\n  PortalPreviewRow,\n  PortalRevocation,\n  PortalSummary,\n  PortalTableRef,\n} from \"../portal\";\nimport { asPermissionLevel, type MyLevel } from \"../level\";\nimport type { FieldPatch, FieldProposal, NewFieldDeclaration, TableProposal } from \"../field\";\nimport type {\n  HiddenFieldNotice,\n  ReadRow,\n  RecordRevision,\n  ReadValue,\n  RecordDocument,\n  RecordChange,\n  RecordChangeResult,\n  RecordGraphWritten,\n  KeysetRow,\n  RecordKeysetPage,\n  RecordPage,\n  RecordPageSort,\n  RecordRead,\n  StoredRecord,\n  Timestamp,\n  Uuid,\n} from \"../record\";\nimport type { RecordsConfig } from \"../ports\";\nimport type { RecordsError, RecordsResult, WriteConflict } from \"../results\";\nimport { err, ok } from \"../results\";\nimport { decodeKeysetCursor, encodeKeysetCursor } from \"./keysetCursor\";\nimport {\n  parseFieldDrift,\n  type FieldDrift,\n  type Table,\n  type TableArchiveProgress,\n  type TableCapacity,\n  type TableRestoreProgress,\n} from \"../table\";\nimport type {\n  AutomationDeclared,\n  AutomationFlipped,\n  AutomationList,\n  AutomationRevisions,\n  AutomationRuns,\n  AutomationSpec,\n  AutomationTested,\n} from \"../automation\";\nimport type {\n  ActionRunResult,\n  DecorationPath,\n  FormulaParse,\n  FormulaPreview,\n  GridLayout,\n  IoExportPage,\n  RecordEvent,\n  RowAction,\n  TableDecorations,\n  RecordHeader,\n  TableListEntry,\n  AdminTable,\n  DataHomeTable,\n  TableRowCount,\n  TableSyncResult,\n  TableSyncSpec,\n  TableCopySpec,\n  TableSyncAnswer,\n  TableSyncSettings,\n  TableSyncSourceDocument,\n  TableWebhook,\n  TableWebhookDeclared,\n  ViewOrderSet,\n  OutsideShareAnswer,\n} from \"../grid\";\nimport type { ButtonPressed } from \"../button\";\nimport { exportPageXlsx } from \"../grid\";\nimport {\n  DOORS,\n  TRUST_DOORS,\n  TRUST_SCHEMA,\n  doorAbsent,\n  doorExists,\n  doorReady,\n} from \"./doors\";\nimport { mapPgError, staleWriteDetail } from \"./pgError\";\nimport { asRecordsDataSource } from \"./supabase\";\nimport { DRILL_DOORS, DRILL_SCHEMA, drillAnswerOf } from \"../drill\";\nimport type { DrillAnswer, DrillAnswerRow, DrillDefinition, DrillQuestion, DrillRowsPage, DrillSource } from \"../drill\";\nimport { announceRecordChanged, announceTableStructureChanged, markRecordRemoved, markRecordRestored } from \"./recordChanges\";\nimport type { TableKindFacts } from \"../table-kind\";\nimport type { TableLevelFacts, TableLevelSet, TableReaderRule } from \"../tableLevel\";\nimport { intersectIds, planQuery, type RecordQuery } from \"./query\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { holdsRelativeDays, lookupFromFields, resolveRelativeDays, weekStartIndexOf } from \"../relativeDays\";\n\nconst DEFAULT_SCHEMA = \"custom\";\n\n// The door-call semantics live once, in ./doorCall (the light shell clients ask through it too).\nexport { canonicalArgs, A_PERSONS_REFUSAL, isAPersonsRefusal } from \"./doorCall\";\n\n/** One organization the client could not use, with the sentence that says why. */\nexport interface OrganizationUnavailable {\n  organization_id: Uuid;\n  reason: string;\n}\n\n/** `organizationsOpen`: the organizations whose store answers, and those that do not (with why). */\nexport interface OrganizationsOpenAnswer {\n  open: Uuid[];\n  unavailable: OrganizationUnavailable[];\n}\n\n/** `metadataSearch`: every match, each carrying the organization it came from. */\nexport interface MetadataSearchAnswer {\n  matches: Array<Record<string, unknown> & { organization_id: Uuid | null }>;\n  /** Organizations asked in order (the ones that answered). */\n  organizations_covered: Uuid[];\n  unavailable: OrganizationUnavailable[];\n}\n\n/** AT-SHARE-B. What `custom.field_notify_on_assign` answers: whether the column tells people, and the automations doing it. */\nexport interface FieldNotifyOnAssign {\n  field_id: Uuid;\n  notify_on_assign: boolean;\n  changed: boolean;\n  automation_ids: string[];\n  says?: string;\n}\n\n/** What `custom.base_move` answered when the whole base landed. */\nexport interface BaseMoved {\n  name: string;\n  toOrganizationId: Uuid;\n  /** How many tables went with the Home. */\n  tables: number;\n}\n\nexport interface RecordsClient extends PickListDoors {\n  /** The config this client was built with, so a screen can show who it is acting as. */\n  readonly config: RecordsConfig;\n  /**\n   * THE SCOPE DOORS (`custom.context_*`): scope types are Tables kept for context, scopes Records,\n   * context fields Fields, values cells. Built from this client's own door path. `@ai-matrx/records/scopes`.\n   */\n  readonly scopes: ScopeDoors;\n\n  // ── writes: the one door each ────────────────────────────────────────────\n  recordWrite(args: { table_id: Uuid; data: RecordDocument }): Promise<RecordsResult<Uuid>>;\n  /**\n   * WRITE THE RECORD THIS KEY NAMES, OR UPDATE IT WHEN IT IS ALREADY THERE — one call, race-safe\n   * (`custom.record_upsert`). `key` is the column key (or keys) that say which record this is,\n   * and every one must carry a `unique` rule: the store refuses any other column by its name.\n   * Two concurrent calls with the same key leave ONE record. An update goes through\n   * `record_update` (with `expectedVersion`, its stale-write refusal); a new record through\n   * `record_write`. Answers the record's id either way.\n   */\n  recordUpsert(args: {\n    table_id: Uuid;\n    key: string | string[];\n    data: RecordDocument;\n    expectedVersion?: number;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * Write MANY new records of one Table in one call.\n   *\n   * `custom.record_write_many` asks the switch, the organization and the Table\n   * ONCE for the whole batch and inserts the rows in one statement — which is\n   * why a paste of 120 lines is one round trip per chunk instead of 120. It\n   * CREATES only: there is no bulk update door, because an update carries a\n   * per-row optimistic version and a batch would have to either drop that or\n   * fail the whole batch for one stale row.\n   *\n   * It returns the new ids IN THE ORDER THE ROWS WERE HANDED IN, so a caller\n   * can tie each id back to the line of the spreadsheet it came from. Hand in\n   * `ids` to choose them yourself; hand in none and the door mints them.\n   */\n  recordWriteMany(args: {\n    table_id: Uuid;\n    rows: RecordDocument[];\n    ids?: Uuid[];\n  }): Promise<RecordsResult<Uuid[]>>;\n  /**\n   * DOOR-SPEED. MANY CHANGES TO ONE TABLE IN ONE TRANSACTION, through\n   * `custom.record_change_many`: inserts, updates (each with an optional `expected_version`)\n   * and archives. Every update lands in ONE statement, so the store's change notice, history and\n   * activity fire once for the batch while every row trigger still judges every row. ONE REFUSED\n   * CHANGE REFUSES THE BATCH and nothing is saved; the store's own sentence comes back with the\n   * change's position in the hint. The answer is one result per change, in order.\n   */\n  recordChangeMany(args: { table_id: Uuid; changes: readonly RecordChange[] }): Promise<RecordsResult<RecordChangeResult[]>>;\n  /**\n   * A PARENT, THE EDGES IT STANDS ON AND THE ROWS THAT BELONG TO IT — ALL OR NOTHING.\n   *\n   * `recordWrite` and `recordWriteMany` are each ONE statement. A screen or a\n   * server path whose unit of work is a GRAPH — an AI artifact and the lines\n   * it produced, an order and its items, a research note and its citations —\n   * could therefore not save it as one thing: a loop is N transactions, and a\n   * failure on row nineteen leaves a parent standing without the lines it\n   * promised.\n   *\n   * `custom.record_write_graph` is one statement, so it is one transaction. It\n   * is NOT a second write path: it calls `custom.record_write_many` for the\n   * rows, `public.assoc_add` for an edge that points OUT of the store (the\n   * message a record was produced by), and `platform.relation_set` for the\n   * parent's own declared relation to its children. Same store switch, same\n   * editor rung on the Table, same value envelope, same undeclared-key guard,\n   * same history rows, same realtime notice.\n   *\n   * ONE REFUSAL REFUSES THE WHOLE GRAPH, BY NAME — the answer says which member\n   * failed and carries the store's own sentence about it, and nothing is\n   * written.\n   *\n   * Every child MUST name a `role`: it is the key of a declared RELATION field\n   * on the parent's Table, and an edge out of a record that names no field is\n   * refused by the store (REL-10 / T7) because without it nothing can read the\n   * relation's delete rule, its cardinality or its organization wall. The order\n   * children are handed in IS the order of the relation.\n   */\n  recordWriteGraph(args: {\n    table_id: Uuid;\n    parent: RecordDocument;\n    /** Each child: its document, the parent FIELD it fills, and optionally its own Table. */\n    children?: Array<{\n      data: RecordDocument;\n      role: string;\n      table_id?: Uuid;\n      position?: number;\n    }>;\n    /** Edges to things OUTSIDE the store. `direction` defaults to `\"in\"` — that thing produced this record. */\n    edges?: Array<{\n      entity: string;\n      id: Uuid;\n      direction?: \"in\" | \"out\";\n      label?: string;\n      role?: string;\n      position?: number;\n      metadata?: Record<string, unknown>;\n    }>;\n  }): Promise<RecordsResult<RecordGraphWritten>>;\n  recordUpdate(args: {\n    record_id: Uuid;\n    patch: Record<string, unknown>;\n    /** Leave it out and the last writer wins; supply it and a loser is TOLD. */\n    expectedVersion?: number;\n  }): Promise<RecordsResult<number>>;\n  /**\n   * A CELL THAT TAKES WORDS WHICH ARE NOT YET A CHOICE — the words become a choice of that\n   * column everywhere and the cell takes it, in ONE transaction (lane CHOICE-COLUMN-EDIT,\n   * `custom.record_update_adding_choices`). `add` is `{ \"<column key>\": [\"words\", ...] }`; the\n   * cell's value in `patch` is the words, and the store turns them into the new choice's key.\n   * Adding a choice changes the table's columns, so it needs that right; a refusal names it.\n   * Answers the new version, like `recordUpdate`, and announces the record changed.\n   */\n  recordUpdateAddingChoices(args: {\n    record_id: Uuid;\n    patch: Record<string, unknown>;\n    add: Record<string, string[]>;\n    expectedVersion?: number;\n  }): Promise<RecordsResult<number>>;\n  /**\n   * The Feature Knob `custom/choice_nudge` for the signed-in person in this client's\n   * organization: what a choice cell does with typed words that are not a choice\n   * (`decideTypedChoice` in `choice.ts` is the one place that acts on it).\n   */\n  choiceNudge(): Promise<RecordsResult<ChoiceNudge>>;\n  /**\n   * REC-23. Soft, and reversible within `retention`.\n   *\n   * 🚨 NOT FOR A TABLE. A Table is a record, so this door accepts one — and\n   * then recurses through every record the Table contains inside a single\n   * transaction, which is unbounded by construction and dies on `57014` at a\n   * size the product's own import reaches in half a minute. Use\n   * `tableArchive` below, which does the same work in resumable passes.\n   */\n  recordDelete(args: { record_id: Uuid }): Promise<RecordsResult<Timestamp>>;\n  /**\n   * MOVE A RECORD (a Table included) INTO ANOTHER HOME — `custom.record_reparent`, the one door that changes where a\n   * record is contained. `parent_id` is the Home's record id (null takes it out). Admin on the record, viewer on the Home.\n   */\n  recordReparent(args: { record_id: Uuid; parent_id: Uuid | null }): Promise<RecordsResult<null>>;\n  recordRestore(args: { record_id: Uuid }): Promise<RecordsResult<void>>;\n  /**\n   * CLOSE-LINK (CD-LINK-10) — WHERE A TABLE LIVES: every Home it lives in (`custom.table_homes_named`), each named for\n   * this reader, the Home it was declared in first (`declared`). A Home this reader may not open is named as withheld.\n   */\n  tableHomes(args: { table_id: Uuid }): Promise<RecordsResult<Array<{ home_id: Uuid; name: string | null; declared: boolean }>>>;\n  /**\n   * CLOSE-LINK (CD-LINK-10) — \"ALSO LIVES IN…\": the Table also lives in `home_record_id` (`custom.home_add`, admin on the\n   * Table). A person shared on that Home alone then knows the Table and sees the records inside that Home, never another's.\n   */\n  homeAdd(args: { table_id: Uuid; home_record_id: Uuid }): Promise<RecordsResult<Uuid>>;\n  /**\n   * ARCHIVING A WHOLE TABLE — ONE PASS OF IT (VERIFIER-11 F3).\n   *\n   * One call archives at most `chunk` of the table's live records through\n   * `custom.record_delete` (so every guard, history capture and outbox row\n   * still happens; nothing is hard-deleted) and comes back with the numbers a\n   * screen draws progress from. The CALLER LOOPS until `done` — that loop is\n   * the fix, because the one thing a single statement cannot be made to do is\n   * finish.\n   *\n   * `chunk: 0` changes nothing and only reports, so a screen can say \"1,430\n   * records will be archived\" BEFORE a person commits to it. `includeTable:\n   * false` empties the table and leaves it standing.\n   *\n   * RESUMABLE, WITHOUT A JOB ROW: what remains is read off the records\n   * themselves every call. A pass that fails, a closed tab or a deploy mid-run\n   * leaves a half-archived table and a next call that continues from exactly\n   * there. A caller must therefore never report \"nothing happened\" after a\n   * failed pass — `archived_total` says what really landed.\n   */\n  tableArchive(args: {\n    table_id: Uuid;\n    /**\n     * How many records this pass takes on. The door clamps it; it answers with what it\n     * took. Default 50 — measured: ~35ms a record against an 8s statement timeout, so\n     * 200 dies on `57014` and is the original defect one level up.\n     */\n    chunk?: number;\n    /** Archive the Table record itself once nothing live is left in it. Default true. */\n    includeTable?: boolean;\n  }): Promise<RecordsResult<TableArchiveProgress>>;\n\n  /**\n   * ONE PASS OF ARCHIVING, ON PURPOSE, A TABLE THE APP'S CODE DEPENDS ON\n   * (`custom.table_archive_deliberately`, lane 12 P5). Such a table (`code_depends: true`) refuses\n   * `tableArchive`, `recordDelete`, a slug / kept_for rename, `tableMove` and removal of the mark.\n   * This door takes the table's slug TYPED by the person and a reason, refuses an agent, and then\n   * archives through `custom.table_archive` (same progress answer; the caller loops until `done`).\n   * Use `archiveTypedTableDeliberately` (`@ai-matrx/records/typed-table`), which loops.\n   */\n  tableArchiveDeliberately(args: {\n    table_id: Uuid;\n    typed_slug: string;\n    reason: string;\n  }): Promise<RecordsResult<TableArchiveProgress>>;\n\n  /**\n   * BRINGING A WHOLE TABLE BACK — ONE PASS OF IT (`custom.table_restore`, lane TABLE-ACTIONS).\n   *\n   * 🚨 NOT `recordRestore` FOR A TABLE: that door brings the Table, its structure, every record\n   * and everything built on it back in one statement and dies on `57014` (the clone's \"Referral\n   * Intake Queue 2026-Q4 (copy 7)\"). This pass brings back the Table and its structure first, then\n   * at most `chunk` records, then what was built on it — all from the one archive event — and\n   * answers `done` when nothing the archive took is still waiting. Use {@link tableRestoreWhole}.\n   */\n  tableRestore(args: { table_id: Uuid; chunk?: number }): Promise<RecordsResult<TableRestoreProgress>>;\n  /**\n   * THE WHOLE RESTORE OF A TABLE — the loop every caller needs: `tableRestore` until `done`,\n   * halving the pass on a statement timeout (a pass that timed out changed nothing). `onPass`\n   * hears every pass's numbers. Answers the last pass, or the refusal that stopped it (what the\n   * passes before it brought back stays back; the next call carries on from there).\n   */\n  tableRestoreWhole(args: {\n    table_id: Uuid;\n    onPass?: (progress: TableRestoreProgress) => void;\n  }): Promise<RecordsResult<TableRestoreProgress>>;\n\n  /**\n   * DUPLICATE A TABLE — `custom.table_duplicate` (lane TABLE-ACTIONS).\n   *\n   * Makes a NEW Table from one the caller may open: its settings and look, every live column (new\n   * ids), every choice list as a new list (same words, colors, keys and order), every saved view\n   * (filters, sorts, layouts, every id inside them pointing at the copy), and with `withRecords`\n   * every live record (a link to another row of the same table follows to the copy's row; a link\n   * to another table stays). `name` defaults to \"<name> (copy)\", \"(copy 2)\", …;\n   * `organizationId` defaults to the source's organization and must be one the caller belongs to.\n   * The source is never written. The copy is made in passes of a few seconds (any size; the\n   * store answers \"copying\" until \"done\"), and this call loops them. Refused before anything is\n   * made, the refusal carries the store's one sentence (not given / archived / not a member there\n   * / a column linking across organizations).\n   */\n  tableDuplicate(args: {\n    tableId: Uuid;\n    withRecords?: boolean;\n    name?: string | null;\n    organizationId?: Uuid | null;\n    /** Called after every pass with what is copied so far (a progress bar is made of it). */\n    onProgress?: (progress: TableDuplicateProgress) => void;\n  }): Promise<RecordsResult<TableDuplicated>>;\n  /**\n   * FINISH A BASE COPY — `custom.base_copy_finish` (lane AT-BASE). After every table of a base was copied by `tableDuplicate`,\n   * points the copies at each other: `pairs` is {source table id: its copy's id}. Re-points each link column's target and each\n   * link cell whose row was copied too; links to a table outside the base stay. Only tables this person copied are touched.\n   */\n  baseCopyFinish(args: { organizationId: Uuid; pairs: Record<Uuid, Uuid> }): Promise<RecordsResult<{ relinked_columns: number; relinked_cells: number }>>;\n  /**\n   * CARRY A COPY'S EXTRAS — `custom.copy_table_extras` (lane COPY-EXTRAS). `pairs` is {source table id: its copy's id}. Every automation of a\n   * source is declared on its copy SWITCHED OFF and every page too, each column and view id pointed at the copy's own. The step's own\n   * refusals (one sentence each) come back in `extras_refused`; the base-move job in aidream calls the same function.\n   */\n  copyTableExtras(args: { organizationId: Uuid; pairs: Record<Uuid, Uuid> }): Promise<RecordsResult<{ automations: number; pages: number; extras_refused: string[] }>>;\n  /**\n   * CARRY ON A COPY — `custom.table_duplicate_continue` (lane TABLE-ACTIONS). The copy is made in\n   * passes of a few seconds each; `tableDuplicate` loops them, and this resumes one that a closed\n   * tab or a lost connection left unfinished (the copy is kept out of every table list until it\n   * is done). Only the person who started it; it answers the finished copy, or refuses.\n   */\n  tableDuplicateContinue(args: {\n    copyId: Uuid;\n    onProgress?: (progress: TableDuplicateProgress) => void;\n  }): Promise<RecordsResult<TableDuplicated>>;\n  /**\n   * THE CALLER'S UNFINISHED COPIES — `custom.table_copies_in_progress` (lane TABLE-ACTIONS). Each\n   * is still being made (carry it on with `tableDuplicateContinue`) or stopped because its source\n   * was archived meanwhile (discard it: `tableArchive` on the copy). Nobody else can see them.\n   */\n  tableCopiesInProgress(): Promise<RecordsResult<TableCopyInProgress[]>>;\n\n  // ── reads ────────────────────────────────────────────────────────────────\n  recordRead(args: {\n    record_id: Uuid;\n    withComputed?: boolean;\n    /** Also answer `version` (read in the same round, so the read takes as long as the slower of the two). */\n    withVersion?: boolean;\n    organization_id?: Uuid | null;\n  }): Promise<RecordsResult<RecordRead>>;\n  /**\n   * DOOR-1. A page of one Table's records THROUGH `custom.read_records`: the\n   * store decides which rows this reader may see and which fields of them, and\n   * a field it masked comes back present-and-null with its reason in `hidden`.\n   * `total` is null because the door counts nothing it has not read — a count\n   * of rows a person may not see is a leak with a number on it.\n   */\n  list(args: {\n    table_id: Uuid;\n    /**\n     * THE STORE'S ONE FILTER SHAPE (`RecordFilter`). Left out, this is the\n     * whole page. Supplied, the store narrows INSIDE its own query — never the\n     * browser, which can only ever filter the rows it was already allowed to\n     * see and would silently drop the rest of the answer.\n     *\n     * It is the same object a saved view stores as `filters` and the same one\n     * `recordAggregate` counts with, so the rows a drill-through opens are the\n     * rows the number on the dashboard counted.\n     */\n    filter?: StoreFilter;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<{ rows: ReadRow[]; total: number | null; locked?: number }>>;\n  /**\n   * DOOR-SPEED. ONE PAGE THE STORE SORTED, SEARCHED, FILTERED AND COUNTED, through\n   * `custom.read_records_page` — the same wall, ladder, field mask and filter as `list`, with the\n   * order (`sort`, or a hand-ordered view's positions via `view_id`), a text `search` over the\n   * columns this reader may see (and the words of choice options), and the `total` of the\n   * matching visible set. It is what a grid pages with: nothing reads the whole table to draw one\n   * page. A sort on a column this reader cannot see (gone, or masked) is SKIPPED and named in\n   * `sort_ignored` — the page still loads; one worked out on every read is refused by name.\n   */\n  listPage(args: {\n    table_id: Uuid;\n    filter?: StoreFilter;\n    search?: string | null;\n    sort?: readonly RecordPageSort[];\n    view_id?: Uuid | null;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<RecordPage>>;\n  /**\n   * AP3-KEYSET-DOOR. THE SAME PAGE AS `listPage`, PAGED BY A CURSOR, through\n   * `custom.read_records_keyset`: the same wall, ladder, field mask, filter, search and sort (no\n   * hand-ordered view), the same rows in the same order — but the next page starts after the last\n   * row's sort values and id, so a write landing mid-read never skips or repeats a row. Pass back\n   * `cursor` as `after` (it is opaque; `null` on the last page). A cursor handed to a different\n   * sort, filter or search is refused by name (\"start from the first page\"), never reinterpreted.\n   *\n   * Every row carries the `version` and `organization_id` it was read at, in the same statement as\n   * its values. With `ids`, it re-reads exactly those rows among the ones the reader may see (in the\n   * page's order; `after` ignored, `cursor` and `total` null) — get-by-id, the re-read after a write,\n   * and the changed ids of a realtime notice.\n   */\n  listKeyset(args: {\n    table_id: Uuid;\n    filter?: StoreFilter;\n    search?: string | null;\n    sort?: readonly RecordPageSort[];\n    after?: string | null;\n    ids?: readonly Uuid[];\n    limit?: number;\n  }): Promise<RecordsResult<RecordKeysetPage>>;\n  /**\n   * DOOR-1 FOR AN ID SET. Exactly these records of this Table, through\n   * `custom.read_records_by_ids` — the same ladder, the same level, the same\n   * field masking and the same page ceiling as `list`, addressed by id instead\n   * of by page. An id the reader may not see simply does not come back, which\n   * is the same answer `list` gives by omission.\n   *\n   * It exists because a realtime notice has always named the exact ids that\n   * moved and no door could take them: three cells changing re-read a fifty-row\n   * page in every watching browser.\n   */\n  listByIds(args: { table_id: Uuid; ids: readonly Uuid[] }): Promise<RecordsResult<ReadRow[]>>;\n  /**\n   * DOOR-1 FOR THE ROWS THAT LEFT: a page of one Table's ARCHIVED records,\n   * through `custom.read_records_archived` — the same ladder, the same level,\n   * the same field masking and the same page ceiling as `list`, with the sign\n   * of the `deleted_at` test flipped, plus who archived each one and when.\n   *\n   * 🚨 IT EXISTS BECAUSE ARCHIVING WAS A ONE-WAY DOOR (VERIFIER-10 F4). The\n   * store has always had `record_restore`, and it has always done exactly the\n   * right thing; what it did not have was any door that could LIST the records\n   * it would act on, because every read door answers live rows only. So an\n   * archived record was unreachable from every screen in the platform.\n   *\n   * `lane` is the archived-items law's two lanes — \"mine\" (what I archived) and\n   * \"org\" (what anybody in this organization archived), which is the default.\n   */\n  listArchived(args: {\n    table_id: Uuid;\n    lane?: ArchiveLane;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<{ rows: ArchivedRow[]; total: number | null }>>;\n  query(query: RecordQuery): Promise<RecordsResult<{ rows: ReadRow[]; total: number | null }>>;\n  /**\n   * Every Table the person can see across ALL their organizations\n   * (`config.organizationIds`); `organization_id` is the page's optional filter\n   * (absent = all). Each Table carries its own `organization_id`.\n   */\n  tableList(args?: { organization_id?: Uuid | null }): Promise<RecordsResult<Table[]>>;\n  /**\n   * ONE Table's declaration by id — `null` when this reader may not see it or it is not a Table.\n   * The same kernel record `tableList` lists, read through `read_records_by_ids` for exactly\n   * that id, so a screen that opens one table never lists every table to find it (a list capped\n   * at 500 answered \"no table\" past the 500th).\n   */\n  tableRead(args: { table_id: Uuid; organization_id?: Uuid | null }): Promise<RecordsResult<Table | null>>;\n  /**\n   * ONE Table of THIS organization found by its slug — or, with no slug, by its name — in ONE\n   * request (`custom.table_find`). `null` when there is none or this reader may not see it: the\n   * store reads the candidates through the same read door `tableRead` uses, so a table she may\n   * not see answers exactly like one nobody made. Where several share a slug, the oldest she may\n   * see answers, every time (the same pick `ensureTable` makes). Never list every table to find one.\n   *\n   * `keptFor` (an app's table): the slug AND what the table is kept for must match — a person's own\n   * table of the same slug is a different table and never answers. With `keptFor` and no live\n   * match, an ARCHIVED match is answered as `{ id, organization_id, archived_at }` (no document), so\n   * a caller says \"archived — restore it\", never \"missing\".\n   */\n  tableFind(\n    args: ({ slug: string; name?: never } | { name: string; slug?: never }) & { keptFor?: string },\n  ): Promise<RecordsResult<Table | null>>;\n  /**\n   * `tableFind` BY SLUG FOR MANY ORGANIZATIONS IN ONE REQUEST (`custom.table_find_many`). Each\n   * organization meets the same walls `tableFind` does and is answered through `custom.table_find`\n   * itself. `tables` holds one live Table per organization that has one this reader may see (an\n   * organization with none is absent); `refused` holds each organization the store refused, with\n   * its own refusal, and never stops the others. Never loop `tableFind` over organizations.\n   */\n  tableFindMany(args: {\n    organizationIds: Uuid[];\n    slug: string;\n    keptFor?: string;\n  }): Promise<RecordsResult<{ tables: Table[]; refused: Array<{ organization_id: Uuid; error: RecordsError }> }>>;\n  /**\n   * IS THIS TABLE IN THE ARCHIVE? (lane HUB-FIX, 2026-09-23.) The archived row for one\n   * Table of this organization, or `null` when the archive does not hold it — which\n   * is an ANSWER, never \"it may have been deleted\". A table page that cannot find a\n   * Table asks this before saying anything: an archived Table's own address used to\n   * read \"…or it may have been deleted\" when it was archived and one click from back.\n   */\n  tableArchived(args: { table_id: Uuid }): Promise<RecordsResult<ArchivedRow | null>>;\n  /**\n   * WHO CAN SEE EACH TABLE, AND WHETHER THE CALLER MADE IT — `custom.table_facts`\n   * (lane HUB-FIX). `visibility` and `created_by` are record COLUMNS the Table document\n   * never carried, so a screen that sorts Tables into lanes asks this and folds the\n   * answer onto `tableList()`'s Tables with `withTableFacts`.\n   *\n   * 🚨 IT IS ITS OWN CALL, NOT PART OF `tableList()` (0.57.3). 0.57.2 folded it into\n   * every table list, so every screen that merely LISTS tables (the field editor's\n   * relation target, the import wizard, settings) paid a second round trip it never\n   * used — and every test double that answers a table list had to answer it too\n   * (records-ui 0.84.5's gate: 47 tests in 15 files red). Only the lane-sorting\n   * screens ask.\n   *\n   * The door-presence pattern: when the store's catalog does not carry the door the\n   * answer is `null` — nothing asked, nothing invented.\n   */\n  tableFacts(args?: { organization_id?: Uuid | null }): Promise<RecordsResult<TableFact[] | null>>;\n  /**\n   * WHICH STORE CURRENTLY WRITES each table — `custom.where_tables_live`.\n   *\n   * This is a batch cutover decision, not a Table's home address: during COPY\n   * mode an older table and its record-store copy share an id, and only this\n   * door knows which one the organization is still using. It is intentionally\n   * unbound from this client's organization because the door derives the answer\n   * from each supplied table and the caller's authority.\n   */\n  tablesLiveWhere(args: { table_ids: Uuid[] }): Promise<RecordsResult<TableLiveLocation[]>>;\n  /**\n   * WHICH ORGANIZATION A TABLE LIVES IN, BY NAME, AND WHERE IT MAY GO — `custom.table_home`\n   * (SC-1' / SC-1-TAILS). Read FROM THE TABLE, never from the organization the client is bound\n   * to, so it answers for a table shared from outside too. `null` = not given to this person,\n   * or not there (the store says the same for both, on purpose). A store without the door\n   * refuses `door_absent` — never a guessed organization.\n   */\n  tableHome(args: { table_id: Uuid }): Promise<RecordsResult<TableHome | null>>;\n  /**\n   * MOVE A TABLE into another organization the caller belongs to — `custom.table_move`. It\n   * carries every Table inside it or its rows and writes the change events; refused, NOTHING\n   * moved and the refusal carries the store's one sentence. `expected_version` is the Table's\n   * version the caller decided on (a concurrent change refuses with \"look again\").\n   */\n  tableMove(args: { table_id: Uuid; to_organization_id: Uuid; expected_version?: number | null }): Promise<RecordsResult<TableMoved>>;\n  /**\n   * MOVE A WHOLE BASE into another workspace (organization) the caller belongs to — `custom.base_move` (AT-NOTIFY-MOVE).\n   * Admin on the base's Home. Every table of the Home goes through the one table door (with its pages and automations), the\n   * Home and its base row follow, and the tables stay under that Home over there. All or nothing: a refusal moved nothing and\n   * carries the store's sentence (which table it stopped at, or that the caller is not in that workspace).\n   */\n  baseMove(args: { home_id: Uuid; to_organization_id: Uuid }): Promise<RecordsResult<BaseMoved>>;\n  /**\n   * The Fields that apply. NOTION-PROPS: a two-way link's reverse Field (`isReverseField`) is left out\n   * unless `withReverse` — every screen draws it as the table's reverse column (`reverseColumns`, with\n   * `read_only: false`), which reads and writes its links; listed as a Field too it would draw twice.\n   */\n  fields(args: { table_id: Uuid; recordType?: string; withReverse?: boolean }): Promise<RecordsResult<Field[]>>;\n  /**\n   * FLD-5 / FLD-6: a list field stores the id of an option RECORD, because\n   * every pick-list is already a Table. These are that Table's records — the\n   * store resolves which Table from the Field's own config, so no caller has to\n   * know it.\n   */\n  fieldOptions(args: { field_id: Uuid }): Promise<RecordsResult<StoredRecord[]>>;\n  /**\n   * How many records hold each choice of one choice column, keyed by the option's id\n   * (`custom.field_choice_usage`; counts only records the caller may see). What a column editor\n   * says before a choice that records still hold is removed: \"3 records use “X-ray”.\"\n   */\n  fieldChoiceUsage(args: { field_id: Uuid }): Promise<RecordsResult<Record<string, ChoiceUsage>>>;\n  /**\n   * A column's choices saved AND the records of each removed choice moved to another choice,\n   * kept as other values, or cleared — ONE transaction (`custom.field_update_rehoming_choices`).\n   * `rehome` is keyed by the removed option's id. The answer carries `undo`; sending\n   * `{ patch: { options: undo.options }, cells_back: undo.cells_back }` back through this same\n   * call puts the list and every cell back, again in one transaction.\n   */\n  fieldUpdateRehomingChoices(args: {\n    field_id: Uuid;\n    patch: FieldPatch;\n    rehome?: Record<string, ChoiceRehome> | undefined;\n    cells_back?: readonly ChoiceCellBack[] | undefined;\n  }): Promise<RecordsResult<ChoicesRehomed>>;\n  tableCapacity(args: { table_id: Uuid }): Promise<RecordsResult<TableCapacity>>;\n\n  // ── declaring a Table, and the kernels a Table needs to exist ────────────\n  /**\n   * REC-1: a Table has to live somewhere, so a Home comes first — and a Home is\n   * an ordinary record in the person kernel. `homeId` is therefore required and\n   * `personKernelId()` is how a caller gets a Table to write one into.\n   */\n  tableDeclare(args: { spec: Record<string, unknown>; homeId: Uuid }): Promise<RecordsResult<Uuid>>;\n  /**\n   * FIND THIS TABLE BY ITS SLUG, OR MAKE IT — ONE call, ONE transaction (`custom.table_ensure`).\n   * The store holds a lock on (organization, slug) across the find and the make, so two tabs\n   * saving their first record at once get the SAME table; a second call adds any column the spec\n   * names that the table lacks and never retypes or drops one. `spec.fields` are full\n   * `custom.field_declare` specs. Prefer `ensureTable(client, NewTableSpec)`, which builds them.\n   *\n   * `drift` names every column the table already has whose stored shape differs from the spec\n   * (type, format, label, multi, required, unique) — reported, never applied. `[]` when nothing\n   * differs; `null` only from a store too old to compare (see `FieldDrift`).\n   */\n  tableEnsure(args: { spec: Record<string, unknown> }): Promise<\n    RecordsResult<{ table_id: Uuid; home_id: Uuid | null; created: boolean; drift: FieldDrift[] | null }>\n  >;\n  /**\n   * ADD A FIELD TO A TABLE. One call, and the store does the three things no\n   * client can do for itself: it turns a parity type into the behavior,\n   * modifiers, format, unit, relation target and Rules its own guards demand;\n   * it tells the TABLE about the field (REC-1 / FLD-8 — a definition for a\n   * field the table never declared is refused, which is the sentence every\n   * \"Add field\" used to end on); and it stores the definition as a FIELD\n   * rather than as a plain record, so the delete rules and the\n   * formula-dependency check can see it.\n   *\n   * A choice list carries its `options` as words. The store keeps them the only\n   * way FLD-5 / FLD-6 allows — as the records of a Table it declares for them —\n   * so nobody is made to build a table before they can have a dropdown.\n   */\n  fieldDeclare(args: { table_id: Uuid; spec: NewFieldDeclaration }): Promise<RecordsResult<Uuid>>;\n  /** Several columns of one Table in ONE call and one transaction (`custom.field_declare_many`): all or none. */\n  fieldDeclareMany(args: { table_id: Uuid; specs: NewFieldDeclaration[] }): Promise<RecordsResult<Uuid[]>>;\n  /**\n   * A NEW TABLE IN ONE CALL (`custom.table_create`): its Home, the Table under it and its columns, in\n   * one transaction, so a refusal anywhere leaves nothing behind. Prefer `declareTable(client, spec)`.\n   */\n  tableCreate(args: { spec: Record<string, unknown>; fields: NewFieldDeclaration[] }): Promise<\n    RecordsResult<{ table_id: Uuid; home_id: Uuid; field_ids: Uuid[] }>\n  >;\n  /** One field's own settings. What it HOLDS is a conversion and is refused here by name. */\n  fieldUpdate(args: { field_id: Uuid; patch: FieldPatch }): Promise<RecordsResult<Uuid>>;\n  /**\n   * WHAT A CHANGE OF KIND WILL DO, before it is made (`custom.field_retype_preview`): the store runs the\n   * same `field_update` patch inside a subtransaction, counts what converts, what is kept aside and the\n   * choices it makes, and rolls every row back. Nothing is written.\n   */\n  fieldRetypePreview(args: { field_id: Uuid; patch: FieldPatch }): Promise<RecordsResult<FieldRetypePreview>>;\n  /**\n   * CHANGE WHAT A COLUMN HOLDS, through `custom.migrate_retype` (FLD-4 / T12). `to` is the store's\n   * behavior word — `text`, `range` (numbers and dates), `boolean`, `list`, `relation`. Every value\n   * that converts is converted; every value that does not is kept in that record's `_retired`\n   * with the reason, never coerced and never deleted. The answer counts both.\n   */\n  migrateRetype(args: { field_id: Uuid; to: string; note?: string }): Promise<RecordsResult<FieldRetyped>>;\n  /**\n   * MERGE ONE RECORD INTO ANOTHER, through `custom.migrate_merge` (T5 / REC-21). The loser's values\n   * the winner did not hold move across, the ones that differ are kept as ranked alternates, every\n   * link to the loser now points at the winner, and the loser is archived with its id resolving to\n   * the winner. Editor on BOTH records is decided first. The answer's `migration_id` is what\n   * `migrateUndo` takes.\n   */\n  migrateMerge(args: { winner_id: Uuid; loser_id: Uuid; note?: string | null }): Promise<RecordsResult<RecordsMerged>>;\n  /** Put a recorded Migration back (`custom.migrate_undo`): a retype or a merge, by its id. */\n  migrateUndo(args: { migration_id: Uuid }): Promise<RecordsResult<MigrationUndone>>;\n  /**\n   * SPLIT ONE RECORD IN TWO, through `custom.migrate_split` (Rule 11 / REC-22). The named values\n   * MOVE to a new record of the same Table; the original keeps its id, so every link to it still\n   * resolves. Editor on the record is decided first. `migrateUndo(migration_id)` puts it back.\n   */\n  migrateSplit(args: { record_id: Uuid; moved_keys: string[]; note?: string | null }): Promise<RecordsResult<RecordSplit>>;\n  /**\n   * EXTRACT A PARENT, through `custom.migrate_extract_parent` (Rule 11 / test 5). The named values\n   * are COPIED up into a new record of `parent_table_id`, and this record is put under it. Its old\n   * parent, if any, becomes the new parent's parent. `migrateUndo(migration_id)` puts it back.\n   */\n  migrateExtractParent(args: { record_id: Uuid; parent_table_id: Uuid; moved_keys: string[]; note?: string | null }): Promise<RecordsResult<ParentExtracted>>;\n  /**\n   * MOVE A RECORD TO ANOTHER TABLE, through `custom.migrate_retype`'s record arm (test 9 / REC-N-18). The\n   * record keeps its id — every link to it still resolves — and its values whose column `to_table_id` lacks\n   * are taken off and kept in History with the reason (`misfits`). Full (admin) on the record is decided\n   * first; the table must be in the same organization. `migrateUndo(migration_id)` puts it back whole.\n   */\n  migrateMoveRecord(args: { record_id: Uuid; to_table_id: Uuid; note?: string | null }): Promise<RecordsResult<RecordMoved>>;\n  /** The Migration log for one record or Table (`custom.migrations`), newest first. */\n  migrations(args: { target_id?: Uuid | null; limit?: number }): Promise<RecordsResult<MigrationEntry[]>>;\n  /**\n   * HOW LONG HISTORY IS KEPT (Rule 10 / test 14), through `custom.history_retention`. `floor_days` is the\n   * organization's floor (knob `extensibility.user_tables.history_retention_floor_days`: 30 by default, an\n   * organization may raise it, never lower it); `table_days` is the table's own, never below the floor.\n   */\n  historyRetention(args?: { table_id?: Uuid | null }): Promise<RecordsResult<HistoryRetention>>;\n  /** Set a table's value-history retention (`custom.history_retention_set`); below the floor is refused in the store's words. */\n  historyRetentionSet(args: { table_id: Uuid; days: number }): Promise<RecordsResult<number>>;\n  /** Raise this organization's retention floor (`custom.history_retention_floor_raise`); a lower number is refused. */\n  historyRetentionFloorRaise(args: { days: number }): Promise<RecordsResult<number>>;\n  /**\n   * ONE RECORD ON EITHER CLOCK, through `custom.query_record_as_of` (Rule 10 / test 6).\n   * `recorded_at` answers what the store SAID at that moment; `world_on` answers what was TRUE of\n   * the world on that date, read from `dated` values. Both may be given. `null` data means the\n   * record is not visible to this person (or did not exist then) — an absence, not an empty record.\n   */\n  recordAsOf(args: { record_id: Uuid; recorded_at?: string | null; world_on?: string | null }): Promise<RecordsResult<Record<string, unknown> | null>>;\n  /**\n   * REL-DISP. THE WORDS ONE RELATION CELL SHOWS, resolved by the store through\n   * that column's own display spec — one column or several, joined by its\n   * separator. Never resolve a relation label any other way: the store's\n   * `custom._words_for` is the one body that decides what a record is called, it\n   * asks the read-access ladder BEFORE it reads the name, and a record this reader\n   * may not open comes back as the withheld sentence rather than its name or id.\n   * A value that is not an id is handed straight back — it is already words.\n   */\n  relationWords(args: { field_id: Uuid; value: string }): Promise<RecordsResult<string | null>>;\n  /**\n   * The same answer for a WHOLE PAGE of cells in one round trip. Prefer this\n   * wherever a grid, board, list or picker resolves more than one chip: the\n   * per-id lane is what made a page of relation cells a page of requests.\n   */\n  relationWordsMany(\n    args: RelationWordsManyArgs,\n  ): Promise<RecordsResult<Record<string, string>> & { archived?: readonly string[]; icons?: Record<string, RelationIcons> }>;\n  /**\n   * VISION-REACH G1. Which records of `table_id` each name names — its name column, case and\n   * spacing ignored, only records this reader may see. Hand the answer to `relationNameIndexOf`\n   * and pass that to the coercion as `relationNames`. Up to 5,000 names a call; more are sent in\n   * groups by this method.\n   */\n  relationNamesMatch(args: { table_id: Uuid; names: string[] }): Promise<RecordsResult<RelationNamesAnswer>>;\n  /**\n   * VIEWS-AND-FIELDS BL (REL-9). The REVERSE COLUMNS of a Table: one per relation column of another\n   * table (or this one) that links here, read-only, virtual — never a Field of this Table, so\n   * `applicableFields` does not list them. A linking table this reader may not know is left out.\n   */\n  reverseColumns(args: { table_id: Uuid }): Promise<RecordsResult<ReverseColumn[]>>;\n  /**\n   * A page of records' links through ONE reverse column, in one round trip per 200 records:\n   * `{ [record id]: { total, links: [{ id, words }] } }`, only linking records this reader may see.\n   * `limit` (1–50) and `offset` page one record's links — a record with thousands of links costs\n   * one count and one page. A record with no links answers `{ total: 0, links: [] }`.\n   */\n  reverseLinksMany(args: ReverseLinksManyArgs): Promise<RecordsResult<Record<string, ReverseLinks>>>;\n  /**\n   * The same, through SEVERAL reverse columns in ONE call (`custom.reverse_links_many_fields`):\n   * `{ [source field id]: { [record id]: { total, links } } }`. A store without the door answers\n   * `door_absent` — ask `reverseLinksMany` per column then.\n   */\n  reverseLinksFields(args: ReverseLinksFieldsArgs): Promise<RecordsResult<Record<string, Record<string, ReverseLinks>>>>;\n  /**\n   * NOTION-PROPS. A TWO-WAY LINK: makes (or returns) the reverse Field of relation `field_id` on its\n   * target table (`custom.relation_reverse_field`), so the link is a column there that edits the same\n   * links. Its key is the reverse column's key; `label` defaults to the linking table's name.\n   */\n  relationReverseField(args: { field_id: Uuid; label?: string }): Promise<RecordsResult<Uuid>>;\n  /**\n   * NOTION-PROPS. Adds and removes links from the reverse side of a two-way link\n   * (`custom.relation_reverse_set`): each id becomes a write of THAT record's forward Field.\n   * Answers how many records changed.\n   */\n  relationReverseSet(args: { record_id: Uuid; field_id: Uuid; add?: readonly Uuid[]; remove?: readonly Uuid[] }): Promise<RecordsResult<number>>;\n  /** Take a field off a table. Refuses the title field, the last field, and one another field reads through. */\n  fieldRetire(args: { field_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /**\n   * Bring a removed column back (`custom.field_restore`): the set that was retired with it, the\n   * Table's declaration of those columns, and the links they made. The values never left.\n   */\n  fieldRestore(args: { field_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /**\n   * DUPLICATE PROPERTY (Notion N5) — `custom.field_duplicate`: a new column right after this one, named\n   * \"<name> (1)\", the same kind (choices with their colors, unit, link, formula, rules, sensitivity), and\n   * every record's value copied into it in one statement. A link column copies its definition only (its\n   * values are links); a formula, lookup or roll-up works its answer out itself. Needs the table's\n   * add-a-column rung, the same as `fieldDeclare`.\n   */\n  fieldDuplicate(args: { field_id: Uuid }): Promise<RecordsResult<FieldDuplicated>>;\n  /**\n   * CHAIR-ROLLUP-HONEST. Is a column this lookup or roll-up reads archived — the link it reads\n   * through, a back-link's linking column, or the far column it totals (`custom.field_source_archived`)?\n   * `null` while every source is live. Bring it back with `fieldRestore({ field_id })`.\n   */\n  fieldSourceArchived(args: { field_id: Uuid }): Promise<RecordsResult<SourceArchived | null>>;\n  /**\n   * A TABLE AS A KIND (KINDS-GLUE wave 3, N1): `custom.table_kind_facts` verbatim — the Table's\n   * live Fields, choices and stamp, as the asking person. The door finds the Table's organization\n   * itself, so this works for a Table in any organization the person may open; anything else is\n   * refused (`42501`, the store's sentence).\n   */\n  tableKindFacts(args: { table_id: Uuid }): Promise<RecordsResult<TableKindFacts>>;\n  /**\n   * A TABLE'S ACCESS LEVEL (CONFIDENTIAL-BY-ORG-ADMIN): `custom.table_level_facts` verbatim - its level,\n   * readers, who approves a change (`set_by`) and whether THIS person may (`can_set`). Draw the control only\n   * when `can_set` is true; anyone who may know the table may ask.\n   */\n  tableLevelFacts(args: { table_id: Uuid }): Promise<RecordsResult<TableLevelFacts>>;\n  /**\n   * MAKE A CUSTOM TABLE CONFIDENTIAL, or change whom it names (`custom.set_table_confidential`). Succeeds\n   * only for an owner/admin of the table's own organization on an ordinary custom table; the approver, seat,\n   * reason and date are recorded. `readers` is the list of `{field, level}` rules (a person field of the\n   * table); `reason` is required.\n   */\n  setTableConfidential(args: { table_id: Uuid; readers: TableReaderRule[]; reason: string }): Promise<RecordsResult<TableLevelSet>>;\n  /** THE WAY BACK: the same caller rule, the table is Organization again (`custom.set_table_organization`). */\n  setTableOrganization(args: { table_id: Uuid; reason: string }): Promise<RecordsResult<TableLevelSet>>;\n  /**\n   * THE COLUMNS THIS TABLE HAD AND NO LONGER HAS (grids review 3): its retired Field records,\n   * newest first, through the same archived door the Table archive uses — addressed at the Field\n   * kernel (every Field is a record in it) and paged until the door answers short.\n   */\n  fieldsRetired(args: { table_id: Uuid }): Promise<RecordsResult<ArchivedRow[]>>;\n  // ── CUSTOM FIELDS ON A STANDARD BUSINESS TABLE (REC-34 / REC-40 / FLD-8) ──\n  // Named by the registry TOKEN, because a standard table has no Table record.\n  // One set for all 643 tables the registry types Entity or Detail, and no\n  // per-table code anywhere in this package or in any screen that uses it.\n  /** What the registry says about a token, and whether it can hold a value at all. */\n  entityTable(args: { token: string }): Promise<RecordsResult<EntityTableFacts>>;\n  /**\n   * The fields THIS organization added to that standard table. `include_retired: true` also answers the\n   * ones taken away (`entityFieldRetire`), live first, each with `archived_at` set — the archived view a\n   * screen offers, with `fieldRestore({ field_id })` to bring one back. Live fields carry `archived_at: null`.\n   */\n  entityFields(args: { token: string; include_retired?: boolean }): Promise<RecordsResult<Field[]>>;\n  /** The fields EVERY named organization added to that standard table, with their choices, in one read. */\n  entityFieldsAcross(args: { token: string; organization_ids: Uuid[] }): Promise<RecordsResult<EntityFieldsAcross>>;\n  /** Add a column to a standard table. An organization admin's right - it changes the table for everybody. */\n  entityFieldDeclare(args: { token: string; spec: NewEntityFieldDeclaration }): Promise<RecordsResult<Uuid>>;\n  /** One field's own settings. A TYPE change is refused here by name, as it is on a custom table. */\n  entityFieldUpdate(args: { field_id: Uuid; patch: Record<string, unknown> }): Promise<RecordsResult<Uuid>>;\n  /** Take a custom field off a standard table. The values already written stay in each row. */\n  entityFieldRetire(args: { field_id: Uuid }): Promise<RecordsResult<Uuid>>;\n  /** May this person add a column here - and if not, the store's own sentence saying why. */\n  entityFieldRights(args: { token: string }): Promise<RecordsResult<EntityFieldRights>>;\n  /** REC-53 in one answer: the row's real columns AND its custom values AND the definitions. */\n  entityRecordRead(args: { token: string; record_id: Uuid }): Promise<RecordsResult<EntityRecordRead>>;\n  /**\n   * AP-4: the custom rows that link to one platform record, by which field and in which table.\n   * Keyed by the ROW's organization (`organization_id`), never the client's active one. Paged:\n   * pass the previous answer's `next_cursor` as `cursor`.\n   */\n  entityBackLinks(args: {\n    token: string;\n    record_id: Uuid;\n    organization_id: Uuid;\n    limit?: number;\n    cursor?: string | null;\n  }): Promise<RecordsResult<EntityBackLinks>>;\n  /**\n   * THE one write door for a standard row (`custom.entity_row_write`, as the person): custom values\n   * as a patch (a key left out is left alone, a key set to null is cleared with its envelope),\n   * archive / restore, and real columns only where the store lists them. The row's own organization\n   * governs; `expected_version` refuses a stale write; a change that changes nothing writes nothing.\n   */\n  entityRowWrite(args: {\n    token: string;\n    /**\n     * null ADDS a row (chairblk3_a): only for a token whose API facts say `create_via: \"insert\"`\n     * (`drill_describe(...).api.create_via` — task and project), as one insert AS THE PERSON in\n     * `organization_id` (default: this client's organization); the answer carries `created: true`\n     * and the new `id`. Every other token refuses in its own words.\n     */\n    record_id: Uuid | null;\n    /** A change by id: only to say which organization the row must belong to. A new row: where it goes. */\n    organization_id?: Uuid | null;\n    custom?: Record<string, unknown>;\n    columns?: Record<string, unknown>;\n    expected_version?: number | null;\n    archive?: boolean | null;\n  }): Promise<RecordsResult<EntityRowWritten>>;\n  /** Rows of that standard table with this custom value. Refuses a field nobody declared. */\n  entityRecordsFind(args: {\n    token: string;\n    key: string;\n    value?: unknown;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<EntityRecordsFound>>;\n\n  /** The kernel Tables a caller writes a Home, a Field or a Rule into. */\n  personKernelId(): Promise<RecordsResult<Uuid>>;\n  fieldKernelId(): Promise<RecordsResult<Uuid>>;\n  ruleKernelId(): Promise<RecordsResult<Uuid>>;\n\n  // ── Rules: the STORE decides membership, never a screen ──────────────────\n  /** Every record the Rule says is a member. A saved view's list is this, not a filter a screen ran. */\n  /** PRODUCTS row 7 — the whole board: its stage column, its stages in the declared\n   *  order, and every Rule WITH the sentence it says when it refuses. */\n  pipelineRead(args: { table_id: Uuid }): Promise<RecordsResult<Pipeline>>;\n  /** The store's own count and total per column, over what this person may see. */\n  pipelineBoard(args: {\n    table_id: Uuid;\n    measure?: string | null;\n    /**\n     * S2-PRIME — the view's question, either shape (`StoreFilter`). Given, the headings count and\n     * total exactly the cards the same filter puts on the board (`custom.pipeline_board`'s\n     * four-argument door); left out, the whole table this person may see, as before.\n     */\n    filter?: StoreFilter | null;\n  }): Promise<RecordsResult<PipelineColumn[]>>;\n  /** Whether this card may go to that column — asked BEFORE the finger lets go. */\n  pipelineTransitionRefusal(args: {\n    record_id: Uuid;\n    to: string;\n  }): Promise<RecordsResult<PipelineVerdict>>;\n  /**\n   * Move a record to a stage. An ORDINARY record write, judged by the same Rules.\n   *\n   * It answers an OBJECT on every path. A gate whose `on_fail` is `require_approval`\n   * comes back `applied: false` with the wait it filed — the record has NOT moved, and a\n   * screen that treated the call's success as the move's success would show the card in\n   * the wrong column while somebody is still deciding.\n   */\n  pipelineMove(args: {\n    record_id: Uuid;\n    to: string;\n    also?: Record<string, unknown>;\n    expected_version?: number | null;\n  }): Promise<RecordsResult<PipelineMoveResult>>;\n  /**\n   * MOVE MANY CARDS IN ONE CALL (lane S4, `custom.pipeline_move_many`). Each card is judged by\n   * `pipeline_move` exactly as one is, in its own savepoint: a refused card writes nothing and the\n   * others still land. `expected_version` is required per card — a card that changed since the\n   * board loaded answers `changed_since_loaded` and is never overwritten. A refusal of the WHOLE\n   * call (a stranger, an empty batch, more than the `custom/batch_items_max` knob) is the error.\n   */\n  pipelineMoveMany(args: { moves: PipelineMoveManyItem[] }): Promise<RecordsResult<PipelineMoveMany>>;\n  /** Declare (or re-state) a pipeline: the stage column and its transition Rules. */\n  pipelineDeclare(args: {\n    table_id: Uuid;\n    spec: PipelineSpec;\n  }): Promise<RecordsResult<PipelineDeclared>>;\n  /** Which column of this table holds its stage, or null when it is not a board. */\n  tableStageField(args: { table_id: Uuid }): Promise<RecordsResult<string | null>>;\n  /** The closed list of what a gate does when it says no — the store is the authority. */\n  stageRuleOnFailKinds(): Promise<RecordsResult<{ behaviour: StageRuleOnFail; note: string }[]>>;\n  /** Whether this organization's gates refuse or warn. One opinion, asked once. */\n  stageRuleEnforcement(): Promise<RecordsResult<StageRuleEnforcement>>;\n  /** What is waiting on this card: approvals filed against its own stage column. */\n  recordStagePending(args: { record_id: Uuid }): Promise<RecordsResult<StagePending[]>>;\n  /** The same question for a whole board, in ONE call — what a Kanban badges cards from. */\n  pipelinePending(args: { table_id: Uuid }): Promise<RecordsResult<StagePendingOnBoard[]>>;\n  /**\n   * WHAT THIS GATE WOULD DO TO THIS BOARD TODAY — for a gate that has not been saved.\n   *\n   * The settings screen calls it on every edit of the condition, which is why it takes\n   * the gate rather than a rule id: no saved-rule door can answer about a rule that does\n   * not exist yet. The store compiles it with the same compiler `pipelineDeclare` uses,\n   * so the number here and the refusal at the door are the same rule — a preview with its\n   * own compiler would be wrong exactly at the edge of the condition, which is the only\n   * place anybody looks.\n   *\n   * A gate that does not say what it demands is REFUSED, not answered zero: \"no cards\n   * would be stopped\" beside a half-written rule is the sentence that gets it saved.\n   */\n  pipelineGatePreview(args: {\n    table_id: Uuid;\n    stage: string;\n    gate: PipelineGate | Record<string, unknown>;\n  }): Promise<RecordsResult<PipelineGatePreview>>;\n  /**\n   * SERVER LANE ONLY. `custom.rule_members` walks the whole scope table through the evaluator and\n   * returns STORED rows — no read-access ladder, no masking — so no browser role holds EXECUTE on it\n   * and it answers 42501 from a signed-in seat. A screen reads a Rule's members through\n   * `ruleMembersVisible`.\n   */\n  ruleMembers(args: { rule_id: Uuid }): Promise<RecordsResult<StoredRecord[]>>;\n  /**\n   * S2-PRIME — THE MEMBERS OF A MEMBERSHIP RULE THIS PERSON MAY SEE, a page at a time\n   * (`custom.rule_members_visible`): the list door asked the Rule's own test, so the rows are the\n   * read door's — the same ladder, masked documents, the same page ceiling.\n   */\n  ruleMembersVisible(args: { rule_id: Uuid; limit?: number; offset?: number }): Promise<RecordsResult<ReadRow[]>>;\n  /** Is this one record a member, and WHY — the store's own answer. */\n  ruleMembership(args: { rule_id: Uuid; record_id: Uuid }): Promise<RecordsResult<unknown>>;\n  /** Run a stored Rule against a document. */\n  ruleRun(args: { rule_id: Uuid; values: Record<string, unknown>; context?: Record<string, unknown> }): Promise<RecordsResult<unknown>>;\n  /** Evaluate a Rule expression that has not been stored — the conditional logic a form runner asks about. */\n  ruleEval(args: { expr: unknown; values: Record<string, unknown>; context?: Record<string, unknown> }): Promise<RecordsResult<unknown>>;\n  /**\n   * Write ONE Rule as a real Rule. `recordWrite` into the Rule kernel makes a\n   * valid Rule document that carries `data_class = 'record'`, and every reader\n   * that looks for a Rule looks for the class — `custom.agg_subscriptions`\n   * selects `where data_class = 'rule'` — so a subscription written that way\n   * fires at nobody. This is the door that closes it.\n   */\n  // ── Forms: a form is a VIEW ON A REAL TABLE (SCR-13, PRODUCTS row 1) ──────\n  /** This organization's forms, with how many answers arrived and how many are in the table. */\n  forms(args?: { table_id?: Uuid | null }): Promise<RecordsResult<FormSummary[]>>;\n  /**\n   * THIS ORGANIZATION'S BOOKING PAGES (PRODUCTS row 14), with the numbers that make\n   * the list worth opening: how many are booked, canceled, still ahead, and how many\n   * slots somebody is holding right now. A booking page is an `anon_form`, so it is\n   * opened and closed with `anonPublish` exactly as a form is.\n   */\n  bookings(args?: { table_id?: Uuid | null }): Promise<RecordsResult<BookingSummary[]>>;\n  /**\n   * CREATE OR RE-STATE ONE BOOKING PAGE over one Table. `admin` on the Table,\n   * because a booking page decides what a stranger may write into it and which\n   * hours of the organization's week are on offer.\n   *\n   * `slot`, `status` and `booked_with` are the store's to fill in: a question\n   * naming any of the three is refused BY NAME, so a page cannot be built that\n   * lets a visitor choose their own status. It does NOT publish — `anonPublish`\n   * is the one act that opens a public surface, for a booking page exactly as\n   * for a form.\n   *\n   * Until 2026-09-21 this door had no client method, so the ONLY way to a\n   * booking page was to ask an agent for one. The agent path is the faster one,\n   * never the only one.\n   */\n  bookingDeclare(args: {\n    table_id: Uuid;\n    title: string;\n    questions: unknown[];\n    availability?: Partial<BookingAvailability> | null;\n    presentation?: Record<string, unknown> | null;\n    submission_cap?: number | null;\n    quarantine_rule_id?: Uuid | null;\n    notify_rule_id?: Uuid | null;\n    form_id?: Uuid | null;\n    slug?: string | null;\n    home_id?: Uuid | null;\n  }): Promise<RecordsResult<BookingDeclared>>;\n  /** Create or re-state one form. A question naming no Field of that Table is refused BY NAME. */\n  formDeclare(args: {\n    table_id: Uuid;\n    title: string;\n    questions: unknown[];\n    presentation?: Record<string, unknown> | null;\n    submission_cap?: number | null;\n    quarantine_rule_id?: Uuid | null;\n    notify_rule_id?: Uuid | null;\n    form_id?: Uuid | null;\n    slug?: string | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * WHICH OF A FORM'S QUESTIONS ARE ASKED, given the answers so far — for the OWNER's preview of\n   * a draft (`custom.form_preview_asks`). One row per question in order; `asked` is false only\n   * when the store's own Rule said so. Undecided and unworkable conditions are asked, the second\n   * with the store's sentence in `said`.\n   */\n  formPreviewAsks(args: {\n    table_id: Uuid;\n    questions: unknown[];\n    values: Record<string, unknown>;\n  }): Promise<RecordsResult<Array<{ field_key: string; asked: boolean; decided: boolean; said: string | null }>>>;\n  /**\n   * WHAT A FORM'S LOOK MAY BE, AND WHAT IT WOULD LOOK LIKE (`custom.form_look_options`): the\n   * organization's public pictures (the same list a portal's look offers), the colors, and the\n   * look a stranger would see for the draft `presentation` — the builder's preview draws that.\n   */\n  formLookOptions(args?: { presentation?: Record<string, unknown> | null }): Promise<RecordsResult<FormLookOptions>>;\n  /**\n   * THE ROUTE THROUGH A DRAFT FORM (`custom.form_preview_route`, lane TYPEFORM-DUP): which questions\n   * are asked given the answers so far (showIf AND logic jumps), the ending reached and the score —\n   * the store's walk, the one the stranger's page and `custom.form_submit` read too.\n   */\n  formPreviewRoute(args: {\n    table_id: Uuid;\n    questions: unknown[];\n    endings?: unknown[] | null;\n    values: Record<string, unknown>;\n  }): Promise<RecordsResult<FormRoute>>;\n  /** A form's results (`custom.form_results`): views, starts, completions, drop-off, answers. */\n  formResults(args: { form_id: Uuid }): Promise<RecordsResult<FormResults>>;\n  /** TYPEFORM-2: the organization's form knobs (`custom.form_knobs`): owner header, choice auto-advance. */\n  formKnobs(): Promise<RecordsResult<{ show_owner_header: boolean; choice_auto_advance: boolean }>>;\n  /**\n   * CD-PAGE-08: a public form's password (`custom.form_set_password`). A string of 4 to 128 characters sets it,\n   * `\"\"` clears it, `null` changes nothing; every call answers whether the form has one now.\n   */\n  formSetPassword(args: { form_id: Uuid; password: string | null }): Promise<RecordsResult<{ has_password: boolean }>>;\n\n  // ── PULLING A SPREADSHEET IN (PRODUCTS row 9) ────────────────────────────\n  // The BYTES are parsed here (`importCsv` / `importXlsx` in `core/io.ts`,\n  // because Postgres cannot unzip a workbook). EVERYTHING after the parse is\n  // the store's: the mapping, the type inference, the coercion of `$1,250.00`\n  // into money and of an email into the person it belongs to, the duplicate\n  // check, the provenance and the per-row outcome. There is no second importer\n  // in this package and there is no place for one to drift to.\n  /**\n   * What the store makes of a file's columns, before anything is written.\n   * `columns` is `[{header, samples}]` — the first page of the file is plenty.\n   */\n  importPlan(args: {\n    table_id: Uuid;\n    columns: Array<{ header: string; samples: unknown[] }>;\n  }): Promise<RecordsResult<ImportPlan>>;\n  /**\n   * Open a run. `file_hash` is the run's IDENTITY: the same bytes into the same\n   * table a second time answer the FIRST run with `already: true` and write\n   * nothing, so a re-import doubles nothing. `force` re-opens deliberately.\n   */\n  importBegin(args: {\n    table_id: Uuid;\n    format?: \"csv\" | \"xlsx\";\n    source_name?: string | null;\n    source_columns?: unknown[];\n    file_hash?: string | null;\n    policy?: ImportPolicy;\n    /** A Field key. A row whose value for it is already here is a duplicate. */\n    dedupe_key?: string | null;\n    file_bytes?: number | null;\n    force?: boolean;\n  }): Promise<RecordsResult<ImportOpened>>;\n  /**\n   * IMPORT-2. ADD THE COLUMNS THIS FILE HAS AND THIS TABLE HAS NOT — a step of\n   * its own, BEFORE the run is opened, so the screen can show \"8 columns added\"\n   * and the person can then name one of them as the file's duplicate key\n   * (`importBegin` refuses a key naming a column that does not exist yet).\n   * Answers the mapping the file should be sent with. Admin on the Table.\n   */\n  importDeclareColumns(args: {\n    table_id: Uuid;\n    rows: Array<Record<string, unknown>>;\n    /** Header -> Field key the person already mapped by hand; never declared. */\n    mapping?: Record<string, string>;\n  }): Promise<RecordsResult<ImportColumnsDeclared>>;\n  /**\n   * One BATCH of rows. The batch is PLANNED and then written as ONE statement\n   * through the batched write door, so 250 round trips became one; a batch a\n   * guard refuses falls back to one write a row, and the answer says which it\n   * was. Send `ImportOpened.rows_per_call` the first time and\n   * `ImportBatchResult.rows_per_call` — measured — every time after that.\n   */\n  importRows(args: {\n    import_id: Uuid;\n    rows: Array<Record<string, unknown>>;\n    /** Header -> Field key. A header that already spells a key needs no entry. */\n    mapping?: Record<string, string>;\n  }): Promise<RecordsResult<ImportBatchResult>>;\n  /**\n   * Close the run and decide the columns the file had and the table did not:\n   * `propose` (the ONE approvals inbox, and the only choice a non-admin has),\n   * `create` (an admin adds them outright) or `ignore`.\n   */\n  importFinish(args: {\n    import_id: Uuid;\n    unmapped?: \"propose\" | \"create\" | \"ignore\";\n  }): Promise<RecordsResult<ImportFinished>>;\n  /** The refused rows, or the ones already here, WITH the source row on each. */\n  importReport(args: {\n    import_id: Uuid;\n    state?: \"refused\" | \"duplicate\";\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<ImportReport>>;\n  /** This organization's import runs, newest first. How you find yesterday's. */\n  imports(args?: { table_id?: Uuid | null; limit?: number }): Promise<RecordsResult<ImportRun[]>>;\n  /**\n   * Forget the RECEIPT for a file so the same bytes can be imported again\n   * deliberately. Never touches the records that import wrote.\n   */\n  importForget(args: { import_id: Uuid }): Promise<RecordsResult<boolean>>;\n\n  // ── THE ADDRESS A TABLE OWNS (DOOR-19, P8) ───────────────────────────────\n  /**\n   * Give a table its own address. The answer carries `mail_route`: the one\n   * sentence saying what has to exist in DNS before anything arrives. Show it\n   * wherever the address is shown — an address that silently swallows mail is\n   * the failure this whole door is against.\n   */\n  inboundDeclare(args: { table_id: Uuid; label?: string | null }): Promise<RecordsResult<InboundDeclared>>;\n  inboundAddresses(args?: { table_id?: Uuid | null }): Promise<RecordsResult<InboundAddress[]>>;\n  inboundSet(args: { inbound_id: Uuid; enabled: boolean }): Promise<RecordsResult<{ inbound_id: Uuid; address: string; enabled: boolean; message: string }>>;\n\n  // ── Portals: the OWNER's side of the client portal (VIS-31 / PORTAL) ──────\n  /** Every portal over this organization the caller may know about, with its numbers. */\n  portals(): Promise<RecordsResult<PortalSummary[]>>;\n  /**\n   * The SAME list, archive-aware. `custom.portals` keeps its signature and hides\n   * archived portals, because the archived-items law's default is to hide;\n   * this is the one door that also answers the other lane, so a rail gets the\n   * law's one-click reveal without inventing a second control or a second door.\n   * A fourth word is refused `22023` — there is no fourth answer on any surface.\n   */\n  listPortals(args?: { archived?: PortalArchiveFilter }): Promise<RecordsResult<PortalSummary[]>>;\n  /**\n   * PUT ONE PORTAL AWAY. Nothing is deleted and there is no purge: every Table\n   * it exposes and every person invited to it is kept exactly as it is, and\n   * `portalRestore` hands it all back. `confirm_title` is the portal's own title\n   * typed back — ten portals can carry one title, so the title is not what picks\n   * this one and the door refuses `23514` when it does not match.\n   */\n  portalArchive(args: {\n    portal_id: Uuid;\n    confirm_title: string;\n    reason?: string | null;\n  }): Promise<RecordsResult<PortalArchiveAnswer>>;\n  /** The way back. Everyone invited signs in exactly as before, and it shows the same Tables. */\n  portalRestore(args: {\n    portal_id: Uuid;\n    confirm_title: string;\n  }): Promise<RecordsResult<PortalArchiveAnswer>>;\n  /**\n   * PUT ONE FORM OR BOOKING PAGE AWAY (`custom.form_archive`, admin on its table). Its address stops\n   * answering; everything it collected is kept. `formRestore` brings it back.\n   */\n  formArchive(args: { form_id: Uuid }): Promise<RecordsResult<FormArchiveAnswer>>;\n  formRestore(args: { form_id: Uuid }): Promise<RecordsResult<FormArchiveAnswer>>;\n  /** The archived forms and booking pages, newest first; `table_id` narrows to one table. */\n  formsArchived(args?: { table_id?: Uuid | null; limit?: number }): Promise<RecordsResult<ArchivedForm[]>>;\n  /**\n   * The archived checklist templates. A template is a record: `recordDelete` archives it and\n   * `recordRestore` brings it back.\n   */\n  checklistTemplatesArchived(args?: {\n    about_table_id?: Uuid | null;\n    limit?: number;\n  }): Promise<RecordsResult<ArchivedChecklistTemplate[]>>;\n  /**\n   * How a table names its records: the row-label FORMULA it keeps (`{First} & \" \" & {Last}`), the title\n   * column it falls back to, which is in force, and whether the caller may change it. Writes nothing.\n   */\n  tableRowLabel(args: { table_id: Uuid }): Promise<RecordsResult<TableRowLabel>>;\n  /**\n   * Set the table's row-label formula, or clear it (null / blank). The store parses it against the table's\n   * own columns and refuses an unknown column in a sentence, writing nothing. Answers the new state.\n   */\n  tableRowLabelSet(args: { table_id: Uuid; formula: string | null }): Promise<RecordsResult<TableRowLabel>>;\n  /** What a table's NEW rows start with (Shown to, and the web half once it lands). */\n  tableRowDefaults(args: { table_id: Uuid }): Promise<RecordsResult<TableRowDefaults>>;\n  /** Set them (the table's maker or an admin of it). A key left out is left alone; null = the default. */\n  tableRowDefaultsSet(args: { table_id: Uuid; defaults: TableRowDefaultsPatch }): Promise<RecordsResult<TableRowDefaults>>;\n  /**\n   * ONE PASS of \"apply to existing rows\": rows nobody set by hand follow the table's defaults.\n   * `done: false` → call again with `after: next_after`. `rowDefaultsApplyAll` walks every pass.\n   */\n  tableRowDefaultsApply(args: { table_id: Uuid; after?: Uuid | null }): Promise<RecordsResult<RowDefaultsApplied>>;\n  /** Every pass of `tableRowDefaultsApply`, summed; the last pass's sentence when it took one pass. */\n  rowDefaultsApplyAll(args: { table_id: Uuid; maxPasses?: number }): Promise<RecordsResult<RowDefaultsApplied>>;\n  /** One row's Shown to (and web half), with who may change it. */\n  recordRowControls(args: { record_id: Uuid }): Promise<RecordsResult<RecordRowControls>>;\n  recordRowControlsSet(args: {\n    record_id: Uuid;\n    controls: { shown_to?: string | null; published_to_web?: boolean; indexed?: boolean | null };\n  }): Promise<RecordsResult<RecordRowControls>>;\n  /**\n   * Which Tables each portal of this organization exposes.\n   *\n   * The one question a TABLE-scoped Portals rail has to ask: \"is the table I\n   * am standing on in any portal?\" Same wall and same read-access gate as\n   * `portals`, so a pair here is always a portal `portals` also returned.\n   */\n  portalTables(): Promise<RecordsResult<PortalTableRef[]>>;\n  /** ONE portal in full: what it shows, and who it was opened to. */\n  portalCard(args: { portal_id: Uuid }): Promise<RecordsResult<PortalCard>>;\n  /**\n   * Create or RE-STATE one portal. Re-stating REPLACES what it exposes — a\n   * Table left out of `tables` stops being exposed in the same act — and leaves\n   * the people alone: who is invited is not part of what the portal shows.\n   */\n  portalDeclare(args: {\n    title: string;\n    client_table_id: Uuid;\n    tables: Array<{\n      table_id: Uuid;\n      names_via: string;\n      visible_fields?: string[];\n      editable_fields?: string[];\n      comments?: boolean;\n    }>;\n    portal_id?: Uuid | null;\n    slug?: string | null;\n    sign_in_method?: string | null;\n    /**\n     * S6 — the portal's own look and its forms. A key given REPLACES that key; a key not given\n     * is KEPT (leave `config` out and both stay exactly as they are). The store judges it and\n     * refuses by name: a logo that is not a public picture of this organization's Files, an\n     * accent that is not a design-system color name, a form whose Table the portal does not show.\n     */\n    config?: PortalConfigInput | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * S6 — THE CLIENT'S SIDE: one form of HER portal (`custom.portal_form`). Refused unless the\n   * caller is a live principal of that live portal and the form is on its list; the Field that\n   * names the client is never one of the questions — the portal fills it.\n   */\n  portalForm(args: { portal_id: Uuid; form_id: Uuid }): Promise<RecordsResult<PortalFormSpec>>;\n  /**\n   * S6 — send one form of her portal (`custom.portal_form_submit`). The store fills the Field\n   * that names the client with her own record, and the answer reaches her own list at once\n   * (`accepted`) or waits for the office (`held`, with the store's sentence). `client_key`\n   * makes a retry the same submission.\n   */\n  portalFormSubmit(args: {\n    portal_id: Uuid;\n    form_id: Uuid;\n    answers: Record<string, unknown>;\n    client_key?: string | null;\n  }): Promise<RecordsResult<PortalFormAnswer>>;\n  /**\n   * Invite one person, as one record of the portal's client Table.\n   *\n   * `user_id` is deliberately NOT a parameter here. From a screen it is always\n   * null: an invitation confers NOTHING until the person follows their sign-in\n   * link and the platform gives them an identity, and the door's own `say`\n   * sentence states exactly that. A screen that passed an id would be granting\n   * access on somebody else's behalf.\n   */\n  portalInvite(args: {\n    portal_id: Uuid;\n    client_record_id: Uuid;\n    email: string;\n  }): Promise<RecordsResult<PortalInvitation>>;\n  /** Take one person's way in away. The answer's `say` names the consequence. */\n  portalRevoke(args: { portal_id: Uuid; principal_id: Uuid }): Promise<RecordsResult<PortalRevocation>>;\n  /**\n   * VIEW AS THIS CLIENT. The door asks `custom.visible_set` for HER user id —\n   * the same call `custom.read_records` makes when she opens the page — so this\n   * cannot disagree with what she sees. It REFUSES with `02000` and a sentence\n   * when she has not signed in yet; show the sentence, never an empty list.\n   */\n  portalPreview(args: {\n    portal_id: Uuid;\n    principal_id: Uuid;\n    table_id: Uuid;\n  }): Promise<RecordsResult<PortalPreviewRow[]>>;\n\n  // ── dashboards (SCR-16): saved blocks, run under the caller's principal ──\n  /** This organization's dashboards, optionally only those whose subject is one Table. */\n  dashboards(args?: { table_id?: Uuid | null }): Promise<RecordsResult<DashboardSummary[]>>;\n  /**\n   * AT-INTERFACE — one Interface as this viewer may see it (no organization needed: a share of the\n   * interface record is the way in). `null` = not there, archived, or not shared with her.\n   */\n  interfaceRead(args: { interface_id: Uuid }): Promise<RecordsResult<InterfaceRead | null>>;\n  /** The rows one PUBLISHED element of an Interface exposes (a builder may name a draft one). */\n  interfaceRows(args: {\n    interface_id: Uuid;\n    element_id: string;\n    record_id?: Uuid | null;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<InterfaceRows | null>>;\n  /**\n   * AT-FIX-G1b — one PUBLISHED chart of an Interface as its reader may see it, in the shape one block of\n   * `dashboardRun` answers (the same chart draws from it). The groups and measures are worked out by the store\n   * over the rows her interface access shows and only through the columns the interface door exposes; a chart\n   * that reads any other column answers `refused` (naming none). `null` = not there, archived, or not shared with her.\n   */\n  interfaceChart(args: { interface_id: Uuid; chart_id: string }): Promise<RecordsResult<DashboardBlockResult | null>>;\n  /**\n   * Create or re-state one dashboard. Every block is judged on the way IN —\n   * a block naming a field this Table does not have is refused BY NAME, with\n   * the table's own field list in the hint — so a canvas cannot be saved broken.\n   */\n  dashboardDeclare(args: {\n    table_id: Uuid;\n    name: string;\n    blocks?: DashboardBlock[];\n    presentation?: Record<string, unknown> | null;\n    dashboard_id?: Uuid | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * Run every block and answer the numbers. `filter` is the ONE filter bar\n   * across the canvas: it is merged UNDER each block's own filter, so a block\n   * deliberately scoped to one stage stays scoped while the bar moves the rest.\n   * A block that refuses carries the store's sentence and the others still answer.\n   */\n  dashboardRun(args: {\n    dashboard_id: Uuid;\n    filter?: RecordFilter;\n    /**\n     * S3 — compare every block that does not carry its own comparison (the\n     * block's own wins, as its own filter does). A block with no date to\n     * compare along answers alone and says so in `compare_refused`.\n     */\n    compare?: AggregateCompare | null;\n    /** S3 — re-cut every bucketed block to one date grain (the canvas's picker). */\n    grain?: AggregateBucket | null;\n  }): Promise<RecordsResult<DashboardRunResult>>;\n  /** The seventh block kind on its own: records that have sat on the same value too long. */\n  dashboardStuck(args: {\n    table_id: Uuid;\n    state_key: string;\n    days?: number;\n    filter?: RecordFilter;\n    limit?: number;\n  }): Promise<RecordsResult<StuckRow[]>>;\n  // ── a crew, a phone and no signal (PRODUCTS row 15 / SCR-30) ─────────────\n  /**\n   * Declare or re-state a crew capture sheet over a Table. Admin on the Table.\n   * Closed to the crew until `capturePublish`, like every publishing act here.\n   */\n  captureSheetDeclare(args: {\n    table_id: Uuid;\n    title: string;\n    questions: Array<Record<string, unknown>>;\n    presentation?: Record<string, unknown> | null;\n    sheet_id?: Uuid | null;\n    notify_rule_id?: Uuid | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /** Open the sheet to the crew, or close it. Admin on the Table. */\n  capturePublish(args: { sheet_id: Uuid; open?: boolean }): Promise<RecordsResult<string | null>>;\n  /** The crew sheets of this organization, with what has come in through each. */\n  captureSheets(args?: { table_id?: Uuid | null }): Promise<RecordsResult<CaptureSheetSummary[]>>;\n  /**\n   * Everything a phone needs to run one sheet OFFLINE — the questions, the Fields\n   * with their ids and parity types, and an honest `may_capture` with a sentence.\n   * Load it once on a signal; it is the last network call before the walk.\n   */\n  captureOpen(args: { sheet_id: Uuid }): Promise<RecordsResult<CaptureSheetFace | null>>;\n  /**\n   * One capture: the answers, the file references, the device, the moment the phone\n   * took it and the place. Idempotent on `client_key`, which the PHONE mints when\n   * the capture is taken, offline, before its first attempt — send the same key on\n   * every retry and the answer comes back `replay: true` with the first record's id.\n   */\n  captureSubmit(args: {\n    sheet_id: Uuid;\n    client_key: string;\n    answers: Record<string, unknown>;\n    files?: CaptureFileRef[];\n    device?: string | null;\n    captured_at?: string | null;\n    location?: Record<string, unknown> | null;\n  }): Promise<RecordsResult<CaptureOutcome | null>>;\n\n  // ── a column a model owns (PRODUCTS row 10 / AGT-6) ──────────────────────\n  /** Every agent-owned column, with how many cells are filled, stale or pinned, and what it has cost. */\n  enrichments(args?: { table_id?: Uuid | null }): Promise<RecordsResult<EnrichmentSummary[]>>;\n  /**\n   * Define, change or TURN ON an Enrichment on one Field. Admin on the Table.\n   * `{enabled: true}` on its own turns an existing one on without resetting it —\n   * and turning it on is what authorises every value it writes afterwards.\n   */\n  enrichDeclare(args: {\n    field_id: Uuid;\n    spec: Record<string, unknown>;\n  }): Promise<RecordsResult<EnrichDeclared>>;\n  /**\n   * The rows that need this column filled in, each with what the instruction may\n   * read. A cell somebody pinned is never returned. This is what a PREVIEW shows\n   * before anybody enables anything.\n   */\n  enrichDue(args: {\n    field_id: Uuid;\n    limit?: number;\n    include_fresh?: boolean;\n  }): Promise<RecordsResult<EnrichDueRow[]>>;\n  /**\n   * THE BADGE DATA FOR A WHOLE PAGE, in one call. Who wrote each value, when, out\n   * of what source, its candidates, whether a person pinned it and whether it is\n   * past its freshness date. Asked per cell this would be one round trip per badge.\n   */\n  enrichCells(args: {\n    table_id: Uuid;\n    field_keys?: string[] | null;\n    record_ids?: Uuid[] | null;\n  }): Promise<RecordsResult<EnrichCell[]>>;\n  /** Hold one cell against the model that fills its column, or hand it back. */\n  enrichPin(args: {\n    record_id: Uuid;\n    field_key: string;\n    pinned?: boolean;\n  }): Promise<RecordsResult<{ pinned: boolean; says: string }>>;\n  /** What this column has cost, run by run. */\n  enrichRuns(args?: { field_id?: Uuid | null; limit?: number }): Promise<RecordsResult<EnrichRun[]>>;\n  /** Take a dashboard away. The records it counted are untouched — a canvas owns nothing. */\n  dashboardDelete(args: { dashboard_id: Uuid }): Promise<RecordsResult<boolean>>;\n\n  // ── the eighth verb (AGT-N-8): the aggregate, computed in the read door ──\n  /**\n   * Group, bucket, filter and measure INSIDE `custom.record_aggregate`. The\n   * aggregate node sits above the read-access join, so what a chart draws is\n   * exactly what this person may see — the rest is never fetched, let alone\n   * summed and then hidden.\n   */\n  recordAggregate(args: {\n    table_id: Uuid;\n    /**\n     * OPTIONAL FILTER (active-org law): with `config.organizationIds` set, the table is looked\n     * up across all the person's organizations and the aggregate runs in the one that OWNS it\n     * (each row then carries that `organization_id`); this narrows the lookup to one. Absent and\n     * no `organizationIds` ⇒ this client's own organization, exactly as before.\n     */\n    organization_id?: Uuid | null;\n    /** Field keys whose values become the groups. */\n    groupBy?: string[];\n    /** `count` needs no key; every other operation reads one Field. */\n    measures?: AggregateMeasure[];\n    /** A date Field truncated to a period — a group whose expression is a date_trunc. */\n    bucket?: { key: string; by: AggregateBucket } | null;\n    /**\n     * A scalar is an equality and an object is a half-open moment window, and\n     * either way it lands in the SAME WHERE as read access.\n     */\n    filter?: StoreFilter;\n    limit?: number;\n    /**\n     * S3 — answer the same question over a prior window too (previous period,\n     * same period last year, or a fixed baseline). Each row then carries\n     * `prior_measures`, `delta` and the two `compare` windows. Buckets are cut\n     * in the organization's calendar (knobs `custom/time_zone`, `custom/week_start`).\n     */\n    compare?: AggregateCompare | null;\n    /**\n     * The grid's search, narrowing the answer to the rows `listPage`'s search would show (the\n     * same predicate, `custom.record_search_sql`). Blank or absent: nothing changes.\n     */\n    search?: string | null;\n    /** The reader's time zone for the search's date matches (absent = the organization's calendar). */\n    time_zone?: string | null;\n    /**\n     * A CHART counts each part of a many-value column under its own group (a row tagged A and B counts once under A and once\n     * under B; a multi-link counts per linked record id); a grid group-by (absent / false) keeps the exact combination.\n     */\n    splitMulti?: boolean;\n  }): Promise<RecordsResult<AggregateRow[]>>;\n  /** Historical aggregate computed by the store at its recorded-time read door. */\n  recordAggregateAsOf(args: {\n    table_id: Uuid;\n    recorded_at: string;\n    measure?: string;\n    field_key?: string | null;\n    group_by?: string | null;\n    match?: Record<string, unknown>;\n  }): Promise<RecordsResult<Array<{\n    bucket: string | null;\n    result: number | null;\n    row_count: number;\n    not_numbers: number;\n    a_non_number: string | null;\n  }>>>;\n  /** The measures the store itself offers. Asked, never hardcoded in a picker. */\n  aggOperations(): Promise<RecordsResult<string[]>>;\n  /** The periods the store itself buckets by. */\n  aggBuckets(): Promise<RecordsResult<string[]>>;\n  /**\n   * The organization's calendar (knobs `custom/time_zone`, `custom/week_start`), cut by the SAME door the\n   * relative date filters and the chart buckets use. A calendar or timeline reads its first day of the week\n   * from here, never from a constant of its own (lane NOTION-SMALL-4).\n   */\n  aggCalendar(): Promise<RecordsResult<{ time_zone: string; week_start: string }>>;\n\n  // ── THE ONE READ CONTRACT (lane DRILL-STANDARD-DOOR): any source, one answer shape ──\n  /**\n   * A source's drill definition — its Dimensions, Measures, drill paths and first screen.\n   * `{kind: \"table\", id}` is a custom Table; `{kind: \"entity\", token}` a standard table by its\n   * registry token or a declared definition by its key.\n   */\n  drillDescribe(args: { source: DrillSource }): Promise<RecordsResult<DrillDefinition>>;\n  /**\n   * Ask a source a question: grouped, bucketed (day…year in the organization's calendar),\n   * compared, pivoted. A standard table is counted AS THE PERSON (its own row security decides\n   * every row); groups past the cap fold into one Other row and the total row says so.\n   */\n  drillAsk(args: { source: DrillSource; question?: DrillQuestion }): Promise<RecordsResult<DrillAnswer>>;\n  /** The records behind a number, through the same filter, read as the person. */\n  drillRows(args: {\n    source: DrillSource;\n    where?: DrillQuestion[\"where\"];\n    window?: DrillQuestion[\"window\"];\n    sort?: DrillQuestion[\"sort\"];\n    lane?: DrillQuestion[\"lane\"];\n    columns?: string[];\n    limit?: number;\n    offset?: number;\n    /** The viewer's search term, asked of the door (`platform._drill_compile` reads `question.search`). */\n    search?: string;\n  }): Promise<RecordsResult<DrillRowsPage>>;\n\n  // ── subscriptions (DOOR-18): a Rule record over a saved view ─────────────\n  /**\n   * Every subscription in this organization, optionally narrowed to one saved\n   * view or one cadence. There is no subscription table: each one is a Rule\n   * record carrying a `subscription` block, so a subscription is readable,\n   * historied and agent-writable like anything else.\n   */\n  aggSubscriptions(args?: {\n    saved_view_id?: Uuid | null;\n    cadence?: string | null;\n  }): Promise<RecordsResult<Subscription[]>>;\n  /** The cadences the store itself offers. Asked, never hardcoded in a picker. */\n  aggSubscriptionCadences(): Promise<RecordsResult<string[]>>;\n  /**\n   * The same cadences, through the door a PERSON may call.\n   * `aggSubscriptionCadences` is the notifier's own and holds no client grant,\n   * so a screen that asked for it was refused and fell back to a list typed\n   * into the picker — which drifts from what the digest runner honors. This\n   * one delegates to the same array, so there is exactly one list.\n   */\n  subscriptionCadences(): Promise<RecordsResult<string[]>>;\n  /**\n   * WHAT THIS PERSON IS BEING TOLD ABOUT, and what they may switch off.\n   *\n   * Mine, plus anyone's over a Table I hold admin on — narrowed to Tables I can\n   * already open, so the list never reveals one. `aggSubscriptions` above is the\n   * NOTIFIER's reader and no client can call it; this is the owner's.\n   */\n  subscriptions(args?: { table_id?: Uuid | null }): Promise<RecordsResult<MySubscription[]>>;\n  /**\n   * Switch one on or off. Muting is honored in ONE place — the reader every\n   * consumer goes through — so a screen can never say a subscription is off\n   * while it keeps firing.\n   */\n  subscriptionMute(args: { rule_id: Uuid; muted: boolean }): Promise<RecordsResult<boolean>>;\n  /**\n   * WRITE ONE. The store refuses a cadence no runner acts on, a channel this\n   * platform does not send on and quiet hours nobody can parse — by name — then\n   * declares the Rule through `rule_declare`, because a Rule written as a record\n   * carries `data_class = 'record'` and every reader that goes looking for a Rule\n   * steps straight past it (REC-72).\n   */\n  subscriptionDeclare(args: {\n    table_id: Uuid;\n    spec: SubscriptionSpec;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * SHOW ME ONE NOW. The summary this subscription would send at this moment, with\n   * what entered, left and changed NAMED. It assembles only: nothing is delivered,\n   * nothing is recorded and the watermark does not move.\n   */\n  subscriptionPreview(args: { rule_id: Uuid }): Promise<RecordsResult<DigestPreview>>;\n  /**\n   * THE SAVED VIEWS OF A TABLE — what a subscription may be written over. Narrowed\n   * in SQL as the definer to Tables this caller can already open, so the list can\n   * never reveal a Table.\n   */\n  views(args?: { table_id?: Uuid | null }): Promise<RecordsResult<SavedViewRow[]>>;\n  /**\n   * SAVE ONE VIEW. VIEWER on the Table, not editor: writing down a question about a\n   * Table is not changing it, and requiring editor would mean the people who read a\n   * Table could not subscribe to anything in it.\n   */\n  viewDeclare(args: { table_id: Uuid; spec: SavedViewSpecIn }): Promise<RecordsResult<Uuid>>;\n  /** A Table's row templates (\"New from template\"). VIEWER on the Table. */\n  rowTemplates(args: { table_id: Uuid }): Promise<RecordsResult<RowTemplateRow[]>>;\n  /**\n   * SAVE ONE ROW TEMPLATE — `{name, values}` by Field key; the same name again changes it, and\n   * `{template_id, archived: true}` archives it. EDITOR on the Table: it is how everyone's new rows start.\n   */\n  rowTemplateDeclare(args: {\n    table_id: Uuid;\n    spec: { name?: string; values?: Record<string, unknown>; template_id?: Uuid; archived?: boolean };\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * DESIGNATE HOW A TABLE OPENS — \"Make this the default\". EDITOR on the Table: the named view\n   * becomes the table's only default and, when `layout` is given, that is the layout everyone opens\n   * it in. A layout press never designates (`viewDeclare` refuses the default view's layout and\n   * is_default by name — VIEW-SWITCH-NOT-DESIGNATION, VERIFIER-21).\n   */\n  viewDesignate(args: { table_id: Uuid; view_id: Uuid; layout?: string | null }): Promise<RecordsResult<Uuid>>;\n  /**\n   * ARCHIVE ONE SAVED VIEW (lane TABLE-ACTIONS, T3.5). The soft delete of the `platform.saved_view`\n   * row behind it — `platform.saved_view_archive('custom/records', id)`, which asks its own ladder\n   * (the view's creator, or admin on the view) and clears a default it held. The records are\n   * untouched. `null` when the view was already gone. `viewRestore` (or Trash) brings it back.\n   */\n  viewArchive(args: { view_id: Uuid }): Promise<RecordsResult<Record<string, unknown> | null>>;\n  /** PUT AN ARCHIVED VIEW BACK — the platform's one restore door, `platform.entity_undelete('platform_saved_view', id)`. */\n  viewRestore(args: { view_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /**\n   * THE CALLER'S OWN LOOK AT EACH SAVED VIEW OF A TABLE — `{ \"<view id>\": { look, updated_at } }`.\n   * A look is the view settings one person chose while looking (a board's grouping, a calendar's\n   * date field, a sort, a filter, hidden columns, widths, the layout), kept for her alone until an\n   * editor saves it onto the view with `viewDeclare` (\"Save to view\"). Viewer on the Table.\n   */\n  viewLookRead(args: { table_id: Uuid }): Promise<RecordsResult<Record<string, { look: Record<string, unknown>; updated_at: string }>>>;\n  /**\n   * KEEP THE CALLER'S OWN LOOK AT ONE VIEW — the whole look, as definition keys (`group_field`,\n   * `date_field`, `sorts`, `where`, `presentation`, `layout`, …; a key set to null hides the view's\n   * own). `look: null` is \"Reset to view\". The shared view row is never written. Answers the look\n   * as kept (null after a reset).\n   */\n  viewLookSet(args: { table_id: Uuid; view_id: Uuid; look: Record<string, unknown> | null }): Promise<RecordsResult<Record<string, unknown> | null>>;\n\n  // ── documents (W3-DOC): save, render once, sign the exact bytes ──────────\n  docTemplateSave(args: {\n    table_id: Uuid;\n    name: string;\n    body: string;\n    template_id?: Uuid | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /** The body with every token resolved against one record. Read-only, no render row. */\n  docRenderBody(args: { template_id: Uuid; record_id: Uuid }): Promise<RecordsResult<string>>;\n  /** Write the render — frozen bytes a signature can be checked against. */\n  docRenderDocument(args: { template_id: Uuid; record_id: Uuid }): Promise<RecordsResult<Uuid>>;\n  /** Every token in a body, in order, with the Field id each one points at. */\n  docTokens(args: { body: string }): Promise<RecordsResult<DocToken[]>>;\n  /** The tokens this Table cannot answer, each with the store's own reason. */\n  docUnresolvedTokens(args: { table_id: Uuid; body: string }): Promise<RecordsResult<DocUnresolvedToken[]>>;\n  docSign(args: {\n    render_id: Uuid;\n    field_key: string;\n    signer_name: string;\n    signer_user_id?: Uuid | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * One signature: the seal AND whether what was signed is still what is there.\n   * The store answers both, in one call, never the screen. Viewer on the record.\n   */\n  docSignatureRead(args: { signature_id: Uuid }): Promise<RecordsResult<unknown>>;\n  /** Every template that renders one Table. Viewer on the Table. */\n  docTemplates(args: { table_id: Uuid }): Promise<RecordsResult<DocTemplateRow[]>>;\n  /**\n   * Retire one template. EDITOR on the Table it renders, because a template is\n   * that Table's wording. Documents already rendered keep their frozen bytes\n   * and their seals, so this can never invalidate a signature.\n   */\n  docTemplateDelete(args: { template_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** Bring back a removed template (the undo of docTemplateDelete, same rung). */\n  docTemplateRestore(args: { template_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /**\n   * Remove one saved document (soft). EDITOR on its record. Its bytes, hash and\n   * any signature stay exactly as they were; docRenderRestore brings it back.\n   */\n  docRenderDelete(args: { render_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** The undo of docRenderDelete, same rung. */\n  docRenderRestore(args: { render_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** Every frozen render of one record, newest first. Viewer on the record. */\n  docRenders(args: { record_id: Uuid }): Promise<RecordsResult<DocRenderRow[]>>;\n  /** Every signature on one record. Viewer on the record. */\n  docSignatures(args: { record_id: Uuid }): Promise<RecordsResult<DocSignatureRow[]>>;\n  /**\n   * DOOR-11. One record's revisions, newest first. The read door answers\n   * documents and deliberately not versions, so a screen that wants to save\n   * optimistically reads the version of the record it LOADED from here — for\n   * the one record being edited, never for a list.\n   */\n  revisions(args: { record_id: Uuid }): Promise<RecordsResult<RecordRevision[]>>;\n  /**\n   * PRODUCTS row 4. One record's version list, newest first: who (a person, or\n   * an agent AND the person it acted for), when, the operation in the word\n   * somebody used, and every field that moved with its before, its after, the\n   * Rule version that produced a derived value and its source pointer. Viewer\n   * on the record — reading how something got to be the way it is is reading.\n   */\n  recordHistory(args: {\n    record_id: Uuid;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<RecordHistoryEntry[]>>;\n  /**\n   * AGT-N-9 — EVERYTHING A CHAT OPENED ON THIS RECORD MAY KNOW, IN ONE ROUND TRIP.\n   *\n   * The Fields with their `(record, field, value version)` triples, the relations one hop\n   * out, the history, the comments and the Table's other records — assembled INSIDE the\n   * database, every piece through the read door, under this person's own field-level\n   * security. A Field the store masks comes back in `withheld` with the store's own\n   * sentence and no value; a Field the organization keeps out of conversations comes back\n   * there too, saying which of the two it is.\n   */\n  recordScopeContext(args: {\n    record_id: Uuid;\n    relations?: number;\n    history?: number;\n    siblings?: number;\n  }): Promise<RecordsResult<RecordScopeContext>>;\n  /** What is this conversation about? */\n  conversationScope(args: { conversation_id: Uuid }): Promise<RecordsResult<ConversationScope>>;\n  /** Point a conversation at one record. Refused unless this person may open it. */\n  conversationScopeBind(args: {\n    conversation_id: Uuid;\n    record_id: Uuid;\n  }): Promise<RecordsResult<ConversationScope>>;\n  /** This conversation is no longer about a particular record. */\n  conversationScopeUnbind(args: {\n    conversation_id: Uuid;\n  }): Promise<RecordsResult<ConversationScope>>;\n  /** The binding AND the context of a bound conversation, in one round trip. */\n  conversationScopeContext(args: {\n    conversation_id: Uuid;\n    relations?: number;\n    history?: number;\n    siblings?: number;\n  }): Promise<RecordsResult<ConversationScopeContext>>;\n  /**\n   * \"Who changed the price on ANY record?\" One column's history across a whole\n   * Table, narrowed to the records this person may see by a predicate in the\n   * same statement. A column that names no Field is refused BY NAME, never\n   * answered empty.\n   */\n  fieldHistory(args: {\n    table_id: Uuid;\n    field_key: string;\n    limit?: number;\n    offset?: number;\n    record_id?: Uuid;\n  }): Promise<RecordsResult<FieldHistoryEntry[]>>;\n  /**\n   * A FORMULA, ROLLUP OR LOOKUP COLUMN'S HISTORY ON ONE RECORD (CD-FORMULA-08). Its answer at every moment it changed,\n   * worked out from the values and the formula as they were, with the formula version that produced it. A column\n   * people type into is refused by name (its history is `fieldHistory`).\n   */\n  formulaHistory(args: { record_id: Uuid; field_key: string; limit?: number }): Promise<RecordsResult<FormulaHistoryEntry[]>>;\n  /**\n   * WHAT A RESTORE WOULD CHANGE, BEFORE IT DOES. Editor on the record: this is\n   * the first half of an act, and somebody who may not perform it is not shown\n   * its preview. Pass `field_key` for one column.\n   */\n  restorePreview(args: {\n    record_id: Uuid;\n    version: number;\n    field_key?: string;\n  }): Promise<RecordsResult<RestorePreview>>;\n  /** Put the whole record back to a version, as a NEW version. Editor. */\n  restoreVersion(args: { record_id: Uuid; version: number }): Promise<RecordsResult<RestoreResult>>;\n  /** Put ONE column back to what it said at a version, as a NEW version (HIS-N-2). Editor. */\n  valueRestore(args: {\n    record_id: Uuid;\n    field_key: string;\n    version: number;\n  }): Promise<RecordsResult<RestoreResult>>;\n  /**\n   * SCR-18. The record's comment thread with everybody named, plus what THIS\n   * person may do in it — decided by the store, in the same call, so a screen\n   * never draws a composer the write door will refuse.\n   */\n  commentThread(args: {\n    record_id: Uuid;\n    include_resolved?: boolean;\n  }): Promise<RecordsResult<CommentThreadRead>>;\n  /**\n   * How many OPEN comments each named row has (up to 500 rows; rows with none are absent), read\n   * through the same reader as the thread — one call for a whole card of rows.\n   */\n  commentCounts(args: { record_ids: readonly Uuid[] }): Promise<RecordsResult<Record<string, number>>>;\n  /**\n   * Write a comment at the `commenter` rung, optionally naming people. A\n   * mention is a reference and not a regex over the body: the ids come from the\n   * picker and the store refuses one who is not in the organization, or who\n   * cannot open the record — because that notification would be a dead end.\n   */\n  commentWrite(args: {\n    record_id: Uuid;\n    body: string;\n    field_key?: string;\n    parent_comment_id?: Uuid;\n    mentions?: Uuid[];\n  }): Promise<RecordsResult<CommentWritten>>;\n  /** Resolve (or re-open) a thread. `commenter` — resolution is not a delete. */\n  commentResolve(args: { comment_id: Uuid; resolved?: boolean }): Promise<RecordsResult<boolean>>;\n  /**\n   * Follow ONE record (AT-FIX-G2; Airtable's \"follow a record\"). While followed, a change or a comment by SOMEBODY ELSE\n   * puts a notice in this person's bell, written in the same transaction as the change; the notice opens the record.\n   * `follow: false` stops it. Anybody who may read the record may follow it; the row is always the caller's own.\n   */\n  recordFollowSet(args: { record_id: Uuid; follow?: boolean }): Promise<RecordsResult<RecordFollowSet>>;\n  /** Who follows this record, and whether this person does. Empty for somebody who cannot open the record. */\n  recordFollowers(args: { record_id: Uuid }): Promise<RecordsResult<RecordFollowers>>;\n  /**\n   * Every value of one record WITH its envelope — its own version, who wrote\n   * it, who they were acting for and when. The timeline IS the record (REC-19);\n   * there is no second history table.\n   */\n  recordValuesVersioned(args: { record_id: Uuid; organization_id?: Uuid | null }): Promise<RecordsResult<ReadValue[]>>;\n\n  // ── the doors that do not exist yet, named rather than faked ─────────────\n  /**\n   * Metadata search across EVERY organization the person belongs to (`config.organizationIds`;\n   * `organization_id` narrows to one): the Tables and Fields whose name, key, label or description\n   * holds `text` (case-insensitive; structure, never rows). Each match is `{id, kind: \"table\" |\n   * \"field\", name, description, organization_id}` (a Field adds `key`, `table_id`, `field_type`).\n   * An organization whose read door refuses is listed in `unavailable` WITH its reason and\n   * never hides the rest. Only when NO organization answers is the whole search a failure (the\n   * first refusal).\n   */\n  metadataSearch(args: {\n    text: string;\n    organization_id?: Uuid | null;\n  }): Promise<RecordsResult<MetadataSearchAnswer>>;\n  /**\n   * WHICH of the person's organizations can this client use right now? Asks every organization\n   * in scope (`organization_id` narrows to one) whether its record store is open, so a host can\n   * say \"organization X is unavailable: <reason>\" instead of silently dropping it. Organization\n   * order is the person's own, never completion order.\n   */\n  organizationsOpen(args?: {\n    organization_id?: Uuid | null;\n  }): Promise<RecordsResult<OrganizationsOpenAnswer>>;\n  /**\n   * The organization that OWNS a table or record — the one a write to it must run in. A\n   * `table_id` is looked up across all the person's organizations; a `record_id` is opened in its\n   * own. `null` = found in none of them. Never a permission: the store's doors still decide.\n   */\n  ownerOrganization(args: {\n    table_id?: Uuid | null;\n    record_id?: Uuid | null;\n    organization_id?: Uuid | null;\n  }): Promise<RecordsResult<Uuid | null>>;\n  // ── the anonymous lane (W4-ANON) ─────────────────────────────────────────\n  /**\n   * Mint an embed token. `mode` is `read` OR `write` and never both — the store\n   * refuses a token carrying two decisions. The secret comes back ONCE, because\n   * only its digest is stored: a database read cannot produce a working token.\n   * `allowedOrigins` is required and matched EXACTLY, so `example.com.evil.test`\n   * fails a check that a suffix match would pass.\n   */\n  anonTokenIssue(args: {\n    mode: \"read\" | \"write\";\n    allowedOrigins: string[];\n    formId?: Uuid | null;\n    savedViewId?: Uuid | null;\n    recordId?: Uuid | null;\n    expiresAt?: Timestamp | null;\n  }): Promise<RecordsResult<{ token_id: Uuid; secret: string }>>;\n  /** What a secret is good for, from an origin. The store's sentence when it is not. */\n  anonTokenVerify(args: {\n    secret: string;\n    origin: string;\n    requiredMode?: \"read\" | \"write\" | null;\n  }): Promise<RecordsResult<AnonTokenBinding>>;\n  anonTokenRevoke(args: { token_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /**\n   * A STRANGER'S WRITE. The token supplies the organization, so this call names\n   * none — and what it produces is a QUARANTINED SUBMISSION, not a record:\n   * `custom.record` is never touched here. `clientKey` makes a replay free and\n   * idempotent, which is what lets a flaky phone retry safely.\n   */\n  anonWrite(args: {\n    secret: string;\n    origin: string;\n    payload: Record<string, unknown>;\n    clientKey?: string | null;\n    rawPayload?: Record<string, unknown>;\n  }): Promise<RecordsResult<Uuid>>;\n  /**\n   * SCR-30, and it is the SIGNED-IN offline path, not the stranger's. The client\n   * mints `clientKey` BEFORE the first attempt, offline, and the store's own\n   * replay ledger dedupes on it — so a reconnect that fires the same capture\n   * thirty times writes one record and returns the same id every time.\n   */\n  anonCapture(args: {\n    table_id: Uuid;\n    clientKey: string;\n    payload: Record<string, unknown>;\n    device?: string | null;\n    capturedAt?: Timestamp | null;\n  }): Promise<RecordsResult<Uuid>>;\n  /** Open or close a form to strangers. An admin act on the Table, never an editor one. */\n  anonPublish(args: { form_id: Uuid; published?: boolean }): Promise<RecordsResult<Timestamp | null>>;\n\n  // ── checklists and SOP runs (PRODUCTS row 13) ────────────────────────────\n  /**\n   * What is wrong with a checklist somebody is writing, in the words they would\n   * use. `null` means it is fine. Pure — it reads no row and writes nothing —\n   * so an editor may ask it on every keystroke and the refusal arrives BEFORE\n   * the save rather than after it.\n   */\n  checklistRefusal(args: { spec: ChecklistSpec }): Promise<RecordsResult<string | null>>;\n  /**\n   * Store a checklist, whole: ordered steps, who each belongs to by role, how\n   * many days in each is due, what each waits for, what each asks for, and what\n   * starts a run. Pass `template_id` to change the checklist that already\n   * exists rather than making a second one.\n   */\n  checklistDeclare(args: {\n    spec: ChecklistSpec;\n    template_id?: Uuid | null;\n  }): Promise<RecordsResult<ChecklistDeclared>>;\n  checklistTemplates(args?: {\n    about_table_id?: Uuid | null;\n    limit?: number;\n  }): Promise<RecordsResult<ChecklistTemplateSummary[]>>;\n  checklistTemplateShape(args: { template_id: Uuid }): Promise<RecordsResult<ChecklistTemplateShape>>;\n  /**\n   * Run a checklist for one record: one work item per step in the ONE work\n   * layer, assigned by role to real people, dated from the offsets,\n   * dependencies carried across. `roles` names who stands in each role for THIS\n   * run, over whatever the checklist says by default.\n   */\n  checklistStart(args: {\n    template_id: Uuid;\n    about_record_id?: Uuid | null;\n    roles?: Record<string, Uuid>;\n    startingAt?: Timestamp | null;\n  }): Promise<RecordsResult<ChecklistRunStarted>>;\n  checklistRun(args: { run_id: Uuid }): Promise<RecordsResult<ChecklistRunStep[]>>;\n  checklistRuns(args?: {\n    about_table_id?: Uuid | null;\n    about_record_id?: Uuid | null;\n    includeClosed?: boolean;\n    limit?: number;\n  }): Promise<RecordsResult<ChecklistRunSummary[]>>;\n  /**\n   * Tick a step off with whatever it asked for. Refused by name while a step it\n   * waits for is open, or while what it asks for is missing — and the same\n   * refusal meets `workSetState`, because the rule lives in the store and not\n   * in this door.\n   */\n  checklistStepComplete(args: {\n    step_id: Uuid;\n    evidence?: Record<string, unknown>;\n  }): Promise<RecordsResult<ChecklistStepCompleted>>;\n  /** Why this step cannot be finished right now. `null` means it can. */\n  checklistStepRefusal(args: { step_id: Uuid }): Promise<RecordsResult<string | null>>;\n\n  // ── work (W4-WORK): templates, turns and slots ───────────────────────────\n  /** The five states and what each one may become. Asked, never hardcoded in a picker. */\n  workStates(): Promise<RecordsResult<WorkState[]>>;\n  /** Why this graph would be refused — asked BEFORE it is written. `null` means it is fine. */\n  workTemplateRefusal(args: { graph: WorkGraph }): Promise<RecordsResult<string | null>>;\n  workTemplateDeclare(args: { name: string; graph: WorkGraph }): Promise<RecordsResult<Uuid>>;\n  /**\n   * REC-70: the WHOLE graph is created in one act, judged before any of it is\n   * written, so a half-made checklist is not a state this store can be in.\n   */\n  workTemplateInstantiate(args: {\n    template_id: Uuid;\n    overrides?: Record<string, Record<string, unknown>>;\n  }): Promise<RecordsResult<WorkInstantiation>>;\n  workTemplateShape(args: { template_id: Uuid }): Promise<RecordsResult<unknown>>;\n  workInstantiationShape(args: { instantiation_id: Uuid }): Promise<RecordsResult<unknown>>;\n  /** Whose turn each record is, with its state and whether that state is terminal. */\n  workWhoseTurn(args: { table_id: Uuid; includeFinished?: boolean }): Promise<RecordsResult<WorkTurn[]>>;\n  /** Does this Table carry assignment at all? A screen asks before it offers one. */\n  workHasAssignment(args: { table_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** The Fields assignment is made of, so nothing here invents a column name. */\n  workAssignmentFields(args?: { options_table_id?: Uuid | null }): Promise<RecordsResult<WorkAssignmentField[]>>;\n  /** Add assignment to a Table. */\n  workTakeAssignment(args: { table_id: Uuid }): Promise<RecordsResult<unknown>>;\n  /** Why this move would be refused. `null` means it is allowed. */\n  workTransitionRefusal(args: { from_state_id: Uuid; to_state_id: Uuid }): Promise<RecordsResult<string | null>>;\n  /** Declare the Table slots are held in. Idempotent — a second call finds the first. */\n  workSlotsDeclare(args: { name: string; slug: string; homeId?: Uuid | null }): Promise<RecordsResult<unknown>>;\n  /**\n   * SCR-29. Take a slot for a while. THE STORE decides, under a unique index —\n   * two people racing for the same slot do not both get it, whatever either\n   * screen believed a moment earlier.\n   */\n  workSlotHold(args: {\n    table_id: Uuid;\n    slotKey: string;\n    holder: string;\n    ttl?: string;\n  }): Promise<RecordsResult<unknown>>;\n  workSlotRelease(args: { hold_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** Every hold on this Table, with whether it has already lapsed. */\n  workSlotHolds(args: { table_id: Uuid }): Promise<RecordsResult<WorkSlotHold[]>>;\n  workSlotExpire(args: { table_id: Uuid }): Promise<RecordsResult<number>>;\n\n  // ── the work layer a person actually uses (lane WORK-DOORS, 2026-09-20) ──\n  /**\n   * THE ONE INBOX. Assignments, approvals and the agent's proposals, in one\n   * ordered list with ONE row shape — PRODUCTS.md row 6. A second queue for the\n   * agent's suggestions is the thing this replaces.\n   */\n  workInbox(args?: {\n    limit?: number;\n    offset?: number;\n    includeDecided?: boolean;\n    /** Lane S5-PRIME-2: \"inbox\" (default), \"snoozed\" or \"done\" — this person's own views. */\n    view?: WorkInboxView;\n  }): Promise<RecordsResult<WorkInboxItem[]>>;\n  /**\n   * SNOOZE ONE ITEM OF MY INBOX UNTIL A TIME (lane S5-PRIME-2, `custom.inbox_snooze`). Only my\n   * inbox changes; the approval or record is never written. A time already past, a snooze past a\n   * year, and a decided item are refused by name.\n   */\n  inboxSnooze(args: { item_id: Uuid; until: Timestamp }): Promise<RecordsResult<InboxStateChange>>;\n  /** Take my snooze off: it is back in my inbox now. */\n  inboxUnsnooze(args: { item_id: Uuid }): Promise<RecordsResult<InboxStateChange>>;\n  /**\n   * CLEAR (mark done) ONE ITEM OF MY INBOX. A decision still owed is refused (\"This one needs a\n   * decision\"). It comes back if somebody else changes it.\n   */\n  inboxClear(args: { item_id: Uuid }): Promise<RecordsResult<InboxStateChange>>;\n  /** Put a cleared item back in my inbox. */\n  inboxUnclear(args: { item_id: Uuid }): Promise<RecordsResult<InboxStateChange>>;\n  /**\n   * WHAT WAITS ON ME, COUNTED (`custom.inbox_counts`) — the same predicate the inbox lists with.\n   * `everyOrganization` counts every organization I belong to (the shell badge: what waits on a\n   * person is theirs, not the selected organization's).\n   */\n  inboxCounts(args?: { everyOrganization?: boolean }): Promise<RecordsResult<InboxCounts[]>>;\n  /** \"My work\", \"work I assigned\", \"waiting on somebody being chosen\". */\n  workList(args?: {\n    flavour?: WorkListFlavour;\n    includeFinished?: boolean;\n    limit?: number;\n    offset?: number;\n  }): Promise<RecordsResult<WorkListItem[]>>;\n  /**\n   * Give one record to one person: the Assignee value AND editor access, in one\n   * transaction. Passing no `user_id` un-assigns and says plainly that nobody's\n   * access was taken away.\n   */\n  workAssign(args: {\n    record_id: Uuid;\n    user_id?: Uuid | null;\n    dueDate?: string | null;\n    clearDue?: boolean;\n  }): Promise<RecordsResult<WorkAssignment>>;\n  /** The states this record may be moved to, and the sentence for each it may not. */\n  workRecordStates(args: { record_id: Uuid }): Promise<RecordsResult<WorkRecordState[]>>;\n  /** Move it. The store refuses a move the model forbids, in its own words. */\n  workSetState(args: { record_id: Uuid; state_id: Uuid | null }): Promise<RecordsResult<unknown>>;\n  /** The person-kernel record standing for a signed-in person here. */\n  workPerson(args: { user_id: Uuid; create?: boolean }): Promise<RecordsResult<Uuid | null>>;\n  /** The templates this person may run, so a picker has ids to offer. */\n  workTemplates(args?: { limit?: number }): Promise<RecordsResult<Array<{\n    template_id: Uuid;\n    name: string;\n    nodes: number;\n    relations: number;\n    created_at: string;\n  }>>>;\n  /** Who may decide a change about this subject, and why each of them may. */\n  workApprovalApprovers(args: {\n    subject_id: Uuid | null;\n    approver_id?: Uuid | null;\n  }): Promise<RecordsResult<WorkApprover[]>>;\n  /** Ask for a change instead of making it. Viewer on the subject is enough to ASK. */\n  workApprovalRequest(args: {\n    subject_id: Uuid;\n    change: WorkChange;\n    note?: string | null;\n    approver_id?: Uuid | null;\n    origin?: \"person\" | \"agent\";\n    conversation_id?: Uuid | null;\n  }): Promise<RecordsResult<WorkApprovalFiled>>;\n  /** Whether THIS person may decide THIS one — so a screen never draws a dead button. */\n  workApprovalMayDecide(args: { approval_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** Approve or decline. Approving APPLIES the change, as the person approving. */\n  workApprovalDecide(args: {\n    approval_id: Uuid;\n    approve: boolean;\n    note?: string | null;\n  }): Promise<RecordsResult<WorkApprovalDecision>>;\n  /**\n   * DECIDE MANY INBOX ITEMS IN ONE CALL (lane S4, `custom.work_decide_many`). Each is judged by\n   * `work_approval_decide` exactly as one is, in its own savepoint: a refused decision leaves that\n   * item waiting and the others still stand. Verdicts: approved, declined, already_decided,\n   * no_right, refused — each with the store's own sentence.\n   */\n  workDecideMany(args: { decisions: WorkDecideManyItem[] }): Promise<RecordsResult<WorkDecideMany>>;\n  /** One waiting change in full, for the person deciding it or the one who asked. */\n  workApprovalRead(args: { approval_id: Uuid }): Promise<RecordsResult<Record<string, unknown>>>;\n\n  // ── the trust doors: `iam`'s, not the store's ────────────────────────────\n  /** VIS-31. Is this account a signed-in outsider — no NON-personal organization? */\n  isExternalPrincipal(args?: { user_id?: Uuid | null }): Promise<RecordsResult<boolean>>;\n  /** The same answer WITH the plain-English reason a screen shows. */\n  externalPrincipalCard(args?: { user_id?: Uuid | null }): Promise<RecordsResult<ExternalPrincipalCard>>;\n  /** Exactly the resource ids Visibility gave that outsider. Never an organization's list. */\n  externalPrincipalReach(args: {\n    resourceType: string;\n    user_id?: Uuid | null;\n  }): Promise<RecordsResult<Array<{ resource_id: Uuid }>>>;\n  /** VIS-32. Bind a record or a view to a public address with a declared render mode. */\n  publishBindingCreate(args: {\n    slug: string;\n    resourceType: string;\n    resource_id: Uuid;\n    renderMode?: string;\n  }): Promise<RecordsResult<PublishBinding>>;\n  publishBindingRevoke(args: { slug: string }): Promise<RecordsResult<unknown>>;\n  /** What a SIGNED-OUT visitor resolves. Empty for an invented, revoked or unpublished address. */\n  resolvePublishBinding(args: { slug: string }): Promise<RecordsResult<ResolvedPublishBinding[]>>;\n  /** The same resolution plus what the address holds (table | record | dashboard | page | view). */\n  resolvePublishBindingKind(args: { slug: string }): Promise<RecordsResult<ResolvedPublishBindingKind[]>>;\n  /** D-15. The ONE sentence admitting nothing was scanned, so four surfaces cannot drift. */\n  worldPublishGapNotice(): Promise<RecordsResult<string>>;\n  /** Put a resource in the world lane. Refuses by name while the lane is closed. */\n  publishToWorld(args: {\n    resourceType: string;\n    resource_id: Uuid;\n    discoverable?: boolean;\n  }): Promise<RecordsResult<unknown>>;\n  /**\n   * Declare a Rule. It is NOT `recordWrite` into the rule kernel, and that is\n   * the whole point: `custom.record_write` inserts `data_class = 'record'`, so a\n   * document written that way is not a Rule and the store's own rule doors\n   * (`custom.rule_members`, `custom.agg_subscriptions`) never see it. Writing\n   * one through the record door and calling it a Rule would be a silent\n   * failure — a screen that looked like it had subscribed you to something.\n   */\n  ruleDeclare(args: { spec: Record<string, unknown>; rule_id?: Uuid | null }): Promise<RecordsResult<Uuid>>;\n  fieldPropose(proposal: FieldProposal): Promise<RecordsResult<never>>;\n  tablePropose(proposal: TableProposal): Promise<RecordsResult<never>>;\n\n  // ── promotion (REC-5) ────────────────────────────────────────────────────\n  promoteTable(args: { table_id: Uuid }): Promise<RecordsResult<unknown>>;\n  promoteField(args: { table_id: Uuid; field_id: Uuid }): Promise<RecordsResult<unknown>>;\n\n  /**\n   * @deprecated The record store is never off (owner ruling, 2026-10-03: everything is on by\n   * default). This answers `true` whenever the door answers; a refusal means the store could not\n   * be reached, never that it is off. Do not gate a screen on it.\n   */\n  storeIsOpen(): Promise<RecordsResult<boolean>>;\n  /**\n   * WHAT THIS PERSON MAY DO TO THESE THINGS — asked once, for a whole page.\n   *\n   * There is no principal argument, on purpose: the door resolves the caller\n   * from the session, so a person can ask about their OWN access and about\n   * nobody else's. A subject they hold nothing on answers `level: null`, which\n   * is an answer; the row is never omitted, because a screen that could not\n   * tell \"no access\" from \"not asked yet\" would draw one of them as the other.\n   */\n  myLevels(args: { ids: Uuid[]; subject?: \"record\" }): Promise<RecordsResult<MyLevel[]>>;\n\n  // ── THE GRID (lane GRID-PRIMITIVES) — see ../grid.ts for every shape ─────\n  /** G1. Write ONE leaf of a Table's colors, or clear it with `null`. Editor on the Table. */\n  tableDecorate(args: { table_id: Uuid; path: DecorationPath; value: unknown }): Promise<RecordsResult<TableDecorations>>;\n  /** G1. A Table's colors as a screen paints them, with what went stale named. */\n  tableDecorations(args: { table_id: Uuid }): Promise<RecordsResult<TableDecorations>>;\n  /** G1. The layout a grid opens with: platform → organization knob → the view's own. */\n  gridLayout(args: { table_id: Uuid; view_id?: Uuid | null }): Promise<RecordsResult<GridLayout>>;\n  /** G3. The older grid's formula text → the store's expression. Never refuses a typo: answers ok:false. */\n  formulaParse(args: { table_id: Uuid; text: string }): Promise<RecordsResult<FormulaParse>>;\n  /**\n   * NOTION-PROPS. The formula being typed, parsed AND worked out for one record of the table\n   * (`custom.formula_preview`): the parse, plus `value` — what a saved formula column would show on\n   * that record — or `error` when it parses and cannot be worked out there. Writes nothing.\n   */\n  formulaPreview(args: { table_id: Uuid; record_id: Uuid | null; text: string }): Promise<RecordsResult<FormulaPreview>>;\n  /** G2. Declare a Table's row actions — the whole list. Editor on the Table. */\n  actionDeclare(args: { table_id: Uuid; actions: RowAction[] }): Promise<RecordsResult<RowAction[]>>;\n  /** G2. A Table's row actions, each saying whether it can run here. */\n  rowActions(args: { table_id: Uuid }): Promise<RecordsResult<{ actions: RowAction[]; stale: unknown[] }>>;\n  /**\n   * G2. Run one action on a selection, in ONE transaction. A refusal changed NOTHING; read\n   * every record and field that refused with `actionRefusals(result.error)`.\n   */\n  actionRun(args: { action_id: Uuid; record_ids: Uuid[] }): Promise<RecordsResult<ActionRunResult>>;\n  /**\n   * AUTOMATION-DOOR. Declare (or, with `automation_id`, replace) one automation on a Table — editor on the Table.\n   * A spec the store refuses comes back as `data.ok === false` with `_errors`, one sentence per path.\n   */\n  automationDeclare(args: { table_id: Uuid; spec: AutomationSpec; automation_id?: Uuid | null }): Promise<RecordsResult<AutomationDeclared>>;\n  /** AUTOMATION-DOOR. A Table's automations with their last run; archived ones only when asked. */\n  automations(args: { table_id: Uuid; include_archived?: boolean }): Promise<RecordsResult<AutomationList>>;\n  /** AUTOMATION-DOOR. Archive one (it switches off and keeps its history). Editor on the Table. */\n  automationArchive(args: { automation_id: Uuid }): Promise<RecordsResult<AutomationFlipped>>;\n  /** AUTOMATION-DOOR. Bring an archived one back (it stays off until `automationSetEnabled`). */\n  automationRestore(args: { automation_id: Uuid }): Promise<RecordsResult<AutomationFlipped>>;\n  /** AUTOMATION-DOOR. Switch one on or off. */\n  automationSetEnabled(args: { automation_id: Uuid; enabled: boolean }): Promise<RecordsResult<AutomationFlipped>>;\n  /** AUTOMATION-DOOR. Run history, newest first: status, the store's own sentence, every step. */\n  automationRuns(args: { automation_id: Uuid; limit?: number; cursor?: string | null }): Promise<RecordsResult<AutomationRuns>>;\n  /**\n   * AUTOMATIONS-AIRTABLE. Test an automation now (Airtable's \"Run test\"): its steps run once on `record_id` (none for\n   * a schedule), switched on or not, and the run lands in its history as `trigger.on = \"test\"`. Editor on the Table.\n   */\n  automationTest(args: { automation_id: Uuid; record_id?: Uuid | null }): Promise<RecordsResult<AutomationTested>>;\n  /** AT-AUTO2. Every saved version of an automation, newest first. */\n  automationRevisions(args: { automation_id: Uuid }): Promise<RecordsResult<AutomationRevisions>>;\n  /** AT-AUTO2. Restore one version: one more save through automation_declare (admin on the table). */\n  automationRevisionRestore(args: { automation_id: Uuid; revision_id: Uuid }): Promise<RecordsResult<AutomationDeclared>>;\n  /** G4. Send every change to this Table's records to an https webhook. Admin. The secret is shown once. */\n  tableWebhookDeclare(args: {\n    table_id: Uuid;\n    target_url: string;\n    events?: RecordEvent[] | null;\n    description?: string | null;\n  }): Promise<RecordsResult<TableWebhookDeclared>>;\n  /** G4. The webhooks a Table sends to, with their delivery health — never the secret. */\n  tableWebhooks(args: { table_id: Uuid }): Promise<RecordsResult<TableWebhook[]>>;\n  /** G4. Switch one off. It is never deleted. */\n  tableWebhookArchive(args: { webhook_id: Uuid }): Promise<RecordsResult<boolean>>;\n  /** G5. Number the records an autonumber column found already there, in creation order. */\n  autonumberBackfill(args: { field_id: Uuid }): Promise<RecordsResult<{ numbered: number; highest: number | null; says: string }>>;\n  /**\n   * AT-SHARE-B. A Person column's \"Notify people when they're added\" switch (`custom.field_notify_on_assign`).\n   * `on: null` only READS whether it is on; `true` declares the column's two notify automations (edited, new\n   * record), `false` archives them. Turning it on or off asks to change the table's structure.\n   */\n  fieldNotifyOnAssign(args: { field_id: Uuid; on: boolean | null }): Promise<RecordsResult<FieldNotifyOnAssign>>;\n  /**\n   * NOTION-PROPS-3. PRESS A BUTTON COLUMN ON ONE ROW (`custom.button_press`): a link comes back filled from\n   * the row for the screen to open; a row action or an automation runs in the store and its result comes\n   * back. A button with nothing set up is refused by name (22023).\n   */\n  buttonPress(args: { record_id: Uuid; field_id: Uuid }): Promise<RecordsResult<ButtonPressed>>;\n  /**\n   * NOTION-PROPS-3. The knob `data/timeline_dependency_shift` for the signed-in person in this organization:\n   * whether moving a record on a timeline moves the records waiting on it (default true).\n   */\n  timelineDependencyShift(): Promise<RecordsResult<boolean>>;\n  /**\n   * FB5 (ADV-5 F4/F10): the record store's screen limits for the signed-in person in this organization, each a\n   * knob (`custom.records_limits`): the AI column fill's try size, one fill's row cap and the Fill box's start, and\n   * a table copy's stall bound. Asked once per client; a store without the door answers the knobs' defaults.\n   */\n  recordsLimits(): Promise<RecordsLimits>;\n  /** G5. One page of the export door — exactly the rows and columns the read door serves this person. */\n  ioExport(args: { table_id: Uuid; columns?: string[] | null; limit?: number }): Promise<RecordsResult<IoExportPage>>;\n  /** G5. That page as an .xlsx; a withheld column is named on its own sheet. */\n  /**\n   * G9. Every table a picker may offer here, from BOTH stores, each saying which store opens it.\n   * A table the app keeps out of default lists (`custom.table_kept_out_of_lists`: an agent's\n   * outputs) is left out unless `include_platform_tables` is true — the \"Show platform tables\" switch.\n   */\n  tableListEverywhere(args?: { include_platform_tables?: boolean }): Promise<RecordsResult<{ success: boolean; tables: TableListEntry[] }>>;\n  /**\n   * Every table the person reaches (`custom.data_home_tables`), as the data home lists them.\n   * `organization_id` names one organization; `null` asks for every organization the person\n   * reaches — never the client's bound organization by default. A table the app keeps out of\n   * default lists (an agent's outputs) is answered only with `include_platform_tables: true`.\n   */\n  dataHomeTables(args: { organization_id: Uuid | null; include_platform_tables?: boolean }): Promise<RecordsResult<DataHomeTable[]>>;\n  /**\n   * Every table of EVERY organization (`custom.admin_all_tables`) — the admin section's list. The\n   * store's walls admit a platform admin to system organizations only, so this is a separate door that\n   * answers only on the admin lane for a platform admin; anyone else gets a refusal, not an empty list.\n   */\n  adminAllTables(): Promise<RecordsResult<AdminTable[]>>;\n  /**\n   * G10. Refresh a synced source (a sheet tab) into ONE Table under `home_id`: new rows added,\n   * changed rows updated, rows the source dropped archived — never destroyed; columns the\n   * person added in Matrx survive. Build the spec with `sheetSyncSpec`.\n   */\n  tableSync(args: { home_id: Uuid; spec: TableSyncSpec }): Promise<RecordsResult<TableSyncResult>>;\n  /** Lane SYNC-AIRTABLE: a table synced from another table's view, in the active organization. */\n  tableCopySync(spec: TableCopySpec): Promise<RecordsResult<TableSyncAnswer>>;\n  /** Lane SYNC-AIRTABLE: auto-refresh / write-back of one synced table (editor of it). */\n  tableSyncSettingsSet(args: { table_id: Uuid; settings: TableSyncSettings }): Promise<RecordsResult<TableSyncSourceDocument>>;\n  /**\n   * G11. The record-store Table a context scope's template-bound item provisions — one per item\n   * and scope. A scope provisioned before the move answers with its moved Table (same id); the\n   * Home defaults to the organization's own.\n   */\n  scopeTableProvision(args: { item_id: Uuid; scope_id: Uuid; home_id?: Uuid | null }): Promise<RecordsResult<Uuid>>;\n  /** G12. The rows of each Table this reader may see, in one call (fold with `withRowCounts`). A Table she may not know gets no row. */\n  tableRowCounts(args: { table_ids: Uuid[] }): Promise<RecordsResult<TableRowCount[]>>;\n  /** G12. Each live record's own header (created, updated, version) that the read door does not answer. */\n  recordHeaders(args: { ids: Uuid[] }): Promise<RecordsResult<RecordHeader[]>>;\n  /**\n   * G14. Share a Table with a person by email or account id: an existing account outside the\n   * organization is granted at once and notified (never made a member); an address with no\n   * account is invited. The organization's outside-sharing setting decides first.\n   */\n  tableShareOutsideGrant(args: { table_id: Uuid; person: string; level?: \"viewer\" | \"commenter\" | \"editor\" | \"admin\" }): Promise<RecordsResult<OutsideShareAnswer>>;\n  /** G13. Keep a hand-set order on a saved view: the named rows first, in this order (build it with `moveInOrder`). */\n  viewRecordOrderSet(args: { view_id: Uuid; record_ids: Uuid[] }): Promise<RecordsResult<ViewOrderSet>>;\n  /**\n   * G13 + ORDER-FILTER. A page of a hand-ordered view: placed rows by position, then the rest by\n   * created time. `filter` is the list door's question (`StoreFilter`: a flat map or a nested\n   * Rule — the view's own `where`, or a number clicked on a dashboard); given, the store reads\n   * exactly the rows that match, in their places, and `limit`/`offset` page THAT order. Each row\n   * answers the position stored for it; rows the filter hides keep theirs.\n   */\n  readInViewOrder(args: { view_id: Uuid; filter?: StoreFilter | null | undefined; limit?: number; offset?: number }): Promise<RecordsResult<Array<ReadRow & { position: number | null }>>>;\n  exportXlsx(args: {\n    table_id: Uuid;\n    columns?: string[] | null;\n    limit?: number;\n    labels?: Record<string, string>;\n    sheetLabel?: string;\n  }): Promise<RecordsResult<Uint8Array>>;\n}\n\n/** One Table's two lane facts, as `custom.table_facts` answers them. */\nexport interface TableFact {\n  table_id: Uuid;\n  /**\n   * The old lane word (personal · internal · public), now worked out by the store from `shown_to`\n   * and `published_to_web` (access ladder). Read those two; this stays for older stores.\n   */\n  visibility: string;\n  /** Whether the person signed in MADE this Table. Never who did. */\n  mine: boolean;\n  /** Access ladder \"Shown to\": only_me · my_team · everyone · everyone_on_ai_matrx; null = the default. */\n  shown_to?: string | null;\n  /** Access ladder \"Published to the web\": the only way anyone outside the organization opens it. */\n  published_to_web?: boolean;\n}\n\n/**\n * WHERE A TABLE IS CURRENTLY READ AND WRITTEN during the older-table cutover.\n * `tableHome` is an address read from one Table record; this applies the\n * organization's migration switch to a batch of ids, including same-id copies.\n */\nexport interface TableLiveLocation {\n  table_id: Uuid;\n  lives_in: \"record\" | \"older\";\n  why: string | null;\n}\n\n/**\n * The facts folded onto a table list: `visibility` on every Table the facts name,\n * `created_by` ONLY as the caller's own id and only on the Tables the caller made.\n * Pure — returns new objects and leaves the list it was given alone.\n */\n/** Carries the offline data source's \"not sent yet\" mark from a read row (see `ReadRow.waiting`). */\nfunction waitingMark(row: unknown): { waiting?: true } {\n  return (row as { waiting?: unknown } | null)?.waiting === true ? { waiting: true } : {};\n}\n\nexport function withTableFacts<T extends { id: Uuid }>(\n  tables: readonly T[],\n  facts: readonly TableFact[] | null | undefined,\n  me: Uuid | null | undefined,\n): T[] {\n  if (!facts) return [...tables];\n  const byId = new Map(facts.map((f) => [f.table_id, f]));\n  return tables.map((table) => {\n    const fact = byId.get(table.id);\n    if (!fact) return table;\n    return {\n      ...table,\n      visibility: fact.visibility,\n      ...(fact.shown_to !== undefined ? { shown_to: fact.shown_to } : {}),\n      ...(fact.published_to_web !== undefined ? { published_to_web: fact.published_to_web } : {}),\n      ...(fact.mine && me ? { created_by: me } : {}),\n    };\n  });\n}\n\n\n/** How many Table-kernel records `tableList` asks for per page (the read door's own ceiling). */\nconst TABLE_LIST_PAGE = 500;\n/**\n * How many records one `custom.table_archive` pass takes on by default — see the measurement in\n * `tableArchive`. A screen loop starts here and halves on a statement timeout.\n */\nexport const TABLE_ARCHIVE_PASS = 20;\n/** Rows one `custom.table_restore` pass takes on by default (the door also stops itself at 1 s). */\nexport const TABLE_RESTORE_PASS = 20;\n/** The smallest pass the restore loop halves down to on a statement timeout. */\nconst TABLE_RESTORE_MIN_PASS = 1;\n/** A restore loop that has not finished after this many passes stops and says so. */\nconst TABLE_RESTORE_MAX_PASSES = 500;\n/**\n * A copy whose passes move nothing (answers \"busy\", or the same counts at the same step) this many\n * times in a row stops and says so, naming the half copy — never \"Copying…\" for hours (FIX-SNAP2).\n */\nexport const COPY_STALL_PASSES = 20;\n\n/** The record store's screen limits (`recordsLimits`), each a knob in `platform.feature_knob`. */\nexport interface RecordsLimits {\n  /** A fill of at most this many rows runs at once; a bigger one meets the confirm step (knob custom/ai_fill_try_max). */\n  aiFillTryMax: number;\n  /** The most rows one fill covers (knob custom/ai_fill_rows_max). */\n  aiFillRowsMax: number;\n  /** The number the \"Fill N rows\" box starts at (knob custom/ai_fill_default_rows). */\n  aiFillDefaultRows: number;\n  /** Passes a table copy may make without moving before it stops (knob custom/copy_stall_passes). */\n  copyStallPasses: number;\n  /**\n   * The highest sensitivity an AI fill may read (knob custom/enrichment_sensitivity_ceiling): public, internal,\n   * restricted or confidential. custom.enrich_due drops anything above it; screens default an AI column's inputs by it.\n   */\n  enrichmentSensitivityCeiling: string;\n}\n\n/**\n * The knobs' own defaults (the values their rows were seeded with), answered only by a store that has no\n * `records_limits` door (the in-memory sample, an older store) or refuses it — never in place of a knob the door read.\n */\nexport const RECORDS_LIMITS_DEFAULTS: Readonly<RecordsLimits> = Object.freeze({\n  aiFillTryMax: 10,\n  aiFillRowsMax: 50,\n  aiFillDefaultRows: 3,\n  copyStallPasses: COPY_STALL_PASSES,\n  enrichmentSensitivityCeiling: \"internal\",\n});\n\n/** The door's answer as limits: each a whole number, else the knob's default for that one. */\nexport function recordsLimitsFrom(raw: unknown): RecordsLimits {\n  const o = raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n  const whole = (v: unknown, fallback: number, min: number): number => {\n    const n = typeof v === \"number\" ? v : Number(v);\n    return Number.isFinite(n) && n >= min ? Math.floor(n) : fallback;\n  };\n  return {\n    aiFillTryMax: whole(o.ai_fill_try_max, RECORDS_LIMITS_DEFAULTS.aiFillTryMax, 0),\n    aiFillRowsMax: whole(o.ai_fill_rows_max, RECORDS_LIMITS_DEFAULTS.aiFillRowsMax, 1),\n    aiFillDefaultRows: whole(o.ai_fill_default_rows, RECORDS_LIMITS_DEFAULTS.aiFillDefaultRows, 1),\n    copyStallPasses: whole(o.copy_stall_passes, RECORDS_LIMITS_DEFAULTS.copyStallPasses, 1),\n    enrichmentSensitivityCeiling:\n      typeof o.enrichment_sensitivity_ceiling === \"string\" && o.enrichment_sensitivity_ceiling.trim()\n        ? o.enrichment_sensitivity_ceiling.trim().toLowerCase()\n        : RECORDS_LIMITS_DEFAULTS.enrichmentSensitivityCeiling,\n  };\n}\n\n/** The surface every record-store saved view is kept under (`custom.view_declare` writes it). */\nconst SAVED_VIEW_SURFACE = \"custom/records\";\n\n/** `custom.table_kept_out_of_lists`: the placement words the set door `custom.data_home_tables` leaves out by default. */\nconst DATA_HOME_KEPT_OUT_OF_LISTS: ReadonlySet<string> = new Set([\"agent_output\", \"copying\"]);\n\nexport function createRecordsClient(given: RecordsConfig): RecordsClient {\n  // THE README IS TRUE: `dataSource: supabase` (a plain supabase-js client) is bound here, once,\n  // so every door is asked in its own schema instead of PostgREST's `public` (supabase.ts).\n  const config: RecordsConfig = { ...given, dataSource: asRecordsDataSource(given.dataSource) };\n  const schema = config.schema ?? DEFAULT_SCHEMA;\n  const org = config.organizationId;\n  const ledger = config.opLedger ?? defaultOpLedger;\n  const mintOp = (): Uuid => ledger.mint();\n  const scream = recordsErrorSink(config.onError);\n  // FB5: the screen limits (knobs), asked once for the life of this client.\n  let limitsAsked: Promise<RecordsLimits> | null = null;\n  const askLimits = (): Promise<RecordsLimits> => {\n    limitsAsked ??= callDoor<unknown>(DOORS.recordsLimits, { p_organization_id: org }, \"recordsLimits\").then(\n      (result) => (result.ok ? recordsLimitsFrom(result.data) : { ...RECORDS_LIMITS_DEFAULTS }),\n      () => ({ ...RECORDS_LIMITS_DEFAULTS }),\n    );\n    return limitsAsked;\n  };\n\n  // ---------------------------------------------------------------------------------------------\n  // PAGE-BUNDLE (lane PAGE-BUNDLE, 2026-10-07). A TABLE PAGE OPENS IN ONE CALL, NOT FIFTEEN.\n  //\n  // THE USE CASE: Dr. Patel's front desk opens \"Visits\". The page asked the store for its table row,\n  // fields, views, look, decorations, row actions, reverse columns, layout, level and recent imports\n  // in three waves, one waiting on the one before (measured on production: 3 round trips, ~1.5 s of\n  // doors one after another). `custom.table_page_bundle` answers all of them in one call.\n  //\n  // HOW IT STAYS THE SAME: the bundle holds each door's OWN answer under the door's name and exact\n  // arguments. A caller still asks its door — `callDoor` serves that answer from the bundle, once,\n  // only when the name and every argument match what the bundle asked, and otherwise asks the door\n  // as it always did. So every mapping, mask, refusal and cache above this line is untouched.\n  //\n  // WHEN: only for a data source that says it opens in one call (`opensInOneCall`: the real\n  // supabase adapters), and only when `applicable_fields` or another shape door of a Table is the\n  // FIRST thing asked about it. A refusal inside the bundle, a door the store lacks, a bundle that\n  // fails: each is a miss, and the door is asked itself — a bundle never turns a refusal into \"empty\".\n  // An answer is used once and forgotten after BUNDLE_TTL_MS; a structure change drops the Table's.\n  // ---------------------------------------------------------------------------------------------\n  const BUNDLE_TTL_MS = 10_000;\n  const BUNDLE_OPENERS = new Set([\"applicable_fields\", \"views\", \"view_look_read\", \"table_decorations\", \"row_actions\", \"reverse_columns\", \"record_change_actions\", \"grid_layout\", \"io_imports\"]);\n  const bundleParts = new Map<string, { data: unknown; at: number }>();\n  const bundleFlights = new Map<string, Promise<void>>();\n  const bundleAsked = new Map<string, number>();\n  let bundleKernel: string | null = null;\n  const bundleKey = (door: string, args: Record<string, unknown>): string => `${door}|${canonicalArgs(args)}`;\n\n  function bundleTableOf(door: string, args: Record<string, unknown>): string | null {\n    const t = args[\"p_table_id\"];\n    if (door === \"read_records_by_ids\") {\n      const ids = args[\"p_record_ids\"];\n      return typeof t === \"string\" && t === bundleKernel && Array.isArray(ids) && ids.length === 1 && typeof ids[0] === \"string\" ? (ids[0] as string) : null;\n    }\n    if (door === \"my_levels\") {\n      const ids = args[\"p_ids\"];\n      return args[\"p_type\"] === \"record\" && Array.isArray(ids) && ids.length === 1 && typeof ids[0] === \"string\" ? (ids[0] as string) : null;\n    }\n    return typeof t === \"string\" ? t : null;\n  }\n\n  async function fillBundle(tableId: string, viewId: unknown): Promise<void> {\n    try {\n      const view = typeof viewId === \"string\" ? viewId : null;\n      type BundleAnswer = { parts?: Array<{ door: string; args: Record<string, unknown>; data?: unknown; error?: string }> } | null;\n      const usable = (r: { data: unknown; error: unknown } | null): r is { data: BundleAnswer; error: null } =>\n        r !== null && !r.error && r.data !== null && typeof r.data === \"object\" && Array.isArray((r.data as { parts?: unknown }).parts);\n      // PAGE-BUNDLE-2: the server render may already have asked this bundle as the same person.\n      const primedAnswer = takePrimedTablePageBundle(org, tableId, view);\n      let response: { data: unknown; error: unknown } | null = primedAnswer ? await primedAnswer : null;\n      if (!usable(response)) {\n        response = await config.dataSource.rpc(\n          \"table_page_bundle\",\n          { p_organization_id: org, p_table_id: tableId, p_view_id: view },\n          { schema },\n        );\n      }\n      if (!usable(response)) return;\n      const answer = response.data;\n      if (!answer || !Array.isArray(answer.parts)) return;\n      const now = Date.now();\n      for (const part of answer.parts) {\n        if (part.error !== undefined || part.data === undefined) continue; // a refusing part is asked by its own door\n        if (part.door === \"table_kernel_id\" && typeof part.data === \"string\") bundleKernel = part.data;\n        bundleParts.set(bundleKey(part.door, part.args), { data: part.data, at: now });\n      }\n    } catch {\n      // a bundle that cannot be asked is a miss for every part: the doors are asked themselves\n    }\n  }\n\n  // ---------------------------------------------------------------------------------------------\n  // PAGE-BUNDLE-2: A RECORD PAGE OPENS IN ONE CALL TOO. `custom.record_page_bundle(org, record)` answers\n  // the record page's own doors (the record, its row controls, the caller's level, history head,\n  // comment thread, computed provenance, header) the same way: each part the door's own answer under\n  // its exact arguments, used once, only on an exact match; a refusing part is asked by its own door.\n  // A write that lands on the record drops whatever of its bundle is still held.\n  // ---------------------------------------------------------------------------------------------\n  const RECORD_OPENERS = new Set([\"read_record\", \"record_row_controls\", \"record_history\", \"comment_thread\", \"computed_provenance\"]);\n  const recordFlights = new Map<string, Promise<void>>();\n  const recordAsked = new Map<string, number>();\n  let recordChangesHeard = false;\n\n  function bundleRecordOf(door: string, args: Record<string, unknown>): string | null {\n    if (RECORD_OPENERS.has(door)) return typeof args[\"p_record_id\"] === \"string\" ? (args[\"p_record_id\"] as string) : null;\n    const ids = args[\"p_ids\"];\n    const one = Array.isArray(ids) && ids.length === 1 && typeof ids[0] === \"string\" ? (ids[0] as string) : null;\n    if (door === \"record_headers\") return one;\n    if (door === \"my_levels\" && args[\"p_type\"] === \"record\") return one;\n    return null;\n  }\n\n  async function fillRecordBundle(recordId: string): Promise<void> {\n    if (!recordChangesHeard) {\n      recordChangesHeard = true;\n      onRecordChanged((changed) => {\n        recordAsked.delete(changed);\n        for (const key of [...bundleParts.keys()]) if (key.includes(changed)) bundleParts.delete(key);\n      });\n    }\n    try {\n      const usable = (r: { data: unknown; error: unknown } | null): boolean =>\n        r !== null && !r.error && r.data !== null && typeof r.data === \"object\" && Array.isArray((r.data as { parts?: unknown }).parts);\n      const primedAnswer = takePrimedTablePageBundle(org, `record:${recordId}`, null);\n      let response: { data: unknown; error: unknown } | null = primedAnswer ? await primedAnswer : null;\n      if (!usable(response)) {\n        response = await config.dataSource.rpc(\"record_page_bundle\", { p_organization_id: org, p_record_id: recordId }, { schema });\n      }\n      if (!usable(response)) return;\n      const now = Date.now();\n      for (const part of (response!.data as { parts: Array<{ door: string; args: Record<string, unknown>; data?: unknown; error?: string }> }).parts) {\n        if (part.error !== undefined || part.data === undefined) continue;\n        bundleParts.set(bundleKey(part.door, part.args), { data: part.data, at: now });\n      }\n    } catch {\n      // a bundle that cannot be asked is a miss for every part: the doors are asked themselves\n    }\n  }\n\n  /** The record bundle's answer to this exact call, once — or undefined when this is not a record page door. */\n  async function fromRecordBundle(door: string, args: Record<string, unknown>): Promise<{ data: unknown } | null | undefined> {\n    if (!doorReady(config, \"record_page_bundle\")) return undefined;\n    const recordId = bundleRecordOf(door, args);\n    if (!recordId) return undefined;\n    const opener = RECORD_OPENERS.has(door);\n    if (!opener && !recordFlights.has(recordId) && !recordAsked.has(recordId)) return undefined;\n    const asked = recordAsked.get(recordId);\n    const fresh = asked !== undefined && Date.now() - asked < BUNDLE_TTL_MS;\n    if (!fresh && opener) {\n      recordAsked.set(recordId, Date.now());\n      const flight = fillRecordBundle(recordId).finally(() => recordFlights.delete(recordId));\n      recordFlights.set(recordId, flight);\n    }\n    const flight = recordFlights.get(recordId);\n    if (flight) await flight;\n    const key = bundleKey(door, args);\n    const held = bundleParts.get(key);\n    if (!held) return opener ? null : undefined;\n    bundleParts.delete(key);\n    return Date.now() - held.at < BUNDLE_TTL_MS ? { data: held.data } : null;\n  }\n\n  /** The bundle's answer to this exact call, once — or null, and the door is asked. */\n  async function fromBundle(door: string, args: Record<string, unknown>): Promise<{ data: unknown } | null> {\n    if (!config.dataSource.opensInOneCall) return null;\n    const fromRecord = await fromRecordBundle(door, args);\n    if (fromRecord !== undefined) return fromRecord;\n    if (!doorReady(config, \"table_page_bundle\")) return null;\n    const tableId = bundleTableOf(door, args);\n    if (tableId) {\n      const asked = bundleAsked.get(tableId);\n      const fresh = asked !== undefined && Date.now() - asked < BUNDLE_TTL_MS;\n      if (!fresh && BUNDLE_OPENERS.has(door)) {\n        bundleAsked.set(tableId, Date.now());\n        const flight = fillBundle(tableId, door === \"grid_layout\" ? args[\"p_view_id\"] : null).finally(() => bundleFlights.delete(tableId));\n        bundleFlights.set(tableId, flight);\n      }\n      const flight = bundleFlights.get(tableId);\n      if (flight) await flight;\n    } else if (door === \"table_kernel_id\") {\n      // The Table kernel is one id for the whole store. Asked in the same moment as the Table's first\n      // shape door, it waits for that bundle (one tick, so the opener has started); once any bundle\n      // has told it, it is never asked again.\n      if (bundleKernel === null) {\n        await new Promise((resolve) => setTimeout(resolve, 0));\n        await Promise.all([...bundleFlights.values()]);\n      }\n      return bundleKernel === null ? null : { data: bundleKernel };\n    } else {\n      return null;\n    }\n    const key = bundleKey(door, args);\n    const held = bundleParts.get(key);\n    if (!held) return null;\n    bundleParts.delete(key);\n    return Date.now() - held.at < BUNDLE_TTL_MS ? { data: held.data } : null;\n  }\n\n  function bundleDrop(tableId: string | null): void {\n    if (tableId === null) {\n      bundleParts.clear();\n      bundleAsked.clear();\n      return;\n    }\n    bundleAsked.delete(tableId);\n    for (const key of [...bundleParts.keys()]) if (key.includes(tableId)) bundleParts.delete(key);\n  }\n\n  const primedFor = primedDoorAnswer;\n\n  // THE ONE DOOR CALL (./doorCall), with what only this client has handed in: the page bundle and the\n  // generated door catalog.\n  const callDoor: DoorCall = createDoorCall({\n    dataSource: config.dataSource,\n    schema,\n    onError: scream,\n    doorReady: (door) => doorReady(config, door),\n    absent: doorAbsent,\n    held: fromBundle,\n    wrote: (_door, args) => {\n      const tableId = args[\"p_table_id\"];\n      bundleDrop(typeof tableId === \"string\" ? tableId : null);\n    },\n  });\n  const scopes: ScopeDoors = createScopeDoors(callDoor);\n\n  /**\n   * A STRUCTURE DOOR ANSWERED YES: the Table's shape moved, so every `table:<uuid>` card on this\n   * page re-reads its kind facts (KINDS-GLUE wave 3 §1.4). `null` = the door was addressed by a\n   * Field id and did not name the Table; listeners refresh every Table they hold.\n   */\n  let personKernelOnce: Uuid | null = null;\n\n  /** `allow_other` is a choice list's own setting and the store keeps it in the column's config (STORE-RULE-GAPS). */\n  function fieldDoorSpec(spec: NewFieldDeclaration): Record<string, unknown> {\n    const { allow_other, ...rest } = spec;\n    return allow_other === undefined ? rest : { ...rest, config: { ...(rest.config ?? {}), allow_other } };\n  }\n\n  function structureMoved<T>(tableId: Uuid | null, result: RecordsResult<T>): RecordsResult<T> {\n    if (result.ok) {\n      bundleDrop(tableId);\n      announceTableStructureChanged(tableId);\n    }\n    return result;\n  }\n\n  /**\n   * A DOOR THIS PACKAGE CALLS BEFORE THE MAIN DATABASE HAS IT (lane PLATFORM-APP-DATA).\n   *\n   * `callDoor` refuses a door the generated catalog does not list without asking anybody —\n   * right for a door nobody has built, wrong for one that is proven on the nightly clone and\n   * waiting for the chair's apply: the clone could never be tested through this package. So an\n   * OWED door is asked, and a store that answers \"no such function\" (PostgREST's PGRST202 or\n   * Postgres's 42883) is answered `door_absent` naming the file that owes it — the same refusal,\n   * the same sentence, with nothing read and nothing written. Once `pnpm records:generate` lists\n   * the door this is exactly `callDoor`.\n   */\n  async function owedDoor<T>(\n    door: string,\n    args: Record<string, unknown>,\n    where: string,\n  ): Promise<RecordsResult<T>> {\n    if (doorExists(door)) return callDoor<T>(door, args, where);\n    const primed = primedFor(door, args);\n    if (primed) return ok(primed.data as T);\n    const response = await config.dataSource.rpc(door, args, { schema });\n    if (response.error) {\n      const code = (response.error as { code?: string }).code;\n      const refusal =\n        code === \"PGRST202\" || code === \"42883\" ? doorAbsent(door) : mapPgError(response.error, where);\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where });\n      return err(refusal);\n    }\n    return ok(response.data as T);\n  }\n\n  /**\n   * THE COPY'S LOOP (lane TABLE-ACTIONS). Each pass is a few seconds of work on the store; this\n   * calls `custom.table_duplicate_continue` until the store says \"done\", reporting every pass.\n   * THE CALLER LOOPS, as with tableArchive: a pass that fails leaves a copy the next call (or\n   * `tableDuplicateContinue`) carries on from exactly where it stopped.\n   */\n  /** How long the copy loop waits when another pass of the same copy is running. */\n  const COPY_BUSY_WAIT_MS = 1000;\n\n  async function carryOnCopy(\n    answer: unknown,\n    onProgress?: (progress: TableDuplicateProgress) => void,\n  ): Promise<RecordsResult<TableDuplicated>> {\n    // The first door's header (`from`, `organization`): the carry-on door never repeats it, so it is\n    // kept here and laid under every later answer before that answer is read.\n    const first = answer && typeof answer === \"object\" ? (answer as Record<string, unknown>) : {};\n    const header: Record<string, unknown> = {};\n    if (first.from !== undefined) header.from = first.from;\n    if (first.organization !== undefined) header.organization = first.organization;\n    // A refusal AFTER the store made a copy names that copy in `detail.copyId`, so a caller that\n    // must not leave it in anyone's list (a snapshot, a base copy) can put it away.\n    const unreadable = (copyId: string | null): RecordsResult<TableDuplicated> => {\n      const refusal: RecordsError = {\n        code: \"not_supported\",\n        message: \"The record store answered the copy in a shape this client cannot read. Look in the table list before trying again.\",\n        ...(copyId ? { hint: `copy ${copyId}`, detail: { copyId } } : {}),\n      };\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where: \"tableDuplicate\" });\n      return err(refusal);\n    };\n    let current = answer;\n    let copyId: string | null = null;\n    // FB5: the bound is the knob custom/copy_stall_passes (default 20).\n    const stallPasses = (await askLimits()).copyStallPasses;\n    // THE STALL BOUND (live walk 2026-10-19, FIX-SNAP2): a pass that moved nothing — \"busy\", or the\n    // same counts at the same step — is counted; COPY_STALL_PASSES of them in a row stop the copy and\n    // say so, naming the half copy. The links step moves a cursor the counts do not show, so there a\n    // pass that did units is progress.\n    let lastMark: string | null = null;\n    let still = 0;\n    for (let pass = 0; pass < 10_000; pass += 1) {\n      const progress = parseTableDuplicateProgress(current);\n      if (!progress) return unreadable(copyId);\n      copyId = progress.tableId;\n      onProgress?.(progress);\n      const mark = JSON.stringify([progress.step, progress.choiceLists, progress.fields, progress.views, progress.records]);\n      const moved = progress.status !== \"busy\"\n        && (mark !== lastMark || (progress.step === \"links\" && (progress.pass?.units ?? 0) > 0));\n      if (progress.status !== \"busy\") lastMark = mark;\n      still = moved ? 0 : still + 1;\n      if (still >= stallPasses) {\n        const r = progress.records;\n        const at = r ? `${formatCount(r.done, { locale: \"en-US\" })} of ${formatCount(r.total, { locale: \"en-US\" })} rows` : `step ${progress.step || \"busy\"}`;\n        const refusal: RecordsError = {\n          code: \"internal\",\n          message: `The copy of ${progress.tableName} stopped moving at ${at} after ${stallPasses} passes, so it was stopped and not handed over.`,\n          hint: `copy ${progress.tableId}`,\n          detail: { copyId: progress.tableId, stalledAt: progress.step, passes: stallPasses },\n        };\n        scream({ code: refusal.code, message: refusal.message, hint: `copy ${progress.tableId}`, where: \"tableDuplicate\" });\n        return err(refusal);\n      }\n      if (progress.status === \"done\") {\n        const copied = parseTableDuplicated({ ...header, ...(current as Record<string, unknown>) });\n        return copied ? ok(copied) : unreadable(copyId);\n      }\n      if (progress.status === \"failed\" || progress.status === \"discarded\") {\n        // Not handed over: the store's sentence, and the copy's id so a screen can offer \"discard\".\n        const refusal: RecordsError = {\n          code: \"refused_by_rule\",\n          message: progress.sentence ?? \"This copy was stopped and not handed over.\",\n          hint: `copy ${progress.tableId}`,\n          detail: { copyId: progress.tableId },\n        };\n        scream({ code: refusal.code, message: refusal.message, where: \"tableDuplicate\" });\n        return err(refusal);\n      }\n      if (progress.status === \"busy\") {\n        // Another pass of this copy is running (another tab): wait, then ask again.\n        await new Promise((resolve) => setTimeout(resolve, COPY_BUSY_WAIT_MS));\n      }\n      const next = await owedDoor<unknown>(DOORS.tableDuplicateContinue, { p_table_id: progress.tableId }, \"tableDuplicate\");\n      if (!next.ok) {\n        const had = next.error.detail;\n        const detail = had && typeof had === \"object\" && !Array.isArray(had)\n          ? { ...(had as Record<string, unknown>), copyId: progress.tableId }\n          : had === undefined ? { copyId: progress.tableId } : { storeDetail: had, copyId: progress.tableId };\n        return err({ ...next.error, detail });\n      }\n      current = next.data;\n    }\n    return unreadable(copyId);\n  }\n\n  /**\n   * A PLATFORM DOOR IN `public` — the saved-view archive and the one restore door. Not the store's\n   * catalog (it reads `custom` only), so no census check; a missing door arrives as Postgres's own\n   * \"function not found\" through the same refusal funnel.\n   */\n  async function publicDoor<T>(\n    door: string,\n    args: Record<string, unknown>,\n    where: string,\n    schema = \"public\",\n  ): Promise<RecordsResult<T>> {\n    const response = await config.dataSource.rpc(door, args, { schema });\n    if (response.error) {\n      const refusal = mapPgError(response.error, where);\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where });\n      return err(refusal);\n    }\n    return ok(response.data as T);\n  }\n\n  /**\n   * A TRUST DOOR — `iam`'s, not the store's.\n   *\n   * There is no `doorExists` check here on purpose: the store's generated\n   * catalog reads `custom` and only `custom`, so a census of it says nothing\n   * true about `iam`. A trust door that is not there answers with Postgres's\n   * own `42883`, which arrives through the same refusal funnel carrying the\n   * name that was called — an honest \"no such function\", never an empty array\n   * standing in for \"there is nothing\".\n   */\n  async function trustDoor<T>(\n    door: string,\n    args: Record<string, unknown>,\n    where: string,\n  ): Promise<RecordsResult<T>> {\n    const response = await config.dataSource.rpc(door, args, { schema: TRUST_SCHEMA });\n    if (response.error) {\n      const refusal = mapPgError(response.error, where);\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where });\n      return err(refusal);\n    }\n    return ok(response.data as T);\n  }\n\n  /**\n   * A DOOR OF THE OLDER STORE — `workbench`'s, not this store's.\n   *\n   * Same reasoning as `trustDoor`: the generated catalog reads `custom` and\n   * only `custom`, so `doorExists` says nothing true about `workbench` and\n   * there is deliberately no census check here. A door that is not there\n   * arrives as Postgres's own `42883` through the same refusal funnel, carrying\n   * the name that was called — an honest \"no such function\", never an empty map\n   * standing in for \"these cells have no words\".\n   */\n  /**\n   * A DRILL DOOR — `platform`'s, not the store's (lane DRILL-STANDARD-DOOR).\n   *\n   * The one read contract answers a custom Table AND a standard table, so it lives beside the\n   * registry, not inside the record store; the generated catalog reads `custom` only and says\n   * nothing true about it, so there is no census check. A door not on the database yet arrives as\n   * PostgREST's own \"function not found\" through the same refusal funnel, naming what was called.\n   */\n  async function drillDoor<T>(\n    door: string,\n    args: Record<string, unknown>,\n    where: string,\n  ): Promise<RecordsResult<T>> {\n    const primed = primedFor(door, args);\n    if (primed) return ok(primed.data as T);\n    const response = await config.dataSource.rpc(door, args, { schema: DRILL_SCHEMA });\n    if (response.error) {\n      const refusal = mapPgError(response.error, where);\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where });\n      return err(refusal);\n    }\n    return ok(response.data as T);\n  }\n\n  /**\n   * The read door returns ONE masked document with the notices folded in under\n   * `_hidden` (`custom.mask_document`). A screen wants them apart: the values it\n   * draws, and the reasons it shows where a value is missing. This splits them\n   * and nothing else — it never decides what is hidden, it only reads what the\n   * store already decided.\n   */\n  // THE TABLE KERNEL'S ID IS A CONSTANT OF THE STORE, so it is asked once per client and every\n  // caller shares the one answer (and the one request while it is in flight). A failed answer\n  // is not remembered: the next caller asks again.\n  let kernelAsked: Promise<RecordsResult<Uuid>> | null = null;\n  function tableKernel(where: string): Promise<RecordsResult<Uuid>> {\n    kernelAsked ??= callDoor<Uuid>(DOORS.tableKernelId, {}, where).then((answer) => {\n      if (!answer.ok) kernelAsked = null;\n      return answer;\n    });\n    return kernelAsked;\n  }\n\n  function unfold(document: unknown): { document: RecordDocument; hidden: Record<string, HiddenFieldNotice> } {\n    const raw = (document ?? {}) as Record<string, unknown>;\n    const hidden = (raw._hidden ?? {}) as Record<string, HiddenFieldNotice>;\n    const values: RecordDocument = {};\n    for (const [key, value] of Object.entries(raw)) {\n      if (key === \"_hidden\") continue;\n      values[key] = value;\n    }\n    return { document: values, hidden };\n  }\n\n  async function readValues(recordId: Uuid): Promise<RecordsResult<ReadValue[]>> {\n    return callDoor<ReadValue[]>(\n      DOORS.recordValuesVersioned,\n      { p_organization_id: org, p_record_id: recordId },\n      \"recordRead\",\n    );\n  }\n\n  // ── READS SPAN EVERY ORGANIZATION; WRITES KEEP ONE ─────────────────────────\n  // (active-org-is-never-a-list-filter.md.) `org` is the write destination. A\n  // read asks each of the person's organizations through a sibling client bound\n  // to it, so every row keeps its own `organization_id`.\n  const readOrgs = (filter?: Uuid | null): Array<Uuid | null> => {\n    if (filter) return [filter];\n    const all = [...(org ? [org] : []), ...(config.organizationIds ?? [])];\n    const unique = [...new Set(all)];\n    return unique.length > 0 ? unique : [org];\n  };\n  const siblings = new Map<Uuid, RecordsClient>();\n  const clientFor = (target: Uuid | null): RecordsClient => {\n    if (target === org) return client;\n    const key = target as Uuid;\n    let sibling = siblings.get(key);\n    if (!sibling) {\n      sibling = createRecordsClient({ ...config, organizationId: target, organizationIds: [] });\n      siblings.set(key, sibling);\n    }\n    return sibling;\n  };\n  /** Where a record was last opened successfully — the next open goes straight there. */\n  const recordOrgs = new Map<Uuid, Uuid | null>();\n  async function acrossOrgs<T>(\n    filter: Uuid | null | undefined,\n    ask: (sub: RecordsClient) => Promise<RecordsResult<T>>,\n    merge: (parts: T[]) => T,\n  ): Promise<RecordsResult<T>> {\n    const targets = readOrgs(filter);\n    if (targets.length === 1) return ask(clientFor(targets[0] ?? null));\n    const answers = await Promise.all(targets.map((t) => ask(clientFor(t))));\n    const parts: T[] = [];\n    let firstError: RecordsError | null = null;\n    for (const a of answers) {\n      if (a.ok) parts.push(a.data);\n      else firstError ??= a.error;\n    }\n    // A refusal from one organization is already screamed by its door; only when\n    // NOTHING answered is the whole read a failure.\n    if (parts.length === 0 && firstError) return err(firstError);\n    return ok(merge(parts));\n  }\n  /** Open one record in ITS OWN organization: the one it was seen in, else the\n   *  page's, else each of the person's — first that answers wins. */\n  async function openInOwnOrg<T>(\n    recordId: Uuid,\n    filter: Uuid | null | undefined,\n    ask: (sub: RecordsClient) => Promise<RecordsResult<T>>,\n    found: (data: T) => boolean,\n  ): Promise<RecordsResult<T>> {\n    const known = recordOrgs.get(recordId);\n    const targets = filter\n      ? [filter]\n      : known !== undefined\n        ? [known, ...readOrgs().filter((t) => t !== known)]\n        : readOrgs();\n    let last: RecordsResult<T> | null = null;\n    for (const t of targets) {\n      const answer = await ask(clientFor(t));\n      if (answer.ok && found(answer.data)) {\n        recordOrgs.set(recordId, t);\n        return answer;\n      }\n      last ??= answer;\n    }\n    return last as RecordsResult<T>;\n  }\n\n  /** Does this client span organizations (a host set `organizationIds`, or the page filtered)? */\n  const spans = (filter?: Uuid | null): boolean => Boolean(filter) || (config.organizationIds?.length ?? 0) > 0;\n  /**\n   * STRUCTURE SEARCH IN ONE ORGANIZATION — what `metadataSearch` means (the server's\n   * `RecordStore.metadata_search` is the same verb): the Tables and Fields whose name, key, label\n   * or description holds `text`, case-insensitively, never rows. Structure is records too, so this\n   * is the read door asked about the two kernels, every page, then matched here; the store decides\n   * which Tables and Fields this reader may see. An empty `text` matches every Table and Field.\n   * Until 2026-10-02 this refused as an absent door and the words reached nothing (lane 3).\n   */\n  const structureSearchIn = async (\n    target: Uuid | null,\n    text: string,\n  ): Promise<RecordsResult<MetadataSearchAnswer>> => {\n    const needle = (text ?? \"\").trim().toLowerCase();\n    const tableKernelAnswer = await tableKernel(\"metadataSearch.kernel\");\n    if (!tableKernelAnswer.ok) return err(tableKernelAnswer.error);\n    const fieldKernelAnswer = await callDoor<Uuid>(DOORS.fieldKernelId, {}, \"metadataSearch.fieldKernel\");\n    if (!fieldKernelAnswer.ok) return err(fieldKernelAnswer.error);\n    const matches: MetadataSearchAnswer[\"matches\"] = [];\n    for (const [kind, kernel] of [[\"table\", tableKernelAnswer.data], [\"field\", fieldKernelAnswer.data]] as const) {\n      for (let offset = 0; ; offset += TABLE_LIST_PAGE) {\n        const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string }>>(\n          DOORS.readRecords,\n          { p_organization_id: target, p_table_id: kernel, p_limit: TABLE_LIST_PAGE, p_offset: offset },\n          \"metadataSearch\",\n        );\n        if (!door.ok) return err(door.error);\n        const page = door.data ?? [];\n        for (const row of page) {\n          const doc = unfold(row.document).document as Record<string, unknown>;\n          const words = (k: string): string => (typeof doc[k] === \"string\" ? (doc[k] as string) : \"\");\n          const name = words(\"name\") || words(\"label\") || words(\"key\");\n          const description = words(\"description\");\n          const haystack = [words(\"name\"), words(\"label\"), words(\"key\"), description].join(\"\\n\").toLowerCase();\n          if (needle && !haystack.includes(needle)) continue;\n          matches.push({\n            id: row.id,\n            kind,\n            name,\n            description: description || null,\n            ...(kind === \"field\"\n              ? { key: words(\"key\") || null, table_id: words(\"entity_definition_id\") || null, field_type: doc[\"type\"] ?? null }\n              : {}),\n            organization_id: target,\n          });\n        }\n        if (page.length < TABLE_LIST_PAGE) break;\n      }\n    }\n    matches.sort((a, b) => String(a[\"name\"] ?? \"\").localeCompare(String(b[\"name\"] ?? \"\")));\n    return ok({ matches, organizations_covered: target ? [target] : [], unavailable: [] });\n  };\n  const unavailableReason = (error: RecordsError): string =>\n    `${error.message}${error.hint ? ` ${error.hint}` : \"\"}`;\n\n  // ROLLUP-FORMAT: the fields of a table with the number format its formulas, rollups and lookups inherit worked out.\n  // A rollup / lookup with no declared format reads the look of the column it picks on the table its link reaches\n  // (forward: this table's own relation; back: another table's relation to this one, by key or inverse key), so the\n  // far table's fields are read too (their own looks first, so lookup -> formula -> rollup settles). Only done when\n  // a derived column lacks a format; a far table that cannot be read leaves that column as it was.\n  const withLooksFromLinkedTables = async (tableId: Uuid, fields: Field[], trail: readonly Uuid[]): Promise<Field[]> => {\n    const base = withFormulaLooks(fields);\n    const vias = new Set<string>();\n    for (const f of base as unknown as Array<Record<string, unknown>>) {\n      const via = (f[\"config\"] as { via?: unknown } | null | undefined)?.via;\n      if (isDerivedField(f) && !f[\"display_format\"] && typeof via === \"string\" && via) vias.add(via);\n    }\n    if (!vias.size || trail.length >= 3) return base;\n    const here = [...trail, tableId];\n    let reverse: ReverseColumn[] | undefined;\n    const far = new Map<string, Array<readonly Record<string, unknown>[]>>();\n    for (const via of vias) {\n      const own = base.find((f) => f.key === via && f.type === \"relation\");\n      let targets: Uuid[] = [];\n      if (own) targets = own.relation_target ? [own.relation_target] : [];\n      else {\n        if (!reverse) {\n          const cols = await client.reverseColumns({ table_id: tableId });\n          reverse = cols.ok ? cols.data : [];\n        }\n        targets = reverse.filter((c) => c.key === via).map((c) => c.source_table_id);\n      }\n      const lists: Array<readonly Record<string, unknown>[]> = [];\n      for (const id of targets.filter((t) => !here.includes(t))) {\n        const door = await callDoor<Array<{ id: Uuid; data: unknown }>>(\n          DOORS.applicableFields,\n          { p_organization_id: org, p_table_id: id },\n          \"fields\",\n        );\n        if (!door.ok) continue;\n        const farFields = (door.data ?? []).map((row) => ({ id: row.id, ...(row.data as object) }) as Field);\n        lists.push((await withLooksFromLinkedTables(id, farFields, here)) as unknown as Array<Record<string, unknown>>);\n      }\n      far.set(via, lists);\n    }\n    return withDerivedLooks(base, (via) => far.get(via) ?? []);\n  };\n\n  /**\n   * ADVERSARIAL-11 F3. A filter that says \"today\", \"overdue\" or \"this week\" is worked out HERE, in the\n   * zone this reader is in right now (relativeDays.ts), and goes out as exact bounds, so the day never\n   * depends on a saved zone that is a browser behind. A filter with no relative window is returned as is\n   * without reading anything; a failed read of the Fields leaves the filter for the store to work out.\n   */\n  async function readersFilter<F>(table_id: Uuid, filter: F): Promise<F> {\n    if (!holdsRelativeDays(filter)) return filter;\n    const [fields, calendar] = await Promise.all([client.fields({ table_id }), client.aggCalendar()]);\n    if (!fields.ok) return filter;\n    const weekStart = calendar.ok ? weekStartIndexOf(calendar.data.week_start) : 1;\n    return resolveRelativeDays(filter, lookupFromFields(fields.data), { weekStart }) as F;\n  }\n\n  const client: RecordsClient = {\n    config,\n    scopes,\n\n    async recordWrite({ table_id, data }) {\n      // THE OP ID RIDES THE ENVELOPE. `_op_id` is a platform envelope key — the same class as\n      // `_actor` — which the store lifts out BEFORE its undeclared-key guard and BEFORE\n      // storage, so it never lands on the record. It comes back in the realtime notice, which\n      // is how this browser recognizes the echo of its own write and does not re-read a page\n      // it has already updated. See `../ops.ts`.\n      const result = await callDoor<Uuid>(\n        DOORS.recordWrite,\n        { p_organization_id: org, p_table_id: table_id, p_data: { ...data, _op_id: mintOp() } },\n        \"recordWrite\",\n      );\n      // A NEW RECORD IS A CHANGE TOO (VIEWS-AND-FIELDS BL): a record made on one table can change\n      // what ANOTHER screen shows — the linked table's reverse column — so it is announced like\n      // every other write door's answer, never only through the realtime notice.\n      if (result.ok && typeof result.data === \"string\") announceRecordChanged(result.data);\n      return result;\n    },\n\n    async recordWriteMany({ table_id, rows, ids }) {\n      // ONE CALL IS ONE OPERATION, so one op id for the whole batch: the store announces one\n      // statement once, and it REFUSES a batch carrying two different ids by name.\n      const opId = mintOp();\n      return callDoor<Uuid[]>(\n        DOORS.recordWriteMany,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_rows: rows.map((row) => ({ ...row, _op_id: opId })),\n          ...(ids === undefined ? {} : { p_ids: ids }),\n        },\n        \"recordWriteMany\",\n      );\n    },\n\n    async recordChangeMany({ table_id, changes }) {\n      // ONE BATCH IS ONE OPERATION: one op id on every insert and patch, so the browser that made\n      // the change recognizes the one notice announcing it.\n      const opId = mintOp();\n      // EVERY RECORD A BATCH TOUCHED IS ANNOUNCED, as a single `recordUpdate` is (merged-grid\n      // review 2026-09-26): a paste or a bulk set is one `record_change_many`, and the record\n      // panel open on one of those rows kept its old values because nothing told it.\n      const result = await callDoor<RecordChangeResult[]>(\n        DOORS.recordChangeMany,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_changes: changes.map((change) =>\n            change.op === \"insert\"\n              ? { op: \"insert\", data: { ...change.data, _op_id: opId } }\n              : change.op === \"update\"\n                ? {\n                    op: \"update\",\n                    record_id: change.record_id,\n                    patch: { ...change.patch, _op_id: opId },\n                    ...(change.expected_version === undefined || change.expected_version === null\n                      ? {}\n                      : { expected_version: change.expected_version }),\n                  }\n                : { op: \"archive\", record_id: change.record_id },\n          ),\n        },\n        \"recordChangeMany\",\n      );\n      if (result.ok) for (const changed of result.data ?? []) if (changed?.id) announceRecordChanged(changed.id);\n      return result;\n    },\n\n    async recordWriteGraph({ table_id, parent, children, edges }) {\n      // ONE GRAPH IS ONE OPERATION, so one op id for the whole thing: the door copies the\n      // parent's onto every child, and the store announces the statement once.\n      const opId = mintOp();\n      return callDoor<RecordGraphWritten>(\n        DOORS.recordWriteGraph,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_parent: { ...parent, _op_id: opId },\n          p_edges: edges ?? [],\n          p_children: (children ?? []).map((child) => ({\n            data: child.data,\n            role: child.role,\n            ...(child.table_id === undefined ? {} : { table_id: child.table_id }),\n            ...(child.position === undefined ? {} : { position: child.position }),\n          })),\n        },\n        \"recordWriteGraph\",\n      );\n    },\n\n    async recordUpdate({ record_id, patch, expectedVersion }) {\n      const result = await callDoor<number>(\n        DOORS.recordUpdate,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_patch: { ...patch, _op_id: mintOp() },\n          ...(expectedVersion === undefined ? {} : { p_expected_version: expectedVersion }),\n        },\n        \"recordUpdate\",\n      );\n      if (result.ok) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async recordUpdateAddingChoices({ record_id, patch, add, expectedVersion }) {\n      const result = await callDoor<number>(\n        DOORS.recordUpdateAddingChoices,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_patch: { ...patch, _op_id: mintOp() },\n          p_add: add,\n          ...(expectedVersion === undefined ? {} : { p_expected_version: expectedVersion }),\n        },\n        \"recordUpdateAddingChoices\",\n      );\n      if (result.ok) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async choiceNudge() {\n      const result = await callDoor<string>(DOORS.choiceNudge, { p_organization_id: org }, \"choiceNudge\");\n      if (!result.ok) return result;\n      return ok(asChoiceNudge(result.data));\n    },\n\n    async recordDelete({ record_id }) {\n      const result = await callDoor<Timestamp>(\n        DOORS.recordDelete,\n        { p_organization_id: org, p_record_id: record_id },\n        \"recordDelete\",\n      );\n      if (result.ok) {\n        markRecordRemoved(record_id);\n        announceRecordChanged(record_id);\n      }\n      return result;\n    },\n\n    async tableHomes({ table_id }) {\n      return callDoor<Array<{ home_id: Uuid; name: string | null; declared: boolean }>>(\n        DOORS.tableHomesNamed,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableHomes\",\n      );\n    },\n\n    async homeAdd({ table_id, home_record_id }) {\n      const result = await callDoor<Uuid>(\n        DOORS.homeAdd,\n        { p_organization_id: org, p_table_id: table_id, p_home_record_id: home_record_id },\n        \"homeAdd\",\n      );\n      if (result.ok) announceRecordChanged(table_id);\n      return result;\n    },\n\n    async recordReparent({ record_id, parent_id }) {\n      const result = await callDoor<null>(\n        DOORS.recordReparent,\n        { p_organization_id: org, p_record_id: record_id, p_parent_id: parent_id },\n        \"recordReparent\",\n      );\n      if (result.ok) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async recordRestore({ record_id }) {\n      const result = await callDoor<void>(\n        DOORS.recordRestore,\n        { p_organization_id: org, p_record_id: record_id },\n        \"recordRestore\",\n      );\n      if (result.ok) {\n        markRecordRestored(record_id);\n        announceRecordChanged(record_id);\n      }\n      return result;\n    },\n\n    async tableArchive({ table_id, chunk, includeTable }) {\n      // EVERY ARGUMENT IS SAID OUT LOUD, including the two the function\n      // defaults. A caller that leaves `p_chunk` off is agreeing to a number it\n      // cannot see, and a loop's pass size is the one thing a loop actually has\n      // an opinion about. So the package states it — and the door still clamps\n      // it and reports what it actually took.\n      //\n      // WHY 20 (TABLE_ARCHIVE_PASS). Measured against the live store on 2026-09-22 one record\n      // cost ~35ms to archive, so 200 died on `57014` and 50 (~1.8s) was chosen. Re-measured on\n      // the clone 2026-10-03 through PostgREST, under the load the store actually carries now (a\n      // record also takes its history capture, outbox row, associations, and the last pass takes\n      // what is built on the table): ~150ms a record — a pass of 10 took 1.6s, 10 + the Table\n      // itself 3.2s — so 50 is ~7.5s against the 8s statement timeout and timed out under load.\n      // 20 is ~3-4s with the Table's own pass included; the caller's loop still halves on a\n      // timeout (useTableArchive), so a busier store slows the run, never fails it.\n      return callDoor<TableArchiveProgress>(\n        DOORS.tableArchive,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_chunk: chunk ?? TABLE_ARCHIVE_PASS,\n          p_include_table: includeTable ?? true,\n        },\n        \"tableArchive\",\n      );\n    },\n\n    async tableArchiveDeliberately({ table_id, typed_slug, reason }) {\n      // OWED, like `tableRestore` below: proven on the nightly clone, waiting for the chair's\n      // production apply (lane 12 P5). `callDoor` refused it before the network on every store,\n      // the clone included, so the typed-table suite could never reach the door it tests.\n      return owedDoor<TableArchiveProgress>(\n        DOORS.tableArchiveDeliberately,\n        { p_organization_id: org, p_table_id: table_id, p_typed_slug: typed_slug, p_reason: reason },\n        \"tableArchiveDeliberately\",\n      );\n    },\n\n    async tableRestore({ table_id, chunk }) {\n      // THE DOOR LANDED: `custom.table_restore` is in the generated catalog (2026-10-03).\n      return callDoor<TableRestoreProgress>(\n        DOORS.tableRestore,\n        { p_organization_id: org, p_table_id: table_id, p_chunk: chunk ?? TABLE_RESTORE_PASS },\n        \"tableRestore\",\n      );\n    },\n\n    async tableRestoreWhole({ table_id, onPass }) {\n      let size = TABLE_RESTORE_PASS;\n      for (let pass = 0; pass < TABLE_RESTORE_MAX_PASSES; pass += 1) {\n        const answered = await client.tableRestore({ table_id, chunk: size });\n        if (!answered.ok) {\n          if (answered.error.code === \"timed_out\" && size > TABLE_RESTORE_MIN_PASS) {\n            size = Math.max(TABLE_RESTORE_MIN_PASS, Math.floor(size / 2));\n            continue;\n          }\n          // The door is on the main database now (2026-10-03); a store that does not serve it\n          // answers `store_not_served` and nothing is tried blind in its place — the one-call\n          // `record_restore` fallback left with the door's arrival, since it brought back the\n          // table's row and none of its rows' archive marks.\n          return answered;\n        }\n        onPass?.(answered.data);\n        if (answered.data.done) return answered;\n      }\n      return err({\n        code: \"internal\",\n        message: `The table is not all back after ${TABLE_RESTORE_MAX_PASSES} passes. Bring it back again to carry on — it picks up where this left off.`,\n      } as RecordsError);\n    },\n\n    async tableDuplicate({ tableId, withRecords, name, organizationId, onProgress }) {\n      // Every argument said out loud, as tableArchive does: whether the rows come too is the one\n      // thing a person decided, so the package never leaves it to a default nobody sees.\n      const first = await owedDoor<unknown>(\n        DOORS.tableDuplicate,\n        {\n          p_table_id: tableId,\n          p_with_records: withRecords ?? false,\n          p_name: name?.trim() ? name.trim() : null,\n          p_organization_id: organizationId ?? null,\n        },\n        \"tableDuplicate\",\n      );\n      if (!first.ok) return first;\n      return carryOnCopy(first.data, onProgress);\n    },\n\n    async tableCopiesInProgress() {\n      const answered = await owedDoor<unknown>(DOORS.tableCopiesInProgress, {}, \"tableCopiesInProgress\");\n      if (!answered.ok) return answered;\n      return ok(parseTableCopiesInProgress(answered.data));\n    },\n\n    async tableDuplicateContinue({ copyId, onProgress }) {\n      const pass = await owedDoor<unknown>(DOORS.tableDuplicateContinue, { p_table_id: copyId }, \"tableDuplicateContinue\");\n      if (!pass.ok) return pass;\n      return carryOnCopy(pass.data, onProgress);\n    },\n\n    async recordRead({ record_id, withComputed = false, withVersion = false, organization_id }) {\n      if (organization_id && organization_id !== org) {\n        return clientFor(organization_id).recordRead({ record_id, withComputed, withVersion, organization_id });\n      }\n      if (readOrgs(organization_id).length > 1) {\n        return openInOwnOrg(\n          record_id,\n          organization_id,\n          (sub) => sub.recordRead({ record_id, withComputed, withVersion, organization_id: (sub.config.organizationId) }),\n          () => true,\n        );\n      }\n      // DOOR-1: `custom.read_record` resolves the reader from the session,\n      // refuses a record they have no read access to in the store's own sentence,\n      // and masks the fields their level does not reach. This client no longer\n      // selects `custom.record` for a read — that path returned rows and fields\n      // the store had not agreed this person could see.\n      // THE VERSION COMES WITH THE READ when asked (`withVersion`): the read door answers the document only,\n      // so its header (the version a safe edit must carry) is asked in the same round, never as a caller's\n      // second call. Off by default so a screen that draws first and versions later is never held back.\n      const [door, header] = await Promise.all([\n        callDoor<unknown>(DOORS.readRecord, { p_organization_id: org, p_record_id: record_id }, \"recordRead\"),\n        // A version that cannot be read never takes the record away: it comes back as null.\n        withVersion\n          ? callDoor<RecordHeader[]>(DOORS.recordHeaders, { p_organization_id: org, p_ids: [record_id] }, \"recordRead.version\").catch(\n              () => null,\n            )\n          : Promise.resolve(null),\n      ]);\n      if (!door.ok) return err(door.error);\n      const version = header && header.ok ? (header.data?.find((h) => h.id === record_id)?.version ?? null) : null;\n      const { document, hidden } = unfold(door.data);\n\n      // 🚨 A DECORATION NEVER TAKES THE RECORD AWAY (lane LIMITS-FIX-UI, 2026-09-21).\n      //\n      // `custom.computed_provenance` answers WHICH RULE produced a worked-out value\n      // (FLD-9). It is a footnote beside the record — and it has NO EXECUTE grant to\n      // `authenticated`, measured on the live catalog:\n      //\n      //   read_record          authenticated may: t\n      //   record_history       authenticated may: t\n      //   field_history        authenticated may: t\n      //   computed_provenance  authenticated may: f\n      //\n      // `Peek` asks for the record WITH provenance, so this line returned that door's\n      // refusal AS THE RECORD'S: the owner of an organization opened a record in it and\n      // was told \"You do not have access to this\", above a history, a running checklist\n      // and a comment box that all loaded perfectly. Reported twice — by the SCREENS-2\n      // lane on a dental practice, and by crew E2, who checked at the doors and found\n      // the record read itself answering correctly from that very seat.\n      //\n      // So the record comes back. The footnote's absence is REPORTED rather than\n      // swallowed (nothing fails silently): `computedUnavailable` carries the refusal,\n      // and a screen that draws rule provenance says it could not read it instead of\n      // drawing nothing and meaning two different things by it.\n      let computed: RecordRead[\"computed\"] = [];\n      let computedUnavailable: RecordsError | null = null;\n      if (withComputed) {\n        const provenance = await callDoor<RecordRead[\"computed\"]>(\n          DOORS.computedProvenance,\n          { p_organization_id: org, p_record_id: record_id },\n          \"recordRead.computed\",\n        );\n        if (provenance.ok) computed = provenance.data ?? [];\n        else computedUnavailable = provenance.error;\n      }\n      return ok({ record_id, document, hidden, computed, computedUnavailable, ...(withVersion ? { version } : {}) });\n    },\n\n    async listByIds({ table_id, ids }) {\n      // NOTHING ASKED FOR IS AN EMPTY ANSWER, not a round trip. The door says the same, but\n      // a call that cannot return a row should not cost one.\n      if (ids.length === 0) return ok([]);\n      const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string }>>(\n        DOORS.readRecordsByIds,\n        { p_organization_id: org, p_table_id: table_id, p_record_ids: ids },\n        \"listByIds\",\n      );\n      if (!door.ok) return err(door.error);\n      return ok(\n        splitLockedRows(\n          (door.data ?? []).map((row): ReadRow => {\n            const { document, hidden } = unfold(row.document);\n            return { id: row.id, document, level: row.level, hidden, ...waitingMark(row) };\n          }),\n        ).rows,\n      );\n    },\n\n    async tableFacts(args) {\n      if (!doorExists(DOORS.tableFacts)) return ok(null);\n      if (args?.organization_id && args.organization_id !== org) {\n        return clientFor(args.organization_id).tableFacts(args);\n      }\n      if (readOrgs(args?.organization_id).length > 1) {\n        return acrossOrgs<TableFact[] | null>(\n          args?.organization_id,\n          (sub) => sub.tableFacts({ organization_id: sub.config.organizationId }),\n          (parts) => parts.flatMap((p) => p ?? []),\n        );\n      }\n      return callDoor<TableFact[]>(DOORS.tableFacts, { p_organization_id: org }, \"tableFacts\");\n    },\n\n    async tablesLiveWhere({ table_ids }) {\n      if (table_ids.length === 0) return ok([]);\n      const answered = await callDoor<unknown>(DOORS.tablesLiveWhere, { p_table_ids: table_ids }, \"tablesLiveWhere\");\n      if (!answered.ok) return answered;\n      if (!Array.isArray(answered.data)) {\n        const refusal: RecordsError = {\n          code: \"not_supported\",\n          message: \"The record store answered where these tables are written in a shape this client cannot read, so no write location was assumed.\",\n          hint: \"Regenerate @ai-matrx/records against the store (pnpm records:generate) — the door and this client disagree.\",\n        };\n        scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where: \"tablesLiveWhere\" });\n        return err(refusal);\n      }\n      const locations: TableLiveLocation[] = [];\n      for (const row of answered.data) {\n        const value = row && typeof row === \"object\" ? row as { table_id?: unknown; lives_in?: unknown; why?: unknown } : null;\n        if (!value || typeof value.table_id !== \"string\" || (value.lives_in !== \"record\" && value.lives_in !== \"older\") || (value.why !== null && value.why !== undefined && typeof value.why !== \"string\")) {\n          const refusal: RecordsError = { code: \"not_supported\", message: \"The record store returned an invalid table write location, so no write location was assumed.\" };\n          scream({ code: refusal.code, message: refusal.message, where: \"tablesLiveWhere\" });\n          return err(refusal);\n        }\n        locations.push({ table_id: value.table_id as Uuid, lives_in: value.lives_in, why: typeof value.why === \"string\" ? value.why : null });\n      }\n      return ok(locations);\n    },\n\n    async baseCopyFinish({ organizationId, pairs }) {\n      const answered = await callDoor<{ relinked_columns?: number; relinked_cells?: number }>(\n        DOORS.baseCopyFinish,\n        { p_organization_id: organizationId, p_pairs: pairs },\n        \"baseCopyFinish\",\n      );\n      if (!answered.ok) return answered;\n      return ok({ relinked_columns: Number(answered.data?.relinked_columns ?? 0), relinked_cells: Number(answered.data?.relinked_cells ?? 0) });\n    },\n\n    async copyTableExtras({ organizationId, pairs }) {\n      const answered = await callDoor<{ automations?: number; pages?: number; extras_refused?: unknown }>(\n        DOORS.copyTableExtras,\n        { p_organization_id: organizationId, p_pairs: pairs },\n        \"copyTableExtras\",\n      );\n      if (!answered.ok) return answered;\n      const refused = Array.isArray(answered.data?.extras_refused) ? answered.data.extras_refused.filter((x): x is string => typeof x === \"string\") : [];\n      return ok({ automations: Number(answered.data?.automations ?? 0), pages: Number(answered.data?.pages ?? 0), extras_refused: refused });\n    },\n\n    async tableHome({ table_id }) {\n      const answered = await callDoor<unknown>(DOORS.tableHome, { p_table_id: table_id }, \"tableHome\");\n      if (!answered.ok) return answered;\n      if (answered.data === null || answered.data === undefined) return ok(null);\n      const home = parseTableHome(answered.data);\n      if (!home) {\n        const refusal: RecordsError = {\n          code: \"not_supported\",\n          message: \"The record store answered where this table lives in a shape this client cannot read, so nothing is claimed about it.\",\n          hint: \"Regenerate @ai-matrx/records against the store (pnpm records:generate) — the door and this client disagree.\",\n        };\n        scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where: \"tableHome\" });\n        return err(refusal);\n      }\n      return ok(home);\n    },\n\n    async tableMove({ table_id, to_organization_id, expected_version }) {\n      const answered = await callDoor<unknown>(\n        DOORS.tableMove,\n        { p_table_id: table_id, p_to_organization_id: to_organization_id, p_expected_version: expected_version ?? null },\n        \"tableMove\",\n      );\n      if (!answered.ok) return answered;\n      const moved = parseTableMoved(answered.data);\n      if (!moved) {\n        const refusal: RecordsError = {\n          code: \"not_supported\",\n          message: \"The record store answered the move in a shape this client cannot read. Look where the table lives before trying again.\",\n        };\n        scream({ code: refusal.code, message: refusal.message, where: \"tableMove\" });\n        return err(refusal);\n      }\n      return ok(moved);\n    },\n\n    async baseMove({ home_id, to_organization_id }) {\n      const answered = await callDoor<unknown>(DOORS.baseMove, { p_home_id: home_id, p_to_organization_id: to_organization_id }, \"baseMove\");\n      if (!answered.ok) return answered;\n      const d = answered.data as { moved?: unknown; name?: unknown; to_organization_id?: unknown; tables?: unknown } | null;\n      if (!d || d.moved !== true || typeof d.to_organization_id !== \"string\") {\n        const refusal: RecordsError = {\n          code: \"not_supported\",\n          message: \"The record store answered the base move in a shape this client cannot read. Look where the base lives before trying again.\",\n        };\n        scream({ code: refusal.code, message: refusal.message, where: \"baseMove\" });\n        return err(refusal);\n      }\n      return ok({\n        name: typeof d.name === \"string\" ? d.name : \"\",\n        toOrganizationId: d.to_organization_id as Uuid,\n        tables: Array.isArray(d.tables) ? d.tables.length : 0,\n      });\n    },\n\n    async tableArchived({ table_id }) {\n      // Through the SAME archived door a table's own archive uses, addressed at\n      // the Table kernel (every Table is a record in it). Paged until the door\n      // answers short, so a Table past the first page is still found.\n      const kernel = await callDoor<Uuid>(DOORS.tableKernelId, {}, \"tableArchived.kernel\");\n      if (!kernel.ok) return err(kernel.error);\n      const PAGE = 200;\n      for (let page = 0; page < 25; page += 1) {\n        const answered = await this.listArchived({\n          table_id: kernel.data,\n          lane: \"org\",\n          limit: PAGE,\n          offset: page * PAGE,\n        });\n        if (!answered.ok) return err(answered.error);\n        const hit = answered.data.rows.find((row) => row.id === table_id);\n        if (hit) return ok(hit);\n        if (answered.data.total !== null) return ok(null);\n      }\n      return ok(null);\n    },\n\n    async listArchived({ table_id, lane = DEFAULT_ARCHIVE_LANE, limit = 50, offset = 0 }) {\n      // THE ROWS THAT LEFT, THROUGH THE STORE. The lane is handed to the door\n      // rather than applied here, for the reason every filter in this client is:\n      // a browser can only ever narrow the rows it was already given, so a lane\n      // decided on this side would silently drop the rest of the answer and call\n      // it \"mine\".\n      const door = await callDoor<ArchivedDoorRow[]>(\n        DOORS.readRecordsArchived,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_lane: lane,\n          p_limit: limit,\n          p_offset: offset,\n        },\n        \"listArchived\",\n      );\n      if (!door.ok) return err(door.error);\n      const rows: ArchivedRow[] = (door.data ?? []).map((row) => {\n        const { document, hidden } = unfold(row.document);\n        return {\n          id: row.id,\n          document,\n          level: row.level,\n          hidden,\n          archivedAt: row.archived_at,\n          archivedBy: row.archived_by ?? null,\n          archivedByName: row.archived_by_name ?? null,\n        };\n      });\n      // The same honest arithmetic `list` does, for the same reason: a short\n      // page has reached the end of the set this reader may see, so its size is\n      // known; a full page says only \"at least this many\", which is not a total.\n      const total = rows.length < limit ? offset + rows.length : null;\n      return ok({ rows, total });\n    },\n\n    async list({ table_id, filter: asked, limit = 50, offset = 0 }) {\n      const filter = await readersFilter(table_id, asked);\n      // ONE DOOR FOR ALL FOUR SURFACES. The grid, the board, the record list\n      // and a dashboard drill-through all arrive here, and they all ask\n      // `custom.read_records_matching` — with `{}` when nobody asked a\n      // question. The filtered and the unfiltered page are then the SAME body\n      // in the database, decided by the same ladder, so a narrowed screen can\n      // never be a differently-judged screen.\n      const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string }>>(\n        DOORS.readRecordsMatching,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_filter: filter ?? {},\n          p_limit: limit,\n          p_offset: offset,\n        },\n        \"list\",\n      );\n      if (!door.ok) return err(door.error);\n      const read: ReadRow[] = (door.data ?? []).map((row) => {\n        const { document, hidden } = unfold(row.document);\n        return { id: row.id, document, level: row.level, hidden, ...waitingMark(row) };\n      });\n      // HEADER-ONLY STUBS ARE NOT ROWS (honest-hidden-rows): a row this person cannot open is\n      // counted in `locked`, never drawn. The page was short or full by what the DOOR returned.\n      const { rows, locked } = splitLockedRows(read);\n      // WHAT THE TOTAL HONESTLY IS, AND WHEN IT IS KNOWN FOR NOTHING.\n      //\n      // The door reads live records only — a deleted record is not in its set —\n      // and it counts nothing, so a total taken from the table would be a count\n      // of rows this reader may not see, with a number on it. That stays true\n      // and no count is ever asked for.\n      //\n      // But a SHORT PAGE already answers the question. If the door was asked\n      // for `limit` and handed back fewer, the reader has reached the end of\n      // the set it is allowed to see, so the size of that set is exactly\n      // `offset + rows.length` — the visible total, arrived at by arithmetic on\n      // a page that had to be read anyway, with no second query and no leak.\n      // Until 2026-09-21 this answered null unconditionally and a table holding\n      // ten records told its owner \"Unknown total — showing the 10 records\n      // loaded so far\", which is a screen refusing to say a thing it knows.\n      //\n      // 🚨 THIS RESTS ON ONE FACT ABOUT THE DOOR, AND THE FACT IS NOT THE\n      // OBVIOUS ONE. `custom.read_records_matching` DOES clamp through\n      // `custom.page_size(org, door, limit, 200)` — the first draft of this\n      // comment said it did not, and the live clause below caught that while it\n      // was being written. What makes the inference safe is what that helper\n      // does at the ceiling: measured on the live store 2026-09-21, a request\n      // over it is REFUSED BY NAME — \"custom.read_records_matching was asked for 1001\n      // rows; this store serves at most 1000 rows in one page, so nothing was\n      // read rather than quietly reading fewer\" — and 1, 50, 200 and 1000 each\n      // come back as themselves. A page is therefore never quietly made\n      // smaller, so a successful call that returns fewer rows than it asked for\n      // has reached the end of the set and nothing else.\n      //\n      // If that ever changed — if the door began shrinking a page instead of\n      // refusing it — a clamped FULL page would read as a short one and a\n      // person with two hundred records would be told they have fifty. So the\n      // live suite asserts the refusal, not the absence of a clamp; that clause\n      // is what makes this inference safe to keep rather than a thing that\n      // quietly rots.\n      //\n      // A FULL page says only \"at least this many\", which is not a total, so it\n      // stays null and the screen keeps saying what it is actually showing.\n      // Stubs sit in positions the earlier pages cannot be asked about, so with any stub on the page\n      // the count is exact only from the first page; later it is honestly unknown.\n      const total =\n        read.length >= limit ? null : locked === 0 ? offset + rows.length : offset === 0 ? rows.length : null;\n      return ok({ rows, total, ...(locked > 0 ? { locked } : {}) });\n    },\n\n    async listPage({ table_id, filter: asked, search, sort, view_id, limit = 50, offset = 0 }) {\n      const filter = await readersFilter(table_id, asked);\n      const door = await callDoor<{\n        total: number | string;\n        limit: number;\n        offset: number;\n        rows: Array<{ id: Uuid; document: unknown; level: string }> | null;\n        sort_ignored?: unknown;\n        filter_ignored?: unknown;\n      }>(\n        DOORS.readRecordsPage,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_filter: filter ?? {},\n          p_search: search ?? null,\n          p_sort: sort ?? [],\n          p_view_id: view_id ?? null,\n          p_limit: limit,\n          p_offset: offset,\n        },\n        \"listPage\",\n      );\n      if (!door.ok) return err(door.error);\n      const answer = door.data;\n      const { rows, locked: lockedOnPage } = splitLockedRows(\n        (answer?.rows ?? []).map((row): ReadRow => {\n          const { document, hidden } = unfold(row.document);\n          return { id: row.id, document, level: row.level, hidden, ...waitingMark(row) };\n        }),\n      );\n      // HEADER-ONLY STUBS ARE NOT ROWS (honest-hidden-rows). The live page door puts them in only\n      // a plain page (no filter, search, sort or view). Its total can therefore include stubs on\n      // an earlier or later page, so plain pages ask the aggregate for the readable total.\n      let total = Number(answer?.total ?? 0);\n      let locked = 0;\n      const unfiltered = (!filter || Object.keys(filter).length === 0) && (!search || search.trim() === \"\") && view_id == null;\n      const plainPage = unfiltered && (!sort || sort.length === 0);\n      // A SORTED PAGE OF THE WHOLE TABLE (walk 2026-10-08 D8). A sort places no header row, so a member of\n      // a Confidential table with a default sort (Title ↑) read \"No records yet · 0 rows\". The store's\n      // sort-only page now answers `locked`: how many rows of the table this reader cannot open.\n      const lockedOffPage = Number((answer as { locked?: number | string } | null)?.locked ?? 0);\n      if (!plainPage && unfiltered && Number.isFinite(lockedOffPage) && lockedOffPage > 0) {\n        locked = Math.max(lockedOnPage, lockedOffPage);\n      }\n      if (plainPage) {\n        const counted = await client.recordAggregate({ table_id, measures: [{ op: \"count\" }] });\n        if (!counted.ok) return err(counted.error);\n        const openable = Number(counted.data[0]?.row_count ?? 0);\n        if (!Number.isFinite(openable) || openable < 0) {\n          return err({ code: \"internal\", message: \"The store's readable-row count is not a valid page total.\", hint: \"Refresh this table. If it continues, the store must return a non-negative count.\" });\n        }\n        // The two doors are separate snapshots. An insert between them makes the readable count\n        // larger than the page's earlier total; keep that newer count and do not invent locks.\n        locked = openable <= total ? Math.max(lockedOnPage, total - openable) : lockedOnPage;\n        total = openable;\n      } else if (lockedOnPage > 0 && locked === 0) {\n        // Complex pages normally exclude stubs at the store. If an older store still returns one,\n        // remove only what this answer proves instead of guessing about unseen pages.\n        locked = lockedOnPage;\n        total = Math.max(rows.length, total - lockedOnPage);\n      }\n      return ok({\n        rows,\n        ...(locked > 0 ? { locked } : {}),\n        total,\n        limit: Number(answer?.limit ?? limit),\n        offset: Number(answer?.offset ?? offset),\n        sort_ignored: Array.isArray(answer?.sort_ignored)\n          ? (answer.sort_ignored as unknown[]).filter((k): k is string => typeof k === \"string\")\n          : [],\n        filter_ignored: Array.isArray(answer?.filter_ignored)\n          ? (answer.filter_ignored as unknown[]).filter((k): k is string => typeof k === \"string\")\n          : [],\n      });\n    },\n\n    async listKeyset({ table_id, filter: asked, search, sort, after, ids, limit = 50 }) {\n      const filter = await readersFilter(table_id, asked);\n      // The cursor is opened at the edge: a string that is not one of the store's cursors is refused\n      // here, by name — it is never sent as \"no cursor\", which would quietly start again at page 1.\n      let pAfter: Record<string, unknown> | null = null;\n      if (ids === undefined && after) {\n        pAfter = decodeKeysetCursor(after);\n        if (!pAfter) {\n          const hint = \"Pass back the cursor exactly as the last page answered it, or start from the first page, without a cursor.\";\n          const refusal: RecordsError = {\n            code: \"invalid_argument\",\n            message: \"This page cursor is damaged, so it cannot say where the next page starts. Nothing was read.\",\n            hint,\n          };\n          scream({ code: refusal.code, message: refusal.message, hint, where: \"listKeyset\" });\n          return err(refusal);\n        }\n      }\n      // OWED until `pnpm records:generate` lists it: the door is live, so it is asked; a store without\n      // it answers `door_absent` naming the lane, never an empty page.\n      const door = await owedDoor<{\n        total: number | string | null;\n        limit: number;\n        cursor: unknown;\n        rows: Array<{ id: Uuid; document: unknown; level: string; version: number | null; organization_id: Uuid }> | null;\n        sort_ignored?: unknown;\n        filter_ignored?: unknown;\n      }>(\n        DOORS.readRecordsKeyset,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_filter: filter ?? {},\n          p_search: search ?? null,\n          p_sort: sort ?? [],\n          p_after: pAfter,\n          p_limit: limit,\n          p_ids: ids === undefined ? null : [...ids],\n        },\n        \"listKeyset\",\n      );\n      if (!door.ok) return err(door.error);\n      const answer = door.data;\n      const keyed: KeysetRow[] = (answer?.rows ?? []).map((row) => {\n        const { document, hidden } = unfold(row.document);\n        return {\n          id: row.id,\n          document,\n          level: row.level,\n          hidden,\n          version: row.version == null ? null : Number(row.version),\n          organization_id: row.organization_id,\n        };\n      });\n      // HEADER-ONLY STUBS ARE NOT ROWS (honest-hidden-rows). The live keyset door does not admit\n      // confidential headers; retain a page-local fallback for an older store that does return one.\n      const { rows, locked } = splitLockedRows(keyed);\n      let keysetTotal = answer?.total == null ? null : Number(answer.total);\n      if (locked > 0 && keysetTotal !== null) keysetTotal = Math.max(rows.length, keysetTotal - locked);\n      return ok({\n        rows,\n        ...(locked > 0 ? { locked } : {}),\n        total: keysetTotal,\n        limit: Number(answer?.limit ?? limit),\n        cursor: answer?.cursor != null && typeof answer.cursor === \"object\" ? encodeKeysetCursor(answer.cursor) : null,\n        sort_ignored: Array.isArray(answer?.sort_ignored)\n          ? (answer.sort_ignored as unknown[]).filter((k): k is string => typeof k === \"string\")\n          : [],\n        filter_ignored: Array.isArray(answer?.filter_ignored)\n          ? (answer.filter_ignored as unknown[]).filter((k): k is string => typeof k === \"string\")\n          : [],\n      });\n    },\n\n    async query(input) {\n      const plan = planQuery(input);\n      const sets: Uuid[][] = [];\n      for (const call of plan.relationCalls) {\n        const result = await callDoor<Array<{ relation_targets: Uuid } | Uuid>>(\n          DOORS.relationTargets,\n          { p_organization_id: org, p_record_id: call.record_id, p_via_key: call.via_key },\n          \"query.relations\",\n        );\n        if (!result.ok) return err(result.error);\n        sets.push(\n          (result.data ?? []).map((row) =>\n            typeof row === \"string\" ? row : (row as { relation_targets: Uuid }).relation_targets,\n          ),\n        );\n      }\n      for (const call of plan.promotedCalls) {\n        const result = await callDoor<Array<{ promoted_read: Uuid } | Uuid>>(\n          DOORS.promotedRead,\n          {\n            p_organization_id: org,\n            p_table_id: plan.read.table_id,\n            p_field_key: call.field_key,\n            p_value: call.value,\n          },\n          \"query.promoted\",\n        );\n        if (!result.ok) return err(result.error);\n        sets.push(\n          (result.data ?? []).map((row) =>\n            typeof row === \"string\" ? row : (row as { promoted_read: Uuid }).promoted_read,\n          ),\n        );\n      }\n\n      const ids = plan.intersects ? intersectIds(sets) : null;\n      if (ids !== null && ids.length === 0) {\n        return ok({ rows: [], total: 0 });\n      }\n\n      // DOOR-8: an as-of read is the STORE'S question, on the store's two\n      // clocks — `p_recorded_at` is what the store said at that moment, and\n      // `p_world_on` is what was true of the world on that date. This client\n      // used to answer the record clock itself with `updated_at <= at` and\n      // refuse the world clock by name; both were workarounds for doors that\n      // now exist (`custom.query_table_as_of` / `custom.query_record_as_of`),\n      // and neither ever looked at a dated value.\n      if (plan.read.asOf) {\n        const clock = plan.read.asOf.clock === \"world\"\n          ? { p_world_on: plan.read.asOf.at.slice(0, 10) }\n          : { p_recorded_at: plan.read.asOf.at };\n        if (ids !== null) {\n          const answers = await Promise.all(\n            ids.slice(0, plan.read.limit).map((id) =>\n              callDoor<unknown>(\n                DOORS.queryRecordAsOf,\n                { p_organization_id: org, p_record_id: id, ...clock },\n                \"query.asOf\",\n              ).then((result) => ({ id, result })),\n            ),\n          );\n          const rows: ReadRow[] = [];\n          for (const { id, result } of answers) {\n            if (!result.ok) return err(result.error);\n            // A null answer is the door saying \"not visible to you at that\n            // time\", which is an absence, not an empty record.\n            if (result.data === null) continue;\n            const { document, hidden } = unfold(result.data);\n            rows.push({ id, document, level: \"viewer\", hidden });\n          }\n          return ok({ rows, total: rows.length });\n        }\n        const page = await callDoor<Array<{ record_id: Uuid; data: unknown }>>(\n          DOORS.queryTableAsOf,\n          {\n            p_organization_id: org,\n            p_table_id: plan.read.table_id,\n            ...clock,\n            p_limit: plan.read.limit,\n            p_offset: plan.read.offset,\n          },\n          \"query.asOf\",\n        );\n        if (!page.ok) return err(page.error);\n        const rows: ReadRow[] = (page.data ?? [])\n          .filter((row) => row.data !== null)\n          .map((row) => {\n            const { document, hidden } = unfold(row.data);\n            return { id: row.record_id, document, level: \"viewer\", hidden };\n          });\n        return ok({ rows, total: null });\n      }\n\n      // The live read, through the read door and nothing else. With a planned\n      // id set the door is asked one record at a time (it is keyed by record),\n      // bounded by the page size; without one it is asked for the page.\n      if (ids !== null) {\n        const answers = await Promise.all(\n          ids.slice(0, plan.read.limit).map((id) =>\n            callDoor<unknown>(\n              DOORS.readRecord,\n              { p_organization_id: org, p_record_id: id },\n              \"query\",\n            ).then((result) => ({ id, result })),\n          ),\n        );\n        const rows: ReadRow[] = [];\n        for (const { id, result } of answers) {\n          if (!result.ok) {\n            // `02000` is \"that record is not here (any more)\" — a planned id\n            // that has since been deleted is an absence, not a failed query.\n            if (result.error.sqlstate === \"02000\") continue;\n            return err(result.error);\n          }\n          const { document, hidden } = unfold(result.data);\n          rows.push({ id, document, level: \"viewer\", hidden });\n        }\n        return ok({ rows, total: rows.length });\n      }\n\n      return client.list({\n        table_id: plan.read.table_id,\n        limit: plan.read.limit,\n        offset: plan.read.offset,\n      });\n    },\n\n    async tableRead({ table_id, organization_id }) {\n      if (organization_id && organization_id !== org) {\n        return clientFor(organization_id).tableRead({ table_id, organization_id });\n      }\n      if (readOrgs(organization_id).length > 1) {\n        return openInOwnOrg<Table | null>(\n          table_id,\n          organization_id,\n          (sub) => sub.tableRead({ table_id, organization_id: sub.config.organizationId }),\n          (t) => t !== null,\n        );\n      }\n      const kernel = await tableKernel(\"tableRead.kernel\");\n      if (!kernel.ok) return err(kernel.error);\n      const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string }>>(\n        DOORS.readRecordsByIds,\n        { p_organization_id: org, p_table_id: kernel.data, p_record_ids: [table_id] },\n        \"tableRead\",\n      );\n      if (!door.ok) return err(door.error);\n      const row = (door.data ?? []).find((r) => r.id === table_id);\n      if (!row) return ok(null);\n      const { document } = unfold(row.document);\n      // Same shape as a `tableList` entry; `row.level` is the level on the KERNEL, never carried.\n      return ok({ ...(document as Record<string, unknown>), id: row.id, organization_id: org } as unknown as Table);\n    },\n\n    async tableList(args) {\n      if (args?.organization_id && args.organization_id !== org) {\n        return clientFor(args.organization_id).tableList(args);\n      }\n      if (readOrgs(args?.organization_id).length > 1) {\n        const merged = await acrossOrgs<Table[]>(\n          args?.organization_id,\n          (sub) => sub.tableList({ organization_id: sub.config.organizationId }),\n          (parts) => parts.flat(),\n        );\n        if (merged.ok) merged.data.sort((a, b) => (a.name ?? \"\").localeCompare(b.name ?? \"\"));\n        return merged;\n      }\n      // THROUGH THE READ DOOR, like everything else. A Table is a RECORD in the\n      // Table kernel, so listing this organization's Tables is\n      // `read_records(org, table_kernel_id())` — the store decides which of them\n      // this reader may see. Until 2026-09-18 this method selected\n      // `custom.table` directly, which (a) is the raw table access this package\n      // exists to make impossible and (b) could never have worked from a client:\n      // `authenticated` holds no privilege on ANY table in `custom`, by design.\n      // The browser extension found it on its first real turn (W6-EXT).\n      const kernel = await tableKernel(\"tableList.kernel\");\n      if (!kernel.ok) return err(kernel.error);\n      // EVERY PAGE, UNTIL THE DOOR ANSWERS SHORT. One call at `p_limit: 500` used to be the whole\n      // list: an organization's 501st table vanished from every picker with no sign anything was\n      // cut (a-table-list-past-five-hundred-is-whole.test.ts).\n      const read: Array<{ id: Uuid; document: unknown; level: string }> = [];\n      for (let offset = 0; ; offset += TABLE_LIST_PAGE) {\n        const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string }>>(\n          DOORS.readRecords,\n          { p_organization_id: org, p_table_id: kernel.data, p_limit: TABLE_LIST_PAGE, p_offset: offset },\n          \"tableList\",\n        );\n        if (!door.ok) return err(door.error);\n        const page = door.data ?? [];\n        read.push(...page);\n        if (page.length < TABLE_LIST_PAGE) break;\n      }\n      const tables = read.map((row) => {\n        const { document } = unfold(row.document);\n        // The kernel record IS the Table's declaration; `id` is the Table's id.\n        // `row.level` IS NOT THIS TABLE'S LEVEL AND MUST NOT BE CARRIED AS ONE.\n        // `read_records` answers the caller's level on the table it was ASKED\n        // about, and this call asks about the Table KERNEL — so `row.level` here\n        // is the caller's level on the kernel (viewer, for everybody) and not on\n        // the table the row describes. Carrying it looked free and was measured\n        // wrong within the hour: a table's own owner came back \"viewer\".\n        // The level a screen needs is `custom.my_levels`, asked per subject.\n        // WHERE IT LIVES: the Home is the record the Table sits in (`parent_id` on its kernel record). It is exposed as `home_id`\n        // so a screen never reads `parent_id` off the document by hand.\n        const doc = document as Record<string, unknown>;\n        const home = typeof doc.home_id === \"string\" ? doc.home_id : typeof doc.parent_id === \"string\" ? doc.parent_id : null;\n        return { ...doc, home_id: home, id: row.id, organization_id: org } as unknown as Table;\n      });\n      tables.sort((a, b) => (a.name ?? \"\").localeCompare(b.name ?? \"\"));\n      return ok(tables);\n    },\n\n    async fields({ table_id, recordType, withReverse }) {\n      // FLD-10: the store decides which Fields APPLY, from the record type. The\n      // client asks the door rather than filtering a full list, because the\n      // applicability Rule reads Values this client has not got.\n      //\n      // ONE QUESTION FOR \"NO TYPE\" AND \"EVERY TYPE\" (CLOSE-CORE CD-CORE-15). With no type the store answers the\n      // columns every record has: exactly the columns of its every-type ('*') answer that name no record types.\n      // So both are asked as '*' — the one question the table page's bundle answers and every screen shares —\n      // and \"no type\" is that answer with the typed columns (a Circle's Radius) left out.\n      const applicable = await callDoor<Array<{ id: Uuid; data: unknown }>>(\n        DOORS.applicableFields,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_record_type: recordType === undefined ? EVERY_RECORD_TYPE : recordType,\n        },\n        \"fields\",\n      );\n      if (!applicable.ok) return err(applicable.error);\n      const rows = applicable.data ?? [];\n      const fields = rows\n        .map((row) => ({ id: row.id, ...(row.data as object) }) as Field)\n        .filter((f) => withReverse === true || !isReverseField(f))\n        .filter((f) => recordType !== undefined || fieldAppliesToEveryType(f));\n      // IN THE ORDER A PERSON PUT THEM IN. `custom.applicable_fields` answers a\n      // set, not a sequence — its order is whatever the plan gives it, and it\n      // moves between calls — so a grid that mapped it straight to columns drew\n      // them in an arbitrary order and a reorder in the settings panel appeared\n      // to do nothing. `sort` is the Field's own declared position (and what\n      // `custom.field_update` writes when somebody moves one), so it is applied\n      // ONCE, here, and every consumer of this client inherits it. Measured\n      // 2026-09-20: a table declared Title, Day rate, Due came back Day rate,\n      // Title, Due.\n      fields.sort(\n        (a, b) => (a.sort ?? 0) - (b.sort ?? 0) || (a.label ?? \"\").localeCompare(b.label ?? \"\"),\n      );\n      // A formula column nobody gave a \"Shows as\" reads in the format its formula implies ($ / %), the same\n      // inference the template installer writes onto new formula fields; a rollup or lookup reads in the look of the\n      // column it reads (ROLLUP-FORMAT). A declared format is never touched.\n      return ok(await withLooksFromLinkedTables(table_id, fields, []));\n    },\n\n    async fieldOptions({ field_id }) {\n      return callDoor<StoredRecord[]>(\n        DOORS.fieldOptions,\n        { p_organization_id: org, p_field_id: field_id },\n        \"fieldOptions\",\n      );\n    },\n\n    ...createPickListDoors(callDoor),\n\n    async fieldChoiceUsage({ field_id }) {\n      const result = await callDoor<Record<string, ChoiceUsage> | null>(\n        DOORS.fieldChoiceUsage,\n        { p_organization_id: org, p_field_id: field_id },\n        \"fieldChoiceUsage\",\n      );\n      return result.ok ? ok(result.data ?? {}) : result;\n    },\n\n    async fieldUpdateRehomingChoices({ field_id, patch, rehome, cells_back }) {\n      return structureMoved(null, await callDoor<ChoicesRehomed>(\n        DOORS.fieldUpdateRehomingChoices,\n        {\n          p_organization_id: org,\n          p_field_id: field_id,\n          p_patch: patch,\n          ...(rehome && Object.keys(rehome).length > 0 ? { p_rehome: rehome } : {}),\n          ...(cells_back && cells_back.length > 0 ? { p_cells_back: cells_back } : {}),\n        },\n        \"fieldUpdateRehomingChoices\",\n      ));\n    },\n\n    async tableCapacity({ table_id }) {\n      return callDoor<TableCapacity>(\n        DOORS.tableCapacity,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableCapacity\",\n      );\n    },\n\n    async fieldDeclare({ table_id, spec }) {\n      return structureMoved(table_id, await callDoor<Uuid>(\n        DOORS.fieldDeclare,\n        { p_organization_id: org, p_table_id: table_id, p_spec: fieldDoorSpec(spec) },\n        \"fieldDeclare\",\n      ));\n    },\n\n    async fieldDeclareMany({ table_id, specs }) {\n      return structureMoved(table_id, await callDoor<Uuid[]>(\n        DOORS.fieldDeclareMany,\n        { p_organization_id: org, p_table_id: table_id, p_specs: specs.map(fieldDoorSpec) },\n        \"fieldDeclareMany\",\n      ));\n    },\n\n    async tableCreate({ spec, fields }) {\n      const made = await callDoor<{ table_id: Uuid; home_id: Uuid; field_ids: Uuid[] }>(\n        DOORS.tableCreate,\n        { p_organization_id: org, p_spec: spec, p_fields: fields.map(fieldDoorSpec) },\n        \"tableCreate\",\n      );\n      if (made.ok) structureMoved(made.data.table_id, made);\n      return made;\n    },\n\n    async entityTable({ token }) {\n      // The door answers one row; `callDoor` hands back the array PostgREST\n      // returns for a set-returning function, so the ONE row is taken here\n      // rather than in every caller.\n      const answer = await callDoor<EntityTableFacts[] | EntityTableFacts>(\n        DOORS.entityTable,\n        { p_token: token },\n        \"entityTable\",\n      );\n      if (!answer.ok) return err(answer.error);\n      const row = Array.isArray(answer.data) ? answer.data[0] : answer.data;\n      if (!row) {\n        return err({\n          code: \"not_found\",\n          message: `The registry answered nothing for the table \"${token}\".`,\n          hint: \"REC-33: a standard table is named by its registry token. Nothing was read.\",\n        });\n      }\n      return ok(row);\n    },\n\n    async entityFields({ token, include_retired }) {\n      // The door's third argument is sent only when asked for, so a live read is the call it always was.\n      const rows = await callDoor<Array<{ id: Uuid; data: unknown; deleted_at?: string | null }>>(\n        DOORS.entityFields,\n        include_retired\n          ? { p_organization_id: org, p_token: token, p_include_retired: true }\n          : { p_organization_id: org, p_token: token },\n        \"entityFields\",\n      );\n      if (!rows.ok) return err(rows.error);\n      return ok(\n        (rows.data ?? []).map(\n          (row) => ({ id: row.id, ...(row.data as object), archived_at: row.deleted_at ?? null }) as Field,\n        ),\n      );\n    },\n\n    async entityFieldsAcross({ token, organization_ids }) {\n      return callDoor<EntityFieldsAcross>(\n        DOORS.entityFieldsAcross,\n        { p_token: token, p_organization_ids: organization_ids },\n        \"entityFieldsAcross\",\n      );\n    },\n\n    async entityFieldDeclare({ token, spec }) {\n      return callDoor<Uuid>(\n        DOORS.entityFieldDeclare,\n        { p_organization_id: org, p_token: token, p_spec: spec },\n        \"entityFieldDeclare\",\n      );\n    },\n\n    async entityFieldUpdate({ field_id, patch }) {\n      return callDoor<Uuid>(\n        DOORS.entityFieldUpdate,\n        { p_organization_id: org, p_field_id: field_id, p_patch: patch },\n        \"entityFieldUpdate\",\n      );\n    },\n\n    async entityFieldRetire({ field_id }) {\n      return callDoor<Uuid>(\n        DOORS.entityFieldRetire,\n        { p_organization_id: org, p_field_id: field_id },\n        \"entityFieldRetire\",\n      );\n    },\n\n    async entityFieldRights({ token }) {\n      return callDoor<EntityFieldRights>(\n        DOORS.entityFieldRights,\n        { p_organization_id: org, p_token: token },\n        \"entityFieldRights\",\n      );\n    },\n\n    async entityRecordRead({ token, record_id }) {\n      return callDoor<EntityRecordRead>(\n        DOORS.entityRecordRead,\n        { p_organization_id: org, p_token: token, p_record_id: record_id },\n        \"entityRecordRead\",\n      );\n    },\n\n    async entityBackLinks({ token, record_id, organization_id, limit, cursor }) {\n      const answered = await callDoor<EntityBackLinks>(\n        DOORS.entityBackLinks,\n        {\n          p_organization_id: organization_id,\n          p_token: token,\n          p_record_id: record_id,\n          p_limit: limit ?? 50,\n          p_cursor: cursor ?? null,\n        },\n        \"entityBackLinks\",\n      );\n      if (!answered.ok) return answered;\n      return ok({ ...answered.data, items: answered.data.items ?? [], next_cursor: answered.data.next_cursor ?? null });\n    },\n\n    async entityRowWrite({ token, record_id, organization_id, custom, columns, expected_version, archive }) {\n      // No organization: a change by id is governed by the row's own (access is personal).\n      // OWED, NOT ASSUMED: lane 7 W3a's door is on the clone and not yet on main, so the generated\n      // catalog (read from main) does not list it. Asked anyway; a store without it answers\n      // `door_absent` naming the owing migration, and records-ui falls back to the older door.\n      return owedDoor<EntityRowWritten>(\n        DOORS.entityRowWrite,\n        {\n          // a new row goes into the organization the call names, else this client's own\n          p_organization_id: record_id == null ? (organization_id ?? org ?? null) : (organization_id ?? null),\n          p_token: token,\n          p_record_id: record_id ?? null,\n          p_columns: columns ?? {},\n          p_custom: custom ?? {},\n          p_expected_version: expected_version ?? null,\n          p_archive: archive ?? null,\n        },\n        \"entityRowWrite\",\n      );\n    },\n\n    async entityRecordsFind({ token, key, value, limit, offset }) {\n      return callDoor<EntityRecordsFound>(\n        DOORS.entityRecordsFind,\n        {\n          p_organization_id: org,\n          p_token: token,\n          p_key: key,\n          p_value: value === undefined ? null : value,\n          ...(limit === undefined ? {} : { p_limit: limit }),\n          ...(offset === undefined ? {} : { p_offset: offset }),\n        },\n        \"entityRecordsFind\",\n      );\n    },\n\n    async migrateRetype({ field_id, to, note }) {\n      return structureMoved(null, await callDoor<FieldRetyped>(\n        DOORS.migrateRetype,\n        { p_organization_id: org, p_id: field_id, p_to: to, ...(note ? { p_note: note } : {}) },\n        \"migrateRetype\",\n      ));\n    },\n\n    async migrateMerge({ winner_id, loser_id, note }) {\n      const result = await callDoor<RecordsMerged>(\n        DOORS.migrateMerge,\n        { p_organization_id: org, p_winner_id: winner_id, p_loser_id: loser_id, p_note: note ?? null },\n        \"migrateMerge\",\n      );\n      // Both records changed: every screen holding either reads it again.\n      if (result.ok) {\n        announceRecordChanged(winner_id);\n        announceRecordChanged(loser_id);\n      }\n      return result;\n    },\n\n    async migrateSplit({ record_id, moved_keys, note }) {\n      const result = await callDoor<RecordSplit>(\n        DOORS.migrateSplit,\n        { p_organization_id: org, p_record_id: record_id, p_moved_keys: moved_keys, p_note: note ?? null },\n        \"migrateSplit\",\n      );\n      if (result.ok) {\n        announceRecordChanged(record_id);\n        announceRecordChanged(result.data.new_record);\n      }\n      return result;\n    },\n\n    async migrateExtractParent({ record_id, parent_table_id, moved_keys, note }) {\n      const result = await callDoor<ParentExtracted>(\n        DOORS.migrateExtractParent,\n        { p_organization_id: org, p_id: record_id, p_parent_table_id: parent_table_id, p_moved_keys: moved_keys, p_note: note ?? null },\n        \"migrateExtractParent\",\n      );\n      if (result.ok) {\n        announceRecordChanged(record_id);\n        announceRecordChanged(result.data.parent);\n      }\n      return result;\n    },\n\n    async migrateMoveRecord({ record_id, to_table_id, note }) {\n      const result = await callDoor<RecordMoved>(\n        DOORS.migrateRetype,\n        { p_organization_id: org, p_id: record_id, p_to: to_table_id, ...(note ? { p_note: note } : {}) },\n        \"migrateMoveRecord\",\n      );\n      if (result.ok) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async migrations({ target_id, limit }) {\n      return callDoor<MigrationEntry[]>(\n        DOORS.migrations,\n        { p_organization_id: org, p_target_id: target_id ?? null, p_limit: limit ?? 100 },\n        \"migrations\",\n      );\n    },\n\n    async historyRetention(args) {\n      return callDoor<HistoryRetention>(\n        DOORS.historyRetention,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"historyRetention\",\n      );\n    },\n\n    async historyRetentionSet({ table_id, days }) {\n      return callDoor<number>(\n        DOORS.historyRetentionSet,\n        { p_organization_id: org, p_table_id: table_id, p_days: days },\n        \"historyRetentionSet\",\n      );\n    },\n\n    async historyRetentionFloorRaise({ days }) {\n      return callDoor<number>(\n        DOORS.historyRetentionFloorRaise,\n        { p_organization_id: org, p_days: days },\n        \"historyRetentionFloorRaise\",\n      );\n    },\n\n    async recordAsOf({ record_id, recorded_at, world_on }) {\n      return callDoor<Record<string, unknown> | null>(\n        DOORS.queryRecordAsOf,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          ...(recorded_at ? { p_recorded_at: recorded_at } : {}),\n          ...(world_on ? { p_world_on: world_on.slice(0, 10) } : {}),\n        },\n        \"recordAsOf\",\n      );\n    },\n\n    async migrateUndo({ migration_id }) {\n      const result = await callDoor<MigrationUndone>(\n        DOORS.migrateUndo,\n        { p_organization_id: org, p_log_id: migration_id },\n        \"migrateUndo\",\n      );\n      if (result.ok && result.data.record_id) announceRecordChanged(result.data.record_id);\n      if (result.ok && result.data.removed) announceRecordChanged(result.data.removed);\n      return result;\n    },\n\n    async fieldUpdate({ field_id, patch }) {\n      return structureMoved(null, await callDoor<Uuid>(\n        DOORS.fieldUpdate,\n        { p_organization_id: org, p_field_id: field_id, p_patch: patch },\n        \"fieldUpdate\",\n      ));\n    },\n\n    async fieldRetypePreview({ field_id, patch }) {\n      return callDoor<FieldRetypePreview>(\n        DOORS.fieldRetypePreview,\n        { p_organization_id: org, p_field_id: field_id, p_patch: patch },\n        \"fieldRetypePreview\",\n      );\n    },\n\n    async fieldRetire({ field_id }) {\n      return structureMoved(null, await callDoor<boolean>(\n        DOORS.fieldRetire,\n        { p_organization_id: org, p_field_id: field_id },\n        \"fieldRetire\",\n      ));\n    },\n\n    async fieldRestore({ field_id }) {\n      return structureMoved(null, await callDoor<boolean>(\n        DOORS.fieldRestore,\n        { p_organization_id: org, p_field_id: field_id },\n        \"fieldRestore\",\n      ));\n    },\n\n    async fieldDuplicate({ field_id }) {\n      return structureMoved(null, await callDoor<FieldDuplicated>(\n        DOORS.fieldDuplicate,\n        { p_organization_id: org, p_field_id: field_id },\n        \"fieldDuplicate\",\n      ));\n    },\n\n    async fieldSourceArchived({ field_id }) {\n      const result = await callDoor<unknown>(\n        DOORS.fieldSourceArchived,\n        { p_organization_id: org, p_field_id: field_id },\n        \"fieldSourceArchived\",\n      );\n      if (!result.ok) return result;\n      return ok(sourceArchivedOf(result.data));\n    },\n\n    async tableKindFacts({ table_id }) {\n      return callDoor<TableKindFacts>(DOORS.tableKindFacts, { p_table_id: table_id }, \"tableKindFacts\");\n    },\n\n    async tableLevelFacts({ table_id }) {\n      return callDoor<TableLevelFacts>(DOORS.tableLevelFacts, { p_table_id: table_id }, \"tableLevelFacts\");\n    },\n\n    async setTableConfidential({ table_id, readers, reason }) {\n      const result = await callDoor<TableLevelSet>(\n        DOORS.setTableConfidential,\n        { p_table_id: table_id, p_readers: readers, p_reason: reason },\n        \"setTableConfidential\",\n      );\n      if (result.ok) announceTableStructureChanged(table_id);\n      return result;\n    },\n\n    async setTableOrganization({ table_id, reason }) {\n      const result = await callDoor<TableLevelSet>(\n        DOORS.setTableOrganization,\n        { p_table_id: table_id, p_reason: reason },\n        \"setTableOrganization\",\n      );\n      if (result.ok) announceTableStructureChanged(table_id);\n      return result;\n    },\n\n    async fieldsRetired({ table_id }) {\n      const kernel = await callDoor<Uuid>(DOORS.fieldKernelId, {}, \"fieldsRetired.kernel\");\n      if (!kernel.ok) return err(kernel.error);\n      const PAGE = 200;\n      const found: ArchivedRow[] = [];\n      for (let page = 0; page < 25; page += 1) {\n        const answered = await this.listArchived({ table_id: kernel.data, lane: \"org\", limit: PAGE, offset: page * PAGE });\n        if (!answered.ok) return err(answered.error);\n        for (const row of answered.data.rows) {\n          if (String((row.document as Record<string, unknown>)[\"entity_definition_id\"] ?? \"\") === table_id) found.push(row);\n        }\n        if (answered.data.rows.length < PAGE) break;\n      }\n      return ok(found);\n    },\n\n    async relationWords({ field_id, value }) {\n      return callDoor<string | null>(\n        DOORS.relationWords,\n        { p_organization_id: org, p_field_id: field_id, p_value: value },\n        \"relationWords\",\n      );\n    },\n\n    async reverseColumns({ table_id }) {\n      // OWED until `pnpm records:generate` lists it: proven on the clone, applied by\n      // migrations/campaign/viewsfields_bl_a_link_shows_on_both_tables.sql.\n      const result = await owedDoor<ReverseColumn[]>(\n        DOORS.reverseColumns,\n        { p_organization_id: org, p_table_id: table_id },\n        \"reverseColumns\",\n      );\n      if (!result.ok) return result;\n      return ok(Array.isArray(result.data) ? result.data : []);\n    },\n\n    async reverseLinksMany(args) {\n      const ids = [...new Set(args.record_ids.filter((id) => typeof id === \"string\" && id.length > 0))];\n      const out: Record<string, ReverseLinks> = {};\n      for (let at = 0; at < ids.length; at += REVERSE_LINKS_RECORDS_PER_CALL) {\n        const result = await owedDoor<Array<{ record_id: Uuid; total: number | null; links: ReverseLinks[\"links\"] | null }>>(\n          DOORS.reverseLinksMany,\n          {\n            p_organization_id: org,\n            p_table_id: args.table_id,\n            p_field_id: args.source_field_id,\n            p_record_ids: ids.slice(at, at + REVERSE_LINKS_RECORDS_PER_CALL),\n            p_limit: args.limit ?? 10,\n            p_offset: args.offset ?? 0,\n          },\n          \"reverseLinksMany\",\n        );\n        if (!result.ok) return result;\n        for (const row of result.data ?? []) {\n          if (!row?.record_id) continue;\n          out[row.record_id] = {\n            total: typeof row.total === \"number\" ? row.total : 0,\n            links: Array.isArray(row.links) ? row.links : [],\n          };\n        }\n      }\n      return ok(out);\n    },\n\n    async reverseLinksFields(args) {\n      const ids = [...new Set(args.record_ids.filter((id) => typeof id === \"string\" && id.length > 0))];\n      const fieldIds = [...new Set(args.source_field_ids)];\n      const out: Record<string, Record<string, ReverseLinks>> = Object.fromEntries(fieldIds.map((id) => [id, {}]));\n      for (let f = 0; f < fieldIds.length || f === 0; f += 20) {\n        for (let at = 0; at < ids.length; at += REVERSE_LINKS_RECORDS_PER_CALL) {\n          const result = await owedDoor<Array<{ field_id: Uuid; record_id: Uuid; total: number | null; links: ReverseLinks[\"links\"] | null }>>(\n            DOORS.reverseLinksManyFields,\n            {\n              p_organization_id: org,\n              p_table_id: args.table_id,\n              p_field_ids: fieldIds.slice(f, f + 20),\n              p_record_ids: ids.slice(at, at + REVERSE_LINKS_RECORDS_PER_CALL),\n              p_limit: args.limit ?? 10,\n              p_offset: args.offset ?? 0,\n            },\n            \"reverseLinksFields\",\n          );\n          if (!result.ok) return result;\n          for (const row of result.data ?? []) {\n            if (!row?.record_id || !row.field_id) continue;\n            (out[row.field_id] ??= {})[row.record_id] = {\n              total: typeof row.total === \"number\" ? row.total : 0,\n              links: Array.isArray(row.links) ? row.links : [],\n            };\n          }\n        }\n        if (fieldIds.length === 0) break;\n      }\n      return ok(out);\n    },\n\n    async relationReverseField({ field_id, label }) {\n      const made = await owedDoor<Uuid>(\n        DOORS.relationReverseField,\n        { p_organization_id: org, p_field_id: field_id, p_label: label ?? null },\n        \"relationReverseField\",\n      );\n      if (made.ok) announceTableStructureChanged(null);\n      return made;\n    },\n\n    async relationReverseSet({ record_id, field_id, add, remove }) {\n      const done = await owedDoor<number>(\n        DOORS.relationReverseSet,\n        { p_organization_id: org, p_record_id: record_id, p_field_id: field_id, p_add: [...(add ?? [])], p_remove: [...(remove ?? [])] },\n        \"relationReverseSet\",\n      );\n      if (done.ok) for (const id of [record_id, ...(add ?? []), ...(remove ?? [])]) announceRecordChanged(id);\n      return done;\n    },\n\n    async relationNamesMatch(args) {\n      // One call per 5,000 distinct names (the door's own cap), answers joined in order.\n      const distinct: string[] = [];\n      const seen = new Set<string>();\n      for (const name of args.names) {\n        const key = name.trim().replace(/\\s+/g, \" \").toLowerCase();\n        if (key === \"\" || seen.has(key)) continue;\n        seen.add(key);\n        distinct.push(name.trim());\n      }\n      const joined: RelationNamesAnswer = { table_id: args.table_id, table_name: null, names: [] };\n      for (let at = 0; at === 0 || at < distinct.length; at += 5000) {\n        // OWED until `pnpm records:generate` lists it: proven on the clone, applied by\n        // migrations/campaign/visionreach_g1_a_relation_is_filled_by_its_name.sql.\n        const result = await owedDoor<RelationNamesAnswer>(\n          DOORS.relationNamesMatch,\n          { p_organization_id: org, p_table_id: args.table_id, p_names: distinct.slice(at, at + 5000) },\n          \"relationNamesMatch\",\n        );\n        if (!result.ok) return result;\n        joined.table_name = result.data?.table_name ?? joined.table_name;\n        joined.title_field = result.data?.title_field ?? joined.title_field ?? null;\n        joined.names.push(...(result.data?.names ?? []));\n        if (distinct.length === 0) break;\n      }\n      return { ok: true, data: joined } as RecordsResult<RelationNamesAnswer>;\n    },\n\n    async relationWordsMany(args) {\n      // The door returns one row per id — `(record_id, words)` — and a caller wants a lookup, so\n      // the shape is turned here rather than in every screen. An id the store answered nothing for\n      // is simply ABSENT from the map, and the caller decides what an absent chip says; inventing\n      // \"Untitled\" here would hide the difference between \"no answer yet\" and \"no words\".\n      // ICONS RIDE THE SAME CALL (CHAIR-EMBEDDED-FIDELITY 14): the with-icons door wraps the words\n      // door, so the ladder is the same; a database without it falls back to the plain door.\n      const doorArgs = { p_organization_id: org, p_field_id: args.field_id, p_record_ids: args.record_ids };\n      // A host whose data source throws on a door it does not know is answered by the plain door.\n      const withIcons: RecordsResult<Array<{ record_id: Uuid; words: string | null }>> = await owedDoor<Array<{ record_id: Uuid; words: string | null }>>(\n        DOORS.relationWordsWithIconsMany,\n        doorArgs,\n        \"relationWordsMany\",\n      ).catch(() => err({ code: \"door_absent\", message: \"relation_words_with_icons_many is not answered here.\" } as RecordsError));\n      // The real door answers one row per id asked; an empty answer to a non-empty ask is a store that\n      // does not speak it (a stub, an older database), so the plain door answers instead.\n      const result = withIcons.ok && (!Array.isArray(withIcons.data) || withIcons.data.length > 0 || args.record_ids.length === 0)\n        ? withIcons\n        : await callDoor<Array<{ record_id: Uuid; words: string | null }>>(DOORS.relationWordsMany, doorArgs, \"relationWordsMany\");\n      if (!result.ok) return result;\n      const icons: Record<string, RelationIcons> = {};\n      const map: Record<string, string> = {};\n      // ARCHIVED (lane REFERENCE-KEEPS-ARCHIVED, chair ruling B3-21): an archive keeps every\n      // reference to what it archived, and the store's words door says which of these ids are in\n      // Archived items (`archived`, true only for a record this reader may see). A door without\n      // that column (a database before the column) answers none.\n      const archived: string[] = [];\n      for (const row of (result.data ?? []) as Array<{\n        record_id?: Uuid;\n        words: string | null;\n        archived?: boolean | null;\n        icon?: string | null;\n        table_icon?: string | null;\n      }>) {\n        const id = row?.record_id;\n        if (id && typeof row.words === \"string\") map[id] = row.words;\n        if (id && row.archived === true) archived.push(id);\n        if (id && (row.icon || row.table_icon)) icons[id] = { icon: row.icon ?? null, tableIcon: row.table_icon ?? null };\n      }\n      return { ok: true, data: map, archived, icons };\n    },\n\n    async tableFind(args) {\n      const slug = \"slug\" in args && typeof args.slug === \"string\" ? args.slug.trim() : \"\";\n      const name = \"name\" in args && typeof args.name === \"string\" ? args.name.trim() : \"\";\n      const keptFor = typeof args.keptFor === \"string\" ? args.keptFor.trim() : \"\";\n      const found = await owedDoor<\n        { id: Uuid; document?: unknown; level?: string; archived?: boolean; archived_at?: string } | null\n      >(\n        DOORS.tableFind,\n        {\n          p_organization_id: org,\n          p_slug: slug || null,\n          p_name: slug ? null : name || null,\n          // Only when asked: a store whose table_find predates kept_for still answers a plain find.\n          ...(keptFor ? { p_kept_for: keptFor } : {}),\n        },\n        \"tableFind\",\n      );\n      if (!found.ok) return err(found.error);\n      if (!found.data) return ok(null);\n      if (found.data.archived === true) {\n        return ok({ id: found.data.id, organization_id: org, archived_at: found.data.archived_at ?? null } as unknown as Table);\n      }\n      const { document } = unfold(found.data.document);\n      // Same shape as a `tableList` / `tableRead` entry; the level is the kernel's, never carried.\n      return ok({ ...(document as Record<string, unknown>), id: found.data.id, organization_id: org } as unknown as Table);\n    },\n\n    async tableFindMany({ organizationIds, slug, keptFor }) {\n      const orgs = [...new Set(organizationIds.filter(Boolean))];\n      if (orgs.length === 0) return ok({ tables: [], refused: [] });\n      const found = await owedDoor<Array<{\n        organization_id: Uuid;\n        table?: { id: Uuid; document?: unknown; archived?: boolean } | null;\n        refused?: { code?: string; message?: string };\n      }> | null>(\n        DOORS.tableFindMany,\n        { p_organization_ids: orgs, p_slug: slug.trim(), p_kept_for: keptFor?.trim() || null },\n        \"tableFindMany\",\n      );\n      if (!found.ok) return err(found.error);\n      const tables: Table[] = [];\n      const refused: Array<{ organization_id: Uuid; error: RecordsError }> = [];\n      for (const entry of found.data ?? []) {\n        if (entry.refused) {\n          refused.push({\n            organization_id: entry.organization_id,\n            error: mapPgError({ code: entry.refused.code ?? \"\", message: entry.refused.message ?? \"\" }, \"tableFindMany\"),\n          });\n          continue;\n        }\n        // An archived match (kept_for given, no live one) is no table to read rows from.\n        if (!entry.table?.id || entry.table.archived === true) continue;\n        const { document } = unfold(entry.table.document);\n        tables.push({ ...(document as Record<string, unknown>), id: entry.table.id, organization_id: entry.organization_id } as unknown as Table);\n      }\n      return ok({ tables, refused });\n    },\n\n    async tableEnsure({ spec }) {\n      const ensured = await owedDoor<{ table_id: Uuid; home_id: Uuid | null; created: boolean; drift?: unknown }>(\n        DOORS.tableEnsure,\n        { p_organization_id: org, p_spec: spec },\n        \"tableEnsure\",\n      );\n      if (!ensured.ok) return ensured;\n      return ok({ ...ensured.data, drift: parseFieldDrift(ensured.data.drift) });\n    },\n\n    async recordUpsert({ table_id, key, data, expectedVersion }) {\n      const keys = (Array.isArray(key) ? key : [key]).map((k) => k.trim()).filter((k) => k.length > 0);\n      const result = await owedDoor<Uuid>(\n        DOORS.recordUpsert,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_key: keys,\n          // The op id rides the envelope, as `recordWrite` / `recordUpdate` send it; each door takes it off.\n          p_data: { ...data, _op_id: mintOp() },\n          ...(expectedVersion === undefined ? {} : { p_expected_version: expectedVersion }),\n        },\n        \"recordUpsert\",\n      );\n      if (result.ok) announceRecordChanged(result.data);\n      return result;\n    },\n\n    async tableDeclare({ spec, homeId }) {\n      return callDoor<Uuid>(\n        DOORS.tableDeclare,\n        { p_organization_id: org, p_spec: { ...spec, parent_id: homeId } },\n        \"tableDeclare\",\n      );\n    },\n\n    async personKernelId() {\n      // A CONSTANT (`custom.person_kernel_id` is IMMUTABLE): asked once per client, never per birth.\n      if (personKernelOnce) return ok(personKernelOnce);\n      const answer = await callDoor<Uuid>(DOORS.personKernelId, {}, \"personKernelId\");\n      if (answer.ok) personKernelOnce = answer.data;\n      return answer;\n    },\n\n    async fieldKernelId() {\n      return callDoor<Uuid>(DOORS.fieldKernelId, {}, \"fieldKernelId\");\n    },\n\n    async ruleKernelId() {\n      return callDoor<Uuid>(DOORS.ruleKernelId, {}, \"ruleKernelId\");\n    },\n\n    async pipelineRead({ table_id }) {\n      return callDoor<Pipeline>(\n        DOORS.pipelineRead,\n        { p_organization_id: org, p_table_id: table_id },\n        \"pipelineRead\",\n      );\n    },\n\n    async pipelineBoard({ table_id, measure, filter }) {\n      // With a question, the four-argument door; without one, exactly the call it always was.\n      const asked = filter && stableFilterKey(filter) !== \"{}\";\n      return callDoor<PipelineColumn[]>(\n        DOORS.pipelineBoard,\n        asked\n          ? { p_organization_id: org, p_table_id: table_id, p_measure: measure ?? null, p_filter: filter }\n          : { p_organization_id: org, p_table_id: table_id, p_measure: measure ?? null },\n        \"pipelineBoard\",\n      );\n    },\n\n    async pipelineTransitionRefusal({ record_id, to }) {\n      return callDoor<PipelineVerdict>(\n        DOORS.pipelineTransitionRefusal,\n        { p_organization_id: org, p_record_id: record_id, p_to: to },\n        \"pipelineTransitionRefusal\",\n      );\n    },\n\n    async pipelineMove({ record_id, to, also, expected_version }) {\n      return callDoor<PipelineMoveResult>(\n        DOORS.pipelineMove,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_to: to,\n          p_also: also ?? {},\n          p_expected_version: expected_version ?? null,\n        },\n        \"pipelineMove\",\n      );\n    },\n\n    async pipelineMoveMany({ moves }) {\n      return callDoor<PipelineMoveMany>(\n        DOORS.pipelineMoveMany,\n        { p_organization_id: org, p_moves: moves },\n        \"pipelineMoveMany\",\n      );\n    },\n\n    async pipelineDeclare({ table_id, spec }) {\n      return callDoor<PipelineDeclared>(\n        DOORS.pipelineDeclare,\n        { p_organization_id: org, p_table_id: table_id, p_spec: spec },\n        \"pipelineDeclare\",\n      );\n    },\n\n    async tableStageField({ table_id }) {\n      return callDoor<string | null>(\n        DOORS.tableStageField,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableStageField\",\n      );\n    },\n\n    async stageRuleOnFailKinds() {\n      return callDoor<{ behaviour: StageRuleOnFail; note: string }[]>(\n        DOORS.stageRuleOnFailKinds,\n        {},\n        \"stageRuleOnFailKinds\",\n      );\n    },\n\n    async stageRuleEnforcement() {\n      return callDoor<StageRuleEnforcement>(\n        DOORS.stageRuleEnforcement,\n        { p_organization_id: org },\n        \"stageRuleEnforcement\",\n      );\n    },\n\n    async recordStagePending({ record_id }) {\n      return callDoor<StagePending[]>(\n        DOORS.recordStagePending,\n        { p_organization_id: org, p_record_id: record_id },\n        \"recordStagePending\",\n      );\n    },\n\n    async pipelinePending({ table_id }) {\n      return callDoor<StagePendingOnBoard[]>(\n        DOORS.pipelinePending,\n        { p_organization_id: org, p_table_id: table_id },\n        \"pipelinePending\",\n      );\n    },\n\n    async pipelineGatePreview({ table_id, stage, gate }) {\n      return callDoor<PipelineGatePreview>(\n        DOORS.pipelineGatePreview,\n        { p_organization_id: org, p_table_id: table_id, p_stage: stage, p_gate: gate },\n        \"pipelineGatePreview\",\n      );\n    },\n\n    async ruleMembersVisible({ rule_id, limit = 200, offset = 0 }) {\n      const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string }>>(\n        DOORS.ruleMembersVisible,\n        { p_organization_id: org, p_rule_id: rule_id, p_limit: limit, p_offset: offset },\n        \"ruleMembersVisible\",\n      );\n      if (!door.ok) return err(door.error);\n      return ok((door.data ?? []).map((row) => {\n        const { document, hidden } = unfold(row.document);\n        return { id: row.id, document, level: row.level, hidden, ...waitingMark(row) } as ReadRow;\n      }));\n    },\n\n    async ruleMembers({ rule_id }) {\n      return callDoor<StoredRecord[]>(\n        DOORS.ruleMembers,\n        { p_organization_id: org, p_rule_id: rule_id },\n        \"ruleMembers\",\n      );\n    },\n\n    async ruleMembership({ rule_id, record_id }) {\n      return callDoor<unknown>(\n        DOORS.ruleMembership,\n        { p_organization_id: org, p_rule_id: rule_id, p_record_id: record_id },\n        \"ruleMembership\",\n      );\n    },\n\n    async forms(args) {\n      return callDoor<FormSummary[]>(\n        DOORS.forms,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"forms\",\n      );\n    },\n\n    async bookings(args) {\n      return callDoor<BookingSummary[]>(\n        DOORS.bookings,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"bookings\",\n      );\n    },\n\n    async bookingDeclare(args) {\n      return callDoor<BookingDeclared>(\n        DOORS.bookingDeclare,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_title: args.title,\n          p_questions: args.questions,\n          // AN EMPTY OBJECT IS NOT A MISTAKE. The store owns every default, so a\n          // page declared with no availability comes back Monday-to-Friday,\n          // nine-to-five, in the organization's own zone — and the screen draws\n          // what came BACK rather than what it sent.\n          p_availability: args.availability ?? {},\n          p_presentation: args.presentation ?? {},\n          p_submission_cap: args.submission_cap ?? null,\n          p_quarantine_rule_id: args.quarantine_rule_id ?? null,\n          p_notify_rule_id: args.notify_rule_id ?? null,\n          p_form_id: args.form_id ?? null,\n          p_slug: args.slug ?? null,\n          p_home_id: args.home_id ?? null,\n        },\n        \"bookingDeclare\",\n      );\n    },\n\n    async formPreviewAsks({ table_id, questions, values }) {\n      return callDoor<Array<{ field_key: string; asked: boolean; decided: boolean; said: string | null }>>(\n        DOORS.formPreviewAsks,\n        { p_organization_id: org, p_table_id: table_id, p_questions: questions, p_values: values },\n        \"formPreviewAsks\",\n      );\n    },\n\n    async formPreviewRoute({ table_id, questions, endings, values }) {\n      return callDoor<FormRoute>(\n        DOORS.formPreviewRoute,\n        { p_organization_id: org, p_table_id: table_id, p_questions: questions, p_endings: endings ?? [], p_values: values },\n        \"formPreviewRoute\",\n      );\n    },\n\n    async formResults({ form_id }) {\n      return callDoor<FormResults>(\n        DOORS.formResults,\n        { p_organization_id: org, p_form_id: form_id },\n        \"formResults\",\n      );\n    },\n\n    async formKnobs() {\n      return callDoor<{ show_owner_header: boolean; choice_auto_advance: boolean }>(\n        DOORS.formKnobs,\n        { p_organization_id: org },\n        \"formKnobs\",\n      );\n    },\n\n    async formSetPassword({ form_id, password }) {\n      return callDoor<{ has_password: boolean }>(\n        DOORS.formSetPassword,\n        { p_organization_id: org, p_form_id: form_id, p_password: password },\n        \"formSetPassword\",\n      );\n    },\n\n    async formLookOptions(args) {\n      return callDoor<FormLookOptions>(\n        DOORS.formLookOptions,\n        { p_organization_id: org, p_presentation: args?.presentation ?? {} },\n        \"formLookOptions\",\n      );\n    },\n\n    async formDeclare(args) {\n      return callDoor<Uuid>(\n        DOORS.formDeclare,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_title: args.title,\n          p_questions: args.questions,\n          p_presentation: args.presentation ?? {},\n          p_submission_cap: args.submission_cap ?? null,\n          p_quarantine_rule_id: args.quarantine_rule_id ?? null,\n          p_notify_rule_id: args.notify_rule_id ?? null,\n          p_form_id: args.form_id ?? null,\n          p_slug: args.slug ?? null,\n        },\n        \"formDeclare\",\n      );\n    },\n\n    async importPlan(args) {\n      return callDoor<ImportPlan>(\n        DOORS.importPlan,\n        { p_organization_id: org, p_table_id: args.table_id, p_columns: args.columns },\n        \"importPlan\",\n      );\n    },\n\n    async importBegin(args) {\n      return callDoor<ImportOpened>(\n        DOORS.importBegin,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_format: args.format ?? \"csv\",\n          p_source_name: args.source_name ?? null,\n          p_source_columns: args.source_columns ?? [],\n          p_file_hash: args.file_hash ?? null,\n          p_policy: args.policy ?? {},\n          p_dedupe_key: args.dedupe_key ?? null,\n          p_file_bytes: args.file_bytes ?? null,\n          p_force: args.force ?? false,\n        },\n        \"importBegin\",\n      );\n    },\n\n    async importDeclareColumns(args) {\n      return callDoor<ImportColumnsDeclared>(\n        DOORS.importDeclareColumns,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_rows: args.rows,\n          p_mapping: args.mapping ?? {},\n        },\n        \"importDeclareColumns\",\n      );\n    },\n\n    async importRows(args) {\n      return callDoor<ImportBatchResult>(\n        DOORS.importRows,\n        {\n          p_organization_id: org,\n          p_import_id: args.import_id,\n          p_rows: args.rows,\n          p_mapping: args.mapping ?? {},\n        },\n        \"importRows\",\n      );\n    },\n\n    async importFinish(args) {\n      return callDoor<ImportFinished>(\n        DOORS.importFinish,\n        { p_organization_id: org, p_import_id: args.import_id, p_unmapped: args.unmapped ?? null },\n        \"importFinish\",\n      );\n    },\n\n    async importReport(args) {\n      return callDoor<ImportReport>(\n        DOORS.importReport,\n        {\n          p_organization_id: org,\n          p_import_id: args.import_id,\n          p_state: args.state ?? \"refused\",\n          p_limit: args.limit ?? 100,\n          p_offset: args.offset ?? 0,\n        },\n        \"importReport\",\n      );\n    },\n\n    async imports(args) {\n      return callDoor<ImportRun[]>(\n        DOORS.imports,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null, p_limit: args?.limit ?? 25 },\n        \"imports\",\n      );\n    },\n\n    async importForget(args) {\n      return callDoor<boolean>(\n        DOORS.importForget,\n        { p_organization_id: org, p_import_id: args.import_id },\n        \"importForget\",\n      );\n    },\n\n    async inboundDeclare(args) {\n      return callDoor<InboundDeclared>(\n        DOORS.inboundDeclare,\n        { p_organization_id: org, p_table_id: args.table_id, p_label: args.label ?? null },\n        \"inboundDeclare\",\n      );\n    },\n\n    async inboundAddresses(args) {\n      return callDoor<InboundAddress[]>(\n        DOORS.inboundAddresses,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"inboundAddresses\",\n      );\n    },\n\n    async inboundSet(args) {\n      return callDoor<{ inbound_id: Uuid; address: string; enabled: boolean; message: string }>(\n        DOORS.inboundSet,\n        { p_organization_id: org, p_inbound_id: args.inbound_id, p_enabled: args.enabled },\n        \"inboundSet\",\n      );\n    },\n\n    async portals() {\n      return callDoor<PortalSummary[]>(DOORS.portals, { p_organization_id: org }, \"portals\");\n    },\n\n    async listPortals(args) {\n      return callDoor<PortalSummary[]>(\n        DOORS.listPortals,\n        { p_organization_id: org, p_archived: args?.archived ?? \"active\" },\n        \"listPortals\",\n      );\n    },\n\n    async portalArchive(args) {\n      return callDoor<PortalArchiveAnswer>(\n        DOORS.portalArchive,\n        {\n          p_organization_id: org,\n          p_portal_id: args.portal_id,\n          p_confirm_title: args.confirm_title,\n          p_reason: args.reason ?? null,\n        },\n        \"portalArchive\",\n      );\n    },\n\n    async portalRestore(args) {\n      return callDoor<PortalArchiveAnswer>(\n        DOORS.portalRestore,\n        {\n          p_organization_id: org,\n          p_portal_id: args.portal_id,\n          p_confirm_title: args.confirm_title,\n        },\n        \"portalRestore\",\n      );\n    },\n\n    async formArchive({ form_id }) {\n      return callDoor<FormArchiveAnswer>(\n        DOORS.formArchive,\n        { p_organization_id: org, p_form_id: form_id },\n        \"formArchive\",\n      );\n    },\n\n    async formRestore({ form_id }) {\n      return callDoor<FormArchiveAnswer>(\n        DOORS.formRestore,\n        { p_organization_id: org, p_form_id: form_id },\n        \"formRestore\",\n      );\n    },\n\n    async formsArchived(args) {\n      return callDoor<ArchivedForm[]>(\n        DOORS.formsArchived,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null, p_limit: args?.limit ?? 100 },\n        \"formsArchived\",\n      );\n    },\n\n    async checklistTemplatesArchived(args) {\n      return callDoor<ArchivedChecklistTemplate[]>(\n        DOORS.checklistTemplatesArchived,\n        { p_organization_id: org, p_about_table_id: args?.about_table_id ?? null, p_limit: args?.limit ?? 100 },\n        \"checklistTemplatesArchived\",\n      );\n    },\n\n    async tableRowLabel({ table_id }) {\n      return callDoor<TableRowLabel>(\n        DOORS.tableRowLabel,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableRowLabel\",\n      );\n    },\n\n    async tableRowLabelSet({ table_id, formula }) {\n      return callDoor<TableRowLabel>(\n        DOORS.tableRowLabelSet,\n        { p_organization_id: org, p_table_id: table_id, p_formula: clearsRowLabel(formula) ? null : formula },\n        \"tableRowLabelSet\",\n      );\n    },\n\n    async tableRowDefaults({ table_id }) {\n      return callDoor<TableRowDefaults>(\n        DOORS.tableRowDefaults,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableRowDefaults\",\n      );\n    },\n\n    async tableRowDefaultsSet({ table_id, defaults }) {\n      return callDoor<TableRowDefaults>(\n        DOORS.tableRowDefaultsSet,\n        { p_organization_id: org, p_table_id: table_id, p_defaults: defaults },\n        \"tableRowDefaultsSet\",\n      );\n    },\n\n    async tableRowDefaultsApply({ table_id, after }) {\n      return callDoor<RowDefaultsApplied>(\n        DOORS.tableRowDefaultsApply,\n        { p_organization_id: org, p_table_id: table_id, p_after: after ?? null },\n        \"tableRowDefaultsApply\",\n      );\n    },\n\n    async rowDefaultsApplyAll({ table_id, maxPasses }) {\n      // EVERY PASS, SUMMED. The door stops at its time budget and says where; a screen that showed\n      // one pass's count would under-report a big table. The cap keeps a runaway loop finite.\n      const cap = Math.max(1, maxPasses ?? 200);\n      let after: Uuid | null = null;\n      let total: RowDefaultsApplied | null = null;\n      for (let pass = 0; pass < cap; pass += 1) {\n        const step: RecordsResult<RowDefaultsApplied> = await callDoor<RowDefaultsApplied>(\n          DOORS.tableRowDefaultsApply,\n          { p_organization_id: org, p_table_id: table_id, p_after: after },\n          \"tableRowDefaultsApply\",\n        );\n        if (!step.ok) return step;\n        total = total\n          ? {\n              ...step.data,\n              seen: total.seen + step.data.seen,\n              changed: total.changed + step.data.changed,\n              kept_by_hand: total.kept_by_hand + step.data.kept_by_hand,\n            }\n          : step.data;\n        if (step.data.done || !step.data.next_after) break;\n        after = step.data.next_after;\n      }\n      return ok(total as RowDefaultsApplied);\n    },\n\n    async recordRowControls({ record_id }) {\n      return callDoor<RecordRowControls>(\n        DOORS.recordRowControls,\n        { p_organization_id: org, p_record_id: record_id },\n        \"recordRowControls\",\n        // A person with table-level access only has no row controls: the door says so, the record's\n        // header draws nothing, and that is not a failure.\n        { quiet: true },\n      );\n    },\n\n    async recordRowControlsSet({ record_id, controls }) {\n      const result = await callDoor<RecordRowControls>(\n        DOORS.recordRowControlsSet,\n        { p_organization_id: org, p_record_id: record_id, p_controls: controls },\n        \"recordRowControlsSet\",\n      );\n      if (result.ok) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async portalTables() {\n      return callDoor<PortalTableRef[]>(DOORS.portalTables, { p_organization_id: org }, \"portalTables\");\n    },\n\n    async portalCard({ portal_id }) {\n      return callDoor<PortalCard>(\n        DOORS.portalCard,\n        { p_organization_id: org, p_portal_id: portal_id },\n        \"portalCard\",\n      );\n    },\n\n    async portalDeclare(args) {\n      return callDoor<Uuid>(\n        DOORS.portalDeclare,\n        {\n          p_organization_id: org,\n          p_title: args.title,\n          p_client_table_id: args.client_table_id,\n          p_tables: args.tables,\n          p_portal_id: args.portal_id ?? null,\n          p_slug: args.slug ?? null,\n          p_sign_in_method: args.sign_in_method ?? \"magic_link\",\n          // S6: sent only when given, so a caller that says nothing about the look keeps it.\n          ...(args.config !== undefined ? { p_config: args.config } : {}),\n        },\n        \"portalDeclare\",\n      );\n    },\n\n    async portalForm({ portal_id, form_id }) {\n      return callDoor<PortalFormSpec>(\n        DOORS.portalForm,\n        { p_organization_id: org, p_portal_id: portal_id, p_form_id: form_id },\n        \"portalForm\",\n      );\n    },\n\n    async portalFormSubmit({ portal_id, form_id, answers, client_key }) {\n      return callDoor<PortalFormAnswer>(\n        DOORS.portalFormSubmit,\n        {\n          p_organization_id: org,\n          p_portal_id: portal_id,\n          p_form_id: form_id,\n          p_payload: answers,\n          p_client_key: client_key ?? null,\n        },\n        \"portalFormSubmit\",\n      );\n    },\n\n    async portalInvite(args) {\n      return callDoor<PortalInvitation>(\n        DOORS.portalInvite,\n        {\n          p_organization_id: org,\n          p_portal_id: args.portal_id,\n          p_client_record_id: args.client_record_id,\n          p_email: args.email,\n          // ALWAYS null from a client. See the interface comment: an invitation\n          // confers nothing until the person follows their own sign-in link.\n          p_user_id: null,\n        },\n        \"portalInvite\",\n      );\n    },\n\n    async portalRevoke({ portal_id, principal_id }) {\n      return callDoor<PortalRevocation>(\n        DOORS.portalRevoke,\n        { p_organization_id: org, p_portal_id: portal_id, p_principal_id: principal_id },\n        \"portalRevoke\",\n      );\n    },\n\n    async portalPreview({ portal_id, principal_id, table_id }) {\n      return callDoor<PortalPreviewRow[]>(\n        DOORS.portalPreview,\n        {\n          p_organization_id: org,\n          p_portal_id: portal_id,\n          p_principal_id: principal_id,\n          p_table_id: table_id,\n        },\n        \"portalPreview\",\n      );\n    },\n\n    async ruleRun({ rule_id, values, context }) {\n      return callDoor<unknown>(\n        DOORS.ruleRun,\n        {\n          p_organization_id: org,\n          p_rule_id: rule_id,\n          p_values: values,\n          ...(context === undefined ? {} : { p_context: context }),\n        },\n        \"ruleRun\",\n      );\n    },\n\n    async ruleEval({ expr, values, context }) {\n      return callDoor<unknown>(\n        DOORS.ruleEval,\n        {\n          p_organization_id: org,\n          p_expr: expr,\n          p_values: values,\n          ...(context === undefined ? {} : { p_context: context }),\n        },\n        \"ruleEval\",\n      );\n    },\n\n    async captureSheetDeclare(args) {\n      return callDoor<Uuid>(\n        DOORS.captureSheetDeclare,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_title: args.title,\n          p_questions: args.questions,\n          p_presentation: args.presentation ?? {},\n          p_sheet_id: args.sheet_id ?? null,\n          p_notify_rule_id: args.notify_rule_id ?? null,\n        },\n        \"captureSheetDeclare\",\n      );\n    },\n\n    async capturePublish(args) {\n      return callDoor<string | null>(\n        DOORS.capturePublish,\n        { p_organization_id: org, p_sheet_id: args.sheet_id, p_open: args.open ?? true },\n        \"capturePublish\",\n      );\n    },\n\n    async captureSheets(args) {\n      return callDoor<CaptureSheetSummary[]>(\n        DOORS.captureSheets,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"captureSheets\",\n      );\n    },\n\n    async captureOpen(args) {\n      const out = await callDoor<CaptureSheetFace[] | CaptureSheetFace | null>(\n        DOORS.captureOpen,\n        { p_organization_id: org, p_sheet_id: args.sheet_id },\n        \"captureOpen\",\n      );\n      if (!out.ok) return out as RecordsResult<CaptureSheetFace | null>;\n      const rows = Array.isArray(out.data) ? out.data : out.data ? [out.data] : [];\n      // NO ROW is the answer for a sheet below `viewer` AND for a sheet that is not\n      // there — the same answer the Table itself gives. It is not an error.\n      return { ...out, data: rows[0] ?? null } as RecordsResult<CaptureSheetFace | null>;\n    },\n\n    async captureSubmit(args) {\n      const out = await callDoor<CaptureOutcome[] | CaptureOutcome | null>(\n        DOORS.captureSubmit,\n        {\n          p_organization_id: org,\n          p_sheet_id: args.sheet_id,\n          p_client_key: args.client_key,\n          p_payload: args.answers ?? {},\n          p_files: args.files ?? [],\n          p_device: args.device ?? null,\n          p_captured_at: args.captured_at ?? null,\n          p_location: args.location ?? null,\n        },\n        \"captureSubmit\",\n      );\n      if (!out.ok) return out as RecordsResult<CaptureOutcome | null>;\n      const rows = Array.isArray(out.data) ? out.data : out.data ? [out.data] : [];\n      return { ...out, data: rows[0] ?? null } as RecordsResult<CaptureOutcome | null>;\n    },\n\n    async enrichments(args) {\n      return callDoor<EnrichmentSummary[]>(\n        DOORS.enrichments,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"enrichments\",\n      );\n    },\n\n    async enrichDeclare(args) {\n      return callDoor<EnrichDeclared>(\n        DOORS.enrichDeclare,\n        { p_organization_id: org, p_field_id: args.field_id, p_spec: args.spec },\n        \"enrichDeclare\",\n      );\n    },\n\n    async enrichDue(args) {\n      return callDoor<EnrichDueRow[]>(\n        DOORS.enrichDue,\n        {\n          p_organization_id: org,\n          p_field_id: args.field_id,\n          p_limit: args.limit ?? 50,\n          p_include_fresh: args.include_fresh ?? false,\n        },\n        \"enrichDue\",\n      );\n    },\n\n    async enrichCells(args) {\n      return callDoor<EnrichCell[]>(\n        DOORS.enrichCells,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_field_keys: args.field_keys ?? null,\n          p_record_ids: args.record_ids ?? null,\n        },\n        \"enrichCells\",\n      );\n    },\n\n    async enrichPin(args) {\n      return callDoor<{ pinned: boolean; says: string }>(\n        DOORS.enrichPin,\n        {\n          p_organization_id: org,\n          p_record_id: args.record_id,\n          p_field_key: args.field_key,\n          p_pinned: args.pinned ?? true,\n        },\n        \"enrichPin\",\n      );\n    },\n\n    async enrichRuns(args) {\n      return callDoor<EnrichRun[]>(\n        DOORS.enrichRuns,\n        {\n          p_organization_id: org,\n          p_field_id: args?.field_id ?? null,\n          p_limit: args?.limit ?? 50,\n        },\n        \"enrichRuns\",\n      );\n    },\n\n    async interfaceRead({ interface_id }) {\n      return callDoor<InterfaceRead | null>(DOORS.interfaceRead, { p_interface_id: interface_id }, \"interfaceRead\");\n    },\n\n    async interfaceRows({ interface_id, element_id, record_id, limit, offset }) {\n      return callDoor<InterfaceRows | null>(\n        DOORS.interfaceRows,\n        {\n          p_interface_id: interface_id,\n          p_element_id: element_id,\n          p_record_id: record_id ?? null,\n          p_limit: limit ?? 200,\n          p_offset: offset ?? 0,\n        },\n        \"interfaceRows\",\n      );\n    },\n\n    async interfaceChart({ interface_id, chart_id }) {\n      return callDoor<DashboardBlockResult | null>(\n        DOORS.interfaceChart,\n        { p_interface_id: interface_id, p_chart_id: chart_id },\n        \"interfaceChart\",\n      );\n    },\n\n    async dashboards(args) {\n      return callDoor<DashboardSummary[]>(\n        DOORS.dashboards,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"dashboards\",\n      );\n    },\n\n    async dashboardDeclare(args) {\n      return callDoor<Uuid>(\n        DOORS.dashboardDeclare,\n        {\n          p_organization_id: org,\n          p_table_id: args.table_id,\n          p_name: args.name,\n          p_blocks: args.blocks ?? [],\n          p_presentation: args.presentation ?? {},\n          p_dashboard_id: args.dashboard_id ?? null,\n        },\n        \"dashboardDeclare\",\n      );\n    },\n\n    async dashboardRun({ dashboard_id, filter, compare, grain }) {\n      return callDoor<DashboardRunResult>(\n        DOORS.dashboardRun,\n        {\n          p_organization_id: org,\n          p_dashboard_id: dashboard_id,\n          p_filter: filter ?? {},\n          // Sent only when asked, so a caller that never compares calls exactly what it did.\n          ...(compare ? { p_compare: compare } : {}),\n          ...(grain ? { p_grain: grain } : {}),\n        },\n        \"dashboardRun\",\n      );\n    },\n\n    async dashboardStuck({ table_id, state_key, days, filter, limit }) {\n      return callDoor<StuckRow[]>(\n        DOORS.dashboardStuck,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_state_key: state_key,\n          p_days: days ?? 14,\n          p_filter: filter ?? {},\n          p_limit: limit ?? 50,\n        },\n        \"dashboardStuck\",\n      );\n    },\n\n    async dashboardDelete({ dashboard_id }) {\n      return callDoor<boolean>(\n        DOORS.dashboardDelete,\n        { p_organization_id: org, p_dashboard_id: dashboard_id },\n        \"dashboardDelete\",\n      );\n    },\n\n    async recordAggregate({ table_id, organization_id, groupBy, measures, bucket, filter, limit, compare, search, time_zone, splitMulti }) {\n      if (spans(organization_id)) {\n        // The aggregate runs in the organization that OWNS the table (never the active one by\n        // default). Not found in any ⇒ asked in the page's / own organization anyway, so the\n        // refusal is the store's own sentence for a table that is not there.\n        const owner = await client.ownerOrganization({ table_id, ...(organization_id ? { organization_id } : {}) });\n        const target = owner.ok && owner.data ? owner.data : (organization_id ?? org);\n        if (target !== org) {\n          const answered = await clientFor(target).recordAggregate({\n            table_id,\n            ...(groupBy ? { groupBy } : {}),\n            ...(measures ? { measures } : {}),\n            ...(bucket !== undefined ? { bucket } : {}),\n            ...(filter ? { filter } : {}),\n            ...(limit !== undefined ? { limit } : {}),\n            ...(compare !== undefined ? { compare } : {}),\n            ...(search ? { search } : {}),\n            ...(time_zone ? { time_zone } : {}),\n            ...(splitMulti ? { splitMulti } : {}),\n          });\n          return answered.ok\n            ? ok(answered.data.map((row) => ({ ...row, organization_id: target })) as AggregateRow[])\n            : answered;\n        }\n      }\n      const asked = await callDoor<AggregateRow[]>(\n        DOORS.recordAggregate,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_group_by: groupBy ?? [],\n          p_measures: measures ?? [],\n          p_bucket: bucket ?? null,\n          p_filter: filter ?? {},\n          p_limit: limit ?? 200,\n          ...(compare ? { p_compare: compare } : {}),\n          ...(search && search.trim() !== \"\" ? { p_search: search } : {}),\n          ...(time_zone ? { p_time_zone: time_zone } : {}),\n          ...(splitMulti ? { p_split_multi: true } : {}),\n        },\n        \"recordAggregate\",\n      );\n      // AGG-WITHHELD: the store answers a column this reader may not read as a state, not an error.\n      return asked.ok ? ok(liftWithheld(asked.data)) : asked;\n    },\n\n    async recordAggregateAsOf({ table_id, recorded_at, measure, field_key, group_by, match }) {\n      if (spans()) {\n        const owner = await client.ownerOrganization({ table_id });\n        if (!owner.ok) return err(owner.error);\n        if (owner.data && owner.data !== org) {\n          return clientFor(owner.data).recordAggregateAsOf({\n            table_id,\n            recorded_at,\n            ...(measure ? { measure } : {}),\n            ...(field_key ? { field_key } : {}),\n            ...(group_by ? { group_by } : {}),\n            ...(match ? { match } : {}),\n          });\n        }\n      }\n      return callDoor<Array<{\n        bucket: string | null;\n        result: number | null;\n        row_count: number;\n        not_numbers: number;\n        a_non_number: string | null;\n      }>>(\n        DOORS.recordAggregateAsOf,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_recorded_at: recorded_at,\n          p_measure: measure ?? \"count\",\n          p_field_key: field_key ?? null,\n          p_group_by: group_by ?? null,\n          p_match: match ?? {},\n        },\n        \"recordAggregateAsOf\",\n      );\n    },\n\n    async aggOperations() {\n      return callDoor<string[]>(DOORS.aggOperations, {}, \"aggOperations\");\n    },\n\n    async aggBuckets() {\n      return callDoor<string[]>(DOORS.aggBuckets, {}, \"aggBuckets\");\n    },\n\n    async aggCalendar() {\n      return callDoor<{ time_zone: string; week_start: string }>(DOORS.aggCalendar, { p_organization_id: org }, \"aggCalendar\");\n    },\n\n    async drillDescribe({ source }) {\n      return drillDoor<DrillDefinition>(DRILL_DOORS.describe, { p_organization_id: org, p_source: source }, \"drillDescribe\");\n    },\n\n    async drillAsk({ source, question }) {\n      const answer = await drillDoor<DrillAnswerRow[]>(\n        DRILL_DOORS.ask,\n        { p_organization_id: org, p_source: source, p_question: question ?? {} },\n        \"drillAsk\",\n      );\n      return answer.ok ? ok(drillAnswerOf(answer.data ?? [])) : answer;\n    },\n\n    async drillRows({ source, where, window, sort, lane, columns, limit, offset, search }) {\n      const question: Record<string, unknown> = {};\n      if (where) question.where = where;\n      if (window) question.window = window;\n      if (sort) question.sort = sort;\n      if (lane) question.lane = lane;\n      if (columns) question.columns = columns;\n      if (limit !== undefined) question.limit = limit;\n      if (offset !== undefined) question.offset = offset;\n      if (search !== undefined && search.trim() !== \"\") {\n        // The door asks a search together with a scope (`platform._drill_compile`); the Table API\n        // sends \"all\" (every row this person may read) — never narrower than the unsearched read.\n        question.search = search.trim();\n        question.scope = \"all\";\n      }\n      return drillDoor<DrillRowsPage>(\n        DRILL_DOORS.rows,\n        { p_organization_id: org, p_source: source, p_question: question },\n        \"drillRows\",\n      );\n    },\n\n    async aggSubscriptions(args) {\n      return callDoor<Subscription[]>(\n        DOORS.aggSubscriptions,\n        {\n          p_organization_id: org,\n          p_saved_view_id: args?.saved_view_id ?? null,\n          p_cadence: args?.cadence ?? null,\n        },\n        \"aggSubscriptions\",\n      );\n    },\n\n    async aggSubscriptionCadences() {\n      return callDoor<string[]>(DOORS.aggSubscriptionCadences, {}, \"aggSubscriptionCadences\");\n    },\n\n    async subscriptionCadences() {\n      return callDoor<string[]>(\n        DOORS.subscriptionCadences,\n        { p_organization_id: org },\n        \"subscriptionCadences\",\n      );\n    },\n\n    async subscriptions(args) {\n      return callDoor<MySubscription[]>(\n        DOORS.subscriptions,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"subscriptions\",\n      );\n    },\n\n    async subscriptionDeclare({ table_id, spec }) {\n      return callDoor<Uuid>(\n        DOORS.subscriptionDeclare,\n        // The schedule is read in the owner's clock, never silently in UTC (`withCallersClock`).\n        { p_organization_id: org, p_table_id: table_id, p_spec: withCallersClock(spec) },\n        \"subscriptionDeclare\",\n      );\n    },\n\n    async subscriptionPreview({ rule_id }) {\n      return callDoor<DigestPreview>(\n        DOORS.subscriptionPreview,\n        { p_organization_id: org, p_rule_id: rule_id },\n        \"subscriptionPreview\",\n      );\n    },\n\n    async views(args) {\n      return callDoor<SavedViewRow[]>(\n        DOORS.views,\n        { p_organization_id: org, p_table_id: args?.table_id ?? null },\n        \"views\",\n      );\n    },\n\n    async rowTemplates({ table_id }) {\n      return callDoor<RowTemplateRow[]>(\n        DOORS.rowTemplates,\n        { p_organization_id: org, p_table_id: table_id },\n        \"rowTemplates\",\n      );\n    },\n\n    async rowTemplateDeclare({ table_id, spec }) {\n      return callDoor<Uuid>(\n        DOORS.rowTemplateDeclare,\n        { p_organization_id: org, p_table_id: table_id, p_spec: spec },\n        \"rowTemplateDeclare\",\n      );\n    },\n\n    async viewDeclare({ table_id, spec }) {\n      return callDoor<Uuid>(\n        DOORS.viewDeclare,\n        { p_organization_id: org, p_table_id: table_id, p_spec: spec },\n        \"viewDeclare\",\n      );\n    },\n\n    async viewArchive({ view_id }) {\n      return publicDoor<Record<string, unknown> | null>(\n        \"saved_view_archive\",\n        { p_surface_key: SAVED_VIEW_SURFACE, p_id: view_id },\n        \"viewArchive\",\n        \"platform\",\n      );\n    },\n\n    async viewRestore({ view_id }) {\n      return publicDoor<boolean>(\"entity_undelete\", { p_token: \"platform_saved_view\", p_id: view_id }, \"viewRestore\", \"platform\");\n    },\n\n    async viewDesignate({ table_id, view_id, layout }) {\n      return callDoor<Uuid>(\n        DOORS.viewDesignate,\n        { p_organization_id: org, p_table_id: table_id, p_view_id: view_id, p_layout: layout ?? null },\n        \"viewDesignate\",\n      );\n    },\n\n    async viewLookRead({ table_id }) {\n      const answered = await callDoor<Record<string, { look: Record<string, unknown>; updated_at: string }> | null>(\n        DOORS.viewLookRead,\n        { p_organization_id: org, p_table_id: table_id },\n        \"viewLookRead\",\n      );\n      return answered.ok ? ok(answered.data ?? {}) : answered;\n    },\n\n    async viewLookSet({ table_id, view_id, look }) {\n      return callDoor<Record<string, unknown> | null>(\n        DOORS.viewLookSet,\n        { p_organization_id: org, p_table_id: table_id, p_view_id: view_id, p_look: look },\n        \"viewLookSet\",\n      );\n    },\n\n    async subscriptionMute({ rule_id, muted }) {\n      return callDoor<boolean>(\n        DOORS.subscriptionMute,\n        { p_organization_id: org, p_rule_id: rule_id, p_muted: muted },\n        \"subscriptionMute\",\n      );\n    },\n\n    async docTemplateSave({ table_id, name, body, template_id }) {\n      return callDoor<Uuid>(\n        DOORS.docTemplateSave,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_name: name,\n          p_body: body,\n          p_template_id: template_id ?? null,\n        },\n        \"docTemplateSave\",\n      );\n    },\n\n    async docRenderBody({ template_id, record_id }) {\n      return callDoor<string>(\n        DOORS.docRenderBody,\n        { p_organization_id: org, p_template_id: template_id, p_record_id: record_id },\n        \"docRenderBody\",\n      );\n    },\n\n    async docRenderDocument({ template_id, record_id }) {\n      return callDoor<Uuid>(\n        DOORS.docRenderDocument,\n        { p_organization_id: org, p_template_id: template_id, p_record_id: record_id },\n        \"docRenderDocument\",\n      );\n    },\n\n    async docTokens({ body }) {\n      return callDoor<DocToken[]>(DOORS.docTokens, { p_body: body }, \"docTokens\");\n    },\n\n    async docUnresolvedTokens({ table_id, body }) {\n      return callDoor<DocUnresolvedToken[]>(\n        DOORS.docUnresolvedTokens,\n        { p_organization_id: org, p_table_id: table_id, p_body: body },\n        \"docUnresolvedTokens\",\n      );\n    },\n\n    async docSign({ render_id, field_key, signer_name, signer_user_id }) {\n      return callDoor<Uuid>(\n        DOORS.docSign,\n        {\n          p_organization_id: org,\n          p_render_id: render_id,\n          p_field_key: field_key,\n          p_signer_name: signer_name,\n          p_signer_user_id: signer_user_id ?? null,\n        },\n        \"docSign\",\n      );\n    },\n\n    // A LIST IS A DOOR, NEVER A GRANT ON THE THING BEHIND IT. These three used to\n    // read `custom.doc_template`, `custom.doc_render` and `custom.doc_signature`\n    // with a direct PostgREST `.from()`, and none of the three holds a client\n    // SELECT — so a person could save a template they could never list and\n    // render a document they could never find again, and every document screen\n    // opened on \"permission denied for view doc_template\". The doors below\n    // narrow inside the definer, after the ladder has spoken (DOORS-TWO).\n    async docTemplates({ table_id }) {\n      // The door names its key `template_id`, because a door answers about the\n      // thing it is a door to. The package's row keeps `id`, which is what every\n      // screen already holds — one rename, here, rather than in four screens.\n      const answered = await callDoor<Array<Record<string, unknown>>>(\n        DOORS.docTemplates,\n        { p_organization_id: org, p_table_id: table_id },\n        \"docTemplates\",\n      );\n      if (!answered.ok) return answered;\n      return ok(\n        answered.data.map((row) => ({ ...row, id: row[\"template_id\"] })) as unknown as DocTemplateRow[],\n      );\n    },\n\n    async docTemplateDelete({ template_id }) {\n      return callDoor<boolean>(\n        DOORS.docTemplateDelete,\n        { p_organization_id: org, p_template_id: template_id },\n        \"docTemplateDelete\",\n      );\n    },\n\n    async docTemplateRestore({ template_id }) {\n      return callDoor<boolean>(\n        DOORS.docTemplateRestore,\n        { p_organization_id: org, p_template_id: template_id },\n        \"docTemplateRestore\",\n      );\n    },\n\n    async docRenderDelete({ render_id }) {\n      return callDoor<boolean>(\n        DOORS.docRenderDelete,\n        { p_organization_id: org, p_render_id: render_id },\n        \"docRenderDelete\",\n      );\n    },\n\n    async docRenderRestore({ render_id }) {\n      return callDoor<boolean>(\n        DOORS.docRenderRestore,\n        { p_organization_id: org, p_render_id: render_id },\n        \"docRenderRestore\",\n      );\n    },\n\n    async docRenders({ record_id }) {\n      const answered = await callDoor<Array<Record<string, unknown>>>(\n        DOORS.docRenders,\n        { p_organization_id: org, p_record_id: record_id },\n        \"docRenders\",\n      );\n      if (!answered.ok) return answered;\n      return ok(\n        answered.data.map((row) => ({ ...row, id: row[\"render_id\"] })) as unknown as DocRenderRow[],\n      );\n    },\n\n    async docSignatures({ record_id }) {\n      const answered = await callDoor<Array<Record<string, unknown>>>(\n        DOORS.docSignatures,\n        { p_organization_id: org, p_record_id: record_id },\n        \"docSignatures\",\n      );\n      if (!answered.ok) return answered;\n      return ok(\n        answered.data.map((row) => ({ ...row, id: row[\"signature_id\"] })) as unknown as DocSignatureRow[],\n      );\n    },\n\n    async recordValuesVersioned({ record_id, organization_id }) {\n      if (organization_id && organization_id !== org) {\n        return clientFor(organization_id).recordValuesVersioned({ record_id, organization_id });\n      }\n      if (readOrgs(organization_id).length > 1) {\n        return openInOwnOrg<ReadValue[]>(\n          record_id,\n          organization_id,\n          (sub) => sub.recordValuesVersioned({ record_id, organization_id: sub.config.organizationId }),\n          (values) => values.length > 0,\n        );\n      }\n      return readValues(record_id);\n    },\n\n    async revisions({ record_id }) {\n      return callDoor<RecordRevision[]>(\n        DOORS.ioRevisions,\n        { p_organization_id: org, p_record_id: record_id },\n        \"revisions\",\n      );\n    },\n\n    async recordScopeContext({ record_id, relations, history, siblings }) {\n      return callDoor<RecordScopeContext>(\n        DOORS.recordScopeContext,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_relations: relations ?? 12,\n          p_history: history ?? 15,\n          p_siblings: siblings ?? 8,\n        },\n        \"recordScopeContext\",\n      );\n    },\n\n    async conversationScope({ conversation_id }) {\n      return callDoor<ConversationScope>(\n        DOORS.conversationScope,\n        { p_organization_id: org, p_conversation_id: conversation_id },\n        \"conversationScope\",\n      );\n    },\n\n    async conversationScopeBind({ conversation_id, record_id }) {\n      return callDoor<ConversationScope>(\n        DOORS.conversationScopeBind,\n        {\n          p_organization_id: org,\n          p_conversation_id: conversation_id,\n          p_record_id: record_id,\n        },\n        \"conversationScopeBind\",\n      );\n    },\n\n    async conversationScopeUnbind({ conversation_id }) {\n      return callDoor<ConversationScope>(\n        DOORS.conversationScopeUnbind,\n        { p_organization_id: org, p_conversation_id: conversation_id },\n        \"conversationScopeUnbind\",\n      );\n    },\n\n    async conversationScopeContext({ conversation_id, relations, history, siblings }) {\n      return callDoor<ConversationScopeContext>(\n        DOORS.conversationScopeContext,\n        {\n          p_organization_id: org,\n          p_conversation_id: conversation_id,\n          p_relations: relations ?? 12,\n          p_history: history ?? 15,\n          p_siblings: siblings ?? 8,\n        },\n        \"conversationScopeContext\",\n      );\n    },\n\n    async recordHistory({ record_id, limit, offset }) {\n      return callDoor<RecordHistoryEntry[]>(\n        DOORS.recordHistory,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_limit: limit ?? 200,\n          p_offset: offset ?? 0,\n        },\n        \"recordHistory\",\n      );\n    },\n\n    async fieldHistory({ table_id, field_key, limit, offset, record_id }) {\n      return callDoor<FieldHistoryEntry[]>(\n        DOORS.fieldHistory,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_field_key: field_key,\n          p_limit: limit ?? 100,\n          p_offset: offset ?? 0,\n          p_record_id: record_id ?? null,\n        },\n        \"fieldHistory\",\n      );\n    },\n\n    async formulaHistory({ record_id, field_key, limit }) {\n      return callDoor<FormulaHistoryEntry[]>(\n        DOORS.formulaHistory,\n        { p_organization_id: org, p_record_id: record_id, p_field_key: field_key, p_limit: limit ?? 100 },\n        \"formulaHistory\",\n      );\n    },\n\n    async restorePreview({ record_id, version, field_key }) {\n      return callDoor<RestorePreview>(\n        DOORS.restorePreview,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_version: version,\n          p_field_key: field_key ?? null,\n        },\n        \"restorePreview\",\n      );\n    },\n\n    async restoreVersion({ record_id, version }) {\n      const result = await callDoor<RestoreResult>(\n        DOORS.restoreVersion,\n        { p_organization_id: org, p_record_id: record_id, p_version: version },\n        \"restoreVersion\",\n      );\n      if (result.ok) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async valueRestore({ record_id, field_key, version }) {\n      const answered = await callDoor<RestoreResult>(\n        DOORS.valueRestore,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_field_key: field_key,\n          p_version: version,\n        },\n        \"valueRestore\",\n      );\n      if (answered.ok) announceRecordChanged(record_id);\n      return answered;\n    },\n\n    async commentThread({ record_id, include_resolved }) {\n      return callDoor<CommentThreadRead>(\n        DOORS.commentThread,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_include_resolved: include_resolved ?? false,\n        },\n        \"commentThread\",\n      );\n    },\n\n    async commentCounts({ record_ids }) {\n      if (record_ids.length === 0) return { ok: true, data: {} };\n      return callDoor<Record<string, number>>(\n        DOORS.commentCounts,\n        { p_organization_id: org, p_record_ids: [...record_ids] },\n        \"commentCounts\",\n      );\n    },\n\n    async commentWrite({ record_id, body, field_key, parent_comment_id, mentions }) {\n      return callDoor<CommentWritten>(\n        DOORS.commentWrite,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_body: body,\n          // THE ANCHOR IS WHERE A FIELD COMMENT LIVES. `custom.io_comment` has\n          // always carried it; nothing was ever putting a Field in it.\n          p_anchor: field_key ? { field_key } : {},\n          p_parent_comment_id: parent_comment_id ?? null,\n          p_mentions: mentions && mentions.length > 0 ? mentions : null,\n        },\n        \"commentWrite\",\n      );\n    },\n\n    async commentResolve({ comment_id, resolved }) {\n      return callDoor<boolean>(\n        DOORS.commentResolve,\n        {\n          p_organization_id: org,\n          p_comment_id: comment_id,\n          p_resolved: resolved ?? true,\n        },\n        \"commentResolve\",\n      );\n    },\n\n    async recordFollowSet({ record_id, follow }) {\n      return callDoor<RecordFollowSet>(\n        DOORS.recordFollowSet,\n        { p_organization_id: org, p_record_id: record_id, p_follow: follow ?? true },\n        \"recordFollowSet\",\n      );\n    },\n\n    async recordFollowers({ record_id }) {\n      return callDoor<RecordFollowers>(\n        DOORS.recordFollowers,\n        { p_organization_id: org, p_record_id: record_id },\n        \"recordFollowers\",\n      );\n    },\n\n    async docSignatureRead({ signature_id }) {\n      return callDoor<unknown>(\n        DOORS.docSignatureRead,\n        { p_organization_id: org, p_signature_id: signature_id },\n        \"docSignatureRead\",\n      );\n    },\n\n    // ── the anonymous lane ───────────────────────────────────────────────\n    async anonTokenIssue({ mode, allowedOrigins, formId, savedViewId, recordId, expiresAt }) {\n      // The door answers a one-row TABLE, so the array is unwrapped here rather\n      // than in every caller. An empty answer is impossible — the door either\n      // returns the pair or raises — so `[0]` is not a guess.\n      const answered = await callDoor<Array<{ token_id: Uuid; secret: string }>>(\n        DOORS.anonTokenIssue,\n        {\n          p_organization_id: org,\n          p_mode: mode,\n          p_allowed_origins: allowedOrigins,\n          p_form_id: formId ?? null,\n          p_saved_view_id: savedViewId ?? null,\n          p_record_id: recordId ?? null,\n          p_expires_at: expiresAt ?? null,\n        },\n        \"anonTokenIssue\",\n      );\n      if (!answered.ok) return answered;\n      const pair = answered.data[0];\n      if (!pair) {\n        return err({\n          code: \"internal\",\n          message: \"custom.anon_token_issue returned no token, which it cannot do — it either mints one or raises.\",\n          hint: \"Nothing was issued. Do not retry blindly: something between this client and the store changed the answer's shape.\",\n        });\n      }\n      return ok(pair);\n    },\n\n    async anonTokenVerify({ secret, origin, requiredMode }) {\n      const answered = await callDoor<AnonTokenBinding[]>(\n        DOORS.anonTokenVerify,\n        { p_secret: secret, p_origin: origin, p_required_mode: requiredMode ?? null },\n        \"anonTokenVerify\",\n      );\n      if (!answered.ok) return answered;\n      const binding = answered.data[0];\n      if (!binding) {\n        return err({\n          code: \"internal\",\n          message: \"custom.anon_token_verify returned no binding, which it cannot do — it either answers or raises.\",\n          hint: \"Treat this as unverified. It is reported rather than read as 'not valid', because those are different sentences.\",\n        });\n      }\n      return ok(binding);\n    },\n\n    async anonTokenRevoke({ token_id }) {\n      return callDoor<boolean>(\n        DOORS.anonTokenRevoke,\n        { p_organization_id: org, p_token_id: token_id },\n        \"anonTokenRevoke\",\n      );\n    },\n\n    async anonWrite({ secret, origin, payload, clientKey, rawPayload }) {\n      // No `p_organization_id`: the TOKEN supplies the organization. A stranger\n      // naming one would be choosing which tenant to write into.\n      return callDoor<Uuid>(\n        DOORS.anonWrite,\n        {\n          p_secret: secret,\n          p_origin: origin,\n          p_payload: payload,\n          p_client_key: clientKey ?? null,\n          p_raw_payload: rawPayload ?? {},\n        },\n        \"anonWrite\",\n      );\n    },\n\n    async anonCapture({ table_id, clientKey, payload, device, capturedAt }) {\n      return callDoor<Uuid>(\n        DOORS.anonCapture,\n        {\n          p_organization_id: org,\n          p_client_key: clientKey,\n          p_table_id: table_id,\n          p_payload: payload,\n          p_device: device ?? null,\n          p_captured_at: capturedAt ?? null,\n        },\n        \"anonCapture\",\n      );\n    },\n\n    async anonPublish({ form_id, published = true }) {\n      return callDoor<Timestamp | null>(\n        DOORS.anonPublish,\n        { p_organization_id: org, p_form_id: form_id, p_published: published },\n        \"anonPublish\",\n      );\n    },\n\n    // ── work ─────────────────────────────────────────────────────────────\n    async workStates() {\n      return callDoor<WorkState[]>(DOORS.workStates, {}, \"workStates\");\n    },\n\n    async workTemplateRefusal({ graph }) {\n      return callDoor<string | null>(DOORS.workTemplateRefusal, { p_graph: graph }, \"workTemplateRefusal\");\n    },\n\n    async workTemplateDeclare({ name, graph }) {\n      return callDoor<Uuid>(\n        DOORS.workTemplateDeclare,\n        { p_organization_id: org, p_name: name, p_graph: graph },\n        \"workTemplateDeclare\",\n      );\n    },\n\n    async workTemplateInstantiate({ template_id, overrides }) {\n      return callDoor<WorkInstantiation>(\n        DOORS.workTemplateInstantiate,\n        { p_organization_id: org, p_template_id: template_id, p_overrides: overrides ?? {} },\n        \"workTemplateInstantiate\",\n      );\n    },\n\n    async workTemplateShape({ template_id }) {\n      return callDoor<unknown>(\n        DOORS.workTemplateShape,\n        { p_organization_id: org, p_template_id: template_id },\n        \"workTemplateShape\",\n      );\n    },\n\n    async workInstantiationShape({ instantiation_id }) {\n      return callDoor<unknown>(\n        DOORS.workInstantiationShape,\n        { p_organization_id: org, p_instantiation_id: instantiation_id },\n        \"workInstantiationShape\",\n      );\n    },\n\n    async workWhoseTurn({ table_id, includeFinished = false }) {\n      return callDoor<WorkTurn[]>(\n        DOORS.workWhoseTurn,\n        { p_organization_id: org, p_table_id: table_id, p_include_finished: includeFinished },\n        \"workWhoseTurn\",\n      );\n    },\n\n    async workHasAssignment({ table_id }) {\n      return callDoor<boolean>(\n        DOORS.workHasAssignment,\n        { p_organization_id: org, p_table_id: table_id },\n        \"workHasAssignment\",\n      );\n    },\n\n    async workAssignmentFields(args) {\n      return callDoor<WorkAssignmentField[]>(\n        DOORS.workAssignmentFields,\n        { p_options_table_id: args?.options_table_id ?? null },\n        \"workAssignmentFields\",\n      );\n    },\n\n    async workTakeAssignment({ table_id }) {\n      return callDoor<unknown>(\n        DOORS.workTakeAssignment,\n        { p_organization_id: org, p_table_id: table_id },\n        \"workTakeAssignment\",\n      );\n    },\n\n    async workTransitionRefusal({ from_state_id, to_state_id }) {\n      return callDoor<string | null>(\n        DOORS.workTransitionRefusal,\n        { p_organization_id: org, p_from_state_id: from_state_id, p_to_state_id: to_state_id },\n        \"workTransitionRefusal\",\n      );\n    },\n\n    async workSlotsDeclare({ name, slug, homeId }) {\n      return callDoor<unknown>(\n        DOORS.workSlotsDeclare,\n        { p_organization_id: org, p_name: name, p_slug: slug, p_home_id: homeId ?? null },\n        \"workSlotsDeclare\",\n      );\n    },\n\n    async workSlotHold({ table_id, slotKey, holder, ttl }) {\n      return callDoor<unknown>(\n        DOORS.workSlotHold,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_slot_key: slotKey,\n          p_holder: holder,\n          ...(ttl ? { p_ttl: ttl } : {}),\n        },\n        \"workSlotHold\",\n      );\n    },\n\n    async workSlotRelease({ hold_id }) {\n      return callDoor<boolean>(\n        DOORS.workSlotRelease,\n        { p_organization_id: org, p_hold_id: hold_id },\n        \"workSlotRelease\",\n      );\n    },\n\n    async workSlotHolds({ table_id }) {\n      return callDoor<WorkSlotHold[]>(\n        DOORS.workSlotHolds,\n        { p_organization_id: org, p_table_id: table_id },\n        \"workSlotHolds\",\n      );\n    },\n\n    async workSlotExpire({ table_id }) {\n      return callDoor<number>(\n        DOORS.workSlotExpire,\n        { p_organization_id: org, p_table_id: table_id },\n        \"workSlotExpire\",\n      );\n    },\n\n    // ── checklists and SOP runs ──────────────────────────────────────────\n    async checklistRefusal({ spec }) {\n      return callDoor<string | null>(\n        DOORS.checklistRefusal,\n        { p_spec: spec },\n        \"checklistRefusal\",\n      );\n    },\n\n    async checklistDeclare({ spec, template_id = null }) {\n      return callDoor<ChecklistDeclared>(\n        DOORS.checklistDeclare,\n        { p_organization_id: org, p_spec: spec, p_template_id: template_id },\n        \"checklistDeclare\",\n      );\n    },\n\n    async checklistTemplates(args) {\n      return callDoor<ChecklistTemplateSummary[]>(\n        DOORS.checklistTemplates,\n        {\n          p_organization_id: org,\n          p_about_table_id: args?.about_table_id ?? null,\n          p_limit: args?.limit ?? 100,\n        },\n        \"checklistTemplates\",\n      );\n    },\n\n    async checklistTemplateShape({ template_id }) {\n      return callDoor<ChecklistTemplateShape>(\n        DOORS.checklistTemplateShape,\n        { p_organization_id: org, p_template_id: template_id },\n        \"checklistTemplateShape\",\n      );\n    },\n\n    async checklistStart({ template_id, about_record_id = null, roles = {}, startingAt = null }) {\n      return callDoor<ChecklistRunStarted>(\n        DOORS.checklistStart,\n        {\n          p_organization_id: org,\n          p_template_id: template_id,\n          p_about_record_id: about_record_id,\n          p_roles: roles,\n          p_starting_at: startingAt,\n        },\n        \"checklistStart\",\n      );\n    },\n\n    async checklistRun({ run_id }) {\n      return callDoor<ChecklistRunStep[]>(\n        DOORS.checklistRun,\n        { p_organization_id: org, p_run_id: run_id },\n        \"checklistRun\",\n      );\n    },\n\n    async checklistRuns(args) {\n      return callDoor<ChecklistRunSummary[]>(\n        DOORS.checklistRuns,\n        {\n          p_organization_id: org,\n          p_about_table_id: args?.about_table_id ?? null,\n          p_about_record_id: args?.about_record_id ?? null,\n          p_include_closed: args?.includeClosed ?? true,\n          p_limit: args?.limit ?? 100,\n        },\n        \"checklistRuns\",\n      );\n    },\n\n    async checklistStepComplete({ step_id, evidence = {} }) {\n      return callDoor<ChecklistStepCompleted>(\n        DOORS.checklistStepComplete,\n        { p_organization_id: org, p_step_id: step_id, p_evidence: evidence },\n        \"checklistStepComplete\",\n      );\n    },\n\n    async checklistStepRefusal({ step_id }) {\n      return callDoor<string | null>(\n        DOORS.checklistStepRefusal,\n        { p_organization_id: org, p_step_id: step_id },\n        \"checklistStepRefusal\",\n      );\n    },\n\n    // ── the work layer a person actually uses ────────────────────────────\n    async workInbox(args) {\n      return callDoor<WorkInboxItem[]>(\n        DOORS.workInbox,\n        {\n          p_organization_id: org,\n          p_limit: args?.limit ?? 50,\n          p_offset: args?.offset ?? 0,\n          p_include_decided: args?.includeDecided ?? false,\n          p_view: args?.view ?? \"inbox\",\n        },\n        \"workInbox\",\n      );\n    },\n\n    async inboxSnooze({ item_id, until }) {\n      return callDoor<InboxStateChange>(\n        DOORS.inboxSnooze,\n        { p_organization_id: org, p_item_id: item_id, p_until: until },\n        \"inboxSnooze\",\n      );\n    },\n\n    async inboxUnsnooze({ item_id }) {\n      return callDoor<InboxStateChange>(\n        DOORS.inboxUnsnooze,\n        { p_organization_id: org, p_item_id: item_id },\n        \"inboxUnsnooze\",\n      );\n    },\n\n    async inboxClear({ item_id }) {\n      return callDoor<InboxStateChange>(\n        DOORS.inboxClear,\n        { p_organization_id: org, p_item_id: item_id },\n        \"inboxClear\",\n      );\n    },\n\n    async inboxUnclear({ item_id }) {\n      return callDoor<InboxStateChange>(\n        DOORS.inboxUnclear,\n        { p_organization_id: org, p_item_id: item_id },\n        \"inboxUnclear\",\n      );\n    },\n\n    async inboxCounts(args) {\n      return callDoor<InboxCounts[]>(\n        DOORS.inboxCounts,\n        { p_organization_id: args?.everyOrganization ? null : org },\n        \"inboxCounts\",\n      );\n    },\n\n    async workList(args) {\n      return callDoor<WorkListItem[]>(\n        DOORS.workList,\n        {\n          p_organization_id: org,\n          p_flavour: args?.flavour ?? \"mine\",\n          p_include_finished: args?.includeFinished ?? false,\n          p_limit: args?.limit ?? 100,\n          p_offset: args?.offset ?? 0,\n        },\n        \"workList\",\n      );\n    },\n\n    async workAssign({ record_id, user_id = null, dueDate = null, clearDue = false }) {\n      return callDoor<WorkAssignment>(\n        DOORS.workAssign,\n        {\n          p_organization_id: org,\n          p_record_id: record_id,\n          p_assignee_user_id: user_id,\n          p_due_date: dueDate,\n          p_clear_due: clearDue,\n        },\n        \"workAssign\",\n      );\n    },\n\n    async workRecordStates({ record_id }) {\n      return callDoor<WorkRecordState[]>(\n        DOORS.workRecordStates,\n        { p_organization_id: org, p_record_id: record_id },\n        \"workRecordStates\",\n      );\n    },\n\n    async workSetState({ record_id, state_id }) {\n      return callDoor<unknown>(\n        DOORS.workSetState,\n        { p_organization_id: org, p_record_id: record_id, p_state_id: state_id },\n        \"workSetState\",\n      );\n    },\n\n    async workPerson({ user_id, create = true }) {\n      return callDoor<Uuid | null>(\n        DOORS.workPerson,\n        { p_organization_id: org, p_user_id: user_id, p_create: create },\n        \"workPerson\",\n      );\n    },\n\n    async workTemplates(args) {\n      return callDoor<Array<{\n        template_id: Uuid;\n        name: string;\n        nodes: number;\n        relations: number;\n        created_at: string;\n      }>>(\n        DOORS.workTemplates,\n        { p_organization_id: org, p_limit: args?.limit ?? 100 },\n        \"workTemplates\",\n      );\n    },\n\n    async workApprovalApprovers({ subject_id, approver_id = null }) {\n      return callDoor<WorkApprover[]>(\n        DOORS.workApprovalApprovers,\n        { p_organization_id: org, p_subject_id: subject_id, p_approver_id: approver_id },\n        \"workApprovalApprovers\",\n      );\n    },\n\n    async workApprovalRequest({\n      subject_id,\n      change,\n      note = null,\n      approver_id = null,\n      origin = \"person\",\n      conversation_id = null,\n    }) {\n      return callDoor<WorkApprovalFiled>(\n        DOORS.workApprovalRequest,\n        {\n          p_organization_id: org,\n          p_subject_id: subject_id,\n          p_change: change,\n          p_note: note,\n          p_approver_id: approver_id,\n          p_origin: origin,\n          p_conversation_id: conversation_id,\n        },\n        \"workApprovalRequest\",\n      );\n    },\n\n    async workApprovalMayDecide({ approval_id }) {\n      return callDoor<boolean>(\n        DOORS.workApprovalMayDecide,\n        { p_organization_id: org, p_approval_id: approval_id },\n        \"workApprovalMayDecide\",\n      );\n    },\n\n    async workApprovalDecide({ approval_id, approve, note = null }) {\n      return callDoor<WorkApprovalDecision>(\n        DOORS.workApprovalDecide,\n        {\n          p_organization_id: org,\n          p_approval_id: approval_id,\n          p_approve: approve,\n          p_note: note,\n        },\n        \"workApprovalDecide\",\n      );\n    },\n\n    async workDecideMany({ decisions }) {\n      return callDoor<WorkDecideMany>(\n        DOORS.workDecideMany,\n        { p_organization_id: org, p_decisions: decisions },\n        \"workDecideMany\",\n      );\n    },\n\n    async workApprovalRead({ approval_id }) {\n      return callDoor<Record<string, unknown>>(\n        DOORS.workApprovalRead,\n        { p_organization_id: org, p_approval_id: approval_id },\n        \"workApprovalRead\",\n      );\n    },\n\n    // ── the trust doors ──────────────────────────────────────────────────\n    async isExternalPrincipal(args) {\n      return trustDoor<boolean>(\n        TRUST_DOORS.isExternalPrincipal,\n        { p_user_id: args?.user_id ?? null },\n        \"isExternalPrincipal\",\n      );\n    },\n\n    async externalPrincipalCard(args) {\n      return trustDoor<ExternalPrincipalCard>(\n        TRUST_DOORS.externalPrincipalCard,\n        { p_user_id: args?.user_id ?? null },\n        \"externalPrincipalCard\",\n      );\n    },\n\n    async externalPrincipalReach({ resourceType, user_id }) {\n      return trustDoor<Array<{ resource_id: Uuid }>>(\n        TRUST_DOORS.externalPrincipalReach,\n        { p_resource_type: resourceType, p_user_id: user_id ?? null },\n        \"externalPrincipalReach\",\n      );\n    },\n\n    async publishBindingCreate({ slug, resourceType, resource_id, renderMode = \"page\" }) {\n      return trustDoor<PublishBinding>(\n        TRUST_DOORS.publishBindingCreate,\n        {\n          p_slug: slug,\n          p_resource_type: resourceType,\n          p_resource_id: resource_id,\n          p_organization_id: org,\n          p_render_mode: renderMode,\n        },\n        \"publishBindingCreate\",\n      );\n    },\n\n    async publishBindingRevoke({ slug }) {\n      return trustDoor<unknown>(TRUST_DOORS.publishBindingRevoke, { p_slug: slug }, \"publishBindingRevoke\");\n    },\n\n    async resolvePublishBinding({ slug }) {\n      return trustDoor<ResolvedPublishBinding[]>(\n        TRUST_DOORS.resolvePublishBinding,\n        { p_slug: slug },\n        \"resolvePublishBinding\",\n      );\n    },\n\n    async resolvePublishBindingKind({ slug }) {\n      return trustDoor<ResolvedPublishBindingKind[]>(\n        TRUST_DOORS.resolvePublishBindingKind,\n        { p_slug: slug },\n        \"resolvePublishBindingKind\",\n      );\n    },\n\n    async worldPublishGapNotice() {\n      return trustDoor<string>(TRUST_DOORS.worldPublishGapNotice, {}, \"worldPublishGapNotice\");\n    },\n\n    async publishToWorld({ resourceType, resource_id, discoverable = false }) {\n      return trustDoor<unknown>(\n        TRUST_DOORS.publishToWorld,\n        {\n          p_resource_type: resourceType,\n          p_resource_id: resource_id,\n          p_organization_id: org,\n          p_discoverable: discoverable,\n        },\n        \"publishToWorld\",\n      );\n    },\n\n    async ruleDeclare({ spec, rule_id }) {\n      // THE DOOR LANDED (lane FORMS, 2026-09-20). This used to be a refusing\n      // stub, and the refusal was right: until `custom.rule_declare` existed\n      // there was NO way to write a Rule that the store's own rule doors could\n      // see, and pretending otherwise would have been the silent failure the\n      // comment on the interface describes.\n      return callDoor<Uuid>(\n        DOORS.ruleDeclare,\n        { p_organization_id: org, p_spec: spec, p_rule_id: rule_id ?? null },\n        \"ruleDeclare\",\n      );\n    },\n\n    // The words reach the read door in every organization asked (`structureSearchIn`).\n    async metadataSearch({ text, organization_id }) {\n      if (spans(organization_id) && readOrgs(organization_id).length > 0) {\n        const targets = readOrgs(organization_id).filter((t): t is Uuid => t !== null);\n        const unavailable: OrganizationUnavailable[] = [];\n        const answers = await Promise.all(\n          targets.map(async (t) => {\n            // No store switch is asked first: the store is never off (2026-10-03). A refusal of\n            // the read door itself is what makes an organization unavailable.\n            // ONE organization's door — never `sub.metadataSearch` (for the client's own\n            // organization `sub` is this very client, which would span again).\n            const found = await structureSearchIn(t, text);\n            if (!found.ok) {\n              unavailable.push({ organization_id: t, reason: unavailableReason(found.error) });\n              return { t, found };\n            }\n            return { t, found };\n          }),\n        );\n        const matches: MetadataSearchAnswer[\"matches\"] = [];\n        const covered: Uuid[] = [];\n        let firstRefusal: RecordsError | null = null;\n        for (const answer of answers) {\n          if (!answer) continue;\n          if (!answer.found.ok) {\n            firstRefusal ??= answer.found.error;\n            continue;\n          }\n          covered.push(answer.t);\n          for (const m of answer.found.data.matches) matches.push({ ...m, organization_id: answer.t });\n        }\n        const inOrder = (a: OrganizationUnavailable, b: OrganizationUnavailable) =>\n          targets.indexOf(a.organization_id) - targets.indexOf(b.organization_id);\n        unavailable.sort(inOrder);\n        // One organization's refusal never hides the rest; only when NOTHING answered is it a failure.\n        if (covered.length === 0 && firstRefusal) return err(firstRefusal);\n        return ok({ matches, organizations_covered: covered, unavailable });\n      }\n      return structureSearchIn(org, text);\n    },\n\n    async organizationsOpen(args) {\n      const targets = readOrgs(args?.organization_id).filter((t): t is Uuid => t !== null);\n      const open: Uuid[] = [];\n      const unavailable: OrganizationUnavailable[] = [];\n      await Promise.all(\n        targets.map(async (t) => {\n          const result = await clientFor(t).storeIsOpen();\n          // Only a REFUSAL makes an organization unavailable. No organization is \"switched off\":\n          // the store is never off (2026-10-03).\n          if (!result.ok) unavailable.push({ organization_id: t, reason: unavailableReason(result.error) });\n          else open.push(t);\n        }),\n      );\n      const position = (id: Uuid) => targets.indexOf(id);\n      open.sort((a, b) => position(a) - position(b));\n      unavailable.sort((a, b) => position(a.organization_id) - position(b.organization_id));\n      return ok({ open, unavailable });\n    },\n\n    async ownerOrganization({ table_id, record_id, organization_id }) {\n      if (table_id) {\n        const read = await client.tableRead({ table_id, ...(organization_id ? { organization_id } : {}) });\n        if (!read.ok) return err(read.error);\n        return ok(read.data ? (read.data.organization_id ?? null) : null);\n      }\n      if (record_id) {\n        const read = await client.recordRead({ record_id, ...(organization_id ? { organization_id } : {}) });\n        if (!read.ok) return ok(null);\n        const targets = readOrgs(organization_id);\n        return ok(recordOrgs.get(record_id) ?? organization_id ?? (targets.length === 1 ? targets[0] ?? null : null));\n      }\n      return ok(null);\n    },\n\n    async fieldPropose() {\n      const refusal = doorAbsent(DOORS.fieldPropose);\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where: \"fieldPropose\" });\n      return err(refusal);\n    },\n\n    async tablePropose() {\n      const refusal = doorAbsent(DOORS.tablePropose);\n      scream({ code: refusal.code, message: refusal.message, ...(refusal.hint ? { hint: refusal.hint } : {}), where: \"tablePropose\" });\n      return err(refusal);\n    },\n\n    async promoteTable({ table_id }) {\n      return callDoor<unknown>(\n        DOORS.promoteTable,\n        { p_organization_id: org, p_table_id: table_id },\n        \"promoteTable\",\n      );\n    },\n\n    async promoteField({ table_id, field_id }) {\n      return callDoor<unknown>(\n        DOORS.promoteField,\n        { p_organization_id: org, p_table_id: table_id, p_field_id: field_id },\n        \"promoteField\",\n      );\n    },\n\n    async storeIsOpen() {\n      // The store is never off (2026-10-03): `custom.store_is_open` answers true for every\n      // organization, and this method answers true whenever the door answers at all. A refusal\n      // still comes back as a refusal — that is \"could not reach\", never \"off\".\n      const reached = await callDoor<boolean>(DOORS.storeIsOpen, { p_organization_id: org }, \"storeIsOpen\");\n      return reached.ok ? ok(true) : reached;\n    },\n\n    // ── THE GRID (lane GRID-PRIMITIVES) ──────────────────────────────────────\n    async tableDecorate({ table_id, path, value }) {\n      return callDoor<TableDecorations>(\n        DOORS.tableDecorate,\n        { p_organization_id: org, p_table_id: table_id, p_path: path, p_value: value ?? null },\n        \"tableDecorate\",\n      );\n    },\n\n    async tableDecorations({ table_id }) {\n      return callDoor<TableDecorations>(\n        DOORS.tableDecorations,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableDecorations\",\n      );\n    },\n\n    async gridLayout({ table_id, view_id }) {\n      return callDoor<GridLayout>(\n        DOORS.gridLayout,\n        { p_organization_id: org, p_table_id: table_id, p_view_id: view_id ?? null },\n        \"gridLayout\",\n      );\n    },\n\n    async formulaPreview({ table_id, record_id, text }) {\n      return owedDoor<FormulaPreview>(\n        DOORS.formulaPreview,\n        { p_organization_id: org, p_table_id: table_id, p_record_id: record_id, p_text: text },\n        \"formulaPreview\",\n      );\n    },\n\n    async formulaParse({ table_id, text }) {\n      return callDoor<FormulaParse>(\n        DOORS.formulaParse,\n        { p_organization_id: org, p_table_id: table_id, p_text: text },\n        \"formulaParse\",\n      );\n    },\n\n    async actionDeclare({ table_id, actions }) {\n      return callDoor<RowAction[]>(\n        DOORS.actionDeclare,\n        { p_organization_id: org, p_table_id: table_id, p_actions: actions },\n        \"actionDeclare\",\n      );\n    },\n\n    async rowActions({ table_id }) {\n      return callDoor<{ actions: RowAction[]; stale: unknown[] }>(\n        DOORS.rowActions,\n        { p_organization_id: org, p_table_id: table_id },\n        \"rowActions\",\n      );\n    },\n\n    async actionRun({ action_id, record_ids }) {\n      const result = await callDoor<ActionRunResult>(\n        DOORS.actionRun,\n        { p_organization_id: org, p_action_id: action_id, p_record_ids: record_ids },\n        \"actionRun\",\n      );\n      // A button that changed records changed THOSE records: every screen holding one re-reads.\n      if (result.ok) for (const ran of result.data?.records ?? []) if (ran?.record_id) announceRecordChanged(ran.record_id);\n      return result;\n    },\n\n    async automationDeclare({ table_id, spec, automation_id }) {\n      return callDoor<AutomationDeclared>(\n        DOORS.automationDeclare,\n        { p_organization_id: org, p_table_id: table_id, p_spec: spec, p_automation_id: automation_id ?? null },\n        \"automationDeclare\",\n      );\n    },\n\n    async automations({ table_id, include_archived }) {\n      return callDoor<AutomationList>(\n        DOORS.automations,\n        { p_table_id: table_id, p_organization_id: org, p_include_archived: include_archived ?? false },\n        \"automations\",\n      );\n    },\n\n    async automationArchive({ automation_id }) {\n      return callDoor<AutomationFlipped>(\n        DOORS.automationArchive,\n        { p_organization_id: org, p_automation_id: automation_id },\n        \"automationArchive\",\n      );\n    },\n\n    async automationRestore({ automation_id }) {\n      return callDoor<AutomationFlipped>(\n        DOORS.automationRestore,\n        { p_organization_id: org, p_automation_id: automation_id },\n        \"automationRestore\",\n      );\n    },\n\n    async automationSetEnabled({ automation_id, enabled }) {\n      return callDoor<AutomationFlipped>(\n        DOORS.automationSetEnabled,\n        { p_organization_id: org, p_automation_id: automation_id, p_enabled: enabled },\n        \"automationSetEnabled\",\n      );\n    },\n\n    async automationRuns({ automation_id, limit, cursor }) {\n      return callDoor<AutomationRuns>(\n        DOORS.automationRuns,\n        { p_automation_id: automation_id, p_limit: limit ?? 50, p_cursor: cursor ?? null, p_organization_id: org },\n        \"automationRuns\",\n      );\n    },\n\n    async automationTest({ automation_id, record_id }) {\n      const result = await callDoor<AutomationTested>(\n        DOORS.automationTest,\n        { p_organization_id: org, p_automation_id: automation_id, p_record_id: record_id ?? null },\n        \"automationTest\",\n      );\n      // A test run that set properties changed that row: every screen holding it re-reads.\n      if (result.ok && record_id) announceRecordChanged(record_id);\n      return result;\n    },\n\n    async automationRevisions({ automation_id }) {\n      return callDoor<AutomationRevisions>(\n        DOORS.automationRevisions,\n        { p_organization_id: org, p_automation_id: automation_id },\n        \"automationRevisions\",\n      );\n    },\n\n    async automationRevisionRestore({ automation_id, revision_id }) {\n      return callDoor<AutomationDeclared>(\n        DOORS.automationRevisionRestore,\n        { p_organization_id: org, p_automation_id: automation_id, p_revision_id: revision_id },\n        \"automationRevisionRestore\",\n      );\n    },\n\n    async tableWebhookDeclare({ table_id, target_url, events, description }) {\n      return callDoor<TableWebhookDeclared>(\n        DOORS.tableWebhookDeclare,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_target_url: target_url,\n          p_events: events ?? null,\n          p_description: description ?? null,\n        },\n        \"tableWebhookDeclare\",\n      );\n    },\n\n    async tableWebhooks({ table_id }) {\n      return callDoor<TableWebhook[]>(\n        DOORS.tableWebhooks,\n        { p_organization_id: org, p_table_id: table_id },\n        \"tableWebhooks\",\n      );\n    },\n\n    async tableWebhookArchive({ webhook_id }) {\n      return callDoor<boolean>(\n        DOORS.tableWebhookArchive,\n        { p_organization_id: org, p_webhook_id: webhook_id },\n        \"tableWebhookArchive\",\n      );\n    },\n\n    async tableListEverywhere(args) {\n      return callDoor<{ success: boolean; tables: TableListEntry[] }>(\n        DOORS.tableListEverywhere,\n        // The two-argument overload is chosen by naming both arguments (CHAIR-DOORS-2, N-C8).\n        args?.include_platform_tables ? { p_organization_id: org, p_include_platform_tables: true } : { p_organization_id: org },\n        \"tableListEverywhere\",\n      );\n    },\n\n    async dataHomeTables({ organization_id, include_platform_tables }) {\n      // THE ROW CAP (CLOSE-LINK, 2026-10-23; the data home's own fix of 2026-10-17): `custom.data_home_tables` returns a\n      // SET, and PostgREST cuts a set at its max-rows (1,000) in no order, so a person past 1,000 tables silently lost\n      // the rest from every list (\"CL Bookings\" was missing from Move under…'s table picker). `custom.data_home` answers\n      // the SAME rows as ONE jsonb value, which no cap touches. It is asked for everything and the two placement words\n      // the set door leaves out by default are dropped here, so the answer is exactly the set door's, whole.\n      const answered = await callDoor<{ tables?: DataHomeTable[] } | null>(\n        DOORS.dataHome,\n        { p_organization_id: organization_id, p_include_platform_tables: true },\n        \"dataHomeTables\",\n      );\n      if (!answered.ok) return answered;\n      const rows = (answered.data && !Array.isArray(answered.data) ? answered.data.tables : null) ?? [];\n      return { ok: true, data: include_platform_tables ? rows : rows.filter((t) => !DATA_HOME_KEPT_OUT_OF_LISTS.has(t.kind ?? \"\")) };\n    },\n\n    async adminAllTables() {\n      return callDoor<AdminTable[]>(DOORS.adminAllTables, {}, \"adminAllTables\");\n    },\n\n    async tableSync({ home_id, spec }) {\n      return callDoor<TableSyncResult>(\n        DOORS.tableSync,\n        { p_organization_id: org, p_home_id: home_id, p_spec: spec },\n        \"tableSync\",\n      );\n    },\n\n    async tableCopySync(spec) {\n      return callDoor<TableSyncAnswer>(\n        DOORS.tableCopySync,\n        { p_organization_id: org, p_spec: spec },\n        \"tableCopySync\",\n      );\n    },\n\n    async tableSyncSettingsSet({ table_id, settings }) {\n      return callDoor<TableSyncSourceDocument>(\n        DOORS.tableSyncSettingsSet,\n        { p_organization_id: org, p_table_id: table_id, p_settings: settings },\n        \"tableSyncSettingsSet\",\n      );\n    },\n\n    async scopeTableProvision({ home_id, item_id, scope_id }) {\n      return scopes.tableProvision({ organization_id: org, item_id, scope_id, home_id: home_id ?? null });\n    },\n\n    async tableRowCounts({ table_ids }) {\n      return callDoor<TableRowCount[]>(\n        DOORS.tableRowCounts,\n        { p_organization_id: org, p_table_ids: table_ids },\n        \"tableRowCounts\",\n      );\n    },\n\n    async recordHeaders({ ids }) {\n      return callDoor<RecordHeader[]>(\n        DOORS.recordHeaders,\n        { p_organization_id: org, p_ids: ids },\n        \"recordHeaders\",\n      );\n    },\n\n    async tableShareOutsideGrant({ table_id, person, level }) {\n      return callDoor<OutsideShareAnswer>(\n        DOORS.tableShareOutsideGrant,\n        { p_organization_id: org, p_table_id: table_id, p_person: person, p_level: level ?? \"viewer\" },\n        \"tableShareOutsideGrant\",\n      );\n    },\n\n    async viewRecordOrderSet({ view_id, record_ids }) {\n      return callDoor<ViewOrderSet>(\n        DOORS.viewRecordOrderSet,\n        { p_organization_id: org, p_view_id: view_id, p_record_ids: record_ids },\n        \"viewRecordOrderSet\",\n      );\n    },\n\n    async readInViewOrder({ view_id, filter, limit, offset }) {\n      // ORDER-FILTER: the filter goes INTO the order door (one WHERE clause, the ladder inside),\n      // never onto a page of positions afterwards — that read the first 500 positions of the\n      // whole table and misplaced every matching row past them. Sent only when asked.\n      const asked = filter && Object.keys(filter).length > 0 ? filter : null;\n      const door = await callDoor<Array<{ id: Uuid; document: unknown; level: string; position: number | null }>>(\n        DOORS.readRecordsInViewOrder,\n        {\n          p_organization_id: org,\n          p_view_id: view_id,\n          p_by_id: false,\n          p_limit: limit ?? 200,\n          p_offset: offset ?? 0,\n          ...(asked ? { p_filter: asked } : {}),\n        },\n        \"readInViewOrder\",\n      );\n      if (!door.ok) return err(door.error);\n      return ok(\n        (door.data ?? [])\n          .map((row) => {\n            const { document, hidden } = unfold(row.document);\n            return { id: row.id, document, level: row.level, hidden, position: row.position ?? null };\n          })\n          .filter((row) => !isLockedStub(row)),\n      );\n    },\n\n    async buttonPress({ record_id, field_id }) {\n      const result = await callDoor<ButtonPressed>(\n        DOORS.buttonPress,\n        { p_organization_id: org, p_record_id: record_id, p_field_id: field_id },\n        \"buttonPress\",\n      );\n      // A press that changed records changed THOSE records (a row action), or this one (an automation).\n      if (result.ok && result.data?.do === \"run_action\") {\n        for (const ran of result.data.result?.records ?? []) if (ran?.record_id) announceRecordChanged(ran.record_id);\n      }\n      if (result.ok && result.data?.do === \"run_automation\") announceRecordChanged(record_id);\n      if (result.ok && result.data?.do === \"add_row\") announceRecordChanged(result.data.record_id);\n      return result;\n    },\n\n    recordsLimits() {\n      return askLimits();\n    },\n\n    async timelineDependencyShift() {\n      const result = await callDoor<boolean>(DOORS.timelineDependencyShift, { p_organization_id: org }, \"timelineDependencyShift\");\n      if (!result.ok) return result;\n      return ok(result.data !== false);\n    },\n\n    async fieldNotifyOnAssign({ field_id, on }) {\n      return callDoor<FieldNotifyOnAssign>(\n        DOORS.fieldNotifyOnAssign,\n        { p_organization_id: org, p_field_id: field_id, p_on: on },\n        \"fieldNotifyOnAssign\",\n      );\n    },\n\n    async autonumberBackfill({ field_id }) {\n      return callDoor<{ numbered: number; highest: number | null; says: string }>(\n        DOORS.autonumberBackfill,\n        { p_organization_id: org, p_field_id: field_id },\n        \"autonumberBackfill\",\n      );\n    },\n\n    async ioExport({ table_id, columns, limit }) {\n      return callDoor<IoExportPage>(\n        DOORS.ioExport,\n        {\n          p_organization_id: org,\n          p_table_id: table_id,\n          p_columns: columns ?? null,\n          p_limit: limit ?? null,\n          p_required: \"viewer\",\n        },\n        \"ioExport\",\n      );\n    },\n\n    async exportXlsx({ table_id, columns, limit, labels, sheetLabel }) {\n      const page = await client.ioExport({\n        table_id,\n        ...(columns !== undefined ? { columns } : {}),\n        ...(limit !== undefined ? { limit } : {}),\n      });\n      if (!page.ok) return err(page.error);\n      return ok(await exportPageXlsx(page.data, labels ?? {}, sheetLabel ?? \"Records\"));\n    },\n\n    async myLevels({ ids, subject }) {\n      if (ids.length === 0) return ok([]);\n      const answered = await callDoor<Array<{ id: Uuid; level: string | null }>>(\n        DOORS.myLevels,\n        { p_organization_id: org, p_ids: ids, p_type: subject ?? \"record\" },\n        \"myLevels\",\n      );\n      if (!answered.ok) return err(answered.error);\n      return ok(\n        (answered.data ?? []).map((row) => ({ id: row.id, level: asPermissionLevel(row.level) })),\n      );\n    },\n  };\n\n  return client;\n}\n\n/**\n * Turn a refusal into the conflict a screen can SHOW: which version you wrote\n * against, which one won, and every field you touched as it stands now. Returns\n * null when the refusal was not a stale write.\n */\nexport function asWriteConflict(error: RecordsError, recordId: Uuid): WriteConflict | null {\n  const detail = staleWriteDetail(error);\n  if (!detail) return null;\n  return {\n    ...detail,\n    record_id: recordId,\n    message: error.message,\n    hint: error.hint ?? \"\",\n  };\n}\n","// RELATIVE DAYS ARE THE READER'S DAYS (ADVERSARIAL-11 F3).\n//\n// A saved view that says \"Today\", \"Overdue\" or \"This week\" (`{ due_on: { relative: \"today\" } }`, or a\n// `within` Rule node) used to be worked out in the DATABASE from the reader's SAVED zone. A saved zone\n// that was one browser behind (a new device, a trip, the first page of a session read before the zone\n// was written) made a person in Los Angeles at 23:05 see tomorrow's items under \"Today\".\n//\n// The client now works the window out itself, in the zone it is actually being read in (the person's\n// zone the host mirrored with `setReadersTimeZone`, else this browser's), and sends exact bounds. The\n// database still accepts and works out a relative window it is handed (older callers keep working);\n// this only means a relative window never reaches it from this client.\n//\n// Mirrors custom.relative_window_for_reader: same kinds, same half-open [from, to), same week start.\n\nexport const RELATIVE_DAY_KINDS = [\n  \"today\", \"tomorrow\", \"yesterday\",\n  \"this_week\", \"next_week\", \"last_week\",\n  \"this_month\", \"next_month\", \"last_month\",\n  \"before_today\", \"next_days\", \"past_days\",\n] as const;\n\nexport type RelativeDayKind = (typeof RELATIVE_DAY_KINDS)[number];\n\nlet readersZone: string | null = null;\n\nfunction validZone(z: unknown): z is string {\n  if (typeof z !== \"string\" || !z.trim()) return false;\n  try {\n    new Intl.DateTimeFormat(\"en-US\", { timeZone: z });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** The zone the host reads this person's day in (their saved zone, or the browser's while it follows). `null` clears. */\nexport function setReadersTimeZone(zone: string | null | undefined): void {\n  readersZone = validZone(zone) ? zone : null;\n}\n\n/** The zone a relative day is worked out in: the host's mirrored zone, else this browser's, else UTC. */\nexport function readersTimeZone(): string {\n  if (readersZone) return readersZone;\n  try {\n    const device = Intl.DateTimeFormat().resolvedOptions().timeZone;\n    if (validZone(device)) return device;\n  } catch {\n    /* fall through */\n  }\n  return \"UTC\";\n}\n\n/** Calendar parts of `at` on a wall clock in `zone`. */\nfunction partsIn(zone: string, at: Date): { y: number; m: number; d: number } {\n  const p = new Intl.DateTimeFormat(\"en-US\", { timeZone: zone, year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).formatToParts(at);\n  const n = (t: string) => Number(p.find((x) => x.type === t)?.value ?? 0);\n  return { y: n(\"year\"), m: n(\"month\"), d: n(\"day\") };\n}\n\nconst ymd = (t: Date) =>\n  `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, \"0\")}-${String(t.getUTCDate()).padStart(2, \"0\")}`;\n\n/** The instant at which the wall clock in `zone` first reads midnight of civil day `day` (a UTC-midnight Date standing for it). */\nfunction midnightInstant(zone: string, day: Date): Date {\n  const y = day.getUTCFullYear();\n  const m = day.getUTCMonth();\n  const d = day.getUTCDate();\n  // Start from the UTC guess, then correct by how far the zone's wall clock is from the wanted one (twice: DST-safe).\n  let guess = Date.UTC(y, m, d);\n  for (let i = 0; i < 3; i += 1) {\n    const f = new Intl.DateTimeFormat(\"en-US\", {\n      timeZone: zone, year: \"numeric\", month: \"2-digit\", day: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\",\n    }).formatToParts(new Date(guess));\n    const n = (t: string) => Number(f.find((x) => x.type === t)?.value ?? 0);\n    const wall = Date.UTC(n(\"year\"), n(\"month\") - 1, n(\"day\"), n(\"hour\"), n(\"minute\"), n(\"second\"));\n    const diff = Date.UTC(y, m, d) - wall;\n    if (diff === 0) break;\n    guess += diff;\n  }\n  return new Date(guess);\n}\n\nexport interface RelativeWindowOptions {\n  zone?: string;\n  now?: Date;\n  /** First day of the week, Sunday 0 ... Saturday 6. Monday (1) by default, the organization knob's default. */\n  weekStart?: number;\n  /** A moment column (created_at, a datetime): the window is the reader's local midnights as instants. */\n  instants?: boolean;\n}\n\n/**\n * One relative window as exact bounds, half-open [from, to), or `null` when `window` is not a relative\n * window this knows (it is then left for the store to judge). A date-only column gets calendar days.\n */\nexport function relativeWindowBounds(window: unknown, opts: RelativeWindowOptions = {}): { from?: string; to?: string } | null {\n  if (!window || typeof window !== \"object\" || Array.isArray(window)) return null;\n  const w = window as { relative?: unknown; n?: unknown };\n  const kind = w.relative as RelativeDayKind;\n  if (typeof kind !== \"string\" || !(RELATIVE_DAY_KINDS as readonly string[]).includes(kind)) return null;\n  const zone = opts.zone && validZone(opts.zone) ? opts.zone : readersTimeZone();\n  const n = typeof w.n === \"number\" && Number.isFinite(w.n) ? Math.min(Math.max(Math.trunc(w.n), 0), 3660) : null;\n  if ((kind === \"next_days\" || kind === \"past_days\") && n === null) return null;\n\n  const p = partsIn(zone, opts.now ?? new Date());\n  const t = new Date(Date.UTC(p.y, p.m - 1, p.d));\n  const add = (base: Date, days: number) => new Date(base.getTime() + days * 86_400_000);\n  const first = opts.weekStart !== undefined ? ((opts.weekStart % 7) + 7) % 7 : 1;\n  const ws = add(t, -((t.getUTCDay() - first + 7) % 7));\n  const ms = new Date(Date.UTC(p.y, p.m - 1, 1));\n  const month = (k: number) => new Date(Date.UTC(ms.getUTCFullYear(), ms.getUTCMonth() + k, 1));\n\n  let from: Date | undefined;\n  let to: Date | undefined;\n  switch (kind) {\n    case \"today\": from = t; to = add(t, 1); break;\n    case \"tomorrow\": from = add(t, 1); to = add(t, 2); break;\n    case \"yesterday\": from = add(t, -1); to = t; break;\n    case \"this_week\": from = ws; to = add(ws, 7); break;\n    case \"next_week\": from = add(ws, 7); to = add(ws, 14); break;\n    case \"last_week\": from = add(ws, -7); to = ws; break;\n    case \"this_month\": from = ms; to = month(1); break;\n    case \"next_month\": from = month(1); to = month(2); break;\n    case \"last_month\": from = month(-1); to = ms; break;\n    case \"before_today\": to = t; break;\n    case \"next_days\": from = t; to = add(t, n!); break;\n    case \"past_days\": from = add(t, -n!); to = t; break;\n  }\n  const out = (d: Date | undefined) =>\n    d === undefined ? undefined : opts.instants ? midnightInstant(zone, d).toISOString().replace(/\\.\\d{3}Z$/, \"Z\") : ymd(d);\n  const f = out(from);\n  const e = out(to);\n  return { ...(f === undefined ? {} : { from: f }), ...(e === undefined ? {} : { to: e }) };\n}\n\n/** What the filter needs to know about a column to cut its window: the key and whether it holds moments. */\nexport interface RelativeFieldLookup {\n  byKey(key: string): { instants: boolean } | null;\n  byId(id: string): { instants: boolean } | null;\n}\n\n/** A lookup over the table's Fields (a moment column is `created_at` / `updated_at` or `config.kind === \"datetime\"`). */\nexport function lookupFromFields(fields: ReadonlyArray<{ id: string; key: string; config?: Record<string, unknown> | null }>): RelativeFieldLookup {\n  const info = (f: { key: string; config?: Record<string, unknown> | null }) => ({\n    instants: f.key === \"created_at\" || f.key === \"updated_at\" || f.config?.[\"kind\"] === \"datetime\",\n  });\n  return {\n    byKey: (key) => {\n      const f = fields.find((x) => x.key === key);\n      return f ? info(f) : key === \"created_at\" || key === \"updated_at\" ? { instants: true } : null;\n    },\n    byId: (id) => {\n      const f = fields.find((x) => x.id === id);\n      return f ? info(f) : null;\n    },\n  };\n}\n\n/** Does this filter hold a relative window anywhere? (Cheap test so a filter without one never loads Fields.) */\nexport function holdsRelativeDays(filter: unknown): boolean {\n  if (!filter || typeof filter !== \"object\") return false;\n  if (Array.isArray(filter)) return filter.some(holdsRelativeDays);\n  const o = filter as Record<string, unknown>;\n  if (typeof o[\"relative\"] === \"string\") return true;\n  return Object.values(o).some(holdsRelativeDays);\n}\n\n/**\n * The filter with every relative window worked out for THIS reader, now. Flat filters (`{ due_on: { relative } }`) and\n * Rule `within` nodes, at any depth. A window it cannot place (an unknown column, an unknown kind) is left as it was.\n * Never mutates its input.\n */\nexport function resolveRelativeDays(filter: unknown, lookup: RelativeFieldLookup, opts: Omit<RelativeWindowOptions, \"instants\"> = {}): unknown {\n  if (!holdsRelativeDays(filter)) return filter;\n  const walk = (node: unknown, flatTop: boolean): unknown => {\n    if (Array.isArray(node)) return node.map((x) => walk(x, false));\n    if (!node || typeof node !== \"object\") return node;\n    const o = node as Record<string, unknown>;\n    if (o[\"op\"] === \"within\" && Array.isArray(o[\"args\"]) && o[\"args\"].length === 2) {\n      const [a, b] = o[\"args\"] as Array<Record<string, unknown> | undefined>;\n      const id = a && typeof a[\"field\"] === \"string\" ? (a[\"field\"] as string) : null;\n      const win = b && typeof b === \"object\" ? (b[\"const\"] as unknown) : null;\n      const col = id ? lookup.byId(id) : null;\n      const bounds = col ? relativeWindowBounds(win, { ...opts, instants: col.instants }) : null;\n      return bounds ? { ...o, args: [a, { const: bounds }] } : node;\n    }\n    const out: Record<string, unknown> = {};\n    for (const [k, v] of Object.entries(o)) {\n      if (flatTop && v && typeof v === \"object\" && !Array.isArray(v) && typeof (v as { relative?: unknown }).relative === \"string\") {\n        const col = lookup.byKey(k);\n        const bounds = col ? relativeWindowBounds(v, { ...opts, instants: col.instants }) : null;\n        out[k] = bounds ?? v;\n      } else {\n        out[k] = walk(v, false);\n      }\n    }\n    return out;\n  };\n  const isRule = !!filter && typeof filter === \"object\" && typeof (filter as { op?: unknown }).op === \"string\";\n  return walk(filter, !isRule);\n}\n\n/** `\"sunday\"` .. `\"saturday\"` as `Date.getUTCDay()` counts; anything else is Monday, the knob's default. */\nexport function weekStartIndexOf(word: string | null | undefined): number {\n  const days = [\"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\"];\n  const at = days.indexOf(String(word ?? \"\").trim().toLowerCase());\n  return at < 0 ? 1 : at;\n}\n","\"use client\";\n\n// src/react/dataCache.ts — @ai-matrx/records\n//\n// 🚨 DATA AND LIVE UPDATES BELONG TO THE DATA LAYER, NOT THE VIEW (owner, 2026-10-02).\n//\n// THE LAW: every screen survives hide/show/remount with no lost work and no repeated side\n// effects; data lives in the store keyed by record; subscriptions are idempotent and\n// ref-counted; a view is a view.\n//\n// WHAT A PERSON MET: a Record tile on the board slept (React `<Activity mode=\"hidden\">` tears\n// every effect down and re-runs it on wake) and woke by reading its table, its fields, its\n// record and its levels again — about seven calls — and joining the table's realtime topic\n// again, because every hook here held its answer in its OWN state and opened its OWN\n// subscription. Removing the tile and pressing Undo did the same. The view owned the data.\n//\n// THE SHAPE NOW: one ENTRY per (data source, who is asking, question). A hook is a reader of an\n// entry: it ACQUIRES it while mounted and RELEASES it when its effects are torn down. The entry\n// reads once, holds the answer, and holds its live half (the table's realtime notices, this\n// page's own write announcements) for as long as anybody holds the entry. The last release\n// starts a GRACE (`RECORDS_CACHE_GRACE_MS`): a remount or an Undo inside it finds the entry, its\n// answer and its subscription exactly as they were — zero reads, zero joins. After the grace\n// the entry closes its subscription and is gone.\n//\n// A HIDDEN VIEW IS NOT A GONE VIEW. React gives a hidden subtree no way to say \"I am only\n// asleep\" — its effects are torn down exactly as on unmount. So the thing that knows the\n// difference says it: the host mounts `useRecordsHold(key)` OUTSIDE the part that sleeps (the\n// board tile's `Keep`), and the sleeping body sits under `<RecordsHoldScope holdKey={key}>`.\n// Every entry a hook under the scope reads is pinned to the hold — one pin per hook instance,\n// replaced when that hook asks a different question — so it stays open, live and current while\n// the body sleeps, for any length of time, and is released (with the same grace) only when the\n// hold's owner truly unmounts. Notices that land while the view is hidden patch the entry; the\n// view renders the entry on wake.\n//\n// IT LIVES AT MODULE SCOPE on purpose, on `globalThis` under a registered symbol so a\n// dual-loaded graph still shares ONE cache. It is keyed by the data source object first (so two\n// hosts — or two tests — with two data sources never read each other's answers; the records-ui\n// `recordsDataSource` adapter hands back the same object for the same supabase client), then by\n// the organization and the actor, then by the question.\n\nimport type { RecordsClient } from \"../core/client\";\nimport type { RecordsError } from \"../results\";\n\n/** How long an entry outlives its last reader, so a remount or an Undo costs nothing. */\nexport const RECORDS_CACHE_GRACE_MS = 30_000;\n\nlet graceMs = RECORDS_CACHE_GRACE_MS;\n\n/** @internal Tests shorten the grace so \"after the grace\" can be observed without fake timers. */\nexport function setRecordsCacheGraceForTests(ms: number | null): void {\n  graceMs = ms ?? RECORDS_CACHE_GRACE_MS;\n}\n\nexport type DoorAnswer<T> = { ok: true; data: T } | { ok: false; error: RecordsError };\n\nexport interface EntrySnapshot<T> {\n  data: T | null;\n  loading: boolean;\n  error: RecordsError | null;\n}\n\n/** The live half of an entry: started on the first acquire, stopped when the entry closes. */\nexport type EntryLive<T> = (entry: CacheEntry<T>) => (() => void) | null | undefined;\n\nexport interface CacheEntry<T> {\n  readonly key: string;\n  snapshot: EntrySnapshot<T>;\n  /** The latest reader's door call and client — a remount's new client replaces the old one. */\n  run: (client: RecordsClient) => Promise<DoorAnswer<T>>;\n  client: RecordsClient;\n  readonly subscribe: (listener: () => void) => () => void;\n  readonly getSnapshot: () => EntrySnapshot<T>;\n  /** Read again through the door. Readers keep the answer they have until the new one lands. */\n  readonly refetch: () => void;\n  /** Replace the held answer without a round trip (an answer that came back from a door). */\n  readonly setData: (update: (current: T | null) => T | null) => void;\n}\n\ninterface EntryState<T> extends CacheEntry<T> {\n  listeners: Set<() => void>;\n  refs: number;\n  releaseTimer: ReturnType<typeof setTimeout> | null;\n  started: boolean;\n  generation: number;\n  liveFactory: EntryLive<T> | null;\n  stopLive: (() => void) | null;\n  closed: boolean;\n  home: Map<string, EntryState<unknown>>;\n}\n\ninterface CacheRoot {\n  bySource: WeakMap<object, Map<string, Map<string, EntryState<unknown>>>>;\n  holds: Map<string, HoldState>;\n  counters: { reads: number; liveStarts: number; liveStops: number };\n}\n\nconst ROOT_KEY = Symbol.for(\"@ai-matrx/records/data-cache\");\n\nfunction root(): CacheRoot {\n  const g = globalThis as unknown as Record<symbol, CacheRoot | undefined>;\n  let held = g[ROOT_KEY];\n  if (!held) {\n    held = { bySource: new WeakMap(), holds: new Map(), counters: { reads: 0, liveStarts: 0, liveStops: 0 } };\n    g[ROOT_KEY] = held;\n  }\n  return held;\n}\n\n/** Who is asking: two people (or one person in two organizations) never share an answer. */\nexport function identityOf(client: RecordsClient): string {\n  const c = client.config;\n  return [\n    c.organizationId ?? \"-\",\n    c.actor.actor,\n    c.actor.user_id ?? \"-\",\n    c.actor.on_behalf_of ?? \"-\",\n    c.schema ?? \"-\",\n  ].join(\"|\");\n}\n\nfunction homeFor(client: RecordsClient): Map<string, EntryState<unknown>> {\n  const r = root();\n  const source = client.config.dataSource as unknown as object;\n  let byIdentity = r.bySource.get(source);\n  if (!byIdentity) {\n    byIdentity = new Map();\n    r.bySource.set(source, byIdentity);\n  }\n  const identity = identityOf(client);\n  let home = byIdentity.get(identity);\n  if (!home) {\n    home = new Map();\n    byIdentity.set(identity, home);\n  }\n  return home;\n}\n\nfunction notify<T>(entry: EntryState<T>): void {\n  for (const listener of [...entry.listeners]) listener();\n}\n\nfunction fetchEntry<T>(entry: EntryState<T>): void {\n  entry.started = true;\n  const generation = ++entry.generation;\n  if (!entry.snapshot.loading) {\n    entry.snapshot = { ...entry.snapshot, loading: true };\n    notify(entry);\n  }\n  root().counters.reads += 1;\n  let asked: Promise<DoorAnswer<T>>;\n  try {\n    asked = entry.run(entry.client);\n  } catch (thrown) {\n    asked = Promise.resolve(refusalOf<T>(thrown));\n  }\n  void asked\n    .catch((thrown: unknown) => refusalOf<T>(thrown))\n    .then((result) => {\n      if (entry.generation !== generation) return;\n      entry.snapshot = result.ok\n        ? { data: result.data, loading: false, error: null }\n        : { data: null, loading: false, error: result.error };\n      notify(entry);\n    });\n}\n\nfunction refusalOf<T>(thrown: unknown): DoorAnswer<T> {\n  return {\n    ok: false,\n    error: {\n      code: \"not_supported\",\n      message: `The record store could not be asked: ${thrown instanceof Error ? thrown.message : String(thrown)}`,\n    } as RecordsError,\n  };\n}\n\nfunction scheduleClose<T>(entry: EntryState<T>): void {\n  if (entry.releaseTimer !== null) clearTimeout(entry.releaseTimer);\n  entry.releaseTimer = setTimeout(() => {\n    entry.releaseTimer = null;\n    if (entry.refs > 0) return;\n    closeEntry(entry);\n  }, graceMs);\n}\n\nfunction closeEntry<T>(entry: EntryState<T>): void {\n  entry.closed = true;\n  if (entry.stopLive) {\n    root().counters.liveStops += 1;\n    const stop = entry.stopLive;\n    entry.stopLive = null;\n    stop();\n  }\n  // A newer answer for the same key may already be waiting; only remove THIS entry.\n  if (entry.home.get(entry.key) === (entry as unknown as EntryState<unknown>)) entry.home.delete(entry.key);\n}\n\n/**\n * THE ENTRY FOR THIS QUESTION — found, or made (without reading: reading is what an acquire\n * does). A made entry nobody acquires (a render React threw away) closes after the grace.\n */\nexport function entryFor<T>(\n  client: RecordsClient,\n  key: string,\n  run: (client: RecordsClient) => Promise<DoorAnswer<T>>,\n  live?: EntryLive<T> | null,\n): CacheEntry<T> {\n  const home = homeFor(client);\n  const existing = home.get(key) as EntryState<T> | undefined;\n  if (existing && !existing.closed) {\n    existing.run = run;\n    existing.client = client;\n    return existing;\n  }\n  const entry = {\n    key,\n    snapshot: { data: null, loading: true, error: null },\n    run,\n    client,\n    listeners: new Set<() => void>(),\n    refs: 0,\n    releaseTimer: null,\n    started: false,\n    generation: 0,\n    liveFactory: live ?? null,\n    stopLive: null,\n    closed: false,\n    home,\n  } as unknown as EntryState<T>;\n  (entry as { subscribe: CacheEntry<T>[\"subscribe\"] }).subscribe = (listener) => {\n    entry.listeners.add(listener);\n    return () => {\n      entry.listeners.delete(listener);\n    };\n  };\n  (entry as { getSnapshot: CacheEntry<T>[\"getSnapshot\"] }).getSnapshot = () => entry.snapshot;\n  (entry as { refetch: CacheEntry<T>[\"refetch\"] }).refetch = () => fetchEntry(entry);\n  (entry as { setData: CacheEntry<T>[\"setData\"] }).setData = (update) => {\n    entry.snapshot = { ...entry.snapshot, data: update(entry.snapshot.data) };\n    notify(entry);\n  };\n  home.set(key, entry as unknown as EntryState<unknown>);\n  scheduleClose(entry);\n  return entry;\n}\n\n/** A reader holds the entry. The first holder reads (once) and starts the live half. */\nexport function acquireEntry<T>(handle: CacheEntry<T>): void {\n  const entry = handle as EntryState<T>;\n  if (entry.closed) {\n    // Closed under a reader that kept its handle (a long sleep with no hold): reopen in place.\n    entry.closed = false;\n    entry.started = false;\n    entry.home.set(entry.key, entry as unknown as EntryState<unknown>);\n  }\n  entry.refs += 1;\n  if (entry.releaseTimer !== null) {\n    clearTimeout(entry.releaseTimer);\n    entry.releaseTimer = null;\n  }\n  if (entry.refs === 1 && entry.liveFactory && !entry.stopLive) {\n    root().counters.liveStarts += 1;\n    entry.stopLive = entry.liveFactory(entry) ?? null;\n  }\n  // A refusal is never kept for the next reader: coming back to one asks again.\n  if (!entry.started || (entry.refs === 1 && entry.snapshot.error && !entry.snapshot.loading)) fetchEntry(entry);\n}\n\n/** A reader lets go. The last one starts the grace; the entry closes only if nobody returns. */\nexport function releaseEntry<T>(handle: CacheEntry<T>): void {\n  const entry = handle as EntryState<T>;\n  entry.refs = Math.max(0, entry.refs - 1);\n  if (entry.refs === 0) scheduleClose(entry);\n}\n\n/**\n * THE SERVER'S ANSWER, HELD AS IF READ (lane SSR-ROWS): an entry nobody has read yet takes the answer\n * a page's seed gave (`react/seed.tsx`), so the first acquire asks nothing. A stale seed is drawn and\n * re-asked by that acquire, keeping the answer on screen until the new one lands.\n */\nexport function seedEntry<T>(handle: CacheEntry<T>, data: T, stale: boolean): void {\n  const entry = handle as EntryState<T>;\n  if (entry.started || entry.snapshot.data !== null) return;\n  entry.snapshot = { data, loading: false, error: null };\n  entry.started = !stale;\n}\n\n// ── THE HOLD: what keeps a sleeping view's data open ─────────────────────────────────────────\n\ninterface HoldState {\n  owners: number;\n  pins: Map<string, CacheEntry<unknown>>;\n}\n\n/** The host says: a view under `holdKey` is alive (maybe asleep) for as long as this is held. */\nexport function openHold(holdKey: string): () => void {\n  const holds = root().holds;\n  let hold = holds.get(holdKey);\n  if (!hold) {\n    hold = { owners: 0, pins: new Map() };\n    holds.set(holdKey, hold);\n  }\n  hold.owners += 1;\n  const mine = hold;\n  return () => {\n    mine.owners -= 1;\n    if (mine.owners > 0) return;\n    if (holds.get(holdKey) === mine) holds.delete(holdKey);\n    for (const pinned of mine.pins.values()) releaseEntry(pinned);\n    mine.pins.clear();\n  };\n}\n\n/**\n * One hook instance (`slot`) under a hold pins the entry it reads. A pin outlives the hook's\n * effects (that is the point: a sleeping hook has none) and is replaced when the same hook asks\n * a different question. Nothing is pinned to a hold nobody owns.\n */\nexport function pinToHold(holdKey: string, slot: string, handle: CacheEntry<unknown>): void {\n  const hold = root().holds.get(holdKey);\n  if (!hold || hold.owners <= 0) return;\n  const before = hold.pins.get(slot);\n  if (before === handle) return;\n  acquireEntry(handle);\n  hold.pins.set(slot, handle);\n  if (before) releaseEntry(before);\n}\n\n// ── FOR TESTS AND DIAGNOSTICS ────────────────────────────────────────────────────────────────\n\n/** Door reads the cache has made, and live halves it has started and stopped, since load. */\nexport function recordsCacheCounters(): Readonly<{ reads: number; liveStarts: number; liveStops: number }> {\n  return { ...root().counters };\n}\n\n/** How many entries are open for this client's (data source, identity). */\nexport function openEntryCount(client: RecordsClient): number {\n  return homeFor(client).size;\n}\n","\"use client\";\n\n// src/react/seed.tsx — @ai-matrx/records · lane SSR-ROWS\n//\n// THE SERVER'S FIRST ANSWERS, DRAWN IN THE FIRST PASS — ON THE SERVER AND WHILE HYDRATING.\n//\n// A host that renders on a server asks a page's first doors as the person (`recordingDataSource`,\n// `/core/seed.ts`) and mounts `<RecordsSeedProvider seed={…}>` above the screen. Every records hook\n// under it (`useAsync` in hooks.ts) runs its own door call against the seed before it would ask the\n// store: an answer the seed holds is drawn in the server's HTML, and the browser draws the same answer\n// while hydrating — so the rows are in the HTML, hydration moves nothing, and nothing is asked again.\n//\n// HOW IT IS SYNCHRONOUS ENOUGH: a hook's call is async, so a seeded hook SUSPENDS (React `use`) on its\n// run against the seed — which answers in microtasks, never the network. On the server the stream\n// waits for it; in the browser React keeps the server's HTML on screen while it resolves. Each\n// question is run ONCE per seed (the store below is keyed by the seed object, so a retried render\n// finds the same promise).\n//\n// WHEN IT STOPS: the seed answers only until the provider's first commit (hydration is done). After\n// that a new question is asked of the store as always — a person's sort, the next page — and nothing\n// ever suspends on a seed again. A seed older than SEED_FRESH_MS still draws (the server's HTML holds\n// it) but the entry is re-asked at once in the background.\n\nimport { createContext, createElement, use, useContext, useEffect, type ReactNode } from \"react\";\n\nimport { createRecordsClient } from \"../core/client\";\nimport { primeDoorAnswer, primeRecordPageBundle, primeTablePageBundle } from \"../core/primedBundle\";\nimport { seededDataSource, seedIndex, type RecordsSeed } from \"../core/seed\";\nimport type { RecordsConfig, RecordsDataSource } from \"../ports\";\nimport type { RecordsError } from \"../results\";\nimport type { RecordsClient } from \"../core/client\";\n\n/** Past this, a seeded answer is drawn and then re-asked in the background. */\nexport const SEED_FRESH_MS = 30_000;\n\nexport type SeedOutcome<T> = { seeded: true; data: T; stale: boolean } | { seeded: false };\n\nexport interface SeedStore {\n  /** True until the provider's first commit: only the first pass is drawn from the seed. */\n  live: boolean;\n  /** The outcome of one question against the seed — the same promise for every render of it. */\n  run<T>(\n    slot: string,\n    run: (client: RecordsClient) => Promise<{ ok: true; data: T } | { ok: false; error: RecordsError }>,\n    config: RecordsConfig,\n  ): Promise<SeedOutcome<T>>;\n  /**\n   * The same, for a reader that holds no records client (the entity engine): `run` is handed a data\n   * source that answers from the seed only. A miss anywhere in the run is \"not seeded\".\n   */\n  runSource<T>(\n    slot: string,\n    run: (source: RecordsDataSource) => Promise<{ ok: true; data: T } | { ok: false; error: unknown }>,\n  ): Promise<SeedOutcome<T>>;\n  /** Epoch ms the server asked. */\n  at: number;\n}\n\nconst stores = new WeakMap<RecordsSeed, SeedStore>();\n\nconst quiet = () => {};\n\nfunction storeFor(seed: RecordsSeed): SeedStore {\n  const held = stores.get(seed);\n  if (held) return held;\n  const index = seedIndex(seed);\n  const runs = new Map<string, Promise<SeedOutcome<unknown>>>();\n  const sourceRuns = new Map<string, Promise<SeedOutcome<unknown>>>();\n  const store: SeedStore = {\n    live: true,\n    at: seed.at,\n    runSource(slot, run) {\n      const asked = sourceRuns.get(slot);\n      if (asked) return asked as Promise<SeedOutcome<never>>;\n      const { source, missed } = seededDataSource(index);\n      const stale = typeof seed.at !== \"number\" || Date.now() - seed.at > SEED_FRESH_MS;\n      const outcome = Promise.resolve()\n        .then(() => run(source))\n        .then(\n          (answer): SeedOutcome<unknown> => (answer.ok && !missed() ? { seeded: true, data: answer.data, stale } : { seeded: false }),\n          (): SeedOutcome<unknown> => ({ seeded: false }),\n        );\n      sourceRuns.set(slot, outcome);\n      return outcome as Promise<SeedOutcome<never>>;\n    },\n    run(slot, run, config) {\n      const asked = runs.get(slot);\n      if (asked) return asked as Promise<SeedOutcome<never>>;\n      const { source, missed } = seededDataSource(index);\n      // Its own client per run, so one hook's miss is its own: no realtime, and a miss is never an\n      // app error (the hook asks for itself after hydration).\n      const { realtime: _live, ...quietConfig } = config;\n      const client = createRecordsClient({ ...quietConfig, dataSource: source, onError: quiet });\n      const stale = typeof seed.at !== \"number\" || Date.now() - seed.at > SEED_FRESH_MS;\n      const outcome = Promise.resolve()\n        .then(() => run(client))\n        .then(\n          (answer): SeedOutcome<unknown> => (answer.ok && !missed() ? { seeded: true, data: answer.data, stale } : { seeded: false }),\n          (): SeedOutcome<unknown> => ({ seeded: false }),\n        );\n      runs.set(slot, outcome);\n      return outcome as Promise<SeedOutcome<never>>;\n    },\n  };\n  stores.set(seed, store);\n  // AFTER HYDRATION, TOO: a door the first pass did not ask (an effect's read, a rail opened later)\n  // finds the server's bundle primed, so the records client opens the table from it instead of\n  // asking again (PAGE-BUNDLE-2's registry). Browser only: the registry is module state.\n  if (typeof window !== \"undefined\") {\n    // EVERY ANSWER, BY DOOR AND EXACT ARGUMENTS: the grid's reads that run in effects (group counts, link\n    // words, a tile's number) find theirs here once, while it is young (`callDoor` consults the registry).\n    for (const [key, data] of index) primeDoorAnswer(key, data, typeof seed.at === \"number\" ? seed.at : Date.now());\n    for (const a of seed.answers) {\n      const org = a.args[\"p_organization_id\"];\n      if (typeof org !== \"string\") continue;\n      if (a.door === \"table_page_bundle\" && typeof a.args[\"p_table_id\"] === \"string\") {\n        const view = a.args[\"p_view_id\"];\n        primeTablePageBundle({ organizationId: org, tableId: a.args[\"p_table_id\"], viewId: typeof view === \"string\" ? view : null, answer: { data: a.data, error: null } });\n      } else if (a.door === \"record_page_bundle\" && typeof a.args[\"p_record_id\"] === \"string\") {\n        primeRecordPageBundle({ organizationId: org, recordId: a.args[\"p_record_id\"], answer: { data: a.data, error: null } });\n      }\n    }\n  }\n  return store;\n}\n\nconst SeedContext = createContext<SeedStore | null>(null);\n\nexport interface RecordsSeedProviderProps {\n  /** What the server asked for this page as the person (`recordingDataSource(...).seed()`), or null. */\n  seed: RecordsSeed | null | undefined;\n  children: ReactNode;\n}\n\n/** Mount above a server-rendered records screen. A null seed is no seed: every hook asks for itself. */\nexport function RecordsSeedProvider({ seed, children }: RecordsSeedProviderProps) {\n  const store = seed && Array.isArray(seed.answers) ? storeFor(seed) : null;\n  useEffect(() => {\n    // Hydrated (or mounted): from here on every question is asked of the store.\n    if (store) store.live = false;\n  }, [store]);\n  return createElement(SeedContext.Provider, { value: store }, children);\n}\n\n/** @internal The seed in force for this render, or null. */\nexport function useSeedStore(): SeedStore | null {\n  const store = useContext(SeedContext);\n  return store && store.live ? store : null;\n}\n\n/**\n * A READER WITHOUT A RECORDS CLIENT, AGAINST THE PAGE SEED (lane SEED-ENTITY): under a live\n * `<RecordsSeedProvider>`, `run` is asked of a data source that answers from the seed only —\n * suspending on the server and while hydrating, never touching the network. Its answer (and when the\n * server asked) is returned for the reader to start from; a miss, or no seed, answers `undefined` and\n * the reader asks for itself. Always suspends while the seed is live (React matches awaited promises\n * by order), so call it unconditionally.\n */\nexport function useSeededSource<T>(\n  key: string | null,\n  run: (source: RecordsDataSource) => Promise<{ ok: true; data: T } | { ok: false; error: unknown }>,\n): { data: T; at: number } | undefined {\n  const store = useSeedStore();\n  if (!store || key === null) return undefined;\n  const outcome = use(store.runSource<T>(key, run));\n  return outcome.seeded ? { data: outcome.data, at: store.at } : undefined;\n}\n","// src/core/seed.ts — A PAGE'S FIRST ANSWERS, ASKED ON THE SERVER, DRAWN IN THE SERVER'S HTML (lane SSR-ROWS).\n//\n// THE USE CASE: Dr. Patel's front desk opens \"Visits\" from a link. The server that renders the page\n// already holds her session, so it asks the table's bundle and the grid's first page AS HER, and the\n// page is drawn — rows and all — in the HTML it sends. The browser hydrates onto those rows: it asks\n// nothing it was already told, and nothing moves.\n//\n// THE SHAPE: a seed is a list of door answers, each under the door's name and its exact arguments —\n// the same key `custom.table_page_bundle` parts already use (PAGE-BUNDLE). The server builds it by\n// asking through a RECORDING data source (`recordingDataSource`): every answer a door gave goes in, and\n// a bundle's parts are spread into answers of their own doors. The page hands the seed to\n// `<RecordsSeedProvider>` (`/react`); a hook rendering on the server, or hydrating in the browser, runs\n// its own door call against the seed (`seededDataSource`) and draws the answer in that first pass.\n//\n// IT NEVER TURNS A REFUSAL OR A MISS INTO \"EMPTY\": only answers a door GAVE are seeded (a refusing\n// bundle part, an error, a door the server did not ask: none of them), and a hook whose call asks a\n// single door the seed does not hold is NOT seeded at all — it draws \"loading\" in both passes and asks\n// for itself after hydration, exactly as before. No React here (server-safe).\n\nimport type { RecordsDataSource, RecordsTableQuery } from \"../ports\";\nimport type { PgError } from \"../results\";\nimport { canonicalArgs } from \"./doorCall\";\n\n/** One door's answer, under its exact arguments. Plain JSON: it crosses from server to browser. */\nexport interface RecordsSeedAnswer {\n  door: string;\n  args: Record<string, unknown>;\n  data: unknown;\n}\n\n/** What a server asked for a page, as the person, and when. */\nexport interface RecordsSeed {\n  /** Epoch ms when the server asked. */\n  at: number;\n  answers: RecordsSeedAnswer[];\n}\n\n/** The doors whose answer is a list of other doors' answers (PAGE-BUNDLE, PAGE-BUNDLE-2). */\nconst BUNDLE_DOORS = new Set([\"table_page_bundle\", \"record_page_bundle\"]);\n\n/** The match key: a door and every argument, keys sorted at every depth. */\nexport function seedKey(door: string, args: Record<string, unknown>): string {\n  return `${door}|${canonicalArgs(args)}`;\n}\n\n/** A door answer, and — for a bundle — each of its usable parts as the answer of its own door. */\nfunction answersOf(door: string, args: Record<string, unknown>, data: unknown): RecordsSeedAnswer[] {\n  const out: RecordsSeedAnswer[] = [{ door, args, data }];\n  if (!BUNDLE_DOORS.has(door) || !data || typeof data !== \"object\") return out;\n  const parts = (data as { parts?: unknown }).parts;\n  if (!Array.isArray(parts)) return out;\n  for (const part of parts as Array<{ door?: unknown; args?: unknown; data?: unknown; error?: unknown }>) {\n    // A refusing part is asked by its own door — never seeded as an answer.\n    if (part.error !== undefined || part.data === undefined) continue;\n    if (typeof part.door !== \"string\" || !part.args || typeof part.args !== \"object\") continue;\n    out.push({ door: part.door, args: part.args as Record<string, unknown>, data: part.data });\n  }\n  return out;\n}\n\n/**\n * A data source that asks `source` and keeps every answer a door GAVE (errors are not kept). For a\n * server render: create a records client over it, ask what the page will ask, then `seed()`.\n */\nexport function recordingDataSource(source: RecordsDataSource): { source: RecordsDataSource; seed: () => RecordsSeed } {\n  const kept = new Map<string, RecordsSeedAnswer>();\n  const recording: RecordsDataSource = {\n    ...(source.opensInOneCall ? { opensInOneCall: true } : {}),\n    rpc(fn, args, options) {\n      return Promise.resolve(source.rpc(fn, args, options)).then((answer) => {\n        // `custom` (the record store) and `platform` (the entity and drill doors) are both served by name.\n        const schema = options?.schema ?? \"custom\";\n        if (!answer.error && (schema === \"custom\" || schema === \"platform\")) {\n          for (const a of answersOf(fn, args, answer.data)) kept.set(seedKey(a.door, a.args), a);\n        }\n        return answer;\n      });\n    },\n    schema: (name) => source.schema(name),\n  };\n  return { source: recording, seed: () => ({ at: Date.now(), answers: [...kept.values()] }) };\n}\n\n/** The seed as a lookup, built once per seed. */\nexport function seedIndex(seed: RecordsSeed): Map<string, unknown> {\n  const index = new Map<string, unknown>();\n  for (const a of seed.answers) {\n    for (const spread of answersOf(a.door, a.args, a.data)) index.set(seedKey(spread.door, spread.args), spread.data);\n  }\n  return index;\n}\n\nconst MISS: PgError = { code: \"SEED_MISS\", message: \"Not in the page's seed.\", details: null, hint: null } as unknown as PgError;\n\n/** A table read the seed cannot answer: every builder call returns itself, and awaiting it is a miss. */\nfunction missingQuery(onMiss: () => void): RecordsTableQuery {\n  const answer = () => {\n    onMiss();\n    return Promise.resolve({ data: null, error: MISS, count: null });\n  };\n  const chain: unknown = new Proxy(function () {}, {\n    get(_target, prop) {\n      if (prop === \"then\") return (ok: (v: unknown) => unknown, bad?: (e: unknown) => unknown) => answer().then(ok, bad);\n      return () => chain;\n    },\n    apply: () => chain,\n  });\n  return { select: () => chain } as unknown as RecordsTableQuery;\n}\n\n/**\n * ONE RUN AGAINST THE SEED: a data source answering from `index` only, and whether the run asked a\n * door the seed does not hold. It never opens a bundle itself (`opensInOneCall` off): the bundle's\n * parts are already answers in the index.\n */\nexport function seededDataSource(index: Map<string, unknown>): { source: RecordsDataSource; missed: () => boolean } {\n  let missed = false;\n  const source: RecordsDataSource = {\n    rpc(fn, args) {\n      const key = seedKey(fn, args);\n      if (index.has(key)) return Promise.resolve({ data: index.get(key), error: null });\n      missed = true;\n      return Promise.resolve({ data: null, error: MISS });\n    },\n    schema: () => ({ from: () => missingQuery(() => (missed = true)) }),\n  };\n  return { source, missed: () => missed };\n}\n","\"use client\";\n\n// src/react/hold.tsx — @ai-matrx/records\n//\n// A SLEEPING VIEW KEEPS ITS DATA OPEN THROUGH THE DATA LAYER (owner, 2026-10-02).\n//\n// A host whose views sleep (React `<Activity mode=\"hidden\">` — the board's tiles) mounts\n// `useRecordsHold(key)` OUTSIDE the part that sleeps, and puts `<RecordsHoldScope holdKey={key}>`\n// around the part that does. Every record-store answer read under the scope then stays open —\n// its realtime notices still arriving and patching it — while the view sleeps, and is let go\n// (after `RECORDS_CACHE_GRACE_MS`) only when the hold's owner really unmounts. See\n// `dataCache.ts` for the whole shape.\n\nimport { createContext, createElement, useContext, useEffect, type ReactNode } from \"react\";\n\nimport { openHold } from \"./dataCache\";\n\nconst HoldContext = createContext<string | null>(null);\n\n/** The hold the hooks below this point pin their answers to. */\nexport function RecordsHoldScope({ holdKey, children }: { holdKey: string | null; children: ReactNode }) {\n  return createElement(HoldContext.Provider, { value: holdKey }, children);\n}\n\n/**\n * Own a hold for as long as this component is mounted. Mount it where the view's LIFE is\n * decided, never inside the part that sleeps (a sleeping subtree's effects are torn down).\n */\nexport function useRecordsHold(holdKey: string | null): void {\n  useEffect(() => (holdKey ? openHold(holdKey) : undefined), [holdKey]);\n}\n\n/** @internal The hold key a hook reads under, or null. */\nexport function useHoldKey(): string | null {\n  return useContext(HoldContext);\n}\n","// src/react/pageOrder.ts — @ai-matrx/records · a changed row keeps its place only if nothing that\n// places it changed.\n//\n// THE STORE PLACES A ROW (sort, filter, search, group), the page only draws it. A realtime notice\n// or this page's own write is patched into the page in place — right for a row whose placing\n// values did not change, wrong for one that did: it kept its old index (a sorted date edited to\n// the top stayed at the bottom) or stayed on screen after it left the filter until a reload.\n// `patchMovesRows` is the one question the live patch asks before patching: did a held row's\n// placing value change? If so, the page is read again and the store's order is the answer.\n\nimport type { ReadRow, RecordPageSort } from \"../record\";\n\n/** What places a row on this page. */\nexport interface PageOrder {\n  /** The sort keys, group key first (`groupedPageSort` puts it there). Empty: the store's own order. */\n  sortFields: readonly string[];\n  /** A filter or a search narrows this page: any change to a row may take it out or bring it in. */\n  narrowed: boolean;\n}\n\nexport function pageOrderOf(sort: readonly RecordPageSort[] | undefined, narrowed: boolean): PageOrder {\n  return { sortFields: (sort ?? []).map((key) => key.field), narrowed };\n}\n\nconst same = (a: unknown, b: unknown): boolean => {\n  if (a === b) return true;\n  if ((a === null || a === undefined || a === \"\") && (b === null || b === undefined || b === \"\")) return true;\n  return JSON.stringify(a) === JSON.stringify(b);\n};\n\n/**\n * True when a re-read row differs from the one the page holds in a value that places it: a sort\n * key, or (on a narrowed page) any value. Rows the page does not hold are not asked here (they\n * already cost a page read).\n */\nexport function patchMovesRows(\n  held: readonly Pick<ReadRow, \"id\" | \"document\">[],\n  fresh: ReadonlyMap<string, Pick<ReadRow, \"id\" | \"document\">>,\n  order: PageOrder,\n): boolean {\n  if (order.sortFields.length === 0 && !order.narrowed) return false;\n  for (const row of held) {\n    const next = fresh.get(row.id);\n    if (!next) continue;\n    const was = (row.document ?? {}) as Record<string, unknown>;\n    const now = (next.document ?? {}) as Record<string, unknown>;\n    if (order.narrowed) {\n      if (!same(was, now)) return true;\n      continue;\n    }\n    for (const field of order.sortFields) if (!same(was[field], now[field])) return true;\n  }\n  return false;\n}\n","\"use client\";\n\n// src/react/entity-reference.ts — @ai-matrx/records · SC-R / P12\n//\n// THE TWO READS A SCREEN NEEDS AROUND AN ENTITY-REFERENCE COLUMN, and nothing else:\n//   · `useEntityReferenceKinds()` — the kinds of platform thing a record may point at\n//     (`custom.entity_reference_kinds`), for the field editor's kind picker;\n//   · `useEntityReferenceWords(refs)` — the words of each `{token, id}` for a chip BEFORE it is\n//     saved (`custom.entity_reference_words`). A saved cell needs neither: every read door\n//     already answers `{token, id, label}`;\n//   · `useEntityReferenceSearch(tokens, search)` — the things of those kinds a person may point a\n//     record at, for the picker's list (`custom.entity_reference_search`, lane REFERENCE-CARRY).\n// Both ride the client's own data seam and organization, so the store sees the person.\n\nimport { useEffect, useState } from \"react\";\nimport type { RecordsError } from \"../results\";\nimport {\n  entityReferenceKinds,\n  entityReferenceSearch,\n  entityReferenceWords,\n  type EntityRef,\n  type EntityReferenceKind,\n  type EntityRefWithWords,\n} from \"../relation\";\nimport { useRecordsClient } from \"./context\";\n\nexport interface EntityReferenceRead<T> {\n  data: T | null;\n  loading: boolean;\n  /** The store's own refusal, verbatim. */\n  error: RecordsError | null;\n}\n\n/** The kinds of platform thing a record may point at, for the kind picker. */\nexport function useEntityReferenceKinds(): EntityReferenceRead<EntityReferenceKind[]> {\n  const client = useRecordsClient();\n  const [state, setState] = useState<EntityReferenceRead<EntityReferenceKind[]>>({ data: null, loading: true, error: null });\n  useEffect(() => {\n    let live = true;\n    void entityReferenceKinds(client.config.dataSource).then((res) => {\n      if (!live) return;\n      setState(res.ok ? { data: res.data, loading: false, error: null } : { data: null, loading: false, error: res.error });\n    });\n    return () => {\n      live = false;\n    };\n  }, [client]);\n  return state;\n}\n\n/** The words of each reference, read for THIS person (withheld where they may not open it). */\nexport function useEntityReferenceWords(refs: readonly EntityRef[]): EntityReferenceRead<EntityRefWithWords[]> {\n  const client = useRecordsClient();\n  const key = refs.map((r) => `${r.token}:${r.id}`).join(\",\");\n  const [state, setState] = useState<EntityReferenceRead<EntityRefWithWords[]>>({ data: null, loading: refs.length > 0, error: null });\n  useEffect(() => {\n    let live = true;\n    void entityReferenceWords(client.config.dataSource, client.config.organizationId, refs).then((res) => {\n      if (!live) return;\n      setState(res.ok ? { data: res.data, loading: false, error: null } : { data: null, loading: false, error: res.error });\n    });\n    return () => {\n      live = false;\n    };\n    // `refs` is compared by what it names, not by the array's identity.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [client, key]);\n  return state;\n}\n\n/**\n * THE PICKER'S LIST: things of these kinds whose words hold `search`, that this person may point a\n * record at (`custom.entity_reference_search`). `enabled: false` reads nothing (a closed picker).\n */\nexport function useEntityReferenceSearch(\n  tokens: readonly string[],\n  search: string,\n  enabled = true,\n): EntityReferenceRead<EntityRefWithWords[]> {\n  const client = useRecordsClient();\n  const key = `${tokens.join(\",\")}|${search.trim()}|${enabled ? 1 : 0}`;\n  const [state, setState] = useState<EntityReferenceRead<EntityRefWithWords[]>>({ data: null, loading: enabled && tokens.length > 0, error: null });\n  useEffect(() => {\n    if (!enabled || tokens.length === 0) {\n      setState({ data: [], loading: false, error: null });\n      return;\n    }\n    let live = true;\n    setState((prev) => ({ ...prev, loading: true }));\n    // A keystroke is not a request: the list is asked for once the typing pauses.\n    const timer = setTimeout(() => {\n      void entityReferenceSearch(client.config.dataSource, client.config.organizationId, tokens, search).then((res) => {\n        if (!live) return;\n        setState(res.ok ? { data: res.data, loading: false, error: null } : { data: null, loading: false, error: res.error });\n      });\n    }, 200);\n    return () => {\n      live = false;\n      clearTimeout(timer);\n    };\n    // `tokens` is compared by what it names, not by the array's identity.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [client, key]);\n  return state;\n}\n","\"use client\";\n\n// src/react/useTypedTable.ts — @ai-matrx/records/react\n//\n// AN TYPED TABLE IN A COMPONENT, TYPED FROM ITS DEFINITION (lane PLATFORM-APP-DATA wave 3).\n//\n//   const { rows, upsert, remove, loading, error, status } = useTypedTable(decisionPicks);\n//\n// - `status` is THIS organization's copy (the one writes go to): \"ok\", \"drifted\" (the stored\n//   columns differ from the definition — reported, never applied), \"archived\" (someone archived\n//   it; the STORE refuses to make it again, and `error` carries its sentence and remedy), or `null`\n//   while unknown or refused.\n// - `total` / `truncated`: the store's count of the rows this person may see, and whether `rows`\n//   stopped short of it (APP_ROWS_CEILING) — never a silent cut.\n// - On first use the organization's copy is made (once per page, exactly once across tabs).\n// - `rows` span every organization the person belongs to; `organizationId` narrows to one AND is\n//   where writes go. Without it, writes go to the active organization (the client's own).\n// - `error` is the store's own sentence (`RecordsError`) — on a store without the lane-12 doors,\n//   `door_absent`. Nothing here throws into React.\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { AnyTypedTableDef, InsertOf, RowOf } from \"../typed-table/define\";\nimport { ensureTypedTable } from \"../typed-table/ensure\";\nimport { listAppRows, removeAppRow, upsertAppRow, type AppUpsertOptions } from \"../typed-table/rows\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport { useRecordsClient } from \"./context\";\nimport type { TypedTableStatus } from \"../typed-table/check\";\n\nexport interface UseTypedTableOptions {\n  /** Narrow the rows to one organization, and write there. Default: all rows; writes to the active organization. */\n  organizationId?: Uuid | null;\n}\n\nexport interface UseTypedTable<D extends AnyTypedTableDef> {\n  rows: RowOf<D>[];\n  /** Rows the store holds that this person may see; `null` until read. */\n  total: number | null;\n  /** `rows` stopped at the ceiling and `total` is larger. */\n  truncated: boolean;\n  loading: boolean;\n  error: RecordsError | null;\n  status: TypedTableStatus | null;\n  upsert(data: InsertOf<D>, options?: Pick<AppUpsertOptions, \"expectedVersion\">): Promise<RecordsResult<Uuid>>;\n  /** Archive a row (restorable). */\n  remove(rowId: Uuid): Promise<RecordsResult<string>>;\n  reload(): void;\n}\n\nexport function useTypedTable<D extends AnyTypedTableDef>(def: D, options: UseTypedTableOptions = {}): UseTypedTable<D> {\n  const client = useRecordsClient();\n  const narrowed = options.organizationId ?? null;\n  const writeOrg = narrowed ?? client.config.organizationId;\n  const [rows, setRows] = useState<RowOf<D>[]>([]);\n  const [total, setTotal] = useState<number | null>(null);\n  const [truncated, setTruncated] = useState(false);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<RecordsError | null>(null);\n  const [status, setStatus] = useState<TypedTableStatus | null>(null);\n  const [revision, setRevision] = useState(0);\n  const rowsRef = useRef<RowOf<D>[]>([]);\n  rowsRef.current = rows;\n\n  useEffect(() => {\n    let live = true;\n    setLoading(true);\n    (async () => {\n      let firstError: RecordsError | null = null;\n      let nextStatus: TypedTableStatus | null = null;\n      // Find-or-make and the read run AT ONCE (custom-experience lane I, 2026-10-19): ensure never changes a\n      // row, so the list needs nothing from it — run in sequence they were the longest wait before a cold\n      // launchpad drew (~2.3 s live). A table made by this ensure is empty, so a list that missed it misses nothing.\n      // Find-or-make, under the store's lock. An ARCHIVED copy is refused by the store with its own sentence\n      // (detail.archived_table_id): status stays \"archived\" and nothing is remade.\n      const [ensured, listed] = await Promise.all([\n        writeOrg ? ensureTypedTable(client, def, { organizationId: writeOrg }) : Promise.resolve(null),\n        listAppRows(client, def, narrowed ? { organizationId: narrowed } : {}),\n      ]);\n      if (ensured) {\n        if (ensured.ok) nextStatus = ensured.data.drift && ensured.data.drift.length > 0 ? \"drifted\" : \"ok\";\n        else {\n          firstError = ensured.error;\n          if (archivedTableOf(ensured.error)) nextStatus = \"archived\";\n        }\n      }\n      if (!live) return;\n      if (!listed.ok) firstError ??= listed.error;\n      setRows(listed.ok ? listed.data.rows : []);\n      setTotal(listed.ok ? listed.data.total : null);\n      setTruncated(listed.ok ? listed.data.truncated : false);\n      setStatus(nextStatus);\n      setError(firstError);\n      setLoading(false);\n    })().catch((thrown: unknown) => {\n      if (!live) return;\n      setError({ code: \"not_supported\", message: thrown instanceof Error ? thrown.message : String(thrown) });\n      setLoading(false);\n    });\n    return () => {\n      live = false;\n    };\n  }, [client, def.slug, def.kept_for, def.specHash, writeOrg, narrowed, revision]);\n\n  const reload = useCallback(() => setRevision((n) => n + 1), []);\n\n  const upsert = useCallback(\n    async (data: InsertOf<D>, upsertOptions: Pick<AppUpsertOptions, \"expectedVersion\"> = {}) => {\n      if (!writeOrg) {\n        return { ok: false as const, error: { code: \"invalid_argument\" as const, message: `${def.name}: no organization to write to.` } };\n      }\n      const answer = await upsertAppRow(client, def, data, { ...upsertOptions, organizationId: writeOrg });\n      if (answer.ok) reload();\n      return answer;\n    },\n    [client, def, writeOrg, reload],\n  );\n\n  const remove = useCallback(\n    async (rowId: Uuid) => {\n      const org = rowsRef.current.find((r) => r._id === rowId)?._organizationId ?? writeOrg;\n      const answer = await removeAppRow(client, def, rowId, { organizationId: org });\n      if (answer.ok) reload();\n      return answer;\n    },\n    [client, def, writeOrg, reload],\n  );\n\n  return { rows, total, truncated, loading, error, status, upsert, remove, reload };\n}\n\n/** The archived table's id when this is the store's \"archived, so it was not made again\" refusal. */\nfunction archivedTableOf(error: RecordsError): Uuid | null {\n  const detail = error.detail as { archived_table_id?: unknown } | null | undefined;\n  return detail && typeof detail.archived_table_id === \"string\" ? (detail.archived_table_id as Uuid) : null;\n}\n","// src/core/clientInOrganization.ts — @ai-matrx/records/core\n//\n// A records client that speaks for ONE organization: the one a row LIVES in. Every by-id door of the\n// record store (history, restore preview, version read) takes the client's organization as\n// `p_organization_id`; a row read through a client bound to a different organization answers EMPTY,\n// not refused. So a by-id read or write of a stored row goes through\n// `clientInOrganization(client, row.organizationId)`, never the page's client as-is.\n//\n// Same organization (or none named) -> the same client; otherwise ONE sibling client per\n// organization, reused. The sibling map is held on globalThis under a registered symbol so a page\n// that loaded this package twice (ESM and CJS) still shares one sibling per organization.\n\nimport { createRecordsClient, type RecordsClient } from \"./client\";\n\ntype Siblings = WeakMap<RecordsClient, Map<string, RecordsClient>>;\n\nfunction siblingsOfPage(): Siblings {\n  const key = Symbol.for(\"@ai-matrx/records/core.clientInOrganization\");\n  const g = globalThis as unknown as Record<symbol, Siblings | undefined>;\n  return (g[key] ??= new WeakMap());\n}\n\nexport function clientInOrganization<C extends RecordsClient>(client: C, organizationId: string | null | undefined): C {\n  if (!organizationId || organizationId === client.config.organizationId) return client;\n  const siblings = siblingsOfPage();\n  let byOrg = siblings.get(client);\n  if (!byOrg) siblings.set(client, (byOrg = new Map()));\n  let sibling = byOrg.get(organizationId);\n  if (!sibling) {\n    sibling = createRecordsClient({ ...client.config, organizationId, organizationIds: [] });\n    byOrg.set(organizationId, sibling);\n  }\n  return sibling as C;\n}\n","// src/core/declareTable.ts — @ai-matrx/records/core\n//\n// HEADLESS (lane GRID-PRIMITIVES, asked by INTEG-CLIENTS 2026-09-24): this is the ONE birth of a\n// person-made Table, moved here from @ai-matrx/records-ui so the extension's service worker and\n// server-side births — no React, no host — walk the same doors. records-ui re-exports it.\n//\n// DECLARING A TABLE, THROUGH THE DOORS THAT DECLARE ONE.\n//\n// REC-1: a Table has to live somewhere. `custom._table_shape_guard` refuses a\n// Table with no Home in those words (\"a table has to live somewhere - give it a\n// home\"), so the sequence is fixed and this module is the one place that walks\n// it for a person-made table:\n//\n//   1. `record_write` into the person kernel — the Home record. (A Home is an\n//      ORDINARY record: it is not a Table, not a Field, not a View.)\n//   2. `table_declare` — the Table, under that Home.\n//   3. `field_declare_many` — every column, each through `field_declare`.\n//\n// Since TABLE-CREATE-SPEED-2 the store walks all three inside `custom.table_create`,\n// in ONE transaction: one round trip, and a refusal leaves nothing behind.\n//\n// STEP 4 USED TO BE `record_write` INTO THE FIELD KERNEL, AND THAT IS WHY\n// NOBODY COULD MAKE A TABLE. A Field is a record (REC-25), so this walked in\n// through the ordinary write door — and that door writes exactly one row with\n// `data_class = 'record'`. Since `custom._field_class_guard` landed it refuses\n// that row outright (23514 / FLD-13, \"a column of a table is stored as a field,\n// and this one says record\"), and before the guard it wrote a Field that no\n// reader asking for a Field by class could see. Either way the column was never\n// really made — and because `table_declare` runs FIRST and succeeds, every\n// \"Create table\" showed a red refusal AND left a table behind it. Measured on\n// the published screens (records-ui 0.16.0) on 2026-09-20: four tables in one\n// organization, each declaring a column name, none of them with a Field row.\n//\n// So the column goes through `custom.field_declare`, which is the door built\n// for exactly this: it takes what a PERSON knows — a name, a type, and for a\n// list the choices themselves — tells the Table first, stamps\n// `data_class = 'field'`, and fills in a name the Table declared and never\n// defined. And a table that could not take all of its columns is UNDONE, so a\n// person sees either a table or a refusal and never both.\n\nimport type { RecordsClient } from \"./client\";\nimport type { FieldTypeWord, NewFieldDeclaration } from \"../field\";\nimport type { RecordsError } from \"../results\";\nimport type { FieldDrift } from \"../table\";\nimport type { Uuid } from \"../record\";\n\n/** One Field a person asked for, in the words a person uses (FLD-1 / FLD-11). */\nexport interface NewFieldSpec {\n  key: string;\n  label: string;\n  /**\n   * The word for what this column holds — any word `custom._field_document_for`\n   * resolves for `type` (a parity type, a behavior, a plain synonym, or a kind\n   * such as `signature`, `relation`, `entity_reference`, `autonumber`). It is\n   * sent to the door as `type`, unmapped; a word that means nothing is refused\n   * by name, with the list.\n   */\n  type: FieldTypeWord;\n  sort?: number;\n  required?: boolean;\n  multi?: boolean;\n  config?: Record<string, unknown>;\n  /** A choice list's choices, as words. The store keeps them as a Table (FLD-5). */\n  options?: string[];\n  /** A column that points at another Table of this organization (FLD-11 / REL-8). */\n  relationTarget?: Uuid;\n  /** A currency column's symbol; a date column's day-or-day-and-time. */\n  unit?: string;\n  kind?: \"date\" | \"datetime\";\n  /**\n   * An `entity_reference` column's kinds: the platform entity tokens it may point\n   * at (`ai_model`, `note`, `web_site` …; `custom.entity_reference_kinds()` lists\n   * them). The store refuses an entity reference that names none.\n   */\n  allowedTypes?: string[];\n  /**\n   * No two live records may hold the same value here (a `unique` Rule, FLD-3 / B1). A column\n   * `recordUpsert` finds a record by must carry it.\n   */\n  unique?: boolean;\n  /**\n   * An EXISTING choice list's Table — the column uses those very option records instead of making a\n   * new list (a drafts table copying its source table's column keeps the same choices). Sent as\n   * `config.options_table_id`.\n   */\n  optionsTableId?: Uuid;\n  /**\n   * Anything else `custom.field_declare` accepts, passed through verbatim and applied LAST (a stored\n   * Field document copied key for key, `format`, `sensitivity`, `via` / `pick` / `agg` / `of`, …).\n   * The store judges every key; a word it does not take is refused by name.\n   */\n  declaration?: Partial<NewFieldDeclaration> & Record<string, unknown>;\n}\n\nexport interface NewTableSpec {\n  name: string;\n  /** The token the Table is addressed by. Derived from the name when absent. */\n  slug?: string;\n  labelSingular?: string;\n  labelPlural?: string;\n  /** The Field whose value is the record's title (REC-2). Defaults to the first Field. */\n  titleField?: string;\n  fields?: NewFieldSpec[];\n  /**\n   * `ensureTable` only: put a NEW table in this existing Home (one the caller may change, in this\n   * organization) instead of making a Home for it. A table that already exists stays where it is.\n   */\n  homeId?: Uuid;\n  /** SC-1 placement: the app (one of its features) keeps this table, not the organization. */\n  platformOwned?: boolean;\n  /**\n   * WHICH feature keeps it, one lower-case word (`agent_output`, `context`, …). `ensureTable` finds a\n   * table by slug AND this word: a person's table of the same slug is a different table.\n   */\n  keptFor?: string;\n  /** The content kind whose outputs this table holds. */\n  kind?: string;\n  /** A drafts table: the Table its records are drafts of. */\n  draftsFor?: Uuid;\n  /** A drafts table: that Table's stamp when the drafts table last matched it. */\n  draftsStamp?: string;\n  /**\n   * An TYPED TABLE's declaration facts (`defineTypedTable`, `@ai-matrx/records/typed-table`): scope, owner,\n   * gate reason, review date and spec hash, stored on the Table document as `app_table`. Written\n   * when the table is born; an existing table keeps the block it was born with.\n   */\n  typedTable?: Record<string, unknown>;\n  /**\n   * THE APP'S CODE DEPENDS ON THIS TABLE (`code_depends: true` on its document; lane 12 P5). The\n   * store then refuses archiving, renaming (slug or kept_for), moving or unmarking it through every\n   * door; the one way through is `archiveTypedTableDeliberately`. `ensureTable` writes it on birth and\n   * merges it onto an existing table that lacks it. Only an typed-table spec (`typedTable`) carries it.\n   */\n  codeDepends?: boolean;\n  /**\n   * `ensureTable` only, on BIRTH: what a new row starts with, set through\n   * `custom.table_row_defaults_set` (e.g. `{ shown_to: \"only_me\" }` — hidden from other people's\n   * lists, never locked). A table that already exists keeps its own.\n   */\n  rowDefaults?: { shown_to?: \"only_me\" | \"my_team\" | \"everyone\" | null };\n  /**\n   * `ensureTable` only, on BIRTH: every member of the organization reaches the new table at this\n   * level (`custom.share_lane_set(…, 'organization', level)`), so members can add rows to a table\n   * one of them made first. A table that already exists keeps its own sharing.\n   */\n  membersReach?: \"viewer\" | \"commenter\" | \"editor\";\n}\n\n/**\n * What `ensureTable` answers: `declareTable`'s answer, plus whether this call MADE the table and\n * how the columns it already had differ from the spec (`drift`, reported and never applied — see\n * `FieldDrift`). `drift` is `[]` on a birth and when nothing differs.\n */\nexport type EnsureResult =\n  | { ok: true; data: Uuid; homeId: Uuid; created: boolean; drift: FieldDrift[] | null }\n  | { ok: false; error: RecordsError };\n\nexport type DeclareResult =\n  /**\n   * The Table's id — and its HOME's, because REC-14 gives the Table exactly one\n   * and the caller that made it is the only one that can tidy it up again. A\n   * caller reading `data` alone is unaffected.\n   */\n  | { ok: true; data: Uuid; homeId: Uuid }\n  | { ok: false; error: RecordsError };\n\n/** `My Sales Pipeline` → `my_sales_pipeline`. A token, never a sentence. */\nexport function tokenFor(name: string): string {\n  return (\n    name\n      .trim()\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, \"_\")\n      .replace(/^_+|_+$/g, \"\")\n      .slice(0, 48) || \"table\"\n  );\n}\n\n/** The one Field a Table cannot be declared without: something to call a record. */\n/**\n * WHY THE FIRST FIELD IS NOT REQUIRED.\n *\n * It was, and the cost showed up the moment the grid could add a row: \"New\n * record\" writes an empty record and puts you in the first cell, and the store\n * correctly refused every one of them — `REC-51: Title is required` — so the\n * one gesture that makes a grid feel like a grid never worked on a table a\n * person had just made. A title is what makes a record a CHIP (REC-2), which is\n * a fact about how it is shown, not a promise it can never be written without;\n * an organization that wants it demanded says so in the field editor, and the\n * store then enforces it for everyone.\n */\nexport const DEFAULT_FIELDS: NewFieldSpec[] = [\n  { key: \"title\", label: \"Title\", type: \"text\", sort: 10, required: false },\n];\n\n/**\n * One column, in the shape `custom.field_declare` takes — and EVERYTHING a\n * person said about it. The keys after the type are not decoration: without\n * `options` the door refuses a choice list outright (\"A list of choices needs\n * its choices\"), without `unit` a money column is dollars whatever the person\n * picked, and without `relation_target` a column that points at another of this\n * organization's own tables cannot be declared at all.\n */\nexport function fieldDeclarationFor(field: NewFieldSpec): NewFieldDeclaration {\n  return {\n    key: field.key,\n    label: field.label,\n    sort: field.sort ?? 100,\n    required: field.required ?? false,\n    multi: field.multi ?? false,\n    ...declaredType(field),\n    ...(field.config ? { config: field.config } : {}),\n    ...(field.options ? { options: field.options } : {}),\n    ...(field.relationTarget ? { relation_target: field.relationTarget } : {}),\n    ...(field.unit ? { unit: field.unit } : {}),\n    ...(field.kind ? { kind: field.kind } : {}),\n    ...(field.allowedTypes ? { allowed_types: field.allowedTypes } : {}),\n    ...(field.unique ? { rules: [{ kind: \"unique\" as const }] } : {}),\n    ...(field.optionsTableId\n      ? { config: { ...(field.config ?? {}), options_table_id: field.optionsTableId } }\n      : {}),\n    ...(field.declaration ?? {}),\n  } as NewFieldDeclaration;\n}\n\n/** The Table's own declaration, as `custom.table_declare` takes it — one place for both births. */\nfunction tableSpecFor(spec: NewTableSpec, fields: NewFieldSpec[], slug: string): Record<string, unknown> {\n  const titleField = spec.titleField ?? fields[0]!.key;\n  return {\n    name: spec.name,\n    slug,\n    type: \"entity\",\n    label_singular: spec.labelSingular ?? spec.name,\n    label_plural: spec.labelPlural ?? spec.name,\n    display: \"list\",\n    weight: \"light\",\n    ordered: false,\n    row_order: \"manual\",\n    title_field: titleField,\n    retention_days: 365,\n    // AGT-1: a table a person made is agent-writable by declaration; the\n    // organization turns it off, never this package.\n    agent_writable: true,\n    default_sort: [{ field: titleField, direction: \"asc\" }],\n    ...(spec.platformOwned !== undefined ? { kept_by_the_app: spec.platformOwned } : {}),\n    ...(spec.keptFor ? { kept_for: spec.keptFor } : {}),\n    ...(spec.kind ? { kind: spec.kind } : {}),\n    ...(spec.draftsFor ? { drafts_for: spec.draftsFor } : {}),\n    ...(spec.draftsStamp ? { drafts_stamp: spec.draftsStamp } : {}),\n    ...(spec.typedTable ? { app_table: spec.typedTable } : {}),\n    ...(spec.typedTable && spec.codeDepends ? { code_depends: true } : {}),\n  };\n}\n\n/**\n * FIND THIS TABLE BY ITS SLUG, OR MAKE IT — the birth a PAGE uses (lane PLATFORM-APP-DATA).\n *\n * `declareTable` is a person's \"Create table\": it always makes a new one. A page that keeps its\n * own data (\"the front desk's callback log\") needs the opposite — THE table of that address,\n * made the first time and found every time after — and the hand-written version of that\n * (list every table, search, then declare) made two tables when two tabs saved first at once.\n * `custom.table_ensure` does the find and the make in ONE transaction under a lock on\n * (organization, slug), so both callers get the same table; a second call adds any column the\n * spec names that the table does not have yet and never retypes or drops one.\n *\n * Same answer shape as `declareTable` (the Table's id and its Home's) plus `created` and `drift`:\n * every column the table already had whose stored type, format, label, multi, required or unique\n * differs from the spec — reported, never applied. On a store without the\n * door it is `door_absent`, never a fallback to the racing walk.\n */\nexport async function ensureTable(client: RecordsClient, spec: NewTableSpec): Promise<EnsureResult> {\n  // A table's confidentiality is a reader list plus a reason (`custom.set_table_confidential`), not a\n  // column `table_ensure` takes, so a `sensitivity` word on the spec used to be dropped without a sound.\n  // It is refused out loud instead; a field's own `sensitivity` still travels in `declaration`.\n  if ((spec as { sensitivity?: unknown }).sensitivity !== undefined) {\n    return {\n      ok: false,\n      error: {\n        code: \"invalid_argument\",\n        message:\n          \"A table cannot be made confidential when it is created. Create it, then choose who may read it from its sharing settings.\",\n      },\n    };\n  }\n  const fields = spec.fields && spec.fields.length > 0 ? spec.fields : DEFAULT_FIELDS;\n  const slug = spec.slug ?? tokenFor(spec.name);\n  const ensured = await client.tableEnsure({\n    spec: {\n      ...tableSpecFor(spec, fields, slug),\n      ...(spec.homeId ? { home_id: spec.homeId } : {}),\n      ...(spec.rowDefaults ? { row_defaults: spec.rowDefaults } : {}),\n      ...(spec.membersReach ? { members_reach: spec.membersReach } : {}),\n      fields: fields.map(fieldDeclarationFor),\n    },\n  });\n  if (!ensured.ok) return ensured;\n  return {\n    ok: true,\n    data: ensured.data.table_id,\n    homeId: ensured.data.home_id as Uuid,\n    created: ensured.data.created,\n    drift: ensured.data.drift,\n  };\n}\n\nexport async function declareTable(\n  client: RecordsClient,\n  spec: NewTableSpec,\n): Promise<DeclareResult> {\n  const fields = spec.fields && spec.fields.length > 0 ? spec.fields : DEFAULT_FIELDS;\n  const slug = spec.slug ?? tokenFor(spec.name);\n\n  // ONE CALL, ONE TRANSACTION (TABLE-CREATE-SPEED-2): `custom.table_create` writes the Home, the\n  // Table under it and every column through the same three doors, so a refusal anywhere leaves\n  // nothing behind — no take-back dance, and one round trip instead of four.\n  const made = await client.tableCreate({\n    spec: { ...tableSpecFor(spec, fields, slug), fields: fields.map((f) => ({ name: f.key })) },\n    fields: fields.map(fieldDeclarationFor),\n  });\n  if (!made.ok) return made;\n  return { ok: true, data: made.data.table_id, homeId: made.data.home_id };\n}\n\n/**\n * Columns for an existing Table, through the door that declares one. Used by\n * the create path and by import.\n *\n * A column the store refused STOPS the sequence and hands back the store's own\n * sentence: a Table that quietly lost a column is the silent failure this\n * package exists to prevent.\n */\nexport async function addFields(\n  client: RecordsClient,\n  tableId: Uuid,\n  fields: NewFieldSpec[],\n): Promise<{ ok: true; data: Uuid } | { ok: false; error: RecordsError }> {\n  /*\n   * A COLUMN GOES THROUGH THE COLUMN DOOR (FLD-13).\n   *\n   * This wrote each Field as a plain record into the Field kernel Table, and\n   * the store now refuses it out loud: `custom.record_write` stores a record\n   * whose class defaults to \"record\", \"which makes the column invisible to\n   * every reader that asks for a Field by class — including the duplicate check\n   * that stops one table having the same column twice\" (`23514`,\n   * `refused_by_rule`). Measured 2026-09-20: this is why `demo/live-smoke`\n   * could not declare a table at all.\n   *\n   * `custom.field_declare` is the door that exists for this. It is also the one\n   * that derives a parity type, creates a choice Table for a list column and\n   * stamps the auto Rules a url or a percent carries — none of which a hand-\n   * written record ever got, so every column made this way was thinner than one\n   * made through the field panel.\n   */\n  // ONE CALL (TABLE-CREATE-SPEED-2): every column through `custom.field_declare_many`, in order, in one\n  // transaction — a refused column leaves none of them, and the store's own sentence comes back.\n  if (fields.length === 0) return { ok: true, data: tableId };\n  const result = await client.fieldDeclareMany({ table_id: tableId, specs: fields.map(fieldDeclarationFor) });\n  if (!result.ok) return result;\n  return { ok: true, data: tableId };\n}\n\n/**\n * `NewFieldSpec.type` is the word a caller writes, and it goes to\n * `custom.field_declare` AS `type` — every word, unmapped.\n *\n * `custom._field_document_for` reads three keys, and only `type` resolves every\n * word it knows: the parity floor, the plain behaviors and their synonyms, and\n * every kind that is neither (`signature`, `relation`, `entity_reference`, the\n * store's own stamps `autonumber` / `created_time` / `modified_time`, `list`,\n * `boolean` …). `parity_type` accepts ONLY the parity floor. This used to map\n * the plain words to `plain` and send EVERY other word as `parity_type`, so an\n * `entity_reference` column was refused \"There is no field type called\n * \"entity_reference\"\" and a `relation` or `signature` column the same way\n * (lane DECLARE-ENTITY-REF, 2026-09-25). The store owns the vocabulary; a word\n * that means nothing is refused by the door, by name, with the list.\n *\n * The one thing said here: a caller that asked for multiline text gets long\n * text, which is what the store stores `config.multiline` for.\n */\nfunction declaredType(field: NewFieldSpec): { type: FieldTypeWord } {\n  const word = (field.type ?? \"text\").toLowerCase() as FieldTypeWord;\n  if ((word === \"text\" || word === \"string\") && field.config?.[\"multiline\"] === true) {\n    return { type: \"long_text\" };\n  }\n  return { type: word };\n}\n","// src/typed-table/ensure.ts — @ai-matrx/records/typed-table\n//\n// ONE DEFINITION, ONE COPY PER ORGANIZATION (design rev 2). `ensureTypedTable` asks the store's\n// `custom.table_ensure` — find-or-make under a lock on (organization, slug, kept_for) — for the\n// caller's organization, with the app placement (`kept_by_the_app`, `kept_for`) and the\n// definition's `app_table` block. Ten tabs using a table for the first time at once get ONE\n// table; ten callers on ONE page send ONE request (the in-flight promise below).\n//\n// Never a cross-organization row: a `global` table is one copy in the platform organization,\n// written only by server code, so it is ensured only where the caller NAMES that organization.\n//\n// On a store without the door every call answers `door_absent` (the client's owed-door path).\n\nimport type { RecordsClient } from \"../core/client\";\nimport { clientInOrganization } from \"../core/clientInOrganization\";\nimport { ensureTable } from \"../core/declareTable\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport type { FieldDrift } from \"../table\";\nimport type { AnyTypedTableDef } from \"./define\";\n\nexport interface TypedTableEnsured {\n  table: Uuid;\n  homeId: Uuid;\n  organizationId: Uuid;\n  /** This call made the table (the organization's first use). */\n  created: boolean;\n  /** How the stored columns differ from the definition — reported, never applied. `null` = not compared. */\n  drift: FieldDrift[] | null;\n}\n\nexport interface TypedTableOrgOptions {\n  /** The organization to act in. Default: the client's own (the active organization). */\n  organizationId?: Uuid | null;\n}\n\nconst refusal = (message: string): RecordsError => ({ code: \"invalid_argument\", message });\n\n// ── per-page state, shared across duplicate copies of this module ──────────────────────────────\n// Held on globalThis under a registered symbol, so a page that loaded this package twice (ESM and\n// CJS) still shares ONE in-flight request per table. Keyed by the data source (one page's\n// session), never module-level identity.\ninterface PageState {\n  inflight: WeakMap<object, Map<string, Promise<RecordsResult<TypedTableEnsured>>>>;\n}\nfunction page(): PageState {\n  const key = Symbol.for(\"@ai-matrx/records/typed-table.page\");\n  const g = globalThis as unknown as Record<symbol, PageState | undefined>;\n  return (g[key] ??= { inflight: new WeakMap() });\n}\n\n/** The client acting in `organizationId`: this one, or a sibling bound to that organization. */\nexport function clientIn(client: RecordsClient, organizationId: Uuid): RecordsClient {\n  return clientInOrganization(client, organizationId);\n}\n\n/** The organization a write or an ensure acts in, or the sentence saying none was given. */\nexport function writeOrganization(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  options: TypedTableOrgOptions,\n): RecordsResult<Uuid> {\n  if (def.scope === \"global\" && !options.organizationId) {\n    return {\n      ok: false,\n      error: refusal(\n        `${def.name} is a global typed table: it has one copy, in the platform organization, written by server code. ` +\n          `Name that organization explicitly; it is never made in the active organization.`,\n      ),\n    };\n  }\n  const org = options.organizationId ?? client.config.organizationId;\n  if (!org) {\n    return { ok: false, error: refusal(`${def.name} is kept per organization, and this call named none. Pass organizationId.`) };\n  }\n  return { ok: true, data: org };\n}\n\n/**\n * MAKE THIS ORGANIZATION'S COPY OF AN TYPED TABLE, OR FIND IT. Idempotent: a later call adds any\n * column the definition gained and reports (never applies) every other difference as `drift`.\n * A relation's target typed table is ensured first, in the same organization.\n */\nexport function ensureTypedTable(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<TypedTableEnsured>> {\n  const org = writeOrganization(client, def, options);\n  if (!org.ok) return Promise.resolve(org);\n  return ensureIn(client, def, org.data, []);\n}\n\nfunction ensureIn(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  org: Uuid,\n  path: string[],\n): Promise<RecordsResult<TypedTableEnsured>> {\n  const state = page();\n  const source = client.config.dataSource as unknown as object;\n  let byKey = state.inflight.get(source);\n  if (!byKey) state.inflight.set(source, (byKey = new Map()));\n  const key = `${org}|${def.slug}|${def.kept_for}`;\n  const pending = byKey.get(key);\n  if (pending) return pending;\n  const asked = ensureNow(client, def, org, path).finally(() => {\n    if (byKey!.get(key) === asked) byKey!.delete(key);\n  });\n  byKey.set(key, asked);\n  return asked;\n}\n\nasync function ensureNow(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  org: Uuid,\n  path: string[],\n): Promise<RecordsResult<TypedTableEnsured>> {\n  if (path.includes(def.slug)) {\n    return {\n      ok: false,\n      error: refusal(`${def.name} reaches itself through its relations (${[...path, def.slug].join(\" → \")}); one side must not be a relation.`),\n    };\n  }\n  const targets = new Map<string, Uuid>();\n  for (const field of Object.values(def.fields)) {\n    const target = field.target;\n    if (!target || targets.has(target.slug)) continue;\n    const made = await ensureIn(client, target, org, [...path, def.slug]);\n    if (!made.ok) return made;\n    targets.set(target.slug, made.data.table);\n  }\n  const fieldEntries = Object.entries(def.fields);\n  const spec = {\n    name: def.name,\n    slug: def.slug,\n    platformOwned: true,\n    keptFor: def.kept_for,\n    ...(def.key ? { titleField: def.key } : {}),\n    // A PERSON table's rows start \"Only me\": hidden from every other person's list by the store's\n    // own list predicate (T-36 — hidden, never locked; the store's Confidential level is separate).\n    ...(def.scope === \"person\" ? { rowDefaults: { shown_to: \"only_me\" as const } } : {}),\n    // Members add rows to a copy one of them made first (organization and person scope); a global\n    // table is written by server code only.\n    ...(def.scope === \"global\" ? {} : { membersReach: \"editor\" as const }),\n    // THE CODE DEPENDS ON IT (lane 12 P5): the store refuses archiving, renaming, moving or\n    // unmarking it through every door; `archiveTypedTableDeliberately` is the one way through. An\n    // existing copy without the mark gets it (and `declared_in`) on this ensure — a merge.\n    codeDepends: true,\n    typedTable: {\n      scope: def.scope,\n      ...(def.owner ? { owner: def.owner } : {}),\n      spec_hash: def.specHash,\n      ...(def.declared_in.length > 0 ? { declared_in: [...def.declared_in] } : {}),\n    },\n    fields: def.specs.map((spec, i) => {\n      const target = fieldEntries[i]![1].target;\n      return target ? { ...spec, relationTarget: targets.get(target.slug)! } : { ...spec };\n    }),\n  };\n  // TEN TABS AT ONCE: the store makes the table under a lock, and every other first use WAITS on\n  // it inside its own statement. Measured on the clone 2026-10-02 (test@test.com, ten tabs): one\n  // waiter outlived the role's statement timeout (57014) while the maker declared its columns.\n  // `timed_out` is one of the two refusals worth repeating (results.ts); the repeat finds the\n  // table the maker committed. Any other refusal, or a third timeout, is answered as it is.\n  let ensured = await ensureTable(clientIn(client, org), spec);\n  for (let retry = 0; retry < 2 && !ensured.ok && ensured.error.code === \"timed_out\"; retry += 1) {\n    ensured = await ensureTable(clientIn(client, org), spec);\n  }\n  if (!ensured.ok) return ensured;\n  return {\n    ok: true,\n    data: { table: ensured.data, homeId: ensured.homeId, organizationId: org, created: ensured.created, drift: ensured.drift },\n  };\n}\n","// src/typed-table/confidential.ts — @ai-matrx/records/typed-table\n//\n// A CONFIDENTIAL TYPED TABLE (lane HR-360, 2026-10-08). A definition may declare that each\n// organization's copy is Confidential — \"the owner and the people the record's own rules name\" —\n// with its reader fields and the approval it carries. Making a copy Confidential is the store\n// owner's door alone (`custom.set_table_confidential_arman_explicitly_approved`), so a SERVER step\n// applies it per organization; this module is the two client halves:\n//\n//   · `confidentialRequest` — the exact body the host's server step takes (the definition's own\n//     readers and approval; the server compares it with its own registry and refuses a mismatch);\n//   · `confidentialGate` — FAIL CLOSED: a write to a Confidential definition's copy is refused until\n//     the store reports that copy Confidential with exactly the declared readers. The refusal says why.\n//\n// Automations a feature keeps beside its typed table are declared here too (`ensureAppAutomations`):\n// written with field KEYS, translated to the store's field ids, upserted by name — idempotent.\n\nimport type { AutomationAction, AutomationSpec, AutomationTrigger } from \"../automation\";\nimport type { RecordsClient } from \"../core/client\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport type { AnyTypedTableDef, TypedTableReader } from \"./define\";\nimport { clientIn, ensureTypedTable, writeOrganization, type TypedTableOrgOptions } from \"./ensure\";\n\n/** What the host's server step takes to make one organization's copy Confidential. */\nexport interface ConfidentialRequest {\n  organization_id: Uuid;\n  slug: string;\n  kept_for: string;\n  readers: TypedTableReader[];\n  maker_is_reader: boolean;\n  approval: { words: string; approved_on: string; covers: string };\n}\n\nexport function confidentialRequest(def: AnyTypedTableDef, organizationId: Uuid): ConfidentialRequest {\n  if (!def.confidential) throw new Error(`${def.name} is not declared Confidential.`);\n  return {\n    organization_id: organizationId,\n    slug: def.slug,\n    kept_for: def.kept_for,\n    readers: def.confidential.readers.map((r) => ({ ...r })),\n    maker_is_reader: def.confidential.makerIsReader,\n    approval: {\n      words: def.confidential.approval.words,\n      approved_on: def.confidential.approval.approvedOn,\n      covers: def.confidential.approval.covers,\n    },\n  };\n}\n\n/** Sorted-key JSON, so two reader lists compare by meaning, not by key order. */\nfunction canon(value: unknown): string {\n  if (Array.isArray(value)) return `[${value.map(canon).join(\",\")}]`;\n  if (value && typeof value === \"object\") {\n    return `{${Object.entries(value as Record<string, unknown>)\n      .filter(([, v]) => v !== undefined)\n      .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n      .map(([k, v]) => `${JSON.stringify(k)}:${canon(v)}`)\n      .join(\",\")}}`;\n  }\n  return JSON.stringify(value);\n}\n\n/** Do the stored readers say exactly what the definition declares? */\nexport function readersMatch(declared: readonly TypedTableReader[], stored: unknown): boolean {\n  if (!Array.isArray(stored)) return false;\n  const norm = (list: readonly unknown[]) =>\n    list\n      .map((r) => {\n        const o = (r ?? {}) as Record<string, unknown>;\n        return canon({ field: o.field, level: o.level ?? \"viewer\", ...(o.when ? { when: o.when } : {}) });\n      })\n      .sort();\n  return canon(norm(declared)) === canon(norm(stored));\n}\n\nexport interface ConfidentialState {\n  table: Uuid | null;\n  /** `confidential` once the server step ran; `organization` before; `null` when the copy is missing. */\n  level: \"confidential\" | \"organization\" | null;\n  readersMatch: boolean;\n  makerIsReader: boolean;\n}\n\nconst gateRefusal = (message: string): RecordsError => ({ code: \"door\", message });\n\n/** The sentence a write is refused with, or `null` when the copy is Confidential as declared. */\nexport function confidentialRefusal(def: AnyTypedTableDef, state: ConfidentialState): string | null {\n  if (!def.confidential) return null;\n  if (!state.table) return `${def.name} has no copy in this organization yet, so nothing can be written to it.`;\n  if (state.level !== \"confidential\") {\n    return `${def.name} is not Confidential in this organization yet, so nothing is written to it. The server step that makes it Confidential has not run.`;\n  }\n  if (!state.readersMatch) {\n    return `${def.name} is Confidential here, but it names different readers than the code declares, so nothing is written to it until they agree.`;\n  }\n  if (def.confidential.makerIsReader && !state.makerIsReader) {\n    return `${def.name} is Confidential here, but the person who made it still owns every row, so nothing is written to it.`;\n  }\n  return null;\n}\n\n/** Read the copy's Confidential state through the store's own find (a reader seat is enough). */\nexport async function confidentialState(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<ConfidentialState>> {\n  const org = writeOrganization(client, def, options);\n  if (!org.ok) return org;\n  const found = await clientIn(client, org.data).tableFind({ slug: def.slug, keptFor: def.kept_for });\n  if (!found.ok) return found;\n  const t = found.data as unknown as Record<string, unknown> | null;\n  if (!t || t.archived_at !== undefined) return { ok: true, data: { table: null, level: null, readersMatch: false, makerIsReader: false } };\n  const level = t.level === \"confidential\" ? \"confidential\" : \"organization\";\n  return {\n    ok: true,\n    data: {\n      table: t.id as Uuid,\n      level,\n      readersMatch: def.confidential ? readersMatch(def.confidential.readers, t.readers) : true,\n      makerIsReader: t.maker_is_reader === true,\n    },\n  };\n}\n\n/** FAIL CLOSED: the table id when a write may go ahead; otherwise the refusal naming why. */\nexport async function confidentialGate(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<Uuid>> {\n  const state = await confidentialState(client, def, options);\n  if (!state.ok) return state;\n  const why = confidentialRefusal(def, state.data);\n  if (why) return { ok: false, error: gateRefusal(why) };\n  return { ok: true, data: state.data.table! };\n}\n\n// ── automations kept beside an typed table ─────────────────────────────────────────────────────\n\n/** A field of the triggering table by key, or of another typed table (`{ def, field }`). */\nexport type AppFieldRef = string;\n\n/** An automation written with field KEYS; `tables` names the typed tables an action reaches by def. */\nexport interface AppAutomationSpec {\n  name: string;\n  trigger: { on: \"row_added\" } | { on: \"property_edited\"; field: AppFieldRef; to?: unknown } | { on: \"form_answered\" };\n  condition?: Record<string, unknown> | null;\n  actions: Array<\n    | { do: \"set\"; values: Record<AppFieldRef, unknown> }\n    | { do: \"edit_rows\"; table: AnyTypedTableDef; where: Record<AppFieldRef, unknown>; values: Record<AppFieldRef, unknown>; limit?: number }\n    | {\n        do: \"notify\";\n        to: { person: Uuid } | { field: AppFieldRef } | { author: true };\n        text: string;\n        /** The notice's subject line (in-app and email); defaults to the automation's name. Same `{{key}}` words as `text`. */\n        subject?: string;\n        /** Where the notice opens: a path (`/hr/performance/{{record_id}}?org={{organization_id}}`) or a URL field's `{{key}}`. */\n        link?: string;\n      }\n  >;\n}\n\nasync function fieldIds(client: RecordsClient, tableId: Uuid): Promise<RecordsResult<Map<string, Uuid>>> {\n  const fields = await client.fields({ table_id: tableId });\n  if (!fields.ok) return fields;\n  return { ok: true, data: new Map(fields.data.map((x) => [x.key, x.id as Uuid])) };\n}\n\nfunction byId(map: Map<string, Uuid>, key: string, table: string): Uuid {\n  const id = map.get(key);\n  if (!id) throw new Error(`${table} has no field ${JSON.stringify(key)}.`);\n  return id;\n}\n\n/** Rewrites `{key: v}` to `{id: v}`; inside a value, `{from|trigger: key}` names a key of the TRIGGERING table. */\nfunction keyed(values: Record<string, unknown>, target: Map<string, Uuid>, source: Map<string, Uuid>, table: string): Record<string, unknown> {\n  const out: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(values)) {\n    let value = v;\n    if (v && typeof v === \"object\" && !Array.isArray(v)) {\n      const o = v as Record<string, unknown>;\n      if (typeof o.from === \"string\") value = { from: byId(source, o.from, \"the triggering table\") };\n      else if (typeof o.trigger === \"string\") value = { trigger: byId(source, o.trigger, \"the triggering table\") };\n    }\n    out[byId(target, k, table)] = value;\n  }\n  return out;\n}\n\n/**\n * DECLARE A FEATURE'S AUTOMATIONS ON ITS TYPED TABLE, IDEMPOTENTLY: each spec is matched to the live\n * automation of the same name and updated in place, or added. Nothing is ever archived here.\n */\nexport async function ensureAppAutomations(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  specs: readonly AppAutomationSpec[],\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<Uuid[]>> {\n  const org = writeOrganization(client, def, options);\n  if (!org.ok) return org;\n  const here = clientIn(client, org.data);\n  const table = await ensureTypedTable(client, def, { organizationId: org.data });\n  if (!table.ok) return table;\n  const own = await fieldIds(here, table.data.table);\n  if (!own.ok) return own;\n  const existing = await here.automations({ table_id: table.data.table });\n  if (!existing.ok) return existing;\n  const byName = new Map(existing.data.automations.map((a) => [a.name, a.id]));\n  const ids: Uuid[] = [];\n  for (const spec of specs) {\n    let storeSpec: AutomationSpec;\n    try {\n      const actions: AutomationAction[] = [];\n      for (const a of spec.actions) {\n        if (a.do === \"set\") actions.push({ do: \"set\", values: keyed(a.values, own.data, own.data, def.name) as never });\n        else if (a.do === \"notify\") {\n          const to = \"field\" in a.to ? { field: byId(own.data, a.to.field, def.name) } : a.to;\n          // `record_id` and `organization_id` are the store's own words in a notice (the row and its organization).\n          const words = (t: string) =>\n            t.replace(/\\{\\{(\\w+)\\}\\}/g, (m, k: string) => (k === \"record_id\" || k === \"organization_id\" ? m : `{{${byId(own.data, k, def.name)}}}`));\n          actions.push({\n            do: \"notify\",\n            to,\n            text: words(a.text),\n            ...(a.subject ? { subject: words(a.subject) } : {}),\n            ...(a.link ? { link: words(a.link) } : {}),\n          });\n        } else {\n          const other = await ensureTypedTable(client, a.table, { organizationId: org.data });\n          if (!other.ok) return other;\n          const theirs = await fieldIds(here, other.data.table);\n          if (!theirs.ok) return theirs;\n          actions.push({\n            do: \"edit_rows\",\n            table_id: other.data.table,\n            // A Rule (`{ op, args }`) is the store's filter; a flat `{ key: value }` map is keyed.\n            where: typeof a.where.op === \"string\" ? rewriteWhere(a.where, theirs.data, own.data) : keyed(a.where, theirs.data, own.data, a.table.name),\n            values: keyed(a.values, theirs.data, own.data, a.table.name) as never,\n            ...(a.limit ? { limit: a.limit } : {}),\n          });\n        }\n      }\n      const trigger: AutomationTrigger =\n        spec.trigger.on === \"property_edited\"\n          ? { on: \"property_edited\", field: byId(own.data, spec.trigger.field, def.name), ...(\"to\" in spec.trigger ? { to: spec.trigger.to } : {}) }\n          : spec.trigger;\n      storeSpec = {\n        name: spec.name,\n        trigger,\n        ...(spec.condition ? { condition: rewriteCondition(spec.condition, own.data) } : {}),\n        actions,\n      };\n    } catch (thrown) {\n      return { ok: false, error: { code: \"invalid_argument\", message: thrown instanceof Error ? thrown.message : String(thrown) } };\n    }\n    const declared = await here.automationDeclare({ table_id: table.data.table, spec: storeSpec, automation_id: byName.get(spec.name) ?? null });\n    if (!declared.ok) return declared;\n    if (!declared.data.ok) {\n      return { ok: false, error: { code: \"refused_by_rule\", message: `${spec.name}: ${Object.values(declared.data._errors).join(\" \")}` } };\n    }\n    ids.push(declared.data.automation_id);\n  }\n  return { ok: true, data: ids };\n}\n\n/** Inside an edit_rows Rule: `{ field: key }` names the TARGET table's field, `{ trigger: key }` the triggering row's. */\nfunction rewriteWhere(node: unknown, target: Map<string, Uuid>, source: Map<string, Uuid>): Record<string, unknown> {\n  const walk = (n: unknown): unknown => {\n    if (Array.isArray(n)) return n.map(walk);\n    if (n && typeof n === \"object\") {\n      const o = n as Record<string, unknown>;\n      if (Object.keys(o).length === 1 && typeof o.field === \"string\") return { field: byId(target, o.field, \"the edited table\") };\n      if (Object.keys(o).length === 1 && typeof o.trigger === \"string\") return { trigger: byId(source, o.trigger, \"the triggering table\") };\n      return Object.fromEntries(Object.entries(o).map(([k, v]) => [k, walk(v)]));\n    }\n    return n;\n  };\n  return walk(node) as Record<string, unknown>;\n}\n\n/** `{ field: key }` anywhere inside a condition becomes `{ field: id }`. */\nfunction rewriteCondition(node: unknown, ids: Map<string, Uuid>): Record<string, unknown> {\n  const walk = (n: unknown): unknown => {\n    if (Array.isArray(n)) return n.map(walk);\n    if (n && typeof n === \"object\") {\n      const o = n as Record<string, unknown>;\n      if (typeof o.field === \"string\" && Object.keys(o).length === 1) return { field: byId(ids, o.field, \"the triggering table\") };\n      return Object.fromEntries(Object.entries(o).map(([k, v]) => [k, walk(v)]));\n    }\n    return n;\n  };\n  return walk(node) as Record<string, unknown>;\n}\n","// src/typed-table/rows.ts — @ai-matrx/records/typed-table\n//\n// READ AND WRITE AN TYPED TABLE'S ROWS, TYPED FROM ITS DEFINITION.\n//\n// Reads span every organization the person belongs to: the host's `organizationIds` when it passed\n// them, else the store's own answer (`iam.my_orgs()`) — a caller passes nothing to read everything\n// she may see. Each organization's copy is found by slug AND kept_for (a person's own table of the\n// same slug never answers) and read through the store's paged read door (`read_records_page`: the\n// one wall, the one ladder, and the list predicate that hides \"Only me\" rows from everyone but their\n// owner — so a `person` table lists only the caller's own rows). Every row carries its own\n// `_organizationId`. `organizationId` narrows to one — a page-local choice; the active organization\n// never narrows a read on its own (active-org-is-never-a-list-filter).\n// Writes go to ONE organization: the one named, else the client's own (the active organization).\n\nimport type { RecordsClient } from \"../core/client\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport type { AnyTypedTableDef, InsertOf, RowOf } from \"./define\";\nimport { confidentialGate } from \"./confidential\";\nimport { clientIn, ensureTypedTable, writeOrganization, type TypedTableOrgOptions } from \"./ensure\";\n\nconst PAGE = 500;\n/** The most rows one read holds in memory, across organizations. More is said (`truncated`), never dropped silently. */\nexport const APP_ROWS_CEILING = 10_000;\n\n/** What a read of an typed table answers. */\nexport interface AppRows<D extends AnyTypedTableDef> {\n  rows: RowOf<D>[];\n  /** Rows the store holds that this person may see (summed over the organizations read). */\n  total: number;\n  /** True when `rows` stopped at `APP_ROWS_CEILING` and `total` is larger: never a silent cut. */\n  truncated: boolean;\n}\n\nfunction rowFrom<D extends AnyTypedTableDef>(def: D, id: Uuid, org: Uuid, document: Record<string, unknown>): RowOf<D> {\n  const row: Record<string, unknown> = { _id: id, _organizationId: org };\n  for (const key of Object.keys(def.fields)) row[key] = document[key] ?? null;\n  return row as RowOf<D>;\n}\n\n/** Every organization this person belongs to: the host's list, else the store's `iam.my_orgs()`. */\nasync function readOrganizations(client: RecordsClient, def: AnyTypedTableDef): Promise<RecordsResult<Uuid[]>> {\n  const given = [...new Set((client.config.organizationIds ?? []).filter((o): o is Uuid => Boolean(o)))];\n  if (given.length > 0) return { ok: true, data: given };\n  const asked = await client.config.dataSource.rpc(\"my_orgs\", {}, { schema: \"iam\" });\n  if (asked.error || !Array.isArray(asked.data)) {\n    return {\n      ok: false,\n      error: {\n        code: \"not_supported\",\n        message: `${def.name}: the store did not say which organizations you belong to, so nothing was read.`,\n        hint: \"Pass organizationIds to the records client, or organizationId to read one organization.\",\n      },\n    };\n  }\n  const orgs = (asked.data as unknown[])\n    .map((o) => (typeof o === \"string\" ? o : (o as { my_orgs?: string } | null)?.my_orgs))\n    .filter((o): o is Uuid => typeof o === \"string\" && o.length > 0);\n  return { ok: true, data: [...new Set(orgs)] };\n}\n\n/**\n * Every row of this typed table the person may see, across all their organizations (or the one\n * `organizationId` names). An organization with no copy yet adds no rows; a refusal from one\n * organization is reported by its door and the others still answer; only when NONE answers is\n * the read a refusal (on a store without `table_find`: `door_absent`).\n */\nexport async function listAppRows<D extends AnyTypedTableDef>(\n  client: RecordsClient,\n  def: D,\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<AppRows<D>>> {\n  let orgs: Uuid[];\n  if (options.organizationId) orgs = [options.organizationId];\n  else {\n    const mine = await readOrganizations(client, def);\n    if (!mine.ok) return mine;\n    orgs = mine.data;\n  }\n  if (orgs.length === 0) return { ok: true, data: { rows: [], total: 0, truncated: false } };\n  // ONE request finds the table in every organization (custom.table_find_many); only the\n  // organizations that hold it are then read. Was one table_find per organization: 41 round trips\n  // before a person in 41 organizations saw a launchpad (custom-experience lane F, 2026-10-19).\n  const found = await client.tableFindMany({ organizationIds: orgs, slug: def.slug, keptFor: def.kept_for });\n  if (!found.ok) return found;\n  const answers: RecordsResult<AppRows<D>>[] = [\n    ...found.data.refused.map((r) => ({ ok: false as const, error: r.error })),\n    ...(await Promise.all(found.data.tables.map((t) => rowsOf(client, def, t.organization_id as Uuid, t.id)))),\n  ];\n  const rows: RowOf<D>[] = [];\n  let total = 0;\n  let truncated = false;\n  let firstError: RecordsError | null = null;\n  let answered = 0;\n  for (const a of answers) {\n    if (!a.ok) {\n      firstError ??= a.error;\n      continue;\n    }\n    answered += 1;\n    total += a.data.total;\n    truncated ||= a.data.truncated;\n    for (const row of a.data.rows) {\n      if (rows.length >= APP_ROWS_CEILING) {\n        truncated = true;\n        break;\n      }\n      rows.push(row);\n    }\n  }\n  if (answered === 0 && firstError) return { ok: false, error: firstError };\n  return { ok: true, data: { rows, total, truncated: truncated || rows.length < total } };\n}\n\nasync function rowsOf<D extends AnyTypedTableDef>(\n  client: RecordsClient,\n  def: D,\n  org: Uuid,\n  tableId: Uuid,\n): Promise<RecordsResult<AppRows<D>>> {\n  const here = clientIn(client, org);\n  const rows: RowOf<D>[] = [];\n  let total = 0;\n  for (let offset = 0; offset < APP_ROWS_CEILING; offset += PAGE) {\n    const page = await here.listPage({ table_id: tableId, limit: Math.min(PAGE, APP_ROWS_CEILING - offset), offset });\n    if (!page.ok) return page;\n    total = page.data.total;\n    for (const r of page.data.rows) rows.push(rowFrom(def, r.id, org, r.document as Record<string, unknown>));\n    if (page.data.rows.length === 0 || rows.length >= total) break;\n  }\n  return { ok: true, data: { rows, total, truncated: rows.length < total } };\n}\n\nexport interface AppUpsertOptions extends TypedTableOrgOptions {\n  /** The record's version the caller decided on; a newer write refuses with `stale_write`. */\n  expectedVersion?: number;\n}\n\n/**\n * WRITE A ROW. With a `key` in the definition: the record that key names is updated, or written\n * when there is none (`custom.record_upsert`, race-safe). Without one: `_id` updates that record,\n * no `_id` writes a new one. The organization's copy is ensured first (once per page). Answers the\n * record's id. The store refuses — by name — a key the definition never declared (23514).\n */\nexport async function upsertAppRow<D extends AnyTypedTableDef>(\n  client: RecordsClient,\n  def: D,\n  data: InsertOf<D>,\n  options: AppUpsertOptions = {},\n): Promise<RecordsResult<Uuid>> {\n  const org = writeOrganization(client, def, options);\n  if (!org.ok) return org;\n  const here = clientIn(client, org.data);\n  const { _id, _organizationId, ...values } = data as Record<string, unknown>;\n  // A CONFIDENTIAL definition writes only into a copy the store reports Confidential with exactly\n  // its declared readers (FAIL CLOSED). An update by id needs no ensure: a reader may not make tables.\n  if (def.confidential) {\n    const gated = await confidentialGate(client, def, { organizationId: org.data });\n    if (!gated.ok) return gated;\n    const version = options.expectedVersion === undefined ? {} : { expectedVersion: options.expectedVersion };\n    if (typeof _id === \"string\" && _id) {\n      const updated = await here.recordUpdate({ record_id: _id, patch: values, ...version });\n      return updated.ok ? { ok: true, data: _id } : updated;\n    }\n    if (def.key) return here.recordUpsert({ table_id: gated.data, key: def.key, data: values, ...version });\n    return here.recordWrite({ table_id: gated.data, data: values });\n  }\n  const table = await ensureTypedTable(client, def, { organizationId: org.data });\n  if (!table.ok) return table;\n  void _organizationId;\n  const version = options.expectedVersion === undefined ? {} : { expectedVersion: options.expectedVersion };\n  if (def.key) return here.recordUpsert({ table_id: table.data.table, key: def.key, data: values, ...version });\n  if (typeof _id === \"string\" && _id) {\n    const updated = await here.recordUpdate({ record_id: _id, patch: values, ...version });\n    return updated.ok ? { ok: true, data: _id } : updated;\n  }\n  return here.recordWrite({ table_id: table.data.table, data: values });\n}\n\n/** ARCHIVE A ROW — the store's soft delete; restorable from the archive. */\nexport async function removeAppRow(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  rowId: Uuid,\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<string>> {\n  const org = options.organizationId ?? client.config.organizationId;\n  if (!org) {\n    return { ok: false, error: { code: \"invalid_argument\", message: `${def.name}: say which organization the row lives in.` } };\n  }\n  return clientIn(client, org).recordDelete({ record_id: rowId });\n}\n","\"use client\";\n\n// src/react/useStoreTable.ts — @ai-matrx/records/react\n//\n// A PERSON'S EXISTING TABLE IN A COMPONENT, TYPED FROM ITS GENERATED FILE (v7 APPS-ON-DATA item 2),\n// NOW ON THE DATA RUNTIME (Applets phase A).\n//\n//   const { rows, update, write, archive, loading, error } = useStoreTable(posts, { where: { status: \"In review\" } });\n//\n// Rows are keyed by the column names `pnpm tables:types` wrote (the file is typing only: the columns\n// are read live underneath). Every read and write goes through the store's doors under the signed-in\n// person's own seat. What changed under the same interface:\n//   · ONE request per question, shared by every component asking it (TanStack Query, records-owned keys);\n//   · KEYSET pages under the hood — `rows` is read page after page up to `limit` (default and ceiling\n//     STORE_ROWS_CEILING), and a write landing mid-read never skips or repeats a row; `truncated` says\n//     the rows stopped short of `total`;\n//   · LIVE — a colleague's change re-reads only the rows it names;\n//   · OPTIMISTIC — an update is drawn at once and put back with the store's sentence if refused, and it\n//     always carries the version the person saw (`expectedVersion` overrides it); no write re-reads the table.\n// `error` is the store's own sentence; nothing here throws into React.\n\nimport { useEffect, useMemo } from \"react\";\n\nimport { STORE_ROWS_CEILING, type AnyStoreTable, type ListTableRowsOptions, type StoreInsertOf, type StoreRowOf } from \"../typed-table/store-table\";\nimport { createTableDataPort } from \"../data/table-port\";\nimport { hostEvents, useDataMutations, useDataRows, type DataScope } from \"../data/react\";\nimport type { Query, Row, Values } from \"../data/types\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport { useRecordsClient } from \"./context\";\n\nexport interface UseStoreTable<T extends AnyStoreTable> {\n  rows: StoreRowOf<T>[];\n  total: number | null;\n  truncated: boolean;\n  loading: boolean;\n  error: RecordsError | null;\n  write(data: StoreInsertOf<T>): Promise<RecordsResult<Uuid>>;\n  update(rowId: Uuid, patch: Partial<StoreInsertOf<T>>, options?: { expectedVersion?: number }): Promise<RecordsResult<number>>;\n  /** Archive one row (the store's soft delete; restorable). Taken out of every list at once, put back if refused. */\n  archive(rowId: Uuid): Promise<RecordsResult<void>>;\n  reload(): void;\n}\n\nconst PAGE = 500;\n\nfunction columnRefusal(table: AnyStoreTable, column: string): RecordsError {\n  return {\n    code: \"invalid_argument\",\n    message: `${table.name} has no column \"${column}\" in its typed file. Re-run pnpm tables:types if the table changed.`,\n  };\n}\n\n/** Column names (the typed file) → stored keys. An unknown name is refused by name, never sent. */\nfunction toKeys(table: AnyStoreTable, values: Record<string, unknown>): RecordsResult<Values> {\n  const out: Values = {};\n  for (const [name, value] of Object.entries(values)) {\n    if (name === \"_id\") continue;\n    const column = table.columns[name];\n    if (!column) return { ok: false, error: columnRefusal(table, name) };\n    out[column.key] = value;\n  }\n  return { ok: true, data: out };\n}\n\n/** A runtime row → the typed file's row: keyed by column name, relation cells as the linked ids (as the file types them). */\nfunction toNamed<T extends AnyStoreTable>(table: T, row: Row): StoreRowOf<T> {\n  const named: Record<string, unknown> = { _id: row._id };\n  for (const [name, column] of Object.entries(table.columns)) {\n    const value = row[column.key];\n    named[name] =\n      column.type === \"relation\" && Array.isArray(value)\n        ? value.map((ref) => (ref && typeof ref === \"object\" ? (ref as { id: Uuid }).id : ref))\n        : (value ?? null);\n  }\n  return named as StoreRowOf<T>;\n}\n\nexport function useStoreTable<T extends AnyStoreTable>(table: T, options: ListTableRowsOptions<T> = {}): UseStoreTable<T> {\n  const client = useRecordsClient();\n  const alias = table.id;\n  const scope = useMemo<DataScope>(\n    () => {\n      const port = createTableDataPort({ client, aliases: { [alias]: { kind: \"table\", tableId: table.id, organizationId: table.organizationId, label: table.name } } });\n      // The same table read by the same person (and client) is one cache entry, whoever asks.\n      return { port, events: hostEvents(port), portKey: `store-table|${client.config.organizationId ?? \"-\"}|${client.config.actor.user_id ?? \"-\"}` };\n    },\n    [client, alias, table.id, table.organizationId, table.name],\n  );\n\n  const asked = JSON.stringify(options);\n  const built = useMemo((): RecordsResult<Query> => {\n    const where: NonNullable<Query[\"where\"]> = [];\n    for (const [name, value] of Object.entries(options.where ?? {})) {\n      const column = table.columns[name];\n      if (!column) return { ok: false, error: columnRefusal(table, name) };\n      where.push({ column: column.key, op: value === null ? \"empty\" : \"eq\", ...(value === null ? {} : { value }) });\n    }\n    const sort: NonNullable<Query[\"sort\"]> = [];\n    for (const s of options.sort ?? []) {\n      if (s.column === \"_id\") continue;\n      const column = table.columns[s.column];\n      if (!column) return { ok: false, error: columnRefusal(table, s.column) };\n      sort.push({ column: column.key, ...(s.direction ? { direction: s.direction } : {}) });\n    }\n    return {\n      ok: true,\n      data: {\n        ...(where.length ? { where } : {}),\n        ...(sort.length ? { sort } : {}),\n        ...(options.search ? { search: options.search } : {}),\n        pageSize: PAGE,\n      },\n    };\n    // `asked` is the options' identity: a parent that rebuilds the object every render asks nothing new.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [asked, table]);\n\n  const limit = Math.min(options.limit ?? STORE_ROWS_CEILING, STORE_ROWS_CEILING);\n  const read = useDataRows(alias, built.ok ? built.data : { pageSize: 1 }, scope);\n  const write = useDataMutations(alias, scope);\n\n  // The whole list, up to the limit: the next keyset page is asked as soon as the last one lands.\n  useEffect(() => {\n    if (built.ok && read.hasMore && !read.loadingMore && !read.loading && !read.error && read.rows.length < limit) read.loadMore();\n  }, [built.ok, read.hasMore, read.loadingMore, read.loading, read.error, read.rows.length, limit, read]);\n\n  const rows = useMemo(() => read.rows.slice(0, limit).filter((r) => r[\"_pending\"] !== true).map((r) => toNamed(table, r)), [read.rows, limit, table]);\n  const total = built.ok ? read.total : null;\n\n  return {\n    rows: built.ok ? rows : [],\n    total,\n    truncated: total !== null && rows.length < total,\n    loading: built.ok && read.loading,\n    error: built.ok ? read.error : built.error,\n    async write(data) {\n      const values = toKeys(table, data as Record<string, unknown>);\n      if (!values.ok) return values;\n      const answer = await write.create(values.data);\n      return answer.ok ? { ok: true, data: answer.data._id } : answer;\n    },\n    async update(rowId, patch, o) {\n      const values = toKeys(table, patch as Record<string, unknown>);\n      if (!values.ok) return values;\n      const answer = await write.update(rowId, values.data, o?.expectedVersion === undefined ? {} : { baseVersion: o.expectedVersion });\n      return answer.ok ? { ok: true, data: answer.data._version } : answer;\n    },\n    archive: (rowId) => write.archive(rowId),\n    reload: read.refresh,\n  };\n}\n","// src/typed-table/store-table.ts — @ai-matrx/records/typed-table\n//\n// READ AND WRITE A PERSON'S EXISTING TABLE, TYPED (v7 APPS-ON-DATA item 2).\n//\n// `pnpm tables:types <table>` emits `export const posts = storeTable<PostsRow, PostsInsert>({ id,\n// organizationId, columns })` off the live store. This file is what code does with it: rows come\n// back keyed by the column names in that file (never by stored keys), writes take the same names,\n// and every call goes through the store's own doors under the caller's own seat — the store\n// decides what she may read and change; nothing here widens or narrows it.\n//\n//   const page = await listTableRows(client, posts, { where: { status: \"In review\" }, sort: [{ column: \"publish_date\" }] });\n//   await updateTableRow(client, posts, row._id, { approved: true, status: \"Scheduled\" });\n//\n// A choice cell reads as the word a person sees and takes that word on a write (the store keeps the\n// key; `src/choice.ts`). A relation cell is the linked records' ids. A read is never cut silently:\n// `truncated` says the rows stopped at the ceiling while `total` is larger.\n\nimport type { RecordsClient } from \"../core/client\";\nimport type { RecordPageSort, Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport { clientIn } from \"./ensure\";\n\n/** One column of a typed custom table, as `pnpm tables:types` writes it. */\nexport interface StoreTableColumn {\n  fieldId: string;\n  /** The key the store keeps the value under. */\n  key: string;\n  label: string;\n  type: string;\n  required: boolean;\n  choices?: readonly string[];\n}\n\n/** A typed view of an existing custom table. `Row` / `Insert` ride as phantom types. */\nexport interface StoreTable<Row = Record<string, unknown>, Insert = Partial<Row>> {\n  readonly id: Uuid;\n  readonly organizationId: Uuid;\n  readonly name: string;\n  readonly slug: string;\n  readonly columns: Readonly<Record<string, StoreTableColumn>>;\n  /** Never set: carries the row type so `StoreRowOf` can read it. */\n  readonly __row?: Row;\n  /** Never set: carries the insert type so `StoreInsertOf` can read it. */\n  readonly __insert?: Insert;\n}\n\n/** The generated file's one call: the definition, typed by its row and insert types. */\nexport function storeTable<Row, Insert = Partial<Row>>(def: {\n  id: string;\n  organizationId: string;\n  name: string;\n  slug: string;\n  columns: Record<string, StoreTableColumn>;\n}): StoreTable<Row, Insert> {\n  return Object.freeze({ ...def, columns: Object.freeze({ ...def.columns }) }) as StoreTable<Row, Insert>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyStoreTable = StoreTable<any, any>;\nexport type StoreRowOf<T extends AnyStoreTable> = T extends StoreTable<infer R, unknown> ? R : never;\nexport type StoreInsertOf<T extends AnyStoreTable> = T extends StoreTable<unknown, infer I> ? I : never;\ntype ColumnOf<T extends AnyStoreTable> = Extract<keyof StoreRowOf<T>, string>;\n\n/** A flat condition: column → the value it must hold (`null` = empty). All must hold. */\nexport type StoreTableWhere<T extends AnyStoreTable> = Partial<{ [K in ColumnOf<T>]: string | number | boolean | null }>;\n\nexport interface StoreTableSort<T extends AnyStoreTable> {\n  column: ColumnOf<T> | \"_id\";\n  direction?: \"asc\" | \"desc\";\n  as?: RecordPageSort[\"as\"];\n}\n\nexport interface ListTableRowsOptions<T extends AnyStoreTable> {\n  where?: StoreTableWhere<T>;\n  /** Words over every column this reader may see. */\n  search?: string | null;\n  sort?: readonly StoreTableSort<T>[];\n  /** At most this many rows (default and ceiling: STORE_ROWS_CEILING). */\n  limit?: number;\n}\n\nexport interface StoreTableRows<T extends AnyStoreTable> {\n  rows: StoreRowOf<T>[];\n  /** Rows matching the condition that this person may see. */\n  total: number;\n  /** `rows` stopped short of `total`. */\n  truncated: boolean;\n}\n\nconst PAGE = 500;\n/** The most rows one read holds; more is said (`truncated`), never dropped silently. */\nexport const STORE_ROWS_CEILING = 10_000;\n\nfunction columnRefusal(table: AnyStoreTable, column: string): RecordsError {\n  return {\n    code: \"invalid_argument\",\n    message: `${table.name} has no column \"${column}\" in its typed file. Re-run pnpm tables:types if the table changed.`,\n  };\n}\n\n/** Column names → stored keys. Unknown names are refused by name, never sent. */\nfunction toStored(table: AnyStoreTable, values: Record<string, unknown>): RecordsResult<Record<string, unknown>> {\n  const out: Record<string, unknown> = {};\n  for (const [name, value] of Object.entries(values)) {\n    if (name === \"_id\") continue;\n    const column = table.columns[name];\n    if (!column) return { ok: false, error: columnRefusal(table, name) };\n    out[column.key] = value;\n  }\n  return { ok: true, data: out };\n}\n\n/** One stored document → a row keyed by column names (a column the reader cannot see is null). */\nexport function rowFromDocument<T extends AnyStoreTable>(table: T, id: Uuid, document: Record<string, unknown>): StoreRowOf<T> {\n  const row: Record<string, unknown> = { _id: id };\n  for (const [name, column] of Object.entries(table.columns)) row[name] = document[column.key] ?? null;\n  return row as StoreRowOf<T>;\n}\n\n/** Rows of the table this person may see, keyed by column name, in the store's order. */\nexport async function listTableRows<T extends AnyStoreTable>(\n  client: RecordsClient,\n  table: T,\n  options: ListTableRowsOptions<T> = {},\n): Promise<RecordsResult<StoreTableRows<T>>> {\n  const where = toStored(table, (options.where ?? {}) as Record<string, unknown>);\n  if (!where.ok) return where;\n  const sort: RecordPageSort[] = [];\n  for (const s of options.sort ?? []) {\n    if (s.column === \"_id\") continue;\n    const column = table.columns[s.column];\n    if (!column) return { ok: false, error: columnRefusal(table, s.column) };\n    sort.push({ field: column.key, direction: s.direction ?? \"asc\", ...(s.as ? { as: s.as } : {}) });\n  }\n  const limit = Math.min(options.limit ?? STORE_ROWS_CEILING, STORE_ROWS_CEILING);\n  const here = clientIn(client, table.organizationId);\n  const rows: StoreRowOf<T>[] = [];\n  let total = 0;\n  // KEYSET, never offset: the next page starts after the last row read, so a row written while this\n  // reads never shifts the pages under it (an offset read repeated or skipped a row on every insert).\n  let after: string | null = null;\n  while (rows.length < limit) {\n    const page = await here.listKeyset({\n      table_id: table.id,\n      filter: where.data as never,\n      search: options.search ?? null,\n      sort,\n      after,\n      limit: Math.min(PAGE, limit - rows.length),\n    });\n    if (!page.ok) return page;\n    // The door counts on every page; the newest count is the one this read reports.\n    if (page.data.total !== null) total = page.data.total;\n    for (const r of page.data.rows) rows.push(rowFromDocument(table, r.id, r.document as Record<string, unknown>));\n    after = page.data.cursor;\n    if (!after || page.data.rows.length === 0) break;\n  }\n  return { ok: true, data: { rows, total, truncated: rows.length < total } };\n}\n\n/** A new row. Answers its id. The store refuses a value it cannot hold, by name. */\nexport async function writeTableRow<T extends AnyStoreTable>(\n  client: RecordsClient,\n  table: T,\n  data: StoreInsertOf<T>,\n): Promise<RecordsResult<Uuid>> {\n  const stored = toStored(table, data as Record<string, unknown>);\n  if (!stored.ok) return stored;\n  return clientIn(client, table.organizationId).recordWrite({ table_id: table.id, data: stored.data });\n}\n\n/** Change some columns of one row. `expectedVersion` refuses a write over a newer one (`stale_write`). */\nexport async function updateTableRow<T extends AnyStoreTable>(\n  client: RecordsClient,\n  table: T,\n  rowId: Uuid,\n  patch: Partial<StoreInsertOf<T>>,\n  options: { expectedVersion?: number } = {},\n): Promise<RecordsResult<number>> {\n  const stored = toStored(table, patch as Record<string, unknown>);\n  if (!stored.ok) return stored;\n  return clientIn(client, table.organizationId).recordUpdate({\n    record_id: rowId,\n    patch: stored.data,\n    ...(options.expectedVersion === undefined ? {} : { expectedVersion: options.expectedVersion }),\n  });\n}\n\n/** Archive one row (the store's soft delete; restorable from the archive). */\nexport async function archiveTableRow<T extends AnyStoreTable>(client: RecordsClient, table: T, rowId: Uuid): Promise<RecordsResult<string>> {\n  return clientIn(client, table.organizationId).recordDelete({ record_id: rowId });\n}\n","// src/data/table-port.ts — @ai-matrx/records/data\n//\n// THE HOST'S DATAPORT FOR TABLE ALIASES (Applets CONTRACTS v2 §4, phase A item 4).\n//\n// One port per mounted Applet, scoped to the aliases its record declares. Each alias is bound to ONE\n// custom table plus that table's organization, and every call goes through the store's own doors\n// under the signed-in person's seat — the store decides what she may read and change; nothing here\n// widens or narrows it. Every answer is JSON (no function, client or store crosses the port) and\n// every refusal is the store's own sentence.\n//\n//   · columns  — live (`readTableShape`), no generated file.\n//   · list     — KEYSET through `custom.read_records_keyset`: the cursor is the last row's sort\n//                values + id, so a write landing mid-read never skips or repeats a row.\n//   · get / the re-read after a write / a realtime bump — the same door, by id, so every row comes\n//                back with the `_version` it was read at, in the same statement as its values.\n//   · update   — `baseVersion` is REQUIRED and sent as the store's compare-and-set; a stale write is\n//                refused by the store (`stale_write`), never silently last-write-wins.\n//   · create   — in the TABLE's own organization (the alias's binding), never the active one.\n//   · events   — `rows:<alias>` carries `{ids}` from the host's realtime port; `null` = re-read all.\n\nimport { clientIn } from \"../typed-table/ensure\";\nimport type { RecordsClient } from \"../core/client\";\nimport { asPermissionLevel, atLeast, type PermissionLevel } from \"../level\";\nimport type { ReadRow, Uuid } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\nimport { readTableShape, type TableShape } from \"./columns\";\nimport { entityReferenceKindsOf, isEntityReferenceConfig } from \"../coerce\";\nimport { entityReferenceWords } from \"../relation\";\nimport { compileSort, compileWhere } from \"./filter\";\nimport {\n  CUSTOM_ROW_TOKEN,\n  type AliasBinding,\n  type Column,\n  type HostDataPort,\n  type DataPortEventName,\n  type DataSource,\n  type EntityRef,\n  type Page,\n  type Query,\n  type Row,\n  type RowsEvent,\n  type Values,\n} from \"./types\";\n\n/** The most rows one page holds; a larger `pageSize` is held to it (the store's own page ceiling decides below that). */\nexport const DATA_PAGE_CEILING = 500;\nexport const DATA_PAGE_DEFAULT = 50;\n/** An archive page's cursor: the offset the next page starts at. */\nconst ARCHIVED_CURSOR = \"archived:\";\n\n/** A row as the keyset door answers it: the masked document plus the version and organization it was read at. */\nexport type VersionedReadRow = ReadRow & { version: number; organization_id: Uuid };\n\nfunction refuse(code: RecordsError[\"code\"], message: string, hint?: string): { ok: false; error: RecordsError } {\n  return { ok: false, error: { code, message, ...(hint ? { hint } : {}) } };\n}\n\nfunction noSuchAlias(alias: string): { ok: false; error: RecordsError } {\n  return refuse(\"not_found\", `This Applet has no data source called \"${alias}\".`, \"Use one of the aliases sources() lists.\");\n}\n\n/**\n * An entity-reference column (a custom row pointing at a PLATFORM record, `allowed_types`) stores\n * `{token, id}` pairs, not bare ids. Its cells read with each pair's own token and are written back as\n * pairs; a bare id or a `record`-token ref is given the column's first allowed kind.\n */\nfunction entityKindsOf(field: { config?: unknown } | undefined): string[] {\n  const config = field && field.config && typeof field.config === \"object\" ? (field.config as Record<string, unknown>) : null;\n  return config && isEntityReferenceConfig(config) ? entityReferenceKindsOf({ config }) : [];\n}\n\nfunction entityRefsOf(value: unknown, kinds: readonly string[]): { token: string; id: Uuid }[] {\n  const items = Array.isArray(value) ? value : value == null || value === \"\" ? [] : [value];\n  const out: { token: string; id: Uuid }[] = [];\n  for (const item of items) {\n    const id = typeof item === \"string\" ? item : item && typeof item === \"object\" ? (item as { id?: unknown }).id : null;\n    if (typeof id !== \"string\" || !isUuidShape(id)) continue;\n    const raw = item && typeof item === \"object\" ? (item as { token?: unknown }).token : null;\n    const token = typeof raw === \"string\" && raw && raw !== CUSTOM_ROW_TOKEN ? raw : kinds[0];\n    if (token) out.push({ token, id });\n  }\n  return out;\n}\n\n/** Relation cells as `EntityRef[]`: every link reads the same way, whatever it points at. */\nfunction relationIdsOf(value: unknown): Uuid[] {\n  const items = Array.isArray(value) ? value : value == null || value === \"\" ? [] : [value];\n  const out: Uuid[] = [];\n  for (const item of items) {\n    const id = typeof item === \"string\" ? item : item && typeof item === \"object\" ? (item as { id?: unknown }).id : null;\n    if (typeof id === \"string\" && isUuidShape(id)) out.push(id);\n  }\n  return out;\n}\n\n/**\n * Column types whose value is FREE words: an empty string there is a cleared box and is kept as \"\".\n * email / url / phone are NOT here: every one of them carries a `pattern` Rule (measured live\n * 2026-10-08 on custom.field: 1209/1209 email, 999/999 phone, 236/236 url), and the store's pattern\n * Rule refuses \"\" (\"Contact Email is not written the way this field expects\", social planner\n * 2026-10-08). The same holds for every other format the store checks (address, color, date, time,\n * json, tags, signature…) and for a free-text column that carries a pattern Rule of its own.\n */\nconst FREE_WORD_TYPES = new Set([\"text\", \"long\", \"long_text\", \"rich_text\", \"markdown\"]);\n\n/** A Field's attached Rules that judge the SHAPE of words — \"\" never passes one, so a blank there is no value. */\nfunction hasPatternRule(field: { rules?: readonly { kind?: string }[] | null } | undefined): boolean {\n  return Array.isArray(field?.rules) && field!.rules!.some((rule) => rule?.kind === \"pattern\");\n}\n\n/**\n * AN EMPTY BOX IS NO VALUE. A cleared input hands back \"\", and the store refuses \"\" for every typed or\n * format-checked field (\"Post Date takes a date\"; \"Contact Email is not written the way this field\n * expects\", social planner 2026-10-08) — so \"\" is written as null for every column that is not FREE\n * words, and for a free-words column whose Field carries a pattern Rule. Only a plain free-text column\n * keeps \"\" (so a required one still reads as answered-blank exactly as the store judges it).\n */\nexport function blankToNull(type: string, value: unknown, field?: { rules?: readonly { kind?: string }[] | null }): unknown {\n  if (typeof value !== \"string\" || value.trim() !== \"\") return value;\n  if (!FREE_WORD_TYPES.has(type)) return null;\n  return hasPatternRule(field) ? null : value;\n}\n\nexport interface CreateTableDataPortOptions {\n  /** The host's client for the signed-in person (its realtime port, if bound, feeds the event streams). */\n  client: RecordsClient;\n  /** The Applet's aliases, resolved at build time. A name is never looked up at run time. */\n  aliases: Readonly<Record<string, AliasBinding>>;\n}\n\nexport function createTableDataPort({ client, aliases }: CreateTableDataPortOptions): HostDataPort {\n  const shapes = new Map<string, Promise<RecordsResult<TableShape>>>();\n  let warnedNotLive = false;\n\n  function bindingOf(alias: string): AliasBinding | null {\n    return Object.prototype.hasOwnProperty.call(aliases, alias) ? aliases[alias]! : null;\n  }\n\n  function seat(binding: AliasBinding): RecordsClient {\n    return clientIn(client, binding.organizationId);\n  }\n\n  /** One read of a table's shape per port until the shape moves (a realtime `shape()` notice clears it). */\n  function shapeOf(alias: string, binding: AliasBinding): Promise<RecordsResult<TableShape>> {\n    let held = shapes.get(alias);\n    if (!held) {\n      held = readTableShape(seat(binding), binding.tableId).then((answer) => {\n        if (!answer.ok) shapes.delete(alias); // a refusal is never kept for the next asker\n        return answer;\n      });\n      shapes.set(alias, held);\n    }\n    return held;\n  }\n\n  /** Documents → Rows keyed by Column.key; relation cells become `EntityRef[]` with the store's words. */\n  async function toRows(binding: AliasBinding, shape: TableShape, read: readonly VersionedReadRow[]): Promise<Row[]> {\n    const relationColumns = shape.columns.filter((c) => c.type === \"relation\");\n    const words = new Map<string, Record<string, string>>();\n    await Promise.all(\n      relationColumns.map(async (column) => {\n        const field = shape.fields.get(column.key)!;\n        const kinds = entityKindsOf(field);\n        if (kinds.length) {\n          // A link to a PLATFORM record: its words come from the store's entity-reference door, read for THIS\n          // person (relation_words_many reads custom rows only, and answered every platform link as withheld).\n          const seen = new Map<string, { token: string; id: Uuid }>();\n          for (const r of read) for (const ref of entityRefsOf((r.document as Record<string, unknown>)[column.key], kinds)) seen.set(`${ref.token}:${ref.id}`, ref);\n          if (seen.size === 0) return;\n          const client = seat(binding);\n          const answer = await entityReferenceWords(client.config.dataSource, binding.organizationId ?? client.config.organizationId ?? null, [...seen.values()]);\n          if (answer.ok) words.set(column.key, Object.fromEntries(answer.data.filter((w) => w.label).map((w) => [w.id, w.label as string])));\n          return;\n        }\n        const ids = [...new Set(read.flatMap((r) => relationIdsOf((r.document as Record<string, unknown>)[column.key])))];\n        if (ids.length === 0) return;\n        const answer = await seat(binding).relationWordsMany({ field_id: field.id, record_ids: ids });\n        if (answer.ok) words.set(column.key, answer.data);\n      }),\n    );\n    return read.map((r) => {\n      const doc = (r.document ?? {}) as Record<string, unknown>;\n      const row: Row = { _id: r.id, _version: r.version, _organization_id: r.organization_id };\n      for (const column of shape.columns) {\n        const value = doc[column.key];\n        if (column.type === \"relation\") {\n          const named = words.get(column.key) ?? {};\n          const kinds = entityKindsOf(shape.fields.get(column.key));\n          if (kinds.length) {\n            row[column.key] = entityRefsOf(value, kinds).map<EntityRef>((ref) => ({ token: ref.token, id: ref.id, label: named[ref.id] ?? null }));\n            continue;\n          }\n          row[column.key] = relationIdsOf(value).map<EntityRef>((id) => ({ token: CUSTOM_ROW_TOKEN, id, label: named[id] ?? null }));\n        } else {\n          row[column.key] = value === undefined ? null : value;\n        }\n      }\n      return row;\n    });\n  }\n\n  /** Values keyed by Column.key → the stored document. Unknown keys and read-only columns are refused by name, never sent. */\n  function toStored(shape: TableShape, values: Values): RecordsResult<Record<string, unknown>> {\n    const out: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(values ?? {})) {\n      if (key.startsWith(\"_\")) {\n        if (key === \"_custom\") return refuse(\"invalid_argument\", \"A custom table has no _custom fields; write its columns by their keys.\");\n        continue; // _id / _version / _organization_id ride along on a row handed back; they are never values\n      }\n      const column: Column | undefined = shape.columns.find((c) => c.key === key);\n      if (!column) return refuse(\"invalid_argument\", `This table has no column \"${key}\".`, \"Ask columns() for the keys this table has now. Nothing was saved.\");\n      if (column.readOnly) return refuse(\"invalid_argument\", `\"${column.label}\" is worked out by the table, so it cannot be written.`, \"Nothing was saved.\");\n      const kinds = column.type === \"relation\" ? entityKindsOf(shape.fields.get(key)) : [];\n      out[key] = kinds.length ? entityRefsOf(value, kinds) : column.type === \"relation\" ? relationIdsOf(value) : blankToNull(column.type, value, shape.fields.get(key));\n    }\n    return { ok: true, data: out };\n  }\n\n  async function readByIds(binding: AliasBinding, ids: readonly Uuid[]): Promise<RecordsResult<VersionedReadRow[]>> {\n    const answer = await seat(binding).listKeyset({ table_id: binding.tableId, ids, limit: Math.min(ids.length, DATA_PAGE_CEILING) });\n    return answer.ok ? { ok: true, data: answer.data.rows as VersionedReadRow[] } : answer;\n  }\n\n  async function getRow(alias: string, id: Uuid): Promise<RecordsResult<Row | null>> {\n    const binding = bindingOf(alias);\n    if (!binding) return noSuchAlias(alias);\n    if (!isUuidShape(id)) return refuse(\"invalid_argument\", `\"${String(id)}\" is not a row id.`);\n    const shape = await shapeOf(alias, binding);\n    if (!shape.ok) return shape;\n    const read = await readByIds(binding, [id]);\n    if (!read.ok) return read;\n    const rows = await toRows(binding, shape.data, read.data);\n    return { ok: true, data: rows[0] ?? null };\n  }\n\n  /** After a write: the row as the store now holds it, or the sentence saying it could not be read back. */\n  async function readBack(alias: string, id: Uuid): Promise<RecordsResult<Row>> {\n    const got = await getRow(alias, id);\n    if (!got.ok) return got;\n    if (!got.data) return refuse(\"not_found\", \"The change was saved, but this row can no longer be read with your access.\", \"Ask the table's owner if you should still see it.\");\n    return { ok: true, data: got.data };\n  }\n\n  /**\n   * THE ARCHIVE OF ONE TABLE through `custom.read_records_archived` (the same ladder, level and masking as the\n   * live read, newest-archived first). The door pages by offset, so the cursor is `archived:<offset>`; it\n   * takes no filter, search or sort. A row carries no version (it is not edited until it is restored).\n   */\n  async function listArchived(binding: AliasBinding, shape: TableShape, q: Query, cursor: string | undefined): Promise<RecordsResult<Page>> {\n    const limit = Math.max(1, Math.min(Math.floor(q.pageSize ?? DATA_PAGE_DEFAULT), DATA_PAGE_CEILING));\n    const at = cursor?.startsWith(ARCHIVED_CURSOR) ? Number(cursor.slice(ARCHIVED_CURSOR.length)) : 0;\n    const offset = Number.isInteger(at) && at > 0 ? at : 0;\n    const page = await seat(binding).listArchived({ table_id: binding.tableId, lane: \"org\", limit, offset });\n    if (!page.ok) return page;\n    const read = page.data.rows.map((r) => ({ ...r, version: 0, organization_id: binding.organizationId }) as VersionedReadRow);\n    const rows = await toRows(binding, shape, read);\n    page.data.rows.forEach((r, i) => {\n      rows[i]!._archived_at = r.archivedAt;\n      rows[i]!._archived_by_name = r.archivedByName;\n    });\n    const cursorOut = page.data.rows.length < limit ? null : `${ARCHIVED_CURSOR}${offset + page.data.rows.length}`;\n    return { ok: true, data: { rows, total: page.data.total, cursor: cursorOut } };\n  }\n\n  return {\n    async sources() {\n      const out: DataSource[] = [];\n      for (const [alias, binding] of Object.entries(aliases)) {\n        // THE LEVEL THE READ DOOR ITSELF WORKS OUT for this person on this table (`custom.effective_level`,\n        // carried on every row it answers) — the same answer the write doors act on. `my_levels` on the\n        // table's kernel record understated it: test@test.com, a member who may edit Time Entries, was\n        // told canUpdate:false (verifier, 2026-10-06). An empty table has no row to carry it; then, and\n        // only then, my_levels is asked.\n        const [table, sample] = await Promise.all([\n          seat(binding).tableRead({ table_id: binding.tableId, organization_id: binding.organizationId }),\n          seat(binding).listKeyset({ table_id: binding.tableId, limit: 1 }),\n        ]);\n        if (!table.ok) return table;\n        let level: PermissionLevel | null = sample.ok ? asPermissionLevel(sample.data.rows[0]?.level ?? null) : null;\n        if (level === null && sample.ok && sample.data.rows.length === 0) {\n          const levels = await seat(binding).myLevels({ ids: [binding.tableId] });\n          level = levels.ok ? (levels.data[0]?.level ?? null) : null;\n        }\n        const may = atLeast(level, \"edit_content\");\n        out.push({ alias, label: binding.label ?? table.data?.name ?? alias, kind: \"table\", canCreate: may, canUpdate: may });\n      }\n      return { ok: true, data: out };\n    },\n\n    async columns(alias) {\n      const binding = bindingOf(alias);\n      if (!binding) return noSuchAlias(alias);\n      const shape = await shapeOf(alias, binding);\n      if (!shape.ok) return shape;\n      // A link names the alias that serves its table, so a form lists the linked rows to pick from.\n      return {\n        ok: true,\n        data: shape.data.columns.map((c) => {\n          const target = c.type === \"relation\" && c.linksTo?.length === 1 ? c.linksTo[0] : null;\n          const served = target ? Object.entries(aliases).find(([, b]) => b.tableId === target)?.[0] : undefined;\n          return served ? { ...c, linksToSource: served } : c;\n        }),\n      };\n    },\n\n    async list(alias, q: Query = {}, cursor) {\n      const binding = bindingOf(alias);\n      if (!binding) return noSuchAlias(alias);\n      // A custom table is one organization's: an org filter naming another one answers no rows, never another table.\n      if (q.org && q.org !== \"all\" && q.org !== binding.organizationId) {\n        return { ok: true, data: { rows: [], total: 0, cursor: null } satisfies Page };\n      }\n      const shape = await shapeOf(alias, binding);\n      if (!shape.ok) return shape;\n      if (q.archived === true) return listArchived(binding, shape.data, q, cursor);\n      const filter = compileWhere(q.where, shape.data);\n      if (!filter.ok) return filter;\n      const sort = compileSort(q.sort, shape.data);\n      if (!sort.ok) return sort;\n      const limit = Math.max(1, Math.min(Math.floor(q.pageSize ?? DATA_PAGE_DEFAULT), DATA_PAGE_CEILING));\n      const page = await seat(binding).listKeyset({\n        table_id: binding.tableId,\n        ...(filter.data ? { filter: filter.data } : {}),\n        search: q.search?.trim() ? q.search : null,\n        sort: sort.data,\n        after: cursor ?? null,\n        limit,\n      });\n      if (!page.ok) return page;\n      const rows = await toRows(binding, shape.data, page.data.rows as VersionedReadRow[]);\n      return { ok: true, data: { rows, total: page.data.total, cursor: page.data.cursor } };\n    },\n\n    get: getRow,\n\n    async create(alias, values) {\n      const binding = bindingOf(alias);\n      if (!binding) return noSuchAlias(alias);\n      const shape = await shapeOf(alias, binding);\n      if (!shape.ok) return shape;\n      const stored = toStored(shape.data, values);\n      if (!stored.ok) return stored;\n      const written = await seat(binding).recordWrite({ table_id: binding.tableId, data: stored.data });\n      if (!written.ok) return written;\n      return readBack(alias, written.data);\n    },\n\n    async update(alias, id, patch, baseVersion) {\n      const binding = bindingOf(alias);\n      if (!binding) return noSuchAlias(alias);\n      if (typeof baseVersion !== \"number\" || !Number.isInteger(baseVersion) || baseVersion < 0) {\n        return refuse(\"invalid_argument\", \"Nothing was saved: an update must say which version of the row it was made on.\", \"Pass the row's _version as baseVersion.\");\n      }\n      const shape = await shapeOf(alias, binding);\n      if (!shape.ok) return shape;\n      const stored = toStored(shape.data, patch);\n      if (!stored.ok) return stored;\n      const written = await seat(binding).recordUpdate({ record_id: id, patch: stored.data, expectedVersion: baseVersion });\n      if (!written.ok) return written;\n      return readBack(alias, id);\n    },\n\n    async archive(alias, id) {\n      const binding = bindingOf(alias);\n      if (!binding) return noSuchAlias(alias);\n      const done = await seat(binding).recordDelete({ record_id: id });\n      return done.ok ? { ok: true, data: undefined } : done;\n    },\n\n    async restore(alias, id) {\n      const binding = bindingOf(alias);\n      if (!binding) return noSuchAlias(alias);\n      const done = await seat(binding).recordRestore({ record_id: id });\n      return done.ok ? { ok: true, data: undefined } : done;\n    },\n\n    subscribe(event: DataPortEventName, listener: (event: RowsEvent) => void) {\n      const alias = event.startsWith(\"rows:\") ? event.slice(5) : null;\n      const binding = alias ? bindingOf(alias) : null;\n      if (!alias || !binding) {\n        throw new Error(`DataPort.subscribe: \"${event}\" is not an event this Applet's port carries. Use rows:<alias>.`);\n      }\n      const realtime = client.config.realtime;\n      if (!realtime) {\n        // NOT LIVE, SAID OUT LOUD: a page with no realtime port goes stale, and the console says why.\n        if (!warnedNotLive) {\n          warnedNotLive = true;\n          console.warn(\"[@ai-matrx/records/data] This host bound no realtime port, so other people's changes will not appear until a re-read.\");\n        }\n        return () => {};\n      }\n      return realtime.subscribeRecords(\n        { organization_id: binding.organizationId, table_id: binding.tableId },\n        {\n          records: (ids) => listener({ ids: ids === null ? null : [...ids] }),\n          shape: () => {\n            shapes.delete(alias);\n            listener({ ids: null, shape: true });\n          },\n        },\n      );\n    },\n  };\n}\n","// src/button.ts — @ai-matrx/records\n//\n// A BUTTON COLUMN (lanes NOTION-PROPS-2/3; champions: Notion's and Airtable's Button). The store keeps it as\n// behavior text wearing the format `button`; it holds no value, and `config.button` says what a press does\n// through `custom.button_press`:\n//\n//   open_url        answers `url` with every {{field id}} filled from the row; the screen opens it\n//   run_action      one of the table's row actions on this row (which is how a button sets fields)\n//   run_automation  one of the table's automations on this row, for an editor of the row\n//\n// A button with no `do` (what Notion's importer brings — Notion's API hides a button's steps) is a label\n// only, and a press is refused by name. Its settings change through `custom.field_update`'s `button` key.\n\nimport type { CoercibleField } from \"./coerce\";\nimport type { Uuid } from \"./record\";\n\nexport const BUTTON_DOES = [\"open_url\", \"run_action\", \"run_automation\", \"add_row\"] as const;\nexport type ButtonDoes = (typeof BUTTON_DOES)[number];\n\n/** What `config.button` holds. */\nexport interface ButtonSettings {\n  label: string;\n  /** One of the table's color names (blue, green, …); absent, the button wears the neutral look. */\n  color?: string | undefined;\n  /** Absent: nothing is set up yet, and a press says so. */\n  do?: ButtonDoes | undefined;\n  url?: string | undefined;\n  action_id?: Uuid | undefined;\n  automation_id?: Uuid | undefined;\n  /** W2-A `add_row`: the table the new row goes in; absent = this table. */\n  table_id?: Uuid | undefined;\n  /** W2-A `add_row`: the new row's field key → this row's field key, or \"@row\" for this row's id (a link back). */\n  prefill?: Record<string, string> | undefined;\n  /** TEMPLATE-GAPS R3 `add_row`: the target table's row template the new row starts from (its values under prefill). */\n  template_id?: Uuid | undefined;\n}\n\n/** What `custom.button_press` answers. */\nexport type ButtonPressed =\n  | { do: \"open_url\"; label: string; url: string }\n  /** W2-A: the row the press added (through custom.record_write), for the screen to open. */\n  | { do: \"add_row\"; label: string; table_id: Uuid; record_id: Uuid; template_id?: Uuid }\n  | { do: \"run_action\"; label: string; result: { ran?: number; records?: Array<{ record_id: Uuid; version: number }> } & Record<string, unknown> }\n  | {\n      do: \"run_automation\";\n      label: string;\n      /** null when no automation this button starts met its conditions (status \"skipped\"). */\n      run_id: Uuid | null;\n      automation: string | null;\n      status: string | null;\n      says: string | null;\n      /** AUTOMATIONS-AIRTABLE: every automation whose trigger is this button, as each ran on the press. */\n      runs?: Array<{ run_id: Uuid; automation: string | null; status: string | null; says: string | null }>;\n    };\n\n/** Whether a Field is a button column — `custom.field_kind_of`'s mirror for this one kind. */\nexport function isButtonField(field: CoercibleField | null | undefined): boolean {\n  return field?.type === \"text\" && String(field.format ?? \"\") === \"button\";\n}\n\n/** A button column's settings, read off its declaration; null for any other column. */\nexport function buttonOf(field: (CoercibleField & { label?: string | null }) | null | undefined): ButtonSettings | null {\n  if (!field || !isButtonField(field)) return null;\n  const raw = ((field.config ?? {}) as Record<string, unknown>)[\"button\"];\n  const b = raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n  const text = (v: unknown) => (typeof v === \"string\" && v.trim() !== \"\" ? v.trim() : undefined);\n  const does = text(b[\"do\"]);\n  return {\n    label: text(b[\"label\"]) ?? text(field.label) ?? \"Button\",\n    color: text(b[\"color\"]),\n    do: (BUTTON_DOES as readonly string[]).includes(does ?? \"\") ? (does as ButtonDoes) : undefined,\n    url: text(b[\"url\"]),\n    action_id: text(b[\"action_id\"]) as Uuid | undefined,\n    automation_id: text(b[\"automation_id\"]) as Uuid | undefined,\n    table_id: text(b[\"table_id\"]) as Uuid | undefined,\n    prefill: b[\"prefill\"] && typeof b[\"prefill\"] === \"object\" && !Array.isArray(b[\"prefill\"]) ? (b[\"prefill\"] as Record<string, string>) : undefined,\n    template_id: text(b[\"template_id\"]) as Uuid | undefined,\n  };\n}\n\n/** The `{{field id}}` placeholders a link names, in order — so a settings screen can show them as names. */\nexport function buttonUrlPlaceholders(url: string): string[] {\n  return Array.from(url.matchAll(/\\{\\{([^{}]+)\\}\\}/g), (m) => m[1]!.trim());\n}\n\n/**\n * What a button's settings are missing before a press can work, in words; null when it is set up.\n * The store refuses the same cases (`custom._field_kind_shape_ok`, `custom.button_press`).\n */\nexport function buttonNeeds(b: ButtonSettings): string | null {\n  if (!b.do) return `${b.label} has nothing set up to do yet.`;\n  if (b.do === \"open_url\" && !/^(https?:\\/\\/|mailto:|tel:|\\{\\{)/i.test(b.url ?? \"\")) return `${b.label} needs a link that starts with https://.`;\n  if (b.do === \"run_action\" && !b.action_id) return `${b.label} needs a row action to run.`;\n  if (b.do === \"run_automation\" && !b.automation_id) return `${b.label} needs an automation to run.`;\n  return null;\n}\n","// src/newerKinds.ts — @ai-matrx/records\n//\n// THE NINE NEWER KINDS OF COLUMN (lane 10 VIEWS-AND-FIELDS, sublane P4; champions: Airtable's and\n// SmartSuite's field types). The store keeps each as an EXISTING behavior wearing a format —\n// FLD-1's six behaviors stay six — and `custom.field_kind_of` reads each back. This file is the\n// client's mirror of that one reader, plus the few words each kind needs wherever only words fit\n// (a card, an export cell, a typed answer):\n//\n//   kind         behavior  format     value\n//   rating       range      rating     whole number 0..max (max Rule 1–10, default 5)\n//   duration     range      duration   seconds (unit \"seconds\"), never below zero\n//   created_by   formula    —          {id, name}; config.system created_by, worked out on read\n//   modified_by  formula    —          {id, name}; config.system modified_by, worked out on read\n//   status       list       status     the choice's key; config.status_groups key → todo | in_progress | done\n//   address      text       address    {street, city, region, postal_code, country}\n//   barcode      text       barcode    one printable line; config.symbology optional\n//   rich_text    text       rich_text  Markdown, no raw HTML\n//   count        formula    count      how many linked records (a roll-up whose agg is count)\n//\n// `fieldKindFor` (coerce.ts) still answers the BASE kind — a rating is a number, a status a\n// select, a count a roll-up — because every editor, sort and aggregate keyed on those keeps\n// working for them. What is particular to each newer kind asks `newerKindOf` here.\n\nimport { formatDurationSeconds } from \"@ai-matrx/kit/format\";\nimport type { CoercibleField } from \"./coerce\";\n\nexport const NEWER_FIELD_KINDS = [\n  \"rating\",\n  \"duration\",\n  \"created_by\",\n  \"modified_by\",\n  \"status\",\n  \"address\",\n  \"barcode\",\n  \"rich_text\",\n  \"count\",\n] as const;\n\nexport type NewerFieldKind = (typeof NEWER_FIELD_KINDS)[number];\n\ntype WithRules = CoercibleField & { rules?: ReadonlyArray<{ kind?: string; value?: unknown }> | null };\n\n/** Which of the nine newer kinds a Field is, read off its declaration — `custom.field_kind_of`'s mirror. */\nexport function newerKindOf(field: CoercibleField): NewerFieldKind | null {\n  const format = String(field.format ?? \"\");\n  const config = (field.config ?? {}) as Record<string, unknown>;\n  switch (field.type) {\n    case \"range\":\n      if (format === \"rating\") return \"rating\";\n      if (format === \"duration\") return \"duration\";\n      return null;\n    case \"text\":\n      if (format === \"address\") return \"address\";\n      if (format === \"barcode\") return \"barcode\";\n      if (format === \"rich_text\") return \"rich_text\";\n      return null;\n    case \"list\":\n      return format === \"status\" ? \"status\" : null;\n    case \"formula\":\n      if (format === \"count\" && config[\"agg\"] === \"count\") return \"count\";\n      if (config[\"system\"] === \"created_by\") return \"created_by\";\n      if (config[\"system\"] === \"modified_by\") return \"modified_by\";\n      return null;\n    default:\n      return null;\n  }\n}\n\n// ── RATING ─────────────────────────────────────────────────────────────────────────────────\n\n/** A rating's top star: its max Rule (1–10), else 5 — the store's own default. */\nexport function ratingMaxOf(field: CoercibleField): number {\n  const rules = (field as WithRules).rules ?? [];\n  const max = rules.find((r) => r?.kind === \"max\")?.value;\n  const n = typeof max === \"number\" ? max : typeof max === \"string\" ? Number(max) : NaN;\n  return Number.isInteger(n) && n >= 1 && n <= 10 ? n : 5;\n}\n\n// ── DURATION ───────────────────────────────────────────────────────────────────────────────\n\n/** Seconds as h:mm — and h:mm:ss only when there are seconds to show. 2700 → \"0:45\". */\nexport function durationText(seconds: unknown): string | null {\n  const n = typeof seconds === \"number\" ? seconds : typeof seconds === \"string\" && seconds.trim() !== \"\" ? Number(seconds) : NaN;\n  if (!Number.isFinite(n)) return null;\n  return formatDurationSeconds(Math.round(n), { granularity: \"minute\", signed: true });\n}\n\n/**\n * A length of time as a person types it, in seconds. \"45\" and \"45 min\" are 45 minutes (the column\n * reads in h:mm, so a bare number is minutes, as in Airtable); \"1:30\" is an hour and a half;\n * \"1:30:15\" has seconds; \"1h 30m\", \"2 hours\", \"90s\" read as written. Null: not a length of time.\n */\nexport function readTypedDuration(text: string): number | null {\n  const t = text.trim().toLowerCase();\n  if (t === \"\") return null;\n  const clock = /^(\\d+):([0-5]?\\d)(?::([0-5]?\\d))?$/.exec(t);\n  if (clock) return Number(clock[1]) * 3600 + Number(clock[2]) * 60 + Number(clock[3] ?? 0);\n  if (/^\\d+(\\.\\d+)?$/.test(t)) return Math.round(Number(t) * 60);\n  const unitRe = /(\\d+(?:\\.\\d+)?)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes|s|sec|secs|second|seconds)\\b/g;\n  let total = 0;\n  let matched = \"\";\n  for (const m of t.matchAll(unitRe)) {\n    const n = Number(m[1]);\n    const u = m[2]!;\n    total += u.startsWith(\"h\") ? n * 3600 : u.startsWith(\"m\") ? n * 60 : n;\n    matched += m[0];\n  }\n  if (matched === \"\" || t.replace(unitRe, \"\").replace(/[\\s,and]+/g, \"\") !== \"\") return null;\n  return Math.round(total);\n}\n\n// ── ADDRESS ────────────────────────────────────────────────────────────────────────────────\n\nexport const ADDRESS_PARTS = [\"street\", \"city\", \"region\", \"postal_code\", \"country\"] as const;\nexport type AddressPart = (typeof ADDRESS_PARTS)[number];\nexport type AddressValue = Partial<Record<AddressPart, string | null>>;\n\nexport function isAddressValue(value: unknown): value is AddressValue {\n  return value !== null && typeof value === \"object\" && !Array.isArray(value)\n    && Object.keys(value as object).every((k) => (ADDRESS_PARTS as readonly string[]).includes(k));\n}\n\n/** An address on one line, the way an envelope reads: \"1420 Cedar Ridge Pkwy, Boulder, CO 80301, US\". */\nexport function addressValueText(value: unknown): string | null {\n  if (typeof value === \"string\") return value.trim() === \"\" ? null : value.trim();\n  if (!isAddressValue(value)) return null;\n  const part = (k: AddressPart) => (typeof value[k] === \"string\" ? (value[k] as string).trim() : \"\");\n  const regionLine = [part(\"region\"), part(\"postal_code\")].filter(Boolean).join(\" \");\n  const words = [part(\"street\"), part(\"city\"), regionLine, part(\"country\")].filter(Boolean).join(\", \");\n  return words === \"\" ? null : words;\n}\n\n/**\n * One typed line as an address in parts. \"street, city, region postal, country\" is read into its\n * parts when it has that shape; anything else is kept whole as the street, so nothing typed is lost.\n */\nexport function addressFromText(text: string): AddressValue | null {\n  const t = text.trim();\n  if (t === \"\") return null;\n  const bits = t.split(\",\").map((b) => b.trim()).filter(Boolean);\n  if (bits.length >= 3) {\n    const [street, city, regionPostal, ...rest] = bits;\n    const rp = /^(.*?)\\s*([A-Za-z0-9-]*\\d[A-Za-z0-9 -]*)?$/.exec(regionPostal ?? \"\");\n    const out: AddressValue = { street: street!, city: city! };\n    if (rp?.[1]) out.region = rp[1];\n    if (rp?.[2]) out.postal_code = rp[2].trim();\n    if (rest.length > 0) out.country = rest.join(\", \");\n    return out;\n  }\n  return { street: t };\n}\n\n/** A maps search for an address, opened in a new tab. */\nexport function addressMapUrl(value: unknown): string | null {\n  const words = addressValueText(value);\n  return words ? `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(words)}` : null;\n}\n\n// ── CREATED BY / LAST MODIFIED BY ──────────────────────────────────────────────────────────\n\n/**\n * `{id, name, actor}` as the store works it out (`custom.formula_value`). `actor` is the kind of\n * writer — a person (`user`), an agent (`agent`, with `id`/`name` the person it wrote for) or the\n * platform itself (`system`, with no id and no name). `name` is null for somebody outside the\n * organization. A value written before the store said `actor` is a person's.\n */\nexport type PersonStamp = { id: string | null; name: string | null; actor?: \"user\" | \"agent\" | \"system\" };\n\nexport function isPersonStamp(value: unknown): value is PersonStamp {\n  if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n  const v = value as { id?: unknown; actor?: unknown };\n  return typeof v.id === \"string\" || v.actor === \"system\" || v.actor === \"agent\";\n}\n\n/** The words for who made or changed a record. */\nexport const NOT_A_MEMBER_WORDS = \"Not in this organization\";\nexport const SYSTEM_WRITER_WORDS = \"System\";\nexport const AGENT_WRITER_WORDS = \"Agent\";\nexport function personStampText(value: unknown): string | null {\n  if (!isPersonStamp(value)) return null;\n  const name = value.name && value.name.trim() !== \"\" ? value.name : null;\n  // V11 #6: a system write names the person who set it going, when the store knows who.\n  if (value.actor === \"system\") return name ? `${SYSTEM_WRITER_WORDS} for ${name}` : SYSTEM_WRITER_WORDS;\n  if (value.actor === \"agent\") return name ? `${AGENT_WRITER_WORDS} for ${name}` : AGENT_WRITER_WORDS;\n  return name ?? NOT_A_MEMBER_WORDS;\n}\n\n// ── STATUS ─────────────────────────────────────────────────────────────────────────────────\n\nexport const STATUS_GROUPS = [\"todo\", \"in_progress\", \"done\"] as const;\nexport type StatusGroup = (typeof STATUS_GROUPS)[number];\nexport const STATUS_GROUP_WORDS: Record<StatusGroup, string> = { todo: \"To do\", in_progress: \"In progress\", done: \"Done\" };\n\n/** Which group a status choice sits in; a choice the column names no group for is To do. */\nexport function statusGroupOf(field: CoercibleField, choiceKey: string): StatusGroup {\n  const groups = ((field.config ?? {}) as Record<string, unknown>)[\"status_groups\"];\n  const g = groups && typeof groups === \"object\" ? (groups as Record<string, unknown>)[choiceKey] : undefined;\n  return g === \"in_progress\" || g === \"done\" ? g : \"todo\";\n}\n\n// ── BARCODE ────────────────────────────────────────────────────────────────────────────────\n\nexport const BARCODE_SYMBOLOGIES = [\"code128\", \"code39\", \"ean13\", \"ean8\", \"upc_a\", \"upc_e\", \"itf\", \"qr\", \"data_matrix\", \"pdf417\"] as const;\n\n// ── RICH TEXT ──────────────────────────────────────────────────────────────────────────────\n\n/** Markdown read as plain words on one line — what a card title or a sentence shows. */\nexport function richTextPlain(text: string): string {\n  return text\n    .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, \"$1\")\n    .replace(/(\\*\\*|__|`)/g, \"\")\n    .replace(/(^|\\s)[*_]([^*_\\s][^*_]*)[*_](?=\\s|$|[.,;:!?])/g, \"$1$2\")\n    .replace(/^\\s*(#{1,3}|[-*+]|\\d+[.)])\\s+/gm, \"\")\n    .replace(/\\s*\\n+\\s*/g, \" · \")\n    .trim();\n}\n\n/**\n * A link destination as a browser would follow it: HTML entities and backslash escapes decoded,\n * spaces and control characters removed (`custom._entity_decoded`'s rules). Then only a web page,\n * an email address or a phone number is a link here; everything else is drawn as words.\n */\nexport function safeLinkHref(raw: string): string | null {\n  let t = raw\n    .replace(/&#[xX]([0-9a-fA-F]{1,8});?/g, (_, h: string) => codePoint(parseInt(h, 16)))\n    .replace(/&#([0-9]{1,8});?/g, (_, d: string) => codePoint(parseInt(d, 10)))\n    .replace(/&colon;/g, \":\").replace(/&Tab;/g, \"\\t\").replace(/&NewLine;/g, \"\\n\").replace(/&sol;/g, \"/\")\n    .replace(/&lpar;/g, \"(\").replace(/&rpar;/g, \")\").replace(/&period;/g, \".\").replace(/&nbsp;/g, \" \")\n    .replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\").replace(/&quot;/g, '\"').replace(/&apos;/g, \"'\").replace(/&amp;/g, \"&\")\n    .replace(/\\\\([!-/:-@[-`{-~])/g, \"$1\");\n  t = t.replace(/[\\s\\u0000-\\u001f\\u007f]/g, \"\");\n  return /^(https?:\\/\\/|mailto:|tel:)/i.test(t) ? t : null;\n}\n\nfunction codePoint(n: number): string {\n  return Number.isFinite(n) && n >= 1 && n <= 0x10ffff && !(n >= 0xd800 && n <= 0xdfff) ? String.fromCodePoint(n) : \"\\ufffd\";\n}\n\n// ── ONE VALUE IN WORDS ─────────────────────────────────────────────────────────────────────\n\n/**\n * The words one value of a newer kind reads as wherever only words fit — an export cell, a card,\n * a sentence. Null: not a newer kind, or nothing particular to say (the caller's own words apply).\n */\nexport function newerKindWords(field: CoercibleField, value: unknown): string | null {\n  if (value === null || value === undefined || value === \"\") return null;\n  switch (newerKindOf(field)) {\n    case \"duration\":\n      return durationText(value);\n    case \"address\":\n      return addressValueText(value);\n    case \"created_by\":\n    case \"modified_by\":\n      return personStampText(value);\n    case \"rich_text\":\n      return typeof value === \"string\" ? richTextPlain(value) : null;\n    case \"rating\": {\n      const n = typeof value === \"number\" ? value : Number(value);\n      return Number.isFinite(n) ? `${n} / ${ratingMaxOf(field)}` : null;\n    }\n    default:\n      return null;\n  }\n}\n\n/**\n * The words one value of a newer kind is EXPORTED or COPIED as: an address on one line, a length of\n * time as h:mm, who by name. A rating, a count and a barcode stay what they are, and rich text\n * stays its Markdown. Null: the value is written as it is stored.\n */\nexport function newerKindExportWords(field: CoercibleField, value: unknown): string | null {\n  const kind = newerKindOf(field);\n  if (kind === \"address\" || kind === \"duration\" || kind === \"created_by\" || kind === \"modified_by\") {\n    return newerKindWords(field, value);\n  }\n  return null;\n}\n","// src/typedDate.ts — @ai-matrx/records\n//\n// A DATE A PERSON TYPED, READ THE WAY THEIR SPREADSHEET READS IT — OR REFUSED.\n//\n// 🚨 WHY THIS EXISTS (merged-grid cold review, 2026-09-26). A person selected a Visit Date cell\n// and typed `10/03/2026`; the store kept **Jan 31, 0026**. `2026-10-03` became **Feb 6, 1003**.\n// The keystrokes after the first landed in the browser's segmented date control one segment at a\n// time and every half-typed segment was a \"valid\" date. The reading that replaces that is this\n// one, and it is the ONE reading every typed-date door uses (`coerceTypedAnswer` — the grid's\n// type-to-edit, a paste, a public form, an import).\n//\n// THE RULES (Google Sheets and Airtable are the bar):\n//   · `2026-10-03` (and `2026/10/03`) is year-month-day, everywhere.\n//   · `10/03/2026` is read in the reader's own LOCALE order — Oct 3 in en-US, 10 March in en-GB —\n//     exactly as their spreadsheet would. The locale is the caller's to pass; the default is the\n//     runtime's.\n//   · A month may be a word: `Oct 3, 2026`, `3 October 2026`, `Saturday, October 3, 2026`.\n//   · A TWO-DIGIT YEAR IS READ THE WAY GOOGLE SHEETS READS IT (grids review 3, 2026-09-30):\n//     `10/03/26` is Oct 3, 2026 — 00–29 is 2000–2029 and 30–99 is 1930–1999, Sheets' and Excel's\n//     own window, so a birthday typed `5/12/85` is 1985 and a visit typed `10/03/26` is this year.\n//     Airtable and Sheets both take it; refusing it was the one place this reader was stricter\n//     than every spreadsheet a person has used.\n//   · NOTHING ELSE IS GUESSED. A missing year (which year?), a one- or three-digit year, a\n//     month 0 or 13, a 31 September, a year before 1000 (that is a half-typed year, not a date\n//     anybody means) — each is REFUSED with a sentence saying how to write it.\n//   · A time of day may follow (`10/03/2026 2:30 PM`, `2026-10-03T14:30`, an ISO instant with its\n//     zone). A day-only column keeps the DAY that was written; a date-and-time column keeps the\n//     instant, read in the reader's own zone unless the text names one.\n\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\n\n// THE PERSON'S ZONE, read from the ONE slot design-system's `setDisplayTimeZone` writes (the host sets it\n// once at boot through records-ui `setPersonTimeZone`). Same key, same shape: this file only READS it, so a\n// typed `10/03/2026 9:30 AM` is placed at 9:30 in the zone the cell, the panel and the calendar show it in.\n// Without a saved zone the device's zone applies, exactly as before (AT-FIX-J2, 2026-10-20).\nconst zoneSlot = globalSlot<{ zone: string | null }>(\"ai-matrx.design-system.display-time-zone\", () => ({ zone: null }));\n\nexport type WallParts = { year: number; month: number; day: number; hour: number; minute: number; second: number };\n\n/** The wall clock `at` shows in the person's zone (the device's when none is saved). */\nexport function wallPartsInZone(at: Date): WallParts {\n  const zone = zoneSlot.zone;\n  if (!zone) {\n    return { year: at.getFullYear(), month: at.getMonth() + 1, day: at.getDate(), hour: at.getHours(), minute: at.getMinutes(), second: at.getSeconds() };\n  }\n  const parts = new Intl.DateTimeFormat(\"en-US\", {\n    timeZone: zone, year: \"numeric\", month: \"2-digit\", day: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\",\n  }).formatToParts(at);\n  const n = (t: string) => Number(parts.find((p) => p.type === t)?.value ?? 0);\n  return { year: n(\"year\"), month: n(\"month\"), day: n(\"day\"), hour: n(\"hour\"), minute: n(\"minute\"), second: n(\"second\") };\n}\n\n/** The instant at which the person's wall clock reads these fields (the device's clock when no zone is saved). */\nexport function instantFromWallInZone(year: number, month: number, day: number, hour = 0, minute = 0, second = 0): Date {\n  const zone = zoneSlot.zone;\n  if (!zone) return new Date(year, month - 1, day, hour, minute, second);\n  const target = Date.UTC(year, month - 1, day, hour, minute, second);\n  let guess = target;\n  for (let i = 0; i < 3; i += 1) {\n    const w = wallPartsInZone(new Date(guess));\n    guess -= Date.UTC(w.year, w.month - 1, w.day, w.hour, w.minute, w.second) - target;\n  }\n  return new Date(guess);\n}\n\nexport type TypedDate =\n  | { ok: true; day: string; /** ISO instant, only when a time of day was read or asked for. */ instant: string | null }\n  | { ok: false; why: string };\n\nconst MONTHS: Record<string, number> = {\n  jan: 1, january: 1, feb: 2, february: 2, mar: 3, march: 3, apr: 4, april: 4, may: 5, jun: 6, june: 6,\n  jul: 7, july: 7, aug: 8, august: 8, sep: 9, sept: 9, september: 9, oct: 10, october: 10,\n  nov: 11, november: 11, dec: 12, december: 12,\n};\nconst WEEKDAYS = /\\b(mon|tue|tues|wed|thu|thur|thurs|fri|sat|sun)(day|nesday|sday|urday)?\\b\\.?,?/gi;\n\n/** The order a locale writes a numeric date in: \"mdy\", \"dmy\" or \"ymd\". */\nexport function localeDateOrder(locale?: string): \"mdy\" | \"dmy\" | \"ymd\" {\n  try {\n    const parts = new Intl.DateTimeFormat(locale, { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).formatToParts(\n      new Date(2026, 10, 22),\n    );\n    const order = parts\n      .filter((p) => p.type === \"year\" || p.type === \"month\" || p.type === \"day\")\n      .map((p) => p.type.charAt(0))\n      .join(\"\");\n    if (order === \"mdy\" || order === \"dmy\" || order === \"ymd\") return order;\n  } catch {\n    // An unknown locale reads like the runtime's own.\n  }\n  return \"mdy\";\n}\n\nfunction pad(n: number, width = 2): string {\n  return String(n).padStart(width, \"0\");\n}\n\nfunction daysIn(year: number, month: number): number {\n  return new Date(Date.UTC(year, month, 0)).getUTCDate();\n}\n\nconst HOW = \"Write it as 2026-10-03, or with the year in full the way your spreadsheet writes dates.\";\n\n/** Sheets' and Excel's two-digit-year window: 00–29 → 2000–2029, 30–99 → 1930–1999. */\nexport function twoDigitYear(yy: number): number {\n  return yy < 30 ? 2000 + yy : 1900 + yy;\n}\n\nfunction checkDay(year: number, month: number, day: number, raw: string): string | null {\n  if (year < 1000 || year > 9999) return `“${raw}” has no four-digit year. ${HOW}`;\n  if (month < 1 || month > 12) return `“${raw}” names no month (month ${month}). ${HOW}`;\n  if (day < 1 || day > daysIn(year, month)) return `“${raw}” is not a day on the calendar. ${HOW}`;\n  return null;\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// A TIME OF DAY A PERSON TYPED (Arman, 2026-09-28: \"if I type 1200PM, I get 2:00PM because the\n// one isn't recorded\"). The grid opens a plain text box holding every key typed; this reads it\n// ONCE, on commit — for a time column and for the time after a date-and-time column's day.\n//\n//   · 12-hour with a meridiem, any spelling: `1200PM`, `12pm`, `12:00 PM`, `9:30a`, `9:30 a.m.`,\n//     `930am`, `2 PM`.\n//   · 24-hour with minutes: `14:30`, `14:30:05`, and the four-digit clock `1200`, `0930`.\n//   · NOTHING IS GUESSED. A bare hour (`9` — morning or evening?), three bare digits (`200`),\n//     `13pm`, `0am`, `25:00`, `12:60`, `2400` — each is refused with the way to write it.\n// ───────────────────────────────────────────────────────────────────────────\n\nexport type TypedTime = { ok: true; /** 24-hour `HH:MM`, or `HH:MM:SS` when seconds were typed. */ value: string } | { ok: false; why: string };\n\nconst TIME_HOW = \"Write it like 2:30 PM or 14:30.\";\nconst MERIDIEM = String.raw`([ap])\\.?\\s*(?:m\\.?)?`;\nconst CLOCK = new RegExp(String.raw`^(\\d{1,2})(?::(\\d{2})(?::(\\d{2}))?)?\\s*(?:${MERIDIEM})?$`, \"i\");\nconst COMPACT = new RegExp(String.raw`^(\\d{3,4})\\s*(?:${MERIDIEM})?$`, \"i\");\n\n/** Read one typed time of day. Never throws; never guesses. */\nexport function readTypedTime(raw: string): TypedTime {\n  const text = raw.trim();\n  if (text === \"\") return { ok: false, why: \"Nothing was typed.\" };\n  let h: number;\n  let m: number;\n  let s: number | null = null;\n  let meridiem: string | undefined;\n  const clock = CLOCK.exec(text);\n  const compact = clock ? null : COMPACT.exec(text);\n  if (clock) {\n    h = Number(clock[1]);\n    meridiem = clock[4]?.toLowerCase();\n    if (clock[2] === undefined && !meridiem) {\n      return { ok: false, why: `“${raw}” could be in the morning or the evening. ${TIME_HOW}` };\n    }\n    m = clock[2] === undefined ? 0 : Number(clock[2]);\n    if (clock[3] !== undefined) s = Number(clock[3]);\n  } else if (compact) {\n    const digits = compact[1]!;\n    meridiem = compact[2]?.toLowerCase();\n    if (digits.length === 3 && !meridiem) {\n      return { ok: false, why: `“${raw}” could be in the morning or the evening. ${TIME_HOW}` };\n    }\n    h = Number(digits.slice(0, digits.length - 2));\n    m = Number(digits.slice(-2));\n  } else {\n    return { ok: false, why: `“${raw}” is not a time of day. ${TIME_HOW}` };\n  }\n  if (meridiem) {\n    if (h < 1 || h > 12) return { ok: false, why: `“${raw}” is not a time of day. ${TIME_HOW}` };\n    if (meridiem === \"p\" && h !== 12) h += 12;\n    if (meridiem === \"a\" && h === 12) h = 0;\n  }\n  if (h > 23 || m > 59 || (s !== null && s > 59)) return { ok: false, why: `“${raw}” is not a time of day. ${TIME_HOW}` };\n  return { ok: true, value: [h, m, ...(s === null ? [] : [s])].map((n) => pad(n)).join(\":\") };\n}\n\n/**\n * A time of day at the END of the text: `14:30`, `2:30 pm`, `2 PM`, `1200PM`, `14:30:05`. A bare\n * number (`2026` after `Oct 3`) is never a time — only one with a colon or a meridiem is.\n */\nfunction splitTime(text: string): { date: string; time: { h: number; m: number; s: number } | null; bad: boolean } {\n  const match = /(?:^|[\\sT,]+)(?:at\\s+)?(\\d{1,4}(?::\\d{2}){0,2}\\s*(?:[ap]\\.?\\s*(?:m\\.?)?)?)$/i.exec(text);\n  if (!match) return { date: text, time: null, bad: false };\n  const token = match[1]!;\n  if (!/:|[ap]\\.?\\s*(?:m\\.?)?$/i.test(token)) return { date: text, time: null, bad: false };\n  const read = readTypedTime(token);\n  if (!read.ok) return { date: text, time: null, bad: true };\n  const [h, m, s] = read.value.split(\":\").map(Number);\n  return { date: text.slice(0, match.index).replace(/[\\s,]+$/, \"\"), time: { h: h!, m: m!, s: s ?? 0 }, bad: false };\n}\n\n/**\n * Read one typed date. `withTime` is true for a date-and-time column. Never throws; never guesses.\n */\nexport function readTypedDate(raw: string, opts: { withTime?: boolean; locale?: string } = {}): TypedDate {\n  const text = raw.trim();\n  if (text === \"\") return { ok: false, why: \"Nothing was typed.\" };\n\n  // AN ISO INSTANT WITH ITS ZONE (`…Z`, `…+02:00`) is a moment, placed exactly.\n  const iso = /^(\\d{4})-(\\d{2})-(\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})$/i.exec(text);\n  if (iso) {\n    const bad = checkDay(Number(iso[1]), Number(iso[2]), Number(iso[3]), raw);\n    if (bad) return { ok: false, why: bad };\n    const at = new Date(Date.parse(text));\n    if (Number.isNaN(at.getTime())) return { ok: false, why: `“${raw}” is not a moment this can read. ${HOW}` };\n    const w = wallPartsInZone(at);\n    const day = `${pad(w.year, 4)}-${pad(w.month)}-${pad(w.day)}`;\n    return { ok: true, day, instant: opts.withTime ? at.toISOString() : null };\n  }\n\n  const split = splitTime(text.replace(/(\\d)T(\\d)/, \"$1 $2\"));\n  if (split.bad) return { ok: false, why: `“${raw}” has a time of day that is not one. Write it as 14:30 or 2:30 PM.` };\n  const dateText = split.date.replace(WEEKDAYS, \" \").replace(/\\s+/g, \" \").trim();\n\n  let year: number | null = null;\n  let month: number | null = null;\n  let day: number | null = null;\n\n  const numeric = /^(\\d{1,4})[/.\\-](\\d{1,2})[/.\\-](\\d{1,4})$/.exec(dateText);\n  // DIGITS WITH NO SEPARATORS (Arman 2026-10-08: typing `10142026` did nothing): MMDDYYYY / DDMMYYYY by\n  // the locale's order, MMDDYY (the two-digit-year window), and YYYYMMDD when that is the only reading.\n  const compact = /^(\\d{8}|\\d{6})$/.exec(dateText);\n  if (compact) {\n    const digits = compact[1]!;\n    const order = localeDateOrder(opts.locale);\n    const first2 = Number(digits.slice(0, 2));\n    const mid2 = Number(digits.slice(2, 4));\n    if (digits.length === 6) {\n      year = twoDigitYear(Number(digits.slice(4)));\n      if (order === \"dmy\") {\n        day = first2;\n        month = mid2;\n      } else {\n        month = first2;\n        day = mid2;\n      }\n    } else {\n      const yearLast = Number(digits.slice(4));\n      const yearFirst = Number(digits.slice(0, 4));\n      const localeReading = (): [number, number, number] =>\n        order === \"dmy\" ? [yearLast, mid2, first2] : [yearLast, first2, mid2];\n      const [ly, lm, ld] = localeReading();\n      const isoReading: [number, number, number] = [yearFirst, Number(digits.slice(4, 6)), Number(digits.slice(6))];\n      const fits = (y: number, m: number, d: number) => checkDay(y, m, d, raw) === null;\n      const useIso = order === \"ymd\" || (!fits(ly, lm, ld) && fits(...isoReading));\n      [year, month, day] = useIso ? isoReading : [ly, lm, ld];\n    }\n  } else if (numeric) {\n    const [a, b, c] = [numeric[1]!, numeric[2]!, numeric[3]!];\n    if (a.length === 4) {\n      year = Number(a);\n      month = Number(b);\n      day = Number(c);\n    } else {\n      if (c.length !== 4 && c.length !== 2) {\n        return { ok: false, why: `“${raw}” has no four-digit year. ${HOW}` };\n      }\n      const order = localeDateOrder(opts.locale);\n      year = c.length === 2 ? twoDigitYear(Number(c)) : Number(c);\n      if (order === \"dmy\") {\n        day = Number(a);\n        month = Number(b);\n      } else {\n        month = Number(a);\n        day = Number(b);\n      }\n    }\n  } else {\n    // A MONTH WRITTEN AS A WORD, in any order with a day and a four-digit year.\n    const tokens = dateText.toLowerCase().replace(/,/g, \" \").split(/[\\s/.\\-]+/).filter(Boolean);\n    const numbers: string[] = [];\n    for (const token of tokens) {\n      const word = token.replace(/\\.$/, \"\");\n      if (/^\\d+(st|nd|rd|th)?$/.test(word)) numbers.push(word.replace(/\\D/g, \"\"));\n      else if (word in MONTHS) {\n        if (month !== null) return { ok: false, why: `“${raw}” names two months. ${HOW}` };\n        month = MONTHS[word]!;\n      } else if (word !== \"of\" && word !== \"the\") {\n        return { ok: false, why: `“${raw}” is not a date this can read. ${HOW}` };\n      }\n    }\n    if (month === null) return { ok: false, why: `“${raw}” is not a date this can read. ${HOW}` };\n    const years = numbers.filter((n) => n.length === 4);\n    const days = numbers.filter((n) => n.length <= 2);\n    if (years.length === 0) {\n      return {\n        ok: false,\n        why: numbers.some((n) => n.length === 3)\n          ? `“${raw}” has no four-digit year. ${HOW}`\n          : `“${raw}” has no year, and which year it means is a guess. Write the year too (${\n              days[0] ?? \"3\"\n            } ${Object.keys(MONTHS).find((k) => MONTHS[k] === month && k.length > 3) ?? \"October\"} 2026).`,\n      };\n    }\n    if (years.length > 1 || days.length !== 1 || numbers.length !== 2) {\n      return { ok: false, why: `“${raw}” is not a date this can read. ${HOW}` };\n    }\n    year = Number(years[0]);\n    day = Number(days[0]);\n  }\n\n  const bad = checkDay(year!, month!, day!, raw);\n  if (bad) return { ok: false, why: bad };\n  const dayText = `${pad(year!, 4)}-${pad(month!)}-${pad(day!)}`;\n  if (!opts.withTime) return { ok: true, day: dayText, instant: null };\n  const t = split.time ?? { h: 0, m: 0, s: 0 };\n  const local = instantFromWallInZone(year!, month!, day!, t.h, t.m, t.s);\n  return { ok: true, day: dayText, instant: local.toISOString() };\n}\n\n/**\n * THE TEXT AN EDITOR OPENS WITH for a stored day or instant — the inverse of `readTypedDate`, so\n * a cell opened by Enter or a double-click shows words this reader reads back to the SAME value\n * (grids review 3, 2026-09-30: those paths used to open the browser's own date picker, which lost\n * the time and saved \"now\"). The day is numeric in the locale's own order with a four-digit year;\n * a time of day follows as `2:30 PM` (a 12-hour locale) or `14:30` (a 24-hour one). An unreadable\n * stored value opens as the stored characters, untouched.\n */\nexport function typedDateText(value: unknown, opts: { withTime?: boolean; locale?: string } = {}): string {\n  if (value === null || value === undefined || value === \"\") return \"\";\n  const text = String(value).trim();\n  const bare = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text);\n  let y: number;\n  let mo: number;\n  let d: number;\n  let at: Date | null = null;\n  let wall: WallParts | null = null;\n  if (bare) {\n    y = Number(bare[1]);\n    mo = Number(bare[2]);\n    d = Number(bare[3]);\n  } else {\n    const parsed = value instanceof Date ? value : new Date(Date.parse(text));\n    if (Number.isNaN(parsed.getTime())) return text;\n    at = parsed;\n    wall = wallPartsInZone(parsed);\n    y = wall.year;\n    mo = wall.month;\n    d = wall.day;\n  }\n  const order = localeDateOrder(opts.locale);\n  const day =\n    order === \"ymd\" ? `${pad(y, 4)}-${pad(mo)}-${pad(d)}` : order === \"dmy\" ? `${pad(d)}/${pad(mo)}/${pad(y, 4)}` : `${pad(mo)}/${pad(d)}/${pad(y, 4)}`;\n  if (!opts.withTime || !at || !wall) return day;\n  return `${day} ${typedTimeText(wall.hour, wall.minute, opts.locale)}`;\n}\n\n/** A time of day in the words `readTypedTime` reads back: `2:30 PM` or `14:30`, by the locale's clock. */\nexport function typedTimeText(hours: number, minutes: number, locale?: string): string {\n  let twelve = true;\n  try {\n    twelve = new Intl.DateTimeFormat(locale, { hour: \"numeric\" }).resolvedOptions().hour12 !== false;\n  } catch {\n    // An unknown locale reads like the runtime's own.\n  }\n  if (!twelve) return `${pad(hours)}:${pad(minutes)}`;\n  const h = hours % 12 === 0 ? 12 : hours % 12;\n  return `${h}:${pad(minutes)} ${hours < 12 ? \"AM\" : \"PM\"}`;\n}\n","// src/typedNumber.ts — @ai-matrx/records\n//\n// A NUMBER A PERSON TYPED, READ THE WAY THEY WROTE IT — OR REFUSED.\n//\n// PEOPLE WRITE NUMBERS THE WAY PEOPLE WRITE NUMBERS. \"$1,250.50\", \"(300)\" for a negative, \"12%\",\n// \"2019\" — all of them are the number that was meant, and refusing them makes the column people use\n// most the one the product cannot take. A MINUS IS A MINUS WHEREVER THE SYMBOL SITS (merged-grid\n// review 2, A9): \"-$150\", \"$-150\" and \"(150)\" are all −150 — Sheets and Airtable read every one of\n// them. Everything before the first digit is symbols and signs; an odd number of minus signs there\n// is a negative.\n//\n// This is the ONE reading: `coerceTypedAnswer` (every record-store door) and the older `/data` grid's\n// typed cells both call it, so a number typed into any grid is read the same way.\n\nexport type TypedNumber = { ok: true; value: number } | { ok: false; why: string };\n\nexport function readTypedNumber(raw: string): TypedNumber {\n  const text = raw.trim();\n  if (text === \"\") return { ok: false, why: \"Nothing was typed.\" };\n  const bracketed = /^\\(.*\\)$/.test(text);\n  const inner = (bracketed ? text.slice(1, -1) : text).replace(/[\\s,]/g, \"\");\n  const head = /^[^\\d.]*/.exec(inner)?.[0] ?? \"\";\n  const bare = inner.slice(head.length).replace(/[^\\d.eE+-]+$/, \"\");\n  const minus = (head.match(/[-−]/g) ?? []).length % 2 === 1;\n  const n = Number(bare);\n  if (bare === \"\" || Number.isNaN(n) || /[\\d]/.test(head)) {\n    return {\n      ok: false,\n      why: `“${raw}” is not a number. Write digits, like 1,250.50 — a currency symbol, a percent sign, commas and a minus sign or brackets for a negative are all fine.`,\n    };\n  }\n  return { ok: true, value: bracketed !== minus ? -n : n };\n}\n","// src/coerce.ts — @ai-matrx/records\n//\n// WHAT A TYPED-IN ANSWER MEANS TO A FIELD, WORKED OUT IN ONE PLACE.\n//\n// Every door into this store that a person types into hands over STRINGS. A\n// browser input is a string. A clipboard cell is a string. A CSV column is a\n// string. A public form's answer is a string. A Field does not take strings —\n// it takes a number, a tick, a day, the id of an option — and until the string\n// has been turned into one of those, the store refuses it.\n//\n// 🚨 WHY THIS FILE EXISTS (AGENT-BUILDS-2's closing walk, 2026-09-21). A real\n// customer picked a time on Ironclad Mobile Mechanic's public booking page,\n// typed their name, phone, email and vehicle, pressed \"Book it\", and the page\n// answered:\n//\n//     \"Vehicle Year takes a number, and it was given a string\"\n//\n// The appointment was not made. `BookingPicker` kept its answers as\n// `Record<string, string>` and the confirm route passed them through\n// uncoerced, so a booking page over ANY table with a number field was\n// unbookable by anybody. The store was right and said so plainly; nothing\n// between the person and the store had done the one job that stood between\n// them.\n//\n// AND IT WAS ALREADY SOLVED, TWICE, IN THE WRONG PLACE. The grid's paste\n// (`@ai-matrx/records-ui` `valueFromPastedText`) and the import wizard each\n// carried their own coercion — good ones — while the two PUBLIC doors, the\n// ones a stranger uses, carried none. That is the shape the platform-primitive\n// rule exists to stop: a capability scoped to the feature that surfaced it.\n// So the coercion lives HERE, headless, in the package both the screens and\n// the servers already depend on, and every one of those five doors calls it.\n//\n// THREE RULES IT KEEPS:\n//\n//   1. A VALUE IS COERCED, NEVER GUESSED. Writing 0 for \"about twelve\" or\n//      today's date for \"soon\" is how a table quietly becomes untrue. A string\n//      that is not the thing is REFUSED, by name, in words the person can act\n//      on — \"Vehicle Year holds a number, and “twenty nineteen” is not one\".\n//   2. THE REFUSAL NAMES THE FIELD IN PLAIN WORDS, never its key, because the\n//      person reading it is looking at a label on a screen.\n//   3. IT DECIDES NOTHING ELSE. Required, the Rules, the cap, the rate window\n//      and every wall are the store's. This turns a string into a value and\n//      stops.\n\nimport { isButtonField } from \"./button\";\nimport { addressFromText, newerKindOf, ratingMaxOf, readTypedDuration } from \"./newerKinds\";\nimport { readTypedDate } from \"./typedDate\";\nimport { readTypedNumber } from \"./typedNumber\";\nimport type { Field } from \"./field\";\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\n\n/**\n * EVERYTHING THIS FILE NEEDS TO KNOW ABOUT A FIELD, AND NOTHING ELSE.\n *\n * A full `Field` satisfies it, and so does every narrower shape the store\n * hands to a screen — `CaptureField` on a phone with no network, the Field\n * documents `custom.form_public` and `custom.booking_public` publish to a\n * stranger. Asking for the whole `Field` would have meant the capture sheet\n * keeping its own `Number(raw)`, which is exactly the duplication this file\n * exists to end.\n */\nexport interface CoercibleField {\n  /** Named so the doc above is checkable: a full {@link Field} satisfies this. */\n  key: string;\n  label?: string | null;\n  name?: string | null;\n  /** FLD-1. One of five behaviors; an unknown word is treated as text. */\n  type?: string | null;\n  multi?: boolean | null;\n  unit?: string | null;\n  format?: string | null;\n  config?: Record<string, unknown> | null | undefined;\n  relation_target?: string | null;\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// WHICH KIND OF THING A FIELD HOLDS\n// ───────────────────────────────────────────────────────────────────────────\n\n/**\n * The kind of value one Field holds, resolved from its DECLARATION only — the\n * behavior, the modifiers, the format, the relation target and the config,\n * because those are what the store stores. A screen that guessed from a value\n * would answer differently for an empty record.\n *\n * `plain_text`, `long_text`, `number` and `boolean` are behaviors that carry\n * no parity type of their own; every other word here is a parity type.\n */\nexport const FIELD_KINDS = [\n  \"attachment\",\n  \"checkbox\",\n  \"currency\",\n  \"datetime\",\n  \"email\",\n  \"entity_reference\",\n  \"formula\",\n  \"json\",\n  \"long_text\",\n  \"lookup\",\n  \"member\",\n  \"multi_select\",\n  \"number\",\n  \"percent\",\n  \"phone\",\n  \"relation\",\n  \"rollup\",\n  \"select\",\n  \"text\",\n  \"url\",\n] as const;\n\n/**\n * 🚨 THE UNION IS DERIVED FROM THE LIST ABOVE, and the list is what the\n * coverage test walks. Add a kind here and the test drives it; give it no arm\n * in `coerceTypedAnswer` and the test says so, instead of the new kind falling\n * quietly through `default:` and a value of the wrong shape reaching the store\n * — which is the whole defect this file closes.\n */\nexport type FieldKind = (typeof FIELD_KINDS)[number];\n\n/** The kernel Table ids REC-31 pins the two special relations to. */\nexport interface KernelTargets {\n  /** The kernel `File` Table — a relation pointing here is an attachment. */\n  file?: string | undefined;\n  /** The kernel `Person` Table — a relation pointing here names a person. */\n  person?: string | undefined;\n}\n\n/**\n * Which kind of value this Field holds.\n *\n * This is the ONE classifier. `@ai-matrx/records-ui`'s `editorKindFor` — which\n * decides which editor to DRAW — delegates to it, so the editor a person types\n * into and the coercion applied to what they typed can never disagree about\n * the same column. They did disagree before this moved here; that is the whole\n * class of grid defect September was spent closing.\n */\nexport function fieldKindFor(field: CoercibleField, kernel?: KernelTargets): FieldKind {\n  const format = (field.format ?? \"\").toLowerCase();\n  const config = field.config ?? {};\n  switch (field.type) {\n    case \"boolean\":\n      return \"checkbox\";\n    case \"text\":\n      if (format === \"email\") return \"email\";\n      if (format === \"phone\") return \"phone\";\n      if (format === \"url\") return \"url\";\n      if (format === \"json\" || config[\"json\"] === true) return \"json\";\n      if (format === \"long\" || config[\"multiline\"] === true) return \"long_text\";\n      return \"text\";\n    case \"range\": {\n      const kind = String(config[\"kind\"] ?? \"number\");\n      if (kind === \"date\" || kind === \"datetime\") return \"datetime\";\n      // THE FORMAT, AND ONLY THE FORMAT. A unit is not a currency: a quantity\n      // in `units` drawn as money is how three of something rendered \"units3\".\n      if (format === \"currency\") return \"currency\";\n      if (format === \"percent\" || field.unit === \"%\") return \"percent\";\n      return \"number\";\n    }\n    case \"list\":\n      return field.multi ? \"multi_select\" : \"select\";\n    case \"relation\": {\n      // SC-R / P12: a relation whose target mode is `any`, restricted by\n      // `config.allowed_types` to the platform kinds it may name (notes, web\n      // sites, agents …). Its value is `{token, id}`, never a record id.\n      if (isEntityReferenceConfig(config)) return \"entity_reference\";\n      const parity = String(config[\"parity\"] ?? \"\");\n      if (parity === \"attachment\" || parity === \"member\") return parity;\n      if (kernel?.file && field.relation_target === kernel.file) return \"attachment\";\n      if (kernel?.person && field.relation_target === kernel.person) return \"member\";\n      return \"relation\";\n    }\n    case \"formula\": {\n      const via = config[\"via\"];\n      if (via && config[\"agg\"]) return \"rollup\";\n      if (via) return \"lookup\";\n      return \"formula\";\n    }\n    default:\n      return \"text\";\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// THE COERCION\n// ───────────────────────────────────────────────────────────────────────────\n\n/** One Field's options, indexed the way a typed word has to be looked up. */\nexport interface ChoiceOptions {\n  /**\n   * Lower-cased label, option key and option id, each pointing at the OPTION\n   * RECORD'S ID — which is what a list Field stores (FLD-5/FLD-6).\n   */\n  byWord: Map<string, string>;\n  /** The labels, in order, so a refusal can say what is on offer. */\n  labels: string[];\n}\n\n/** What one answer became, or the sentence saying why it did not. */\nexport type Coerced =\n  | { value: unknown; words?: string }\n  | { refusal: string; unmatched?: string[]; unmatchedNames?: string[]; ambiguousNames?: string[] };\n\n// ───────────────────────────────────────────────────────────────────────────\n// A RELATION FILLED BY NAME (VISION-REACH G1, 2026-10-02)\n// ───────────────────────────────────────────────────────────────────────────\n//\n// A spreadsheet names the record a row points at — \"Dr. Marisol Gutierrez\" —\n// and Airtable fills a linked-record cell from exactly that: the primary\n// field's text. Until this lane every door here refused it (\"chosen rather than\n// typed\"), and the sitting's clinic file needed 264 hand picks. The store now\n// matches a name through ONE matcher (`custom._relation_names_resolve`); a\n// screen asks it in one call per column (`relationNamesMatch`) and hands the\n// answer to the coercion below as a `RelationNameIndex`, exactly as a choice\n// column hands its `ChoiceOptions`. One match is that record; none, or two\n// records of one name, is REFUSED and named — never guessed.\n\n/** One record a name matched. */\nexport interface RelationNameMatch {\n  id: string;\n  /** What its name column holds. */\n  words: string;\n}\n\n/** A relation's target Table, indexed by the names a column holds. */\nexport interface RelationNameIndex {\n  /** `relationNameKey(name)` → the records of that name the reader may see. */\n  byName: ReadonlyMap<string, readonly RelationNameMatch[]>;\n  /** The target Table's name, for the sentence. */\n  tableName: string;\n  /** The target Table's name column, so a screen can make a record a name matched nothing. */\n  titleField: string | null;\n}\n\n/** The answer of `custom.relation_names_match`. */\nexport interface RelationNamesAnswer {\n  table_id: string;\n  table_name: string | null;\n  title_field?: string | null;\n  names: Array<{ name: string; matches: RelationNameMatch[] }>;\n}\n\n/**\n * How two spellings of one name are told apart: case and runs of spacing do not\n * count. The store's `custom.relation_name_key` is the same rule.\n */\nexport function relationNameKey(name: string): string {\n  return name.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\n/** How an import splits a cell that holds several values: `;`, `,` or `|` — the store's own rule. */\nexport function splitListCell(text: string): string[] {\n  return text\n    .split(/\\s*[;,|]\\s*/)\n    .map((w) => w.trim())\n    .filter((w) => w.length > 0);\n}\n\n/** Index the store's answer the way the coercion reads it. */\nexport function relationNameIndexOf(answer: RelationNamesAnswer): RelationNameIndex {\n  const byName = new Map<string, RelationNameMatch[]>();\n  for (const entry of answer.names ?? []) {\n    const key = relationNameKey(entry.name ?? \"\");\n    if (key !== \"\" && !byName.has(key)) byName.set(key, entry.matches ?? []);\n  }\n  return { byName, tableName: answer.table_name ?? \"that table\", titleField: answer.title_field ?? null };\n}\n\n/** Every name a relation cell carries, split the way the column reads it. */\nexport function relationNamesIn(field: Pick<CoercibleField, \"multi\">, text: string): string[] {\n  const t = text.trim();\n  if (t === \"\") return [];\n  const parts = field.multi ? splitListCell(t) : [t];\n  return parts.filter((p) => !isUuidShape(p));\n}\n\nexport interface CoerceOptions {\n  /** This Field's choices, when the caller has loaded them. */\n  options?: ChoiceOptions | undefined;\n  /** The kernel File/Person Table ids, for classifying relations. */\n  kernel?: KernelTargets | undefined;\n  /**\n   * The Field's name as this caller writes it. Defaults to the Field's own\n   * label. A screen passes the same words it printed above the box.\n   */\n  label?: string | undefined;\n  /**\n   * A relation column's target, indexed by name (`relationNameIndexOf`). Without it a name in a\n   * relation column is refused as before, and only ids pass.\n   */\n  relationNames?: RelationNameIndex | undefined;\n  /** The reader's locale, for the order of a numeric date (10/03/2026). Defaults to the runtime's. */\n  locale?: string | undefined;\n  /**\n   * The column SHOWS AS a percent (its \"Shows as\" format, which this package does not read), so a\n   * typed `45%` is a percent here even on a number column. The caller scales it to the column's\n   * own percent scale.\n   */\n  showsAsPercent?: boolean | undefined;\n}\n\n/** The money symbols people type, and the currency each one names. `¥` names two, so it names none. */\nconst MONEY_SYMBOLS: Record<string, string> = { $: \"USD\", \"€\": \"EUR\", \"£\": \"GBP\", \"₹\": \"INR\", \"₩\": \"KRW\", \"₪\": \"ILS\", \"₺\": \"TRY\", \"₽\": \"RUB\" };\n\n/** The currency a money column keeps (`unit` holds a symbol or an ISO code), or null when it names none. */\nfunction columnCurrency(unit: string | null | undefined): string | null {\n  const u = (unit ?? \"\").trim();\n  if (u === \"\") return null;\n  if (MONEY_SYMBOLS[u]) return MONEY_SYMBOLS[u]!;\n  return /^[A-Za-z]{3}$/.test(u) ? u.toUpperCase() : null;\n}\n\n/**\n * A UNIT THAT DOES NOT BELONG TO THE COLUMN IS REFUSED, NEVER DROPPED (grids review 3,\n * 2026-09-30): `45%` typed into a Number column was kept as 45 and into a Money column as $45.00 —\n * the percent sign silently thrown away, a value off by a hundred times. Sheets reads `45%` as the\n * percent it is; a column that does not keep percents says so, with the way to write its own kind.\n */\nfunction foreignUnit(kind: \"number\" | \"currency\" | \"percent\", text: string, label: string, raw: string, unit: string | null | undefined, showsAsPercent: boolean): string | null {\n  const hasPercent = /%/.test(text);\n  const symbols = [...text].filter((ch) => ch in MONEY_SYMBOLS);\n  if (kind === \"percent\" || showsAsPercent) {\n    if (symbols.length > 0) return `${label} holds a percent, and “${raw}” is an amount of money. Write it like 45%.`;\n    return null;\n  }\n  if (hasPercent) {\n    return kind === \"currency\"\n      ? `${label} holds an amount of money, and “${raw}” is a percent. Write the amount, like $1,250.50.`\n      : `${label} holds a number, and “${raw}” is a percent, which this column does not show. Write 45 or 0.45 — or make the column show as a percent.`;\n  }\n  if (kind === \"currency\") {\n    const own = columnCurrency(unit);\n    const typed = symbols.map((ch) => MONEY_SYMBOLS[ch]!);\n    if (own && typed.some((code) => code !== own)) {\n      return `${label} holds an amount in ${own}, and “${raw}” is written in ${typed.find((code) => code !== own)}. Write the amount in ${own}.`;\n    }\n  }\n  return null;\n}\n\n/** One id, written the way the store writes one (REC-51's shape test). */\n\n/**\n * SC-R / P12. Whether a relation's config makes it an ENTITY REFERENCE: target\n * mode `any` (REL-8) restricted by a non-empty `allowed_types`.\n */\nexport function isEntityReferenceConfig(config: Record<string, unknown> | null | undefined): boolean {\n  const allowed = config?.[\"allowed_types\"];\n  return Array.isArray(allowed) && allowed.length > 0;\n}\n\n/** The platform kinds an entity-reference Field may name, lower-cased, in its own order. */\nexport function entityReferenceKindsOf(field: Pick<CoercibleField, \"config\">): string[] {\n  const allowed = field.config?.[\"allowed_types\"];\n  return Array.isArray(allowed) ? allowed.map((k) => String(k).trim().toLowerCase()).filter(Boolean) : [];\n}\n\nconst TRUE_WORDS = new Set([\"true\", \"yes\", \"y\", \"1\", \"✓\", \"x\", \"checked\", \"on\"]);\nconst FALSE_WORDS = new Set([\"false\", \"no\", \"n\", \"0\", \"\", \"unchecked\", \"off\"]);\n\n/** The Field's name in plain words — never its key on a screen. */\nexport function coercionLabel(field: CoercibleField): string {\n  const label = (field.label ?? \"\").trim();\n  if (label !== \"\") return label;\n  const name = (field.name ?? \"\").trim();\n  if (name !== \"\") return name;\n  return field.key\n    .replace(/[_-]+/g, \" \")\n    .replace(/\\b\\w/g, (c) => c.toUpperCase())\n    .trim();\n}\n\n/**\n * Turn ONE typed-in string into the value this Field holds — or say, in a\n * sentence a person can act on, why it is not one.\n *\n * An empty answer is `null` for every kind: a blank means \"no answer here\",\n * and clearing a value is a thing a person means to do. Whether the Field may\n * be blank is the store's question, asked with the Field's `required` and its\n * Rules, not this one's.\n */\n/**\n * The choices a public question was handed (`public_choices`: `{key, label}` in order), as the\n * options a typed answer is matched against — by its key or by its label, either case — and each\n * answering with its KEY, which is what the public picker sends. Null when the question carries none.\n */\nfunction optionsFromPublicChoices(field: CoercibleField): ChoiceOptions | null {\n  const offered = (field as { public_choices?: unknown }).public_choices;\n  if (!Array.isArray(offered) || offered.length === 0) return null;\n  const byWord = new Map<string, string>();\n  const labels: string[] = [];\n  for (const c of offered) {\n    const key = typeof (c as { key?: unknown })?.key === \"string\" ? (c as { key: string }).key : null;\n    if (!key) continue;\n    const words = (c as { label?: unknown }).label;\n    const choiceLabel = typeof words === \"string\" && words.trim() !== \"\" ? words.trim() : key;\n    byWord.set(key.toLowerCase(), key);\n    byWord.set(choiceLabel.toLowerCase(), key);\n    labels.push(choiceLabel);\n  }\n  return labels.length > 0 ? { byWord, labels } : null;\n}\n\nexport function coerceTypedAnswer(\n  field: CoercibleField,\n  raw: string,\n  opts: CoerceOptions = {},\n): Coerced {\n  const label = opts.label ?? coercionLabel(field);\n  const text = raw.trim();\n  const kind = fieldKindFor(field, opts.kernel);\n\n  if (text === \"\" && kind !== \"checkbox\") return { value: null };\n\n  // LANE 10 P4: the newer kinds a format makes more exact (`newerKinds.ts`) read their own way;\n  // everything else about them (a status's choices, a count's refusal) is their base kind's.\n  // NOTION-PROPS-3: a button holds no value — it is pressed, never typed or pasted into.\n  if (isButtonField(field)) return { refusal: `${label} is a button: it is pressed, and holds nothing to type.` };\n  const newer = newerKindOf(field);\n  if (newer === \"rating\") {\n    const max = ratingMaxOf(field);\n    const n = Number(text);\n    if (Number.isInteger(n) && n >= 0 && n <= max) return { value: n };\n    return { refusal: `${label} is a whole number of stars from 0 to ${max}, and “${raw}” is not one.` };\n  }\n  if (newer === \"duration\") {\n    const seconds = readTypedDuration(text);\n    if (seconds === null || seconds < 0) {\n      return { refusal: `${label} is a length of time, and “${raw}” is not one. Write it like 45 min, 1:30 or 1h 30m.` };\n    }\n    // The store's own ceiling (custom._kind_value_ok): ten years of 365.25 days.\n    if (seconds > 315_576_000) return { refusal: `${label} is longer than ten years, and a length of time here is at most ten years.` };\n    return { value: seconds };\n  }\n  if (newer === \"address\") return { value: addressFromText(text) };\n  if (newer === \"barcode\") return { value: text };\n\n  switch (kind) {\n    case \"checkbox\": {\n      const word = text.toLowerCase();\n      if (TRUE_WORDS.has(word)) return { value: true };\n      if (FALSE_WORDS.has(word)) return { value: word === \"\" ? null : false };\n      return {\n        refusal: `${label} is a tick box, so it takes yes or no — “${raw}” is neither. Write TRUE/FALSE, yes/no or 1/0.`,\n      };\n    }\n    case \"number\":\n    case \"currency\":\n    case \"percent\": {\n      // The ONE number reading (`typedNumber.ts`): \"$1,250.50\", \"(300)\", \"-$150\", \"12%\".\n      const read = readTypedNumber(text);\n      if (!read.ok) {\n        return {\n          refusal: `${label} holds a number, and “${raw}” is not one. Write digits, like 1,250.50 — a currency symbol, a percent sign, commas and a minus sign or brackets for a negative are all fine.`,\n        };\n      }\n      const foreign = foreignUnit(kind, text, label, raw, field.unit, opts.showsAsPercent === true);\n      if (foreign) return { refusal: foreign };\n      return { value: read.value };\n    }\n    case \"datetime\": {\n      // A DAY IS NOT AN INSTANT, AND TREATING IT AS ONE MOVES IT. `2026-09-01`\n      // parsed as an instant is midnight UTC, and a screen west of Greenwich\n      // then draws it as 31 August — measured on fifty pasted invoice dates,\n      // all one day early, systematically. A date Field holds a DAY.\n      const wantsTime = String(field.config?.[\"kind\"] ?? \"date\") === \"datetime\";\n      // 🚨 READ, NEVER GUESSED (merged-grid review 2026-09-26): `Date.parse` read \"10/3\" as\n      // 2001 and a half-typed year as a real one. `readTypedDate` reads the person's locale\n      // order and refuses a two-digit or missing year, a month 13, a 31 September.\n      const read = readTypedDate(text, { withTime: wantsTime, ...(opts.locale ? { locale: opts.locale } : {}) });\n      if (!read.ok) return { refusal: `${label} holds a date, and ${read.why}` };\n      return { value: wantsTime ? read.instant : read.day };\n    }\n    case \"json\": {\n      try {\n        return { value: JSON.parse(text) };\n      } catch {\n        return {\n          refusal: `${label} holds a document, and “${raw}” is not valid JSON. Write the whole object, braces and all.`,\n        };\n      }\n    }\n    case \"select\":\n    case \"multi_select\": {\n      // A LIST IS AN IDENTITY, AND A WORD IS HOW A PERSON NAMES ONE. The store\n      // keeps the option's id; the person types its label. Matching the two is\n      // the whole job, and it is case-insensitive because \"COMPLETED\" and\n      // \"Completed\" are one option.\n      // A PUBLIC QUESTION CARRIES ITS OWN CHOICES (lane HANDOVER, 2026-09-29). A stranger's page\n      // never reads the column's options, and the form and booking doors hand each choice question\n      // its choices as `public_choices` instead. Cedar Ridge's booking page sent the Visit type's\n      // key (\"follow_up\") and this answered \"its options have not been read yet\", so every booking\n      // that answered a choice was refused, on the page and again at the confirm route.\n      const options = opts.options ?? optionsFromPublicChoices(field);\n      if (!options) {\n        return {\n          refusal: `${label} is a list and its options have not been read yet, so nothing can be matched to “${raw}”. Try again once the column's choices have loaded.`,\n        };\n      }\n      const wanted = kind === \"multi_select\"\n        ? text.split(/[,;]/).map((w) => w.trim()).filter((w) => w.length > 0)\n        : [text];\n      if (wanted.length === 0) return { value: kind === \"multi_select\" ? [] : null };\n      const matched: string[] = [];\n      const unmatched: string[] = [];\n      for (const word of wanted) {\n        const hit = options.byWord.get(word.toLowerCase());\n        if (hit === undefined) unmatched.push(word);\n        else matched.push(hit);\n      }\n      if (unmatched.length > 0) {\n        const offered = options.labels.length > 0\n          ? options.labels.join(\", \")\n          : \"it has none yet\";\n        return {\n          refusal:\n            `${label} does not have ${unmatched.map((w) => `“${w}”`).join(\" or \")} among its options. ` +\n            `It offers: ${offered}.`,\n          unmatched,\n        };\n      }\n      return { value: kind === \"multi_select\" ? matched : matched[0] };\n    }\n    // AN IDENTITY IS NOT A WORD. Writing the word would put a string where an\n    // id belongs, and every filter, color and rollup built on that column\n    // would stop agreeing with it. So it is refused and the person is told\n    // which control does hold it.\n    //\n    // BUT AN ID IS AN IDENTITY (RELATION-TARGETS, 2026-09-23). A Person or File\n    // column holds the kernel Person / File record, and the store itself now\n    // turns the id a writer actually holds — a member's user id, an uploaded\n    // file's id, or the record's own id — into that record at every write door\n    // (`custom.relation_kernel_record`), refusing anything else in its own\n    // words (\"… names someone who is not a member of …\"). So an import column\n    // of member ids, or an agent handing over the file it just uploaded, is a\n    // value and not a refusal; the store, not this mirror, decides whether the\n    // id is somebody here.\n    case \"member\":\n      if (isUuidShape(text)) return { value: text.toLowerCase() };\n      return {\n        refusal: `${label} names a person in this organization, so it is chosen rather than typed. Open it and pick them.`,\n      };\n    case \"attachment\":\n      if (isUuidShape(text)) return { value: text.toLowerCase() };\n      return {\n        refusal: `${label} holds a file, which cannot arrive as typed-in text. Open it and attach the file.`,\n      };\n    case \"relation\": {\n      // VISION-REACH G1: a record's id, or its NAME read through the index the caller asked the\n      // store for. A several-records column splits the cell the way an import splits any list.\n      const parts = field.multi ? splitListCell(text) : [text];\n      const ids: string[] = [];\n      const words: string[] = [];\n      const none: string[] = [];\n      const many: string[] = [];\n      for (const part of parts) {\n        if (isUuidShape(part)) {\n          if (!ids.includes(part.toLowerCase())) ids.push(part.toLowerCase());\n          continue;\n        }\n        if (!opts.relationNames) {\n          return {\n            refusal: `${label} points at another record, so it is chosen rather than typed. Open it and pick the record.`,\n          };\n        }\n        const hits = opts.relationNames.byName.get(relationNameKey(part)) ?? [];\n        if (hits.length === 0) none.push(part);\n        else if (hits.length > 1) many.push(part);\n        else if (!ids.includes(hits[0]!.id)) {\n          ids.push(hits[0]!.id);\n          words.push(hits[0]!.words);\n        }\n      }\n      if (none.length > 0 || many.length > 0) {\n        const table = opts.relationNames?.tableName ?? \"that table\";\n        const said = many.length > 0\n          ? `${many.map((w) => `“${w}”`).join(\", \")} names more than one record in ${table}.`\n          : `${table} has no record called ${none.map((w) => `“${w}”`).join(\" or \")}.`;\n        return { refusal: `${label}: ${said}`, unmatchedNames: none, ambiguousNames: many };\n      }\n      if (ids.length === 0) return { value: field.multi ? [] : null };\n      return { value: field.multi ? ids : ids[0], ...(words.length > 0 ? { words: words.join(\", \") } : {}) };\n    }\n    // SC-R / P12. An entity reference names a platform thing by kind and id.\n    // An import or an agent may hand over `note:<id>` — or a bare id when the\n    // column allows exactly one kind; the store then decides whether the thing\n    // is there and whether the writer may open it. Words are chosen, not typed.\n    case \"entity_reference\": {\n      const allowed = entityReferenceKindsOf(field);\n      const [maybeToken, maybeId] = text.includes(\":\") ? text.split(/:(.*)/s, 2) : [\"\", text];\n      const token = (maybeToken ?? \"\").trim().toLowerCase() || (allowed.length === 1 ? allowed[0] : \"\");\n      const id = (maybeId ?? \"\").trim();\n      if (token && isUuidShape(id)) {\n        const ref = { token, id: id.toLowerCase() };\n        return { value: field.multi ? [ref] : ref };\n      }\n      return {\n        refusal: `${label} points at something on the platform, so it is chosen rather than typed. Open it and pick it.`,\n      };\n    }\n    case \"formula\":\n    case \"lookup\":\n    case \"rollup\":\n      return {\n        refusal: `${label} is worked out by the system, so nothing can be written into it.`,\n      };\n    // A LINK AND AN EMAIL ARE READ, THE WAY AIRTABLE READS THEM (merged-grid review 2, A9).\n    // \"company.com\" is a link a person meant: it is kept as https://company.com. Words that\n    // cannot be one are refused NAMING THE KIND, WITH ONE EXAMPLE — never \"not written the way\n    // this field expects\". Any further format Rule on the column is still the store's to judge.\n    case \"url\": {\n      if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(text) || /^mailto:/i.test(text)) return { value: text };\n      if (!/\\s/.test(text) && /^[^./@\\s]+(\\.[^./\\s]+)+(\\/.*)?$/.test(text)) return { value: `https://${text}` };\n      return { refusal: `${label} holds a link, and “${raw}” is not one. A link looks like company.com or https://company.com/page.` };\n    }\n    case \"email\": {\n      if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(text)) return { value: text };\n      return { refusal: `${label} holds an email address, and “${raw}” is not one. An email looks like name@company.com.` };\n    }\n    default:\n      // text, long_text, phone — the string IS the value, and the format Rules on it are the\n      // store's to judge.\n      return { value: raw };\n  }\n}\n\n/** What a whole set of typed-in answers became. */\nexport interface CoercedAnswers {\n  /** Ready to send to the store. Only the keys that coerced cleanly. */\n  values: Record<string, unknown>;\n  /** Field key → the sentence saying why that answer was not written. */\n  refusals: Record<string, string>;\n  /** The field keys the caller sent that this table has no Field for. */\n  unknownKeys: string[];\n}\n\n/**\n * Every typed-in answer on one screen, coerced together — the shape the two\n * public doors and the import wizard actually need.\n *\n * Keys the table has no Field for are reported rather than dropped: the store\n * refuses an unknown key by name and a caller that quietly deleted it would\n * hide a real mismatch between a page and its table.\n */\nexport function coerceTypedAnswers(\n  fields: readonly CoercibleField[],\n  answers: Readonly<Record<string, unknown>>,\n  opts: {\n    kernel?: KernelTargets | undefined;\n    /** Choices per Field key, for the list columns. */\n    options?: ReadonlyMap<string, ChoiceOptions> | undefined;\n    /** Field key → the words that screen printed above the box. */\n    labels?: Readonly<Record<string, string>> | undefined;\n    /** Relation columns' targets, indexed by name, by field key (VISION-REACH G1). */\n    relationNames?: ReadonlyMap<string, RelationNameIndex> | undefined;\n  } = {},\n): CoercedAnswers {\n  const byKey = new Map(fields.map((f) => [f.key, f]));\n  const values: Record<string, unknown> = {};\n  const refusals: Record<string, string> = {};\n  const unknownKeys: string[] = [];\n\n  for (const [key, given] of Object.entries(answers)) {\n    const field = byKey.get(key);\n    if (!field) {\n      unknownKeys.push(key);\n      // Passed through untouched: it is the STORE's job to say it does not\n      // know this key, in its own words, naming it.\n      values[key] = given;\n      continue;\n    }\n    // ALREADY THE RIGHT SHAPE IS LEFT ALONE. A screen with real editors hands\n    // over a number, a boolean or an array already; only a STRING needs this.\n    if (typeof given !== \"string\") {\n      values[key] = given;\n      continue;\n    }\n    const opt: CoerceOptions = {};\n    const choices = opts.options?.get(key);\n    if (choices) opt.options = choices;\n    const named = opts.relationNames?.get(key);\n    if (named) opt.relationNames = named;\n    if (opts.kernel) opt.kernel = opts.kernel;\n    const label = opts.labels?.[key];\n    if (label) opt.label = label;\n\n    const answered = coerceTypedAnswer(field, given, opt);\n    if (\"refusal\" in answered) refusals[key] = answered.refusal;\n    else values[key] = answered.value;\n  }\n\n  return { values, refusals, unknownKeys };\n}\n","// src/data/columns.ts — @ai-matrx/records/data\n//\n// LIVE COLUMN LOOKUP (Applets phase A, item 2). A table is addressed by id; its columns are read\n// from the store at run time (`custom.applicable_fields` + each choice column's options) and rows are\n// keyed by the field's stable KEY. The file `pnpm tables:types` writes becomes optional typing only:\n// nothing here needs it, and a column added a minute ago is a column now.\n//\n// The Field behind each Column is kept beside it (`TableShape.fields`) because a filter reaches a\n// field BY ID (REC-17) and a sort needs to know whether a value is a number or a date.\n\nimport type { RecordsClient } from \"../core/client\";\nimport { optionLabel } from \"../choice\";\nimport type { Field } from \"../field\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsResult } from \"../results\";\nimport type { Column } from \"./types\";\nimport { entityReferenceKindsOf, isEntityReferenceConfig } from \"../coerce\";\n\nexport interface TableShape {\n  columns: Column[];\n  /** Column key → the store's Field, for filters (by id) and sorts (by type). */\n  fields: ReadonlyMap<string, Field>;\n}\n\n/** Field types whose values the store computes; a write to them is refused, so the column says so. */\nconst COMPUTED_TYPES = new Set([\"formula\", \"autonumber\", \"created_time\", \"modified_time\", \"rollup\", \"lookup\"]);\n\nfunction configOf(field: Field): Record<string, unknown> {\n  return field.config && typeof field.config === \"object\" ? field.config : {};\n}\n\n/** The word a Column carries: a range says which kind of range it is (number, date, datetime, currency…). */\nexport function columnTypeOf(field: Field): string {\n  const kind = configOf(field)[\"kind\"];\n  if (field.type === \"range\") return typeof kind === \"string\" && kind ? kind : field.format === \"currency\" ? \"currency\" : \"number\";\n  if (field.type === \"text\" && field.format) return field.format;\n  return field.type;\n}\n\nexport function isDateColumn(type: string): boolean {\n  return type === \"date\" || type === \"datetime\";\n}\n\n/** The store's date range kind is a calendar day; a datetime is an instant. */\nexport function isCalendarDay(type: string): boolean {\n  return type === \"date\";\n}\n\nexport function isNumberColumn(type: string): boolean {\n  return type === \"number\" || type === \"currency\" || type === \"percent\" || type === \"integer\" || type === \"duration\";\n}\n\nfunction optionsTableOf(field: Field): Uuid | null {\n  const id = configOf(field)[\"options_table_id\"];\n  return typeof id === \"string\" && id ? id : null;\n}\n\n/** One table's live columns. Choice words come from each choice column's own options, in one round trip each, in parallel. */\nexport async function readTableShape(client: RecordsClient, tableId: Uuid): Promise<RecordsResult<TableShape>> {\n  // The table's own title column rides beside its fields; a table this reader cannot open still has\n  // columns (it just names no title column), never a refusal of the whole shape.\n  const [fields, table] = await Promise.all([client.fields({ table_id: tableId }), client.tableRead({ table_id: tableId, organization_id: client.config.organizationId })]);\n  if (!fields.ok) return fields;\n  const titleField = table.ok ? (table.data?.title_field ?? null) : null;\n  const choiceFields = fields.data.filter((f) => optionsTableOf(f) !== null);\n  const options = await Promise.all(choiceFields.map((f) => client.fieldOptions({ field_id: f.id })));\n  const choicesById = new Map<Uuid, string[]>();\n  for (let i = 0; i < choiceFields.length; i += 1) {\n    const answer = options[i]!;\n    // A choice column whose options this reader cannot list still IS a choice column: the words\n    // are left out (the store still validates on write), never a refusal of the whole table.\n    if (answer.ok) {\n      choicesById.set(\n        choiceFields[i]!.id,\n        answer.data.filter((o) => !o.deleted_at && o.metadata?.[\"retired\"] !== true).map(optionLabel),\n      );\n    }\n  }\n  const columns: Column[] = [];\n  const byKey = new Map<string, Field>();\n  for (const field of fields.data) {\n    if (!field.key || field.key.startsWith(\"_\")) continue;\n    const type = columnTypeOf(field);\n    const column: Column = {\n      key: field.key,\n      label: field.label || field.name || field.key,\n      type,\n      origin: \"custom\",\n      required: Boolean(field.required),\n      multi: field.multi === true,\n      readOnly: COMPUTED_TYPES.has(field.type) || field.source === \"formula\" || field.compute_on !== null && field.compute_on !== undefined,\n    };\n    if (titleField !== null && (titleField === field.key || titleField === field.id)) column.title = true;\n    const choices = choicesById.get(field.id);\n    if (choices) column.choices = choices;\n    if (field.type === \"relation\" && field.relation_target) column.linksTo = [field.relation_target];\n    else if (field.type === \"relation\" && isEntityReferenceConfig(configOf(field))) column.linksTo = entityReferenceKindsOf({ config: configOf(field) });\n    columns.push(column);\n    byKey.set(field.key, field);\n  }\n  return { ok: true, data: { columns, fields: byKey } };\n}\n","// src/data/filter.ts — @ai-matrx/records/data\n//\n// THE §4 FILTER GRAMMAR ON THE STORE'S DOORS. `Query.where` (eq · neq · lt · lte · gt · gte ·\n// contains · in · empty) is compiled to the store's ONE nested filter shape — a Rule expression,\n// fields BY ID — which `custom.record_filter_sql` turns into the same WHERE clause the grid, the\n// aggregate and the board use. Nothing is filtered in the browser: the browser only ever holds the\n// rows it was already shown, so a browser filter would silently drop the rest of the answer.\n//\n// A clause naming a column the table does not have is refused by the column's name, never sent.\n// Comparisons on a date column ride the store's `within` window (the numeric comparators refuse\n// words); `contains` is a case-blind literal match.\n\nimport type { RuleExpression } from \"../rule\";\nimport type { RecordPageSort } from \"../record\";\nimport type { RecordsError, RecordsResult } from \"../results\";\nimport { isCalendarDay, isDateColumn, isNumberColumn, type TableShape } from \"./columns\";\nimport type { Query, WhereClause } from \"./types\";\n\nfunction refusal(message: string, hint?: string): RecordsError {\n  return { code: \"invalid_argument\", message, ...(hint ? { hint } : {}) };\n}\n\nfunction noSuchColumn(column: string): RecordsError {\n  return refusal(`This table has no column \"${column}\".`, \"Ask columns() for the keys this table has now. Nothing was read.\");\n}\n\n/** A literal, matched anywhere, ignoring case: the regex `matches` takes, with every special character escaped. */\nexport function containsPattern(value: string): string {\n  return `(?i)${value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`;\n}\n\nfunction nextDay(day: string): string {\n  const d = new Date(`${day.slice(0, 10)}T00:00:00Z`);\n  d.setUTCDate(d.getUTCDate() + 1);\n  return d.toISOString().slice(0, 10);\n}\n\nfunction nextInstant(at: string): string {\n  const d = new Date(at);\n  return Number.isNaN(d.getTime()) ? at : new Date(d.getTime() + 1).toISOString();\n}\n\nfunction within(field: RuleExpression, window: { from?: string; to?: string }): RuleExpression {\n  return { op: \"within\", args: [field, { const: window }] };\n}\n\nfunction clauseToRule(clause: WhereClause, shape: TableShape): RecordsResult<RuleExpression> {\n  const f = shape.fields.get(clause.column);\n  const column = shape.columns.find((c) => c.key === clause.column);\n  if (!f || !column) return { ok: false, error: noSuchColumn(clause.column) };\n  const field: RuleExpression = { field: f.id };\n  const v = clause.value;\n  const eq = (value: unknown): RuleExpression => ({ op: \"eq\", args: [field, { const: value }] });\n  switch (clause.op) {\n    case \"eq\":\n      return { ok: true, data: v === null || v === undefined ? emptyRule(field) : eq(v) };\n    case \"neq\":\n      return { ok: true, data: v === null || v === undefined ? { op: \"not\", args: [emptyRule(field)] } : { op: \"ne\", args: [field, { const: v }] } };\n    case \"lt\":\n    case \"lte\":\n    case \"gt\":\n    case \"gte\": {\n      if (isDateColumn(column.type)) {\n        if (typeof v !== \"string\" || !v) return { ok: false, error: refusal(`\"${clause.column}\" is a date, so ${clause.op} needs a date like 2026-10-06.`) };\n        const after = isCalendarDay(column.type) ? nextDay(v) : nextInstant(v);\n        const window =\n          clause.op === \"lt\" ? { to: v } : clause.op === \"lte\" ? { to: after } : clause.op === \"gte\" ? { from: v } : { from: after };\n        return { ok: true, data: within(field, window) };\n      }\n      const n = typeof v === \"number\" ? v : typeof v === \"string\" && v.trim() !== \"\" ? Number(v) : Number.NaN;\n      if (!Number.isFinite(n)) return { ok: false, error: refusal(`${clause.op} on \"${clause.column}\" needs a number.`) };\n      if (!isNumberColumn(column.type) && column.type !== \"formula\") {\n        return { ok: false, error: refusal(`\"${clause.column}\" holds ${column.type}, so it cannot be compared with ${clause.op}.`) };\n      }\n      return { ok: true, data: { op: clause.op, args: [field, { const: n }] } };\n    }\n    case \"contains\":\n      if (v === null || v === undefined || String(v) === \"\") return { ok: false, error: refusal(`contains on \"${clause.column}\" needs the words to look for.`) };\n      return { ok: true, data: { op: \"matches\", args: [field, { const: containsPattern(String(v)) }] } };\n    case \"in\": {\n      if (!Array.isArray(v)) return { ok: false, error: refusal(`in on \"${clause.column}\" needs a list of values.`) };\n      if (v.length === 0) return { ok: true, data: { op: \"or\", args: [] } };\n      return { ok: true, data: { op: \"or\", args: v.map((one) => (one === null ? emptyRule(field) : eq(one))) } };\n    }\n    case \"empty\":\n      return { ok: true, data: v === false ? { op: \"not\", args: [emptyRule(field)] } : emptyRule(field) };\n    default:\n      return { ok: false, error: refusal(`\"${String((clause as WhereClause).op)}\" is not a filter this store knows.`, \"Use eq, neq, lt, lte, gt, gte, contains, in or empty.\") };\n  }\n}\n\n/** Empty = never answered, or answered with nothing. */\nfunction emptyRule(field: RuleExpression): RuleExpression {\n  return { op: \"or\", args: [{ op: \"not\", args: [{ op: \"present\", args: [field] }] }, { op: \"eq\", args: [field, { const: \"\" }] }] };\n}\n\n/** `Query.where` → the store's filter, or `undefined` for none. Every clause must hold. */\nexport function compileWhere(where: Query[\"where\"], shape: TableShape): RecordsResult<RuleExpression | undefined> {\n  if (!where || where.length === 0) return { ok: true, data: undefined };\n  const parts: RuleExpression[] = [];\n  for (const clause of where) {\n    const one = clauseToRule(clause, shape);\n    if (!one.ok) return one;\n    parts.push(one.data);\n  }\n  return { ok: true, data: parts.length === 1 ? parts[0] : { op: \"and\", args: parts } };\n}\n\n/** `Query.sort` → the store's sort keys, typed so numbers sort as numbers and dates as dates. */\nexport function compileSort(sort: Query[\"sort\"], shape: TableShape): RecordsResult<RecordPageSort[]> {\n  const out: RecordPageSort[] = [];\n  for (const s of sort ?? []) {\n    const column = shape.columns.find((c) => c.key === s.column);\n    if (!column) return { ok: false, error: noSuchColumn(s.column) };\n    // A link cell holds ids, so the store would order by id — a sort that looks like it did nothing (Brand,\n    // social planner 2026-10-08). Said by name instead; the page sorts its own rows by each link's label.\n    if (column.type === \"relation\") {\n      return { ok: false, error: refusal(`\"${column.label}\" is a link, so the store cannot sort by it.`, \"Sort the rows on the page by each link's label. Nothing was read.\") };\n    }\n    const as: RecordPageSort[\"as\"] = isNumberColumn(column.type) ? \"number\" : isDateColumn(column.type) ? \"date\" : \"text\";\n    out.push({ field: column.key, direction: s.direction === \"desc\" ? \"desc\" : \"asc\", as });\n  }\n  return { ok: true, data: out };\n}\n","// src/data/types.ts — @ai-matrx/records/data\n//\n// THE DATA RUNTIME'S SHAPES — Applets CONTRACTS.md v2 §0 (the types AP-3 owns) and §4 (DataPort).\n//\n// An Applet runs in a frame. Everything it reads or writes crosses ONE port, as JSON: no function,\n// React node, client, token or store ever crosses it (§1). These are the shapes that cross it, and\n// this module is import-inert (no React, no DOM) so the host, the frame and a server can all hold it.\n//\n// One owner each: Column, Row, Values, EntityRef (the live `EntityRefWithWords`) and the DataPort\n// interface are this package's. `Result` / `AppletError` belong to @ai-matrx/applets, which aliases\n// `RecordsResult` / extends `RecordsError` — so a port answer here is a `RecordsResult`.\n\nimport type { EntityRefWithWords } from \"../relation\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsResult } from \"../results\";\n\nexport type { Uuid };\n\n/** §0. A link to any thing: `{token, id, label}`. A custom row's token is `record`. Every link reads as `EntityRef[]`. */\nexport type EntityRef = EntityRefWithWords;\n\n/** The token a custom table's row carries (platform.entity_types maps `record` → `custom.record`). */\nexport const CUSTOM_ROW_TOKEN = \"record\";\n\n/** §0. One column, read live — never from a generated file. */\nexport interface Column {\n  /** The store's stable field key — never derived from the label. No platform key starts with \"_\". */\n  key: string;\n  label: string;\n  /** The store's word for what the value is: text, number, date, datetime, boolean, list, relation, formula, … */\n  type: string;\n  origin: \"platform\" | \"custom\";\n  required: boolean;\n  /** For a choice column: the words a person picks from (what a cell reads as and a write takes). */\n  choices?: string[];\n  /** For a link column: what it may point at (a custom table's id, or entity tokens). */\n  linksTo?: string[];\n  /**\n   * For a link column: the alias, in the SAME port, that serves the table it points at — so a form can list\n   * the linked rows to pick from. Absent when no source of this Applet serves that table.\n   */\n  linksToSource?: string;\n  /**\n   * The store's own answer to \"does this column hold more than one value\" (`custom.field.multi`). A choice\n   * column's type is `list` whether it takes one word or many — only this tells them apart (Status, one\n   * value, drew as four switches and the store refused the list it sent: social planner, 2026-10-08).\n   */\n  multi?: boolean;\n  /** The column a row is named by (the table's `title_field`) — what a link to the row reads as. */\n  title?: boolean;\n  readOnly: boolean;\n}\n\n/** §0. One row, keyed by `Column.key`. Underscore keys are the runtime's own. */\nexport interface Row {\n  _id: Uuid;\n  _version: number;\n  _organization_id: Uuid;\n  /** On a platform row only: the organization's custom fields (a real column may be named `custom`). */\n  _custom?: Record<string, unknown>;\n  /** On a row read with `archived: true`: when it was archived (ISO). */\n  _archived_at?: string;\n  /** On a row read with `archived: true`: who archived it, or null when the store cannot say. */\n  _archived_by_name?: string | null;\n  [key: string]: unknown;\n}\n\n/** §0. What a write carries, keyed by `Column.key`; `_custom` on platform sources. */\nexport type Values = Record<string, unknown> & { _custom?: Record<string, unknown> };\n\nexport type WhereOp = \"eq\" | \"neq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"contains\" | \"in\" | \"empty\";\n\nexport interface WhereClause {\n  column: string;\n  op: WhereOp;\n  value?: unknown;\n}\n\nexport type Lane = \"all\" | \"mine\" | \"team\" | \"orgs\" | \"shared\" | \"public\" | \"system\";\n\n/** §4. A question of one source. Every clause must hold. */\nexport interface Query {\n  where?: WhereClause[];\n  search?: string;\n  sort?: { column: string; direction?: \"asc\" | \"desc\" }[];\n  pageSize?: number;\n  /** Default: the type's \"Shown to by default\" knob. A custom table has one lane: what row security shows. */\n  lane?: Lane;\n  /** A filter, never a lock. Default \"all\". */\n  org?: Uuid | \"all\";\n  /**\n   * THE ARCHIVE (the archived-items law): `true` answers the rows that were archived instead of the live\n   * ones, newest-archived first, each carrying `_archived_at` and `_archived_by_name`, so a screen can offer\n   * Restore. The archive door takes no `where` / `search` / `sort`: they are not applied to it.\n   */\n  archived?: boolean;\n}\n\n/** §4. One page; `cursor` is null on the last one. */\nexport interface Page {\n  rows: Row[];\n  total: number | null;\n  cursor: string | null;\n}\n\nexport interface DataSource {\n  alias: string;\n  label: string;\n  kind: \"table\" | \"entity\";\n  canCreate: boolean;\n  canUpdate: boolean;\n}\n\n/** The one event stream a source has: these ids moved — re-read only them. `null`: cannot tell which. */\nexport interface RowsEvent {\n  ids: Uuid[] | null;\n  /** The table's columns moved (one added, retired or changed): re-read `columns()` too. */\n  shape?: true;\n}\n\nexport type DataPortEventName = `rows:${string}`;\n\n/** §4. The host's data port, scoped to ONE mounted Applet's aliases. Every call answers, never throws. */\nexport interface DataPort {\n  sources(): Promise<RecordsResult<DataSource[]>>;\n  columns(alias: string): Promise<RecordsResult<Column[]>>;\n  list(alias: string, q: Query, cursor?: string): Promise<RecordsResult<Page>>;\n  get(alias: string, id: Uuid): Promise<RecordsResult<Row | null>>;\n  create(alias: string, values: Values): Promise<RecordsResult<Row>>;\n  update(alias: string, id: Uuid, patch: Values, baseVersion: number): Promise<RecordsResult<Row>>;\n  archive(alias: string, id: Uuid): Promise<RecordsResult<void>>;\n  restore(alias: string, id: Uuid): Promise<RecordsResult<void>>;\n}\n\n/**\n * The frame's side of the §1 event stream `rows:<alias>` (the AppletHost's `host.events`). The listener\n * stays in the frame; only the event payload `{ids, shape?}` crosses the channel.\n */\nexport interface DataEvents {\n  on(event: DataPortEventName, listener: (event: RowsEvent) => void): () => void;\n}\n\n/**\n * The HOST's DataPort (contracts amendment 2.2): the port plus the producer of its event streams.\n * `subscribe` never crosses the frame/host channel — the AppletHost turns it into `rows:<alias>`.\n */\nexport interface HostDataPort extends DataPort {\n  subscribe(event: DataPortEventName, listener: (event: RowsEvent) => void): () => void;\n}\n\n/** An alias as the Applet record declares it: one table plus its organization (an entity token is phase B). */\nexport interface TableAlias {\n  kind: \"table\";\n  tableId: Uuid;\n  organizationId: Uuid;\n  /** Shown in `sources()`; the table's own name when left out. */\n  label?: string;\n}\n\n/**\n * An alias bound to one PLATFORM entity type (contacts, projects, tasks…), served by `@ai-matrx/entity-data`'s port.\n * `organizationId` is an assumed organization FILTER for its lists, never a lock; writes carry the active organization.\n */\nexport interface EntityAlias {\n  kind: \"entity\";\n  /** The type's token in `platform.entity_types` (`party`, `project`, `task`, …). */\n  token: string;\n  organizationId?: Uuid;\n  label?: string;\n}\n\n/** Every alias an Applet record can declare. A host routes each kind to the port that serves it. */\nexport type AnyAlias = TableAlias | EntityAlias;\n\n/** What the table port takes (it serves `table` aliases only). */\nexport type AliasBinding = TableAlias;\n","// src/typed-table/define.ts — @ai-matrx/records/typed-table\n//\n// AN TYPED TABLE: a table the PLATFORM keeps for one of its own features, declared once in code.\n// Lane PLATFORM-APP-DATA wave 3 (design rev 2). It is an ordinary store Table: each organization\n// gets its own copy from this ONE definition on first use (`ensureTypedTable`), so the store's own\n// guards — the undeclared-key guard, `validate_values`, unique rules — hold for every row.\n//\n// THE GATE (Arman, 2026-10-02; common-docs systems/data/custom-data/DECISIONS.md, last\n// section). The platform may keep its own data in the record store for trials, features few\n// people use, unproven adoption, short-term stopgaps and small data — never for something most or\n// all people use (tags), a long-term feature, or a lot of data. Arman's refinement the same day:\n// the gate is about SIZE, not time (\"If two years goes by and it's there and not used, that's\n// fantastic. Leave it.\") — so a definition carries no reason and no review date; the release\n// check compares `checkTypedTable`'s `rowCount` with the size knob instead. Platform features whose\n// rows belong to organizations (bookings, intake lists) are typed tables under this gate.\n//\n// PURE. `defineTypedTable` reads nothing, writes nothing and asks no clock: the same input always\n// gives the same frozen definition and the same `specHash`, so a release check can import a\n// definition without running the app.\n\nimport { sha256Hex } from \"@ai-matrx/kit/sha256\";\nimport type { NewFieldSpec } from \"../core/declareTable\";\nimport type { Uuid } from \"../record\";\nimport { graduationProblems, type TypedTableGraduation } from \"./graduate\";\n\n// ── scope ────────────────────────────────────────────────────────────────────\n\n/**\n * Whose rows a person sees by default.\n * - `organization`: every member of the row's organization.\n * - `person`: the author's rows. HIDDEN FROM LISTS, NOT LOCKED — the store has no Private level\n *   for its Tables yet, so an organization admin (and any reader of the record by id) can still\n *   open the row. Never put anything that must be private in a `person` table.\n * - `global`: one copy in the platform organization, written only by server code.\n */\nexport type TypedTableScope = \"person\" | \"organization\" | \"global\";\n\n// ── fields ───────────────────────────────────────────────────────────────────\n\n/**\n * One declared column. `T` is the value a row holds; `Req` whether it must be given; `RO` whether\n * the store computes it (absent from inserts); `Uniq` whether no two records may share it.\n */\nexport interface AppField<T = unknown, Req extends boolean = boolean, RO extends boolean = boolean, Uniq extends boolean = boolean> {\n  /** The store's word for the column (`text`, `select`, `datetime` …), sent unmapped. */\n  readonly word: string;\n  readonly label: string | undefined;\n  readonly required: Req;\n  readonly readOnly: RO;\n  readonly unique: Uniq;\n  /** Everything else the column door takes (options, unit, kind, allowed types, declaration). */\n  readonly extra: Readonly<Omit<NewFieldSpec, \"key\" | \"label\" | \"type\" | \"sort\" | \"required\" | \"unique\" | \"relationTarget\">>;\n  /** A relation's other table — ensured first, its id sent as `relationTarget`. */\n  readonly target: AnyTypedTableDef | undefined;\n  /** Type only; never set. */\n  readonly __value?: T;\n}\n\nexport interface FieldOptions {\n  label?: string;\n  required?: boolean;\n  unique?: boolean;\n  /** Anything else `custom.field_declare` accepts, applied last (format, sensitivity …). */\n  declaration?: NewFieldSpec[\"declaration\"];\n}\n\ntype Req<O> = O extends { required: true } ? true : false;\ntype Uniq<O> = O extends { unique: true } ? true : false;\ntype Extra = AppField[\"extra\"];\n\nfunction field<T, O extends FieldOptions, RO extends boolean = false>(\n  word: string,\n  opts: O | undefined,\n  extra: Extra = {},\n  readOnly = false as RO,\n  target?: AnyTypedTableDef,\n): AppField<T, Req<O>, RO, Uniq<O>> {\n  return Object.freeze({\n    word,\n    label: opts?.label,\n    required: (opts?.required === true) as Req<O>,\n    readOnly,\n    unique: (opts?.unique === true) as Uniq<O>,\n    extra: Object.freeze({ ...extra, ...(opts?.declaration ? { declaration: opts.declaration } : {}) }),\n    target,\n  });\n}\n\n/** A computed column takes only a label. */\ntype ComputedOptions = Pick<FieldOptions, \"label\" | \"declaration\">;\n\n/**\n * The field builders. Each emits exactly what `ensureTable`'s `NewFieldSpec` takes; the key is the\n * property name in `fields`, kept exactly (a `__` included).\n */\nexport const f = {\n  text: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"text\", opts),\n  longText: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"long_text\", opts),\n  email: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"email\", opts),\n  phone: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"phone\", opts),\n  url: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"url\", opts),\n  number: <const O extends FieldOptions = {}>(opts?: O) => field<number, O>(\"number\", opts),\n  integer: <const O extends FieldOptions = {}>(opts?: O) => field<number, O>(\"integer\", opts),\n  decimal: <const O extends FieldOptions = {}>(opts?: O) => field<number, O>(\"decimal\", opts),\n  currency: <const O extends FieldOptions = {}>(unit: string, opts?: O) => field<number, O>(\"currency\", opts, { unit }),\n  percent: <const O extends FieldOptions = {}>(opts?: O) => field<number, O>(\"percent\", opts),\n  checkbox: <const O extends FieldOptions = {}>(opts?: O) => field<boolean, O>(\"checkbox\", opts),\n  /** A day, as `YYYY-MM-DD`. */\n  date: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"datetime\", opts, { kind: \"date\" }),\n  /** A moment, as an ISO instant. */\n  datetime: <const O extends FieldOptions = {}>(opts?: O) => field<string, O>(\"datetime\", opts, { kind: \"datetime\" }),\n  /** One of the choices. The row holds the choice word itself. */\n  select: <const C extends readonly string[], const O extends FieldOptions = {}>(choices: C, opts?: O) =>\n    field<C[number], O>(\"select\", opts, { options: [...choices] }),\n  /** Any of the choices. */\n  multiSelect: <const C extends readonly string[], const O extends FieldOptions = {}>(choices: C, opts?: O) =>\n    field<C[number][], O>(\"multi_select\", opts, { options: [...choices], multi: true }),\n  /** A record of another typed table, in the same organization. */\n  relation: <D extends AnyTypedTableDef, const O extends FieldOptions & { multi?: boolean } = {}>(target: D, opts?: O) =>\n    field<O extends { multi: true } ? Uuid[] : Uuid, O>(\"relation\", opts, opts?.multi ? { multi: true } : {}, false, target),\n  /** A person of the organization. */\n  member: <const O extends FieldOptions = {}>(opts?: O) => field<Uuid, O>(\"member\", opts),\n  /** A file. */\n  attachment: <const O extends FieldOptions = {}>(opts?: O) => field<Uuid, O>(\"attachment\", opts),\n  /** A platform thing (`note`, `agent` …) of one of `kinds`: `{ token, id }`, the store's own shape. */\n  entityReference: <const O extends FieldOptions = {}>(kinds: readonly string[], opts?: O) =>\n    field<{ token: string; id: Uuid }, O>(\"entity_reference\", opts, { allowedTypes: [...kinds] }),\n  /** Computed by the store from `formulaText` (`{Visit fee} - {Deposit taken}`); read-only. */\n  formula: <T extends string | number | boolean = string | number, const O extends ComputedOptions = {}>(formulaText: string, opts?: O) =>\n    field<T, O, true>(\"formula\", opts, { declaration: { formula_text: formulaText, ...(opts?.declaration ?? {}) } }, true),\n  autonumber: <const O extends ComputedOptions = {}>(opts?: O) => field<number, O, true>(\"autonumber\", opts, {}, true),\n  createdTime: <const O extends ComputedOptions = {}>(opts?: O) => field<string, O, true>(\"created_time\", opts, {}, true),\n  modifiedTime: <const O extends ComputedOptions = {}>(opts?: O) => field<string, O, true>(\"modified_time\", opts, {}, true),\n};\n\n// ── the definition ───────────────────────────────────────────────────────────\n\nexport type AppFields = Record<string, AppField>;\n\n/** The keys of `F` whose field is unique — the only keys an upsert may find a record by. */\nexport type UniqueKeys<F extends AppFields> = { [K in keyof F]: F[K] extends AppField<any, any, any, true> ? K : never }[keyof F] & string;\n\nexport interface TypedTableInput<F extends AppFields, K extends UniqueKeys<F>> {\n  /** What a person sees the table called. */\n  name: string;\n  /** The token the table is found by, in every organization. */\n  slug: string;\n  scope: TypedTableScope;\n  /** The feature that keeps it, one lower-case word (`decisions`, `kits`). */\n  kept_for: string;\n  /** Who answers for it (`lane:PLATFORM-APP-DATA`, a team, a role). Optional. */\n  owner?: string;\n  /** A unique field that says which record a write is (`upsert` finds by it). */\n  key?: K;\n  /**\n   * The file(s) that declare this table (`matrx-frontend:features/kits/kit-installs.typed-table.ts`).\n   * Stored on the table as `app_table.declared_in`, and named in the store's refusal when someone\n   * tries to archive, rename or move a table the code depends on. Optional.\n   */\n  declared_in?: string | readonly string[];\n  fields: F;\n  /**\n   * GRADUATED (contract: common-docs …/CONTRACT-PLATFORM-APP-DATA-GRADUATION.md). The feature's\n   * rows now live in the standard entity table `token` (`<schema>.<table>`); `map` says where every\n   * declared field went — a column, `\"custom_fields\"`, or (a relation) `\"association\"`. Nothing is\n   * dropped. `pnpm tables:graduate` moves the rows; `check:typed-tables` then expects every\n   * organization's copy archived. Not part of the spec hash.\n   */\n  graduatedTo?: TypedTableGraduation;\n  /**\n   * CONFIDENTIAL (the access ladder's level: \"the owner and the people the record's own rules name\").\n   * Each organization's copy is made Confidential by a SERVER step on the store owner's connection\n   * (`custom.set_table_confidential_arman_explicitly_approved` is no client's door), carrying the\n   * recorded approval below. Until the copy reports Confidential with exactly these readers, every\n   * write through this package refuses and says why (`confidentialGate`). Not part of the spec hash.\n   */\n  confidential?: TypedTableConfidential;\n}\n\n/** One reader rule: the person (or team) a field names may read the row at `level`, when `when` holds. */\nexport interface TypedTableReader {\n  /** A declared field naming a person: a `member` field (or a text field holding a user id). */\n  field: string;\n  level: \"viewer\" | \"editor\";\n  /** The store's flat filter on THIS row (`{ shared: true }`); the reader applies only while it is true. */\n  when?: Readonly<Record<string, unknown>>;\n}\n\nexport interface TypedTableConfidential {\n  readers: readonly TypedTableReader[];\n  /**\n   * true: the person whose first use made the organization's copy owns nothing more than a reader\n   * does (the store's `maker_is_reader`). Always true for a table whose rows must stay blind to the\n   * person who happened to make the copy.\n   */\n  makerIsReader: boolean;\n  /** Arman's own words approving this table family as Confidential, verbatim, and the day he gave them. */\n  approval: { words: string; approvedOn: string; covers: string };\n}\n\nexport interface TypedTableDef<F extends AppFields = AppFields, K extends string = string> {\n  readonly name: string;\n  readonly slug: string;\n  readonly scope: TypedTableScope;\n  readonly kept_for: string;\n  readonly owner: string | null;\n  readonly key: K | null;\n  /** Where the code declares it (`TypedTableInput.declared_in`), as a list; empty when not given. */\n  readonly declared_in: readonly string[];\n  readonly fields: Readonly<F>;\n  /** Each field as `ensureTable` takes it, in declaration order (a relation's target id is added at ensure time). */\n  readonly specs: readonly Readonly<NewFieldSpec>[];\n  /** The canonical field spec the hash is taken over (sorted, display order excluded). */\n  readonly canonicalSpec: string;\n  /** SHA-256 (hex) of `canonicalSpec`. Moves when — and only when — a column's stored shape would. */\n  readonly specHash: string;\n  /** Where the rows went when the feature graduated (`TypedTableInput.graduatedTo`); `null` while it has not. */\n  readonly graduatedTo: TypedTableGraduation | null;\n  /** The Confidential declaration (`TypedTableInput.confidential`); `null` for an ordinary typed table. */\n  readonly confidential: TypedTableConfidential | null;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyTypedTableDef = TypedTableDef<any, any>;\n\ntype FieldsOf<D> = D extends TypedTableDef<infer F, any> ? F : never;\ntype ValueOf<X> = X extends AppField<infer T, any, any, any> ? T : never;\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\n/** A row as the store answers it: required fields are `T`, every other is `T | null`. */\nexport type RowOf<D extends AnyTypedTableDef> = Simplify<\n  { readonly _id: Uuid; readonly _organizationId: Uuid } & {\n    [K in keyof FieldsOf<D>]: FieldsOf<D>[K] extends AppField<infer T, infer R, any, any> ? (R extends true ? T : T | null) : never;\n  }\n>;\n\ntype RequiredKeys<F> = { [K in keyof F]: F[K] extends AppField<any, true, false, any> ? K : never }[keyof F];\ntype WritableKeys<F> = { [K in keyof F]: F[K] extends AppField<any, any, true, any> ? never : K }[keyof F];\n\n/**\n * What a write takes: required fields must be given, every other writable field may be (or be\n * `null`), a computed field cannot be. `_id` names the record to update on a table with no `key`.\n */\nexport type InsertOf<D extends AnyTypedTableDef> = Simplify<\n  { [K in RequiredKeys<FieldsOf<D>>]: ValueOf<FieldsOf<D>[K]> } & {\n    [K in Exclude<WritableKeys<FieldsOf<D>>, RequiredKeys<FieldsOf<D>>>]?: ValueOf<FieldsOf<D>[K]> | null;\n  } & { _id?: Uuid }\n>;\n\nconst SLUG = /^[a-z][a-z0-9_]*$/;\nconst WORD = /^[a-z][a-z0-9_]*$/;\n\nfunction refuse(slug: unknown, sentence: string): never {\n  throw new Error(`defineTypedTable(${JSON.stringify(slug)}): ${sentence}`);\n}\n\nfunction labelFor(key: string): string {\n  const words = key.replace(/_+/g, \" \").trim();\n  return words ? words[0]!.toUpperCase() + words.slice(1) : key;\n}\n\n/** Sorted-key JSON: the one spelling of a value the hash is taken over. */\nfunction canonical(value: unknown): string {\n  if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n  if (value && typeof value === \"object\") {\n    const entries = Object.entries(value as Record<string, unknown>)\n      .filter(([, v]) => v !== undefined)\n      .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n    return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`).join(\",\")}}`;\n  }\n  return JSON.stringify(value);\n}\n\nfunction deepFreeze<T>(value: T): T {\n  if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n    Object.freeze(value);\n    for (const v of Object.values(value as Record<string, unknown>)) deepFreeze(v);\n  }\n  return value;\n}\n\n/**\n * DECLARE AN TYPED TABLE. Pure: no request, no clock, no global. Refuses — by throwing, at the line\n * that declares it — a definition the store would refuse later: a slug or `kept_for` that is not a\n * token, a `key` that is not a unique field, no fields.\n */\nexport function defineTypedTable<F extends AppFields, K extends UniqueKeys<F> = never>(\n  input: TypedTableInput<F, K>,\n): TypedTableDef<F, K> {\n  const { slug } = input;\n  if (typeof input.name !== \"string\" || !input.name.trim()) refuse(slug, \"a table needs a name.\");\n  if (typeof slug !== \"string\" || !SLUG.test(slug)) refuse(slug, \"the slug must be a lower-case token (letters, digits, _).\");\n  if (typeof input.kept_for !== \"string\" || !WORD.test(input.kept_for)) {\n    refuse(slug, `kept_for must be one lower-case word naming the feature; it is ${JSON.stringify(input.kept_for)}.`);\n  }\n  if (![\"person\", \"organization\", \"global\"].includes(input.scope)) refuse(slug, `scope must be person, organization or global.`);\n  if (input.owner !== undefined && (typeof input.owner !== \"string\" || !input.owner.trim())) {\n    refuse(slug, \"owner, when given, names who answers for the table.\");\n  }\n\n  const declaredIn = input.declared_in === undefined ? [] : typeof input.declared_in === \"string\" ? [input.declared_in] : [...input.declared_in];\n  if (declaredIn.some((d) => typeof d !== \"string\" || !d.trim())) refuse(slug, \"declared_in, when given, names the file(s) that declare the table.\");\n\n  const entries = Object.entries(input.fields ?? {});\n  if (entries.length === 0) refuse(slug, \"an typed table declares at least one field.\");\n  for (const [key, def] of entries) {\n    if (!key.trim()) refuse(slug, \"a field key cannot be empty.\");\n    if (!def || typeof def.word !== \"string\") refuse(slug, `field ${JSON.stringify(key)} was not made with an f.* builder.`);\n  }\n  const key = input.key ?? null;\n  if (key !== null && !(input.fields[key]?.unique === true)) {\n    refuse(slug, `the key ${JSON.stringify(key)} must be a field declared unique: true — an upsert finds its record by it.`);\n  }\n\n  if (input.graduatedTo !== undefined) {\n    const problems = graduationProblems(input.fields, input.graduatedTo);\n    if (problems.length > 0) refuse(slug, `graduatedTo: ${problems.join(\" \")}`);\n  }\n\n  if (input.confidential !== undefined) {\n    const c = input.confidential;\n    if (!c || !Array.isArray(c.readers) || c.readers.length === 0) refuse(slug, \"a Confidential table names at least one reader.\");\n    for (const r of c.readers) {\n      if (!input.fields[r.field]) refuse(slug, `the reader field ${JSON.stringify(r.field)} is not a declared field.`);\n      if (r.level !== \"viewer\" && r.level !== \"editor\") refuse(slug, `the reader ${JSON.stringify(r.field)} reads at viewer or editor, never ${JSON.stringify(r.level)}.`);\n      for (const k of Object.keys(r.when ?? {})) {\n        if (!input.fields[k]) refuse(slug, `the reader ${JSON.stringify(r.field)} waits on ${JSON.stringify(k)}, which is not a declared field.`);\n      }\n    }\n    const words = c.approval?.words?.trim() ?? \"\";\n    if (words.length < 40 || words.split(/\\s+/).length < 8) refuse(slug, \"a Confidential table carries Arman's own approving words, verbatim (40+ characters, 8+ words).\");\n    if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(c.approval.approvedOn ?? \"\")) refuse(slug, \"the approval names the day it was given (YYYY-MM-DD).\");\n    if (!c.approval.covers?.trim()) refuse(slug, \"the approval says what it covers.\");\n  }\n\n  // THE STORE REFUSES TWO COLUMNS WITH ONE LABEL (\"You already have a column called …\"), but only at\n  // an organization's first use. Refuse it here, where it is written (lane HR-360).\n  const seenLabels = new Map<string, { key: string; label: string }>();\n  for (const [fieldKey, def] of entries) {\n    const label = (def.label ?? labelFor(fieldKey)).trim();\n    const norm = label.replace(/\\s+/g, \" \").toLowerCase();\n    const other = seenLabels.get(norm);\n    if (other !== undefined) refuse(slug, `two fields called ${JSON.stringify(other.label)} (${other.key} and ${fieldKey}); the store refuses a second column with a label it already has.`);\n    seenLabels.set(norm, { key: fieldKey, label });\n  }\n\n  const specs: NewFieldSpec[] = entries.map(([fieldKey, def], i) => ({\n    key: fieldKey,\n    label: def.label ?? labelFor(fieldKey),\n    type: def.word as NewFieldSpec[\"type\"],\n    sort: (i + 1) * 10,\n    ...(def.required ? { required: true } : {}),\n    ...(def.unique ? { unique: true } : {}),\n    ...(def.extra as Partial<NewFieldSpec>),\n  }));\n\n  const shape = entries\n    .map(([, def], i) => {\n      const spec = specs[i]!;\n      const { sort: _sort, multi, required, unique, ...rest } = spec;\n      return {\n        ...rest,\n        multi: multi === true,\n        required: required === true,\n        unique: unique === true,\n        ...(def.target ? { relation_target_slug: def.target.slug } : {}),\n      };\n    })\n    .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n  const canonicalSpec = canonical(shape);\n\n  return deepFreeze({\n    name: input.name,\n    slug,\n    scope: input.scope,\n    kept_for: input.kept_for,\n    owner: input.owner ?? null,\n    key: key as K | null,\n    declared_in: declaredIn,\n    fields: { ...input.fields },\n    specs,\n    canonicalSpec,\n    specHash: sha256Hex(canonicalSpec),\n    graduatedTo: input.graduatedTo ? { token: input.graduatedTo.token, map: { ...input.graduatedTo.map } } : null,\n    confidential: input.confidential\n      ? {\n          readers: input.confidential.readers.map((r) => ({ field: r.field, level: r.level, ...(r.when ? { when: { ...r.when } } : {}) })),\n          makerIsReader: input.confidential.makerIsReader,\n          approval: { ...input.confidential.approval },\n        }\n      : null,\n  }) as TypedTableDef<F, K>;\n}\n\n// ── SHA-256 (FIPS 180-4), synchronous and dependency-free so a definition stays pure ──────────\n\n","// src/typed-table/graduate.ts — @ai-matrx/records/typed-table\n//\n// GRADUATION: AN TYPED TABLE BECOMES A STANDARD ENTITY TABLE (v7 APPS-ON-DATA item 5; contract:\n// common-docs projects/data-doctrine-adoption/v6/CONTRACT-PLATFORM-APP-DATA-GRADUATION.md).\n//\n// Arman, 2026-10-02: \"if people love the feature and it's getting used, it becomes an entity and\n// even grows to a schema.\" A definition declares where it went — `graduatedTo: { token, map }` —\n// and `pnpm tables:graduate` (scripts/tables-graduate.ts) copies every organization's rows there.\n//\n// PURE. This file holds the two parts a test can hold in its hand without a database:\n//   - `validateGraduation`: every declared field maps to a column, to `custom_fields`, or (a\n//     relation) to `association`; nothing is dropped, no two fields share a column, no field\n//     lands on a base column.\n//   - `graduatedRow`: one store row → one entity-table row that keeps the record's id,\n//     organization, author, timestamps, version, archived state and who it was shown to; every\n//     undeclared document key goes to `custom_fields`; the store's own bookkeeping keys (`_values`\n//     …) and the row's origin go to `metadata` (system-only, Doctrine §4) — never dropped.\n\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\nimport type { Uuid } from \"../record\";\n\n/** Where a declared field's value goes in the graduated table. */\nexport const TO_CUSTOM_FIELDS = \"custom_fields\" as const;\n/** A relation's values become `platform.associations` rows (R5), never a column. */\nexport const TO_ASSOCIATION = \"association\" as const;\n\nexport interface TypedTableGraduation {\n  /** Where the feature's rows now live: `<schema>.<table>` (registered in `platform.entity_types`). */\n  readonly token: string;\n  /** Every declared field key → its column, `custom_fields`, or (relations only) `association`. */\n  readonly map: Readonly<Record<string, string>>;\n}\n\n/** The columns the mover writes itself; a field may never map onto one of them. */\nexport const GRADUATION_BASE_COLUMNS = [\n  \"id\",\n  \"organization_id\",\n  \"created_by\",\n  \"updated_by\",\n  \"created_at\",\n  \"updated_at\",\n  \"deleted_at\",\n  \"version\",\n  \"metadata\",\n  \"visibility\",\n  \"shown_to\",\n  \"category_id\",\n] as const;\n\nconst LOCATION = /^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$/;\nconst COLUMN = /^[a-z][a-z0-9_]*$/;\n\n/** The minimum a validation needs to know about a field: its store word. */\nexport interface GraduationField {\n  readonly word: string;\n}\n\n/**\n * Every sentence that says why this `graduatedTo` cannot be used — empty when it can. Pure.\n * `fields` is the definition's fields by key.\n */\nexport function graduationProblems(fields: Readonly<Record<string, GraduationField>>, graduation: TypedTableGraduation): string[] {\n  const problems: string[] = [];\n  if (!graduation || typeof graduation !== \"object\") return [\"graduatedTo must be { token, map }.\"];\n  if (typeof graduation.token !== \"string\" || !LOCATION.test(graduation.token)) {\n    problems.push(`graduatedTo.token must be \"<schema>.<table>\" in lower-case tokens; it is ${JSON.stringify(graduation.token)}.`);\n  }\n  const map = graduation.map;\n  if (!map || typeof map !== \"object\") return [...problems, \"graduatedTo.map must name where every declared field goes.\"];\n  const used = new Map<string, string>();\n  for (const [key, field] of Object.entries(fields)) {\n    const to = map[key];\n    if (to === undefined) {\n      problems.push(`field ${JSON.stringify(key)} is not in graduatedTo.map — map it to a column or to \"custom_fields\"; nothing is dropped.`);\n      continue;\n    }\n    if (typeof to !== \"string\" || !COLUMN.test(to)) {\n      problems.push(`field ${JSON.stringify(key)} maps to ${JSON.stringify(to)}, which is not a column name.`);\n      continue;\n    }\n    if (field.word === \"relation\") {\n      if (to !== TO_ASSOCIATION) problems.push(`field ${JSON.stringify(key)} is a relation; it maps to \"association\" (relations become platform.associations rows, never a column).`);\n      continue;\n    }\n    if (to === TO_ASSOCIATION) {\n      problems.push(`field ${JSON.stringify(key)} is not a relation, so it cannot map to \"association\".`);\n      continue;\n    }\n    if (to === TO_CUSTOM_FIELDS) continue;\n    if ((GRADUATION_BASE_COLUMNS as readonly string[]).includes(to)) {\n      problems.push(`field ${JSON.stringify(key)} maps to ${to}, a base column the mover fills from the record itself.`);\n      continue;\n    }\n    const other = used.get(to);\n    if (other !== undefined) problems.push(`fields ${JSON.stringify(other)} and ${JSON.stringify(key)} both map to column ${to}.`);\n    else used.set(to, key);\n  }\n  for (const key of Object.keys(map)) {\n    if (!Object.prototype.hasOwnProperty.call(fields, key)) problems.push(`graduatedTo.map names ${JSON.stringify(key)}, which is not a declared field.`);\n  }\n  return problems;\n}\n\n// ── the row transform ─────────────────────────────────────────────────────────────────────────\n\n/** One store row (`custom.record`, data_class 'record') as the mover reads it. */\nexport interface StoreRowSnapshot {\n  id: Uuid;\n  organization_id: Uuid;\n  /** The organization's copy of the typed table this row lives in. */\n  store_table_id: Uuid;\n  created_by: Uuid | null;\n  updated_by: Uuid | null;\n  created_at: string;\n  updated_at: string;\n  deleted_at: string | null;\n  version: number;\n  visibility: string | null;\n  shown_to: string | null;\n  custom_fields: Record<string, unknown> | null;\n  data: Record<string, unknown>;\n}\n\n/** One relation value to become an association edge. */\nexport interface GraduatedRelation {\n  field: string;\n  targetIds: Uuid[];\n}\n\nexport interface GraduatedRow {\n  /** Every column of the entity-table row, by column name (`custom_fields` and `metadata` included). */\n  row: Record<string, unknown>;\n  /** Relation values found in the document, to become associations. */\n  relations: GraduatedRelation[];\n}\n\n\nfunction idsOf(value: unknown): Uuid[] {\n  const list = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value];\n  return list.filter((v): v is Uuid => typeof v === \"string\" && isUuidShape(v));\n}\n\n/**\n * ONE STORE ROW → ONE ENTITY-TABLE ROW. Keeps id, organization, author, timestamps, version,\n * archived state (`deleted_at`), visibility and `shown_to` exactly. A declared field goes where\n * the map says; every undeclared key goes to `custom_fields` (merged over what the row already\n * held there); a store bookkeeping key (leading `_`) and the row's origin go to `metadata`.\n */\nexport function graduatedRow(\n  fields: Readonly<Record<string, GraduationField>>,\n  graduation: TypedTableGraduation,\n  snapshot: StoreRowSnapshot,\n): GraduatedRow {\n  const row: Record<string, unknown> = {\n    id: snapshot.id,\n    organization_id: snapshot.organization_id,\n    created_by: snapshot.created_by,\n    updated_by: snapshot.updated_by,\n    created_at: snapshot.created_at,\n    updated_at: snapshot.updated_at,\n    deleted_at: snapshot.deleted_at,\n    version: snapshot.version,\n    visibility: snapshot.visibility,\n    // The store leaves shown_to NULL for \"never narrowed\"; the entity column is NOT NULL, default 'everyone'.\n    shown_to: snapshot.shown_to ?? \"everyone\",\n  };\n  const custom: Record<string, unknown> = { ...(snapshot.custom_fields ?? {}) };\n  const store: Record<string, unknown> = {};\n  const relations: GraduatedRelation[] = [];\n  for (const [key, value] of Object.entries(snapshot.data ?? {})) {\n    const field = Object.prototype.hasOwnProperty.call(fields, key) ? fields[key] : undefined;\n    const to = field ? graduation.map[key] : undefined;\n    if (field && to === TO_ASSOCIATION) {\n      const targetIds = idsOf(value);\n      if (targetIds.length > 0) relations.push({ field: key, targetIds });\n      continue;\n    }\n    if (field && to && to !== TO_CUSTOM_FIELDS) {\n      row[to] = value ?? null;\n      continue;\n    }\n    if (!field && key.startsWith(\"_\")) {\n      store[key] = value;\n      continue;\n    }\n    custom[key] = value;\n  }\n  // A declared column the document never held is NULL, never absent.\n  for (const to of Object.values(graduation.map)) {\n    if (to !== TO_CUSTOM_FIELDS && to !== TO_ASSOCIATION && !(to in row)) row[to] = null;\n  }\n  row.custom_fields = custom;\n  row.metadata = {\n    legacy_table: \"custom.record\",\n    legacy_id: snapshot.id,\n    legacy_store_table_id: snapshot.store_table_id,\n    ...(Object.keys(store).length > 0 ? { store_document: store } : {}),\n  };\n  return { row, relations };\n}\n\n// ── key uniqueness ────────────────────────────────────────────────────────────────────────────\n\n/** What the mover must do so the target enforces the definition's `key` the way the store did. */\nexport interface KeyUniquenessPlan {\n  /** The key column, or the `custom_fields ->> 'key'` expression when the key field lives in custom_fields. */\n  readonly expression: string;\n  /** The unique index's name (≤ 63 characters, stable so \"if not exists\" finds it again). */\n  readonly indexName: string;\n  /** `create unique index if not exists …` on (organization_id, <key>) where deleted_at is null. */\n  readonly createIndexSql: string;\n  /** Rows (live, with a key) sharing an (organization_id, key) pair: returns `organization_id, key, n`. */\n  readonly duplicatesSql: string;\n  /** The plain sentence that refuses the move, given the duplicate groups found. */\n  readonly refusal: (duplicates: ReadonlyArray<{ organization_id: string; key: string; n: number }>) => string;\n}\n\n/**\n * The key rule for a graduated table, or null when the definition has no `key`. Pure: the mover runs\n * `duplicatesSql` (refuse on any row), then `createIndexSql` inside each organization's transaction.\n * A key mapped to `custom_fields` is indexed on `custom_fields ->> '<key>'`. Throws when the key\n * is not a declared field or maps to \"association\" (a relation cannot be a unique key).\n */\nexport function keyUniquenessPlan(key: string | null, graduation: TypedTableGraduation): KeyUniquenessPlan | null {\n  if (key === null || key === undefined) return null;\n  const to = graduation.map[key];\n  if (to === undefined) throw new Error(`the key ${JSON.stringify(key)} is not in graduatedTo.map.`);\n  if (to === TO_ASSOCIATION) throw new Error(`the key ${JSON.stringify(key)} is a relation; a relation cannot be the unique key.`);\n  const [, table] = graduation.token.split(\".\") as [string, string];\n  const expression = to === TO_CUSTOM_FIELDS ? `(custom_fields ->> '${key.replace(/'/g, \"''\")}')` : to;\n  const raw = `${table}_${to === TO_CUSTOM_FIELDS ? `cf_${key}` : to}_org_key_uq`;\n  const indexName = raw.length <= 63 ? raw : `${raw.slice(0, 54)}_${hash8(raw)}`;\n  const nonEmpty = to === TO_CUSTOM_FIELDS ? expression : to;\n  return {\n    expression,\n    indexName,\n    createIndexSql: `create unique index if not exists ${indexName} on ${graduation.token} (organization_id, ${expression}) where deleted_at is null`,\n    duplicatesSql:\n      `select organization_id, ${expression}, count(*) from ${graduation.token} ` +\n      `where deleted_at is null and ${nonEmpty} is not null group by organization_id, ${expression} having count(*) > 1`,\n    refusal: (duplicates) =>\n      `${graduation.token} already holds ${duplicates.length} key value(s) used by more than one live row ` +\n      `(${duplicates.slice(0, 3).map((d) => `${JSON.stringify(d.key)} ×${d.n} in organization ${d.organization_id}`).join(\"; \")}); ` +\n      `the key ${JSON.stringify(key)} must be unique per organization, so nothing was moved. Archive or rename the repeats first.`,\n  };\n}\n\nfunction hash8(s: string): string {\n  let h = 2166136261;\n  for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 16777619);\n  return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n","// src/typed-table/archive.ts — @ai-matrx/records/typed-table\n//\n// ARCHIVING A TABLE THE APP'S CODE DEPENDS ON, ON PURPOSE (lane 12 P5). An typed table carries\n// `code_depends: true`, and the store refuses archiving, renaming (slug or kept_for), moving or\n// unmarking it through every door — `tableArchive`, `recordDelete`, `recordUpdate`, `tableMove`,\n// the bulk archive page. The one way through is `custom.table_archive_deliberately`: a PERSON types\n// the table's slug and gives a reason; an agent is refused. This loops its passes until `done`.\n//\n// A screen offers it as a two-step dialog: what depends on the table (the refusal's\n// `declared_in`), then typing the slug. The store's refusal sentence is answered as it is.\n\nimport type { RecordsClient } from \"../core/client\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsResult } from \"../results\";\nimport type { TableArchiveProgress } from \"../table\";\n\nexport interface ArchiveDeliberatelyArgs {\n  /** The table to archive (the organization is the client's own). */\n  tableId: Uuid;\n  /** The table's slug, as the person TYPED it. Must match exactly. */\n  typedSlug: string;\n  /** Why; kept with the archive event. */\n  reason: string;\n  /** Each pass's answer, for a progress line. */\n  onPass?: (pass: TableArchiveProgress) => void;\n}\n\n/** Most passes one call takes before answering what it has (each pass is ~1 s of the store's time). */\nconst MAX_PASSES = 200;\n\nexport async function archiveTypedTableDeliberately(\n  client: RecordsClient,\n  args: ArchiveDeliberatelyArgs,\n): Promise<RecordsResult<TableArchiveProgress>> {\n  let last: RecordsResult<TableArchiveProgress> | null = null;\n  for (let pass = 0; pass < MAX_PASSES; pass += 1) {\n    last = await client.tableArchiveDeliberately({\n      table_id: args.tableId,\n      typed_slug: args.typedSlug,\n      reason: args.reason,\n    });\n    if (!last.ok) return last;\n    args.onPass?.(last.data);\n    if (last.data.done) return last;\n  }\n  return last!;\n}\n","// src/typed-table/check.ts — @ai-matrx/records/typed-table\n//\n// IS THIS ORGANIZATION'S COPY OF AN TYPED TABLE THERE, AND DOES IT MATCH ITS DEFINITION? Read-only:\n// it finds the table by slug AND kept_for (`custom.table_find` — a person's own table of the same\n// slug never answers), reads its columns, and compares them with the definition the way\n// `custom.table_ensure` does (type, format, label, multi, required, unique, and `extra` for a stored\n// column the definition no longer declares). \"Archived\" is the STORE's answer (table_find answers an\n// archived match when nothing is live) — never a client search of the archive.\n\nimport type { RecordsClient } from \"../core/client\";\nimport type { Uuid } from \"../record\";\nimport type { RecordsResult } from \"../results\";\nimport type { FieldDrift } from \"../table\";\nimport type { AnyTypedTableDef } from \"./define\";\nimport { clientIn, writeOrganization, type TypedTableOrgOptions } from \"./ensure\";\n\nexport type TypedTableStatus = \"ok\" | \"missing\" | \"archived\" | \"drifted\";\n\nexport interface TypedTableChecked {\n  status: TypedTableStatus;\n  /** The table's id (live or archived); `null` when missing. */\n  table: Uuid | null;\n  organizationId: Uuid;\n  /**\n   * Every difference; a declared column the table lacks is `{ aspect: \"spec\", stored: null, declared: <word> }`,\n   * a stored column the definition no longer declares is `{ aspect: \"extra\", stored: <type>, declared: null }`.\n   */\n  drift: FieldDrift[];\n  /**\n   * Live rows in THIS organization's copy that this reader may see (the store's own count);\n   * `null` when the table is missing or archived. The gate is about size (Arman, 2026-10-02): the\n   * release check sums this across organizations and compares it with the size knob.\n   */\n  rowCount: number | null;\n  /**\n   * The copy's access level as the store holds it: `confidential` once the server step made it so,\n   * else `organization`; `null` when missing or archived. A Confidential definition's writes wait on\n   * this (and on the readers matching — `confidentialGate`).\n   */\n  level: \"confidential\" | \"organization\" | null;\n}\n\n/**\n * The store's stored shape for each word a definition sends — `coalesce(parity_type, type)` and\n * `format` — measured on the clone 2026-10-02 (field_declare of every builder word).\n */\nfunction storedShapeOf(word: string, kind: unknown): { type: string; format: string | null } {\n  switch (word) {\n    case \"text\":\n      return { type: \"text\", format: null };\n    case \"long_text\":\n      return { type: \"text\", format: \"long\" };\n    case \"email\":\n    case \"phone\":\n    case \"url\":\n    case \"currency\":\n    case \"percent\":\n      return { type: word, format: word };\n    case \"number\":\n    case \"integer\":\n    case \"decimal\":\n      return { type: \"range\", format: null };\n    case \"datetime\":\n      return { type: \"datetime\", format: kind === \"date\" ? null : \"datetime\" };\n    case \"entity_reference\":\n      return { type: \"relation\", format: null };\n    case \"autonumber\":\n    case \"created_time\":\n    case \"modified_time\":\n    case \"formula\":\n      return { type: \"formula\", format: null };\n    default:\n      return { type: word, format: null };\n  }\n}\n\nconst text = (v: unknown): string | null => (typeof v === \"string\" && v.trim() !== \"\" ? v.trim() : null);\n\nexport async function checkTypedTable(\n  client: RecordsClient,\n  def: AnyTypedTableDef,\n  options: TypedTableOrgOptions = {},\n): Promise<RecordsResult<TypedTableChecked>> {\n  const org = writeOrganization(client, def, options);\n  if (!org.ok) return org;\n  const here = clientIn(client, org.data);\n\n  const found = await here.tableFind({ slug: def.slug, keptFor: def.kept_for });\n  if (!found.ok) return found;\n  if (found.data && found.data.archived_at !== undefined) {\n    return { ok: true, data: { status: \"archived\", table: found.data.id, organizationId: org.data, drift: [], rowCount: null, level: null } };\n  }\n  if (!found.data) {\n    return { ok: true, data: { status: \"missing\", table: null, organizationId: org.data, drift: [], rowCount: null, level: null } };\n  }\n  const fields = await here.fields({ table_id: found.data.id });\n  if (!fields.ok) return fields;\n  const stored = new Map(fields.data.map((x) => [x.key, x as unknown as Record<string, unknown>]));\n  const drift: FieldDrift[] = [];\n  for (const spec of def.specs) {\n    const s = stored.get(spec.key);\n    if (!s) {\n      drift.push({ field: spec.key, aspect: \"spec\", stored: null, declared: spec.type });\n      continue;\n    }\n    const want = storedShapeOf(spec.type, spec.kind);\n    const has = { type: text(s.parity_type) ?? text(s.type), format: text(s.format) };\n    const rules = Array.isArray(s.rules) ? (s.rules as Array<{ kind?: string }>) : [];\n    const pairs: Array<[FieldDrift[\"aspect\"], string | boolean | null, string | boolean | null]> = [\n      [\"type\", has.type, want.type],\n      [\"format\", has.format, want.format],\n      [\"label\", text(s.label), text(spec.label)],\n      [\"multi\", s.multi === true, spec.multi === true],\n      [\"required\", s.required === true, spec.required === true],\n      [\"unique\", rules.some((r) => r?.kind === \"unique\"), spec.unique === true],\n    ];\n    for (const [aspect, storedValue, declared] of pairs) {\n      if (storedValue !== declared) drift.push({ field: spec.key, aspect, stored: storedValue, declared });\n    }\n  }\n  const declared = new Set(def.specs.map((spec) => spec.key));\n  for (const [key, s] of stored) {\n    if (!key || declared.has(key)) continue;\n    drift.push({ field: key, aspect: \"extra\", stored: text(s.parity_type) ?? text(s.type), declared: null });\n  }\n  const counted = await here.listPage({ table_id: found.data.id, limit: 1, offset: 0 });\n  if (!counted.ok) return counted;\n  return {\n    ok: true,\n    data: {\n      status: drift.length > 0 ? \"drifted\" : \"ok\",\n      table: found.data.id,\n      organizationId: org.data,\n      drift,\n      rowCount: counted.data.total,\n      level: (found.data as unknown as { level?: unknown }).level === \"confidential\" ? \"confidential\" : \"organization\",\n    },\n  };\n}\n","// src/vocabulary.ts — @ai-matrx/records\n//\n// THE CLOSED VOCABULARIES. Every list here is a word set the STORE enforces,\n// and the store is the only place any of them is decided. The literal values\n// are not typed by hand: `src/store.generated.ts` is regenerated from the live\n// catalog by `pnpm records:generate`, and `pnpm check:store-registry` fails\n// the build the moment this package and the database disagree. What lives HERE\n// is the type layer over those literals, so a wrong word is a compile error in\n// a consumer rather than a `23514` at three in the morning.\n\nimport {\n  ACTOR_VOCABULARY,\n  ABSENCE_REASONS,\n  VALUE_ENVELOPE_KEYS,\n  VALUE_ALTERNATE_KEYS,\n  STORAGE_MODES,\n  RULE_USES,\n  PER_VALUE_ACCESS_WORDS,\n  PARITY_FIELD_TYPES,\n  DECLARABLE_FIELD_KINDS,\n  RULE_NODE_KINDS,\n  RETIRED_ACTOR_WORDS,\n} from \"./store.generated\";\n\n/**\n * VAL-8. Who wrote a value. `user`, `agent`, `system` — enforced by every write\n * door, and the three retired words (`human`, `ai`, `code`) are translated by\n * the store's own `custom.actor_word`, never by a caller.\n */\nexport type Actor = (typeof ACTOR_VOCABULARY)[number];\n\n/** The words the store still accepts and rewrites, mapped to what they become. */\nexport type RetiredActorWord = keyof typeof RETIRED_ACTOR_WORDS;\n\n/**\n * VAL-2. Why a value is missing. A value is never blank for an unexplained\n * reason: it either holds something or it says one of these four words.\n */\nexport type AbsenceReason = (typeof ABSENCE_REASONS)[number];\n\n/** The closed key set of one value envelope (VAL-1 … VAL-4). */\nexport type ValueEnvelopeKey = (typeof VALUE_ENVELOPE_KEYS)[number];\n\n/** The closed key set of one ranked alternate (VAL-3). */\nexport type ValueAlternateKey = (typeof VALUE_ALTERNATE_KEYS)[number];\n\n/**\n * REC-4. `heavy` is indexed storage with Rules on write; `light` is\n * whole-document storage with Rules on read. Per Table, one store.\n */\nexport type StorageMode = (typeof STORAGE_MODES)[number];\n\n/** REC-15. One Rule object, four uses. */\nexport type RuleUse = (typeof RULE_USES)[number];\n\n/**\n * VAL-5 / VAL-6. The words that may NOT appear inside a value envelope:\n * Visibility and access belong to a Field and to a Record, never to a value.\n * The store refuses each of them by name and so does this package's mirror.\n */\nexport type PerValueAccessWord = (typeof PER_VALUE_ACCESS_WORDS)[number];\n\n/** FLD-11. The parity floor: the field type a person picks in the UI. */\nexport type ParityFieldType = (typeof PARITY_FIELD_TYPES)[number][\"parity_type\"];\n\n/**\n * THE ONE REGISTRY, as a type: every kind a column can be DECLARED as.\n *\n * `ParityFieldType` above is the parity FLOOR — the answer to \"which of the fourteen\n * is this field\". It is not the answer to \"what may somebody pick\", and reading it as\n * though it were is exactly how `signature` came to be a field shape the store accepted\n * (`custom.doc_sign` takes no other) and no screen could offer: VERIFIER-10, F6.\n * `custom.field_kinds()` is the registry, and this is generated from it.\n */\nexport type DeclarableFieldKind = (typeof DECLARABLE_FIELD_KINDS)[number][\"kind\"];\n\n/** FLD-1. The five behaviors a Field can have. One, exactly, and closed. */\nexport type FieldBehavior = (typeof PARITY_FIELD_TYPES)[number][\"behavior\"];\n\n/** The node kinds `custom.rule_eval` evaluates. */\nexport type RuleNodeKind = (typeof RULE_NODE_KINDS)[number][\"node\"];\n\n/**\n * REC-32. The seven table types, closed. The parenthesised names are the\n * retired ones the doctrine records; never coin an eighth.\n */\nexport const TABLE_TYPES = [\n  \"entity\",\n  \"detail\",\n  \"reference\",\n  \"ledger\",\n  \"restricted\",\n  \"system\",\n  \"deprecated\",\n] as const;\nexport type TableType = (typeof TABLE_TYPES)[number];\n\n/** REC-33. The two origins. A table we ship in schema `custom` is `standard`. */\nexport const TABLE_ORIGINS = [\"standard\", \"custom\"] as const;\nexport type TableOrigin = (typeof TABLE_ORIGINS)[number];\n\n/** REL-1. Ownership is one fact, stored once, read from the field's side. */\nexport const RELATION_FLAVORS = [\"owned\", \"referenced\"] as const;\nexport type RelationFlavor = (typeof RELATION_FLAVORS)[number];\n\n/** REL-2. What happens to the far side, separate from flavour. */\nexport const ON_DELETE = [\"cascade\", \"set_null\", \"restrict\"] as const;\nexport type OnDelete = (typeof ON_DELETE)[number];\n\n/** REL-3. A snapshot is a frozen copy in the relation's payload, never a pointer. */\nexport const RELATION_BINDINGS = [\"live\", \"snapshot\"] as const;\nexport type RelationBinding = (typeof RELATION_BINDINGS)[number];\n\n/** REL-7. */\nexport const RELATION_CARDINALITIES = [\"one\", \"many\"] as const;\nexport type RelationCardinality = (typeof RELATION_CARDINALITIES)[number];\n\n/** FLD-7. Where a Field's values come from. */\nexport const FIELD_SOURCES = [\"manual\", \"formula\", \"agent\", \"synced\"] as const;\nexport type FieldSource = (typeof FIELD_SOURCES)[number];\n\n/** FLD-9. A Formula declares whether it computes on read or on write. */\nexport const COMPUTE_ON = [\"read\", \"write\"] as const;\nexport type ComputeOn = (typeof COMPUTE_ON)[number];\n\n/**\n * AGT-7 / FLD-12. A Field's sensitivity sets a ceiling a merge field can never\n * widen — and these are THE STORE'S four words, checked against its own guard.\n *\n * This list used to read `standard · sensitive · secret`, which the store has\n * never accepted: writing a Field with `sensitivity: \"standard\"` is refused\n * with \"the field <name> has to say how sensitive its values are, and it says\n * standard\". The knob `custom/field_sensitivity_levels` keys off these same\n * four words to decide which level may read and edit each one, so a package\n * carrying three different words could never have agreed with it. Corrected\n * against the live store, 2026-09-18.\n */\nexport const FIELD_SENSITIVITIES = [\"public\", \"internal\", \"confidential\", \"restricted\"] as const;\nexport type FieldSensitivity = (typeof FIELD_SENSITIVITIES)[number];\n\n/** DYN-17 / §D. Which tier a MERGE FIELD's value is delivered in. */\nexport const DELIVERIES = [\"inline\", \"on_demand\", \"auto\"] as const;\nexport type Delivery = (typeof DELIVERIES)[number];\n\n/**\n * FLD-12. WHETHER AN AGENT MAY SEE A FIELD'S VALUES, and these are the STORE'S\n * four words — not the merge field's delivery tiers.\n *\n * `Field.context_policy` used to be typed as `Delivery` here, which is a\n * different question with a different vocabulary: writing a Field with\n * `context_policy: \"inline\"` is refused with \"the field <name> has to say\n * whether an agent may see its values, and it says inline\". Delivery is about\n * HOW MUCH of a value a merge field carries into a turn; this is about WHETHER\n * the value reaches an agent at all, and conflating them let a screen offer a\n * word the store has never accepted. Corrected against the live store,\n * 2026-09-18.\n */\nexport const CONTEXT_POLICIES = [\"include\", \"summarize\", \"exclude\", \"on_request\"] as const;\nexport type ContextPolicy = (typeof CONTEXT_POLICIES)[number];\n\n/** DYN-3. The eight sources, closed. Relationships and rules are not sources. */\nexport const MERGE_FIELD_SOURCES = [\n  \"literal\",\n  \"record\",\n  \"state\",\n  \"actor\",\n  \"platform\",\n  \"user_input\",\n  \"tool\",\n  \"derived\",\n] as const;\nexport type MergeFieldSource = (typeof MERGE_FIELD_SOURCES)[number];\n\n/** DYN-4. What a merge field resolves INTO. The consumer never learns which. */\nexport const MERGE_FIELD_SEMANTIC_TYPES = [\n  \"value\",\n  \"reference\",\n  \"resolver\",\n  \"computed\",\n  \"collection\",\n] as const;\nexport type MergeFieldSemanticType = (typeof MERGE_FIELD_SEMANTIC_TYPES)[number];\n\n/** DYNAMIC-VALUES §A. Any number of these; never fused into the source. */\nexport const MERGE_FIELD_MODIFIERS = [\n  \"scoped\",\n  \"temporal\",\n  \"collection\",\n  \"live\",\n  \"fallback\",\n  \"formatted\",\n  \"required\",\n] as const;\nexport type MergeFieldModifier = (typeof MERGE_FIELD_MODIFIERS)[number];\n\n/** DYN-12. The five override policies. Exactly one, and it outranks the ladder. */\nexport const OVERRIDE_POLICIES = [\n  \"must_supply\",\n  \"shown_overridable\",\n  \"shown_locked\",\n  \"server_fixed\",\n  \"derived\",\n] as const;\nexport type OverridePolicy = (typeof OVERRIDE_POLICIES)[number];\n\n/** DYNAMIC-VALUES §C. What a resolved merge field's freshness was. */\nexport const FRESHNESS = [\"live\", \"cached\", \"snapshot\"] as const;\nexport type Freshness = (typeof FRESHNESS)[number];\n\n/** REC-1. How a Table shows itself. */\nexport const TABLE_DISPLAYS = [\"list\", \"grid\", \"board\", \"calendar\", \"timeline\"] as const;\nexport type TableDisplay = (typeof TABLE_DISPLAYS)[number];\n","// src/field.ts — @ai-matrx/records\n//\n// THE FIELD. FLD-1 … FLD-13, FLD-N-1.\n//\n// One behavior from a closed set of five; modifiers SEPARATE from behavior; a\n// constraint is a Rule and never a behavior; a parity type on top that says\n// which of the thirteen things a person picked in the UI and what it is MADE OF.\n// Unit and format live here and not in presentation, because they change what\n// the value MEANS and they reach the agent's context (FLD-N-1).\n\nimport type { NewerFieldKind } from \"./newerKinds\";\nimport type { Timestamp, Uuid } from \"./record\";\nimport type {\n  ComputeOn,\n  ContextPolicy,\n  DeclarableFieldKind,\n  FieldBehavior,\n  FieldSensitivity,\n  FieldSource,\n  OnDelete,\n  ParityFieldType,\n} from \"./vocabulary\";\n\n/** FLD-3. A constraint attached to a Field. A Rule, never a behavior. */\nexport interface FieldRule {\n  /**\n   * `unique` (FLD-3 / B1): no two live records of the Table hold the same value, compared\n   * case- and outer-space-blind. The store enforces it under an advisory lock\n   * (`custom._unique_rule_holds`); it is also what lets `recordUpsert` find \"the\" record by a key.\n   * The mirror never predicts it — it needs a query.\n   */\n  kind: \"min\" | \"max\" | \"length\" | \"pattern\" | \"equals_field\" | \"differs_from_field\" | \"unique\";\n  /**\n   * The rule's own number or word: the least / the most for `min` / `max`, the\n   * LONGEST for `length`, the pattern for `pattern`, the other column's key for\n   * `equals_field` / `differs_from_field`. A `length` rule that only says how\n   * SHORT a value may be carries `min` and no `value`.\n   */\n  value?: string | number;\n  /**\n   * STORE-RULE-GAPS (the older grid's `patternHint`). On a `pattern` rule only:\n   * how a person writes it, e.g. `\"949-555-0142\"`. The store refuses an example\n   * its own pattern would refuse, and a refused value is told \"Enter it like\n   * 949-555-0142.\" (the hint, and `detail.example`).\n   */\n  example?: string;\n  /**\n   * STORE-RULE-GAPS (the older grid's `minLength`). On a `length` rule only: the\n   * fewest characters. A blank is `required`'s question, never \"too short\".\n   */\n  min?: number;\n  /** FLD-10. Empty means \"wherever the Field applies\". */\n  applies_to_types?: string[];\n}\n\n/**\n * `custom.field` — the ONE definitions table (FLD-8), organization-scoped, so\n * two organizations add different fields to the same standard table.\n */\n/**\n * WHICH OF THE OTHER RECORD'S COLUMNS A RELATION SHOWS (REL-DISP, 2026-09-21).\n *\n * A Table has ONE stored default reference column — its `title_field` — and until\n * this existed every relation pointing at that Table could display that column and\n * nothing else. A Jobs board could read \"Maria Chen\" but never \"Maria Chen —\n * Rincon\", and two columns could not be joined into one string at all.\n *\n * ABSENT MEANS THE TABLE'S OWN COLUMN. A field with no `display` resolves exactly\n * as it did before, so nothing changes for a column nobody has given a spec to.\n *\n * The store judges it once, in `custom._display_spec_for`: every column named must\n * exist on the target Table, and the refusal names the one that does not. It is\n * resolved by ONE body, `custom._words_for`, which `custom.record_words`,\n * `custom._card_words`, `custom.relation_words` and `custom.relation_words_many`\n * are all one-liners onto — so the thirteen store-side readers inherit it too.\n *\n * A display column that is itself a relation resolves ONE hop and never a second.\n */\nexport interface RelationDisplay {\n  /** The target's columns, in the order they are shown. */\n  columns: string[];\n  /** What goes between them. Defaults to a single space. */\n  separator: string;\n}\n\nexport interface Field {\n  id: Uuid;\n  organization_id: Uuid;\n  /** Set when this Field extends a standard entity rather than a custom Table. */\n  entity_definition_id: Uuid | null;\n  /** The token of the Table this Field belongs to. */\n  table_token: string | null;\n  key: string;\n  label: string;\n  name: string | null;\n  /**\n   * When this Field was taken away (retired / archived), or null while it is live. Filled by the reads that\n   * can answer a retired Field — `entityFields({ include_retired: true })`; absent from reads that never do.\n   */\n  archived_at?: string | null;\n\n  // ── behavior and modifiers, which are different questions ────────────────\n  /** FLD-1. Exactly one of five. */\n  type: FieldBehavior;\n  /** FLD-2. The shape of the value, never a second behavior. */\n  multi: boolean;\n  /** FLD-2. The values carry their own dates — the world clock, not History. */\n  dated: boolean;\n  /** FLD-3. Any number of attached validation Rules. */\n  rules: FieldRule[];\n  config: Record<string, unknown>;\n  required: boolean;\n  default: unknown;\n  sort: number | null;\n\n  // ── relation properties (REL-1 … REL-8), on the field's side ──────────────\n  /** The Table this relation points at. */\n  relation_target: Uuid | null;\n  relation_max: number | null;\n  on_target_delete: OnDelete | null;\n  /** REL-9. The reverse is visible from both ends and is NOT a second Field. */\n  inverse_key: string | null;\n  /** REL-DISP. Which of the target's columns this one shows. Null = the Table's own. */\n  display: RelationDisplay | null;\n\n  // ── where values come from (FLD-7, FLD-9) ─────────────────────────────────\n  source: FieldSource;\n  source_config: Record<string, unknown>;\n  /** FLD-9. A Formula declares whether it computes on read or on write. */\n  compute_on: ComputeOn | null;\n\n  // ── what the value MEANS (FLD-N-1) ────────────────────────────────────────\n  /** The unit, on the Field, because it changes the meaning. Never presentation. */\n  unit: string | null;\n  format: string | null;\n\n  // ── the agent-facing properties (FLD-12, AGT-6, AGT-7) ────────────────────\n  /** AGT-7. A ceiling a merge field's delivery can never widen. */\n  sensitivity: FieldSensitivity | null;\n  /** FLD-12. Whether an agent may see this Field's values: include · summarize · exclude · on_request. */\n  context_policy: ContextPolicy | null;\n  /** AGT-6. How often a `source = agent` Field is refilled. */\n  review_interval_days: number | null;\n  /**\n   * §D says this is on the wrong object and moves to the merge field. It is\n   * still carried here because the live column is, and the client reads what\n   * the store holds — never what the plan wishes it held.\n   */\n  depends_on: Uuid[] | null;\n\n  /** FLD-10. Which record types this Field applies to. Empty means all of them. */\n  applies_to_types: string[];\n  /** FLD-5 / FLD-6. A list field's choices are the records of THIS Table. */\n  options_table_id: Uuid | null;\n\n  created_by: Uuid | null;\n  updated_by: Uuid | null;\n  created_at: Timestamp;\n  updated_at: Timestamp;\n  version: number;\n  metadata: Record<string, unknown>;\n  visibility: string;\n}\n\n/**\n * FLD-11. What the person picked, and what the store says it is made of. The\n * list itself is generated from `custom.parity_field_types()`; this is its type.\n */\nexport interface ParityFieldTypeDescriptor {\n  parity_type: ParityFieldType;\n  behavior: FieldBehavior;\n  made_of: string;\n}\n\n/** AGT-8 / AGT-4. What an agent (or a person) proposes when a Field is missing. */\nexport interface FieldProposal {\n  table_id: Uuid;\n  key: string;\n  label: string;\n  type: FieldBehavior;\n  multi?: boolean;\n  required?: boolean;\n  config?: Record<string, unknown>;\n  relation_target?: Uuid;\n  /** Why this Field should exist — what an approver reads before approving. */\n  because: string;\n}\n\n/** AGT-8. What a table proposal looks like, same shape of question. */\nexport interface TableProposal {\n  name: string;\n  slug: string;\n  title_field: string;\n  fields: Array<Omit<FieldProposal, \"table_id\" | \"because\">>;\n  because: string;\n}\n\n/**\n * WHAT A PERSON SAYS WHEN THEY ADD A COLUMN — the argument of\n * `custom.field_declare`, and deliberately NOT a `Field`.\n *\n * A `Field` is what the store STORES: a behavior from a closed set of five,\n * modifiers beside it, a format, a unit, a relation target, a relation maximum,\n * an on-delete word, a compute_on, and the attached Rules that make a format\n * enforceable. A person adding a column knows none of that. They know they want\n * a date, or a person, or a list with these three choices in it.\n *\n * Every client that tried to bridge that gap itself got it wrong — the field\n * panel picked \"Person\" and the store read a Formula — so the bridge is the\n * STORE's, once, and this is the shape it takes.\n */\nexport interface NewFieldDeclaration {\n  /** What a person reads on the column. The only thing that is always required. */\n  label: string;\n  /** One of the thirteen. Absent means one of the three plain behaviors below. */\n  parity_type?: ParityFieldType;\n  /** Plain text, a long text or a plain number — the three that carry no parity type. */\n  plain?: \"text\" | \"long_text\" | \"number\";\n  /**\n   * THE ONE WORD EVERY OTHER CALLER REACHES FOR. An agent, a script, an import\n   * and this package's own table-declaring path all say `type`, and until\n   * 2026-09-20 `custom._field_document_for` threw it away — a `number` became a\n   * text column in silence. It now resolves all three vocabularies, so this is\n   * named here rather than left as a shape only the store knows about.\n   */\n  type?: FieldTypeWord;\n  /** Derived from the label when absent, which is why the panel never asks for it. */\n  key?: string;\n  /** T8 / CD-CORE-15. The record types this column applies to (its table's type field's choices). Absent: every record. */\n  applies_to_types?: string[];\n  required?: boolean;\n  multi?: boolean;\n  dated?: boolean;\n  sort?: number;\n  sensitivity?: FieldSensitivity;\n  context_policy?: ContextPolicy;\n  rules?: FieldRule[];\n  /** DEFECTS 7: `true` is the plain way to say `rules: [{ kind: \"unique\" }]`; the store adds the rule once. */\n  unique?: boolean;\n  /** A choice list's choices, as words. The store keeps them as a Table (FLD-5 / FLD-6). */\n  options?: string[];\n  /** …or the Table they already come from, when a person picked an existing list. */\n  options_table_id?: Uuid;\n  /** The currency symbol or code a currency field's numbers are in (FLD-N-1). */\n  unit?: string;\n  /** A date field: a day, or a day and a time. */\n  kind?: \"date\" | \"datetime\";\n  /** A lookup or a rollup: the key of the relation Field on THIS table it travels along. */\n  via?: string;\n  /** A lookup: the key of the value it reads on the far side. */\n  pick?: string;\n  /** A rollup: what it works out, and of which far-side field (`count` needs none). */\n  agg?:\n    | \"sum\" | \"count\" | \"min\" | \"max\" | \"avg\"\n    | \"countall\" | \"counta\" | \"and\" | \"or\" | \"xor\" | \"arrayjoin\" | \"concatenate\" | \"arrayunique\" | \"arraycompact\";\n  of?: string;\n  /**\n   * A rollup: WHICH linked records it adds up (CHAIR-MATH b, 2026-10-03). The same shape a saved\n   * view's `filters` carries, written against the far table — a flat map of far-side column keys\n   * (`{ status: \"open\" }`, choice columns by their words, windows as a view writes them) or a Rule\n   * expression over far-side field IDs (`{ op: \"eq\", args: [{ field: \"<id>\" }, { const: false }] }`).\n   * The store validates it against the far table on declare and update; absent or `null` means\n   * every linked record. Kept in `config.filter`.\n   */\n  filter?: Record<string, unknown> | null;\n  /** A formula: the expression, in the same shape a Rule uses (REC-15). */\n  expr?: Record<string, unknown>;\n  /**\n   * A formula IN THE LANGUAGE A PERSON TYPES — `{Visit fee} - {Deposit taken}` (GRID-PRIMITIVES\n   * G3). The store parses it (`custom.formula_parse`), keeps the text in `config.formula_text`\n   * and the expression it parses to in `config.expr`; send this OR `expr`, never both.\n   */\n  formula_text?: string;\n  /**\n   * LANE SC-R — an `entity_reference` column's kinds: the platform entity tokens it may point at\n   * (`note`, `site`, `agent` …), kept by the store in `config.allowed_types`.\n   */\n  allowed_types?: string[];\n  compute_on?: ComputeOn;\n  relation_max?: number;\n  /**\n   * REL / FLD-11. The Table this column points at, when it is neither a Person\n   * (`member`) nor a File (`attachment`). The store has taken it since\n   * 2026-09-20 and no client type named it, so a person with an Invoice table\n   * and a Line table could not declare the link through this package at all.\n   */\n  relation_target?: Uuid;\n  /** REL-2. What happens to this record when the thing it points at goes. */\n  on_target_delete?: OnDelete;\n  /**\n   * REL-DISP. Which of the target's columns this one shows, and what joins them.\n   * A bare column name and a plain list are both accepted by the door and\n   * normalized; leaving it out keeps the target Table's own reference column.\n   */\n  display?: RelationDisplay | string[] | string;\n  /**\n   * Presentation and behavior settings the store carries verbatim — a long\n   * text's `multiline`, a list's existing options table. The door has always\n   * read it (`p_spec -> 'config'`) and this interface never offered it, so a\n   * package-owned table could not declare its own multi-line column.\n   */\n  config?: Record<string, unknown>;\n  /** A text column that holds a signature (`custom.doc_sign` accepts no other). */\n  format?: string;\n  /**\n   * STORE-RULE-GAPS (the older grid's `allowOther`). A choice list only: a value\n   * that is none of the choices is ADDED to the list as typed instead of\n   * refused. Stored as `config.allow_other`; absent means off.\n   */\n  allow_other?: boolean;\n  /** LANE 10 P4 — a rating's top star, 1 to 10 (5 when absent); the store keeps it as a max Rule. */\n  max?: number;\n  /** LANE 10 P4 — a status's groups: choice words → `todo`, `in_progress` or `done`. */\n  status_groups?: Record<string, \"todo\" | \"in_progress\" | \"done\">;\n  /** LANE 10 P4 — a barcode's symbology, one of `BARCODE_SYMBOLOGIES`; absent takes any code. */\n  symbology?: string;\n}\n\n/**\n * Every word `custom._field_document_for` resolves for `type`: any parity type\n * in `PARITY_FIELD_TYPES`, any behavior those types are made of, or one of the\n * plain synonyms a person or an agent actually writes. No count is written down\n * here on purpose — the parity floor is regenerated from\n * `custom.parity_field_types()` and grew from thirteen to fourteen the day\n * `checkbox` landed, which is how the store's own refusals came to name a list\n * that no longer matched it.\n */\nexport type FieldTypeWord =\n  // THE ONE REGISTRY (FIX-10B-F6). Every kind `custom.field_kinds()` publishes: the parity\n  // floor plus plain text, long text, number, a person-aimed relation and a signature. This\n  // union named only the parity floor and three plain synonyms, so `signature` — the one\n  // shape `custom.doc_sign` accepts — was not a word any typed caller could send, which is\n  // half of why no screen offered it.\n  | DeclarableFieldKind\n  | FieldBehavior\n  | \"number\"\n  | \"integer\"\n  | \"decimal\"\n  | \"float\"\n  | \"long_text\"\n  | \"string\"\n  // GRID-PRIMITIVES G5: the store's own stamps, each made a formula Field over its system node\n  // (`fx.autonumber`, `fx.created_time`, `fx.modified_time`). `custom.field_kinds()` does not\n  // publish them (each is a formula, not a behaviour), but `custom.field_declare` takes the word.\n  | \"autonumber\"\n  | \"created_time\"\n  | \"modified_time\"\n  // LANE SC-R: a column that points at a platform thing; published by `custom.field_kinds()` once\n  // the chair's apply lands, and named here so a typed caller can send it before that generate.\n  | \"entity_reference\"\n  // LANE 10 P4: the nine newer kinds (`newerKinds.ts`), the same way.\n  | NewerFieldKind;\n\n/**\n * What `custom.field_update` accepts.\n *\n * THE SETTINGS **AND** THE BEHAVIOR. The door has had a behavior arm since\n * T12 — say `parity_type`, `plain` or `type` and every value of the column is\n * converted (or kept in `_retired` with its reason) by\n * `custom._field_type_converts_values`. This interface named only the settings,\n * so the one client that needed to move a field back onto the behavior it is\n * written against had no door and reached for `custom.record_update` instead,\n * which writes the document under the guards rather than through them.\n */\n/** One existing choice of a list, re-worded in place (`FieldPatch.options`). */\nexport interface FieldOptionEdit {\n  /** The option record's id, as `fieldOptions` answers it. */\n  id: string;\n  /** What the choice reads as from now on. */\n  words: string;\n}\n\nexport interface FieldPatch {\n  label?: string;\n  /** T8 / CD-CORE-15. The record types this column applies to; `[]` makes it apply to every record. */\n  applies_to_types?: string[];\n  required?: boolean;\n  dated?: boolean;\n  sort?: number;\n  sensitivity?: FieldSensitivity;\n  context_policy?: ContextPolicy;\n  unit?: string;\n  rules?: FieldRule[];\n  /**\n   * The choices of a choice list, rewritten, IN ORDER (lane CHOICE-COLUMN-EDIT, 2026-09-27).\n   *\n   * Each entry is either `{ id, words }` — `id` is the option record's id as `fieldOptions`\n   * answers it — which RE-WORDS that choice in place (its key never changes, so every cell\n   * holding it now reads the new words), or plain words: the live choice with the same words\n   * (any case), else a retired one brought back, else a new choice. Every choice takes the\n   * position it has in this array. A live choice the array does not name is RETIRED (never\n   * deleted): cells holding it keep it and read as its words. All in one transaction.\n   */\n  options?: Array<string | FieldOptionEdit>;\n  /**\n   * Words ADDED to a choice list's choices without touching the others: a live same-words\n   * choice adds nothing, a retired one is brought back, the rest are appended. Refused by name\n   * beside `type` / `parity_type` / `plain`.\n   */\n  options_add?: string[];\n  /** One of the thirteen — a change of what this column HOLDS, not of a setting. */\n  parity_type?: ParityFieldType;\n  /** …or one of the three plain behaviors, …*/\n  plain?: \"text\" | \"long_text\" | \"number\";\n  /** …or the one word every other caller reaches for (see `NewFieldDeclaration`). */\n  type?: FieldTypeWord;\n  /**\n   * FLD-2. The shape of the value — one, or several.\n   *\n   * This comment used to say that a patch moving `multi` ALONE changed nothing\n   * and that the behavior word had to be sent with it. That was true, and it\n   * was a description of a silent failure rather than a contract: the door\n   * answered \"saved\" and the column still held one. `custom.field_update` has\n   * had a real settings arm for it since 2026-09-20 (matrx-frontend\n   * `migrations/campaign/fix7b_field_multi_arm.sql`), which also moves a\n   * relation's `relation_max` beside it — `custom.validate_values` counts links\n   * against that number, so moving `multi` without it would tick a box and\n   * still refuse the second record.\n   *\n   * A CHOICE LIST IS THE ONE EXCEPTION, and it is refused by name rather than\n   * ignored: for `select` / `multi_select`, \"one answer or several\" IS the\n   * parity type, so send the type instead.\n   */\n  multi?: boolean;\n  /** REL / FLD-11: re-point the column. The old edges are withdrawn by the door. */\n  relation_target?: Uuid;\n  on_target_delete?: OnDelete;\n  /**\n   * REL-DISP. Which of the target's columns this one shows. `null` REMOVES the\n   * spec and the column goes back to whatever the table it points at is titled by;\n   * the door refuses it by name on a column that points at nothing.\n   */\n  display?: RelationDisplay | string[] | string | null;\n  /** SEAT-SUITES: whether the store builds an index for this column, and a unique one. */\n  promoted?: boolean;\n  unique?: boolean;\n  /**\n   * STORE-RULE-GAPS. A choice list's \"other values allowed\" setting — see\n   * `NewFieldDeclaration.allow_other`. Refused by name on any other column; a\n   * retype that stays a list keeps it.\n   */\n  allow_other?: boolean;\n  /** LANE 10 P4 — a status's groups, changed in place: choice words or keys → `todo` | `in_progress` | `done`. */\n  status_groups?: Record<string, \"todo\" | \"in_progress\" | \"done\">;\n  /** LANE 10 P4 — a barcode's symbology; null takes any code again. */\n  symbology?: string | null;\n  /** LANE 10 P4 round 3 — a rating's new top star, 1 to 10; scores above it are set aside in `_retired`. */\n  max?: number;\n  /** NOTION-PROPS-3 — a button column's settings, whole (`config.button`); refused on any other column. */\n  button?: import(\"./button\").ButtonSettings;\n  /** NOTION-PROPS-3 — a link to its own table says one record waits on another (a timeline draws it). */\n  dependency?: boolean;\n  /** W2-A 4 — a Last changed time column watches only these field keys (`config.only_fields`); null = the whole record. */\n  only_fields?: string[] | null;\n  /** NOTION-PROPS-3 — a one-record link to its own table names each record's parent: the table nests sub-items. */\n  sub_items?: boolean;\n  /** CLOSE-LINK (CD-LINK-03) — a link's picker offers only this saved view's records (`config.limit_to_view`); null takes it off. */\n  limit_to_view?: string | null;\n  /** CLOSE-LINK (CD-LINK-05) — a link follows the linked record (`live`, the default) or keeps a copy of it from when it was linked (`snapshot`, `config.binding`); turning snapshot on takes a copy for every link already there. */\n  binding?: \"live\" | \"snapshot\";\n  /** CLOSE-LINK (CD-LINK-08) — a link carries access: whoever can see a linked record can see this one (`config.carries`), at most at `carries_max`. */\n  carries?: boolean;\n  /** CLOSE-LINK (CD-LINK-08) — the most a carrying link conveys: `viewer` (the default) or `editor`. */\n  carries_max?: \"viewer\" | \"editor\";\n  /** CLOSE-LINK (CD-LINK-09) — two records may point at each other along this link (`config.loops`). */\n  loops?: boolean;\n  /** CLOSE-LINK (CD-LINK-04) — the other tables a link also points at (`config.target_tables`, its own table always first); null or [] = only its own table. */\n  target_tables?: readonly string[] | null;\n  /** §D / T7: which fields a worked-out column reads. */\n  depends_on?: Uuid[];\n  /**\n   * A rollup: WHICH linked records it adds up — the same shape as `NewFieldDeclaration.filter`\n   * (a saved view's filter written against the far table). `null` removes it, and the rollup adds\n   * up every linked record again. `custom.field_update` validates it against the far table.\n   */\n  filter?: Record<string, unknown> | null;\n  /**\n   * FLD-9. WHEN a worked-out column works its answer out: when somebody reads the record,\n   * or when somebody saves it.\n   *\n   * This door accepted the word, answered success and threw it away until 2026-09-21\n   * (matrx-frontend `migrations/campaign/tails2_a_formula_says_when_it_works_itself_out.sql`)\n   * — its spec builder used a fixed key list that did not carry it, so a person declaring a\n   * write-stamped formula through this door silently got a read-time one. It is applied now,\n   * in both arms, and the records already saved are brought with it.\n   *\n   * TWO THINGS IT REFUSES BY NAME rather than forcing quietly: a column that is not worked\n   * out by the store has no moment to be worked out at, and a ROLL-UP adds up OTHER records,\n   * so an answer stamped when this record was last saved would be wrong the moment one of\n   * them changed — a roll-up is always `read`.\n   */\n  compute_on?: ComputeOn;\n  /**\n   * FLD-11 / REC-15. RE-AIMING A WORKED-OUT COLUMN: the expression, in the same\n   * shape a Rule uses and read by the same evaluator — `{\"op\":\"concat\",\"args\":\n   * [{\"field\":\"note\"}]}`. Every `{\"field\": …}` in it names a live Field of this\n   * organization, or `custom._field_document_for` refuses the whole patch by\n   * name and writes nothing.\n   *\n   * `custom.field_update` carries this in its BEHAVIOR arm — the arm a type\n   * word opens — so send it WITH the word for what the column is\n   * (`type: \"formula\"`, or `parity_type` / `plain`). The door's spec builder\n   * reads `coalesce(p_patch -> 'expr', v_old -> 'config' -> 'expr')`, so a\n   * re-type that does not carry one deliberately keeps the expression the\n   * column already had; the settings arm has no `expr` key at all, so `expr`\n   * alone is not a change this door makes. `STORE-TAILS-2` asked for the field\n   * because the one client that needed to re-aim an existing formula had no\n   * typed way to say it and reached for `custom.record_update`, which writes the\n   * Field document under the guards rather than through them.\n   */\n  expr?: Record<string, unknown>;\n  /**\n   * RE-AIMING A FORMULA IN THE LANGUAGE A PERSON TYPES (GRID-PRIMITIVES G3). Same arm as\n   * `expr` — send it with `type: \"formula\"`; the store parses it and keeps both the text and\n   * the expression. Measured on the dev clone 2026-09-23: `{\"type\":\"formula\",\"formula_text\":\n   * \"{Visit fee} * 2\"}` re-aims the column and keeps its other settings.\n   */\n  formula_text?: string;\n}\n\n/**\n * Whether a choice column takes values that are not one of its choices\n * (`config.allow_other`, STORE-RULE-GAPS). Off unless the column says so.\n */\nexport function allowsOtherValues(field: Pick<Field, \"type\" | \"config\">): boolean {\n  return field.type === \"list\" && field.config?.[\"allow_other\"] === true;\n}\n\n/**\n * What `custom.field_duplicate` answers (DUPLICATE PROPERTY, Notion N5): the copy's id, key and name, and\n * how many records had a value copied into it. `values` is `not_a_value` for a link, formula, lookup or\n * roll-up column, whose copy holds no document values of its own.\n */\nexport interface FieldDuplicated {\n  field_id: string;\n  key: string;\n  label: string;\n  values_copied: number;\n  values: \"copied\" | \"not_a_value\";\n}\n","// src/retype.ts — @ai-matrx/records\n//\n// CHANGING WHAT A COLUMN HOLDS (FLD-4 / T12; merged-grid review 2, 2026-09-27, C3).\n//\n// `custom.migrate_retype` changes a Field's behavior word and the store's own trigger converts\n// every value already written: what converts is converted, what does not is kept in that record's\n// `_retired` with its reason — neither coerced nor deleted. A person deciding whether to do that\n// deserves the honest count BEFORE it happens (Airtable's \"N cells will be cleared\" warning,\n// bettered: nothing is cleared here, it is kept aside). The store's conversion is\n// `custom.field_value_convert(p_to, p_value)`, which is not reachable from a client, so this is\n// its MIRROR — the same rules, word for word, used only to say what will happen. The store still\n// decides, and its own answer (`FieldRetyped`) is what the screen reports afterwards.\nimport { isUuidShape } from \"@ai-matrx/kit/uuid\";\n\n/** The store's behavior words a column can be changed to. */\nexport type RetypeBehaviour = \"text\" | \"range\" | \"boolean\";\n\n/** `custom.migrate_retype`'s answer for a Field. */\nexport interface FieldRetyped {\n  verb: \"retype\";\n  field_id: string;\n  was: string | null;\n  now: string;\n  changed: boolean;\n  migration_id?: string;\n  /** Records that hold a value for this column after the change. */\n  records_still_holding_a_value?: number;\n  /** Values of this column now kept aside in `_retired`, with their reason. */\n  values_in_retired_for_this_field?: number;\n  at?: string;\n}\n\n/**\n * `custom.field_retype_preview`'s answer: what a change of a column's kind WILL do, counted by the store\n * running the change itself in a subtransaction it rolls back (lane F2, D11). It cannot disagree with the\n * change, because it is the change.\n */\nexport interface FieldRetypePreview {\n  /** Records holding a value before the change. */\n  held_before: number;\n  /** Records still holding a value after it (converted, or already fitting). Null when `limited`. */\n  converts: number | null;\n  /** Values the change keeps aside in `_retired`, with their reason. Null when `limited`. */\n  kept_aside: number | null;\n  /**\n   * The column holds too many values to run the change ahead of time without holding the table (ADV-1 F8),\n   * or another editor held it. No counts then; `held_before` is still the number of values held.\n   */\n  limited?: boolean;\n  /** Why it is limited: \"large\" (too many values) or \"busy\" (another editor holds the table). */\n  why?: string;\n  /** Up to five of the values kept aside, as words. */\n  examples: string[];\n  /** Choices the change makes from the column's words (a change to Choice or Multi-choice). */\n  choices_added: number;\n}\n\n/**\n * `custom.migrate_merge`'s answer (T5 / REC-21): the other record merged into the survivor. Its\n * values the survivor did not hold moved across; the ones that differed are kept as ranked\n * alternates with their source (or in `_retired` when the key is not a declared field); every\n * link and child pointing at it now points at the survivor; it is archived and its id resolves to\n * the survivor. `migration_id` is what `migrateUndo` takes.\n */\nexport interface RecordsMerged {\n  verb: \"merge\";\n  winner: string;\n  loser: string;\n  migration_id: string;\n  values_taken: number;\n  values_copied: number;\n  alternates_added: number;\n  values_retired: number;\n  relations_retargeted: number;\n  relations_detached_as_duplicates: number;\n  resolves_to?: string | null;\n  at?: string;\n}\n\n/** `custom.migrate_split`'s answer. The original keeps its id; the moved values live on `new_record`. */\nexport interface RecordSplit {\n  verb: \"split\";\n  kept_the_id: string;\n  new_record: string;\n  migration_id: string;\n  moved: string[];\n  old_id_resolves_to?: string | null;\n  at?: string;\n}\n\n/** `custom.migrate_extract_parent`'s answer. The named values were COPIED up into `parent`, and the record now sits under it. */\nexport interface ParentExtracted {\n  verb: \"extract_parent\";\n  record_id: string;\n  parent: string;\n  was_under: string | null;\n  migration_id: string;\n  at?: string;\n}\n\n/**\n * `custom.migrate_retype`'s answer for a RECORD (test 9 / REC-N-18): the record moved to another table of\n * the same organization and KEPT ITS ID, so every link to it still resolves. The values whose column the\n * new table lacks are `misfits`: taken off the record and kept in History on `migration_id`, with the\n * reason — neither coerced nor deleted. `migrateUndo(migration_id)` puts the record back on its table\n * with every value it held.\n */\nexport interface RecordMoved {\n  verb: \"retype\";\n  record_id: string;\n  kept_the_id: boolean;\n  from_table: string;\n  to_table: string;\n  migration_id: string;\n  /** The values that did not fit, by key, exactly as they were. */\n  misfits: Record<string, unknown>;\n  misfits_are?: string;\n  at?: string;\n}\n\n/** One row of `custom.migrations`: a recorded Migration on one target, and whether it was put back. */\n/** `custom.history_retention`'s answer: the organization's floor and (when asked) one table's days. */\nexport interface HistoryRetention {\n  organization_id: string;\n  table_id: string | null;\n  floor_days: number;\n  table_days: number | null;\n  /** The store's own sentence. */\n  says: string;\n}\n\nexport interface MigrationEntry {\n  id: string;\n  verb: string;\n  target_kind: string;\n  target_id: string;\n  note: string | null;\n  applied_at: string;\n  applied_by: string | null;\n  undone_at: string | null;\n}\n\n/** `custom.migrate_undo`'s answer: the Migration it put back. */\nexport interface MigrationUndone {\n  undone: string;\n  verb: string;\n  kind: string;\n  record_id: string | null;\n  version_after?: number | null;\n  also_restored?: number;\n  ids_unaliased?: number;\n  /** A split or an extracted parent: the record the Migration made, archived by the undo. */\n  removed?: string | null;\n  at?: string;\n}\n\nconst TRUE_WORDS = new Set([\"true\", \"t\", \"yes\", \"y\", \"1\", \"on\", \"x\", \"✓\", \"✔\"]);\nconst FALSE_WORDS = new Set([\"false\", \"f\", \"no\", \"n\", \"0\", \"off\", \"☐\"]);\n\n/**\n * THE MIRROR OF `custom.field_value_convert`: does `value` survive the change to `to` (the\n * behavior word, and for `range` the kind — `number`, `date`, `datetime`)? An absence always\n * survives; a list survives only when every member does.\n */\nexport function valueConverts(to: { type: string; kind?: string | null }, value: unknown): boolean {\n  if (value === null || value === undefined) return true;\n  if (Array.isArray(value)) return value.every((v) => valueConverts(to, v));\n  if (typeof value === \"object\") return false;\n  const text = String(value);\n  const kind = to.kind ?? \"number\";\n  switch (to.type) {\n    case \"boolean\":\n      if (typeof value === \"boolean\") return true;\n      return TRUE_WORDS.has(text.trim().toLowerCase()) || FALSE_WORDS.has(text.trim().toLowerCase());\n    case \"text\":\n      return true;\n    case \"range\":\n      if (kind === \"date\" || kind === \"datetime\") return typeof value === \"string\" && !Number.isNaN(Date.parse(text));\n      if (typeof value === \"number\") return true;\n      return text.trim() !== \"\" && /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i.test(text.trim());\n    case \"list\":\n    case \"relation\":\n      return typeof value === \"string\" && isUuidShape(text);\n    default:\n      return false;\n  }\n}\n\n/** What a retype will do to the values already written, counted before anything is changed. */\nexport interface RetypePreview {\n  /** Records holding a value that will be converted and stay in the column. */\n  converts: number;\n  /** Records holding a value that will be kept aside (in `_retired`, with the reason). */\n  keptAside: number;\n  /** Up to five of the values that will be kept aside, to show the person. */\n  examples: string[];\n  /** The count covers only the groups the store answered (a ceiling was reached). */\n  partial: boolean;\n}\n\n/** Count a column's distinct values (value → how many records hold it) against the change. */\nexport function previewRetype(\n  to: { type: string; kind?: string | null },\n  groups: ReadonlyArray<{ value: unknown; count: number }>,\n  partial = false,\n): RetypePreview {\n  let converts = 0;\n  let keptAside = 0;\n  const examples: string[] = [];\n  for (const group of groups) {\n    if (group.value === null || group.value === undefined || group.value === \"\") continue;\n    if (valueConverts(to, group.value)) converts += group.count;\n    else {\n      keptAside += group.count;\n      if (examples.length < 5) examples.push(Array.isArray(group.value) ? group.value.join(\", \") : String(group.value));\n    }\n  }\n  return { converts, keptAside, examples, partial };\n}\n\n// ── A RULE THAT TIGHTENS (lane 10 P4c / V13 #4) ─────────────────────────────────────────────\n//\n// Changing a column's checks (a smallest, a largest, a longest, a pattern) or a rating's top star\n// sets aside every value already written that the new checks refuse: `custom.field_update` keeps\n// each one in its record's `_retired` with the reason, in one statement. The person deserves the\n// same honest count a retype gets, BEFORE pressing Save. This is the mirror of the rule branch of\n// `custom.validate_values`, word for word: `min` / `max` judge numbers only, `length` judges text\n// only (an empty text is a blank, never \"too short\"), `pattern` is the store's unanchored regex\n// match. Rules that need other columns or other records (`equals_field`, `differs_from_field`,\n// `unique`) are never judged against values already written, so they set nothing aside.\n\n/** The checks the mirror can judge on one value. */\ntype JudgedRule = { kind: string; value?: string | number | undefined; min?: number | undefined };\n\n/** The first check `value` fails, or null when every check keeps it. An absence always passes. */\nexport function ruleThatRefuses(rules: ReadonlyArray<JudgedRule>, value: unknown): JudgedRule | null {\n  if (value === null || value === undefined) return null;\n  if (Array.isArray(value)) {\n    for (const member of value) {\n      const failed = ruleThatRefuses(rules, member);\n      if (failed) return failed;\n    }\n    return null;\n  }\n  for (const rule of rules) {\n    const bound = typeof rule.value === \"number\" ? rule.value : rule.value === undefined || rule.value === \"\" ? NaN : Number(rule.value);\n    if (rule.kind === \"min\" && typeof value === \"number\" && Number.isFinite(bound) && value < bound) return rule;\n    if (rule.kind === \"max\" && typeof value === \"number\" && Number.isFinite(bound) && value > bound) return rule;\n    if (rule.kind === \"length\" && typeof value === \"string\") {\n      const chars = Array.from(value).length;\n      if (Number.isInteger(bound) && chars > bound) return rule;\n      if (typeof rule.min === \"number\" && value !== \"\" && chars < rule.min) return rule;\n    }\n    if (rule.kind === \"pattern\" && typeof value === \"string\" && typeof rule.value === \"string\" && rule.value !== \"\") {\n      let pattern: RegExp | null = null;\n      try {\n        pattern = new RegExp(rule.value, \"u\");\n      } catch {\n        pattern = null; // A pattern JavaScript cannot read is the store's to judge; it is not guessed here.\n      }\n      if (pattern && !pattern.test(value)) return rule;\n    }\n  }\n  return null;\n}\n\n/** A rating's checks with its top star as the `max` (the store writes the top star as that Rule). */\nexport function rulesWithTopStar<R extends JudgedRule>(rules: ReadonlyArray<R>, topStar: number): Array<R | { kind: \"max\"; value: number }> {\n  return [...rules.filter((r) => r.kind !== \"max\"), { kind: \"max\" as const, value: topStar }];\n}\n\n/** What new checks will do to the values already written, counted before anything is saved. */\nexport function previewRuleChange(\n  rules: ReadonlyArray<JudgedRule>,\n  groups: ReadonlyArray<{ value: unknown; count: number }>,\n  partial = false,\n): RetypePreview {\n  let converts = 0;\n  let keptAside = 0;\n  const examples: string[] = [];\n  for (const group of groups) {\n    if (group.value === null || group.value === undefined || group.value === \"\") continue;\n    if (ruleThatRefuses(rules, group.value) === null) converts += group.count;\n    else {\n      keptAside += group.count;\n      if (examples.length < 5) examples.push(Array.isArray(group.value) ? group.value.join(\", \") : String(group.value));\n    }\n  }\n  return { converts, keptAside, examples, partial };\n}\n","// src/autonumber.ts — @ai-matrx/records\n//\n// A RECORD NUMBER'S PREFIX (lane NOTION-PROPS-3; champion: Notion's ID property, \"TASK-42\"). The store keeps\n// the number (`config.system: autonumber`) and the prefix rides the column's display format\n// (`display_format: {id: \"autonumber\", options: {prefix}}`, judged by `custom._display_format_check`: up to\n// 16 characters on one line, never ending in a digit). The prefix is shown, copied and searched; the value\n// stays the number, so a sort and a filter stay numeric.\n\nimport type { CoercibleField } from \"./coerce\";\n\ntype WithFormat = CoercibleField & { display_format?: unknown; key?: string };\n\n/** Whether a Field is a record number. */\nexport function isAutonumberField(field: CoercibleField | null | undefined): boolean {\n  return String(((field?.config ?? {}) as Record<string, unknown>)[\"system\"] ?? \"\") === \"autonumber\";\n}\n\n/** A record number's prefix (\"TASK-\"), or \"\" when it has none or the Field is not a record number. */\nexport function autonumberPrefixOf(field: WithFormat | null | undefined): string {\n  if (!field || !isAutonumberField(field)) return \"\";\n  const shown = field.display_format;\n  const options = shown && typeof shown === \"object\" ? ((shown as { options?: unknown }).options as Record<string, unknown> | undefined) : undefined;\n  const prefix = options?.[\"prefix\"];\n  return typeof prefix === \"string\" ? prefix : \"\";\n}\n\n/** A record number as a person reads it: its prefix and the number (\"TASK-42\"); null when there is none. */\nexport function autonumberWords(field: WithFormat, value: unknown): string | null {\n  const n = typeof value === \"number\" ? value : typeof value === \"string\" && /^\\d+$/.test(value.trim()) ? Number(value) : NaN;\n  if (!Number.isFinite(n)) return null;\n  return `${autonumberJoin(autonumberPrefixOf(field))}${Math.trunc(n)}`;\n}\n\n/**\n * A prefix as it stands before its number (walk 2026-10-08 D4): \"TASK\" reads \"TASK-2\", as the\n * Prefix box's own placeholder promises; a prefix that already ends in a separator (\"TASK-\",\n * \"INV #\", \"PO/\") is kept as typed. The same rule as the grid's `autonumber` format\n * (@ai-matrx/design-system field-formats), so a card, a copy and a cell never disagree.\n */\nexport function autonumberJoin(prefix: string): string {\n  return prefix === \"\" || /[-_#.:/\\s]$/.test(prefix) ? prefix : `${prefix}-`;\n}\n\n/**\n * A SEARCH FOR A RECORD NUMBER BY ITS WORDS. \"TASK-42\", \"task-42\" or \"TASK 42\" names record 42 of the record\n * number whose prefix is \"TASK-\": the store keeps 42, so the words are turned into that column's number.\n * Null when the words name no record number of these Fields.\n */\nexport function autonumberSearchOf<F extends WithFormat>(fields: readonly F[], words: string): { field: F; number: number } | null {\n  const text = words.trim();\n  if (text === \"\") return null;\n  const squash = (s: string) => s.toLowerCase().replace(/[\\s\\-_#.:/]+/g, \"\");\n  for (const field of fields) {\n    const prefix = autonumberPrefixOf(field);\n    if (!prefix) continue;\n    const m = /^(.*?)(\\d+)$/.exec(text);\n    if (!m) continue;\n    if (squash(m[1]!) !== squash(prefix) || squash(prefix) === \"\") continue;\n    return { field, number: Number(m[2]) };\n  }\n  return null;\n}\n\n/**\n * A read's filter with \"this record number is N\" added (AND). The flat shape takes the column's key; a rule\n * expression is wrapped in an `and` with `{op: eq, args: [{field: id}, {const: N}]}`.\n */\nexport function filterWithAutonumber(\n  filter: Record<string, unknown> | null | undefined,\n  field: { id: string; key: string },\n  n: number,\n): Record<string, unknown> {\n  const eq = { op: \"eq\", args: [{ field: field.id }, { const: n }] };\n  if (!filter) return { [field.key]: n };\n  const isRule = typeof filter[\"op\"] === \"string\" && Array.isArray(filter[\"args\"]);\n  return isRule ? { op: \"and\", args: [filter, eq] } : { ...filter, [field.key]: n };\n}\n","// src/typedMatch.ts — @ai-matrx/records\n//\n// WHAT A PERSON TYPED INTO A PICKER'S SEARCH, AND WHICH ITEM THEY MEANT — ONE RANKING.\n//\n// 🚨 WHY THIS EXISTS (grids review 3, 2026-09-30). An equipment log's \"Service types\" offers\n// Electrical · Calibration · Filter change. The reviewer selected the cell and typed `Cal`; the list\n// kept the store's order and highlighted Electrical — \"Electri-CAL\" contains the letters — so Enter\n// wrote Electrical. Every picker filtered by \"contains\" and nothing ranked.\n//\n// THE RULE (Airtable, Linear, Notion, the macOS menu search): what a person types is the START of\n// what they mean. Items are ranked\n//   1. exact — the whole words, any case;\n//   2. starts with — `Cal` → Calibration;\n//   3. a word starts with — `change` → Filter change, `ray` → X-ray;\n//   4. contains — `cal` → Electrical, last;\n// and ties keep the list's own order (the order the column's owner wrote). Case and accents are\n// ignored (`jose` finds José). An item that does not match at all is not shown.\n//\n// ONE FUNCTION, EVERY PICKER: a single choice, several choices, a person and a linked record in\n// the record grids (@ai-matrx/records-ui), and the Sheet's choice list (matrx-frontend\n// `ChoiceInput`, whose list sorts by `typedMatchScore`). A second ranking anywhere is a fork.\n\n/** How well one text matches what was typed: 4 exact, 3 starts with, 2 a word starts with, 1 contains, 0 not at all. */\nexport type TypedMatchScore = 0 | 1 | 2 | 3 | 4;\n\nfunction fold(text: string): string {\n  return text\n    .normalize(\"NFD\")\n    .replace(/[̀-ͯ]/g, \"\")\n    .toLowerCase()\n    .replace(/\\s+/g, \" \")\n    .trim();\n}\n\n/** A word starts at the start, or after anything that is not a letter or a digit (space, `-`, `/`, `(`…). */\nfunction startsAWord(text: string, query: string): boolean {\n  let from = text.indexOf(query);\n  while (from > 0) {\n    if (!/[\\p{L}\\p{N}]/u.test(text.charAt(from - 1))) return true;\n    from = text.indexOf(query, from + 1);\n  }\n  return from === 0;\n}\n\n/**\n * How well `text` matches what was typed. An empty search matches everything at the lowest rank\n * that still shows (1), so an empty box lists every item in its own order.\n */\nexport function typedMatchScore(text: string, typed: string): TypedMatchScore {\n  const query = fold(typed);\n  if (query === \"\") return 1;\n  const words = fold(text);\n  if (words === query) return 4;\n  if (words.startsWith(query)) return 3;\n  if (startsAWord(words, query)) return 2;\n  if (words.includes(query)) return 1;\n  return 0;\n}\n\n/**\n * The items that match what was typed, best first; ties keep the given order. `textsOf` answers the\n * words an item is found by — its NAME first, then anything that tells two apart (a second line).\n * The name ranks at its full strength; a second line only ever finds an item (it ranks as\n * \"contains\"), so `Sun` puts Sunny Okafor before the Patricia Marsh who lives on Sunset Blvd.\n */\nexport function rankTypedMatches<T>(items: readonly T[], typed: string, textsOf: (item: T) => string | readonly string[]): T[] {\n  const scored: Array<{ item: T; score: number; at: number }> = [];\n  items.forEach((item, at) => {\n    const texts = textsOf(item);\n    let score = 0;\n    const list = typeof texts === \"string\" ? [texts] : texts;\n    list.forEach((text, i) => {\n      const own = typedMatchScore(text, typed);\n      score = Math.max(score, i === 0 ? own : Math.min(own, 1));\n    });\n    if (score > 0) scored.push({ item, score, at });\n  });\n  scored.sort((a, b) => b.score - a.score || a.at - b.at);\n  return scored.map((s) => s.item);\n}\n","// src/pipeline.ts — @ai-matrx/records · PRODUCTS row 7\n//\n// A PIPELINE IS NOT A NEW KIND OF THING, and this module adds none. A pipeline is a\n// Choice Field that a Table names as its STAGE field, plus transition Rules of the ONE\n// Rule object (REC-15) about that Table. A move is an ORDINARY record write: the validate\n// use judges it, History records it because it is a write, and the entry effects are the\n// applicability use's own declared consequence.\n//\n// SO THIS PACKAGE ENFORCES NOTHING. Every type below is the shape of a door's answer, and\n// every judgment comes from the store. A board that decided in the browser which column a\n// card may enter would be a second opinion with nothing keeping it equal to the first —\n// and it would be the comfortable one, because it is the one nobody can be refused by.\n\nimport type { Uuid } from \"./record\";\n\n/** One stage of a board: the KEY the store keeps, and the LABEL a person reads. */\nexport interface PipelineStage {\n  /** The option's stable key — what a cell holds, and what a move is written with. */\n  key: string;\n  /** What the column heading says. Renaming a stage rewrites no record. */\n  label: string;\n  /** A retired choice can still be READ on a record that holds it; it cannot be picked anew. */\n  retired: boolean;\n}\n\n/** What each Rule of a pipeline is about. Closed, and the store is the authority. */\nexport const PIPELINE_RULE_KINDS = [\"moves\", \"requires\", \"who\", \"limit\", \"entry\"] as const;\n/**\n * A GATE is the general form under `requires`, `who` and `limit`, and the store spells it\n * `gate:1`, `gate:2` … so several gates can sit on one stage without one overwriting the\n * next. It is matched as a prefix rather than listed, because the number is open.\n */\nexport type PipelineRuleKind = (typeof PIPELINE_RULE_KINDS)[number] | `gate:${number}`;\n\n/**\n * WHAT A GATE DOES WHEN IT SAYS NO. The closed list `custom.stage_rule_on_fail_kinds()`\n * answers — a screen offering a third answer would be offering something no Rule can carry.\n */\nexport const STAGE_RULE_ON_FAIL = [\"refuse\", \"require_approval\"] as const;\nexport type StageRuleOnFail = (typeof STAGE_RULE_ON_FAIL)[number];\n\n/**\n * THE ORGANIZATION'S ONE KNOB (`custom/stage_rule_enforcement`). `refuse` is the default and\n * what a gate is for; `warn` lets the move through and hands the same sentence back. It never\n * softens `require_approval` — \"ask somebody\" and \"carry on with a note\" are different answers.\n */\nexport const STAGE_RULE_ENFORCEMENT = [\"refuse\", \"warn\"] as const;\nexport type StageRuleEnforcement = (typeof STAGE_RULE_ENFORCEMENT)[number];\n\n/**\n * One transition Rule, as `custom.pipeline_read` hands it back — WITH the sentence it says\n * when it refuses, because a screen that knows a rule exists but not what it refuses in\n * cannot warn anybody before they drag.\n */\nexport interface PipelineRule {\n  id: Uuid;\n  name: string;\n  /** The exact words a person is shown when this Rule stops a move. */\n  message: string;\n  kind: PipelineRuleKind | null;\n  /** The stage this Rule is about; `null` on the one Rule about the moves themselves. */\n  stage: string | null;\n  uses: string[];\n  /** What happens when a card ARRIVES in this stage — assign, notify, start a checklist. */\n  on_entry: Record<string, unknown> | null;\n  /**\n   * What this Rule does when it STOPS a move. `refuse` is the default and what every\n   * pipeline Rule did before gates existed; `require_approval` files the change in the\n   * approvals queue with this Rule's sentence as the reason and leaves the record alone.\n   */\n  on_fail?: StageRuleOnFail;\n  /**\n   * THE GATE AS IT WAS WRITTEN, which is the only thing that makes it EDITABLE.\n   *\n   * A gate is saved as one Rule whose expression is an `or` of four arms — not this\n   * stage, OR not a move, OR the gate is not about this card, OR the demand holds. That\n   * compiled form used to be the only copy, so a settings screen could read a gate's name\n   * and its sentence and nothing else: it would open every existing rule with a blank\n   * condition and overwrite it the first time somebody pressed Save.\n   *\n   * Absent on the four sugar rules (`moves`, `requires`, `who`, `limit`), which nobody\n   * writes in a condition builder, and on any gate declared before the store started\n   * keeping them. Absent means \"this one was not written here\" — never \"it has no\n   * condition\", which is a different and dangerous thing to draw.\n   */\n  when?: Record<string, unknown> | null;\n  /** @see {@link PipelineRule.when} — the condition that has to hold, as it was written. */\n  demands?: Record<string, unknown> | null;\n  version: number;\n}\n\n/**\n * WHAT A GATE WOULD DO TO THIS BOARD TODAY, from `custom.pipeline_gate_preview`.\n *\n * The one question somebody writing a rule that will refuse their colleagues' work\n * actually has, answered while they are still typing it — the gate is judged as an\n * argument, nothing is saved, and nothing is written. The store compiles it with the\n * SAME compiler `pipeline_declare` uses, so this count and the refusal at the door are\n * the same rule.\n */\nexport interface PipelineGatePreview {\n  is_pipeline: boolean;\n  /** Present, and it says what would make a board exist, when `is_pipeline` is false. */\n  why?: string;\n  /** The stage key the gate was tried against. */\n  stage?: string;\n  /** Live cards of this board this person may see that are not already in that stage. */\n  considered: number;\n  /** How many of them this gate would turn away. */\n  refused: number;\n  /**\n   * Up to three of them, BY NAME. A count with no names is a number nobody can check, and\n   * checking it is the whole reason to show it before saving.\n   */\n  examples: { record_id: Uuid; title: string }[];\n  /** True when the board is larger than the preview will walk, so the count is a floor. */\n  truncated?: boolean;\n  on_fail?: StageRuleOnFail;\n  /** The word this board uses for one of its cards — \"quote\", \"deal\" — for the sentence. */\n  noun?: string;\n}\n\n/** The whole board's definition, from `custom.pipeline_read`. */\nexport interface Pipeline {\n  is_pipeline: boolean;\n  /** Present, and it says what would make a board exist, when `is_pipeline` is false. */\n  why?: string;\n  table_id?: Uuid;\n  /** The Field KEY that holds the stage — the twin of a Table's `type_field`. */\n  stage_field?: string;\n  field_id?: Uuid;\n  /** What that column is called, e.g. \"Stage\". */\n  stage_label?: string;\n  /** In the order they were declared, which is the order the board draws them. */\n  stages?: PipelineStage[];\n  rules?: PipelineRule[];\n}\n\n/** One column of the board, with the store's own numbers over what this person may see. */\nexport interface PipelineColumn {\n  stage_key: string;\n  stage_label: string;\n  /** 1-based, the declared order. */\n  stage_position: number;\n  cards: number;\n  /** The total of the chosen measure, or null when no measure was asked for. */\n  total: number | null;\n  /** How many cards this column takes at once, or null when it takes any number. */\n  wip_limit: number | null;\n  /** True when the column already holds MORE than its limit — a state a board must show. */\n  over_limit: boolean;\n}\n\n/** One column this stage demands before a card may land in it. */\nexport interface PipelineMissingField {\n  field_id: Uuid;\n  key: string;\n  /** What the column is called, so a screen can ASK for it rather than only refuse. */\n  label: string;\n}\n\n/**\n * Whether a card may go to a column, answered BEFORE the finger lets go — by the same\n * Rules, through the same evaluator, on the document the move WOULD produce.\n *\n * A board grays a column, and snaps a card back, from this. It never decides for itself.\n */\nexport interface PipelineVerdict {\n  allowed: boolean;\n  is_pipeline: boolean;\n  /**\n   * The THREE answers a board has to draw differently, and the reason `allowed` alone is\n   * not enough: a card that is going for approval has not been refused, and a card that\n   * moved under `warn` has not been waved through silently.\n   */\n  outcome?: \"allowed\" | \"refused\" | \"needs_approval\" | \"warned\";\n  /** What this organization's one knob says right now. */\n  enforcement?: StageRuleEnforcement;\n  /** Set on `needs_approval`: what pressing on will actually do, in plain words. */\n  what_happens?: string;\n  /** Set on `warned`: the gates this organization asked to be told about, not stopped by. */\n  warnings?: StageRuleWarning[];\n  /** Approvals already filed against this card's own stage column that nobody has decided. */\n  pending?: StagePending[];\n  /** The stage key the move was asked about. */\n  to?: string;\n  /** The store's own sentence — shown verbatim, never paraphrased by a screen. */\n  why: string;\n  rule?: string;\n  rule_id?: Uuid;\n  rule_version?: number;\n  kind?: PipelineRuleKind;\n  /** What this Rule does when it stops a move. */\n  on_fail?: StageRuleOnFail;\n  /**\n   * When a stage demands columns that are empty, exactly which ones — so the screen can\n   * prompt for them on entry instead of sending the person away to find them.\n   */\n  missing?: PipelineMissingField[];\n}\n\n/** What `custom.pipeline_declare` says it made or changed. */\nexport interface PipelineDeclared {\n  table_id: Uuid;\n  stage_field: string;\n  field_id: Uuid;\n  stages: string[];\n  rules: Record<string, Uuid>;\n  /** Plain sentences naming each thing this declaration wrote. */\n  said: string[];\n}\n\n/** The declaration a person (or an agent) writes. Everything is optional but the stages. */\nexport interface PipelineSpec {\n  stage_field: { key: string; label?: string; options?: string[]; sort?: number };\n  transitions?: { from: string; to: string }[];\n  /** Stage name → the column keys that must be filled in to land there. */\n  requires?: Record<string, string[]>;\n  /** Stage name → the rung somebody needs on the record to move a card INTO it. */\n  who?: Record<string, \"viewer\" | \"commenter\" | \"editor\" | \"admin\">;\n  /** Stage name → how many cards may sit there at once. The mover is not counted. */\n  limits?: Record<string, number>;\n  /** Stage name → what happens when a card arrives: assign, notify, start a checklist. */\n  on_entry?: Record<string, Record<string, unknown>>;\n  /**\n   * Stage name → the gates a card has to get past to land there. The general form under\n   * `requires`, `who` and `limits`, and the only one that can say `require_approval`.\n   */\n  gates?: Record<string, PipelineGate[]>;\n  moves_message?: string;\n  requires_messages?: Record<string, string>;\n}\n\n/**\n * A gate the organization's own knob overruled. NOTHING FAILS SILENTLY: the move happened\n * and the sentence comes back WITH it, together with what to do about it.\n */\nexport interface StageRuleWarning {\n  rule_id: Uuid;\n  rule: string;\n  /** The gate's own sentence, shown verbatim. */\n  why: string;\n  what_to_do: string;\n}\n\n/** An approval filed against this card's stage column that nobody has decided yet. */\nexport interface StagePending {\n  approval_id: Uuid;\n  /** The stage key the card is waiting to go to. */\n  to: string;\n  why: string | null;\n  requested_at: string;\n  state: string;\n}\n\n/**\n * The same wait, asked for a WHOLE BOARD in one question (`custom.pipeline_pending`), so a\n * board can badge every card that is waiting without a round trip per card — and therefore\n * actually does it, instead of drawing a filed card as if nobody had ever dragged it.\n */\nexport interface StagePendingOnBoard extends StagePending {\n  record_id: Uuid;\n}\n\n/** What `custom.pipeline_move` answers — an OBJECT on every path, never a bare number. */\nexport interface PipelineMoveResult {\n  applied: boolean;\n  moved: boolean;\n  outcome: \"moved\" | \"moved_with_warnings\" | \"needs_approval\";\n  to: string;\n  version: number;\n  /** Set on `moved_with_warnings`. */\n  warnings?: StageRuleWarning[];\n  /** Set on `needs_approval`: the gate's sentence, the wait that was filed, and who has it. */\n  why?: string;\n  rule?: string;\n  rule_id?: Uuid;\n  approval_id?: Uuid;\n  approvers?: { user_id: Uuid; name: string | null; why: string }[];\n  what_happens?: string;\n}\n\n/** One card of a batch move (`custom.pipeline_move_many`). The version is REQUIRED: it is the\n * version the board loaded, and a card that changed since answers `changed_since_loaded`. */\nexport interface PipelineMoveManyItem {\n  record_id: Uuid;\n  stage: string;\n  expected_version: number;\n  /** Columns the stage asks for, filled in on the way in. */\n  also?: Record<string, unknown>;\n}\n\n/** What one card of a batch move came to. The sentence is always the store's own. */\nexport type PipelineMoveVerdict =\n  | \"moved\"\n  | \"needs_approval\"\n  | \"needs_fields\"\n  | \"changed_since_loaded\"\n  | \"no_right\"\n  | \"refused\";\n\nexport interface PipelineMoveManyResult {\n  index: number;\n  record_id: Uuid;\n  stage: string;\n  verdict: PipelineMoveVerdict;\n  sentence: string;\n  /** Set on `needs_fields`: the empty columns the stage asks for. */\n  needs?: PipelineMissingField[];\n  /** Set on `moved` / `needs_approval`: the card's version now. */\n  version?: number;\n  /** Set on `changed_since_loaded`: the version that won. */\n  current_version?: number;\n  expected_version?: number;\n  approval_id?: Uuid;\n  approvers?: { user_id: Uuid; name: string | null; why: string }[];\n  warnings?: StageRuleWarning[];\n  rule?: string;\n  code?: string;\n}\n\n/** What `custom.pipeline_move_many` answers: the counts, then one verdict per card in order. */\nexport interface PipelineMoveMany {\n  asked: number;\n  moved: number;\n  needs_approval: number;\n  not_moved: number;\n  results: PipelineMoveManyResult[];\n}\n\n/**\n * ONE GATE ON A STAGE, as the condition builder on the stage settings screen writes it.\n * `requires`, `who` and `limits` are sugar over this shape; this is the general form, and\n * it speaks the SAME condition language as filters and formulas — never a second one.\n */\nexport interface PipelineGate {\n  /** What the gate is called in the settings list. */\n  name?: string;\n  /** The sentence a person reads when it stops them. Required: a refusal with no words is a dead end. */\n  message: string;\n  /** WHEN this gate is about this record at all. Absent means always. */\n  when?: Record<string, unknown>;\n  /** What has to hold. One condition node of the one Rule language. */\n  demands: Record<string, unknown>;\n  /** Default `refuse`. */\n  on_fail?: StageRuleOnFail;\n}\n\n/**\n * THE ONE PLACE A SCREEN DECIDES WHETHER A CARD LOOKS DRAGGABLE — and it decides on the\n * PERSON, not on the rules. Whether a particular move is allowed is\n * `pipelineTransitionRefusal`, which is the store's answer; whether this person may move\n * anything at all is their level on the record, which the read door already told us.\n *\n * Absent rather than dead: a viewer's card carries no drag handle at all, instead of one\n * that looks live and snaps back every time.\n */\nexport function mayDrag(level: string | null | undefined): boolean {\n  return level === \"editor\" || level === \"admin\" || level === \"owner\";\n}\n","// src/rule.ts — @ai-matrx/records\n//\n// THE RULE. REC-15 … REC-19. ONE object with FOUR uses — validate, compute,\n// define membership, decide applicability — and no fifth. A Rule references\n// Fields BY ID, never by name (REC-17), and it has versions, so History knows\n// which version produced a Value (REC-19).\n\nimport type { Timestamp, Uuid } from \"./record\";\nimport type { RuleNodeKind, RuleUse } from \"./vocabulary\";\n\n/**\n * A rule expression as `custom.rule_eval` ACTUALLY evaluates it — read off the\n * door's own body, not invented here. A leaf is the node's name carrying its\n * payload (`{\"const\": 3}`, `{\"field\": \"<uuid>\"}`); an operator is\n * `{\"op\": \"eq\", \"args\": [...]}`.\n *\n * `field` / `parent_field` name a Field BY ID (REC-17 — the door refuses\n * `field_name`, `field_key` and `field_label` by name), and `merge_field` is\n * the resolver's seam, storable today and refused `0A000` until W5-MERGE-B.\n *\n * `p_values` is keyed by the Field's KEY: the door resolves the id to a key\n * (`custom.rule_field_key`) and then reads `p_values -> key`.\n */\nexport type RuleExpression =\n  | { const: unknown }\n  | { field: Uuid }\n  | { parent_field: Uuid }\n  | { merge_field: string }\n  | { op: RuleNodeKind; args: RuleExpression[] };\n\n/** REC-15. One Rule, four uses; a Rule may serve more than one. */\nexport interface Rule {\n  id: Uuid;\n  organization_id: Uuid;\n  name: string;\n  kind: string | null;\n  /** The Table this Rule is scoped to. */\n  scope_table_id: Uuid | null;\n  uses: RuleUse[];\n  validates: boolean;\n  computes: boolean;\n  defines_membership: boolean;\n  /**\n   * REC-16. An applicability Rule reads the record's own Values and its\n   * parent's, ONE level up, and no further.\n   */\n  decides_applicability: boolean;\n  applies_to_types: string[];\n  use_types: string[];\n  expr: RuleExpression;\n  /** Which Field this Rule's answer is about (REC-17: by id). */\n  target_field_id: Uuid | null;\n  /** What a person reads when this Rule refuses. */\n  message: string | null;\n  sort: number | null;\n  created_by: Uuid | null;\n  updated_by: Uuid | null;\n  created_at: Timestamp;\n  updated_at: Timestamp;\n  /** REC-19. Rules have versions, and History knows which one produced a Value. */\n  version: number;\n  metadata: Record<string, unknown>;\n  visibility: string;\n}\n\n/** What the store answers when a Rule is run: the answer and the version that gave it. */\nexport interface RuleAnswer {\n  rule_id: Uuid;\n  rule_name: string;\n  rule_version: number;\n  applies: boolean;\n  answer: unknown;\n}\n\n// ── PRODUCTS row 1: a form is a VIEW ON A REAL TABLE ─────────────────────────\n//\n// A form lives beside the Rules because that is what it is MADE of: an accept\n// Rule decides what counts as a complete answer, and a subscription Rule (DOOR-18)\n// decides who hears about one. The questions are Fields of the subject Table and\n// the answers are ordinary records in it — there is no form silo anywhere.\n\n/** One form as `custom.forms` reports it to its owner. */\nexport interface FormSummary {\n  form_id: string;\n  table_id: string;\n  title: string | null;\n  slug: string;\n  published_at: string | null;\n  closed_at: string | null;\n  submission_cap: number | null;\n  /** Every answer that arrived, rejected ones excluded from `in_table` and `held`. */\n  responses: number;\n  /** Answers that became records — the only number that means \"it is in the table\". */\n  in_table: number;\n  /** Answers waiting for a person, because the form's accept Rule did not clear them. */\n  held: number;\n  /** Answers the accept Rule or the decoy turned away. */\n  rejected: number;\n  /** draft · open · closed · full — the store's own word, never derived on a screen. */\n  state: \"draft\" | \"open\" | \"closed\" | \"full\";\n  quarantine_rule_id: string | null;\n  notify_rule_id: string | null;\n  presentation: Record<string, unknown>;\n}\n\n/**\n * THE ROUTE THROUGH A FORM, AS THE STORE WALKED IT (lane TYPEFORM-DUP) — `custom._form_route`,\n * reached by the owner's preview (`custom.form_preview_route`) and the stranger's page\n * (`custom.form_public_route`). One row per question in order (`asked` false only when a condition\n * hid it or a logic jump carried the person past it); the ending reached (null = the thank-you\n * screen); the score (null when no question carries points).\n */\nexport interface FormRoute {\n  asks: Array<{ field_key: string; asked: boolean; decided: boolean; said: string | null }>;\n  ending: string | null;\n  score: number | null;\n}\n\n/** A form's results for its owner — `custom.form_results`. Every number is the store's. */\nexport interface FormResults {\n  form_id: string;\n  /** Visits to the public link (one per page open, counted through the app's own route). */\n  views: number;\n  /** Visits that answered at least one question. */\n  starts: number;\n  /** Submissions that arrived (the decoy's excluded). */\n  completions: number;\n  /** completions / starts, as a percentage with one decimal; null before anybody started. */\n  completion_rate: number | null;\n  questions: Array<{\n    field_key: string;\n    /** Visits that were shown this question. */\n    reached: number;\n    /** Visits whose last question was this one and that never sent: the drop-off. */\n    left: number;\n    /** Submissions that answered it. */\n    answered: number;\n    /** The twelve most common answers (a list answer counts each of its parts). */\n    answers: Array<{ value: string; count: number }>;\n  }>;\n  endings: Array<{ ending: string | null; count: number }>;\n  hidden: Array<{ key: string; value: string; count: number }>;\n  score: { count: number; average: number; min: number; max: number } | null;\n}\n\n/**\n * ONE BOOKING PAGE, AS ITS OWNER SEES IT — `custom.bookings` (PRODUCTS row 14).\n *\n * A booking page is an `anon_form` whose `presentation -> 'booking'` carries the\n * availability and the id of a slots Table, so it is the SAME object a form is and\n * this is the same list `forms()` is, asked for the booking half. The numbers are\n * the store's own: a screen that counted appointments in the browser would drift\n * from the index that actually protects a slot.\n */\nexport interface BookingSummary {\n  form_id: string;\n  /** The Table the appointments land in — a booking is an ordinary record in it. */\n  table_id: string;\n  title: string | null;\n  slug: string;\n  published_at: string | null;\n  closed_at: string | null;\n  /** How long one appointment is. The offer is the store's, never the browser's. */\n  slot_minutes: number;\n  /** The organization's own zone, which is what the visitor's times are drawn in. */\n  timezone: string;\n  /** The ONE slots Table `custom.booking_declare` finds-or-makes for this page. */\n  slot_table_id: string;\n  booked: number;\n  cancelled: number;\n  /** Booked and still ahead of now — the number that answers \"what is coming\". */\n  upcoming: number;\n  /** Slots a visitor is holding right now, before they have given their details. */\n  held: number;\n  /** The next appointment, or null when there is none. */\n  next_at: string | null;\n  /** draft · open · closed — the store's own word, never derived on a screen. */\n  state: string;\n}\n\n/**\n * ONE WINDOW OF AN ORGANIZATION'S WEEK, in the shape `custom._booking_availability`\n * normalizes to and `custom._booking_slots` generates from. `weekday` is 0 for Sunday\n * and 6 for Saturday — the database's own numbering, so a picker and the store cannot\n * disagree about which day Monday is. A window may name ONE member, which is the \"with\n * whom\" of an appointment; naming somebody who is not a member is refused BY NAME.\n */\nexport interface BookingWindow {\n  weekday: number;\n  /** \"09:00\" */\n  from: string;\n  /** \"17:00\" — later in the day than `from`, or the store refuses it by name. */\n  to: string;\n  member_user_id?: string | null;\n}\n\n/**\n * WHAT IS ON OFFER. Every field is the store's to default: a page declared with an\n * empty availability comes back with the organization's timezone, a 30-minute slot and\n * Monday-to-Friday nine-to-five, because a booking page that offered nothing would look\n * broken rather than unconfigured. A screen shows what came BACK, never what it sent.\n */\nexport interface BookingAvailability {\n  timezone: string;\n  slot_minutes: number;\n  /** Dead time kept after each appointment, so two never touch. */\n  buffer_minutes: number;\n  /** How far ahead of now the earliest bookable slot is. */\n  lead_minutes: number;\n  /** Most appointments in one day, across every window. */\n  max_per_day: number;\n  /** How many days ahead the page offers. */\n  days: number;\n  windows: BookingWindow[];\n  /** CD-PAGE-10: places at one time for each host (1 = one person per time; a class or group visit takes more). */\n  capacity?: number;\n  /** CD-PAGE-10: none, auto (a new meet.jit.si room per booking) or link (the owner's own room in `video_url`). */\n  video?: \"none\" | \"auto\" | \"link\";\n  video_url?: string;\n  /** CD-PAGE-10: the owner's private iCal address; its busy times are never offered. Owner-only — never in a public answer. */\n  busy_feed?: string;\n  /** CD-PAGE-10: when the connected calendar was last read, and why the last read failed (the last good list is kept). */\n  busy_read_at?: string | null;\n  busy_problem?: string | null;\n}\n\n/**\n * WHAT `custom.booking_declare` ANSWERS. `availability` is the NORMALIZED offer —\n * show that, not the draft — and `questions_filled_in` is how many questions the store\n * took over (`slot`, `status`, `booked_with`), which a visitor is never asked.\n *\n * It does NOT publish. `anonPublish` is still the one act that opens the link, exactly\n * as it is for a form, so there is one act and one word for opening a public surface.\n */\nexport interface BookingDeclared {\n  form_id: string;\n  slot_table_id: string;\n  availability: BookingAvailability;\n  questions_asked: number;\n  questions_filled_in: number;\n  ms: number;\n}\n\n/**\n * THE VISITOR'S OWN LINK to a booking page. The page id IS the capability, exactly\n * as it is for a form; `custom.anon_submission.booking_ref` is the separate secret\n * that lets ONE visitor manage the appointment they made.\n */\nexport function bookingPath(formId: string): string {\n  return `/b/${formId}`;\n}\n\n/**\n * THE PUBLIC LINK, and the one place its shape is written down.\n *\n * The form's own id IS the capability — 122 bits of UUIDv4, exactly as\n * Typeform's form id in `/to/<id>` is and as an unguessable meeting slug is\n * here. There is no second secret to keep, and revoking it is closing the form.\n */\nexport function publicFormPath(formId: string): string {\n  return `/f/${formId}`;\n}\n","// src/portal.ts — @ai-matrx/records\n//\n// THE CLIENT PORTAL, FROM THE OWNER'S SIDE.\n//\n// A portal is the one way somebody with no membership of an organization is\n// let in to see the records that name them — their jobs, their invoices —\n// and nothing else. The store holds it in three tables (`custom.portal`,\n// `custom.portal_table`, `custom.portal_principal`) and answers about it\n// through six doors. These are the shapes those doors answer with, written\n// from the doors' own bodies and never from a screen's convenience.\n//\n// TWO FACTS THIS FILE EXISTS TO KEEP STRAIGHT, because a screen that gets\n// either of them wrong tells somebody a comforting lie:\n//\n//   · AN INVITATION CONFERS NOTHING. `custom.portal_invite` writes a row and\n//     says so in its own `say` sentence: the person gets access the moment\n//     they follow the sign-in link and the platform gives them an identity,\n//     and until then the row holds nothing at all. That is why\n//     `PortalPrincipal` carries `signed_in` separately from `is_active` —\n//     \"invited\" and \"can see their records\" are two different states and one\n//     number for both is how an owner comes to believe a client is looking at\n//     something they cannot reach.\n//\n//   · \"VIEW AS THIS CLIENT\" IS NOT A PORTAL-SHAPED QUERY.\n//     `custom.portal_preview` asks `custom.visible_set` for HER user id — the\n//     exact call `custom.read_records` makes when she opens the page — so the\n//     preview cannot disagree with what she sees. When she has not signed in\n//     yet it REFUSES with `02000` and a sentence, rather than answering an\n//     empty list that would read as \"she sees nothing\".\n\nimport type { Timestamp, Uuid } from \"./record\";\n\n/** One portal as `custom.portals` reports it to its organization. */\nexport interface PortalSummary {\n  portal_id: Uuid;\n  title: string;\n  slug: string;\n  /** The Table whose records ARE the clients. A principal is one of its rows. */\n  client_table_id: Uuid;\n  /** That Table's name, so a list never has to read a second door to draw a row. */\n  client_table: string;\n  is_active: boolean;\n  /** How many Tables this portal exposes. */\n  tables: number;\n  /** Everybody invited and not revoked — NOT everybody who can see anything. */\n  invited: number;\n  /** Of those, how many have followed the link and hold an identity. */\n  signed_in: number;\n  /** `magic_link` today, and the door refuses every other word by name. */\n  sign_in_method: string;\n  opened_at: Timestamp | null;\n}\n\n/**\n * ONE (portal, Table) PAIR, as `custom.portal_tables` reports it.\n *\n * 🚨 WHY THIS EXISTS (TAILS-3, 2026-09-21). The Portals rail sits on a Table's\n * page beside Forms, Bookings and Dashboards — all table-scoped — while\n * `custom.portals` takes no table at all. On Rincon Plumbing Co's **Parts**\n * table the rail read \"Portals 10\" and listed ten cards titled \"Your jobs and\n * invoices\", which belong to **Jobs**; the empty state never rendered, so the\n * \"Build it / Ask an agent\" offer was unreachable on EVERY table of any\n * organization that already had one portal.\n *\n * This is the whole of what a table-scoped rail needs: is the table I am\n * standing on in any portal, and if not, which portals could take it.\n */\nexport interface PortalTableRef {\n  portal_id: Uuid;\n  table_id: Uuid;\n  /** That Table's name, so a rail never reads a second door to draw a row. */\n  name: string;\n}\n\n/** One Table a portal exposes, as `custom.portal_card` reports it. */\nexport interface PortalTableExposure {\n  table_id: Uuid;\n  /** The Table's own name. */\n  name: string;\n  /**\n   * The key of the relation Field that says WHOSE a record is. This is the\n   * whole of \"only theirs\": the association that Field writes is what carries\n   * the record to the client, so a portal cannot exist without one.\n   */\n  names_via: string;\n  /** The field keys a client sees. Empty is impossible — the door fills it. */\n  visible_fields: string[];\n  /** The subset a client may change. Always a subset of `visible_fields`. */\n  editable_fields: string[];\n  comments: boolean;\n  /**\n   * The most a client is ever conveyed on this Table — `viewer`, `commenter`\n   * or `editor` — worked out by the door from the two lists above, never by a\n   * screen.\n   */\n  conveys: string;\n}\n\n/** One person a portal was opened to, as `custom.portal_card` reports them. */\nexport interface PortalPrincipal {\n  principal_id: Uuid;\n  email: string;\n  /** The record of the client Table this person IS, for the portal's purposes. */\n  client_record_id: Uuid;\n  /** That record's title — what an owner calls this client. */\n  client: string;\n  /** They followed the link and hold an identity. Until then this is false. */\n  signed_in: boolean;\n  /** Not revoked. An invitation that was never followed is still active. */\n  is_active: boolean;\n  invited_at: Timestamp;\n  revoked_at: Timestamp | null;\n  /**\n   * THE LINK THE OFFICE COPIES FOR THIS PERSON — `/invitations/portal/accept/<token>`, the\n   * path `custom.portal_invite` handed back when they were asked, read off the same\n   * `iam.invitations` row and never re-templated.\n   *\n   * 🚨 `null` IS AN ANSWER, NOT AN ABSENCE, and a screen must say which. It is null when they\n   * have already followed the link, when the office took it back (a revoke withdraws the\n   * invitation in the same statement), when it has expired, or when they were let in through\n   * the server's own magic-link route, which binds without an invitation at all. In every one\n   * of those cases there is genuinely no link to copy — so draw a sentence, never a dead\n   * control. (TAILS-5, 2026-09-21; the gap PORTAL-BIND left named.)\n   */\n  accept_path: string | null;\n}\n\n/** Everything about ONE portal: what it shows, and who it was opened to. */\nexport interface PortalCard {\n  portal_id: Uuid;\n  title: string;\n  slug: string;\n  is_active: boolean;\n  sign_in_method: string;\n  client_table_id: Uuid;\n  tables: PortalTableExposure[];\n  principals: PortalPrincipal[];\n  /**\n   * Whether this organization's outside lane is open\n   * (`custom/external_principal_enabled`). Declaring a portal opens it; while\n   * it is false every door refuses an outsider BY NAME, and a screen that drew\n   * the people as reachable anyway would be lying about the one thing that\n   * decides whether they can sign in at all.\n   */\n  external_lane_open: boolean;\n  /** S6 — the look and forms exactly as the owner stored them (`{}` when none). */\n  config: PortalConfig;\n  /** S6 — the look as a client sees it: the portal's own values over the organization's brand. */\n  style: PortalStyle;\n  /** S6 — every form on the portal, in its order, with its title, Table and state. */\n  forms: PortalFormRef[];\n  /** S6 — the accent names a portal may carry (the design system's `STYLE_COLORS`). */\n  accents: PortalAccent[];\n  /**\n   * S6 — the pictures that could be this portal's logo: the organization's own PUBLIC pictures in\n   * Files, newest first. A private file is never offered, because the store would refuse it.\n   */\n  logo_candidates: PublicPicture[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// S6 — A PORTAL CARRIES ITS OWN LOOK AND ITS FORMS (UI-CHAMPIONS-PLAN rows 45, 46, 55)\n//\n// The look and the forms live on the portal's own record (`custom.portal.config`), written only\n// by `custom.portal_declare(… p_config)` and judged there: a logo must be a PUBLIC picture of this\n// organization's Files (a portal's logo is shown on its sign-in page, before anybody has signed\n// in), an accent is one of the design system's color names, and a form is refused unless its\n// answers land in a Table the portal shows. The organization's brand is the default, so a portal\n// with no look of its own is never blank — `from_organization` says which values came from there.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** The design system's color names (`STYLE_COLORS`), which is all an accent may be. */\nexport const PORTAL_ACCENTS = [\"slate\", \"green\", \"amber\", \"red\", \"blue\", \"violet\", \"teal\"] as const;\nexport type PortalAccent = (typeof PORTAL_ACCENTS)[number];\n\nexport function isPortalAccent(word: unknown): word is PortalAccent {\n  return typeof word === \"string\" && (PORTAL_ACCENTS as readonly string[]).includes(word);\n}\n\n/** One link in a portal's footer. The store takes only `https://`, `mailto:` and `tel:`. */\nexport interface PortalFooterLink {\n  label: string;\n  url: string;\n}\n\n/** A portal's look as the owner sets it. Every key is optional; absent means \"the organization's\". */\nexport interface PortalStyleInput {\n  display_name?: string | null;\n  welcome?: string | null;\n  logo_file_id?: Uuid | null;\n  accent?: PortalAccent | null;\n  footer_links?: PortalFooterLink[] | null;\n}\n\n/** One form on a portal, as the owner sets it. `order` is the position; `label` overrides the title. */\nexport interface PortalFormInput {\n  form_id: Uuid;\n  label?: string | null;\n  order?: number | null;\n}\n\n/**\n * What `portalDeclare({ config })` sends. A key given REPLACES that key; a key not given is KEPT;\n * `style: null` puts the organization's brand back and `forms: []` takes every form off.\n */\nexport interface PortalConfigInput {\n  style?: PortalStyleInput | null;\n  forms?: PortalFormInput[] | null;\n}\n\n/** The look and forms as the store holds them (normalized by the store). */\nexport interface PortalConfig {\n  style?: PortalStyleInput;\n  forms?: Array<{ form_id: Uuid; label?: string; order: number }>;\n}\n\n/** The look a client is shown — resolved by the store, never computed by a screen. */\nexport interface PortalStyle {\n  display_name: string;\n  welcome: string | null;\n  logo_file_id: Uuid | null;\n  /** The logo's PUBLIC address, or null. Readable by anybody the portal is shown to. */\n  logo_url: string | null;\n  /** Null means the app's own color. */\n  accent: PortalAccent | null;\n  footer_links: PortalFooterLink[];\n  /** MAKE-HOME W5 — a cover picture's PUBLIC address (a form's look carries one), or null. */\n  cover_file_id?: Uuid | null;\n  cover_url?: string | null;\n  /** Which of the values above came from the organization rather than the portal. */\n  from_organization: Array<\"display_name\" | \"logo\">;\n}\n\n/**\n * One of the organization's PUBLIC pictures (`custom._public_pictures`): the only pictures a\n * portal's logo or a form's logo and cover may be, because a stranger sees them before signing in.\n */\nexport interface PublicPicture {\n  file_id: Uuid;\n  name: string;\n  url: string | null;\n}\n\n/**\n * What a form's look editor needs (`custom.form_look_options`, MAKE-HOME W5b): the pictures the\n * store accepts, the colors, and the look a stranger would see for the draft presentation.\n */\nexport interface FormLookOptions {\n  pictures: PublicPicture[];\n  accents: PortalAccent[];\n  look: PortalStyle;\n}\n\n/** One form on a portal, with what the owner needs to see about it. */\nexport interface PortalFormRef {\n  form_id: Uuid;\n  /** What the portal calls it (the owner's label, else the form's title). */\n  label: string;\n  order: number;\n  title: string;\n  table_id: Uuid | null;\n  table: string;\n  /** `gone` is a form that was removed; the outsider's list only ever carries `open`. */\n  state: \"open\" | \"closed\" | \"full\" | \"gone\";\n}\n\n/** A Table's stages as a portal client may be told them (`custom.portal_me` → tables[].stage). */\nexport interface PortalStage {\n  /** The stage Field's key on the record. */\n  field: string;\n  label: string;\n  /** In the order they were declared. A record stores the stage's `key`. */\n  stages: Array<{ key: string; label: string; retired: boolean }>;\n}\n\n/** What `custom.portal_form` answers: one form on the caller's own portal. */\nexport interface PortalFormSpec {\n  form_id: Uuid;\n  portal_id: Uuid;\n  table_id: Uuid;\n  title: string;\n  label: string;\n  presentation: Record<string, unknown>;\n  /** The form's exposed Fields as the store holds them — never the one naming the client. */\n  fields: Array<Record<string, unknown> & { id: Uuid; key: string }>;\n  required: string[];\n  state: \"open\" | \"closed\" | \"full\";\n  message: string | null;\n}\n\n/** What `custom.portal_form_submit` answers. `held` waits for the office; `message` says so. */\nexport interface PortalFormAnswer {\n  submission_id: Uuid | null;\n  record_id: Uuid | null;\n  state: \"accepted\" | \"held\" | \"rejected\" | \"closed\" | \"full\" | \"too_many\";\n  message: string | null;\n}\n\n/** What `custom.portal_invite` answers. `say` is the door's own sentence. */\nexport interface PortalInvitation {\n  invited: boolean;\n  principal_id: Uuid;\n  portal_id: Uuid;\n  slug: string;\n  email: string;\n  client_record_id: Uuid;\n  client: string;\n  /** They already hold an identity. From a screen this is false: the door is passed no user. */\n  bound: boolean;\n  /**\n   * The door's own words, and the ONLY correct summary of what just happened —\n   * it says outright that an invitation confers nothing until the link is\n   * followed. Show it; never paraphrase it.\n   */\n  say: string;\n}\n\n/** What `custom.portal_revoke` answers. `say` names the consequence, past tense. */\nexport interface PortalRevocation {\n  revoked: boolean;\n  principal_id: Uuid;\n  email: string;\n  /** The door's own sentence: they can no longer sign in, and their records stop reaching them. */\n  say: string;\n}\n\n/** One row of \"what this client sees\", from `custom.portal_preview`. */\nexport interface PortalPreviewRow {\n  record_id: Uuid;\n  title: string;\n}\n\n/**\n * THE PUBLIC ADDRESS OF A PORTAL, and the one place its shape is written down.\n *\n * Unlike a form's link, a portal's slug is NOT the capability: the page it\n * serves asks who you are and emails a one-time link, so the slug is a name and\n * nothing more. That is why it is readable and why copying it is safe.\n */\nexport function portalPath(slug: string): string {\n  return `/portal/c/${slug}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// A PORTAL IS ARCHIVED, NEVER DELETED (ORG-CLEANUP, 2026-09-22)\n//\n// The store grew `custom.portal_archive`, `custom.portal_restore` and the\n// archive-aware `custom.list_portals` because Rincon Plumbing Co carried TEN\n// portals all titled \"Your jobs and invoices\" — nine of them the residue of one\n// walk repeated nine times — and there was no door to put any of them away.\n// `is_active = false` is not it: CLOSED is a state an organization chooses about\n// a portal it still has, and its clients are told so by name. ARCHIVED means it\n// is out of the way, and nothing is deleted: every exposed Table and every\n// invited person is handed back exactly as it was.\n//\n// These are the words a screen says about that, written once here so the rail,\n// the guard and any other client say the same thing.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * The platform archive filter's own three values, and no fourth. `custom.list_portals`\n * refuses anything else with `22023` rather than quietly treating it as one of them.\n */\nexport const PORTAL_ARCHIVE_FILTERS = [\"active\", \"archived\", \"all\"] as const;\nexport type PortalArchiveFilter = (typeof PORTAL_ARCHIVE_FILTERS)[number];\n\n/** THE LAW'S DEFAULT IS TO HIDE. A list nobody narrowed is the live things. */\nexport const DEFAULT_PORTAL_ARCHIVE_FILTER: PortalArchiveFilter = \"active\";\n\nexport function isPortalArchiveFilter(word: unknown): word is PortalArchiveFilter {\n  return typeof word === \"string\" && (PORTAL_ARCHIVE_FILTERS as readonly string[]).includes(word);\n}\n\n/** What `custom.portal_archive` and `custom.portal_restore` answer with. */\nexport interface PortalArchiveAnswer {\n  /** Where the portal stands NOW — true after an archive, false after a restore. */\n  archived: boolean;\n  /** False when it was already in that state; the sentence says so rather than lying about an act. */\n  changed: boolean;\n  portal_id: Uuid;\n  archived_at?: Timestamp | null;\n  /** The store's own sentence, in plain English. Show it verbatim; never a constraint name. */\n  sentence: string;\n}\n\n/**\n * THE CONSEQUENCE, SAID BEFORE THE CLICK — never a generic \"are you sure?\".\n *\n * What actually changes is two things: nobody can sign in to it any more, and it\n * leaves the organization's portal list. What does NOT change is everything\n * else, and saying so is the difference between an archive somebody dares to\n * press and one they avoid.\n */\nexport function portalArchiveConsequence(title: string, signedIn: number, invited: number): string {\n  const people =\n    invited === 0\n      ? \"Nobody is invited to it\"\n      : signedIn === 0\n        ? `The ${invited} ${invited === 1 ? \"person\" : \"people\"} invited to it will not be able to sign in`\n        : `The ${signedIn} ${signedIn === 1 ? \"person\" : \"people\"} signed in to it, and the ${invited - signedIn} still invited, will not be able to sign in`;\n  return (\n    `“${title}” will leave your portal list. ${people}, and their invitation links will say this ` +\n    `portal was archived and can be restored. Nothing is deleted — every Table it shows and ` +\n    `everyone invited to it is kept exactly as it is, and you can restore it at any time.`\n  );\n}\n\n/**\n * WHY THE TITLE HAS TO BE TYPED BACK, in the store's own reasoning. Ten portals\n * can carry one title, so the title is not what PICKS this one — the portal you\n * opened is. Typing it back is how you say you meant this one.\n */\nexport function portalConfirmLine(title: string): string {\n  return `Type the portal’s title — ${title} — to confirm you mean this one.`;\n}\n\n/** True when what the person typed is what the door will accept. The door decides; this only spares them a round trip. */\nexport function portalTitleTypedBack(typed: string, title: string): boolean {\n  return typed.trim() === (title ?? \"\").trim();\n}\n\n/**\n * WHAT AN EMPTY ARCHIVE LANE SAYS. An empty list is an answer: it says nothing\n * has been archived, so \"none here\" can never be read as \"the archive is broken\"\n * or as \"this organization has no portals at all\".\n */\nexport function emptyPortalArchiveLine(): string {\n  return \"No portal of this organization has been archived. A portal you put away waits here until somebody restores it, and nothing is ever destroyed.\";\n}\n","// src/rowControls.ts — @ai-matrx/records · ROW CONTROLS AND THE ARCHIVE OF WHAT IS BUILT ON A TABLE\n//\n// Lane MAKE-HOME wave 6a (2026-10-03). Two client halves of doors the chair landed:\n//\n//   · ROW CONTROLS (access ladder § Words, row layer): `custom.table_row_defaults(_set)`,\n//     `custom.table_row_defaults_apply`, `custom.record_row_controls(_set)`. A table names what its\n//     NEW rows start with (Arman 2026-10-02: auto-applied to every row, always overridable per row);\n//     \"Apply to existing rows\" moves the rows nobody set by hand. The web half (Published to the\n//     web, Indexed) answers `available: false` until its columns land — screens show it as a state.\n//\n//   · THE ARCHIVE OF FORMS, BOOKING PAGES AND CHECKLIST TEMPLATES: `custom.form_archive` /\n//     `custom.form_restore` / `custom.forms_archived` (a booking page is a form with a booking) and\n//     `custom.checklist_templates_archived` (a template is a record: `record_delete` archives it,\n//     `record_restore` brings it back). Delete means archive; every archive has a way back.\n//\n// The words are the access ladder's own (Only me · My team · Everyone · Everyone on AI Matrx) —\n// never coined here.\n\nimport type { Timestamp, Uuid } from \"./record\";\n\n/** The four values of \"Shown to\", in the ladder's order. */\nexport const SHOWN_TO_VALUES = [\"only_me\", \"my_team\", \"everyone\", \"everyone_on_ai_matrx\"] as const;\nexport type ShownTo = (typeof SHOWN_TO_VALUES)[number];\n\n/** THE WORDS (access ladder § Words, row \"Shown to\"). One label per value, used by every screen. */\nexport const SHOWN_TO_LABEL: Record<ShownTo, string> = {\n  only_me: \"Only me\",\n  my_team: \"My team\",\n  everyone: \"Everyone\",\n  everyone_on_ai_matrx: \"Everyone on AI Matrx\",\n};\n\nexport function isShownTo(word: unknown): word is ShownTo {\n  return typeof word === \"string\" && (SHOWN_TO_VALUES as readonly string[]).includes(word);\n}\n\n/**\n * Does a Table's Level give its records a \"Shown to\"? (Access ladder § Words: \"Private and\n * Confidential records have no 'Shown to'\".) Absent or unknown level = yes, as before. The ONE test\n * every screen asks before it draws the control, so a locked table never shows a control that does\n * not exist for it.\n */\nexport function levelHasShownTo(level: unknown): boolean {\n  const word = typeof level === \"string\" ? level.trim().toLowerCase() : \"\";\n  return word !== \"confidential\" && word !== \"private\";\n}\n\n/** What `custom.table_row_defaults` answers: the table's own choices, what applies, and what may change. */\nexport interface TableRowDefaults {\n  /** The table's own choice; null = the organization's default. */\n  shown_to: ShownTo | null;\n  published_to_web: boolean | null;\n  indexed: boolean | null;\n  effective: { shown_to: ShownTo; published_to_web: boolean; indexed: boolean };\n  allowed_shown_to: ShownTo[];\n  available: { shown_to: boolean; published_to_web: boolean; indexed: boolean };\n  can_change: boolean;\n}\n\n/** What `custom.table_row_defaults_set` takes. A key left out is left alone; null = back to the default. */\nexport interface TableRowDefaultsPatch {\n  shown_to?: ShownTo | null;\n  published_to_web?: boolean | null;\n  indexed?: boolean | null;\n}\n\n/** One pass of `custom.table_row_defaults_apply`. `done: false` → call again with `next_after`. */\nexport interface RowDefaultsApplied {\n  table_id: Uuid;\n  seen: number;\n  changed: number;\n  kept_by_hand: number;\n  done: boolean;\n  next_after: Uuid | null;\n  /** The store's own sentence. Show it verbatim. */\n  sentence: string;\n}\n\n/** What `custom.record_row_controls` answers for one row. */\nexport interface RecordRowControls {\n  shown_to: {\n    value: ShownTo | null;\n    effective: ShownTo;\n    type_default: ShownTo | null;\n    table_default: ShownTo | null;\n    allowed: ShownTo[];\n    is_child: boolean;\n    can_change: boolean;\n    legacy_only_me?: boolean;\n  };\n  published_to_web: { available: boolean; value: boolean; table_default: boolean | null; can_change: boolean };\n  indexed: {\n    available: boolean;\n    value: boolean | null;\n    table_default: boolean | null;\n    effective: boolean;\n    can_change: boolean;\n  };\n}\n\n/**\n * WHO MAY CHANGE A ROW'S \"Shown to\" (NOT its cells: a cell needs Editor on the table), in one sentence — the store's rung (`platform.shown_to_state`:\n * the person who made it, or someone with full access to it). Said where the control would be.\n */\nexport const SHOWN_TO_WHO_MAY_CHANGE = \"Only who added this row, or an admin, can change who sees it.\";\n\n/** The sentence beside the two web switches while the store does not carry them yet. */\nexport const ROW_WEB_NOT_READY = \"Not available for table rows yet.\";\n\n// ── The archive of what is built on a table ──────────────────────────────────\n\n/** What `custom.form_archive` and `custom.form_restore` answer with. */\nexport interface FormArchiveAnswer {\n  archived: boolean;\n  changed: boolean;\n  form_id: Uuid;\n  kind: \"form\" | \"booking\";\n  title: string | null;\n  archived_at?: Timestamp | null;\n  /** The store's own sentence. Show it verbatim. */\n  sentence: string;\n}\n\n/** One row of `custom.forms_archived` — a form or a booking page that was put away. */\nexport interface ArchivedForm {\n  form_id: Uuid;\n  table_id: Uuid;\n  table_name: string | null;\n  kind: \"form\" | \"booking\";\n  title: string | null;\n  slug: string;\n  archived_at: Timestamp;\n  archived_by: Uuid | null;\n  table_archived: boolean;\n  can_restore: boolean;\n}\n\n/** One row of `custom.checklist_templates_archived`. */\nexport interface ArchivedChecklistTemplate {\n  template_id: Uuid;\n  name: string | null;\n  about_table_id: Uuid | null;\n  about_table: string | null;\n  steps: number;\n  archived_at: Timestamp;\n  archived_by: Uuid | null;\n  table_archived: boolean;\n}\n\n/** What an archived form, booking page or checklist is called in a list. */\nexport const BUILT_KIND_WORD: Record<\"form\" | \"booking\" | \"checklist\", string> = {\n  form: \"Form\",\n  booking: \"Booking page\",\n  checklist: \"Checklist\",\n};\n","// src/automation.ts — @ai-matrx/records\n//\n// AUTOMATIONS ON A TABLE (lane AUTOMATION-DOOR, 2026-10-07): \"when this happens to a row of this table, do\n// these things\". Declared with one door (`custom.automation_declare`), stored in the Table record's\n// `automations` list, run from the store's own change feed. Fields are named by ID. The words for each part\n// are in FEATURE.md § Automations on a table.\n\nimport type { Uuid } from \"./record\";\n\n/** A value an action writes: a literal, or a reference the store resolves at run time. */\nexport type AutomationValue =\n  | string\n  | number\n  | boolean\n  | null\n  | { from: Uuid } // copy this property from the triggering row\n  | { now: true }\n  | { in_days: number } // that many days from the moment the automation runs (a date column keeps the person's day)\n  | { me: true }\n  | { clear: true }\n  | unknown[]\n  | Record<string, unknown>;\n\n/** `{ [field id]: value }` — every key is a live Field of the table the step writes to. */\nexport type AutomationValues = Record<Uuid, AutomationValue>;\n\n/** A filter in the store's one rule shape; inside an `edit_rows.where`, `{ trigger: <field id> }` means that value on the triggering row. */\nexport type AutomationFilter = Record<string, unknown>;\n\n/** Days of the week as the store counts them: 1 Monday … 7 Sunday. */\nexport type AutomationWeekday = 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\nexport type AutomationTrigger =\n  | { on: \"row_added\" }\n  | { on: \"property_edited\"; field: Uuid; to?: unknown }\n  | { on: \"form_answered\" }\n  /**\n   * AUTOMATIONS-AIRTABLE: Airtable's \"When record updated\" — any of `fields` edited (an empty list or none = any\n   * property).\n   */\n  | { on: \"record_updated\"; fields?: Uuid[] }\n  /**\n   * AUTOMATIONS-AIRTABLE: Airtable's \"When record matches conditions\" (the spec's `condition`, any depth) or, with\n   * `view_id`, \"When record enters view\" (that saved view's own filter, read at run time). Fires when a row COMES TO\n   * match — added matching, or edited from not matching to matching — never again while it stays matching.\n   */\n  | { on: \"record_matches\"; view_id?: Uuid }\n  /** AUTOMATIONS-AIRTABLE: a press of this button column (`custom.button_press`) on a row runs it on that row. */\n  | { on: \"button_pressed\"; field: Uuid }\n  /**\n   * AUTOMATION-TIME: a date or date-time property reaching now, `offset_days` before (negative) or after\n   * (positive), at `at` (HH:MM, default 09:00) in the person's own zone, else the organization's. Fires once per row\n   * per date value; the date changing re-arms it.\n   */\n  | { on: \"date_arrives\"; field: Uuid; offset_days?: number; at?: string }\n  /**\n   * AUTOMATION-TIME: the table acts with no row, every day / week (`weekday`) / month (`day`, 1-31, a short month\n   * runs on its last day) at `at`. `set`, a person property, `{from}` and `{trigger}` have no row to read and are\n   * refused; `add_row` is the repeating row and `edit_rows` the scheduled bulk edit.\n   */\n  | { on: \"schedule\"; every: \"day\" | \"week\" | \"month\"; at?: string; weekday?: AutomationWeekday; day?: number }\n  /**\n   * AT-AUTO2: every N minutes (5, 10, 15, 30) or every N hours (1, 2, 3, 4, 6, 8, 12) at `minute` past. Saved switched\n   * OFF; the person switches it on (no blind paid automations).\n   */\n  | { on: \"schedule\"; every: \"minutes\"; minutes: 5 | 10 | 15 | 30 }\n  | { on: \"schedule\"; every: \"hour\"; hours?: number; minute?: number }\n  /**\n   * AT-AUTO2: an inbound webhook. The store makes the automation's `webhook_secret`; the URL is\n   * `automationWebhookUrl(serverBase, automation)`. The JSON body is `{{trigger.body.…}}` to every step.\n   */\n  | { on: \"webhook\" }\n  /**\n   * W2-E: a new email in the OWNER's own connected Gmail matching `query` (Gmail search syntax; none = every new\n   * email). Like every connected-app trigger it has no row, is saved switched OFF, and once switched on the server\n   * checks the account on the automation's own personal schedule (`automationAppTriggerTerms`); each new item starts one\n   * run with the item as `{{trigger.body.…}}` (`subject`, `from`, `to`, `snippet`, `date`, `link`, `id`).\n   */\n  | { on: \"gmail_received\"; query?: string }\n  /**\n   * W2-E: an event on the owner's primary Google Calendar starts (`minutes_before` its start, 0-1440) or is created.\n   * `{{trigger.body.title}}`, `starts_at`, `ends_at`, `location`, `attendees`, `link`, `id`.\n   */\n  | { on: \"calendar_event\"; when?: \"starts\" | \"created\"; minutes_before?: number }\n  /**\n   * W2-E: a message posted in a Slack `channel` (optionally containing `contains`). The platform has no Slack sign-in\n   * yet, so the automation says so (`app_says`) until one exists.\n   */\n  | { on: \"slack_message\"; channel: string; contains?: string }\n  /**\n   * AT-MSFT: a new email in the owner's Outlook inbox, read through their own Microsoft connection (`Mail.ReadBasic`:\n   * envelopes only, never the body). `query` keeps it to `from:` / `subject:` terms and plain words (every term must\n   * match; none = every new email). `{{trigger.body.subject}}`, `from`, `from_name`, `to`, `received_at`, `link`, `id`.\n   */\n  | { on: \"outlook_received\"; query?: string };\n\n/** W2-E: the triggers that read the owner's connected account on a schedule (saved off; metered per check). */\nexport const AUTOMATION_APP_TRIGGERS = [\"gmail_received\", \"calendar_event\", \"slack_message\", \"outlook_received\"] as const;\nexport type AutomationAppTrigger = (typeof AUTOMATION_APP_TRIGGERS)[number];\nexport function isAutomationAppTrigger(on: string): on is AutomationAppTrigger {\n  return (AUTOMATION_APP_TRIGGERS as readonly string[]).includes(on);\n}\n\n/** W2-E: what one connected-app automation costs, read before switching it on (`GET /automations/app-triggers/terms`). */\nexport interface AutomationAppTriggerTerms {\n  every_minutes: number;\n  points_per_check: number;\n  checks_per_month: number;\n  points_per_month: number;\n  points_per_action: number;\n}\n\n/**\n * AT-AUTO2: a token a step's text or value may carry, resolved when the run reaches that step:\n * `{{trigger.<field key or id>}}`, `{{trigger.record_id}}`, `{{trigger.body.<path>}}`, `{{stepN.<path>}}`\n * (a find's `records` / `first` / `count` / `ids`, a script's `output.<key>`, an added row's `record_id`),\n * `{{item.<path>}}` / `{{index}}` inside a repeating group. A value that IS one token keeps its type (a list stays a list).\n */\nexport type AutomationToken = `{{${string}}}`;\n\n/** AT-AUTO2: one comparison of a conditional group's path. `value` / `to` take tokens. */\nexport interface AutomationComparison {\n  value: unknown;\n  is: \"equals\" | \"not_equals\" | \"contains\" | \"not_contains\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"empty\" | \"not_empty\" | \"is_true\";\n  to?: unknown;\n}\n\nexport type AutomationWhen = { all: AutomationComparison[] } | { any: AutomationComparison[] };\n\nexport type AutomationAction =\n  | { do: \"set\"; values: AutomationValues }\n  | { do: \"add_row\"; table_id: Uuid; values: AutomationValues }\n  | { do: \"edit_rows\"; table_id: Uuid; where: AutomationFilter; values: AutomationValues; limit?: number }\n  | { do: \"notify\"; to: { person: Uuid } | { field: Uuid } | { author: true }; text: string; subject?: string; link?: string }\n  | { do: \"webhook\"; url: string }\n  /**\n   * AUTOMATIONS-AIRTABLE: an email through the platform's notification sender (event `custom.automation.email`) to an\n   * address, a member, the address (or person) in a property of the row, or the automation's author. `subject` and\n   * `body` take field tokens: `{Field name}` or `{{<field id>}}`. Nothing queued = the step fails and says why.\n   */\n  | { do: \"email\"; to: { address: string } | { person: Uuid } | { field: Uuid } | { author: true }; subject: string; body: string }\n  /** AUTOMATIONS-AIRTABLE: a Slack incoming webhook (`https://hooks.slack.com/...`), message with field tokens. */\n  | { do: \"slack\"; url: string; text: string }\n  | { do: \"agent\"; prompt: string }\n  /** AT-AUTO2: records of a table matching a filter (tokens allowed in `const`s); later steps read `{{stepN.records}}`. */\n  | { do: \"find\"; table_id: Uuid; where?: AutomationFilter; limit?: number }\n  /** AT-AUTO2: change the named records (one id, a list, `{{stepN.records}}`, `{{item.id}}`). */\n  | { do: \"update\"; table_id: Uuid; record: string | string[]; values: AutomationValues }\n  /** AT-AUTO2: Airtable's \"delete record\" — we archive (restorable), never hard delete. */\n  | { do: \"archive\"; record: string | string[]; table_id?: Uuid }\n  /**\n   * AT-AUTO2: JavaScript run by the server in the owner's own sandbox (never in the API process): `input` is\n   * `inputs` resolved, `output.set(key, value)` answers `{{stepN.output.key}}`, console lines land in the run.\n   * Metered to points. On a time trigger it is saved switched off.\n   */\n  | { do: \"script\"; code: string; inputs?: Record<string, unknown>; timeout_ms?: number; memory_mb?: number }\n  /** AT-AUTO2: if / else if / else — the first path whose `when` holds runs its steps; else `else`. */\n  | { do: \"if\"; branches: { label?: string; when: AutomationWhen; actions: AutomationAction[] }[]; else?: AutomationAction[] }\n  /**\n   * W2-E: open an issue in `repo` (owner/name) through the owner's own GitHub connection; `labels` comma-separated.\n   * Answers `{{stepN.output.number}}` / `.url`. A retry answers the same issue. Metered per issue.\n   */\n  | { do: \"github_issue\"; repo: string; title: string; body?: string; labels?: string }\n  /**\n   * MS-WRITE: send one Outlook email as the owner (`Mail.Send`, approved once under Settings -> Integrations -> Microsoft).\n   * `outlook_calendar_event` creates / changes / cancels an event on the owner's calendar (`Calendars.ReadWrite`; a retried\n   * create is the same event); `teams_message` posts in the channel named by a Teams \"Get link to channel\" link\n   * (`ChannelMessage.Send`) or in the chat named by a chat message's \"Copy link\" (`ChatMessage.Send`, AT-MSFT); work or\n   * school accounts. Each is metered per action at `automation.app_action_points`.\n   */\n  | { do: \"outlook_mail\"; to: string; subject: string; body: string }\n  | {\n      do: \"outlook_calendar_event\";\n      action?: \"create\" | \"update\" | \"cancel\";\n      event_id?: string;\n      title?: string;\n      starts_at?: string;\n      ends_at?: string;\n      duration_minutes?: number;\n      timezone?: string;\n      attendees?: string;\n      description?: string;\n      notify?: boolean;\n    }\n  | { do: \"teams_message\"; channel_link: string; message: string }\n  /**\n   * AT-SLACK: post one message in a Slack channel (name like `general` or an ID like `C0123ABC`) AS the owner, through\n   * their own Slack sign-in (Settings -> Integrations -> Slack, user scope `chat:write`). Sent once; answers\n   * `{{stepN.output.ts}}` / `.channel`. Metered per message at `automation.app_action_points`. The `slack` step\n   * (an incoming-webhook URL) is separate and unchanged.\n   */\n  | { do: \"slack_post\"; channel: string; message: string }\n  /** AT-AUTO2: repeat `actions` for each item of a list token (at most 200 items). */\n  | { do: \"for_each\"; list: string; actions: AutomationAction[] };\n\nexport interface AutomationSpec {\n  name: string;\n  trigger: AutomationTrigger;\n  /** An optional filter on the triggering row. */\n  condition?: AutomationFilter | null;\n  actions: AutomationAction[];\n}\n\n/** `custom.automation_declare`: stored, or refused with one sentence per path (`trigger`, `actions.0.values.<field>` …). */\nexport type AutomationDeclared =\n  | {\n      ok: true;\n      automation_id: Uuid;\n      table_id: Uuid;\n      enabled: boolean;\n      spec: AutomationSpec;\n      /**\n       * AUTOMATIONS-AIRTABLE: true when the trigger is a time and a step is an agent — AI on a schedule is saved\n       * switched OFF and turned on only by `automationSetEnabled`; `says` is the store's sentence.\n       */\n      ai_on_schedule?: boolean;\n      says?: string;\n      reused?: boolean;\n    }\n  | { ok: false; _errors: Record<string, string> };\n\nexport type AutomationRunStatus = \"ran\" | \"failed\" | \"stopped\" | \"waiting\";\n\nexport interface AutomationLastRun {\n  run_id: Uuid;\n  status: AutomationRunStatus;\n  at: string;\n  says: string | null;\n}\n\nexport interface AutomationItem {\n  id: Uuid;\n  /** AT-AUTO2: a webhook automation's secret, part of its URL. */\n  webhook_secret?: string | null;\n  /** AT-AUTO2: the last payload its webhook received (its test run uses it). */\n  webhook_sample?: { body: unknown; at: string } | null;\n  /** W2-E: a connected-app trigger's last check, and why it could not read the account (null = it could). */\n  app_checked_at?: string | null;\n  app_says?: string | null;\n  /** W2-E: the last item a connected-app trigger handed to a run. */\n  app_sample?: { body: unknown; at: string } | null;\n  name: string;\n  spec: AutomationSpec;\n  enabled: boolean;\n  archived_at?: string | null;\n  /** AUTOMATIONS-AIRTABLE: why the store switched it off (a watched view was removed); cleared when switched on. */\n  disabled_reason?: string | null;\n  created_by?: Uuid | null;\n  created_at?: string;\n  updated_at?: string;\n  last_run: AutomationLastRun | null;\n}\n\nexport interface AutomationList {\n  table_id: Uuid;\n  automations: AutomationItem[];\n}\n\n/** archive / restore / set_enabled. */\nexport interface AutomationFlipped {\n  ok: true;\n  automation_id: Uuid;\n  table_id: Uuid;\n  enabled: boolean;\n  archived_at: string | null;\n}\n\nexport interface AutomationStep {\n  n: number;\n  do: AutomationAction[\"do\"];\n  /** AT-AUTO2: the repeat round (0-based) a step inside a repeating group ran in. */\n  index?: number;\n  /** AT-AUTO2: a script's console lines. */\n  logs?: string[];\n  /** AT-AUTO2: a server step's answer, as text. */\n  output_text?: string;\n  found?: number;\n  status: \"done\" | \"failed\" | \"waiting\";\n  /** The store's own words. */\n  says: string;\n  hint?: string | null;\n  record_id?: Uuid;\n  edited?: number;\n  prompt?: string;\n}\n\nexport interface AutomationRun {\n  run_id: Uuid;\n  status: AutomationRunStatus;\n  says: string | null;\n  record_id: Uuid | null;\n  trigger: {\n    /** `test` for a test run (`of` is the automation's own trigger), `button_pressed` for a press. */\n    on: AutomationTrigger[\"on\"] | \"test\";\n    /** AT-AUTO2: a webhook's payload. */\n    body?: unknown;\n    of?: AutomationTrigger[\"on\"];\n    /** A test run: whether the row met the condition (null = it could not be worked out). */\n    condition_met?: boolean | null;\n    operation: string;\n    via: string | null;\n    changed_field_ids: Uuid[];\n    /** A time trigger's own facts: the moment it was due, and (date arrives) the date it read. */\n    fires_at?: string;\n    date_value?: string;\n    every?: \"day\" | \"week\" | \"month\";\n  } | null;\n  steps: AutomationStep[];\n  started_at: string | null;\n  finished_at: string | null;\n  ran_by: Uuid | null;\n  at: string;\n}\n\nexport interface AutomationRuns {\n  automation_id: Uuid;\n  runs: AutomationRun[];\n  /** Pass back as `cursor` for the next, older page; null at the end. */\n  next_cursor: string | null;\n}\n\n/** AUTOMATIONS-AIRTABLE: `custom.automation_test` — one run now on a picked row (none for a schedule), on or off. */\nexport interface AutomationTested {\n  ok: true;\n  run_id: Uuid;\n  automation_id: Uuid;\n  record_id: Uuid | null;\n  status: AutomationRunStatus;\n  says: string | null;\n  steps: AutomationStep[];\n  condition_met: boolean | null;\n}\n\n/** AT-AUTO2: `custom.automation_revisions` — every save of one automation, newest first. */\nexport interface AutomationRevision {\n  revision_id: Uuid;\n  at: string;\n  by: Uuid | null;\n  note: \"created\" | \"edited\";\n  enabled: boolean;\n  spec: AutomationSpec;\n}\n\nexport interface AutomationRevisions {\n  automation_id: Uuid;\n  table_id: Uuid;\n  revisions: AutomationRevision[];\n}\n\n/** AT-AUTO2: the public URL of a webhook automation (null until the store made its secret). */\nexport function automationWebhookUrl(serverBase: string, item: Pick<AutomationItem, \"id\" | \"webhook_secret\">): string | null {\n  if (!item.webhook_secret) return null;\n  return `${serverBase.replace(/\\/+$/, \"\")}/api/automations/hooks/${item.id}/${item.webhook_secret}`;\n}\n","// src/base.ts — @ai-matrx/records · lane AT-BASE\n//\n// A BASE is a Home's group of tables (custom.table.home_id) with an identity (custom.base: name, icon, color, description).\n// This file is the whole-base verbs, built ONLY from doors that already exist — never a second copy engine:\n//\n//   duplicateBase   every table of the Home, one at a time through the per-table door (`tableDuplicate`, which loops its own\n//                   passes until \"done\"), then ONE finishing call (`custom.base_copy_finish`) that points the copies' link\n//                   columns and link cells at each other, then ONE call (`custom.copy_table_extras`) that carries each table's\n//                   automations (OFF) and pages onto its copy. With or without records.\n//   snapshotBase    a snapshot is that same copy, with records, put away (archived: out of every list, restorable).\n//   restoreSnapshot a restore is a copy OF the put-away copies into a NEW base: nothing is ever overwritten.\n//\n// The verbs take a port, so a host binds them to the live client and a test binds them to a recording one.\n// Import-inert: types and functions, no side effects.\n\nimport type { RecordsResult } from \"./results\";\nimport type { TableDuplicated, TableDuplicateProgress } from \"./placement\";\nimport type { Uuid } from \"./record\";\n\nexport interface BaseTable {\n  id: Uuid;\n  name: string;\n}\n\nexport interface BasePort {\n  /** `RecordsClient.tableDuplicate`: one table, with its own passes looped until done. */\n  tableDuplicate(args: {\n    tableId: Uuid;\n    withRecords?: boolean;\n    name?: string | null;\n    organizationId?: Uuid | null;\n    onProgress?: (progress: TableDuplicateProgress) => void;\n  }): Promise<RecordsResult<TableDuplicated>>;\n  /** `custom.base_copy_finish`: {old table id: its copy's id} → how many link columns and cells now point inside the copy. */\n  finish(args: { organizationId: Uuid; pairs: Record<Uuid, Uuid> }): Promise<RecordsResult<{ relinked_columns: number; relinked_cells: number }>>;\n  /**\n   * `custom.copy_table_extras`: {source table id: its copy's id} → the automations (switched OFF) and pages every copy now carries,\n   * with the copy's own column and view ids. THE ONE home of that step — the base-move job in aidream calls the same function.\n   */\n  copyTableExtras(args: { organizationId: Uuid; pairs: Record<Uuid, Uuid> }): Promise<RecordsResult<{ automations: number; pages: number; extras_refused: string[] }>>;\n  /** `RecordsClient.tableArchive` / its restore: put a copy away, or bring it back to be copied from. */\n  archive?(tableId: Uuid): Promise<RecordsResult<unknown>>;\n  unarchive?(tableId: Uuid): Promise<RecordsResult<unknown>>;\n  /** The door that makes a table's Home today (`declareTable`): a new record \"<name>\" in the person kernel. A NEW base is a new Home. */\n  createHome?(name: string): Promise<RecordsResult<Uuid>>;\n  /** The one door that moves a table between Homes: `custom.record_reparent` (`RecordsClient.recordReparent`). Pages and automations ride on their table. */\n  moveInto?(tableId: Uuid, homeId: Uuid): Promise<RecordsResult<unknown>>;\n}\n\nexport interface BaseCopyProgress {\n  /** 1-based position of the table being copied, and how many there are. */\n  at: number;\n  of: number;\n  tableName: string;\n  pass: TableDuplicateProgress | null;\n}\n\nexport interface BaseCopied {\n  /** The NEW Home every copied table now lives in (a copy is its own base); null when the port cannot make Homes. */\n  homeId: Uuid | null;\n  /** Source table id → its copy. */\n  pairs: Record<Uuid, Uuid>;\n  tables: Array<{ from: BaseTable; copy: BaseTable; records: number }>;\n  relinkedColumns: number;\n  relinkedCells: number;\n  /** Automations copied (every one OFF) and pages copied, with every table id inside them pointing at the copies. */\n  automations: number;\n  pages: number;\n  /** One sentence per automation or page that could not be copied. */\n  extrasRefused: string[];\n  /** What a copy never carries, from the per-table door's own words, once per table. */\n  notCopied: string[];\n}\n\nexport type BaseCopyResult =\n  | { ok: true; data: BaseCopied }\n  /**\n   * The table it stopped at; the copies made before it are named so they can be opened or archived.\n   * `strayCopyId`: the store made a copy of `stoppedAt` before the refusal (a pass failed, or its\n   * answer could not be read), so a table exists that `made` does not name — null when none did.\n   */\n  | { ok: false; error: unknown; stoppedAt: BaseTable; made: BaseCopied[\"tables\"]; strayCopyId: Uuid | null };\n\n/** The copy a `tableDuplicate` refusal says the store had already made (`detail.copyId`), or null. */\nexport function copyIdOfRefusal(error: unknown): Uuid | null {\n  const detail = (error as { detail?: unknown } | null)?.detail;\n  const id = detail && typeof detail === \"object\" ? (detail as { copyId?: unknown }).copyId : undefined;\n  return typeof id === \"string\" && id ? id : null;\n}\n\n/** \"Harbor Studio (copy)\", the same word the table dialog offers. */\nexport function baseCopyName(name: string): string {\n  return `${name.trim() || \"Base\"} (copy)`;\n}\n\n/** \"Harbor Studio (restored 10/15/2026)\". */\nexport function restoredBaseName(name: string, on: string): string {\n  return `${name.trim() || \"Base\"} (restored ${on})`;\n}\n\n/** Duplicate every table of a base. `names` (by source table id) overrides the \"<name>\" a copy is given. */\nexport async function duplicateBase(\n  port: BasePort,\n  args: {\n    organizationId: Uuid;\n    tables: readonly BaseTable[];\n    withRecords: boolean;\n    /** The copy's name for each table; default the source's own name (the copies live together in the new base). */\n    nameFor?: (table: BaseTable) => string;\n    onProgress?: (p: BaseCopyProgress) => void;\n    /** Put the copies in a NEW Home with this name (a base is a Home); absent keeps each copy where the per-table door put it. */\n    homeName?: string;\n  },\n): Promise<BaseCopyResult> {\n  const made: BaseCopied[\"tables\"] = [];\n  const pairs: Record<Uuid, Uuid> = {};\n  const notCopied = new Set<string>();\n  for (const [i, table] of args.tables.entries()) {\n    const res = await port.tableDuplicate({\n      tableId: table.id,\n      withRecords: args.withRecords,\n      organizationId: args.organizationId,\n      name: args.nameFor ? args.nameFor(table) : table.name,\n      onProgress: (pass) => args.onProgress?.({ at: i + 1, of: args.tables.length, tableName: table.name, pass }),\n    });\n    if (!res.ok) return { ok: false, error: res.error, stoppedAt: table, made, strayCopyId: copyIdOfRefusal(res.error) };\n    pairs[table.id] = res.data.table.id;\n    made.push({ from: table, copy: res.data.table, records: res.data.copied.records });\n    for (const n of res.data.notCopied) notCopied.add(n);\n  }\n  // Links BETWEEN the copied tables now point at each other; links to a table outside the base stay as they were.\n  const fin = args.tables.length > 1 ? await port.finish({ organizationId: args.organizationId, pairs }) : null;\n  if (fin && !fin.ok) return { ok: false, error: fin.error, stoppedAt: args.tables[args.tables.length - 1] as BaseTable, made, strayCopyId: null };\n  let homeId: Uuid | null = null;\n  if (args.homeName && port.createHome && port.moveInto) {\n    const home = await port.createHome(args.homeName);\n    if (!home.ok) return { ok: false, error: home.error, stoppedAt: args.tables[args.tables.length - 1] as BaseTable, made, strayCopyId: null };\n    homeId = home.data;\n    for (const m of made) {\n      const moved = await port.moveInto(m.copy.id, homeId);\n      if (!moved.ok) return { ok: false, error: moved.error, stoppedAt: m.from, made, strayCopyId: null };\n    }\n  }\n  const copied = await port.copyTableExtras({ organizationId: args.organizationId, pairs });\n  // A refusal of the step itself is said in the result, never dropped: the tables are copied, their extras are not.\n  const extras = copied.ok\n    ? { automations: copied.data.automations, pages: copied.data.pages, extrasRefused: copied.data.extras_refused }\n    : { automations: 0, pages: 0, extrasRefused: [`The automations and pages could not be copied: ${sentence(copied.error)}`] };\n  return {\n    ok: true,\n    data: {\n      homeId,\n      pairs,\n      tables: made,\n      relinkedColumns: fin?.ok ? fin.data.relinked_columns : 0,\n      relinkedCells: fin?.ok ? fin.data.relinked_cells : 0,\n      ...extras,\n      notCopied: [...notCopied],\n    },\n  };\n}\n\nfunction sentence(error: unknown): string {\n  const m = (error as { message?: unknown } | null)?.message;\n  return typeof m === \"string\" && m ? m : \"the store gave no reason.\";\n}\n\nexport interface BaseSnapshotRecord {\n  label: string;\n  origin: \"manual\" | \"schedule\";\n  /** Source table → the put-away copy that holds its columns, views and records as they were. */\n  tables: Array<{ table_id: Uuid; snapshot_table_id: Uuid; name: string; records: number }>;\n}\n\n/** Take a snapshot: copy every table WITH records, then put each copy away so no list shows it. */\nexport async function snapshotBase(\n  port: BasePort,\n  args: { organizationId: Uuid; tables: readonly BaseTable[]; label: string; origin?: \"manual\" | \"schedule\"; onProgress?: (p: BaseCopyProgress) => void },\n): Promise<\n  | { ok: true; snapshot: BaseSnapshotRecord }\n  /** `leftInLists`: copies that could NOT be put away (each still in the lists) — empty when the failure left nothing behind. */\n  | { ok: false; error: unknown; stoppedAt: BaseTable; leftInLists: Uuid[] }\n> {\n  const copied = await duplicateBase(port, {\n    organizationId: args.organizationId,\n    tables: args.tables,\n    withRecords: true,\n    nameFor: (t) => `Snapshot ${args.label} · ${t.name}`,\n    ...(args.onProgress ? { onProgress: args.onProgress } : {}),\n  });\n  if (!copied.ok) {\n    // A half snapshot is never left in the lists — including the copy the store finished (or half\n    // made) for the table it stopped at, which `made` does not name (W4 walk, 2026-10-18: every\n    // press left a 1,200-row \"Snapshot …\" table in the person's list).\n    const ids = [...copied.made.map((m) => m.copy.id), ...(copied.strayCopyId ? [copied.strayCopyId] : [])];\n    return { ok: false, error: copied.error, stoppedAt: copied.stoppedAt, leftInLists: await putAway(port, ids) };\n  }\n  const left = await putAway(port, copied.data.tables.map((t) => t.copy.id));\n  if (left.length > 0) {\n    const firstLeft = copied.data.tables.find((t) => t.copy.id === left[0]);\n    return {\n      ok: false,\n      error: new Error(`${left.length === 1 ? \"A snapshot copy\" : `${left.length} snapshot copies`} could not be put away and still show in your lists.`),\n      stoppedAt: firstLeft?.from ?? copied.data.tables[0]!.from,\n      leftInLists: left,\n    };\n  }\n  return {\n    ok: true,\n    snapshot: {\n      label: args.label,\n      origin: args.origin ?? \"manual\",\n      tables: copied.data.tables.map((t) => ({ table_id: t.from.id, snapshot_table_id: t.copy.id, name: t.from.name, records: t.records })),\n    },\n  };\n}\n\n/** Archive every id; answers the ones still in the lists (no archive door, or the store refused). */\nasync function putAway(port: BasePort, ids: readonly Uuid[]): Promise<Uuid[]> {\n  const left: Uuid[] = [];\n  for (const id of ids) {\n    const away = port.archive ? await port.archive(id) : undefined;\n    if (!away || !away.ok) left.push(id);\n  }\n  return left;\n}\n\n/** Restore a snapshot as a NEW base: each put-away copy is brought back, copied under its own name, and put away again. */\nexport async function restoreSnapshot(\n  port: BasePort,\n  args: { organizationId: Uuid; snapshot: BaseSnapshotRecord; baseName?: string; restoredOn?: string; onProgress?: (p: BaseCopyProgress) => void },\n): Promise<BaseCopyResult> {\n  const sources = args.snapshot.tables.map((t) => ({ id: t.snapshot_table_id, name: t.name }));\n  const byCopy = new Map(args.snapshot.tables.map((t) => [t.snapshot_table_id, t.name]));\n  for (const s of sources) await port.unarchive?.(s.id);\n  const out = await duplicateBase(port, {\n    organizationId: args.organizationId,\n    tables: sources,\n    withRecords: true,\n    nameFor: (t) => `${byCopy.get(t.id) ?? t.name} (restored)`,\n    homeName: restoredBaseName(args.baseName ?? \"Base\", args.restoredOn ?? new Date().toLocaleDateString()),\n    ...(args.onProgress ? { onProgress: args.onProgress } : {}),\n  });\n  for (const s of sources) await port.archive?.(s.id); // the snapshot stays a snapshot, whatever happened\n  return out;\n}\n","// src/capture-queue.ts — @ai-matrx/records · PRODUCTS row 15, primitive P13\n//\n// THE QUEUE THAT MAKES A PHONE WITH NO BARS AS GOOD AS A PHONE WITH FIVE.\n//\n// Fulcrum's field client is the bar: a crew captures all day in a yard with no signal and\n// nothing is lost, nothing is doubled, and nobody has to think about it. Four decisions\n// carry that, and each one is a thing this file refuses to do rather than a feature:\n//\n// 1. THE CAPTURE IS WRITTEN TO DISK BEFORE THE NETWORK IS EVEN ASKED. `enqueue` returns\n//    after IndexedDB has the answers AND the photograph's bytes. A queue that holds\n//    captures in memory until it can send them loses the day when the screen locks.\n//\n// 2. THE IDEMPOTENCY KEY IS MINTED WHEN THE CAPTURE IS TAKEN, NOT WHEN IT IS SENT. It is\n//    the row's own primary key here and `p_client_key` at the door. A lost acknowledgement\n//    — the commonest failure on a bad signal, because the write SUCCEEDED and the answer\n//    never came back — is then a replay that returns the first record's id, not a second\n//    bin.\n//\n// 3. THEY GO UP IN THE ORDER THEY HAPPENED, ONE AT A TIME. A crew's day is a sequence and\n//    a foreman reads it as one. Parallel uploads would also mean six photographs sharing\n//    one thin signal and all six timing out.\n//\n// 4. A REFUSAL IS NOT A RETRY. A required answer missing, a field the sheet does not ask\n//    for, a level the person does not hold — the door has decided, and sending it again\n//    every thirty seconds forever is how a queue becomes a silent hole. The item stays,\n//    marked `refused`, carrying the door's own sentence for the screen to show. The person\n//    fixes it or throws it away; nothing decides that for them.\n//\n// The bytes never go through this file twice: `uploadFile` is called once per file and its\n// reference is written back into the queued row, so a retry after a failed SUBMIT re-sends\n// the reference rather than the photograph.\n\nimport type { CaptureFileRef, CaptureOutcome } from \"./capture\";\n\n/** One file waiting to go up, with its bytes until they have. */\nexport interface QueuedCaptureFile {\n  field: string;\n  name: string;\n  mime_type: string;\n  size_bytes: number;\n  duration_ms?: number | null | undefined;\n  /** The bytes. Dropped once `uploaded` is set, so the queue does not hold them twice. */\n  blob?: Blob | null | undefined;\n  /** Set once the platform's byte store has them. */\n  uploaded?: { file_id?: string | null | undefined; url?: string | null | undefined } | null | undefined;\n}\n\n/** `waiting` → `sending` → `landed`, or `refused` when the door has decided. */\nexport type QueuedCaptureState = \"waiting\" | \"sending\" | \"landed\" | \"refused\";\n\nexport interface QueuedCapture {\n  /** Minted on the phone when the capture was taken. The row's key AND the door's. */\n  client_key: string;\n  organization_id: string;\n  sheet_id: string;\n  sheet_title?: string | undefined;\n  answers: Record<string, unknown>;\n  files: QueuedCaptureFile[];\n  device: string | null;\n  /** The moment the PHONE took it — never the moment the signal came back. */\n  captured_at: string;\n  location: Record<string, unknown> | null;\n  state: QueuedCaptureState;\n  attempts: number;\n  /** The door's own words, or the network's. Always something a person can act on. */\n  last_error: string | null;\n  record_id: string | null;\n  replayed: boolean;\n  queued_at: string;\n  landed_at: string | null;\n}\n\nexport interface CaptureQueueCounts {\n  waiting: number;\n  sending: number;\n  refused: number;\n  landed: number;\n}\n\n/** What one pass of `sync` did, item by item. Never a single boolean. */\nexport interface CaptureSyncReport {\n  attempted: number;\n  landed: number;\n  replayed: number;\n  refused: number;\n  deferred: number;\n  outcomes: Array<{\n    client_key: string;\n    state: QueuedCaptureState;\n    record_id: string | null;\n    replay: boolean;\n    says: string | null;\n  }>;\n  /** Set when the pass stopped early because the network went away again. */\n  stopped_because?: string;\n}\n\n/** The two calls the queue makes on the outside world. Injected, so this file is headless. */\nexport interface CaptureQueuePorts {\n  /** Put the bytes in the platform's ONE byte store and answer with the reference. */\n  uploadFile(\n    file: QueuedCaptureFile,\n    item: QueuedCapture,\n  ): Promise<{ file_id?: string | null; url?: string | null }>;\n  /** `client.captureSubmit`. */\n  submit(args: {\n    sheet_id: string;\n    client_key: string;\n    answers: Record<string, unknown>;\n    files: CaptureFileRef[];\n    device?: string | null;\n    captured_at?: string | null;\n    location?: Record<string, unknown> | null;\n  }): Promise<{ ok: boolean; data?: CaptureOutcome | null; error?: { message?: string; code?: string } | null }>;\n}\n\n/** The smallest store the queue needs. IndexedDB in a browser, a Map in a test. */\nexport interface CaptureQueueStore {\n  all(): Promise<QueuedCapture[]>;\n  put(item: QueuedCapture): Promise<void>;\n  remove(clientKey: string): Promise<void>;\n  meta(key: string): Promise<string | null>;\n  setMeta(key: string, value: string): Promise<void>;\n}\n\nconst DB_NAME = \"matrx-capture\";\nconst DB_VERSION = 1;\nconst ITEMS = \"captures\";\nconst META = \"meta\";\n\n/**\n * THE TWO REFUSALS WORTH REPEATING, and they are the package's own list, not a guess.\n * `results.ts` says it in as many words: `stale_read` (40001) and `timed_out` (57014) are\n * \"the only two refusals in this list worth repeating\"; `store_limit` (53400) is the third\n * — the store ran out of something and the same call works in a quieter moment.\n *\n * EVERYTHING ELSE THE DOOR NAMES IS A DECISION. This was the other way round until a real\n * browser ran it (2026-09-20): the check listed SQLSTATEs, and `RecordsClient` hands back\n * its own WORD — `invalid_argument`, `door` — with the sqlstate beside it. So a capture the\n * store had refused by name was filed as a hiccup and queued again forever, which is the\n * exact silent hole this file's decision 4 exists to prevent. The unit suite passed because\n * it fed the check SQLSTATEs: it was testing the assumption, not the client.\n */\nexport const REFUSALS_WORTH_REPEATING: ReadonlySet<string> = new Set([\n  \"stale_read\", \"timed_out\", \"store_limit\",\n]);\nconst SQLSTATES_WORTH_REPEATING: ReadonlySet<string> = new Set([\"40001\", \"57014\", \"53400\"]);\n\n/**\n * Did the door DECIDE, or did the attempt merely fail? A failure with no code at all is a\n * network failure and waits; a refusal the store named is a decision and stays.\n */\nexport function isDecided(\n  error: { code?: string | null; sqlstate?: string | null } | null | undefined,\n): boolean {\n  if (!error) return false;\n  const { code, sqlstate } = error;\n  if (code && REFUSALS_WORTH_REPEATING.has(code)) return false;\n  if (sqlstate && SQLSTATES_WORTH_REPEATING.has(sqlstate)) return false;\n  return !!(code || sqlstate);\n}\n\n/**\n * A key that is unique on a phone that has been offline for a day and has never spoken to\n * a server. `crypto.randomUUID` where it exists; otherwise random bytes, and only then the\n * clock — because two captures in the same millisecond on two phones is exactly the case\n * that must not collide.\n */\nexport function mintClientKey(): string {\n  const c: Crypto | undefined = typeof crypto !== \"undefined\" ? crypto : undefined;\n  if (c && typeof c.randomUUID === \"function\") return `cap-${c.randomUUID()}`;\n  if (c && typeof c.getRandomValues === \"function\") {\n    const b = c.getRandomValues(new Uint8Array(16));\n    return `cap-${Array.from(b, (x) => x.toString(16).padStart(2, \"0\")).join(\"\")}`;\n  }\n  return `cap-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;\n}\n\n/** The IndexedDB store. Returns null where there is no IndexedDB at all. */\nexport function indexedDbStore(name = DB_NAME): CaptureQueueStore | null {\n  const idb: IDBFactory | undefined =\n    typeof globalThis !== \"undefined\" ? (globalThis as { indexedDB?: IDBFactory }).indexedDB : undefined;\n  if (!idb) return null;\n\n  const open = (): Promise<IDBDatabase> =>\n    new Promise((resolve, reject) => {\n      const req = idb.open(name, DB_VERSION);\n      req.onupgradeneeded = () => {\n        const db = req.result;\n        if (!db.objectStoreNames.contains(ITEMS)) db.createObjectStore(ITEMS, { keyPath: \"client_key\" });\n        if (!db.objectStoreNames.contains(META)) db.createObjectStore(META);\n      };\n      req.onsuccess = () => resolve(req.result);\n      req.onerror = () => reject(req.error);\n    });\n\n  const run = <T>(store: string, mode: IDBTransactionMode, fn: (s: IDBObjectStore) => IDBRequest<T>): Promise<T> =>\n    open().then(\n      (db) =>\n        new Promise<T>((resolve, reject) => {\n          const tx = db.transaction(store, mode);\n          const req = fn(tx.objectStore(store));\n          req.onsuccess = () => resolve(req.result);\n          req.onerror = () => reject(req.error);\n          tx.oncomplete = () => db.close();\n        }),\n    );\n\n  return {\n    all: () => run<QueuedCapture[]>(ITEMS, \"readonly\", (s) => s.getAll() as IDBRequest<QueuedCapture[]>),\n    put: (item) => run<IDBValidKey>(ITEMS, \"readwrite\", (s) => s.put(item)).then(() => undefined),\n    remove: (key) => run<undefined>(ITEMS, \"readwrite\", (s) => s.delete(key)).then(() => undefined),\n    meta: (key) => run<string | undefined>(META, \"readonly\", (s) => s.get(key) as IDBRequest<string | undefined>)\n      .then((v) => v ?? null),\n    setMeta: (key, value) =>\n      run<IDBValidKey>(META, \"readwrite\", (s) => s.put(value, key)).then(() => undefined),\n  };\n}\n\n/** The in-memory store — for a test, and for a browser with storage switched off. */\nexport function memoryStore(): CaptureQueueStore {\n  const rows = new Map<string, QueuedCapture>();\n  const meta = new Map<string, string>();\n  return {\n    all: async () => Array.from(rows.values()),\n    put: async (item) => void rows.set(item.client_key, item),\n    remove: async (key) => void rows.delete(key),\n    meta: async (key) => meta.get(key) ?? null,\n    setMeta: async (key, value) => void meta.set(key, value),\n  };\n}\n\nexport interface CaptureQueueOptions {\n  ports: CaptureQueuePorts;\n  store?: CaptureQueueStore | null;\n  /** Watch `online` and drain when the signal comes back. Default true in a browser. */\n  autoSync?: boolean;\n  /** Told when anything changes, so a badge can say how many are waiting. */\n  onChange?: (counts: CaptureQueueCounts, items: QueuedCapture[]) => void;\n  now?: () => Date;\n}\n\nexport interface CaptureQueue {\n  /** Write one capture to disk. Returns its client key; the network is not asked here. */\n  enqueue(input: {\n    organization_id: string;\n    sheet_id: string;\n    sheet_title?: string;\n    answers: Record<string, unknown>;\n    files?: Array<Omit<QueuedCaptureFile, \"uploaded\">>;\n    device?: string | null;\n    captured_at?: string | null;\n    location?: Record<string, unknown> | null;\n    client_key?: string;\n  }): Promise<string>;\n  list(): Promise<QueuedCapture[]>;\n  counts(): Promise<CaptureQueueCounts>;\n  /** Send everything waiting, oldest first, one at a time. Safe to call at any moment. */\n  sync(): Promise<CaptureSyncReport>;\n  /** Try one refused item again — after the person has fixed what the door named. */\n  retry(clientKey: string, patch?: { answers?: Record<string, unknown> }): Promise<void>;\n  /** Throw one away. The only thing that ever removes a capture nobody sent. */\n  discard(clientKey: string): Promise<void>;\n  /** Forget what has already landed. Never touches anything still waiting. */\n  clearLanded(): Promise<number>;\n  lastSyncedAt(): Promise<string | null>;\n  isOnline(): boolean;\n  dispose(): void;\n}\n\nfunction countOf(items: QueuedCapture[]): CaptureQueueCounts {\n  const c: CaptureQueueCounts = { waiting: 0, sending: 0, refused: 0, landed: 0 };\n  for (const i of items) c[i.state] += 1;\n  return c;\n}\n\nexport function openCaptureQueue(opts: CaptureQueueOptions): CaptureQueue {\n  const now = opts.now ?? (() => new Date());\n  const store = opts.store ?? indexedDbStore() ?? memoryStore();\n  let syncing: Promise<CaptureSyncReport> | null = null;\n  let disposed = false;\n\n  const online = (): boolean => {\n    const nav = typeof navigator !== \"undefined\" ? navigator : undefined;\n    return nav ? nav.onLine !== false : true;\n  };\n\n  const announce = async () => {\n    if (!opts.onChange) return;\n    const items = await store.all();\n    opts.onChange(countOf(items), items);\n  };\n\n  const oldestFirst = (items: QueuedCapture[]) =>\n    items.slice().sort((a, b) => a.captured_at.localeCompare(b.captured_at));\n\n  const queue: CaptureQueue = {\n    async enqueue(input) {\n      const key = input.client_key ?? mintClientKey();\n      const item: QueuedCapture = {\n        client_key: key,\n        organization_id: input.organization_id,\n        sheet_id: input.sheet_id,\n        sheet_title: input.sheet_title,\n        answers: input.answers ?? {},\n        files: (input.files ?? []).map((f) => ({ ...f, uploaded: null })),\n        device: input.device ?? null,\n        captured_at: input.captured_at ?? now().toISOString(),\n        location: input.location ?? null,\n        state: \"waiting\",\n        attempts: 0,\n        last_error: null,\n        record_id: null,\n        replayed: false,\n        queued_at: now().toISOString(),\n        landed_at: null,\n      };\n      await store.put(item);\n      await announce();\n      return key;\n    },\n\n    list: () => store.all().then(oldestFirst),\n    counts: () => store.all().then(countOf),\n\n    async sync() {\n      if (syncing) return syncing;\n      syncing = (async (): Promise<CaptureSyncReport> => {\n        const report: CaptureSyncReport = {\n          attempted: 0, landed: 0, replayed: 0, refused: 0, deferred: 0, outcomes: [],\n        };\n        const pending = oldestFirst(await store.all()).filter((i) => i.state === \"waiting\" || i.state === \"sending\");\n        if (!online()) {\n          report.deferred = pending.length;\n          report.stopped_because = \"There is no signal, so nothing was sent. Everything is still here.\";\n          return report;\n        }\n\n        for (const item of pending) {\n          report.attempted += 1;\n          item.state = \"sending\";\n          item.attempts += 1;\n          await store.put(item);\n          await announce();\n\n          try {\n            // THE BYTES FIRST, AND ONLY ONCE. A file whose reference is already written\n            // back is not uploaded again, so a failure at the SUBMIT step does not send\n            // the photograph twice.\n            for (const f of item.files) {\n              if (f.uploaded) continue;\n              f.uploaded = await opts.ports.uploadFile(f, item);\n              f.blob = null;\n              await store.put(item);\n            }\n\n            const refs: CaptureFileRef[] = item.files.map((f) => ({\n              field: f.field,\n              name: f.name,\n              mime_type: f.mime_type,\n              size_bytes: f.size_bytes,\n              duration_ms: f.duration_ms ?? null,\n              file_id: f.uploaded?.file_id ?? null,\n              url: f.uploaded?.url ?? null,\n            }));\n\n            const res = await opts.ports.submit({\n              sheet_id: item.sheet_id,\n              client_key: item.client_key,\n              answers: item.answers,\n              files: refs,\n              device: item.device,\n              captured_at: item.captured_at,\n              location: item.location,\n            });\n\n            if (res.ok && res.data && res.data.record_id) {\n              item.state = \"landed\";\n              item.record_id = res.data.record_id;\n              item.replayed = !!res.data.replay;\n              item.landed_at = now().toISOString();\n              item.last_error = null;\n              report.landed += 1;\n              if (item.replayed) report.replayed += 1;\n              report.outcomes.push({\n                client_key: item.client_key, state: item.state,\n                record_id: item.record_id, replay: item.replayed,\n                says: res.data.message ?? null,\n              });\n            } else if (res.ok && res.data && !res.data.record_id) {\n              // The door answered in words — closed, not open yet. It is not a failure of\n              // this phone and it is not something a retry loop can fix.\n              item.state = \"refused\";\n              item.last_error = res.data.message ?? `This sheet is ${res.data.state}.`;\n              report.refused += 1;\n              report.outcomes.push({\n                client_key: item.client_key, state: item.state, record_id: null,\n                replay: false, says: item.last_error,\n              });\n            } else if (isDecided(res.error)) {\n              item.state = \"refused\";\n              item.last_error = res.error?.message ?? \"The store refused this capture.\";\n              report.refused += 1;\n              report.outcomes.push({\n                client_key: item.client_key, state: item.state, record_id: null,\n                replay: false, says: item.last_error,\n              });\n            } else {\n              item.state = \"waiting\";\n              item.last_error = res.error?.message ?? \"It could not be sent just now.\";\n              report.deferred += 1;\n              report.outcomes.push({\n                client_key: item.client_key, state: item.state, record_id: null,\n                replay: false, says: item.last_error,\n              });\n            }\n          } catch (err) {\n            // A thrown error is the NETWORK, not a decision: it waits.\n            item.state = \"waiting\";\n            item.last_error =\n              err instanceof Error ? err.message : \"It could not be sent just now.\";\n            report.deferred += 1;\n            report.outcomes.push({\n              client_key: item.client_key, state: item.state, record_id: null,\n              replay: false, says: item.last_error,\n            });\n          }\n\n          await store.put(item);\n          await announce();\n\n          if (!online()) {\n            report.stopped_because =\n              \"The signal went away again. Everything still on the phone is still here.\";\n            break;\n          }\n        }\n\n        await store.setMeta(\"last_synced_at\", now().toISOString());\n        return report;\n      })();\n      try {\n        return await syncing;\n      } finally {\n        syncing = null;\n      }\n    },\n\n    async retry(clientKey, patch) {\n      const items = await store.all();\n      const item = items.find((i) => i.client_key === clientKey);\n      if (!item) return;\n      if (patch?.answers) item.answers = { ...item.answers, ...patch.answers };\n      item.state = \"waiting\";\n      item.last_error = null;\n      await store.put(item);\n      await announce();\n    },\n\n    async discard(clientKey) {\n      await store.remove(clientKey);\n      await announce();\n    },\n\n    async clearLanded() {\n      const items = await store.all();\n      const landed = items.filter((i) => i.state === \"landed\");\n      for (const i of landed) await store.remove(i.client_key);\n      await announce();\n      return landed.length;\n    },\n\n    lastSyncedAt: () => store.meta(\"last_synced_at\"),\n    isOnline: online,\n\n    dispose() {\n      disposed = true;\n      if (typeof window !== \"undefined\" && handler) window.removeEventListener(\"online\", handler);\n    },\n  };\n\n  let handler: (() => void) | null = null;\n  const auto = opts.autoSync ?? typeof window !== \"undefined\";\n  if (auto && typeof window !== \"undefined\") {\n    handler = () => {\n      if (!disposed) void queue.sync();\n    };\n    window.addEventListener(\"online\", handler);\n  }\n\n  return queue;\n}\n","// src/objectOrganization.ts — @ai-matrx/records (HEADLESS)\n//\n// WHICH ORGANIZATION OWNS THIS RECORD — READ FROM THE OBJECT, NEVER FROM THE PERSON (lane ACCESS-IS-PERSONAL;\n// moved from the website's features/unified-data/objectOrganization.ts, step 10, 2026-10-08).\n//\n// Every store door takes an organization and checks it first. An object page must hand the doors the\n// organization the OBJECT lives in, never the one the person picked: `custom.where_id_opens(p_id)` — the\n// store's one door that reads an object's organization from its own id (table, record, dashboard, digest,\n// form, booking, portal, rendered document) — answers only when the person could already open it.\n//\n// IT IS A PORT. `RecordOrganizationPort` is what `createRecords` accepts; `whereIdOpensPort(dataSource)` is\n// the default (one door call per ask). A host that keeps answers across remounts or seeds them from a server\n// render (the website's kept-answer store) supplies its own implementation over the same reader.\n//\n// THE ANSWER IS THE PERSON'S. Zero rows means \"not given to you\" and \"not there\" alike; \"we could not ask\"\n// is a third answer and is never folded into either. No stand-in: a miss says so and the page holds.\n\nimport type { RecordsDataSource } from \"./ports\";\nimport { mapPgError, mapThrownError } from \"./core/pgError\";\n\n/** What kind of object the id is, as `custom.where_id_opens` names it — carried as the door's own word. */\nexport type ObjectKind = string;\n\nexport type ObjectOrganizationAnswer =\n  /** The store named the object's organization, and the person may open the object. */\n  | {\n      state: \"found\";\n      organizationId: string;\n      kind: ObjectKind;\n      /** The screen the store says opens it (`/data/<table>?record=…`), or null for a part with none. */\n      path: string | null;\n      /** False when it is in the trash — the person may still open it, to bring it back. */\n      live: boolean;\n      /** The id it answers as — a merged record's survivor. */\n      resolvedId: string;\n      /** A table only: how many rows THIS person sees, capped at `rows_visible_cap` (200) — a loading frame's height. Absent when not asked/known. */\n      rowsVisible?: number;\n      /**\n       * A table only: the layout it opens in and, when that view groups by a Field (a board), the cards each group\n       * holds (largest first; counted over at most `cap` rows, a several-choice card in each of its groups).\n       */\n      opening?: OpeningViewShape;\n    }\n  /** Not given to this person — or not there at all. The store does not say which, on purpose. */\n  | { state: \"not-given\" }\n  /** We could not ask. NOT an answer about the person's access. */\n  | { state: \"unavailable\"; why: string };\n\n/** Which organization owns an object — the port `createRecords({ organizationOf })` accepts. */\nexport interface RecordOrganizationPort {\n  organizationOf(id: string): Promise<ObjectOrganizationAnswer>;\n}\n\n/** What the store says of the layout a table opens in — enough to size a board's or a gallery's loading frame. */\nexport interface OpeningViewShape {\n  layout?: string;\n  groupField?: string;\n  /** Cards per group, largest first. */\n  groups?: number[];\n  cap: number;\n}\n\n/** Reads `opening_view` of the door's answer; anything malformed is no shape at all. */\nexport function readOpeningViewShape(raw: unknown): OpeningViewShape | undefined {\n  if (!raw || typeof raw !== \"object\") return undefined;\n  const o = raw as { layout?: unknown; group_field?: unknown; groups?: unknown; cap?: unknown };\n  const groups = Array.isArray(o.groups) ? o.groups.filter((n): n is number => typeof n === \"number\" && Number.isFinite(n) && n >= 0) : undefined;\n  const shape: OpeningViewShape = {\n    cap: typeof o.cap === \"number\" && o.cap > 0 ? o.cap : 200,\n    ...(typeof o.layout === \"string\" ? { layout: o.layout } : {}),\n    ...(typeof o.group_field === \"string\" ? { groupField: o.group_field } : {}),\n    ...(groups ? { groups } : {}),\n  };\n  return shape.layout === undefined && shape.groupField === undefined && shape.groups === undefined ? undefined : shape;\n}\n\ninterface WhereIdOpens {\n  kind?: unknown;\n  organization_id?: unknown;\n  path?: unknown;\n  live?: unknown;\n  resolved_id?: unknown;\n  rows_visible?: unknown;\n  opening_view?: unknown;\n}\n\nexport const WHERE_ID_OPENS_DOOR = \"where_id_opens\";\n\nfunction doorIsAbsent(error: { code?: string | null; message?: string | null }): boolean {\n  if (error.code === \"PGRST202\" || error.code === \"42883\") return true;\n  return /could not find the function/i.test(error.message ?? \"\");\n}\n\nconst DOOR_ABSENT_WHY =\n  \"custom.where_id_opens is missing from this database, so this page cannot tell which \" +\n  \"organization the record lives in and holds instead of guessing. Remedy: the chair applies \" +\n  \"migrations/campaign/openbyid_one_address_opens_any_id.sql and openbyid_the_resolver_can_be_reached.sql.\";\n/** What a person reads when the door is absent (the remedy above goes to the console, never the page). */\nconst DOOR_ABSENT_SAYS = \"This page cannot ask the record store where this is yet.\";\n\n/** Ask the store which organization `id` lives in — the one call an object page makes before any other door. */\nexport async function resolveObjectOrganization(dataSource: Pick<RecordsDataSource, \"rpc\">, id: string): Promise<ObjectOrganizationAnswer> {\n  let answered: { data: unknown; error: { code?: string | null; message?: string | null } | null };\n  try {\n    answered = (await dataSource.rpc(WHERE_ID_OPENS_DOOR, { p_id: id }, { schema: \"custom\" })) as typeof answered;\n  } catch (thrown) {\n    // A PERSON READS PLAIN WORDS (CLOSE-PERF 2026-10-21): \"TypeError: Failed to fetch\" is the transport, not a sentence.\n    return { state: \"unavailable\", why: mapThrownError(thrown, WHERE_ID_OPENS_DOOR).message };\n  }\n  return readObjectOrganizationAnswer(answered, id);\n}\n\n/** Read one `custom.where_id_opens` answer — asked here, or asked by a server render as the same person. */\nexport function readObjectOrganizationAnswer(\n  answered: { data: unknown; error: { code?: string | null; message?: string | null } | null },\n  id: string,\n): ObjectOrganizationAnswer {\n  if (answered.error) {\n    if (doorIsAbsent(answered.error)) {\n      // The remedy is for whoever runs the store; the person reads what happened.\n      console.warn(`[@ai-matrx/records] ${DOOR_ABSENT_WHY}`);\n      return { state: \"unavailable\", why: DOOR_ABSENT_SAYS };\n    }\n    // A PERSON READS PLAIN WORDS, NEVER THE API'S (CLOSE-PERF 2026-10-21, live at 768 as test@test.com): PostgREST's\n    // \"Could not query the database for the schema cache. Retrying.\" reached the page word for word, and the page\n    // does not retry. The package's one mapping (mapPgError) says the store being away, a timeout and the store's\n    // own refusals in a person's words.\n    return {\n      state: \"unavailable\",\n      why: answered.error.message ? mapPgError({ ...answered.error, message: answered.error.message }, WHERE_ID_OPENS_DOOR).message : \"The record store refused to say where this is.\",\n    };\n  }\n  const row = answered.data as WhereIdOpens | null;\n  if (row === null || row === undefined) return { state: \"not-given\" };\n  // READ STRICTLY. An answer this module cannot read is \"could not ask\", never a guess.\n  if (typeof row !== \"object\" || typeof row.organization_id !== \"string\" || typeof row.kind !== \"string\") {\n    return { state: \"unavailable\", why: \"The record store answered something this page cannot read.\" };\n  }\n  return {\n    state: \"found\",\n    organizationId: row.organization_id,\n    kind: row.kind,\n    path: typeof row.path === \"string\" ? row.path : null,\n    live: row.live !== false,\n    resolvedId: typeof row.resolved_id === \"string\" ? row.resolved_id : id,\n    ...(typeof row.rows_visible === \"number\" && row.rows_visible >= 0 ? { rowsVisible: row.rows_visible } : {}),\n    ...(readOpeningViewShape(row.opening_view) ? { opening: readOpeningViewShape(row.opening_view) as OpeningViewShape } : {}),\n  };\n}\n\n/** The default port: one `custom.where_id_opens` call per ask, nothing kept. */\nexport function whereIdOpensPort(dataSource: Pick<RecordsDataSource, \"rpc\">): RecordOrganizationPort {\n  return { organizationOf: (id) => resolveObjectOrganization(dataSource, id) };\n}\n","// src/record-scope.ts — @ai-matrx/records · AGT-N-9 · PRODUCTS row 11\n//\n// A CONVERSATION THAT IS ABOUT ONE RECORD.\n//\n// These are the shapes `custom.record_scope_context` and its three siblings answer. They\n// are types over ONE door, not a model of their own: the assembly happens inside the\n// database, through `custom.read_record`, under the operating person's own field-level\n// security, and this file only says what comes back.\n//\n// TWO ABSENCES, NEVER ONE. `withheld[].because` is `\"masked\"` when the STORE kept a Field\n// from this reader, and `\"policy\"` when the ORGANIZATION keeps it out of conversations.\n// A screen that collapsed them would tell somebody \"you may not see this\" about a field\n// they can read on the record two inches away.\n\nimport type { PermissionLevel } from \"./level\";\nimport type { Uuid } from \"./record\";\n\n/** One value the agent was given, with the triple that makes it citable. */\nexport interface RecordScopeField {\n  key: string;\n  label: string;\n  type: string;\n  value: unknown;\n  /** DYN: a merge field resolves to a TRIPLE, not a string. */\n  cite: {\n    record_id: Uuid;\n    field_id: Uuid;\n    value_version: number;\n    written_at: string | null;\n  };\n}\n\n/** A Field the agent was NOT given, and which of the two reasons it is. */\nexport interface RecordScopeWithheld {\n  key: string;\n  label: string;\n  because: \"masked\" | \"policy\";\n  reason: string;\n  needs?: string;\n  /** The whole sentence, already written — a screen prints it rather than composing one. */\n  says: string;\n}\n\nexport interface RecordScopeRelation {\n  via: string;\n  target_id: Uuid;\n  foreign: boolean;\n  masked: boolean;\n  your_level: PermissionLevel | null;\n  card: Record<string, unknown> | null;\n  why: string | null;\n}\n\nexport interface RecordScopeHistoryEntry {\n  version: number;\n  at: string;\n  what: string;\n  who: string | null;\n  changes: Array<Record<string, unknown>>;\n}\n\nexport interface RecordScopeComment {\n  id: Uuid;\n  body: string;\n  created_at: string;\n  created_by_name: string;\n  field_key: string | null;\n}\n\nexport interface RecordScopeContext {\n  record: {\n    id: Uuid;\n    title: string;\n    table_id: Uuid;\n    table_name: string | null;\n    scope_type: string;\n    plural: string;\n    version: number;\n    updated_at: string;\n    your_level: PermissionLevel;\n  };\n  fields: RecordScopeField[];\n  withheld: RecordScopeWithheld[];\n  relations: RecordScopeRelation[];\n  history: RecordScopeHistoryEntry[];\n  comments: RecordScopeComment[];\n  may_comment: boolean;\n  siblings: {\n    shown: Array<{ id: Uuid; title: string }>;\n    more_than_shown: boolean;\n    says: string;\n  };\n  /** Questions derived from THIS record's shape — never a fixed list. */\n  suggested: string[];\n  /** One sentence naming what is not in the conversation. Printed verbatim. */\n  says: string;\n  assembled_at: string;\n}\n\n/** What a conversation is about. `readable` false means the person lost access to it. */\nexport interface ConversationScope {\n  bound: boolean;\n  readable?: boolean;\n  record_id?: Uuid;\n  table_id?: Uuid;\n  scope_type?: string;\n  title?: string;\n  bound_at?: string;\n  bound_by?: Uuid;\n  because?: string;\n}\n\nexport interface ConversationScopeContext {\n  scope: ConversationScope;\n  context: RecordScopeContext | null;\n}\n\n/** `About: Acme Industrial` — the chip a bound chat wears. */\nexport function scopeChip(scope: ConversationScope): string {\n  return scope.title ? `About: ${scope.title}` : \"About: this record\";\n}\n","// src/table-kind.ts — A TABLE IS A KIND (KINDS-GLUE wave 3 §1–2).\n//\n// `table:<uuid>` names \"a record of that Table\". It is never a registry row: its schema is\n// derived, when asked for, from the Table's live Fields as the store's door\n// `custom.table_kind_facts` (N1) answers them — `TableKindFacts` is that door's JSON verbatim.\n//\n// ONE MAPPING, THREE OUTPUTS, TWO LANGUAGES. `table-kind-mapping.json` beside this file is the\n// one data file (aidream copies it verbatim into matrx-graph). From it:\n//   - stored   — the JSON Schema a value is validated against (mirrors custom.validate_values and\n//                custom._undeclared_key_guard: closed only on a `fields` Table, platform keys allowed;\n//                uses the door's column_source / platform_keys / per-Field field_kind when present,\n//                else derives them);\n//   - authored — a plain object every provider binds (no allOf / if / patternProperties);\n//   - render   — the content-ir KindSchema the web draws with, never stricter than the store.\n// Each is Fields-only here (`tableJsonSchema`, `tableRenderSchema`); the control keys are wave 2's\n// one function (`withControlKeys` / `withControlKeyFields` in @ai-matrx/content-ir), applied by\n// the caller. The Python twin is `matrx_graph.table_kinds`; both write byte-identical JSON for\n// the golden fixture (guard 3 (a), `__tests__/table-kind-round-trip.test.ts`).\n\nimport { isLowercaseUuidShape } from \"@ai-matrx/kit/uuid\";\nimport MAPPING from \"./table-kind-mapping.json\";\n\nexport const TABLE_KIND_PREFIX = \"table:\";\nconst KIND_KEY = \"__kind\";\n\ntype Json = Record<string, unknown>;\n\n/** `custom.table_kind_facts(p_table_id)` verbatim (N1). */\nexport interface TableKindFacts {\n  organization_id: string;\n  table_id: string;\n  name: string | null;\n  title_field: string | null;\n  agent_writable: boolean;\n  purpose: string | null;\n  version: number | null;\n  type_field: string | null;\n  stamp: string | null;\n  /** Every live Field document (typed ones included), plus `id` and `version`, in `sort` order. */\n  fields: Array<Record<string, unknown>>;\n  /** `{<list field key>: [{key, label, id, retired, position}]}`, retired included, live first. */\n  choices: Record<string, Array<{ key?: string | null; label?: string | null; id?: string | null; retired?: boolean; position?: number | null }>>;\n  /** `custom.table_column_source` (`fields` / `free_form` / `code`) once the door carries it; absent, the mapping's default. */\n  column_source?: string | null;\n  /** `custom.record_platform_keys()` once the door carries it; absent, the mapping's keys. */\n  platform_keys?: string[] | null;\n}\n\n/** The content-ir `KindSchema` shape, structurally (this package does not depend on content-ir). */\nexport interface TableRenderSchema {\n  kind: string;\n  fields: Record<string, Record<string, unknown>>;\n}\n\nexport type TableSchemaMode = \"stored\" | \"authored\";\n\ntype KindSpec = {\n  shape: \"string\" | \"number\" | \"boolean\" | \"datetime\" | \"choice\" | \"relation\" | \"entity_reference\" | \"address\" | \"computed\";\n  value?: Json;\n  authored?: boolean;\n  unit?: boolean;\n  hint?: string;\n  rating?: boolean;\n};\n\ntype Mapping = {\n  kernels: { file: string; person: string };\n  system_kinds: string[];\n  by_behaviour: Record<string, string>;\n  choice_enum_limit: number;\n  rating_max: number;\n  address_parts: string[];\n  address_part_max: number;\n  column_source_default: string;\n  platform_keys: Record<string, Json>;\n  stored_patterns: { record_id: string; datetime: string };\n  kinds: Record<string, KindSpec>;\n  render: Record<string, { one: Json; many: Json }>;\n};\n\nconst M = MAPPING as unknown as Mapping;\n\n/** The one mapping (records' own file; the Python copy is generated from it). */\nexport function tableKindMapping(): Readonly<Mapping> {\n  return M;\n}\n\nexport function isTableKind(slug: unknown): slug is `table:${string}` {\n  return typeof slug === \"string\" && slug.startsWith(TABLE_KIND_PREFIX) && isLowercaseUuidShape(slug.slice(TABLE_KIND_PREFIX.length));\n}\n\nexport function tableKindSlug(tableId: string): `table:${string}` {\n  const slug = `${TABLE_KIND_PREFIX}${String(tableId).trim().toLowerCase()}`;\n  if (!isTableKind(slug)) throw new Error(`${JSON.stringify(tableId)} is not a table id`);\n  return slug;\n}\n\nexport function tableIdOf(slug: string): string {\n  if (!isTableKind(slug)) throw new Error(`${JSON.stringify(slug)} is not a table kind`);\n  return slug.slice(TABLE_KIND_PREFIX.length);\n}\n\n// ── field kinds ─────────────────────────────────────────────────────────────────────────\n\nfunction clone<T>(value: T): T {\n  return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction truthy(value: unknown): boolean {\n  return value === true || value === \"true\";\n}\n\nfunction configOf(d: Json): Json {\n  const cfg = d.config;\n  return cfg && typeof cfg === \"object\" && !Array.isArray(cfg) ? (cfg as Json) : {};\n}\n\n/** Twin of `custom.parity_type` — the first answer wins. */\nfunction parityType(d: Json): string | null {\n  const t = d.type;\n  const fmt = d.format;\n  const cfg = configOf(d);\n  if (t === \"boolean\") return \"checkbox\";\n  if (t === \"list\") return truthy(d.multi) ? \"multi_select\" : \"select\";\n  if (t === \"relation\" && d.relation_target === M.kernels.file) return \"attachment\";\n  if (t === \"relation\" && d.relation_target === M.kernels.person) return \"member\";\n  if (t === \"formula\" && \"pick\" in cfg) return \"lookup\";\n  if (t === \"formula\" && \"agg\" in cfg) return \"rollup\";\n  if (t === \"formula\" && \"expr\" in cfg) return \"formula\";\n  if (t === \"text\" && (fmt === \"url\" || fmt === \"email\" || fmt === \"phone\")) return fmt;\n  if (t === \"range\" && fmt === \"percent\") return \"percent\";\n  if (t === \"range\" && d.unit && fmt === \"currency\") return \"currency\";\n  if (t === \"range\" && (cfg.kind === \"date\" || cfg.kind === \"datetime\")) return \"datetime\";\n  return null;\n}\n\n/** Twin of `custom.field_kind_of`: the field kind a stored Field document declares. */\nexport function fieldKindOf(d: Record<string, unknown>): string | null {\n  const t = d.type;\n  const fmt = d.format;\n  const cfg = configOf(d);\n  if (t === \"range\" && (fmt === \"rating\" || fmt === \"duration\")) return fmt;\n  if (t === \"text\" && (fmt === \"address\" || fmt === \"barcode\" || fmt === \"rich_text\" || fmt === \"signature\")) return fmt;\n  if (t === \"list\" && fmt === \"status\") return \"status\";\n  if (t === \"formula\" && fmt === \"count\" && cfg.agg === \"count\") return \"count\";\n  if (t === \"formula\" && typeof cfg.system === \"string\" && M.system_kinds.includes(cfg.system)) return cfg.system;\n  if (t === \"relation\" && Array.isArray(cfg.allowed_types)) return \"entity_reference\";\n  const parity = parityType(d);\n  if (parity !== null) return parity;\n  if (t === \"text\") return fmt === \"long\" || truthy(cfg.multiline) ? \"long_text\" : \"text\";\n  if (t === \"range\") return \"number\";\n  if (t === \"relation\") return \"relation\";\n  return null;\n}\n\n/**\n * The store's own `field_kind` when the facts carry it (`custom.field_kind_of` per Field, asked\n * of the door); otherwise this twin's derivation of the same answer.\n */\nfunction fieldKind(d: Json): string | null {\n  if (\"field_kind\" in d) return typeof d.field_kind === \"string\" ? d.field_kind : null;\n  return fieldKindOf(d);\n}\n\nfunction kindSpec(d: Json): KindSpec {\n  const kind = fieldKind(d) ?? M.by_behaviour[String(d.type)] ?? \"formula\";\n  return M.kinds[kind] ?? M.kinds.formula!;\n}\n\n// ── per Field ───────────────────────────────────────────────────────────────────────────\n\nfunction unconditionalRules(d: Json): Json[] {\n  const rules = Array.isArray(d.rules) ? (d.rules as unknown[]) : [];\n  return rules.filter(\n    (r): r is Json =>\n      !!r &&\n      typeof r === \"object\" &&\n      !Array.isArray(r) &&\n      !(Array.isArray((r as Json).applies_to_types) && ((r as Json).applies_to_types as unknown[]).length > 0) &&\n      !(typeof (r as Json).applies_to_types === \"string\" && (r as Json).applies_to_types !== \"\"),\n  );\n}\n\n/** A rule's number, as Python's twin writes it (6.0 is 6). */\nfunction numberOf(value: unknown): number | null {\n  if (typeof value === \"boolean\") return null;\n  if (typeof value === \"number\" && Number.isFinite(value)) return value;\n  if (typeof value === \"string\" && /^-?[0-9]+(\\.[0-9]+)?$/.test(value)) return Number(value);\n  return null;\n}\n\nfunction choiceTokens(facts: TableKindFacts, key: string): string[] {\n  const tokens: string[] = [];\n  for (const choice of facts.choices?.[key] ?? []) {\n    for (const token of [choice.key, choice.label, choice.id]) {\n      if (typeof token === \"string\" && token && !tokens.includes(token)) tokens.push(token);\n    }\n  }\n  return tokens;\n}\n\nfunction liveChoiceKeys(facts: TableKindFacts, key: string): string[] {\n  const keys: string[] = [];\n  for (const choice of facts.choices?.[key] ?? []) {\n    const k = choice.key;\n    if (!choice.retired && typeof k === \"string\" && k && !keys.includes(k)) keys.push(k);\n  }\n  return keys;\n}\n\nfunction item(facts: TableKindFacts, d: Json, mode: TableSchemaMode): Json {\n  const spec = kindSpec(d);\n  const shape = spec.shape;\n  const cfg = configOf(d);\n  const key = String(d.key);\n  if (shape === \"string\" || shape === \"number\" || shape === \"boolean\") {\n    const out = clone(spec.value ?? {});\n    for (const rule of unconditionalRules(d)) {\n      const kind = rule.kind;\n      const value = numberOf(rule.value);\n      if (shape === \"number\" && kind === \"min\" && value !== null) out.minimum = value;\n      else if (shape === \"number\" && kind === \"max\" && value !== null) out.maximum = value;\n      else if (shape === \"string\" && kind === \"length\" && value !== null) out.maxLength = Math.trunc(value);\n    }\n    if (spec.rating && !(\"maximum\" in out)) out.maximum = M.rating_max;\n    if (spec.unit && d.unit && mode === \"stored\") out[\"x-matrx-unit\"] = d.unit;\n    return out;\n  }\n  if (shape === \"datetime\") {\n    // The store casts a string to timestamptz; the pattern refuses what no cast can read.\n    if (mode === \"stored\") return { type: [\"number\", \"string\"], pattern: M.stored_patterns.datetime };\n    return { type: \"string\", format: cfg.kind === \"date\" ? \"date\" : \"date-time\" };\n  }\n  if (shape === \"choice\") {\n    if (truthy(cfg.allow_other)) return { type: \"string\" };\n    if (mode === \"stored\") return { type: \"string\", enum: choiceTokens(facts, key) };\n    const live = liveChoiceKeys(facts, key);\n    if (live.length === 0 || live.length > M.choice_enum_limit) return { type: \"string\" };\n    return { type: \"string\", enum: live };\n  }\n  if (shape === \"relation\") {\n    // custom.validate_values refuses a value that is not an id by this very regex.\n    if (mode === \"stored\") return { type: \"string\", format: \"uuid\", pattern: M.stored_patterns.record_id };\n    return { type: \"string\", format: \"uuid\" };\n  }\n  if (shape === \"entity_reference\") {\n    const allowed = (Array.isArray(cfg.allowed_types) ? (cfg.allowed_types as unknown[]) : []).filter(\n      (t): t is string => typeof t === \"string\",\n    );\n    const id: Json = { type: \"string\", format: \"uuid\" };\n    if (mode === \"stored\") id.pattern = M.stored_patterns.record_id;\n    const out: Json = {\n      type: \"object\",\n      properties: { token: { type: \"string\", enum: allowed }, id },\n      required: [\"token\", \"id\"],\n    };\n    if (mode === \"authored\") out.additionalProperties = false;\n    return out;\n  }\n  if (shape === \"address\") {\n    const part: Json =\n      mode === \"authored\"\n        ? { type: \"string\", maxLength: M.address_part_max }\n        : { type: [\"string\", \"null\"], maxLength: M.address_part_max };\n    const out: Json = {\n      type: \"object\",\n      properties: Object.fromEntries(M.address_parts.map((p) => [p, { ...part }])),\n      additionalProperties: false,\n    };\n    if (mode === \"stored\") out.minProperties = 1;\n    return out;\n  }\n  return { readOnly: true };\n}\n\nfunction isTyped(d: Json): boolean {\n  return Array.isArray(d.applies_to_types) && (d.applies_to_types as unknown[]).length > 0;\n}\n\nfunction storedValue(facts: TableKindFacts, d: Json): Json {\n  const shape = kindSpec(d).shape;\n  if (shape === \"computed\") return { readOnly: true };\n  const one = item(facts, d, \"stored\");\n  const required = truthy(d.required) && !isTyped(d);\n  let value: Json;\n  if (shape === \"relation\" || shape === \"entity_reference\") {\n    const many: Json = { type: \"array\", items: one };\n    const ceiling = numberOf(d.relation_max);\n    if (ceiling !== null) many.maxItems = Math.trunc(ceiling);\n    if (required) many.minItems = 1;\n    value = { anyOf: [one, many] };\n  } else if (truthy(d.multi)) {\n    value = { type: \"array\", items: one };\n    if (required) value.minItems = 1;\n  } else {\n    value = one;\n  }\n  return required ? value : { anyOf: [value, { type: \"null\" }] };\n}\n\nfunction authoredValue(facts: TableKindFacts, d: Json, typeLabels: string[]): Json {\n  const spec = kindSpec(d);\n  const shape = spec.shape;\n  const one = item(facts, d, \"authored\");\n  let value: Json;\n  if (shape === \"relation\" || shape === \"entity_reference\") {\n    value = { type: \"array\", items: one };\n    const ceiling = numberOf(d.relation_max);\n    if (ceiling !== null) value.maxItems = Math.trunc(ceiling);\n  } else if (truthy(d.multi)) {\n    value = { type: \"array\", items: one };\n  } else {\n    value = one;\n  }\n  const extras: string[] = [];\n  if (spec.unit && d.unit) extras.push(`Amount in ${String(d.unit)}.`);\n  if (spec.hint) extras.push(spec.hint);\n  if (typeLabels.length > 0) extras.push(`Only for ${typeLabels.join(\", \")} records.`);\n  const label = String(d.label || d.key);\n  value.description = extras.length > 0 ? `${label}. ${extras.join(\" \")}` : label;\n  return value;\n}\n\nfunction isAuthored(d: Json): boolean {\n  const spec = kindSpec(d);\n  return spec.shape !== \"computed\" && spec.authored !== false;\n}\n\nfunction typeChoice(facts: TableKindFacts, word: string) {\n  for (const choice of facts.choices?.[facts.type_field ?? \"\"] ?? []) {\n    if (word === choice.key || word === choice.label || word === choice.id) return choice;\n  }\n  return null;\n}\n\nfunction typeSynonyms(facts: TableKindFacts, word: string): [string, string[]] {\n  const choice = typeChoice(facts, word);\n  if (!choice) return [word, [word]];\n  const out: string[] = [];\n  for (const token of [choice.key, choice.label, choice.id]) {\n    if (typeof token === \"string\" && token && !out.includes(token)) out.push(token);\n  }\n  return [String(choice.key || word), out];\n}\n\nfunction typeLabels(facts: TableKindFacts, d: Json): string[] {\n  const labels: string[] = [];\n  for (const word of (d.applies_to_types as unknown[]) ?? []) {\n    const choice = typeChoice(facts, String(word));\n    const label = choice ? String(choice.label || choice.key) : String(word);\n    if (!labels.includes(label)) labels.push(label);\n  }\n  return labels;\n}\n\nfunction liveFields(facts: TableKindFacts): Json[] {\n  return (facts.fields ?? []).filter((d): d is Json => !!d && typeof d === \"object\" && !!(d as Json).key);\n}\n\n// ── whole schemas ───────────────────────────────────────────────────────────────────────\n\n/** The Fields-only JSON Schema of a record of this Table (no control keys). */\nexport function tableJsonSchema(facts: TableKindFacts, mode: TableSchemaMode): Json {\n  const slug = tableKindSlug(String(facts.table_id));\n  const fields = liveFields(facts);\n  const properties: Json = { [KIND_KEY]: { const: slug } };\n  const required: string[] = [KIND_KEY];\n\n  if (mode === \"stored\") {\n    const branches = new Map<string, { if: Json; then: { required: string[]; properties: Json } }>();\n    for (const d of fields) {\n      const key = String(d.key);\n      properties[key] = storedValue(facts, d);\n      const computed = kindSpec(d).shape === \"computed\";\n      if (!truthy(d.required) || computed) continue;\n      if (!isTyped(d)) {\n        required.push(key);\n        continue;\n      }\n      if (!facts.type_field) continue;\n      for (const word of d.applies_to_types as unknown[]) {\n        const [typeKey, synonyms] = typeSynonyms(facts, String(word));\n        let branch = branches.get(typeKey);\n        if (!branch) {\n          branch = {\n            if: { properties: { [facts.type_field]: { enum: synonyms } }, required: [facts.type_field] },\n            then: { required: [], properties: {} },\n          };\n          branches.set(typeKey, branch);\n        }\n        if (!branch.then.required.includes(key)) {\n          branch.then.required.push(key);\n          branch.then.properties[key] = { not: { type: \"null\" } };\n        }\n      }\n    }\n    const platformKeys = Array.isArray(facts.platform_keys) ? facts.platform_keys : Object.keys(M.platform_keys);\n    for (const name of platformKeys) {\n      // A key the platform writes into every record (custom.record_platform_keys()); a Field of\n      // the same name is the column and keeps its own shape.\n      if (typeof name === \"string\" && !(name in properties)) properties[name] = clone(M.platform_keys[name] ?? {});\n    }\n    const schema: Json = {\n      type: \"object\",\n      properties,\n      patternProperties: { \"^_\": {} },\n      required,\n    };\n    // custom._undeclared_key_guard judges only a `fields` Table: a free_form (document) or code\n    // Table keeps any key, so its schema stays open (custom.table_column_source).\n    if ((facts.column_source || M.column_source_default) === \"fields\") schema.additionalProperties = false;\n    if (branches.size > 0) schema.allOf = [...branches.values()];\n    return schema;\n  }\n\n  for (const d of fields) {\n    if (!isAuthored(d)) continue;\n    const key = String(d.key);\n    const typed = isTyped(d);\n    properties[key] = authoredValue(facts, d, typed ? typeLabels(facts, d) : []);\n    if (truthy(d.required) && !typed) required.push(key);\n  }\n  return { type: \"object\", properties, required, additionalProperties: false };\n}\n\n/**\n * The Fields-only content-ir `KindSchema` the web draws a record of this Table with: every Field\n * nullable and optional, choices open to every word the store accepts (keys, labels, ids,\n * retired included). Wrap it with `withControlKeyFields` from @ai-matrx/content-ir — table kinds\n * never pass through `kindSchemaFromJsonSchema`.\n */\nexport function tableRenderSchema(facts: TableKindFacts): TableRenderSchema {\n  const slug = tableKindSlug(String(facts.table_id));\n  const out: Record<string, Record<string, unknown>> = {};\n  for (const d of liveFields(facts)) {\n    const key = String(d.key);\n    const shape = kindSpec(d).shape;\n    const multi = truthy(d.multi);\n    let field: Json;\n    if (shape === \"choice\") {\n      field = { type: multi ? \"string[]\" : \"enum\", values: choiceTokens(facts, key) };\n      if (truthy(configOf(d).allow_other)) field.open = true;\n    } else {\n      field = clone(M.render[shape]![multi ? \"many\" : \"one\"]);\n    }\n    field.nullable = true;\n    out[key] = field;\n  }\n  return { kind: slug, fields: out };\n}\n","{\n  \"about\": \"THE ONE MAPPING from a store Field to a kind's three schemas (KINDS-GLUE wave 3 §2). Hand-written here; aidream copies it verbatim to packages/matrx-graph/matrx_graph/table_kind_mapping.json (scripts/generate_table_kind_mapping.py --check). Both languages derive from this file only: @ai-matrx/records src/table-kind.ts and matrx_graph.table_kinds. Keys of `kinds` are the store's field kinds (custom.field_kinds() plus the formula `system` kinds custom.field_kind_of answers). Stored mode only: `column_source_default` is custom.table_column_source's answer when the facts carry none (silence means the doctrine: Field rows are the columns); `platform_keys` mirrors custom.record_platform_keys() with each key's shape (parent_id: custom.containment_parent's uuid cast; icon: the record's own @ai-matrx/icons name, a string or null); `stored_patterns` mirror custom.validate_values' relation id regex and, for dates, refuse a string the timestamptz cast can never read (no digits, not a special word) while never refusing one it can.\",\n  \"version\": 2,\n  \"kernels\": {\n    \"file\": \"11111111-0000-4000-8000-000000000006\",\n    \"person\": \"11111111-0000-4000-8000-000000000005\"\n  },\n  \"system_kinds\": [\"created_by\", \"modified_by\", \"autonumber\", \"created_time\", \"modified_time\"],\n  \"by_behaviour\": {\n    \"text\": \"text\",\n    \"range\": \"number\",\n    \"list\": \"select\",\n    \"relation\": \"relation\",\n    \"boolean\": \"checkbox\",\n    \"formula\": \"formula\"\n  },\n  \"choice_enum_limit\": 100,\n  \"rating_max\": 5,\n  \"address_parts\": [\"street\", \"city\", \"region\", \"postal_code\", \"country\"],\n  \"address_part_max\": 200,\n  \"column_source_default\": \"fields\",\n  \"platform_keys\": {\n    \"parent_id\": { \"type\": [\"string\", \"null\"], \"pattern\": \"^(?:\\\\{[0-9a-fA-F]{4}(?:-?[0-9a-fA-F]{4}){7}\\\\}|[0-9a-fA-F]{4}(?:-?[0-9a-fA-F]{4}){7})$\" },\n    \"icon\": { \"type\": [\"string\", \"null\"] }\n  },\n  \"stored_patterns\": {\n    \"record_id\": \"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\",\n    \"datetime\": \"[0-9][^0-9]+[0-9]|[0-9]{5}|^\\\\s*(?:[Nn][Oo][Ww]|[Tt][Oo][Dd][Aa][Yy]|[Tt][Oo][Mm][Oo][Rr][Rr][Oo][Ww]|[Yy][Ee][Ss][Tt][Ee][Rr][Dd][Aa][Yy]|[Ee][Pp][Oo][Cc][Hh])(?![A-Za-z])\"\n  },\n  \"kinds\": {\n    \"text\": { \"shape\": \"string\", \"value\": { \"type\": \"string\" } },\n    \"long_text\": { \"shape\": \"string\", \"value\": { \"type\": \"string\" } },\n    \"email\": { \"shape\": \"string\", \"value\": { \"type\": \"string\", \"format\": \"email\" } },\n    \"phone\": { \"shape\": \"string\", \"value\": { \"type\": \"string\" } },\n    \"url\": { \"shape\": \"string\", \"value\": { \"type\": \"string\" } },\n    \"barcode\": { \"shape\": \"string\", \"value\": { \"type\": \"string\", \"maxLength\": 256 } },\n    \"rich_text\": { \"shape\": \"string\", \"value\": { \"type\": \"string\" }, \"hint\": \"Markdown, no HTML.\" },\n    \"signature\": { \"shape\": \"string\", \"value\": { \"type\": \"string\", \"readOnly\": true }, \"authored\": false },\n    \"number\": { \"shape\": \"number\", \"value\": { \"type\": \"number\" } },\n    \"currency\": { \"shape\": \"number\", \"value\": { \"type\": \"number\" }, \"unit\": true },\n    \"percent\": { \"shape\": \"number\", \"value\": { \"type\": \"number\" }, \"hint\": \"A whole percent: 6 means 6%.\" },\n    \"rating\": { \"shape\": \"number\", \"value\": { \"type\": \"integer\", \"minimum\": 0 }, \"rating\": true },\n    \"duration\": { \"shape\": \"number\", \"value\": { \"type\": \"number\", \"minimum\": 0 }, \"hint\": \"A length of time in seconds.\" },\n    \"datetime\": { \"shape\": \"datetime\" },\n    \"checkbox\": { \"shape\": \"boolean\", \"value\": { \"type\": \"boolean\" } },\n    \"select\": { \"shape\": \"choice\" },\n    \"multi_select\": { \"shape\": \"choice\" },\n    \"status\": { \"shape\": \"choice\" },\n    \"relation\": { \"shape\": \"relation\" },\n    \"member\": { \"shape\": \"relation\" },\n    \"attachment\": { \"shape\": \"relation\", \"authored\": false },\n    \"entity_reference\": { \"shape\": \"entity_reference\" },\n    \"address\": { \"shape\": \"address\" },\n    \"formula\": { \"shape\": \"computed\" },\n    \"lookup\": { \"shape\": \"computed\" },\n    \"rollup\": { \"shape\": \"computed\" },\n    \"count\": { \"shape\": \"computed\" },\n    \"created_by\": { \"shape\": \"computed\" },\n    \"modified_by\": { \"shape\": \"computed\" },\n    \"autonumber\": { \"shape\": \"computed\" },\n    \"created_time\": { \"shape\": \"computed\" },\n    \"modified_time\": { \"shape\": \"computed\" }\n  },\n  \"render\": {\n    \"string\": { \"one\": { \"type\": \"string\" }, \"many\": { \"type\": \"string[]\" } },\n    \"number\": { \"one\": { \"type\": \"number\" }, \"many\": { \"type\": \"number[]\" } },\n    \"boolean\": { \"one\": { \"type\": \"boolean\" }, \"many\": { \"type\": \"boolean[]\" } },\n    \"datetime\": { \"one\": { \"type\": \"union\", \"scalars\": [\"string\", \"number\"] }, \"many\": { \"type\": \"json\" } },\n    \"relation\": { \"one\": { \"type\": \"json\" }, \"many\": { \"type\": \"json\" } },\n    \"entity_reference\": { \"one\": { \"type\": \"json\" }, \"many\": { \"type\": \"json\" } },\n    \"address\": { \"one\": { \"type\": \"json\" }, \"many\": { \"type\": \"json\" } },\n    \"computed\": { \"one\": { \"type\": \"json\" }, \"many\": { \"type\": \"json\" } }\n  }\n}\n","// src/alternates.ts — @ai-matrx/records\n//\n// \"USE THIS ONE\": PROMOTE A DISAGREEING VALUE, AND KEEP EVERY OTHER FIELD'S CANDIDATES.\n//\n// A value that two sources disagree about carries the other candidates in its envelope's\n// `alternates`, inside the record's `_values` block. Choosing one makes it the value and\n// demotes the value it replaces to an alternate, so nothing is lost and the choice can be\n// undone by choosing back.\n//\n// 🚨 THE TRAP THIS FILE EXISTS FOR. `custom.record_update` merges `data || patch` SHALLOWLY.\n// A patch carrying `_values: { phone: … }` REPLACES the whole `_values` block, erasing every\n// other field's envelope and alternates. So the patch carries the WHOLE `_values` block, copied\n// from the document just read, with only the chosen field's envelope changed. The chosen\n// envelope never carries `ver`, `actor` or `at`: the store stamps those.\n//\n// The write is against the version the document was read at (`expectedVersion`), so a colleague's\n// change in between is refused, never overwritten.\n\nimport type { RecordsClient } from \"./core/client\";\nimport type { RecordDocument, ValueAlternate, ValueEnvelope, Uuid } from \"./record\";\nimport type { RecordsError, RecordsResult } from \"./results\";\n\nexport interface ChooseAlternateArgs {\n  record_id: Uuid;\n  field_key: string;\n  /** Position in the field's `alternates` list as the record holds it. */\n  alternate_index: number;\n  /** When given, the alternate holding this rank is chosen instead — the list a screen drew may be ordered differently. */\n  rank?: number;\n}\n\nfunction refuse(code: RecordsError[\"code\"], message: string, hint: string): RecordsResult<number> {\n  return { ok: false, error: { code, message, hint, ours: true } as RecordsError };\n}\n\n/**\n * WHERE THE DISPLACED VALUE CAME FROM. A value somebody typed in has no `src` pointer — only the actor and\n * the time the store stamped — and the store re-stamps both the moment the chosen value takes the envelope,\n * so copying `envelope.src` alone left the demoted value as \"Unknown source\". When there is no pointer, the\n * source is written inline from the actor and time (the store interns an inline source into `_sources`).\n */\nfunction displacedSource(envelope: ValueEnvelope): { src?: string } {\n  if (envelope.src) return { src: envelope.src };\n  const by = envelope.actor === \"agent\" ? \"an agent\" : envelope.actor === \"system\" ? \"the system\" : envelope.actor ? \"a person\" : null;\n  if (by === null) return {};\n  const day = typeof envelope.at === \"string\" && envelope.at.length >= 10 ? ` on ${envelope.at.slice(0, 10)}` : \"\";\n  return { src: { name: `Entered by ${by}${day}` } as unknown as string };\n}\n\n/** The patch that makes alternate `alternate_index` of `field_key` the value. Pure; exported for tests. */\nexport function alternatePatch(\n  document: RecordDocument,\n  field_key: string,\n  alternate_index: number,\n  rank?: number,\n): { ok: true; patch: Record<string, unknown> } | { ok: false; message: string } {\n  const block = (document._values ?? {}) as Record<string, ValueEnvelope>;\n  const envelope = block[field_key];\n  const alternates: ValueAlternate[] = Array.isArray(envelope?.alternates) ? envelope.alternates : [];\n  const at = rank === undefined ? alternate_index : alternates.findIndex((a) => a.rank === rank);\n  alternate_index = at;\n  const chosen = alternates[at];\n  if (!envelope || !chosen) return { ok: false, message: \"That other value is no longer on this record.\" };\n\n  const kept = alternates.filter((_, i) => i !== alternate_index);\n  const current = document[field_key];\n  const next: ValueAlternate[] = [...kept];\n  if (current !== null && current !== undefined) {\n    const taken = new Set(kept.map((a) => a.rank));\n    let rank = 1;\n    while (taken.has(rank)) rank += 1;\n    next.push({ value: current, ...displacedSource(envelope), rank });\n  }\n\n  // The chosen field's envelope: everything it held, minus what the store stamps and what is no longer true.\n  const { ver: _ver, actor: _actor, at: _at, on_behalf_of: _on, absent: _absent, alternates: _alts, src: _src, ...rest } =\n    envelope as ValueEnvelope & Record<string, unknown>;\n  const changed: Record<string, unknown> = { ...rest, ...(chosen.src ? { src: chosen.src } : {}) };\n  if (next.length > 0) changed[\"alternates\"] = next;\n\n  return {\n    ok: true,\n    patch: {\n      [field_key]: chosen.value,\n      // THE WHOLE BLOCK — every other field's envelope and alternates travel with it.\n      _values: { ...block, [field_key]: changed },\n    },\n  };\n}\n\nexport async function chooseAlternate(\n  client: Pick<RecordsClient, \"recordRead\" | \"recordAsOf\" | \"recordUpdate\">,\n  { record_id, field_key, alternate_index, rank }: ChooseAlternateArgs,\n): Promise<RecordsResult<number>> {\n  const read = await client.recordRead({ record_id, withVersion: true });\n  if (!read.ok) return read;\n  // A MASKED FIELD'S ENVELOPE CANNOT BE COPIED WHOLE: writing the block back could replace what this\n  // person is not allowed to see. Refuse, write nothing.\n  if (Object.keys(read.data.hidden ?? {}).length > 0) {\n    return refuse(\"refused_by_rule\", \"Some fields here are hidden from you, so this choice can't be saved safely.\", \"Ask someone who can see every field.\");\n  }\n  const version = read.data.version;\n  if (version === null || version === undefined) {\n    return refuse(\"stale_read\", \"Nothing was saved: this record's latest changes could not be checked.\", \"Reload, then try again.\");\n  }\n  // `recordRead` hides the store's own `_values` and `_sources` blocks, so the document the patch is built\n  // from is the store's own account of the record as of now. It is read AFTER the version, so a write\n  // landing between the two makes the version stale and the store refuses, never clobbers.\n  const raw = await client.recordAsOf({ record_id, recorded_at: new Date().toISOString() });\n  if (!raw.ok) return raw;\n  if (raw.data === null) return refuse(\"not_found\", \"That record is no longer here.\", \"Reload, then look again.\");\n  const built = alternatePatch(raw.data as RecordDocument, field_key, alternate_index, rank);\n  if (!built.ok) return refuse(\"not_found\", built.message, \"Reload, then look again.\");\n  return client.recordUpdate({ record_id, patch: built.patch, expectedVersion: version });\n}\n","// src/datedValues.ts — @ai-matrx/records\n//\n// \"THE ADDRESS WAS X UNTIL JUNE 2024, THEN Y\" — THE WORLD CLOCK ON ONE VALUE (Rule 10, test 6).\n//\n// A Field that says its values are dated (`field.dated`) keeps, inside its envelope in the record's\n// `_values` block, the periods it was true between: `dated: [{ from, to, value }]`, `from`/`to` as\n// `YYYY-MM-DD` days, `null` meaning \"since forever\" / \"still true\", each period half-open\n// [from, to). `custom.query_record_as_of(world_on)` answers from them; `custom._dated_values_guard`\n// refuses periods on a Field that is not dated, and malformed or overlapping periods, in its own words.\n//\n// 🚨 THE SAME TRAP `alternates.ts` exists for: `custom.record_update` merges `data || patch`\n// SHALLOWLY, so a patch carrying `_values: { address: … }` would erase every other field's envelope.\n// The patch carries the WHOLE `_values` block, read from the store's own document, with only this\n// field's `dated` replaced, and is written against the version it was read at.\n//\n// The field's plain value becomes the period in force today (nothing when no period covers today):\n// the record says now what the world clock says now.\n\nimport type { RecordsClient } from \"./core/client\";\nimport type { RecordDocument, ValueEnvelope, Uuid } from \"./record\";\nimport type { RecordsError, RecordsResult } from \"./results\";\n\n/** One period a value was true between. `from`/`to` are `YYYY-MM-DD`; `null` is open-ended. */\nexport interface ValuePeriod {\n  from: string | null;\n  to: string | null;\n  value: unknown;\n}\n\nexport interface SetValuePeriodsArgs {\n  record_id: Uuid;\n  field_key: string;\n  /** The whole list, in any order. An empty list clears the field's dates. */\n  periods: ValuePeriod[];\n  /** `YYYY-MM-DD` — the day whose period becomes the plain value. Defaults to today (UTC). */\n  today?: string;\n}\n\nconst DAY = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nfunction refuse(code: RecordsError[\"code\"], message: string, hint: string): RecordsResult<number> {\n  return { ok: false, error: { code, message, hint, ours: true } as RecordsError };\n}\n\n/** The periods a document holds for one field, oldest first. Pure. */\nexport function valuePeriodsOf(document: RecordDocument | null | undefined, field_key: string): ValuePeriod[] {\n  const envelope = (document?._values as Record<string, ValueEnvelope & { dated?: unknown }> | undefined)?.[field_key];\n  const raw = envelope?.dated;\n  if (!Array.isArray(raw)) return [];\n  return sortPeriods(\n    raw\n      .filter((p): p is Record<string, unknown> => typeof p === \"object\" && p !== null)\n      .map((p) => ({ from: typeof p[\"from\"] === \"string\" ? p[\"from\"] : null, to: typeof p[\"to\"] === \"string\" ? p[\"to\"] : null, value: p[\"value\"] ?? null })),\n  );\n}\n\nfunction sortPeriods(periods: ValuePeriod[]): ValuePeriod[] {\n  return [...periods].sort((a, b) => (a.from ?? \"\") < (b.from ?? \"\") ? -1 : (a.from ?? \"\") > (b.from ?? \"\") ? 1 : 0);\n}\n\n/** The period true on `day` (`YYYY-MM-DD`), or null. Half-open: true from `from`, no longer true on `to`. */\nexport function periodInForce(periods: ValuePeriod[], day: string): ValuePeriod | null {\n  return periods.find((p) => (p.from === null || p.from <= day) && (p.to === null || day < p.to)) ?? null;\n}\n\n/** Why a list of periods cannot be stored, in a person's words — or null when it can. Pure. */\nexport function valuePeriodsProblem(periods: ValuePeriod[]): string | null {\n  for (const p of periods) {\n    if ((p.from !== null && !DAY.test(p.from)) || (p.to !== null && !DAY.test(p.to))) return \"Each date has to be a day, like 2024-06-01.\";\n    if (p.from !== null && p.to !== null && p.to <= p.from) return `A period can't end (${p.to}) on or before it starts (${p.from}).`;\n  }\n  const sorted = sortPeriods(periods);\n  for (let i = 1; i < sorted.length; i += 1) {\n    const before = sorted[i - 1]!;\n    const next = sorted[i]!;\n    if (before.to === null || next.from === null || next.from < before.to) return \"Two periods overlap. Each day can have only one value.\";\n  }\n  return null;\n}\n\n/** The patch that stores `periods` on `field_key`, keeping every other field's envelope. Pure; exported for tests. */\nexport function valuePeriodsPatch(\n  document: RecordDocument,\n  field_key: string,\n  periods: ValuePeriod[],\n  today: string,\n): { ok: true; patch: Record<string, unknown> } | { ok: false; message: string } {\n  const problem = valuePeriodsProblem(periods);\n  if (problem) return { ok: false, message: problem };\n  const block = (document._values ?? {}) as Record<string, ValueEnvelope & Record<string, unknown>>;\n  const envelope = block[field_key] ?? {};\n  // What the store stamps (ver, actor, at) and what is no longer true never travel back.\n  const { ver: _ver, actor: _actor, at: _at, on_behalf_of: _on, absent: _absent, dated: _dated, ...rest } = envelope as Record<string, unknown>;\n  const sorted = sortPeriods(periods);\n  const changed: Record<string, unknown> = { ...rest, dated: sorted.length > 0 ? sorted : null };\n  const now = periodInForce(sorted, today);\n  return {\n    ok: true,\n    patch: {\n      ...(sorted.length > 0 ? { [field_key]: now ? now.value : null } : {}),\n      _values: { ...block, [field_key]: changed },\n    },\n  };\n}\n\n/**\n * STORE WHEN A VALUE WAS TRUE. Reads the record's own document (`recordAsOf`, recorded now) after its\n * version, writes the whole `_values` block back with this field's periods replaced, against that version.\n * Refused when any field is hidden from the reader (the block could not be copied whole).\n */\nexport async function setValuePeriods(\n  client: Pick<RecordsClient, \"recordRead\" | \"recordAsOf\" | \"recordUpdate\">,\n  { record_id, field_key, periods, today }: SetValuePeriodsArgs,\n): Promise<RecordsResult<number>> {\n  const problem = valuePeriodsProblem(periods);\n  if (problem) return refuse(\"invalid_argument\", problem, \"Fix the dates, then save again.\");\n  const read = await client.recordRead({ record_id, withVersion: true });\n  if (!read.ok) return read;\n  if (Object.keys(read.data.hidden ?? {}).length > 0) {\n    return refuse(\"refused_by_rule\", \"Some fields here are hidden from you, so these dates can't be saved safely.\", \"Ask someone who can see every field.\");\n  }\n  const version = read.data.version;\n  if (version === null || version === undefined) {\n    return refuse(\"stale_read\", \"Nothing was saved: this record's latest changes could not be checked.\", \"Reload, then try again.\");\n  }\n  const raw = await client.recordAsOf({ record_id, recorded_at: new Date().toISOString() });\n  if (!raw.ok) return raw;\n  if (raw.data === null) return refuse(\"not_found\", \"That record is no longer here.\", \"Reload, then look again.\");\n  const built = valuePeriodsPatch(raw.data as RecordDocument, field_key, periods, today ?? new Date().toISOString().slice(0, 10));\n  if (!built.ok) return refuse(\"invalid_argument\", built.message, \"Fix the dates, then save again.\");\n  return client.recordUpdate({ record_id, patch: built.patch, expectedVersion: version });\n}\n","// src/ai-field-presets.ts — @ai-matrx/records · lane W2-C (AIRTABLE-PARITY row 95)\n//\n// THE ONE LIST of \"what an AI column does\" presets, read by BOTH homes of AI columns:\n//   · the table page's \"Let AI fill\" panel (records-ui `EnrichPanel`) — a preset becomes the column's instruction, which the\n//     `table.column_fill` mandate runs per row (the server also hands that mandate the column's kind and, for a choice column, its choices);\n//   · Spaces' \"AI autofill\" property (matrx-frontend `features/spaces/data/ai-autofill.tsx`, mandate `spaces.autofill`) — `autofillKind`\n//     is the kind that mandate already knows (summary | keywords | translation); every other preset runs as its `custom` kind with the\n//     same instruction this file writes.\n// Airtable's own AI field offers: Summarize, Categorize, Translate, Extract info, Sentiment, Describe image. Nothing here asks a model:\n// this file only writes the sentence a person would otherwise have to type. Import-inert: data and pure functions.\n\nimport { KERNEL_TABLES } from \"./store.generated\";\nimport { fieldKindFor, type CoercibleField, type FieldKind, type KernelTargets } from \"./coerce\";\n\nexport type AiPresetKey = \"summarize\" | \"keywords\" | \"categorize\" | \"translate\" | \"extract\" | \"sentiment\" | \"describe_image\";\n\n/** What the person must still say after choosing a preset. */\nexport type AiPresetAsk = \"language\" | \"what\";\n\n/** Spaces' autofill kinds (`features/spaces/data/sources.ts`); `custom` carries the instruction. */\nexport type AiAutofillKind = \"summary\" | \"keywords\" | \"translation\" | \"custom\";\n\nexport interface AiFieldPreset {\n  key: AiPresetKey;\n  label: string;\n  autofillKind: AiAutofillKind;\n  /** The one thing still to ask: a language (Translate) or what to pull out (Extract). */\n  ask?: AiPresetAsk;\n  /** The column kind the preset needs: Categorize fills a choice column, Describe image reads an attachment column. */\n  needs?: \"choice\" | \"attachment\";\n  /**\n   * The platform job (mandate key) that fills a column made from this preset when it is not the plain text one. Describe image\n   * is filled by a model that can SEE: the server shows it the row's picture attachments (the attachment columns named in the\n   * column's `inputs`). Every preset without a `mandate` runs as `table.column_fill`.\n   */\n  mandate?: string;\n}\n\nexport const AI_FIELD_PRESETS: readonly AiFieldPreset[] = [\n  { key: \"summarize\", label: \"Summarize\", autofillKind: \"summary\" },\n  { key: \"keywords\", label: \"Keywords\", autofillKind: \"keywords\" },\n  { key: \"categorize\", label: \"Categorize\", autofillKind: \"custom\", needs: \"choice\" },\n  { key: \"translate\", label: \"Translate\", autofillKind: \"translation\", ask: \"language\" },\n  { key: \"extract\", label: \"Extract\", autofillKind: \"custom\", ask: \"what\" },\n  { key: \"sentiment\", label: \"Sentiment\", autofillKind: \"custom\" },\n  { key: \"describe_image\", label: \"Describe image\", autofillKind: \"custom\", needs: \"attachment\", mandate: \"table.column_fill_image\" },\n];\n\nexport function aiFieldPreset(key: string): AiFieldPreset | undefined {\n  return AI_FIELD_PRESETS.find((p) => p.key === key);\n}\n\nexport interface AiPresetContext {\n  /** The language for Translate (\"Spanish\"); what to pull out for Extract (\"the invoice number\"). */\n  answer?: string | undefined;\n  /** The names of the columns the preset reads, when the person narrowed it (e.g. the attachment column). */\n  reads?: readonly string[] | undefined;\n}\n\nconst clean = (s: string | undefined): string => (s ?? \"\").trim().replace(/\\s+/g, \" \");\n\n/**\n * The instruction a preset writes. It is a plain sentence a person can read and edit; it names no model and no table. A preset that\n * still needs an answer (language, what to extract) and was given none returns `null`, so a screen never saves half a sentence.\n */\nexport function presetInstruction(key: AiPresetKey, ctx: AiPresetContext = {}): string | null {\n  const from = ctx.reads && ctx.reads.length > 0 ? ` (${ctx.reads.join(\", \")})` : \"\";\n  const answer = clean(ctx.answer);\n  switch (key) {\n    case \"summarize\":\n      return `Summarize this record's text${from} in one or two plain sentences.`;\n    case \"keywords\":\n      return `List the five most useful keywords for this record${from}, separated by commas.`;\n    case \"categorize\":\n      return `Choose the one option of this column that best fits this record${from}. Answer with that option exactly as written.`;\n    case \"translate\":\n      return answer ? `Translate this record's text${from} into ${answer}. Keep names and numbers as they are.` : null;\n    case \"extract\":\n      return answer ? `Find ${answer} in this record's text${from} and write only that value. If it is not there, say nothing was found.` : null;\n    case \"sentiment\":\n      return `Read this record's text${from} and say whether its tone is positive, neutral or negative. Answer with that one word.`;\n    case \"describe_image\":\n      return `Describe the picture${from ? ` in the attachment${from}` : \" attached to this record\"} in one or two plain sentences: what is shown and anything written on it.`;\n  }\n}\n\n/**\n * The columns a preset's model must read, as the `inputs` of the column's enrichment. Describe image reads the table's attachment\n * columns (without them the model is shown nothing and answers \"nothing found\"); every other preset reads none by name, so the\n * answer is `undefined` and the declaration stays as it was.\n */\nexport function presetInputs(key: AiPresetKey | undefined, attachmentColumnKeys: readonly string[]): string[] | undefined {\n  if (!key || aiFieldPreset(key)?.needs !== \"attachment\") return undefined;\n  const keys = attachmentColumnKeys.filter((k) => k.trim().length > 0);\n  return keys.length > 0 ? [...new Set(keys)] : undefined;\n}\n\n/**\n * Which presets a column may offer: Categorize only for a choice column (the server passes the column's own choices to the\n * mandate), Describe image only when the table has an attachment column to read. Everything else fits any column.\n */\nexport function presetsFor(args: { targetIsChoice: boolean; hasAttachmentColumn: boolean }): readonly AiFieldPreset[] {\n  return AI_FIELD_PRESETS.filter((p) => (p.needs === \"choice\" ? args.targetIsChoice : p.needs === \"attachment\" ? args.hasAttachmentColumn : true));\n}\n\nconst kernelId = (name: string): string => KERNEL_TABLES.find((t) => t.name === name)?.id ?? \"\";\nconst DEFAULT_KERNEL: KernelTargets = { file: kernelId(\"File\"), person: kernelId(\"Person\") };\nconst UNREADABLE_KINDS: ReadonlySet<FieldKind> = new Set<FieldKind>([\"attachment\", \"relation\", \"entity_reference\", \"member\", \"json\", \"rollup\", \"lookup\"]);\n/** The store's sensitivity order (custom.enrich_sensitivity_rank): an AI fill reads up to the organization's ceiling. */\nconst SENSITIVITY_RANK: Readonly<Record<string, number>> = { public: 1, internal: 2, restricted: 3, confidential: 4 };\n/** Whether a column of this sensitivity is within the ceiling; an unknown word (either side) is never read by default. */\nexport function withinSensitivityCeiling(sensitivity: string | null | undefined, ceiling: string): boolean {\n  const have = SENSITIVITY_RANK[(sensitivity ?? \"internal\").trim().toLowerCase()];\n  const max = SENSITIVITY_RANK[ceiling.trim().toLowerCase()] ?? SENSITIVITY_RANK.public!;\n  return have !== undefined && have <= max;\n}\n\n/** The slice of a Field the default-inputs question reads. */\nexport type EnrichInputField = CoercibleField & {\n  key: string;\n  archived_at?: string | null;\n  source?: string | null;\n  sensitivity?: string | null;\n  context_policy?: string | null;\n};\n\n/**\n * THE DEFAULT `inputs` of a new AI column: the record's OTHER readable fields, by key. A column saved with no inputs hands the\n * model nothing to read (every row comes back \"nothing to find\"), so both homes of AI columns - the table page's \"Let AI fill\" and\n * Spaces' \"AI autofill\" - start from this list. Left out: the column itself, other AI columns (no loops), retired columns,\n * pictures/links/people/rolled-up values (a text model cannot read them), and anything the store would refuse an enrichment\n * to read (sensitivity above the organization's ceiling - `recordsLimits().enrichmentSensitivityCeiling`, the knob\n * custom/enrichment_sensitivity_ceiling - or a column that says no agent may see it). `on_request` columns are fetched only when\n * asked, so they are not read by default either.\n */\nexport function defaultEnrichInputs(\n  fields: readonly EnrichInputField[],\n  targetKey: string,\n  ceiling: string = \"internal\",\n  kernel: KernelTargets = DEFAULT_KERNEL,\n): string[] {\n  const keys = fields\n    .filter((f) => f.key && f.key !== targetKey && !f.archived_at && f.source !== \"agent\")\n    .filter((f) => f.context_policy !== \"exclude\" && f.context_policy !== \"on_request\")\n    .filter((f) => withinSensitivityCeiling(f.sensitivity, ceiling))\n    .filter((f) => !UNREADABLE_KINDS.has(fieldKindFor(f, kernel)))\n    .map((f) => f.key);\n  return [...new Set(keys)];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":["import_context","import_react","text","registry","doorReady","refusal","field","window","quiet","item","field","text","field","f","text","import_global_slot","import_uuid","text","item","field","f","refusal","import_uuid","byId","f","text","page","byId","f","window","flight","refusal","copyId","schema","text","page","f","PAGE","keyed","rows","fieldIds","window","siblings","ok","import_react","field","page","import_react","import_context","import_react","field","field","field","spec","page","version","import_context","import_react","PAGE","page","import_uuid","field","text","import_format","field","text","import_global_slot","text","bad","day","text","import_uuid","field","text","f","field","f","refusal","field","window","f","refuse","field","entityRefsOf","item","client","answer","toStored","page","import_react","import_context","PAGE","columnRefusal","import_uuid","field","refuse","sentence","key","storedValue","declared","field","import_uuid","TRUE_WORDS","FALSE_WORDS","text","field","text","text","item","item","item","countOf","f","err","import_uuid","configOf","typeLabels","field","refuse","rank","refuse","f"]}