Use content digests, key fingerprints, binding and trust identities, immutable mutation receipts, and observation tokens instead of state-update ordinals across API, storage, Runtime, and Web contracts. Preserve historical replay and secret material through frozen migrations; preflight uncertain removals before cutover, resume provisioning receipts, validate encrypted migration candidates, and align fresh/upgraded schemas. Include reviewed regression fixes, generated artifacts, and validation evidence.
241 lines
8.9 KiB
JSON
241 lines
8.9 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"id": "memory-subjects-light",
|
|
"title": "Memory subjects, surfaces, and committed records — light",
|
|
"baseUrl": "http://127.0.0.1:15285",
|
|
"colorScheme": "light",
|
|
"reducedMotion": "reduce",
|
|
"personas": [{
|
|
"id": "fixture",
|
|
"label": "Read-only Memory fixture",
|
|
"auth": { "kind": "anonymous" }
|
|
}],
|
|
"viewports": [
|
|
{ "label": "desktop", "width": 1440, "height": 900 },
|
|
{ "label": "narrow", "width": 768, "height": 900 },
|
|
{ "label": "mobile", "width": 390, "height": 844 },
|
|
{ "label": "compact", "width": 320, "height": 700 }
|
|
],
|
|
"routes": [
|
|
{
|
|
"id": "subjects",
|
|
"label": "Subject index",
|
|
"path": "/w/memory-review/memory",
|
|
"goal": "Choose an explicit Memory subject or create one with a Backend-validated role.",
|
|
"dataState": "Active and retired subjects across a paginated list, plus create-form and permission-rejection states.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subjects'] .subject-list"
|
|
},
|
|
"capturePoints": [
|
|
{ "id": "initial", "label": "Subjects" },
|
|
{
|
|
"id": "create-form",
|
|
"label": "Create Subject form",
|
|
"interaction": [
|
|
{ "action": "click", "selector": "button.subject-create-trigger" }
|
|
],
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "#subject-create-panel input"
|
|
}
|
|
},
|
|
{
|
|
"id": "permission-error",
|
|
"label": "Create permission error",
|
|
"interaction": [
|
|
{
|
|
"action": "fill",
|
|
"selector": "#subject-create-panel input",
|
|
"value": "Permission denied"
|
|
},
|
|
{
|
|
"action": "click",
|
|
"selector": "#subject-create-panel button[type='submit']"
|
|
},
|
|
{
|
|
"action": "wait",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "#subject-create-error"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "subjects-empty",
|
|
"label": "Empty Subject index",
|
|
"path": "/w/memory-review/memory?cursor=fixture-empty-subject-page",
|
|
"goal": "Create the first visible Subject when the current bounded page is empty.",
|
|
"dataState": "Successful empty Subject page with a return-to-first-page recovery link.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-state='empty']"
|
|
},
|
|
"capturePoints": [
|
|
{ "id": "initial", "label": "Empty Subjects" },
|
|
{
|
|
"id": "create-form",
|
|
"label": "Create from empty Subjects",
|
|
"interaction": [
|
|
{ "action": "click", "selector": "button.subject-create-trigger" }
|
|
],
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "#subject-create-panel input"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "subjects-error",
|
|
"label": "Subject list error",
|
|
"path": "/w/memory-review/memory?cursor=fixture-error-subject-page",
|
|
"goal": "Keep explicit Subject creation available while the existing list cannot load.",
|
|
"dataState": "Intentional Subject-list HTTP 503 with the independent create disclosure still available.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-state='error']"
|
|
},
|
|
"capturePoints": [
|
|
{ "id": "initial", "label": "Subjects unavailable" },
|
|
{
|
|
"id": "create-form",
|
|
"label": "Create while list unavailable",
|
|
"interaction": [
|
|
{ "action": "click", "selector": "button.subject-create-trigger" }
|
|
],
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "#subject-create-panel input"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "representative",
|
|
"label": "Ready subject surface",
|
|
"path": "/w/memory-review/memory/release-coordination-subject-with-a-deliberately-long-stable-identity-for-responsive-review",
|
|
"goal": "Read the ready resident surface and scan active, resolved, and retracted committed Memories without nested vertical scrolling.",
|
|
"dataState": "Ready generated Markdown surface with long content, unsafe Markdown, wide table/code, provenance refs, and three lifecycle states.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subject'][data-memory-state='ready'] article[aria-label='Resident context']"
|
|
},
|
|
"capturePoints": [
|
|
{ "id": "initial", "label": "Ready subject" },
|
|
{
|
|
"id": "subject-diagnostics",
|
|
"label": "Subject diagnostics",
|
|
"interaction": [
|
|
{ "action": "click", "selector": "details.subject-technical-details summary" }
|
|
],
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "details.subject-technical-details[open]"
|
|
}
|
|
},
|
|
{
|
|
"id": "surface-diagnostics",
|
|
"label": "Surface sources and diagnostics",
|
|
"interaction": [
|
|
{ "action": "click", "selector": "details.surface-details summary" }
|
|
],
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "details.surface-details[open]"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "detail",
|
|
"label": "Committed Memory detail",
|
|
"path": "/w/memory-review/memory/release-coordination-subject-with-a-deliberately-long-stable-identity-for-responsive-review/memory-decision-with-a-deliberately-long-stable-identity-for-overflow-review-0000000001",
|
|
"goal": "Audit immutable Memory body, candidate evidence, source refs, derivations, and change history.",
|
|
"dataState": "Current active change with bounded typed provenance and active/resolved/retracted immutable history.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='detail'] .change-list"
|
|
},
|
|
"capturePoints": [{ "id": "initial", "label": "Memory detail" }]
|
|
},
|
|
{
|
|
"id": "empty",
|
|
"label": "Ready-empty subject",
|
|
"path": "/w/memory-review/memory/empty-subject",
|
|
"goal": "Distinguish a valid ready-empty snapshot and an empty committed Memory list from failure.",
|
|
"dataState": "Ready snapshot with empty Markdown and no refs; successful current list with no records.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subject'][data-memory-state='ready'] [data-surface-ready-empty]"
|
|
},
|
|
"capturePoints": [{ "id": "initial", "label": "Ready empty" }]
|
|
},
|
|
{
|
|
"id": "ungenerated",
|
|
"label": "Ungenerated subject context",
|
|
"path": "/w/memory-review/memory/ungenerated-subject",
|
|
"goal": "Distinguish a Subject with no generated resident context from lost committed Memory.",
|
|
"dataState": "Ungenerated resident context and a successful empty committed Memory list.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subject'][data-memory-state='ungenerated']"
|
|
},
|
|
"capturePoints": [{ "id": "initial", "label": "Not generated" }]
|
|
},
|
|
{
|
|
"id": "stale",
|
|
"label": "Stale subject surface",
|
|
"path": "/w/memory-review/memory/stale-subject",
|
|
"goal": "Recognize that no snapshot is displayable while committed Memories remain readable.",
|
|
"dataState": "Stale availability without snapshot and one resolved committed Memory.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subject'][data-memory-state='stale']"
|
|
},
|
|
"capturePoints": [{ "id": "initial", "label": "Stale" }]
|
|
},
|
|
{
|
|
"id": "failed",
|
|
"label": "Failed subject surface",
|
|
"path": "/w/memory-review/memory/failed-subject",
|
|
"goal": "See generation failure without displaying a failed or partial snapshot.",
|
|
"dataState": "Failed availability without snapshot and one retracted committed Memory.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subject'][data-memory-state='failed']"
|
|
},
|
|
"capturePoints": [{ "id": "initial", "label": "Failed" }]
|
|
},
|
|
{
|
|
"id": "error",
|
|
"label": "Subject endpoint error",
|
|
"path": "/w/memory-review/memory/error-subject",
|
|
"goal": "Keep each read-only region explicit when subject, surface, and current Memory requests fail.",
|
|
"dataState": "Intentional HTTP 503 from all subject-scoped endpoints.",
|
|
"ready": {
|
|
"kind": "selector",
|
|
"selector": "[data-memory-view='subject'][data-memory-state='error']"
|
|
},
|
|
"capturePoints": [{ "id": "initial", "label": "Unavailable" }]
|
|
}
|
|
],
|
|
"processes": [{
|
|
"id": "memory-fixture",
|
|
"command": "deno",
|
|
"cwd": "..",
|
|
"args": [
|
|
"run",
|
|
"--allow-net",
|
|
"--allow-read",
|
|
"browser-tests/memory_document_fixture_server.ts",
|
|
"15285",
|
|
"../../web/workspace/build"
|
|
],
|
|
"readyUrl": "http://127.0.0.1:15285/health"
|
|
}]
|
|
}
|