@x12i/memorix-format 2.2.3 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +36 -86
  3. package/dist/base-reexport.d.ts +8 -0
  4. package/dist/base-reexport.d.ts.map +1 -0
  5. package/dist/base-reexport.js +8 -0
  6. package/dist/base-reexport.js.map +1 -0
  7. package/dist/cli.js +179 -15
  8. package/dist/cli.js.map +1 -1
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/v2/index.d.ts +7 -0
  14. package/dist/v2/index.d.ts.map +1 -0
  15. package/dist/v2/index.js +6 -0
  16. package/dist/v2/index.js.map +1 -0
  17. package/dist/v2/migrate-present.d.ts +47 -0
  18. package/dist/v2/migrate-present.d.ts.map +1 -0
  19. package/dist/v2/migrate-present.js +225 -0
  20. package/dist/v2/migrate-present.js.map +1 -0
  21. package/dist/v2/profiles.d.ts +9 -0
  22. package/dist/v2/profiles.d.ts.map +1 -0
  23. package/dist/v2/profiles.js +63 -0
  24. package/dist/v2/profiles.js.map +1 -0
  25. package/dist/v2/revision.d.ts +24 -0
  26. package/dist/v2/revision.d.ts.map +1 -0
  27. package/dist/v2/revision.js +44 -0
  28. package/dist/v2/revision.js.map +1 -0
  29. package/dist/v2/types.d.ts +94 -0
  30. package/dist/v2/types.d.ts.map +1 -0
  31. package/dist/v2/types.js +3 -0
  32. package/dist/v2/types.js.map +1 -0
  33. package/dist/v2/validate.d.ts +8 -0
  34. package/dist/v2/validate.d.ts.map +1 -0
  35. package/dist/v2/validate.js +225 -0
  36. package/dist/v2/validate.js.map +1 -0
  37. package/docs/association-format.md +3 -0
  38. package/docs/memorix-format.md +24 -186
  39. package/docs/memorix-record-v2.md +101 -0
  40. package/docs/memorix-workflow-format.md +13 -1
  41. package/docs/migrate-present-to-v2.md +49 -0
  42. package/examples/v2/activity-events-snapshots.json +31 -0
  43. package/examples/v2/employees-discovery.json +26 -0
  44. package/examples/v2/employees-snapshots.json +27 -0
  45. package/examples/v2/procedures-knowledge.json +27 -0
  46. package/examples/v2/work-items-analysis.json +26 -0
  47. package/examples/v2/work-items-context.json +32 -0
  48. package/examples/v2/work-items-decisions.json +26 -0
  49. package/examples/v2/work-items-raw.json +37 -0
  50. package/examples/v2/work-items-relationships-candidate.json +38 -0
  51. package/examples/v2/work-items-snapshots-lifecycle.json +31 -0
  52. package/examples/v2/work-items-snapshots-lightweight-refs.json +34 -0
  53. package/examples/v2/work-items-snapshots.json +28 -0
  54. package/examples/v2/work-items-workflow.json +28 -0
  55. package/package.json +7 -2
