{
  "package": {
    "name": "Workshop Handover Log — Draft",
    "kind": "software",
    "oneLiner": "A proposed single-device handover log, conditional on validating a structured paper process first.",
    "problemSpace": {
      "who": "Staff and supervisor in the fictional two-shift workshop.",
      "pain": "The synthetic notes illustrate ambiguity about ownership, next action and closure; they do not establish real-world demand or impact.",
      "context": "Investigate the paper process before building software. Operational and safety decisions remain with the supervisor outside the app.",
      "evidenceNodeIds": [
        "handover-question",
        "sample-handover",
        "handover-concept"
      ]
    },
    "solutionIdea": {
      "summary": "If the paper-process gate passes, prototype a local browser log on one shared device. Capture six core fields, show unresolved items first, record receipt acknowledgements and export JSON and CSV.",
      "differentiators": [
        "One device and a fixed local application origin.",
        "Acknowledgement records receipt without changing ownership."
      ],
      "nonGoals": [
        "No backend, cloud, accounts, sync, notifications, integrations, AI features, machine control, diagnosis or safety sign-off.",
        "No telemetry, in-app paper-comparison view or JSON import/restore."
      ]
    },
    "concept": {
      "userJourney": [
        "Before a software build, a supervisor evaluates whether a structured six-field paper checklist produces usable handovers.",
        "If that gate passes, staff create or edit local items; the next shift sees unresolved items first and can acknowledge receipt.",
        "A supervisor exports records for external review. A later evaluation compares the prototype with the paper baseline before any broader commitment."
      ],
      "successCriteria": [
        "The paper gate has pre-agreed checks for field completeness and owner/next-action clarity; no outcome is assumed.",
        "The proposed prototype passes persistence, ordering, acknowledgement and export checks on a selected device and browser.",
        "A later, separately defined software-versus-paper comparison establishes whether software adds value."
      ]
    },
    "data": {
      "entities": [
        {
          "name": "handover_item",
          "fields": [
            "item_id: generated identifier",
            "equipment_label: required text",
            "issue_short: required text",
            "current_owner: required text",
            "next_action: required text",
            "status: open | awaiting_review | closed",
            "timestamp: creation time",
            "updated_at: last edit time",
            "acknowledged_by: optional entered initials",
            "acknowledged_at: optional receipt time"
          ],
          "source": "Six core fields proposed in handover-concept; status and ownership ambiguity illustrated by synthetic sample-handover. Identifiers and metadata are design choices."
        }
      ],
      "sources": [
        {
          "nodeId": "handover-question",
          "use": "Goal and validation question."
        },
        {
          "nodeId": "sample-handover",
          "use": "Synthetic examples of handover ambiguity, not field research."
        },
        {
          "nodeId": "handover-concept",
          "use": "Candidate scope, fields, acknowledgement and exports."
        }
      ]
    },
    "architecture": {
      "overview": "Proposed vanilla JavaScript UI and direct IndexedDB, with bundled static assets served on the shared device at http://localhost:4173. No external requests or backend.",
      "components": [
        {
          "name": "Staff UI",
          "responsibility": "Create, edit, list and acknowledge items.",
          "technology": "HTML, CSS, vanilla JavaScript"
        },
        {
          "name": "Local store",
          "responsibility": "Persist records under the fixed origin.",
          "technology": "Direct IndexedDB API"
        },
        {
          "name": "Exporter",
          "responsibility": "Download outbound-only JSON and CSV.",
          "technology": "Browser Blob and download link"
        },
        {
          "name": "Local static server",
          "responsibility": "Serve bundled assets at the fixed origin.",
          "technology": "Device-local static HTTP server"
        }
      ],
      "interfaces": [
        {
          "from": "Staff UI",
          "to": "Local store",
          "protocol": "In-browser IndexedDB calls",
          "purpose": "Read and write items."
        },
        {
          "from": "Staff UI",
          "to": "Exporter",
          "protocol": "In-browser function call",
          "purpose": "Produce local downloads."
        },
        {
          "from": "Local static server",
          "to": "Staff UI",
          "protocol": "Loopback HTTP",
          "purpose": "Serve bundled assets."
        }
      ],
      "deployment": "Proposed fixed origin http://localhost:4173 on one shared device; choose the device, browser and local server before persistence testing. Initial loopback asset loads are expected; normal use makes no external requests."
    },
    "modules": [
      {
        "id": "m1",
        "name": "Local records",
        "purpose": "Schema, validation, persistence and unresolved-first query.",
        "dependsOn": []
      },
      {
        "id": "m2",
        "name": "Handover UI",
        "purpose": "Create, edit, list and acknowledge receipt.",
        "dependsOn": [
          "m1"
        ]
      },
      {
        "id": "m3",
        "name": "Outbound export",
        "purpose": "Download complete JSON and readable CSV without import.",
        "dependsOn": [
          "m1",
          "m2"
        ]
      }
    ],
    "waves": [
      {
        "title": "Wave 1 — Records and UI",
        "goal": "After the paper gate, implement and check m1, then m2.",
        "moduleIds": [
          "m1",
          "m2"
        ],
        "mode": "sequential"
      },
      {
        "title": "Wave 2 — Export",
        "goal": "After Wave 1, implement m3 and check the integrated prototype.",
        "moduleIds": [
          "m3"
        ],
        "mode": "sequential"
      }
    ],
    "prds": [
      {
        "moduleId": "m1",
        "stories": [
          {
            "id": "S1",
            "title": "Save a six-field item",
            "acceptance": [
              "A valid item is saved at the fixed origin with generated item_id and timestamp.",
              "Missing equipment label, issue, owner or next action is rejected."
            ]
          },
          {
            "id": "S2",
            "title": "Retrieve unresolved items first",
            "acceptance": [
              "Open and awaiting_review items appear before closed items; within each status, updated_at descending determines order.",
              "Saved items remain available after browser restart at the same origin."
            ]
          }
        ]
      },
      {
        "moduleId": "m2",
        "stories": [
          {
            "id": "S3",
            "title": "Create and edit from the tablet UI",
            "acceptance": [
              "The form exposes equipment label, issue, owner, next action and status; timestamp is set by the app.",
              "Editing an item updates updated_at and displays the saved values."
            ]
          },
          {
            "id": "S4",
            "title": "Acknowledge receipt",
            "acceptance": [
              "Acknowledging stores entered initials and acknowledged_at and displays both.",
              "Comparing the stored record before and after acknowledgement shows current_owner and status unchanged."
            ]
          }
        ]
      },
      {
        "moduleId": "m3",
        "stories": [
          {
            "id": "S5",
            "title": "Export JSON",
            "acceptance": [
              "The downloaded JSON parses and contains every stored item and its metadata.",
              "The UI offers no import or restore action; export is not presented as in-app recovery."
            ]
          },
          {
            "id": "S6",
            "title": "Export readable CSV",
            "acceptance": [
              "The CSV has one row per item and headers for item_id, the six core fields, updated_at, acknowledged_by and acknowledged_at.",
              "A proposed check opens the download and verifies that commas, quotes and line breaks in entered text remain within their CSV fields."
            ]
          }
        ]
      }
    ],
    "bom": [],
    "designSystem": {
      "principles": [
        "Show unresolved work first.",
        "Label owner and next action explicitly.",
        "Keep receipt acknowledgement distinct from issue ownership."
      ],
      "tone": "Plain and non-authoritative about safety.",
      "colors": [
        "High-contrast dark text on a light backg"
      ],
      "typography": "System font; tablet legibility requires prototype review."
    },
    "agentConcurrency": {
      "maxParallelBuilders": 1,
      "sharedFiles": [
        "src/store.js",
        "src/app.js",
        "src/export.js"
      ],
      "rules": [
        "One builder at a time.",
        "Complete Wave 1 before Wave 2.",
        "Review changes to the record contract before dependent UI or export changes."
      ]
    },
    "controlsAndTests": [
      {
        "area": "Paper gate",
        "check": "Determine whether the structured paper checklist yields complete fields and unambiguous owners and next actions.",
        "method": "Proposed supervised paper pilot; agree measures, duration and pass criteria before collecting outcomes."
      },
      {
        "area": "Later value comparison",
        "check": "Determine whether software improves on the validated paper baseline.",
        "method": "After the paper gate and prototype, pre-agree comparable measures and evaluate both processes separately."
      },
      {
        "area": "Persistence and origin",
        "check": "Items survive browser restart and device power cycle at http://localhost:4173.",
        "method": "Proposed manual check on the selected device and browser; record origin and compare stored items before and after."
      },
      {
        "area": "Ordering and receipt",
        "check": "Unresolved items lead; acknowledgement changes receipt metadata only.",
        "method": "Proposed mixed-status UI check and before/after IndexedDB record comparison."
      },
      {
        "area": "Export and network",
        "check": "JSON parses, CSV columns and escaping are correct, and normal use makes no external requests.",
        "method": "Proposed fixture checks and browser network inspection; allow initial loopback asset requests."
      }
    ],
    "dependencies": [
      {
        "name": "IndexedDB",
        "kind": "standard",
        "reason": "Local persistence at the fixed browser origin."
      },
      {
        "name": "Device-local static HTTP server",
        "kind": "service",
        "reason": "Provides a stable localhost application origin."
      }
    ],
    "risks": [
      {
        "risk": "Synthetic notes do not establish user demand or ergonomic suitability.",
        "mitigation": "Run the paper gate and review the prototype before adoption."
      },
      {
        "risk": "Changing origin or losing the single device may make records inaccessible; export cannot restore them in-app.",
        "mitigation": "Fix the origin, test on the chosen device and agree an external retention and recovery policy."
      },
      {
        "risk": "Shared-device acknowledgements may not reliably identify a person.",
        "mitigation": "Agree an initials and supervision policy outside the app."
      },
      {
        "risk": "Privacy and physical suitability of the tablet or paper checklist materials are unknown.",
        "mitigation": "Resolve handling, access, retention and physical-use questions before any supervised pilot."
      }
    ],
    "openQuestions": [
      "Which tablet, browser and local-server arrangement will be used?",
      "Who enters acknowledgement initials, and how is ambiguity handled?",
      "What are the device-unavailability, export-retention and recovery procedures?",
      "What privacy rules govern names, issue descriptions and exported files?",
      "What paper-checklist material and tablet placement are suitable?",
      "What pre-agreed paper-gate criteria and later comparison method are acceptable?"
    ],
    "geometry": {
      "parts": []
    },
    "evidenceNodeIds": [
      "handover-question",
      "sample-handover",
      "handover-concept"
    ],
    "specRevision": 1,
    "requirements": [
      {
        "id": "R-001",
        "text": "Before software work, define and run a supervised structured-paper gate; assess software against paper only in a later, separate comparison.",
        "acceptance": [
          "Document the paper measures and pass criteria before the paper pilot.",
          "Document a separate, pre-agreed software-versus-paper comparison before drawing a software value conclusion."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-question",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "No real pilot results are supplied."
        ],
        "unresolved": [
          "Pilot duration, sample size and decision thresholds."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-002",
        "text": "Store the six-field handover item locally on one device at the fixed application origin, without an external service.",
        "acceptance": [
          "Create an item and verify its six core fields in IndexedDB.",
          "At the same origin, verify it remains after browser restart; inspect normal use for external requests."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "The selected device can run a local static server and supports IndexedDB."
        ],
        "unresolved": [
          "Target device and browser."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-003",
        "text": "Present unresolved items first and allow creation, editing and receipt acknowledgement without transferring ownership.",
        "acceptance": [
          "A mixed-status fixture displays open and awaiting_review before closed.",
          "Before/after record comparison confirms acknowledgement writes initials and time but leaves current_owner and status unchanged."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "sample-handover",
            "contentRevision": 1
          },
          {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "Entered initials can be interpreted under an agreed workshop policy."
        ],
        "unresolved": [
          "Acknowledgement identity policy."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-004",
        "text": "Provide outbound JSON and readable CSV export; exclude JSON import and in-app restore.",
        "acceptance": [
          "Parse a downloaded JSON file and compare its records with the stored set.",
          "Check CSV headers, row count and escaping against the same set.",
          "Confirm there is no import or restore control or claim."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "Supervisors can retain exports outside the app."
        ],
        "unresolved": [
          "Export retention and recovery policy."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-005",
        "text": "Keep the draft build to three modules, two sequential waves and one builder; exclude telemetry and an in-app paper-comparison view.",
        "acceptance": [
          "Review the plan for exactly three modules, six stories, two sequential waves and one builder.",
          "Inspect proposed UI and checks for the absence of telemetry and a paper-comparison view."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-question",
            "contentRevision": 1
          }
        ],
        "assumptions": [],
        "unresolved": [],
        "reviewState": "needs-review",
        "revision": 1
      }
    ]
  },
  "recordedBasis": {
    "contract": "recorded-package-basis",
    "version": 1,
    "scope": {
      "canvas": "my",
      "revision": 1
    },
    "materials": [
      {
        "reference": {
          "nodeId": "handover-question",
          "contentRevision": 1
        },
        "title": "What should the next shift know?",
        "kind": "question",
        "attribution": "",
        "evidenceStatus": "unassessed"
      },
      {
        "reference": {
          "nodeId": "sample-handover",
          "contentRevision": 1
        },
        "title": "Three sample handover notes",
        "kind": "observation",
        "attribution": "",
        "evidenceStatus": "unassessed"
      },
      {
        "reference": {
          "nodeId": "handover-concept",
          "contentRevision": 1
        },
        "title": "A single-device handover log",
        "kind": "idea",
        "attribution": "",
        "evidenceStatus": "unassessed"
      }
    ],
    "concepts": [],
    "humanDecisionRecords": [],
    "qualification": "No linked decision is inferred; review the retained records before treating this draft as a commitment."
  },
  "frozenSpecification": {
    "contract": "frozen-specification-export",
    "contractVersion": 1,
    "authority": "export-only",
    "identity": {
      "packageId": "package:cookbook-workshop-handover-sol",
      "investigationId": "cookbook-workshop-handover-sol",
      "specRevision": 1,
      "specificationDigest": "da945df18ef33c486d5a8016dfe1d97b066bcfae2cbaac190a180a66e41a432c",
      "created": "2026-10-01T19:54:43.304Z"
    },
    "state": "needs-review",
    "approval": null,
    "package": {
      "name": "Workshop Handover Log — Draft",
      "kind": "software",
      "oneLiner": "A proposed single-device handover log, conditional on validating a structured paper process first.",
      "problemSpace": {
        "who": "Staff and supervisor in the fictional two-shift workshop.",
        "pain": "The synthetic notes illustrate ambiguity about ownership, next action and closure; they do not establish real-world demand or impact.",
        "context": "Investigate the paper process before building software. Operational and safety decisions remain with the supervisor outside the app.",
        "evidenceNodeIds": [
          "handover-question",
          "sample-handover",
          "handover-concept"
        ]
      },
      "solutionIdea": {
        "summary": "If the paper-process gate passes, prototype a local browser log on one shared device. Capture six core fields, show unresolved items first, record receipt acknowledgements and export JSON and CSV.",
        "differentiators": [
          "One device and a fixed local application origin.",
          "Acknowledgement records receipt without changing ownership."
        ],
        "nonGoals": [
          "No backend, cloud, accounts, sync, notifications, integrations, AI features, machine control, diagnosis or safety sign-off.",
          "No telemetry, in-app paper-comparison view or JSON import/restore."
        ]
      },
      "concept": {
        "userJourney": [
          "Before a software build, a supervisor evaluates whether a structured six-field paper checklist produces usable handovers.",
          "If that gate passes, staff create or edit local items; the next shift sees unresolved items first and can acknowledge receipt.",
          "A supervisor exports records for external review. A later evaluation compares the prototype with the paper baseline before any broader commitment."
        ],
        "successCriteria": [
          "The paper gate has pre-agreed checks for field completeness and owner/next-action clarity; no outcome is assumed.",
          "The proposed prototype passes persistence, ordering, acknowledgement and export checks on a selected device and browser.",
          "A later, separately defined software-versus-paper comparison establishes whether software adds value."
        ]
      },
      "data": {
        "entities": [
          {
            "name": "handover_item",
            "fields": [
              "item_id: generated identifier",
              "equipment_label: required text",
              "issue_short: required text",
              "current_owner: required text",
              "next_action: required text",
              "status: open | awaiting_review | closed",
              "timestamp: creation time",
              "updated_at: last edit time",
              "acknowledged_by: optional entered initials",
              "acknowledged_at: optional receipt time"
            ],
            "source": "Six core fields proposed in handover-concept; status and ownership ambiguity illustrated by synthetic sample-handover. Identifiers and metadata are design choices."
          }
        ],
        "sources": [
          {
            "nodeId": "handover-question",
            "use": "Goal and validation question."
          },
          {
            "nodeId": "sample-handover",
            "use": "Synthetic examples of handover ambiguity, not field research."
          },
          {
            "nodeId": "handover-concept",
            "use": "Candidate scope, fields, acknowledgement and exports."
          }
        ]
      },
      "architecture": {
        "overview": "Proposed vanilla JavaScript UI and direct IndexedDB, with bundled static assets served on the shared device at http://localhost:4173. No external requests or backend.",
        "components": [
          {
            "name": "Staff UI",
            "responsibility": "Create, edit, list and acknowledge items.",
            "technology": "HTML, CSS, vanilla JavaScript"
          },
          {
            "name": "Local store",
            "responsibility": "Persist records under the fixed origin.",
            "technology": "Direct IndexedDB API"
          },
          {
            "name": "Exporter",
            "responsibility": "Download outbound-only JSON and CSV.",
            "technology": "Browser Blob and download link"
          },
          {
            "name": "Local static server",
            "responsibility": "Serve bundled assets at the fixed origin.",
            "technology": "Device-local static HTTP server"
          }
        ],
        "interfaces": [
          {
            "from": "Staff UI",
            "to": "Local store",
            "protocol": "In-browser IndexedDB calls",
            "purpose": "Read and write items."
          },
          {
            "from": "Staff UI",
            "to": "Exporter",
            "protocol": "In-browser function call",
            "purpose": "Produce local downloads."
          },
          {
            "from": "Local static server",
            "to": "Staff UI",
            "protocol": "Loopback HTTP",
            "purpose": "Serve bundled assets."
          }
        ],
        "deployment": "Proposed fixed origin http://localhost:4173 on one shared device; choose the device, browser and local server before persistence testing. Initial loopback asset loads are expected; normal use makes no external requests."
      },
      "modules": [
        {
          "id": "m1",
          "name": "Local records",
          "purpose": "Schema, validation, persistence and unresolved-first query.",
          "dependsOn": []
        },
        {
          "id": "m2",
          "name": "Handover UI",
          "purpose": "Create, edit, list and acknowledge receipt.",
          "dependsOn": [
            "m1"
          ]
        },
        {
          "id": "m3",
          "name": "Outbound export",
          "purpose": "Download complete JSON and readable CSV without import.",
          "dependsOn": [
            "m1",
            "m2"
          ]
        }
      ],
      "waves": [
        {
          "title": "Wave 1 — Records and UI",
          "goal": "After the paper gate, implement and check m1, then m2.",
          "moduleIds": [
            "m1",
            "m2"
          ],
          "mode": "sequential"
        },
        {
          "title": "Wave 2 — Export",
          "goal": "After Wave 1, implement m3 and check the integrated prototype.",
          "moduleIds": [
            "m3"
          ],
          "mode": "sequential"
        }
      ],
      "prds": [
        {
          "moduleId": "m1",
          "stories": [
            {
              "id": "S1",
              "title": "Save a six-field item",
              "acceptance": [
                "A valid item is saved at the fixed origin with generated item_id and timestamp.",
                "Missing equipment label, issue, owner or next action is rejected."
              ]
            },
            {
              "id": "S2",
              "title": "Retrieve unresolved items first",
              "acceptance": [
                "Open and awaiting_review items appear before closed items; within each status, updated_at descending determines order.",
                "Saved items remain available after browser restart at the same origin."
              ]
            }
          ]
        },
        {
          "moduleId": "m2",
          "stories": [
            {
              "id": "S3",
              "title": "Create and edit from the tablet UI",
              "acceptance": [
                "The form exposes equipment label, issue, owner, next action and status; timestamp is set by the app.",
                "Editing an item updates updated_at and displays the saved values."
              ]
            },
            {
              "id": "S4",
              "title": "Acknowledge receipt",
              "acceptance": [
                "Acknowledging stores entered initials and acknowledged_at and displays both.",
                "Comparing the stored record before and after acknowledgement shows current_owner and status unchanged."
              ]
            }
          ]
        },
        {
          "moduleId": "m3",
          "stories": [
            {
              "id": "S5",
              "title": "Export JSON",
              "acceptance": [
                "The downloaded JSON parses and contains every stored item and its metadata.",
                "The UI offers no import or restore action; export is not presented as in-app recovery."
              ]
            },
            {
              "id": "S6",
              "title": "Export readable CSV",
              "acceptance": [
                "The CSV has one row per item and headers for item_id, the six core fields, updated_at, acknowledged_by and acknowledged_at.",
                "A proposed check opens the download and verifies that commas, quotes and line breaks in entered text remain within their CSV fields."
              ]
            }
          ]
        }
      ],
      "bom": [],
      "designSystem": {
        "principles": [
          "Show unresolved work first.",
          "Label owner and next action explicitly.",
          "Keep receipt acknowledgement distinct from issue ownership."
        ],
        "tone": "Plain and non-authoritative about safety.",
        "colors": [
          "High-contrast dark text on a light backg"
        ],
        "typography": "System font; tablet legibility requires prototype review."
      },
      "agentConcurrency": {
        "maxParallelBuilders": 1,
        "sharedFiles": [
          "src/store.js",
          "src/app.js",
          "src/export.js"
        ],
        "rules": [
          "One builder at a time.",
          "Complete Wave 1 before Wave 2.",
          "Review changes to the record contract before dependent UI or export changes."
        ]
      },
      "controlsAndTests": [
        {
          "area": "Paper gate",
          "check": "Determine whether the structured paper checklist yields complete fields and unambiguous owners and next actions.",
          "method": "Proposed supervised paper pilot; agree measures, duration and pass criteria before collecting outcomes."
        },
        {
          "area": "Later value comparison",
          "check": "Determine whether software improves on the validated paper baseline.",
          "method": "After the paper gate and prototype, pre-agree comparable measures and evaluate both processes separately."
        },
        {
          "area": "Persistence and origin",
          "check": "Items survive browser restart and device power cycle at http://localhost:4173.",
          "method": "Proposed manual check on the selected device and browser; record origin and compare stored items before and after."
        },
        {
          "area": "Ordering and receipt",
          "check": "Unresolved items lead; acknowledgement changes receipt metadata only.",
          "method": "Proposed mixed-status UI check and before/after IndexedDB record comparison."
        },
        {
          "area": "Export and network",
          "check": "JSON parses, CSV columns and escaping are correct, and normal use makes no external requests.",
          "method": "Proposed fixture checks and browser network inspection; allow initial loopback asset requests."
        }
      ],
      "dependencies": [
        {
          "name": "IndexedDB",
          "kind": "standard",
          "reason": "Local persistence at the fixed browser origin."
        },
        {
          "name": "Device-local static HTTP server",
          "kind": "service",
          "reason": "Provides a stable localhost application origin."
        }
      ],
      "risks": [
        {
          "risk": "Synthetic notes do not establish user demand or ergonomic suitability.",
          "mitigation": "Run the paper gate and review the prototype before adoption."
        },
        {
          "risk": "Changing origin or losing the single device may make records inaccessible; export cannot restore them in-app.",
          "mitigation": "Fix the origin, test on the chosen device and agree an external retention and recovery policy."
        },
        {
          "risk": "Shared-device acknowledgements may not reliably identify a person.",
          "mitigation": "Agree an initials and supervision policy outside the app."
        },
        {
          "risk": "Privacy and physical suitability of the tablet or paper checklist materials are unknown.",
          "mitigation": "Resolve handling, access, retention and physical-use questions before any supervised pilot."
        }
      ],
      "openQuestions": [
        "Which tablet, browser and local-server arrangement will be used?",
        "Who enters acknowledgement initials, and how is ambiguity handled?",
        "What are the device-unavailability, export-retention and recovery procedures?",
        "What privacy rules govern names, issue descriptions and exported files?",
        "What paper-checklist material and tablet placement are suitable?",
        "What pre-agreed paper-gate criteria and later comparison method are acceptable?"
      ],
      "geometry": {
        "parts": []
      },
      "evidenceNodeIds": [
        "handover-question",
        "sample-handover",
        "handover-concept"
      ],
      "specRevision": 1,
      "requirements": [
        {
          "id": "R-001",
          "text": "Before software work, define and run a supervised structured-paper gate; assess software against paper only in a later, separate comparison.",
          "acceptance": [
            "Document the paper measures and pass criteria before the paper pilot.",
            "Document a separate, pre-agreed software-versus-paper comparison before drawing a software value conclusion."
          ],
          "decisionRefs": [],
          "evidenceVersionRefs": [
            {
              "canvas": "my",
              "nodeId": "handover-question",
              "contentRevision": 1
            }
          ],
          "assumptions": [
            "No real pilot results are supplied."
          ],
          "unresolved": [
            "Pilot duration, sample size and decision thresholds."
          ],
          "reviewState": "needs-review",
          "revision": 1
        },
        {
          "id": "R-002",
          "text": "Store the six-field handover item locally on one device at the fixed application origin, without an external service.",
          "acceptance": [
            "Create an item and verify its six core fields in IndexedDB.",
            "At the same origin, verify it remains after browser restart; inspect normal use for external requests."
          ],
          "decisionRefs": [],
          "evidenceVersionRefs": [
            {
              "canvas": "my",
              "nodeId": "handover-concept",
              "contentRevision": 1
            }
          ],
          "assumptions": [
            "The selected device can run a local static server and supports IndexedDB."
          ],
          "unresolved": [
            "Target device and browser."
          ],
          "reviewState": "needs-review",
          "revision": 1
        },
        {
          "id": "R-003",
          "text": "Present unresolved items first and allow creation, editing and receipt acknowledgement without transferring ownership.",
          "acceptance": [
            "A mixed-status fixture displays open and awaiting_review before closed.",
            "Before/after record comparison confirms acknowledgement writes initials and time but leaves current_owner and status unchanged."
          ],
          "decisionRefs": [],
          "evidenceVersionRefs": [
            {
              "canvas": "my",
              "nodeId": "sample-handover",
              "contentRevision": 1
            },
            {
              "canvas": "my",
              "nodeId": "handover-concept",
              "contentRevision": 1
            }
          ],
          "assumptions": [
            "Entered initials can be interpreted under an agreed workshop policy."
          ],
          "unresolved": [
            "Acknowledgement identity policy."
          ],
          "reviewState": "needs-review",
          "revision": 1
        },
        {
          "id": "R-004",
          "text": "Provide outbound JSON and readable CSV export; exclude JSON import and in-app restore.",
          "acceptance": [
            "Parse a downloaded JSON file and compare its records with the stored set.",
            "Check CSV headers, row count and escaping against the same set.",
            "Confirm there is no import or restore control or claim."
          ],
          "decisionRefs": [],
          "evidenceVersionRefs": [
            {
              "canvas": "my",
              "nodeId": "handover-concept",
              "contentRevision": 1
            }
          ],
          "assumptions": [
            "Supervisors can retain exports outside the app."
          ],
          "unresolved": [
            "Export retention and recovery policy."
          ],
          "reviewState": "needs-review",
          "revision": 1
        },
        {
          "id": "R-005",
          "text": "Keep the draft build to three modules, two sequential waves and one builder; exclude telemetry and an in-app paper-comparison view.",
          "acceptance": [
            "Review the plan for exactly three modules, six stories, two sequential waves and one builder.",
            "Inspect proposed UI and checks for the absence of telemetry and a paper-comparison view."
          ],
          "decisionRefs": [],
          "evidenceVersionRefs": [
            {
              "canvas": "my",
              "nodeId": "handover-question",
              "contentRevision": 1
            }
          ],
          "assumptions": [],
          "unresolved": [],
          "reviewState": "needs-review",
          "revision": 1
        }
      ]
    },
    "requirements": [
      {
        "id": "R-001",
        "text": "Before software work, define and run a supervised structured-paper gate; assess software against paper only in a later, separate comparison.",
        "acceptance": [
          "Document the paper measures and pass criteria before the paper pilot.",
          "Document a separate, pre-agreed software-versus-paper comparison before drawing a software value conclusion."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-question",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "No real pilot results are supplied."
        ],
        "unresolved": [
          "Pilot duration, sample size and decision thresholds."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-002",
        "text": "Store the six-field handover item locally on one device at the fixed application origin, without an external service.",
        "acceptance": [
          "Create an item and verify its six core fields in IndexedDB.",
          "At the same origin, verify it remains after browser restart; inspect normal use for external requests."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "The selected device can run a local static server and supports IndexedDB."
        ],
        "unresolved": [
          "Target device and browser."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-003",
        "text": "Present unresolved items first and allow creation, editing and receipt acknowledgement without transferring ownership.",
        "acceptance": [
          "A mixed-status fixture displays open and awaiting_review before closed.",
          "Before/after record comparison confirms acknowledgement writes initials and time but leaves current_owner and status unchanged."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "sample-handover",
            "contentRevision": 1
          },
          {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "Entered initials can be interpreted under an agreed workshop policy."
        ],
        "unresolved": [
          "Acknowledgement identity policy."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-004",
        "text": "Provide outbound JSON and readable CSV export; exclude JSON import and in-app restore.",
        "acceptance": [
          "Parse a downloaded JSON file and compare its records with the stored set.",
          "Check CSV headers, row count and escaping against the same set.",
          "Confirm there is no import or restore control or claim."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          }
        ],
        "assumptions": [
          "Supervisors can retain exports outside the app."
        ],
        "unresolved": [
          "Export retention and recovery policy."
        ],
        "reviewState": "needs-review",
        "revision": 1
      },
      {
        "id": "R-005",
        "text": "Keep the draft build to three modules, two sequential waves and one builder; exclude telemetry and an in-app paper-comparison view.",
        "acceptance": [
          "Review the plan for exactly three modules, six stories, two sequential waves and one builder.",
          "Inspect proposed UI and checks for the absence of telemetry and a paper-comparison view."
        ],
        "decisionRefs": [],
        "evidenceVersionRefs": [
          {
            "canvas": "my",
            "nodeId": "handover-question",
            "contentRevision": 1
          }
        ],
        "assumptions": [],
        "unresolved": [],
        "reviewState": "needs-review",
        "revision": 1
      }
    ],
    "recordedBasis": {
      "contract": "recorded-package-basis",
      "version": 1,
      "scope": {
        "canvas": "my",
        "revision": 1
      },
      "materials": [
        {
          "reference": {
            "canvas": "my",
            "nodeId": "handover-question",
            "contentRevision": 1
          },
          "title": "What should the next shift know?",
          "kind": "question",
          "attribution": "",
          "evidenceStatus": "unassessed"
        },
        {
          "reference": {
            "canvas": "my",
            "nodeId": "sample-handover",
            "contentRevision": 1
          },
          "title": "Three sample handover notes",
          "kind": "observation",
          "attribution": "",
          "evidenceStatus": "unassessed"
        },
        {
          "reference": {
            "canvas": "my",
            "nodeId": "handover-concept",
            "contentRevision": 1
          },
          "title": "A single-device handover log",
          "kind": "idea",
          "attribution": "",
          "evidenceStatus": "unassessed"
        }
      ],
      "concepts": [],
      "humanDecisionRecords": [],
      "qualification": "No linked decision is inferred; review the retained records before treating this draft as a commitment."
    },
    "evidence": [
      {
        "id": "handover-question",
        "kind": "question",
        "title": "What should the next shift know?",
        "url": "",
        "contentRevision": 1
      },
      {
        "id": "sample-handover",
        "kind": "observation",
        "title": "Three sample handover notes",
        "url": "",
        "contentRevision": 1
      },
      {
        "id": "handover-concept",
        "kind": "idea",
        "title": "A single-device handover log",
        "url": "",
        "contentRevision": 1
      }
    ],
    "referenceAvailability": [
      {
        "reference": {
          "canvas": "my",
          "nodeId": "handover-question",
          "contentRevision": 1
        },
        "status": "current"
      },
      {
        "reference": {
          "canvas": "my",
          "nodeId": "handover-concept",
          "contentRevision": 1
        },
        "status": "current"
      },
      {
        "reference": {
          "canvas": "my",
          "nodeId": "sample-handover",
          "contentRevision": 1
        },
        "status": "current"
      }
    ],
    "disclosures": {
      "assumptions": [
        "No real pilot results are supplied.",
        "The selected device can run a local static server and supports IndexedDB.",
        "Entered initials can be interpreted under an agreed workshop policy.",
        "Supervisors can retain exports outside the app."
      ],
      "unansweredQuestions": [
        "Which tablet, browser and local-server arrangement will be used?",
        "Who enters acknowledgement initials, and how is ambiguity handled?",
        "What are the device-unavailability, export-retention and recovery procedures?",
        "What privacy rules govern names, issue descriptions and exported files?",
        "What paper-checklist material and tablet placement are suitable?",
        "What pre-agreed paper-gate criteria and later comparison method are acceptable?",
        "Pilot duration, sample size and decision thresholds.",
        "Target device and browser.",
        "Acknowledgement identity policy.",
        "Export retention and recovery policy."
      ],
      "risks": [
        "Synthetic notes do not establish user demand or ergonomic suitability. — Run the paper gate and review the prototype before adoption.",
        "Changing origin or losing the single device may make records inaccessible; export cannot restore them in-app. — Fix the origin, test on the chosen device and agree an external retention and recovery policy.",
        "Shared-device acknowledgements may not reliably identify a person. — Agree an initials and supervision policy outside the app.",
        "Privacy and physical suitability of the tablet or paper checklist materials are unknown. — Resolve handling, access, retention and physical-use questions before any supervised pilot."
      ],
      "acceptedRisks": [],
      "missingDecisionRequirementIds": [
        "R-001",
        "R-002",
        "R-003",
        "R-004",
        "R-005"
      ],
      "pendingRequirementIds": [
        "R-001",
        "R-002",
        "R-003",
        "R-004",
        "R-005"
      ],
      "hasUnavailablePrivateMaterial": true
    }
  },
  "evidence": [
    {
      "id": "handover-question",
      "kind": "question",
      "title": "What should the next shift know?",
      "url": "",
      "sourceVersionId": null,
      "contentRevision": 1
    },
    {
      "id": "sample-handover",
      "kind": "observation",
      "title": "Three sample handover notes",
      "url": "",
      "sourceVersionId": null,
      "contentRevision": 1
    },
    {
      "id": "handover-concept",
      "kind": "idea",
      "title": "A single-device handover log",
      "url": "",
      "sourceVersionId": null,
      "contentRevision": 1
    }
  ],
  "investigationId": "cookbook-workshop-handover-sol",
  "runId": "cookbook-runner:workshop-handover-sol",
  "receiptId": "resp_05f5672df4ad33f4016abeba53c50487d28582854e9d67d2c4",
  "created": "2026-10-01T19:54:43.304Z"
}