@happyvertical/smrt-education 0.57.33 → 0.57.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/AGENTS.md +8 -1
  2. package/README.md +117 -13
  3. package/agents/catalog-sync.md +46 -0
  4. package/agents/photo-intake.md +249 -0
  5. package/agents/workbook-service.md +355 -0
  6. package/agents/workbook-test-matrix.md +74 -0
  7. package/dist/catalog-acquisition-service.d.ts.map +1 -1
  8. package/dist/catalog-capability.d.ts +21 -0
  9. package/dist/catalog-capability.d.ts.map +1 -0
  10. package/dist/catalog-contracts.d.ts +40 -0
  11. package/dist/catalog-contracts.d.ts.map +1 -1
  12. package/dist/catalog-database-sync-store.d.ts.map +1 -1
  13. package/dist/catalog-models.d.ts +5 -1
  14. package/dist/catalog-models.d.ts.map +1 -1
  15. package/dist/catalog-read-service.d.ts +2 -1
  16. package/dist/catalog-read-service.d.ts.map +1 -1
  17. package/dist/catalog-service.d.ts +5 -0
  18. package/dist/catalog-service.d.ts.map +1 -1
  19. package/dist/chunks/workbook-photo-service-1wcnf-Xf.js +27359 -0
  20. package/dist/chunks/workbook-photo-service-1wcnf-Xf.js.map +1 -0
  21. package/dist/index.d.ts +11 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +339 -24864
  24. package/dist/index.js.map +1 -1
  25. package/dist/ingestion.d.ts +37 -0
  26. package/dist/ingestion.d.ts.map +1 -1
  27. package/dist/ingestion.js +829 -20
  28. package/dist/ingestion.js.map +1 -1
  29. package/dist/learner-service.d.ts +15 -0
  30. package/dist/learner-service.d.ts.map +1 -1
  31. package/dist/manifest.json +4735 -6
  32. package/dist/smrt-knowledge.json +1760 -26
  33. package/dist/sources/public-illustrative-mathematics-adapter.d.ts.map +1 -1
  34. package/dist/sources/public-illustrative-mathematics-parser.d.ts.map +1 -1
  35. package/dist/submission-service.d.ts +38 -11
  36. package/dist/submission-service.d.ts.map +1 -1
  37. package/dist/workbook-answer-regions.d.ts +11 -0
  38. package/dist/workbook-answer-regions.d.ts.map +1 -0
  39. package/dist/workbook-contracts.d.ts +224 -0
  40. package/dist/workbook-contracts.d.ts.map +1 -0
  41. package/dist/workbook-layout.d.ts +13 -0
  42. package/dist/workbook-layout.d.ts.map +1 -0
  43. package/dist/workbook-models.d.ts +129 -0
  44. package/dist/workbook-models.d.ts.map +1 -0
  45. package/dist/workbook-photo-contracts.d.ts +56 -0
  46. package/dist/workbook-photo-contracts.d.ts.map +1 -0
  47. package/dist/workbook-photo-ingestion.d.ts +70 -0
  48. package/dist/workbook-photo-ingestion.d.ts.map +1 -0
  49. package/dist/workbook-photo-models.d.ts +63 -0
  50. package/dist/workbook-photo-models.d.ts.map +1 -0
  51. package/dist/workbook-photo-service.d.ts +72 -0
  52. package/dist/workbook-photo-service.d.ts.map +1 -0
  53. package/dist/workbook-service.d.ts +158 -0
  54. package/dist/workbook-service.d.ts.map +1 -0
  55. package/package.json +8 -8