@@ -0,0 +1,49 @@
1
+ # memorix-record/2 — present → V2 migration semantics
2
+
3
+ ## Result shape
4
+
5
+ `migratePresentToV2` returns:
6
+
7
+ ```ts
8
+ {
9
+ ok: boolean;
10
+ v2: MemorixRecordV2; // clean V2; no copied associated payloads
11
+ extractedRelationships: [...]; // out-of-band; NOT persisted (Gate G4)
12
+ warnings: string[];
13
+ }
14
+ ```
15
+
16
+ ## Associated* handling
17
+
18
+ | Input | V2 record | extractedRelationships |
19
+ |---|---|---|
20
+ | Item with `recordId` (+ copied fields) | `associated*` removed from V2 | status `mapped` or `pending-metadata-resolution`; `droppedPayloadKeys` lists copied fields |
21
+ | Item without target `recordId` | removed | `quarantined-missing-recordId` |
22
+ | Non-array associated* | removed | warning; skipped |
23
+
24
+ Copied payload is never written onto V2. Resolvable links are never silently discarded.
25
+
26
+ Optional `associatedPropertyMap: { associatedPeople: "people-assigned-to-work-items" }` supplies `relationshipDefinitionId` when known.
27
+
28
+ ## Timestamps / identifiers
29
+
30
+ | Situation | Behavior |
31
+ |---|---|
32
+ | `createdAt` missing | default `now`; warning |
33
+ | `modifiedAt` missing | default to `createdAt`/`now`; warning |
34
+ | kind-named value missing | fall back to `value` / key tail / `recordId`; warning |
35
+ | Multiple old identifiers | primary from `_extIdentifier` only; extras not auto-alternates (warning path for future) |
36
+ | Unrecognized roots | dropped with warning |
37
+ | Subject `_graphRuns` etc. | dropped with warning (ops ledger owns run history) |
38
+
39
+ ## Success vs failure
40
+
41
+ - Migration **succeeds with warnings** when a V2 envelope is produced (`ok: true`) even if relationships are pending/quarantined.
42
+ - Callers should still run `validateMemorixRecordV2(result.v2)`.
43
+ - Migration does not throw on missing association targets; it quarantines.
44
+
45
+ ## Gate G4 boundary
46
+
47
+ **Authoritative physical relationship storage (Gate G4):** centralized org-prefixed per-category `relationships` collections (Candidate C). See `docs/re-factoring-and-ops-agent/RELATIONSHIP-STORAGE-DECISION.md`.
48
+
49
+ `migratePresentToV2` still extracts relationship candidates **out-of-band** and does not persist them onto the V2 record. Option A root `associated*` lightweight refs remain **format-valid** but are **not** the selected authoritative storage model.
@@ -0,0 +1,31 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "ae-500",
4
+ "revision": 1,
5
+ "objectType": "activity-events",
6
+ "contentType": "snapshots",
7
+ "dataCategory": "event",
8
+ "concept": {
9
+ "title": "status-note on WI-100",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "activityEventId",
13
+ "value": "AE-500",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "workItemId": "WI-100",
20
+ "actorId": "E-10",
21
+ "type": "status-note",
22
+ "message": "Draft outline complete",
23
+ "occurredAt": "2026-01-15T14:00:00.000Z"
24
+ },
25
+ "_system": {
26
+ "state": "active",
27
+ "createdAt": "2026-01-15T14:00:00.000Z",
28
+ "modifiedAt": "2026-01-15T14:00:00.000Z",
29
+ "observedAt": "2026-01-15T14:00:00.000Z"
30
+ }
31
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "employee-10",
4
+ "revision": 1,
5
+ "objectType": "employees",
6
+ "contentType": "discovery",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Discovery for employee-10",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "recordId",
13
+ "value": "employee-10"
14
+ }
15
+ }
16
+ },
17
+ "data": {
18
+ "discoveryType": "role-cluster",
19
+ "cluster": "operations"
20
+ },
21
+ "_system": {
22
+ "state": "active",
23
+ "createdAt": "2026-01-15T16:00:00.000Z",
24
+ "modifiedAt": "2026-01-15T16:00:00.000Z"
25
+ }
26
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "employee-10",
4
+ "revision": 1,
5
+ "objectType": "employees",
6
+ "contentType": "snapshots",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Alex Rivera",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "employeeId",
13
+ "value": "E-10",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "role": "operations-lead",
20
+ "email": "alex@fieldstone.example"
21
+ },
22
+ "_system": {
23
+ "state": "active",
24
+ "createdAt": "2026-01-10T10:00:00.000Z",
25
+ "modifiedAt": "2026-01-10T10:00:00.000Z"
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "proc-1",
4
+ "revision": 1,
5
+ "objectType": "procedures",
6
+ "contentType": "snapshots",
7
+ "dataCategory": "knowledge",
8
+ "concept": {
9
+ "title": "Quarterly review checklist",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "procedureId",
13
+ "value": "PROC-1",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "body": "1. Collect metrics\n2. Draft summary\n3. Review with lead",
20
+ "contentHash": "hash-proc-1-v1"
21
+ },
22
+ "_system": {
23
+ "state": "active",
24
+ "createdAt": "2026-01-01T00:00:00.000Z",
25
+ "modifiedAt": "2026-01-01T00:00:00.000Z"
26
+ }
27
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 1,
5
+ "objectType": "work-items",
6
+ "contentType": "analysis",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Analysis for wi-100",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "recordId",
13
+ "value": "wi-100"
14
+ }
15
+ }
16
+ },
17
+ "data": {
18
+ "analysisType": "delivery-risk",
19
+ "risk": "low"
20
+ },
21
+ "_system": {
22
+ "state": "active",
23
+ "createdAt": "2026-01-15T13:00:00.000Z",
24
+ "modifiedAt": "2026-01-15T13:00:00.000Z"
25
+ }
26
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 1,
5
+ "objectType": "work-items",
6
+ "contentType": "context",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Context for wi-100",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "recordId",
13
+ "value": "wi-100"
14
+ }
15
+ }
16
+ },
17
+ "data": {
18
+ "workItemId": "WI-100",
19
+ "notes": "Current blockers: waiting on finance figures",
20
+ "temporary": true
21
+ },
22
+ "_system": {
23
+ "state": "active",
24
+ "createdAt": "2026-01-15T15:00:00.000Z",
25
+ "modifiedAt": "2026-01-15T15:00:00.000Z",
26
+ "provenance": {
27
+ "mode": "context",
28
+ "sourceId": "ops-source",
29
+ "ttlPolicy": "work-scoped"
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 1,
5
+ "objectType": "work-items",
6
+ "contentType": "decisions",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Decision for wi-100",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "recordId",
13
+ "value": "wi-100"
14
+ }
15
+ }
16
+ },
17
+ "data": {
18
+ "decisionType": "priority",
19
+ "decision": "keep-current-priority"
20
+ },
21
+ "_system": {
22
+ "state": "active",
23
+ "createdAt": "2026-01-15T13:30:00.000Z",
24
+ "modifiedAt": "2026-01-15T13:30:00.000Z"
25
+ }
26
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 1,
5
+ "objectType": "work-items",
6
+ "contentType": "raw",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Prepare quarterly operations review",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "workItemId",
13
+ "value": "WI-100",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "id": "WI-100",
20
+ "title": "Prepare quarterly operations review",
21
+ "status": "in-progress",
22
+ "priority": "normal",
23
+ "assigneeId": "E-10",
24
+ "procedureIds": ["PROC-1"],
25
+ "dependsOnIds": ["WI-90"],
26
+ "updatedAt": "2026-01-15T12:00:00.000Z"
27
+ },
28
+ "_system": {
29
+ "state": "active",
30
+ "createdAt": "2026-01-15T12:00:00.000Z",
31
+ "modifiedAt": "2026-01-15T12:00:00.000Z",
32
+ "provenance": {
33
+ "sourceId": "ops-source",
34
+ "endpoint": "/work-items"
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 2,
5
+ "objectType": "work-items",
6
+ "contentType": "relationships",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Relationships for wi-100",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "recordId",
13
+ "value": "wi-100"
14
+ }
15
+ }
16
+ },
17
+ "data": {
18
+ "associatedPeople": [
19
+ {
20
+ "relationshipId": "rel-people-assigned-employee-10-wi-100",
21
+ "relationshipDefinitionId": "people-assigned-to-work-items",
22
+ "recordId": "employee-10"
23
+ }
24
+ ],
25
+ "usedProcedures": [
26
+ {
27
+ "relationshipId": "rel-wi-use-proc-wi-100-proc-1",
28
+ "relationshipDefinitionId": "work-items-use-procedures",
29
+ "recordId": "proc-1"
30
+ }
31
+ ]
32
+ },
33
+ "_system": {
34
+ "state": "active",
35
+ "createdAt": "2026-01-15T12:00:00.000Z",
36
+ "modifiedAt": "2026-01-15T12:30:00.000Z"
37
+ }
38
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 5,
5
+ "objectType": "work-items",
6
+ "contentType": "snapshots",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Prepare quarterly operations review",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "workItemId",
13
+ "value": "WI-100",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "status": "done",
20
+ "priority": "normal"
21
+ },
22
+ "_system": {
23
+ "state": "active",
24
+ "createdAt": "2026-01-10T10:00:00.000Z",
25
+ "modifiedAt": "2026-01-20T09:00:00.000Z",
26
+ "lifecycle": [
27
+ { "process": "created", "processedAt": "2026-01-10T10:00:00.000Z" },
28
+ { "process": "completed", "processedAt": "2026-01-20T09:00:00.000Z" }
29
+ ]
30
+ }
31
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 2,
5
+ "objectType": "work-items",
6
+ "contentType": "snapshots",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Prepare quarterly operations review",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "workItemId",
13
+ "value": "WI-100",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "status": "in-progress",
20
+ "priority": "normal"
21
+ },
22
+ "associatedPeople": [
23
+ {
24
+ "relationshipDefinitionId": "people-assigned-to-work-items",
25
+ "recordId": "employee-10",
26
+ "relationshipId": "rel-people-assigned-employee-10-wi-100"
27
+ }
28
+ ],
29
+ "_system": {
30
+ "state": "active",
31
+ "createdAt": "2026-01-10T10:00:00.000Z",
32
+ "modifiedAt": "2026-01-15T12:30:00.000Z"
33
+ }
34
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 3,
5
+ "objectType": "work-items",
6
+ "contentType": "snapshots",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Prepare quarterly operations review",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "workItemId",
13
+ "value": "WI-100",
14
+ "issuer": "ops-source"
15
+ }
16
+ }
17
+ },
18
+ "data": {
19
+ "status": "in-progress",
20
+ "priority": "normal"
21
+ },
22
+ "_system": {
23
+ "state": "active",
24
+ "createdAt": "2026-01-10T10:00:00.000Z",
25
+ "modifiedAt": "2026-01-15T12:00:00.000Z",
26
+ "observedAt": "2026-01-15T12:00:00.000Z"
27
+ }
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "format": "memorix-record/2",
3
+ "recordId": "wi-100",
4
+ "revision": 4,
5
+ "objectType": "work-items",
6
+ "contentType": "workflow",
7
+ "dataCategory": "entity",
8
+ "concept": {
9
+ "title": "Workflow for wi-100",
10
+ "identifiers": {
11
+ "primary": {
12
+ "kind": "recordId",
13
+ "value": "wi-100"
14
+ }
15
+ }
16
+ },
17
+ "data": {
18
+ "status": "in-progress",
19
+ "assigneeRecordId": "employee-10",
20
+ "tasks": [],
21
+ "audit": []
22
+ },
23
+ "_system": {
24
+ "state": "active",
25
+ "createdAt": "2026-01-10T10:00:00.000Z",
26
+ "modifiedAt": "2026-01-15T14:00:00.000Z"
27
+ }
28
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@x12i/memorix-format",
3
- "version": "2.2.3",
4
- "description": "Memorix product format on @x12i/memorix-base-format: open buckets, associations, SCOPE, migrate CLI.",
3
+ "version": "2.3.2",
4
+ "description": "Memorix format: present envelope + memorix-record/2 (Gate G2 SoT), validators, migrate CLIs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -24,6 +24,10 @@
24
24
  "./types": {
25
25
  "types": "./dist/types.d.ts",
26
26
  "import": "./dist/types.js"
27
+ },
28
+ "./v2": {
29
+ "types": "./dist/v2/index.d.ts",
30
+ "import": "./dist/v2/index.js"
27
31
  }
28
32
  },
29
33
  "files": [
@@ -67,6 +71,7 @@
67
71
  "keywords": [
68
72
  "memorix",
69
73
  "format",
74
+ "memorix-record/2",
70
75
  "validator",
71
76
  "profile",
72
77
  "exellix"