{
  "schemaVersion": 1,
  "checkedAt": "2026-11-10",
  "tasks": [
    {
      "slug": "pcb",
      "number": 1,
      "title": "Make & order the PCB",
      "summary": "Review the matched 0.0.11 artwork package, resolve socket stock, and request a fresh assembly preview/quote.",
      "needs": [
        "Eight-pin pill carrier selected",
        "JLCPCB account for a prototype quote"
      ],
      "result": "Gerbers + matching BOM/CPL ready for a reviewed prototype quote.",
      "steps": [
        {
          "title": "Choose the assembled pill carrier",
          "items": [
            "The 160×70 mm pill uses a 2.8-inch eight-pin SPI module, socketed Luckfox and contact smartcard reader.",
            "Recommended route: JLCPCB assembles 43 SMT placements; you install ordinary headers, modules and screws.",
            "These files supersede the Pico-format display bay. The standard FPC carrier remains a separate reference.",
            "Current order target is main 0.0.11-dev, with four copper layers, factory Keystone service points, bracket holes and the existing always-on backlight. The separate PWM candidate is not promoted."
          ],
          "choices": [
            {
              "title": "Pill carrier PCBA",
              "text": "Small parts assembled; ordinary header soldering at home.",
              "url": "/guides/modular-assembly/"
            },
            {
              "title": "Pill design & pinout",
              "text": "Display selection, eight-pin mapping, power and mechanical checks.",
              "url": "/guides/lcd-module/"
            },
            {
              "title": "Standard FPC reference",
              "text": "Separate earlier board; use its own files.",
              "url": "/guides/kicad/"
            }
          ]
        },
        {
          "title": "Download the matching order files",
          "items": [
            "Use the 0.0.11 pill bundle as one set. Its Gerbers/BOM/CPL share the new PCB hash and datum; do not reuse the old 0.0.7 preview as approval.",
            "Unzip once. Upload the inner shieldsigner-modular-gerbers.zip for the PCB; upload bom-jlcpcb.csv and cpl-jlcpcb.csv for assembly.",
            "LCD, Luckfox, customer headers/supports, six copper jumpers and twelve copper test pads are outside the SMT BOM. J302 is the optional 5 V/GND power header; old FPC/backlight parts are absent."
          ],
          "downloads": [
            {
              "label": "All files + prototype review notes",
              "url": "/files/shieldsigner-modular-order.zip"
            },
            {
              "label": "Gerbers & drills",
              "url": "/files/shieldsigner-modular-gerbers.zip"
            },
            {
              "label": "Assembly BOM",
              "url": "/files/variants/lcd-module-2.8/manufacturing/bom-jlcpcb.csv"
            },
            {
              "label": "Placement CPL",
              "url": "/files/variants/lcd-module-2.8/manufacturing/cpl-jlcpcb.csv"
            },
            {
              "label": "Full schematic PDF",
              "url": "/files/shieldsigner-modular-schematic.pdf"
            }
          ],
          "links": [
            {
              "label": "Current package readiness and unresolved gates",
              "url": "/guides/pcb-order-readiness/"
            }
          ]
        },
        {
          "title": "Upload Gerbers to JLCPCB",
          "items": [
            "Start a PCB quote and upload the Gerber ZIP, not the KiCad source ZIP.",
            "Confirm a 160×70 mm capsule, two copper layers and 1.6 mm thickness. Inspect the preview and separate plated/nonplated drills.",
            "Enable PCB assembly for PCBA. The carrier uses parts on both sides; confirm the quoted assembly service supports them."
          ],
          "links": [
            {
              "label": "Start JLCPCB quote",
              "url": "https://jlcpcb.com/"
            },
            {
              "label": "JLC ordering walkthrough",
              "url": "https://jlcpcb.com/help/article/how-do-i-place-a-pcba-order"
            }
          ]
        },
        {
          "title": "Match parts and inspect placement",
          "items": [
            "Upload matching BOM/CPL. Expect 43 fitted SMT references across 18 catalog identities.",
            "C603/C604 remain 1 µF C28323; C701/C702 are 10 µF C15850; U701 is the 3.3 V AP2112K C51118; U601 is the UR2 C633309.",
            "Inspect both sides, card entrance, USB direction, SEC1210/regulator pin 1 and eight switches. No substitutions without checking electrical and footprint compatibility.",
            "The current exact-MPN snapshot has no standard assembly stock for the selected switches, socket and SEC1210/PV-UR2. Confirm exact sourcing, MOQ, lead time and attrition with the supplier; overseas inventory is separate.",
            "Five assembled units are not checkout-ready until JLC confirms enough exact sockets and attrition. Two visible sockets do not guarantee two assembled units; no substitute or lower quantity is assumed.",
            "J301 USB4125-GF-A-0190 may need explicit selection if the BOM importer leaves it unchecked. The compensated CPL already includes J301/J601/U601 origin/rotation corrections: do not repeat old manual moves."
          ],
          "links": [
            {
              "label": "Interactive carrier parts",
              "url": "/build/parts/?variant=modular&scope=carrier"
            },
            {
              "label": "JLC matching rules",
              "url": "https://jlcpcb.com/help/article/component-matching-guidelines-for-pcba-orders"
            }
          ]
        },
        {
          "title": "Resolve the remaining quote/DFM items",
          "items": [
            "Obtain a fresh 0.0.11 supplier preview and final DFM/placement confirmation, approved assembly rails/fiducials/tooling, enough exact socket stock plus attrition, and a new quote before payment.",
            "Check the purchased LCD J1 row, mounting dimensions and 12 mm support stack. The retail module is outside PCBA.",
            "These are prototype quotation files. Native ERC/DRC/connectivity/parity pass with zero exclusions; physical fit, display power/thermal behavior, firmware and enclosure testing remain open.",
            "Before module power-up, use a reviewed carrier-profile image. The tested base-fork bench image drives GPIO56/57 as LCD outputs, but those are Left/Up switches on this PCB; pressing a switch can ground a driven output."
          ],
          "links": [
            {
              "label": "Pill electrical/mechanical evidence",
              "url": "/guides/lcd-module/"
            },
            {
              "label": "Assembly and bring-up steps",
              "url": "/guides/modular-assembly/"
            },
            {
              "label": "PCB/software compatibility: required carrier profile",
              "url": "/guides/pcb-software-compatibility/"
            },
            {
              "label": "First-article order gates and stock details",
              "url": "/guides/pcb-order-readiness/"
            }
          ]
        },
        {
          "title": "If you change the board, regenerate everything",
          "items": [
            "Use KiCad 10 and the local libraries. Run these commands from the repo root.",
            "Inspect the exported preview before using the regenerated order files."
          ],
          "commands": [
            {
              "label": "Regenerate checks and manufacturing files",
              "text": "mise run variant:lcd:check\nmise run variant:lcd:models\nmise run variant:lcd:fab\nmise run variant:lcd:review\nmise run variant:lcd:package"
            }
          ],
          "links": [
            {
              "label": "Open native design sources",
              "url": "https://github.com/lightningspore/shieldsigner-dev/tree/main/variants/lcd-module-2.8/kicad"
            },
            {
              "label": "KiCad editing tools",
              "url": "/guides/kicad/"
            }
          ]
        }
      ],
      "notice": "PCB 0.0.11-dev is stock_review_required: exact switch, socket and UR2 reader sourcing, new supplier placement/DFM review, stackup and panel/tooling approval remain required before checkout. Old cart/preview evidence is historical.",
      "next": "parts",
      "references": [
        {
          "label": "Pill design and rationale",
          "url": "/guides/lcd-module/"
        },
        {
          "label": "BOM and dated stock",
          "url": "/guides/modular-bom/"
        },
        {
          "url": "/guides/build-tips/",
          "label": "Practical build checks"
        },
        {
          "label": "Optional DigiKey self-assembly",
          "url": "/guides/self-assembly/"
        },
        {
          "label": "Current first-article readiness",
          "url": "/guides/pcb-order-readiness/"
        },
        {
          "label": "Carrier firmware profile compatibility",
          "url": "/guides/pcb-software-compatibility/"
        }
      ]
    },
    {
      "slug": "parts",
      "number": 2,
      "title": "Buy & source the parts",
      "summary": "A complete shopping list: carrier components and the separate system parts.",
      "needs": [
        "Your PCB/PCBA route",
        "Luckfox Mini storage variant"
      ],
      "result": "Every carrier line identified, plus the parts needed to finish the device.",
      "steps": [
        {
          "title": "Use the carrier table for PCB components",
          "items": [
            "For pill PCBA, JLC sources 43 fitted SMT placements from the matching BOM; do not buy a second loose set.",
            "The table defaults to the eight-pin pill carrier. Select Standard FPC only when building that separate board. Values, ratings and quantities remain visible."
          ]
        },
        {
          "title": "Buy the separate system parts",
          "items": [
            "Luckfox Pico Mini with compatible microSD boot and matching SC3336 camera/ribbon.",
            "HOTHMI HTM-TFT028A16-SPI, no-touch, using its J1 eight-pin 2.54 mm row; socket/header strips, 12 mm supports and short screws.",
            "microSD, one regulated 5 V USB supply and a new pill enclosure. Add a compatible contact card only if using the smartcard features."
          ]
        },
        {
          "title": "Confirm the exact module and hardware",
          "items": [
            "The LCD is a 3.3 V module. Match the saved drawing and J1 row; do not buy the former Pico-format display or a bare FPC panel for this PCB.",
            "Carrier header numbering runs opposite module J1 numbering. Verify all signals and the specified connector heights before soldering.",
            "The old enclosure does not fit. Confirm supports, screw engagement, camera cable path and button plungers."
          ],
          "links": [
            {
              "label": "Exact LCD, connector and power requirements",
              "url": "/guides/lcd-module/"
            },
            {
              "label": "Compatible card families",
              "url": "/guides/smartcards/"
            }
          ]
        }
      ],
      "special": "parts",
      "next": "compile",
      "references": [
        {
          "label": "Pill circuit choices and wiring",
          "url": "/guides/lcd-module/"
        },
        {
          "label": "Pill catalog snapshot",
          "url": "/guides/modular-bom/"
        },
        {
          "label": "Optional DigiKey self-assembly",
          "url": "/guides/self-assembly/"
        }
      ]
    },
    {
      "slug": "compile",
      "number": 3,
      "title": "Build & iterate on firmware",
      "summary": "Test the LVGL renderer, stage one named runtime, then build an OS image only when needed.",
      "needs": [
        "Repository checkout and mise",
        "Desktop toolchain for host tests; x86_64 Linux + Docker for the OS build",
        "A camera bundle matching the intended Mini display/button profile"
      ],
      "result": "A tested host renderer, named immutable runtime inputs, or a separately tracked OS image candidate.",
      "steps": [
        {
          "title": "Start from the tested profile and source pins",
          "items": [
            "Read the firmware status first: current bench image lvgl-dev.cb6170a37a5a, Python wallet logic, native LVGL UI, Rust camera and ZXing-C++ decoder.",
            "The repository pins OS e7589465aff172f4f510ad46d18776ccc8d2c203 and app efdd1cfd14e80a076a7e1ae91e9f2270ecbcd44f. Keep those pins when reproducing the baseline.",
            "Use the canonical artifact directories. Hardware and website version strings do not identify the flashed firmware.",
            "A fresh clone contains source, not the local baseline image or camera bundles. Image discovery/verification requires those artifacts to have been built or provided separately."
          ],
          "commands": [
            {
              "label": "Open the repository toolchain",
              "text": "git clone https://github.com/lightningspore/shieldsigner-dev.git\ncd shieldsigner-dev\nmise install"
            }
          ],
          "links": [
            {
              "label": "Current firmware and acceptance scope",
              "url": "/guides/firmware-status/"
            }
          ]
        },
        {
          "title": "Try the host renderer before rebuilding Linux",
          "items": [
            "These commands compile for your desktop and exercise the native screen protocol; they do not use the camera, flash a card or change a device.",
            "The host binary goes to dist/firmware/work/lvgl/build-host; generated protocol evidence goes to dist/firmware/checks/lvgl/host.",
            "A host pass is useful regression evidence, but physical display, GPIO and camera checks still need the target hardware."
          ],
          "commands": [
            {
              "label": "Build and test locally",
              "text": "mise run lvgl:app:build:host\nmise run lvgl:app:test:host\nmise run firmware:test"
            }
          ]
        },
        {
          "title": "Stage a new application iteration",
          "items": [
            "Choose a new build name. The stager builds the ARM application renderer and freezes runtime, overlay and combined camera inputs together.",
            "By default it uses the selected local image record's camera base. On a fresh checkout you must provide an existing reviewed camera bundle using --camera; local image artifacts are not in Git.",
            "Staging is not an OS build, deployment or flash. Existing attempt directories are refused."
          ],
          "commands": [
            {
              "label": "Stage using the verified local camera base",
              "text": "mise run firmware:stage -- --name my-lvgl-iteration"
            },
            {
              "label": "Or supply a reviewed camera bundle",
              "text": "mise run firmware:stage -- --name my-other-iteration --camera /path/to/reviewed/camera-bundle"
            }
          ],
          "links": [
            {
              "label": "Artifact layout and preservation rules",
              "url": "/guides/firmware-artifacts/"
            }
          ]
        },
        {
          "title": "Build an OS image only at the image boundary",
          "items": [
            "Use an x86_64 Linux Docker builder. Pass the staged bundle explicitly so the image contains the intended LVGL inputs rather than a newly generated default camera-only bundle.",
            "The example below uses a development bundle. Its variant must match --variant dev. SHIELDSIGNER_BUILD_HOST must already identify your authorized SSH builder.",
            "Remote outputs use dist/firmware/work/os/<job>; the local job record goes to dist/firmware/jobs/<job>.json. Keep SDK, Rust, download and compiler caches."
          ],
          "commands": [
            {
              "label": "Launch and inspect one named remote development build",
              "text": "mise run os:remote:build -- --variant dev --name my-lvgl-image --bundle dist/firmware/staging/my-lvgl-iteration/camera-bundle\nmise run os:remote:status -- my-lvgl-image"
            }
          ],
          "links": [
            {
              "label": "Local builds, platform details and cached iteration",
              "url": "/guides/os-build/"
            }
          ]
        },
        {
          "title": "Verify the candidate before calling it a flash image",
          "items": [
            "A successful job needs an actual terminal exit-code; recent log lines alone do not prove liveness or completion. Inspect the matching launcher and Docker state.",
            "Keep OS job output separate from the verified image store. Check the packed image, hashes, runtime identity and profile before deliberately selecting an image.",
            "The selected current image is found by firmware:where and checked by firmware:verify. An arbitrary new build is not automatically promoted or hardware-qualified."
          ],
          "commands": [
            {
              "label": "Check the deliberately selected image",
              "text": "mise run firmware:where\nmise run firmware:verify"
            }
          ],
          "links": [
            {
              "label": "Image identity and acceptance limits",
              "url": "/guides/firmware-status/"
            }
          ]
        }
      ],
      "notice": "The current tested LVGL image uses the base-fork 240×240 bench profile. Selecting dev mode alone does not adapt it to the 2.8-inch pill carrier or its UR2 reader.",
      "next": "flash",
      "references": [
        {
          "label": "Current LVGL firmware guide",
          "url": "/guides/firmware-status/"
        },
        {
          "label": "Buildroot details and historical benchmarks",
          "url": "/guides/os-build/"
        },
        {
          "label": "Firmware artifact lifecycle",
          "url": "/guides/firmware-artifacts/"
        }
      ]
    },
    {
      "slug": "flash",
      "number": 4,
      "title": "Flash & boot the software",
      "summary": "Verify a local development image, match its hardware profile, and check the boot after writing microSD.",
      "needs": [
        "Luckfox Pico Mini configured for microSD boot",
        "microSD + reader",
        "Verified local image and matching display/button/camera profile"
      ],
      "result": "A written microSD and a recorded first-boot check for the selected hardware profile.",
      "steps": [
        {
          "title": "Find the exact local image",
          "items": [
            "First determine whether this is the bench display/button board or the carrier PCB. The working base-fork image is not a safe drop-in carrier image; pressing Left/Up can ground a driven LCD output.",
            "Run firmware:where in your existing build checkout to find the deliberately selected image. A new clone contains source, not the local image files.",
            "The current checkpoint is lvgl-dev.cb6170a37a5a. Match the image profile, display orientation/colors, buttons and camera before writing a card.",
            "Use a Mini microSD image for this target; NAND/eMMC updates and other Luckfox model images are different artifacts."
          ],
          "commands": [
            {
              "label": "Locate and verify the current local image",
              "text": "mise run firmware:where\nmise run firmware:verify"
            }
          ],
          "links": [
            {
              "label": "Read before carrier power-up: GPIO conflict and correct profile",
              "url": "/guides/pcb-software-compatibility/"
            },
            {
              "label": "Current image identity, hashes and limits",
              "url": "/guides/firmware-status/"
            },
            {
              "label": "Need to build one first?",
              "url": "/build/compile/"
            }
          ]
        },
        {
          "title": "Check file identity and format",
          "items": [
            "The current compressed image is shieldsigner-lvgl-dev-cb6170a37a5a.img.xz; the decompressed .img has the same stem. Both have recorded SHA-256 values in the firmware guide.",
            "firmware:verify checks the selected files and packed verification record. Hashes identify those exact bytes; they do not prove the carrier wiring or all app workflows work.",
            "Use .img.xz only with a flasher that supports compressed images. A raw block-device writer must use the decompressed .img."
          ],
          "links": [
            {
              "label": "Hashes and artifact rules",
              "url": "/guides/firmware-artifacts/"
            }
          ]
        },
        {
          "title": "Write and verify the microSD",
          "items": [
            "In an image-aware flasher, select the verified local .img.xz or its decompressed .img.",
            "Select the intended removable microSD by its capacity/name; flashing erases that selected device. Wait for the write and verification to complete.",
            "Eject the card. If macOS offers to initialize an unfamiliar Linux partition, choose Ignore."
          ],
          "links": [
            {
              "label": "balenaEtcher project",
              "url": "https://etcher.balena.io/"
            }
          ]
        },
        {
          "title": "Boot and record the visible checks",
          "items": [
            "Before inserting modules or applying carrier power, verify the built image actually uses the carrier GPIO/LCD profile and UART policy. Power off before inserting microSD or changing display/camera connectors. Do not use unchanged base-fork bench firmware on the carrier.",
            "Confirm LVGL Home, readable colors/orientation, buttons and a harmless public camera QR. The user has confirmed these basic bench-image operations; repeat them on your hardware.",
            "Then test seed creation/reload, receive-address verification and transaction handoff with a disposable wallet. A full user-wallet acceptance session remains pending."
          ],
          "links": [
            {
              "label": "Exact carrier GPIO/LCD/UART requirements",
              "url": "/guides/pcb-software-compatibility/"
            },
            {
              "label": "First use and transaction loop",
              "url": "/build/use/"
            },
            {
              "label": "Separate carrier bring-up checklist",
              "url": "/guides/bringup/"
            }
          ]
        },
        {
          "title": "Keep development access and reader checks separate",
          "items": [
            "The current checkpoint is a development image with bench diagnostic access; do not treat that as a production security configuration.",
            "The tested base-fork profile disables UART2. A carrier using SEC1210UR2 requires its own reviewed UART2/reader configuration and hardware qualification.",
            "Smartcard testing and irreversible secure-boot fuse provisioning are outside this first LVGL boot checklist."
          ],
          "links": [
            {
              "label": "Hardware pin domains and selected connections",
              "url": "/guides/luckfox-pinout/"
            },
            {
              "label": "Card reader background",
              "url": "/guides/smartcards/"
            }
          ]
        }
      ],
      "next": "use",
      "references": [
        {
          "label": "Current firmware and measured status",
          "url": "/guides/firmware-status/"
        },
        {
          "label": "Boot and power diagnosis",
          "url": "/guides/bringup/"
        },
        {
          "label": "Critical bench/carrier profile mismatch",
          "url": "/guides/pcb-software-compatibility/"
        }
      ],
      "notice": "Do not power the pill carrier with the tested base-fork bench image unchanged: it drives GPIO56/57 as LCD outputs on carrier Left/Up switch nets. Use a reviewed carrier-profile image before module power-up. The lvgl-dev.cb6170a37a5a bench image is local-only and tested on its separate 240×240 board."
    },
    {
      "slug": "use",
      "number": 5,
      "title": "Try the LVGL signing workflow",
      "summary": "Check the working screens and camera, then practice the wallet QR handoff with a disposable seed.",
      "needs": [
        "Working display/buttons/camera",
        "Sparrow on your computer",
        "A new test seed"
      ],
      "result": "A watch-only wallet and a practiced offline signing workflow.",
      "steps": [
        {
          "title": "Confirm the current firmware before creating a seed",
          "items": [
            "Use the firmware guide to identify your image and tested hardware profile. A working Home screen alone is not a completed wallet workflow.",
            "The current app keeps the original Python wallet logic while LVGL renders the interface. Menu presentation may differ from older Pillow screenshots.",
            "Check camera scanning with a harmless public QR first; then use a disposable seed and record where any wallet handoff fails."
          ],
          "links": [
            {
              "label": "Current LVGL firmware and acceptance table",
              "url": "/guides/firmware-status/"
            }
          ]
        },
        {
          "title": "Create and back up a test seed",
          "items": [
            "On the device: Tools → New seed (camera entropy or dice entropy). Choose the length and complete the prompts.",
            "Record and verify the words offline. The ordinary SeedSigner flow holds the loaded seed in memory, so you need its backup again after power-off.",
            "Use a disposable seed and an unfunded wallet for your first run. The website never asks you to enter a seed or PIN."
          ],
          "links": [
            {
              "label": "Fork seed-generation walkthrough",
              "url": "https://3rditeration.github.io/seedsigner/quickstarts/02-mnemonic-seedkeeper.html"
            }
          ]
        },
        {
          "title": "Export public wallet information",
          "items": [
            "Open the loaded seed’s options and export an xpub for Single Sig and the script type you intend to use. Choose Sparrow as the QR format.",
            "In Sparrow: create a new wallet, choose the air-gapped hardware wallet route, and scan the signer’s public export.",
            "Keep network, derivation path and script type consistent. This is a watch-only wallet; never type the seed into Sparrow just to make scanning work."
          ],
          "links": [
            {
              "label": "Download Sparrow",
              "url": "https://sparrowwallet.com/download/"
            },
            {
              "label": "Sparrow documentation",
              "url": "https://sparrowwallet.com/docs/"
            },
            {
              "label": "SeedSigner custody guide",
              "url": "https://seedsigner.com/seedsigner-independent-custody-guide/"
            }
          ]
        },
        {
          "title": "Verify a receive address",
          "items": [
            "Display a receive address in Sparrow and use the signer’s address-verification/scan flow to confirm it belongs to your loaded seed and wallet settings.",
            "Compare the complete address and network. For multisig, import the correct wallet descriptor; a single cosigner seed alone does not define the wallet.",
            "Record this as a separate acceptance check; public-fixture signing does not establish address verification with your own wallet."
          ]
        },
        {
          "title": "Practice the transaction handoff",
          "items": [
            "Sparrow builds an unsigned transaction (PSBT) and displays it as an animated QR. Scan that QR with the signer.",
            "On the signer, review destination addresses, amounts, change and fee before approving.",
            "Display the signed QR, scan it back into Sparrow, then review there. Sparrow—not the offline signer—broadcasts when you explicitly choose to do so."
          ],
          "diagram": "signing",
          "links": [
            {
              "label": "SeedSigner signing walkthrough",
              "url": "https://seedsigner.com/seedsigner-independent-custody-guide/"
            }
          ]
        },
        {
          "title": "Finish the session",
          "items": [
            "Exit the loaded seed/session and power off when done. Retain a verified backup; an xpub or fingerprint cannot recover a lost seed.",
            "A SeedQR encodes the secret, unlike a public wallet-export QR. Keep a printed SeedQR private just like the words.",
            "For card storage or card signing, follow the separate smartcard task."
          ],
          "links": [
            {
              "label": "Use a smartcard",
              "url": "/build/cards/"
            }
          ]
        }
      ],
      "notice": "Boot, LVGL usability and camera scanning are user-confirmed on the bench setup. Public-fixture signing/export checks passed; a full session with the user's own wallet is still pending. Smartcards are outside this LVGL acceptance scope.",
      "next": "cards",
      "references": [
        {
          "label": "Current LVGL status and memory measurements",
          "url": "/guides/firmware-status/"
        },
        {
          "label": "SeedSigner official docs",
          "url": "https://seedsigner.com/"
        },
        {
          "label": "Fork quick starts",
          "url": "https://3rditeration.github.io/seedsigner/quickstarts/"
        },
        {
          "url": "/guides/multisig-practice/",
          "label": "Practice multisig recovery"
        }
      ]
    },
    {
      "slug": "cards",
      "number": 6,
      "title": "Use smartcards",
      "summary": "Choose storage or on-card signing, then verify the reader and card applet.",
      "needs": [
        "Contact-capable card",
        "UR2 reader configured",
        "Working device; spare/test card"
      ],
      "result": "Card detection, applet identity and a verified store/load or public-export test.",
      "steps": [
        {
          "title": "Choose what the card should do",
          "items": [
            "SeedKeeper stores secrets; loading one puts it in the Luckfox’s memory for host signing.",
            "Satochip derives/signs on the card; the host still reviews the transaction and requests a signature.",
            "This PCB has a contact socket and no NFC reader. Buy a contact-capable retail card, or a supported blank JavaCard for deliberate DIY provisioning."
          ],
          "choices": [
            {
              "title": "SeedKeeper: storage",
              "text": "PIN-protected seeds/passphrases.",
              "url": "/build/cards/?card=seedkeeper#card-workflow"
            },
            {
              "title": "Satochip: signing",
              "text": "On-card derivation and signatures.",
              "url": "/build/cards/?card=satochip#card-workflow"
            },
            {
              "title": "Blank JavaCard",
              "text": "Install an applet first.",
              "url": "/build/cards/?card=diy#card-workflow"
            }
          ]
        },
        {
          "title": "Verify the reader before changing the card",
          "items": [
            "Insert a spare card and inspect Tools → Smartcard Tools. Card presence/ATR only prove transport, not the right applet.",
            "J601 is the Amphenol 7312P0225A13LF contact socket. Only SEC1210 SC1 is wired; UR2 may enumerate another empty slot.",
            "If no card is detected, check seating and the UR2/UART configuration before installing applets or guessing PINs."
          ],
          "diagram": "reader",
          "links": [
            {
              "label": "Socket contacts & Linux stack",
              "url": "/guides/smartcards/"
            },
            {
              "label": "Reader bring-up",
              "url": "/guides/bringup/#stage-6-reader-configuration-before-inserting-a-card"
            }
          ]
        },
        {
          "title": "Follow the workflow for your card",
          "items": [
            "Select a card type below. Use disposable test secrets; the checklist is not a verification of the card or prototype."
          ],
          "special": "card-flow"
        },
        {
          "title": "Check the result and keep a recovery copy",
          "items": [
            "After loading a SeedKeeper secret, compare its fingerprint. For Satochip, compare the card’s master fingerprint/public export with the intended seed.",
            "A wrong fingerprint is a reason to stop and check setup, not to overwrite the card.",
            "Keep PINs, management keys and wallet backups offline. Do not reset a card containing a seed as a transport diagnostic."
          ],
          "links": [
            {
              "label": "Compatibility and applet versions",
              "url": "/guides/smartcards/"
            }
          ]
        }
      ],
      "special": "cards",
      "references": [
        {
          "label": "SeedKeeper instructions",
          "url": "https://3rditeration.github.io/seedsigner/seedkeeper.html"
        },
        {
          "label": "Satochip instructions",
          "url": "https://3rditeration.github.io/seedsigner/satochip.html"
        },
        {
          "url": "/guides/build-tips/",
          "label": "Reader diagnostic checkpoints"
        }
      ]
    }
  ]
}
