Help us improve
Share bugs, ideas, or general feedback.
From be-civic
Use when the customer presents a document — paste, upload, attachment, photo, or described field value. Extracts the routing fields the active procedure needs, archives the original to the customer's machine, discards everything else. Tells the customer plainly what was kept and what wasn't.
npx claudepluginhub be-civic/be-civic-plugin --plugin be-civicHow this skill is triggered — by the user, by Claude, or both
Slash command
/be-civic:bc-document-handlerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill applies the data minimisation rules at the moment of document presentation: take only what the procedure needs, archive originals, never write document bodies to routing stores, maintain the cross-procedure index. This skill runs the per-drop dialogue and abort handling.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Explores codebases via GitNexus: discover repos, query execution flows, trace processes, inspect symbol callers/callees, and review architecture.
Share bugs, ideas, or general feedback.
This skill applies the data minimisation rules at the moment of document presentation: take only what the procedure needs, archive originals, never write document bodies to routing stores, maintain the cross-procedure index. This skill runs the per-drop dialogue and abort handling.
Handle inline. Don't context-switch back to the procedure skill for every drop — extract, archive, confirm, return.
When the procedure body references a resource by UID to provide document metadata, fetch it via:
GET https://becivic.be/api/resources/<uid>
Authorization: Bearer <harness_key> # omit if absent; public read works
Response: { "status": 200, "data": { ... } }. Branch on HTTP status code first. Read the harness key from ${SUBSTRATE_STATE}/.env (BECIVIC_HARNESS_KEY=<value>).
inputs: plus any fields its body references by name.YYYY-MM), an ISO country code, a NIS5 commune code, boolean inventory flags. Never identity-shaped values.profile.json or MEMORY.md. It exists only in the active conversation context and is gone when the conversation ends. The original goes to the visible surface (${SUBSTRATE_DATA}) — that's the customer's archive, recoverable next session.Archive originals to the visible surface (${SUBSTRATE_DATA}), which is user-accessible from their file manager:
${SUBSTRATE_DATA}/<procedure-slug>/documents/<doc-type>.<ext>${SUBSTRATE_DATA}/documents/<doc-type>.<ext>Use the procedure-specific path when the document belongs to an active procedure context; use the top-level documents/ path for documents that are reusable across procedures without a primary owner.
Use these when deciding whether a field belongs in routing:
After extraction, tell the customer in plain English what was kept and what wasn't. Brief. Conversational. Not a privacy disclaimer.
Example, after a birth certificate drop for a nationality-declaration procedure:
"Got it. From your birth certificate I kept: country of birth (BE), birth month-bucket (1985-04). The certificate itself I saved to your Be Civic folder under
nationality-application/documents/birth-certificate.pdf. The full name, exact date, and certificate number don't get stored anywhere we share. Want to keep going?"
If the procedure didn't need anything from the document (e.g., the customer dropped something not on the procedure's needs list): say so, archive the original, move on.
"Got it — saved to your folder under
nationality-application/documents/marriage-certificate.pdf. The nationality declaration doesn't need anything from this one specifically, so I haven't pulled any routing fields. We'll have it on hand if a later step asks."
After deciding which routing fields to extract, run scripts/scrub-layer1.py against each candidate value before writing it to profile.json. On any high-severity hit (identity, biometric, document_number):
profile.json.Do NOT silently retry. Do NOT silently write a degraded version. The scrub is load-bearing for the privacy contract; surface every failure.
When the archived document is reusable across procedures (birth certificate, residence certificate, marriage certificate, apostille, EU 2016/1191 multilingual form), record the path in MEMORY.md under a documents: section. Future procedures find it without re-asking the customer to fetch it again.
The documents: block is path-only — no field values, no transcriptions. Example:
## documents
- birth-certificate (BE, archived 2026-05-14): nationality-application/documents/birth-certificate.pdf
- marriage-certificate (BE, archived 2026-05-14): nationality-application/documents/marriage-certificate.pdf
After the first archive for a procedure completes, if the parent procedure declares application_dossier as its artefact class, invoke be-civic:bc-dossier-compilation in initial mode. This produces the early-stage dossier with placeholders so the user sees value before the procedure completes. Don't fire again for subsequent archives in the same procedure — subsequent archives trigger refresh mode, which bc-dossier-compilation handles itself based on its own state detection.
To check whether this is the first archive for the current procedure: look for any existing dossier file under <procedure-slug>/documents/dossier/ in the visible surface. If none exists, this is the first archive; fire initial mode. If one already exists, skip the initial-mode invocation (subsequent refresh is handled by bc-dossier-compilation on its own trigger).
references/card-vision-prompt.md. Vision-extraction instructions for card-type + month-bucket dates, with pairing heuristics for front/back and a two-fail policy aligned with bc-onboarding §7.1 R5.documents/. Check the cross-procedure index first; if present, reuse the existing path and skip the upload.references/card-vision-prompt.md but bc-onboarding's §7.1 hydration loop is the caller — this skill does not initiate the read.