@@ -0,0 +1,355 @@
1
+ # Physical workbook contract
2
+
3
+ `WorkbookService` extends `SubmissionService` with the same actor-bound authorization,
4
+ private asset runtime, transaction executor and guardian Grade boundary. Both
5
+ LearnerAuthorizer and CatalogAuthorizer receive the active executor. Host session
6
+ heartbeats and current permission checks must use that supplied executor, including
7
+ nested guardian review; a captured outer pool can wait on its own transaction.
8
+ CatalogService obtains the executor through the public collection.db getter and
9
+ fails closed when its four catalog collections do not share the same handle. It is an
10
+ additive API; existing Submission/Grade consumers retain their contracts. The six
11
+ closed `Workbook*` models are package-manifest models. Apply normal application
12
+ schema migrations before using them; the service never creates runtime schema.
13
+
14
+ A guardian calls `resolveWorkbookActivity` with an explicit learner, workbook key,
15
+ title, edition (empty means unknown), page key and printed page label. Keys identify
16
+ the physical copy/edition and page occurrence, including section/side where needed.
17
+ Names and photo hashes do not establish identity. A conflicting reuse fails. One
18
+ private personal-use-copy course/enrollment per learner/workbook supplies internal
19
+ submission scaffolding. The public page API needs no course-building workflow.
20
+
21
+ `captureWorkbookWork` owns original files through SubmissionAsset and creates an
22
+ immutable attempt with source SHA-256 hashes, actual page bounds, actor, capture
23
+ time, assistance, correction predecessor/episode, policy version and effective
24
+ review-required flag. Assistance defaults to `unknown`. Capture retries reuse the
25
+ same Submission/attempt and reject changed bytes or help claims. A correction
26
+ requires the same learner/activity/current predecessor and stays in the same
27
+ practice episode. Analysis/reanalysis adds revisions, never practice attempts.
28
+ Existing LessonProgress.attempts remains a compatibility capture counter.
29
+
30
+ The workbook review-required policy defaults on and is shared by its pages.
31
+ `setWorkbookFeedbackPolicy` uses expected policy version; existing capture snapshots
32
+ remain unchanged. Policy changes cannot erase prior disclosure. Guarded capture,
33
+ policy and decision writes serialize on the learner within the active transaction.
34
+ Ingestion target resolution acquires that learner lock before the enrollment lock,
35
+ matching capture/review order. Guardian apply follows authorized timeline cursors
36
+ when locating a preserved assessment on an older attempt.
37
+ Composite mutations also use the education transaction's serialized composite
38
+ queue, allowing inherited queued capture/review writes without queue recursion.
39
+ Any swallowed mutation error still aborts the complete transaction and file rollback
40
+ uses the inherited fresh-file compensation ledger.
41
+
42
+ ## Structured assessment and real ingestion
43
+
44
+ `WorkbookAssessment` version 1 has stable question IDs, original/corrected prompt
45
+ and answer text, explicit result/reason, nullable points, feedback, retained source
46
+ anchors and curated concept mappings. An anchor names an owned asset plus SHA-256,
47
+ one-based verified page (or null for a whole-file PDF source) and normalized
48
+ x/y/width/height rectangle. Ingestion proposals never generate rectangles: the
49
+ service uses [0,0,1,1] and explicit source/page grounding with limitations. The provider wire contract
50
+ contains evidenceId only, with no page/rect selector. An image is a known single
51
+ page; PDF questions retain a whole original-file anchor with page:null, not a
52
+ claim about page 1. Extraction metadata remains provenance, never a model page
53
+ localization grant. Fictitious PDF
54
+ pages and foreign files fail. Missing, illegible, unsupported and absent questions
55
+ are unassessed; unassessed points stay null. Marking certainty, mapping certainty,
56
+ mapping review provenance and evidence limitations are distinct; absent certainty
57
+ is explicitly persisted as unknown. Reviewed overrides append new bodies and keep
58
+ original AI text inspectable.
59
+
60
+ The configurable vocabulary is trusted server configuration, not AI-created labels.
61
+ The default `WORKBOOK_MATH_VOCABULARY` has addition, subtraction and place value.
62
+ Other subjects may use an explicit curated `workbookVocabulary` on WorkbookService,
63
+ the ingestion handler factory and preservation helper. Unknown concept IDs fail;
64
+ zero mapped concepts is valid. AI mappings are proposed, guardian mappings reviewed.
65
+ Known question IDs are pinned across captures; exact prompts are pinned within a
66
+ capture's reanalysis only. Correction transcriptions come from the new capture,
67
+ so earlier answer-bearing prompts cannot override corrected work. Immutable
68
+ historical prompts remain unchanged. The public `getWorkbookQuestionIdentity`
69
+ returns IDs only: historical prompt text can itself include a learner response.
70
+ Handlers use printed number/occurrence/subpart when present; unnumbered tasks use
71
+ answer-free printed-task slugs with visible-task occurrence/subpart, never output
72
+ array position or learner answers. They
73
+ read prompt, answer, feedback and marks exclusively from current evidence. New
74
+ prompts should contain printed task text without the learner response. An absent
75
+ or ambiguously matched known question is unassessed/not_present with an explicit
76
+ limitation. Missing, duplicate, invented or foreign IDs reject the proposal; a
77
+ changed question order does not change identity. The ID check does not establish
78
+ semantic equivalence of printed tasks; uncertain correspondence requires human
79
+ review rather than an invented match.
80
+ A different page/question requires explicit new activity identity, never AI retargeting.
81
+
82
+ `captureEducationIntake` accepts optional `workbookActivityId`/`assistance` when its
83
+ service is WorkbookService. It preserves the existing return SubmissionView and
84
+ binds the workbook attempt/policy before the host queues processing.
85
+ `educationIntakeHandlers({workbookActivityId,...})` advertises a bounded JSON question
86
+ schema to real ingestion generation. Assessed results require reason none;
87
+ unassessed reasons require null points. Per-question outcomes must agree with
88
+ points. Correctness is independent of scoring: readable objectively solvable
89
+ arithmetic may be assessed without a printed rubric. When no point allocation is
90
+ evidenced, both `points` and `possiblePoints` remain null for every result,
91
+ including incorrect; never invent weights or mix null/numeric values. The
92
+ aggregate still counts correct/incorrect results while its score remains null.
93
+ Incorrect earns zero only when the possible-point allocation is known.
94
+ Model aggregate scores/narratives are not requested or trusted: exact
95
+ count summaries and points scores are computed from validated questions without
96
+ rounding or invented partial credit. Default legacy handlers remain compatible.
97
+ `preserveWorkbookIntakeAnalysis` reads the public immutable completed generation,
98
+ checks its exact submission and offered workbook schema, maps cited original
99
+ ingestion evidence by hash/order to retained education-owned files and imports one
100
+ validated proposal. Provider/model/version, configuration/rubric, source analysis
101
+ pin and proposal digest are durable provenance. Pending/failed processing produces
102
+ no assessment. Malformed/ambiguous/foreign-source proposals return typed needs_review with no
103
+ education revision or Grade. The host can offer retry/review without a route 500.
104
+ Authorization, durable-source integrity and database failures still throw. Repeated
105
+ transfer is idempotent by analysis attempt. Preservation must complete before host
106
+ scratch retention cleanup; there is no automatic retention bypass in this API.
107
+ The ingestion handler can apply only an exact previously preserved proposal through
108
+ guardian review; it never grants AI grade authority. No prose parsing is used. The generation configuration carries bounded source
109
+ hash/page-support provenance from the completed extraction before it ceases to be
110
+ the current analysis. This uses public ingestion APIs and is pinned by its
111
+ configuration digest; question anchors always use honest source-only grounding.
112
+
113
+ ## Authority, visibility and history
114
+
115
+ `recordWorkbookAnalysis` accepts authorized submit context and writes provisional
116
+ AI revisions only. `reviewWorkbookAssessment` requires guardian authority, exact
117
+ source revision, expected current guardian head and stable request key. It appends
118
+ an immutable guardian revision recording sourceRevisionId, superseded head, actor,
119
+ time and decision reason. Changed retries conflict. Review of the current capture
120
+ uses the existing guardian Grade/progress boundary. Historical annotation changes
121
+ its evidence authority only and cannot grade or reopen its successor. Reanalysis
122
+ after a guardian decision remains provisional. A guardian can invalidate an outcome
123
+ with an unassessed replacement and a stated reason; old AI does not regain authority.
124
+
125
+ `releaseWorkbookFeedback` separately releases an exact revision using expected
126
+ current guardian head. New stale releases fail; accepted retry requests replay their
127
+ original result after later decisions. Release creates no Grade. With the gate off,
128
+ AI feedback is visible as provisional while authoritative grading still requires a
129
+ guardian. Gate-on learners receive no unreleased assessment payloads, scores or
130
+ hints. WorkbookService's ordinary getSubmission also redacts Grade for own learners;
131
+ hosts must route workbook reads through this service and prevent legacy routes from
132
+ serving workbook grades. Guardian history is complete; learners see only their own
133
+ work and visible revisions. Answer keys/source storage URIs never enter these DTOs.
134
+
135
+ `acknowledgeWorkbookFeedbackDelivery` is an authenticated own-learner acknowledgment
136
+ for an exact currently visible feedback revision. It deduplicates per actor/revision
137
+ and rejects withheld, foreign, sibling and guardian acknowledgments. Immutable
138
+ delivery events record actor/time and mean rendered/delivered, never read or understood.
139
+
140
+ `getWorkbookTimeline` uses education rows/assets without reading ingestion. It lists
141
+ newest captures/revisions first, includes all releases/delivery events and provides
142
+ cursor pagination (1–100, default 25). A guardian revisionId selector locates its
143
+ containing capture for evidence links. Guardian source IDs/actors/reasons remain
144
+ inspectable. Released historical revisions remain visible after supersession.
145
+
146
+ `getConceptEvidenceSummary` is guardian-only for this milestone. It recomputes from
147
+ current guardian revisions, separates provisional observations, and reports independent,
148
+ assisted and unknown evidence. Correction captures remain one episode; they cannot
149
+ be extra independent demonstrations. Every observation cites capture, question,
150
+ revision, episode, result, assistance and time. Unassessed work is excluded from
151
+ error/correct counts. Descriptive cues cite actual evidence: needs practice, improving
152
+ on this item, needs a fresh independent check, not enough evidence. No mastery
153
+ percentage, generic score comparison, hidden threshold or predictive label is used.
154
+
155
+ ## Preserved processing status and retention
156
+
157
+ `getWorkbookPreservationState` authorizes exact actor/learner/activity/submission
158
+ and returns only the intake ID plus retained assessment/analysis IDs and the
159
+ interpretation revision. It contains no questions, scores, feedback or hidden
160
+ assessment payloads. New AI provenance records `analysisRevision` from the
161
+ completed interpretation snapshot, separately from its extraction-source pin.
162
+
163
+ `preserveWorkbookIntakeAnalysis` checks this education-owned state and the public
164
+ content-free ingestion item revision before requesting raw completed analysis.
165
+ An exact already-preserved revision returns `retained` immediately. Guardian
166
+ review, release, corrections and receipt expiry therefore do not force a stale
167
+ proposal reread or prevent durable education history from loading. The public
168
+ ingestion stale-snapshot guard remains unchanged and still rejects the old raw
169
+ snapshot after guardian grading. A genuinely new valid analysis can append a new
170
+ provisional revision; a novel stale analysis returns `needs_review/stale_analysis`
171
+ and creates no mark. Legacy retained rows without interpretation revision remain
172
+ readable when scratch is stale/unavailable or the public
173
+ ProposalsNotConfiguredError reports removed provider read configuration. A novel
174
+ analysis with no provider read configuration returns unavailable without import; an authorized current snapshot whose
175
+ attempt ID is already retained is also skipped before retry reconstruction.
176
+
177
+ Only the exact public scratch `Intake unavailable` response is translated to
178
+ retained history, or `unavailable` for a capture with no retained assessment,
179
+ after independent education authorization. Missing/pending current analysis may
180
+ return pending or retained. Unexpected configuration, integrity and database
181
+ failures still throw. This does not widen scratch access: no stale or unavailable
182
+ raw proposal is read, imported or used as grade authority. Hosts must also render
183
+ the authorized education timeline independently of optional scratch processing.
184
+
185
+ ## Compatibility API privacy boundary
186
+
187
+ Workbook feedback is projected only from the revision/release workflow. The base
188
+ `SubmissionService` recognizes authoritative `WorkbookActivity` lesson ownership,
189
+ including calls through a plain service instance. Own-learner compatibility views
190
+ withhold Grade and grade-derived status; learner progress projections withhold
191
+ bestScore/completedAt and do not let completion alter next-lesson selection.
192
+ Guardian and ordinary non-workbook projections retain their existing behavior.
193
+ This applies in both feedback policy modes; direct feedback remains provisional
194
+ and does not authorize compatibility Grade disclosure.
195
+
196
+ Generic capture/resubmission rejects workbook enrollment or lesson scaffolding,
197
+ including idempotent retries. Only the protected exact-activity owning workflow
198
+ can capture workbook work. Hosts must call public
199
+ `assertNonWorkbookSubmissionScope` before legacy intake receipt creation and when
200
+ reading an old legacy binding, using authoritative enrollment, lesson and
201
+ predecessor selectors. `WorkbookWorkflowRequiredError` is a controlled denial.
202
+ The browser's optional workbook flag is never authority. Authenticated original
203
+ asset delivery remains a separate read authorization path.
204
+
205
+ ## Validation and limits
206
+
207
+ `src/__tests__/workbook-workflows.ts` is the shared SQLite/PostgreSQL contract suite;
208
+ `workbook-service.test.ts` runs SQLite, and `workbook.optional.test.ts` runs against
209
+ an available isolated PostgreSQL database. Workers never provision service stacks.
210
+ Run package test/typecheck/build; the integration owner runs test:postgres and the
211
+ integrated review. Synthetic provider DTO tests establish transfer integrity, not
212
+ real handwriting accuracy. Actual provider/sample and app restart/retention
213
+ acceptance remain separate integration evidence. Family deletion/export/backup
214
+ policy and automatic lesson generation are not implemented by this milestone.
215
+
216
+ ## Identity-independent work
217
+
218
+ [Photo intake](photo-intake.md#marking-before-filing) may own an explicit unfiled
219
+ work unit. Its nullable workbook FK is constrained to an exact retained receipt;
220
+ private enrollment/worksheet routing is technical rather than bibliographic.
221
+ The same attempt/assessment/review/release and concept-evidence contracts apply.
222
+ `filing` is optional on legacy-shaped DTOs and explicit on current projections.
223
+ Append-only filing changes display association only; it never moves immutable
224
+ learning evidence or changes captured review policy. Ordinary identified workbook
225
+ identity and generated-surface restrictions remain unchanged.
226
+
227
+ ### Unnumbered visible questions
228
+
229
+ A printed question number is not required for marking. On the first valid
230
+ assessment, an unnumbered task may use `u:<short printed-task slug>:<occurrence/subpart>`
231
+ from current answer-free task text and unambiguous visible task identity. The
232
+ occurrence distinguishes tasks in the source, never positions in a generated
233
+ questions array. Responses, computed solutions and changing evidence UUIDs cannot
234
+ supply identity. Printed IDs remain useful where present; both forms share the
235
+ existing nonempty/unique ID schema and 200-character bound.
236
+
237
+ Once preserved, the exact ID set remains pinned on reanalysis and correction.
238
+ Reordering output does not renumber tasks. A cropped, duplicate or illegible task
239
+ whose correspondence cannot be established remains `unassessed/not_present` with
240
+ a limitation on its known ID; it cannot be silently relabeled as another task.
241
+ Historical IDs are correspondence hints, not evidence of current responses.
242
+ Missing IDs, collisions, changed ID sets and same-capture prompt remapping still
243
+ fail closed. The framework never inserts omitted provider IDs or parses prose to
244
+ repair malformed proposals.
245
+
246
+ ### Semantic identity visibility
247
+
248
+ Question IDs can contain printed task text. Own-learner identity reads and
249
+ operation discovery therefore require release of the **selected exact revision**
250
+ on a guardian-origin source attempt. An unrelated revision or another attempt's
251
+ release is insufficient. Ordinary own-origin IDs remain available for legitimate
252
+ current-work marking and corrections without exposing withheld grades/feedback.
253
+
254
+ Correction ancestry is checked completely under the same tenant, learner,
255
+ activity and practice episode. Each guardian-origin ancestor must have an exact
256
+ released revision publishing the compatible immutable ID set before a descendant
257
+ can expose those semantic IDs. Matching published ID sets preserve already public
258
+ historical snapshots after a later private head, without aliases or rewritten IDs.
259
+ Missing, corrupt or cyclic ancestry fails closed; there is no depth cutoff that
260
+ silently skips earlier source guards. Current descendant release never grants
261
+ rights to a hidden ancestor.
262
+
263
+ The same boundary governs child correction capture, timeline payloads and delivery
264
+ acknowledgments, including legacy/trusted-produced descendants. Raw provisional
265
+ revision writes/returns cannot probe or replay guardian-origin private content;
266
+ authorized guardians retain processing/history access, and own-origin correction
267
+ marking remains supported once ancestral source identity is published. Schema,
268
+ ID collision/remapping rules and immutable stored history remain unchanged.
269
+
270
+ The offered marking schema mirrors the assessment validator: assessed results use
271
+ `markingCertainty` clear/unknown; `uncertain` marking requires `unassessed`, an
272
+ allowed non-none reason and both point fields null. This is not a conversion of
273
+ provider output: contradictory results remain refused. Mapping certainty remains
274
+ independent. Visible but overwritten/ambiguous responses can stay unassessed while
275
+ other clearly visible questions are assessed in the same valid proposal.
276
+
277
+ ### Observed assessment layout
278
+
279
+ Optional `WorkbookAssessment.layout` version 1 describes observed sections in source
280
+ order and zero-based row/column question placements. It is advisory, with fixed
281
+ `provenance: 'observed'`; it never establishes identity or verified geometry.
282
+ Sections reference a retained source asset and a physical one-based observed page,
283
+ or null when unknown. A whole-file PDF anchor may support an observed page within
284
+ its retained page count while keeping its original anchor page null. Every placed
285
+ question must anchor the section's exact source. Multiple question IDs may share a
286
+ cell. When every placement in a cell has an explicit `part`, sort by part then
287
+ original question array index for ties. If any placement in that cell omits
288
+ `part`, the whole cell follows original question array order. Partial placement is valid. Missing `readingOrder` preserves original
289
+ question order for a flattened display.
290
+
291
+ The browser-safe `normalizeWorkbookObservedLayout` copies only bounded known
292
+ fields: at most 32 sections and 200 placements, 1–8 columns, rows 0–199, parts
293
+ 0–31, section IDs up to 64 characters and labels up to 200. Duplicate section IDs
294
+ or question placements, invalid source/page/placement references and malformed
295
+ metadata discard the complete optional layout and retain `layoutOmission: 'invalid'`.
296
+ Valid answers and normal assessment validation remain independent. Owning analysis
297
+ and guardian writes both normalize against the current capture's source hashes;
298
+ a correction cannot inherit a previous capture's source layout. Default guardian
299
+ copies retain valid layout and safe omission markers. Bodies remain immutable JSON
300
+ inside existing revision privacy and exact release boundaries; no migration or
301
+ additional learner visibility is introduced.
302
+
303
+ Focused shared SQLite/PostgreSQL cases live in
304
+ `src/__tests__/workbook-layout-workflows.ts`, with SQLite in
305
+ `workbook-layout-service.test.ts` and isolated PostgreSQL in
306
+ `workbook-layout.optional.test.ts`. Pure bounds/reference cases are in
307
+ `workbook-layout.test.ts`. Integration runs the PostgreSQL wrapper under its
308
+ existing isolated database lifecycle.
309
+
310
+ Generation carries optional `layout` as advisory JSON so malformed presentation
311
+ cannot make valid question answers fail the generic schema. Its described wire
312
+ shape uses original evidence IDs; the bridge maps those IDs to retained assets
313
+ and then calls the strict owner normalizer. Within existing transport/JSON resource
314
+ limits, wrong types, unknown versions and conflicting metadata are omitted with
315
+ only the safe marker, while answers retain their normal strict validation. Layout
316
+ never establishes a question ID, a source authorization or a verified region.
317
+
318
+
319
+ ### Same-capture reread context
320
+
321
+ `getWorkbookQuestionContext` returns authorized canonical `{id,prompt}` only
322
+ from the exact current attempt's identity revision. Generation preserves those
323
+ strings verbatim for the existing strict same-capture prompt invariant, while
324
+ rereading learner responses and any observed layout from current evidence. This
325
+ context is not an answer key or authority for answers. A correction without its
326
+ own revision receives predecessor IDs only; predecessor prompts are never copied.
327
+ Exact source/revision and full correction-ancestry visibility apply to both paths,
328
+ including own-learner reads. No historical rows are rewritten and absent layout
329
+ remains valid. `getWorkbookQuestionIdentity` remains the IDs-only public API.
330
+
331
+ Canonical prompts follow ordinary assessment payload visibility, including
332
+ captured review policy and exact guardian revision release even for learner-owned
333
+ sources; source/ancestry authorization alone does not publish guardian edits.
334
+ For ingestion callbacks only, the engine supplies current `analysisRevision` from
335
+ its owned item row. Context selection ignores AI materialized by that exact
336
+ current-attempt revision, so preserving a proposal does not invalidate its own
337
+ completed snapshot or preview. It never ignores guardian decisions, predecessor
338
+ revisions or another interpretation. Direct reads omit this engine pin and retain
339
+ normal current revision visibility; browser/upload fields cannot supply the pin.
340
+
341
+ ### Observed answer-region overlays
342
+
343
+ Optional `answerRegions` version1/provenance observed/coordinateSpace
344
+ `display-oriented` carries one approximate rect `[x,y,width,height]` per question,
345
+ with exact retained asset/page1 and observationId. Rects are normalized to the
346
+ whole EXIF-oriented image; they never change question IDs, grading, anchors or
347
+ layout, and never claim verified geometry. Images only in this version; PDFs or
348
+ unknown positions omit regions. Direct malformed metadata is omitted with safe
349
+ `answerRegionsOmission: invalid`; marking/layout survive independently.
350
+
351
+ Vision catalogs originate in the existing opt-in extraction call. Generation
352
+ references exact evidence/observation IDs, never supplies coordinates. The bridge
353
+ copies catalog rectangles from the extraction-pinned configuration with matching
354
+ source hash. Guardian copies retain them; correction sources must match current
355
+ anchors. Existing exact release and ancestry privacy apply to the complete body.
@@ -0,0 +1,74 @@
1
+ # Workbook behavior/test matrix
2
+
3
+ Design derived from the approved Hearth workbook plan (2026-10-22), learning-record
4
+ contract and WB-001–WB-019 preparation packet (2026-10-23). Feature-class additive
5
+ schema/API change, Refs #4334. Named risk: private learner evidence, authorization,
6
+ concurrency and structured external model output. Compatibility workbook captures now require their owning workflow; ordinary non-workbook Submission/Grade behavior is unchanged.
7
+
8
+ Every row uses current actor-bound service context, exact tenant/learner resources,
9
+ and the same authorization callback executor as persistence. Shared command C:
10
+ `pnpm --filter @happyvertical/smrt-education exec vitest run workbook-service.test.ts`.
11
+ Shared command P: `pnpm --filter @happyvertical/smrt-education test:postgres` (integration
12
+ owner provisions PostgreSQL). Source assertions live in `workbook-workflows.ts` and
13
+ are shared without dialect-dependent logic. Worker evidence is SQLite/Node26;
14
+ PostgreSQL execution is explicitly pending integration, never inferred from skips.
15
+
16
+ | Behavior/invariant | Reachable trigger | Positive case | Negative/failure case | Actor/context | Data executor/transaction | Supported runtime/dialect | External contract edge | Test level | Validation command |
17
+ |---|---|---|---|---|---|---|---|---|---|
18
+ | Explicit workbook/page identity | Guardian resolves named physical workbook | Same keys return same activity; repeated label in different section and edition stays distinct; pages share workbook enrollment | Changed title/edition on same key rejected; learner cannot plan | Guardian allowed; learner, sibling, foreign denied | Serialized composite write, learner row lock and unique key; rollback test | Node26 SQLite/PostgreSQL | User-confirmed keys, no photo matching | Service integration | C, P |
19
+ | Durable capture and policy snapshots | Own learner uploads/corrects | Private assets/hashes/page bounds, retained policyVersion; correction retains episode | Changed retry bytes/help; wrong predecessor; transaction abort leaves no authoritative workbook activity | Own learner/guardian allowed; exact ownership rechecked | Existing capture/storage compensation inside education transaction | Node26 SQLite/PostgreSQL | SubmissionPage MIME/bytes; absent assistance defaults unknown | Service integration | C, P; inherited submission rollback suite |
20
+ | Immutable review/authority | Guardian confirms/overrides exact revision | Immutable AI + guardian revisions; source revision, reason, actor/time retained; current review makes Grade | Learner grading; stale expected head; update/delete immutable history rejected; historical review cannot grade successor | Guardian grade required | Both queues serialized; same-scope concurrent decisions; swallowed failure rolls back Grade/revision | Node26 SQLite/PostgreSQL | Unknown result enum, malformed points/JSON, foreign sources fail | Service integration | C, P |
21
+ | Feedback policy/release/delivery | Timeline, explicit release, authenticated render acknowledgment | Gate-off AI provisional; gate-on exact release; historical availability retained; render dedup per actor/revision | Withheld payload absent; ordinary getSubmission grade redacted; stale release/head/changed retry; guardian cannot attest learner delivery | Guardian full history; own learner projected; sibling/foreign denied | Immutable release/delivery transaction; no Grade on release/direct mode | Node26 SQLite/PostgreSQL | Missing optional certainty defaults unknown, request keys bounded | Service integration | C, P |
22
+ | Durable timeline and evidence locator | Education activity read after new service instance | Full history loads without ingestion reference, cursor and exact revision selector | Unknown cursor/revision and learner selector denied; no source URI | Exact tenant/learner; guardian revision locator | Read projection from education rows/assets only | Node26 SQLite/PostgreSQL | Ingestion service absent entirely for history | Service integration; actual restart/retention remains app acceptance | C, P |
23
+ | Real question DTO transfer | Public completed generation preservation helper | Provider/model/config/source pin retained; evidence IDs mapped by retained original hash; duplicate import reuses revision, reanalysis keeps attempt | Pending/failed creates no assessment; malformed unsupported+incorrect and unassessed/zero return typed needs_review; contradicted model totals are ignored and exact2of4 yields0.5; hallucinated rectangles discarded; foreign evidence or changed source rejected | Authorized submit bound exact activity/submission/intake | Ingestion read before education transaction, append-only education revision | Node26 SQLite/PostgreSQL | Strict handler JSON schema; no prose parser; model vocabulary cannot mint concepts | Contract + real education persistence; provider accuracy N/A here (synthetic DTO) | C, P; real provider QA integration separately |
24
+ | Unknown is not wrong | Unreadable, unanswered, absent or context-free question | Explicit unassessed/null points, unknown help | Unknown enum/concept, out-of-page anchor, uncertain marking with score, unanswered zero rejected | Authorized submit; guardian confirms evidence | Validated immutable body before save | Node26 SQLite/PostgreSQL | Bounded schema/anchors/concepts; original asset hash and actual PDF page bound | Service integration | C, P |
25
+ | Descriptive learning evidence | Guardian summary after wrong→assisted correction | Independent first incorrect separated from assisted correct; one episode; exact question/revision citations | Retry/reanalysis does not create practice; unassessed excluded from error counts; corrections never independent | Guardian-only first milestone | Deterministic fresh reduction over effective guardian revisions; provisional separate | Node26 SQLite/PostgreSQL | Curated server vocabulary; mapping proposed until guardian review | Reducer exercised through persisted service | C, P |
26
+
27
+ Evidence outputs are external to source:
28
+ `/Users/will/Work/tmp/hearth-upgrade-20261025/evidence/education-workbook/`.
29
+ The coordinator records exact final commit and integrated review/PG/app/provider
30
+ results. These synthetic contract tests do not establish handwriting accuracy,
31
+ actual device camera quality, deliberate deletion/export or backup/restore policy.
32
+
33
+ Real synthetic provider regression (2026-10-25): unsupported+incorrect is rejected,
34
+ model score0.75/three-correct narrative is ignored when question evidence is2of4,
35
+ whole-source geometry replaces unverified generated rectangles and PDF source-only
36
+ anchors have page:null. The shared workbook suite covers these as executable
37
+ regressions. A completed structured proposal rejected on educational semantics
38
+ remains in ingestion history. Malformed wire responses may retain only safe
39
+ diagnostics; without raw values a page-minimum failure cannot identify null
40
+ versus zero or prove a generic validator defect.
41
+
42
+ The source-only wire regression uses the public IngestionService preview API
43
+ and its generic handler schema validator on a real retained workbook receipt.
44
+ A JSON-roundtripped evidenceId-only proposal is accepted; malformed result/reason
45
+ and an extra page selector are rejected. Image anchors are page1; PDF source-only
46
+ anchors remain page:null. No conclusion about the unknown malformed provider
47
+ page value is inferred from the earlier minimum diagnostic.
48
+
49
+ Executor affinity regression: direct catalog read/private/answer-key callbacks
50
+ receive the exact shared public collection.db executor. Mixed catalog executors
51
+ fail before host authorization. Nested workbook guardian review asserts catalog
52
+ and learner callbacks share the same active transaction. A real PostgreSQL plus
53
+ SessionService heartbeat regression belongs to the host integration lane; synthetic
54
+ SQLite affinity alone is not proof that a pooled session lock can never deadlock.
55
+
56
+ Preservation regression uses actual public IngestionService generation with an
57
+ injected synthetic generator and actual WorkbookService persistence. It proves
58
+ the raw stale-snapshot guard still rejects after grading while preservation skips
59
+ the imported revision, allows a genuinely new provisional reanalysis, and keeps
60
+ review/release/correction history and child feedback gates intact after public
61
+ receipt expiry. Legacy stale/unavailable scratch is retained; novel stale analysis
62
+ is not imported; unexpected database errors propagate. This is service-integrity
63
+ evidence, not live-provider accuracy evidence.
64
+
65
+ Independent-review privacy regression (WB-PRIVACY-1/2): the shared suite exercises
66
+ plain LearnerService/SubmissionService and WorkbookService after guardian review
67
+ before release, in both policy modes. getSubmission, capture retry, listProgress,
68
+ assignmentLessons, startLesson and nextLessons do not disclose Grade, score or
69
+ grade-derived completion to the own learner. Generic capture/resubmission and
70
+ legacy preflight reject workbook enrollment/lesson/predecessor scopes without
71
+ creating submissions or grades; legitimate owning-workflow retries and corrections
72
+ still work. Guardian projections and ordinary non-workbook captures/retries remain
73
+ unchanged. The app signed-session PostgreSQL lane separately exercises legacy
74
+ host/upload/review routes and asserts no new receipts, submissions or grades.
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-acquisition-service.d.ts","sourceRoot":"","sources":["../src/catalog-acquisition-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EAErB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CACT,UAAU,EAAE,MAAM,GACjB,OAAO,CACR,CAAC,mBAAmB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAC7E,CAAC;IACF,YAAY,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAChD,eAAe,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;IAClD,iBAAiB,CACf,KAAK,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAClE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AASD,gGAAgG;AAChG,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,qBAAqB,EAC9B,MAAM,gBAAsB;IAGzC,OAAO,CACX,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC;CAgErC"}
1
+ {"version":3,"file":"catalog-acquisition-service.d.ts","sourceRoot":"","sources":["../src/catalog-acquisition-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qBAAqB,EAErB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CACT,UAAU,EAAE,MAAM,GACjB,OAAO,CACR,CAAC,mBAAmB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAC7E,CAAC;IACF,YAAY,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAChD,eAAe,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;IAClD,iBAAiB,CACf,KAAK,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAClE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AASD,gGAAgG;AAChG,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,qBAAqB,EAC9B,MAAM,gBAAsB;IAGzC,OAAO,CACX,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC;CAgFrC"}
@@ -0,0 +1,21 @@
1
+ import type { CatalogAcquisitionCapabilityDecision, CatalogResourceRepresentation, CatalogSourceRecord } from './catalog-contracts.js';
2
+ /** Closed observed MIME mapping; icons and file names never establish a format. */
3
+ export declare const CATALOG_REPRESENTATION_MEDIA_TYPES: {
4
+ readonly pdf: "application/pdf";
5
+ readonly zip: "application/zip";
6
+ readonly docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
7
+ };
8
+ /** Bound and validate a complete Content-Type before retaining its canonical token. */
9
+ export declare function catalogRepresentationMediaType(value: string): string;
10
+ export declare function catalogRepresentationFormat(mediaType: string): keyof typeof CATALOG_REPRESENTATION_MEDIA_TYPES | undefined;
11
+ export declare class CatalogRepresentationError extends Error {
12
+ readonly code = "invalid-representation-metadata";
13
+ constructor();
14
+ }
15
+ /** Missing/null is legacy; malformed present data always throws, never becomes absence. */
16
+ export declare function normalizeCatalogRepresentation(value: unknown): CatalogResourceRepresentation | undefined;
17
+ /** Read-only preselection guard for NEW downloads. It does not authorize legal use or pinned-byte printing. */
18
+ export declare function evaluateCatalogAcquisitionCapability(resource: Pick<CatalogSourceRecord, 'availableFormats' | 'representation'>, format: string, limits?: {
19
+ maxBytes?: number;
20
+ }): CatalogAcquisitionCapabilityDecision;
21
+ //# sourceMappingURL=catalog-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-capability.d.ts","sourceRoot":"","sources":["../src/catalog-capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,mFAAmF;AACnF,eAAO,MAAM,kCAAkC;;;;CAIrC,CAAC;AACX,uFAAuF;AACvF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASpE;AACD,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,GAChB,MAAM,OAAO,kCAAkC,GAAG,SAAS,CAK7D;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,qCAAqC;;CAKnD;AAiBD,2FAA2F;AAC3F,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,6BAA6B,GAAG,SAAS,CA4F3C;AAED,+GAA+G;AAC/G,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,gBAAgB,CAAC,EAC1E,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,oCAAoC,CA4CtC"}
@@ -14,6 +14,44 @@ export interface CatalogLicenseEvidence {
14
14
  /** Operations expressly authorized by the source evidence. */
15
15
  permittedOperations?: CatalogOperation[];
16
16
  }
17
+ /** Observed bytes and NEW acquisition support; independent of legal permissions. */
18
+ interface CatalogRepresentationMetadata {
19
+ byteLength: number;
20
+ validators: {
21
+ etag: string;
22
+ lastModified: string;
23
+ };
24
+ }
25
+ export type CatalogResourceRepresentation = CatalogRepresentationMetadata & ({
26
+ format: 'pdf' | 'zip' | 'docx';
27
+ mediaType: 'application/pdf' | 'application/zip' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
28
+ acquisition: {
29
+ status: 'supported';
30
+ maxBytes: number;
31
+ } | {
32
+ status: 'unsupported-format';
33
+ } | {
34
+ status: 'size-limit';
35
+ maxBytes: number;
36
+ };
37
+ } | {
38
+ format: 'unknown';
39
+ /** Null records an absent header; otherwise the observed canonical MIME token. */
40
+ mediaType: string | null;
41
+ acquisition: {
42
+ status: 'unknown-format';
43
+ reason: 'missing-content-type' | 'unrecognized-content-type';
44
+ };
45
+ });
46
+ export type CatalogAcquisitionCapabilityDecision = {
47
+ allowed: true;
48
+ verification: 'observed' | 'legacy';
49
+ } | {
50
+ allowed: false;
51
+ reason: 'format-unavailable' | 'unsupported-format' | 'unknown-format' | 'size-limit' | 'invalid-representation-metadata';
52
+ maxBytes?: number;
53
+ byteLength?: number;
54
+ };
17
55
  /** A provider's durable source record. It remains distinct after deduplication. */
18
56
  export interface CatalogSourceRecord {
19
57
  providerId: string;
@@ -32,6 +70,7 @@ export interface CatalogSourceRecord {
32
70
  resourceType?: string;
33
71
  parentStableId?: string;
34
72
  availableFormats?: string[];
73
+ representation?: CatalogResourceRepresentation;
35
74
  licenseEvidence: CatalogLicenseEvidence;
36
75
  visibility: CatalogVisibility;
37
76
  }
@@ -92,4 +131,5 @@ export interface CatalogActor {
92
131
  actorUserId: string;
93
132
  roles: readonly string[];
94
133
  }
134
+ export {};
95
135
  //# sourceMappingURL=catalog-contracts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-contracts.d.ts","sourceRoot":"","sources":["../src/catalog-contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog-contracts.d.ts","sourceRoot":"","sources":["../src/catalog-contracts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-database-sync-store.d.ts","sourceRoot":"","sources":["../src/catalog-database-sync-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAK5D,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AA2ClE,wEAAwE;AACxE,qBAAa,wBAAyB,YAAW,gBAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAE5C,aAAa,CACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAQvC,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3D,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCjE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAazE"}
1
+ {"version":3,"file":"catalog-database-sync-store.d.ts","sourceRoot":"","sources":["../src/catalog-database-sync-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAM5D,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AA2ClE,wEAAwE;AACxE,qBAAa,wBAAyB,YAAW,gBAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAE5C,aAAa,CACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAQvC,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3D,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCjE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAazE"}
@@ -1,5 +1,5 @@
1
1
  import { SmrtObject } from '@happyvertical/smrt-core';
2
- import type { CatalogLicenseState, CatalogVisibility } from './catalog-contracts.js';
2
+ import type { CatalogLicenseState, CatalogResourceRepresentation, CatalogVisibility } from './catalog-contracts.js';
3
3
  /** Globally visible provider registration. Hosts configure adapters and credentials out of band. */
4
4
  export declare class CatalogProvider extends SmrtObject {
5
5
  providerId: string;
@@ -21,6 +21,10 @@ export declare class CatalogResource extends SmrtObject {
21
21
  resourceType: string;
22
22
  parentStableId: string;
23
23
  availableFormats: string;
24
+ /** Serialized observed representation; JSON null is legacy absence. */
25
+ representation: string;
26
+ getRepresentation(): CatalogResourceRepresentation | undefined;
27
+ setRepresentation(value: CatalogResourceRepresentation | undefined): void;
24
28
  licenseEvidence: string;
25
29
  licenseState: CatalogLicenseState;
26
30
  visibility: CatalogVisibility;
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-models.d.ts","sourceRoot":"","sources":["../src/catalog-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAE/E,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,oGAAoG;AACpG,qBACa,eAAgB,SAAQ,UAAU;IAClB,UAAU,SAAM;IAChB,IAAI,SAAM;IACrC,MAAM,UAAQ;CACf;AAED,oFAAoF;AACpF,qBACa,eAAgB,SAAQ,UAAU;IAClB,UAAU,SAAM;IAChB,QAAQ,SAAM;IACd,QAAQ,SAAM;IACzC,YAAY,SAAM;IACS,KAAK,SAAM;IACtC,mBAAmB,SAAM;IACzB,MAAM,SAAM;IACZ,QAAQ,SAAQ;IAChB,MAAM,SAAQ;IACd,QAAQ,SAAM;IACd,YAAY,SAAM;IAClB,cAAc,SAAM;IACpB,gBAAgB,SAAQ;IACxB,eAAe,SAAQ;IACvB,YAAY,EAAE,mBAAmB,CAAa;IAC9C,UAAU,EAAE,iBAAiB,CAAa;IAC1C,8EAA8E;IAC9E,aAAa,SAAM;IACnB,WAAW,SAAM;CAClB;AAED,0FAA0F;AAC1F,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,kEAAkE;IACvC,UAAU,SAAM;IAC3C,MAAM,SAAM;IACZ,kFAAkF;IAClF,KAAK,SAAM;IACX,QAAQ,UAAS;IACjB,MAAM,UAAS;IACf,WAAW,SAAM;IACjB,aAAa,SAAK;IAClB,QAAQ,SAAQ;IAChB,gBAAgB,SAAM;CACvB;AAED,mFAAmF;AACnF,qBAEa,gBAAiB,SAAQ,UAAU;IAClC,QAAQ,SAAM;IACyB,UAAU,SAAM;IACxC,gBAAgB,SAAM;IACtB,gBAAgB,SAAM;CAClD;AAED,yFAAyF;AACzF,qBAEa,kBAAmB,SAAQ,UAAU;IACpC,QAAQ,SAAM;IACyB,UAAU,SAAM;IACf,WAAW,SAAM;IAC1C,QAAQ,SAAM;IACd,MAAM,SAAM;IACZ,MAAM,SAAM;IACvC,WAAW,SAAM;IACjB,OAAO,SAAM;CACd"}
1
+ {"version":3,"file":"catalog-models.d.ts","sourceRoot":"","sources":["../src/catalog-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAG/E,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,oGAAoG;AACpG,qBACa,eAAgB,SAAQ,UAAU;IAClB,UAAU,SAAM;IAChB,IAAI,SAAM;IACrC,MAAM,UAAQ;CACf;AAED,oFAAoF;AACpF,qBACa,eAAgB,SAAQ,UAAU;IAClB,UAAU,SAAM;IAChB,QAAQ,SAAM;IACd,QAAQ,SAAM;IACzC,YAAY,SAAM;IACS,KAAK,SAAM;IACtC,mBAAmB,SAAM;IACzB,MAAM,SAAM;IACZ,QAAQ,SAAQ;IAChB,MAAM,SAAQ;IACd,QAAQ,SAAM;IACd,YAAY,SAAM;IAClB,cAAc,SAAM;IACpB,gBAAgB,SAAQ;IACxB,uEAAuE;IACvE,cAAc,SAAU;IAExB,iBAAiB,IAAI,6BAA6B,GAAG,SAAS;IAG9D,iBAAiB,CAAC,KAAK,EAAE,6BAA6B,GAAG,SAAS,GAAG,IAAI;IAKzE,eAAe,SAAQ;IACvB,YAAY,EAAE,mBAAmB,CAAa;IAC9C,UAAU,EAAE,iBAAiB,CAAa;IAC1C,8EAA8E;IAC9E,aAAa,SAAM;IACnB,WAAW,SAAM;CAClB;AAED,0FAA0F;AAC1F,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,kEAAkE;IACvC,UAAU,SAAM;IAC3C,MAAM,SAAM;IACZ,kFAAkF;IAClF,KAAK,SAAM;IACX,QAAQ,UAAS;IACjB,MAAM,UAAS;IACf,WAAW,SAAM;IACjB,aAAa,SAAK;IAClB,QAAQ,SAAQ;IAChB,gBAAgB,SAAM;CACvB;AAED,mFAAmF;AACnF,qBAEa,gBAAiB,SAAQ,UAAU;IAClC,QAAQ,SAAM;IACyB,UAAU,SAAM;IACxC,gBAAgB,SAAM;IACtB,gBAAgB,SAAM;CAClD;AAED,yFAAyF;AACzF,qBAEa,kBAAmB,SAAQ,UAAU;IACpC,QAAQ,SAAM;IACyB,UAAU,SAAM;IACf,WAAW,SAAM;IAC1C,QAAQ,SAAM;IACd,MAAM,SAAM;IACZ,MAAM,SAAM;IACvC,WAAW,SAAM;IACjB,OAAO,SAAM;CACd"}
@@ -1,4 +1,4 @@
1
- import type { CatalogActor, CatalogLicenseEvidence, CatalogSourceRecord } from './catalog-contracts.js';
1
+ import type { CatalogActor, CatalogLicenseEvidence, CatalogResourceRepresentation, CatalogSourceRecord } from './catalog-contracts.js';
2
2
  import { CatalogPolicy } from './catalog-policy.js';
3
3
  export interface CatalogReadStore {
4
4
  search(input: {
@@ -28,6 +28,7 @@ export interface CatalogResourceView {
28
28
  resourceType?: string;
29
29
  parentStableId?: string;
30
30
  availableFormats?: string[];
31
+ representation?: CatalogResourceRepresentation;
31
32
  license: Pick<CatalogLicenseEvidence, 'state' | 'identifier' | 'version' | 'attribution' | 'exceptions' | 'retrievedAt'>;
32
33
  }
33
34
  export declare class CatalogReadService {
@@ -1 +1 @@
1
- {"version":3,"file":"catalog-read-service.d.ts","sourceRoot":"","sources":["../src/catalog-read-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC,CAAC;CAChE;AAED,yGAAyG;AACzG,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,IAAI,CACX,sBAAsB,EACpB,OAAO,GACP,YAAY,GACZ,SAAS,GACT,aAAa,GACb,YAAY,GACZ,aAAa,CAChB,CAAC;CACH;AAED,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,KAAK,EAAE,gBAAgB,EACvB,MAAM,gBAAsB;IAGzC,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAChE,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASjC,OAAO,CAAC,IAAI;CA6Cb"}
1
+ {"version":3,"file":"catalog-read-service.d.ts","sourceRoot":"","sources":["../src/catalog-read-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC,CAAC;CAChE;AAED,yGAAyG;AACzG,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,6BAA6B,CAAC;IAC/C,OAAO,EAAE,IAAI,CACX,sBAAsB,EACpB,OAAO,GACP,YAAY,GACZ,SAAS,GACT,aAAa,GACb,YAAY,GACZ,aAAa,CAChB,CAAC;CACH;AAED,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,KAAK,EAAE,gBAAgB,EACvB,MAAM,gBAAsB;IAGzC,MAAM,CACV,KAAK,EAAE,YAAY,EACnB,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAChE,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASjC,OAAO,CAAC,IAAI;CAiDb"}