--- title: Be Civic — product backlog type: roadmap status: living last-reviewed: 2026-05-21 maintainer: operator + AI agents acting on operator's behalf --- # Be Civic — product backlog The rolling backlog. Six sections: 1. **Active sprint** — in flight now. 2. **Next sprint** — queued for the next sprint cycle. 3. **Parking lot** — known-good ideas without a sprint slot. 4. **Frozen / triggered** — deferred until a named trigger fires. 5. **Sprint history** — link list of past sprints. 6. **Source index** — where items came from. Each item is a markdown chunk with a YAML frontmatter block. Items move between sections by being cut/pasted; their frontmatter remains the same. When an item ships, mark `status: done`, leave it in the active-sprint section until sprint close, then archive into the sprint file. **Cadence:** ad-hoc pre-launch, biweekly post-launch. Each sprint scoped to ≤5 medium items + a maintenance allowance. Retro at sprint close, captured in the sprint file. No tooling, no tickets — just the running record. **Convention:** `S` ≤ 1 day, `M` 1–3 days, `L` > 3 days. Severity: 🔴 launch-blocker · 🟠 next-sprint · 🟡 monitor · 🟢 noted, no action. --- ## 1. Active sprint — `2026-W26` (workspace foundation: structure, processes, agents) **Plan:** [`~/projects/be-civic/bc-bmd/plan-2026-05-21-portal-foundation.md`](../../bc-bmd/plan-2026-05-21-portal-foundation.md). Cleanup manifest: [`~/projects/be-civic/bc-bmd/cleanup-manifest-2026-05-21.md`](../../bc-bmd/cleanup-manifest-2026-05-21.md). Opened 2026-05-21. **Sprint goal:** Rebuild operating infrastructure on which all subsequent sprints run. Phase 0 cleanup (this commit lands) → Phase 1 workspace skeleton → Phase 2 three new repos created (bc-specs, bc-roadmap, bc-workspace-portal) → Phase 3 carve specs/ + roadmap/ out of bc-operations → Phase 4 Cloudflare Pages + Access deploy → Phase 5 app skeletons → Phase 6 meta-agents → Phase 7 sprint-zero verification. **This is NOT product work.** Product sprints resume post-foundation. bc-docs `dev → main` rollup model continues for product repos (bc-docs only); the new ops trio is exempt. **Sprint file:** to be created at `sprints/2026-W26-workspace-foundation.md` in Phase 1 (Phase 0 cleanup precedes the sprint file creation). **Trigger:** ES-0003 strategic pivot (closed corpus, expat-lifecycle wedge, qualified-supplier marketplace, sub-5-FTE-to-PMF) — captured in `bc-bmd/data/evidence-sessions.json` 2026-05-20. **Operator-pending items carried into W26 backlog awareness (not foundation scope):** - Saint-Josse-ten-Noode Irisbox 3-letter code probe (~5 min) - H7b trigger-keyword table operator-review - T3 Chrome-headless substitution confirmation - Feedback-surface T1 + T2 taste decisions - GSC URL Inspection for 3 queued canonicals - Native FR/NL/DE translation review (in-flight) - Belgian-lawyer pre-flight review (in-flight) **Sprints completed since last backlog review:** - W22 (skills-graph-discovery + risk-framework + submission-provenance amendments + becivic-bootstrap harness build) — closed - W23 (spec normalisation + renderer unification) — closed - W24 (onboarding rebuild + Cowork plugin v2) — closed; produced the spec drift W25 corrected - W25 (dossier rebuild + handoff + row_list infrastructure) — **closed 2026-05-21 with carry-over** (W25.2, W25.3, W25.8 + structural harness-load issue); see [W25 retro](sprints/2026-W25-dossier-and-handoff.md#retro) --- ## 2. Next sprint — carry-over + queued items ### W25 carry-over (parked until post-foundation product work resumes) ```yaml --- title: Close out W25 carry-over — handoff fix + defensive dossier check + MECE-lint + structural harness load id: rm-w25-carryover source: 2026-W25 retro 2026-05-21 severity: 🟠 next product-sprint scope: M status: parked owner: TBD linked_pr: linked_docs: - sprints/2026-W25-dossier-and-handoff.md - docs/agent-ux/sessions/2026-05-20-Imogen-plugin-test/session-debrief-2026-05-20.md items: - W25.2 — bc-onboarding Step 8 handoff fix (S) - W25.3 — bc-session-close Step 0 defensive dossier check (S) - W25.8 — MECE-lint instruction in harness-CLAUDE.md §11 (S) - Structural — harness CLAUDE.md ancestor-walk fires on session boot only, NOT on mid-session request_cowork_directory (M) --- ``` The first three items are S-sized; the structural fourth item is the long pole because it requires either fixing the ancestor-walk semantics or introducing an alternative load mechanism. Parked behind the foundation sprint per operator direction (no further product work until DevOps robust). ### Other post-pivot rewrites surfaced by the cleanup manifest ```yaml --- title: Post-pivot product vision (v5 — combined press-release + ceo-review) id: rm-postpivot-vision source: cleanup-manifest-2026-05-21 §7 severity: 🟡 monitor scope: M status: parked linked_docs: - docs/archive/press-release.md (pre-pivot v4) - docs/archive/ceo-review.md (pre-pivot) - bc-bmd/data/evidence-sessions.json (ES-0003) notes: T3 — author a post-pivot vision doc (closed corpus, expat-lifecycle, qualified-supplier marketplace, affiliate revenue). Anchor for marketing copy + YC narrative + investor conversations. --- ``` ```yaml --- title: Post-pivot skill corpus plan id: rm-postpivot-corpus-plan source: cleanup-manifest-2026-05-21 §7 severity: 🟡 monitor scope: M status: parked linked_docs: - docs/archive/skill-corpus-plan.md (pre-pivot V1) - bc-bmd/data/evidence-sessions.json (ES-0003) notes: T3 — reframe the corpus plan around expat-lifecycle wedge. Which skills land first, what depth, what's deferred. Pairs with vision rewrite. --- ``` ```yaml --- title: bc-docs rebuild + workspace integration (next-phase plan) id: rm-bcdocs-rebuild source: foundation plan §6 + cleanup manifest §3 severity: 🟠 next phase after foundation ships scope: L status: parked linked_docs: - cleanup-manifest-2026-05-21.md (lists 7 pre-pivot framing files in bc-docs) notes: T3 — design how bc-docs joins the workspace; restructure repo for closed-corpus product; rewrite README/llms.txt/CONTRIBUTING/agents.mdx/docs-about/docs-faq away from CC-BY-4.0 open-corpus framing. Includes git anomaly fix (untrack agents/skills-graph.json). Pairs with the design pivot. --- ``` --- ## 2.5. Previously-queued items (W22+ candidates — still valid) ```yaml --- title: path_amendment / path_draft auto-commit pipeline — full mirror of skill pipeline source: 2026-W21 retro deferred + 2026-05-13 operator decision (locked design) severity: 🟠 scope: M status: queued owner: staging-worker-author linked_pr: linked_docs: - sprints/2026-W21-path-directory.md --- ``` **Locked design (operator decision 2026-05-13):** full auto-commit, mirroring the skill_amendment / skill_draft pipeline. After the 24h staging window: - `path_amendment` → PR opens against `main` applying the field-level change to `paths/index.json`, auto-merge on green CI (same as `skill_amendment`) - `path_draft` → PR opens against `main` with the new entry inserted under `paths.` at `status: alpha`, PR-CI mints `pth-NNNNN` UID, **maintainer review required** before merge (same exception as `skill_draft`) - `persistPathCreatorIdentity` (already wired, dormant) gets called at draft commit time to mirror the proposal salt + submitter hash to `path-creator-salt:` / `path-creator-hash:` for self-validation prevention **Implementation surface (W22+):** 1. Add path-aware `buildCommitTarget` branch in `tools/staging-worker/lib/commit-paths.ts` that materializes a new/edited path entry into the JSON catalogue file (apply structured-field edit for amendments; insert new keyed entry for drafts; serialize back to canonical JSON form preserving the keyed-order convention). 2. Add PR-CI UID-minting step for `path_draft` — either a standalone workflow that runs before merge and amends the PR with the next free `pth-NNNNN`, or inline in `staging-worker` against a UID counter in D1/KV (operator preference TBD; the standalone-workflow approach is simpler and matches how the skill graph handles `val_`/`ref_` UIDs today). 3. Remove the `path_submission_commit_unsupported` short-circuit at `tools/staging-worker/worker.ts §210`; route both submission types through the new commit branch. 4. Hook `persistPathCreatorIdentity` at the draft commit site (parallel to `persistSkillCreatorIdentity` at skill_draft commit, line 428). 5. Tests: extend the `tests/staging-worker/*` suite to cover the path-commit path; add a fixture path_draft + path_amendment in `tests/fixtures/paths/`. **Open question for the implementer:** concurrency — if two `path_draft` records reach commit time in the same tick, they both want to mint the next `pth-NNNNN` and insert into the same JSON file. The PR-CI-mints-UID approach naturally serializes via PR open ordering; the inline-mint approach needs a D1 counter with atomic increment. Recommend PR-CI approach for the simpler concurrency story. Estimated effort: ~200 LOC across staging-worker + commit-paths lib + a new workflow YAML, plus 100 LOC of test fixtures. Single PR; one sprint slot in W22 or W23. ```yaml --- title: Live MCP `tools/call` probe for the 5 new Path Directory tools source: 2026-W21 retro — coverage gap; deploy-mcp is green but no live MCP-client invocation tested severity: 🟡 scope: S status: queued owner: lead (one-shot dogfood task) linked_pr: linked_docs: - sprints/2026-W21-path-directory.md --- ``` `get_path_directory`, `get_path`, `submit_path_source_validation`, `submit_path_amendment`, `submit_path_draft` are registered (`mcp/worker.ts` 11→16) and `deploy-mcp` green, but no live `tools/call` from an MCP client has been recorded. Should ship as a W22 dogfood task before the rollup PR merges if operator wants live-MCP coverage in the audit trail. ~30 min: spin up an MCP client (Claude Code with `mcp.becivic.be` or `mcp-dev.becivic.be` configured), call each of the 5 tools, capture transcripts. ```yaml --- title: Cloudflare Access service token for `/qa` against dev.becivic.be — operator action queued 2026-05-13 source: 2026-W21 retro + 2026-05-13 operator decision (issue now) severity: 🟡 scope: S status: queued owner: operator (CF dashboard) + lead (skill patch) linked_docs: - sprints/2026-W21-path-directory.md --- ``` `dev.becivic.be` is Access-gated; `/qa`'s headless browser has no service token, so probes return Access-login HTML. Locked direction (operator 2026-05-13): issue the token now. Steps: **Operator-side (one-time, ~10 min in CF dashboard + a `gh secret set` pair):** 1. Cloudflare Zero Trust dashboard → Access → Service Auth → Service Tokens → **Create Service Token**. Name: `becivic-qa-headless`. Duration: 1 year. Copy the `CLIENT_ID` and `CLIENT_SECRET` (the secret is shown only once). 2. Attach the token to the existing `dev.becivic.be` Access application: Access → Applications → `dev.becivic.be` → Policies → add a new policy allowing `Service Token: becivic-qa-headless` (or include it in the existing operator allowlist policy as an additional include rule). 3. Store the secrets locally in a `.env.local`-style file under `~/.gstack/projects/be-civic-bc-docs/cf-access.env` (mode 0600, gitignored — never commit) so `/qa` can source them at probe time. **Skill-side (lead, post-token-issue):** 4. Patch `/qa` (or `/browse` under it) to read `CF_ACCESS_CLIENT_ID` + `CF_ACCESS_CLIENT_SECRET` from `~/.gstack/projects//cf-access.env` when probing a hostname whose domain matches `dev.becivic.be`. Forward as `CF-Access-Client-Id` and `CF-Access-Client-Secret` HTTP headers on every request. 5. Smoke-test: `/qa https://dev.becivic.be/` should return the renderer HTML (not the Access login page), and the `dev-noindex-smoke` post-deploy check should still see 302 from unauthenticated probes (token is per-tool, not domain-wide). Once shipped, the workers.dev escape hatch can stay as a fallback but Access-gated probes become the default. ```yaml --- title: F1 fix — first-touch agent discovery (landing-CTA routes to harness install) source: 2026-05-08 office-hours design — agent harness (skill-as-delivery) severity: 🔴 scope: M status: queued owner: landing-builder linked_pr: linked_docs: - bc-operations/docs/2026-05-08-agent-harness-design.md - bc-operations/docs/agent-ux/sessions/2026-05-08-nationality-walkthrough/transcript.md --- ``` The harness design fixes F2–F6 structurally but F1 (agent didn't load `/agents` on first contact) is only partially closed: install fixes F1 *for users who reach the install*, but discovery up to that step is the same problem we have today. Landing-CTA work is needed in parallel: the becivic.be paste-prompt and `/ai-setup.mdx` copy must route the agent to the harness install on capable runtimes, not just to `/agents`. Plus: drop the Cowork recommendation in `/ai-setup.mdx` (validated by the 2026-05-08 walkthrough — Claude.ai handles file workflows fine). ```yaml --- title: Native review of FR/NL/DE translations source: landing-architecture design 2026-05-07 severity: 🟠 scope: M status: queued owner: operator (arrange native reviewer per locale) linked_pr: linked_docs: --- ``` Tier 1 locales (FR/NL/DE) currently ship `translationStatus: ai-drafted-needs-native-review`. Engage native speakers per locale for a 1–2 hour pass each. Update `_meta.translationStatus` to `native-reviewed` once cleared. Tier 2 (AR/UK) keeps the provisional-translation footer until the same pass is done — separate budget, lower priority. ```yaml --- title: Belgian-lawyer pre-flight review source: legal-review-2026-05-08 #caveat + #terms severity: 🟠 scope: M status: in-flight (operator-arranged) owner: operator linked_pr: linked_docs: - bc-operations/legal/legal-review-2026-05-08.md - bc-operations/legal/dpia-submission-flow-2026-05-08.md --- ``` Retain a Belgian/EU IP-and-tech firm for a 4–6 hour pre-flight review of `/terms`, the takedown contract, and the DPIA. Operator-arranged; not a code task. Brief: in-house counsel review + DPIA + locked takedown contract. Slipped W19 → W20 → W21 (operator scheduling, not blocked on us). ```yaml --- title: Map the feedback surface — skill quality vs. validation source: operator direction 2026-05-08 (post-W19 QA pass) severity: 🟠 scope: M status: queued owner: spec-author + agent-protocol-author linked_pr: linked_docs: - bc-docs/agents/submit/observation/canonical-source.md - bc-docs/schemas/submission-observation.schema.json --- ``` Validation answers "is this skill safe and correct"; **quality** is a separate dimension — does the skill actually outperform an agent reasoning over the underlying process unaided, and where were the points of friction worth improving? Today the corpus has no signal for either. Operator's design direction (verbatim, 2026-05-08): > Per-skill star rating on skill quality (agent assessment), per-session star rating on agent experience (agent assessment), per-session star rating on user experience (user assessment). The instructions should include how agents should assess these before submitting. Making this assessment may also trigger more fruitful observations for improving skills — how could we make it a 5-star experience next time? Three feedback dimensions to design: | Dimension | Who rates | When | Star scale | |---|---|---|---| | **Skill quality** | Agent | Per skill, end of session | 1–5: did the skill help, vs. reasoning unaided? | | **Agent experience** | Agent | Per session, end of session | 1–5: how was the *protocol* — instructions, submission flow, surfacing observations? | | **User experience** | User (proxied via agent) | Per session, end of session | 1–5: did the user feel guided to outcome, in their language, with the right frictions surfaced? | W22+ design tasks (carried from W20 design doc `bc-operations/docs/feedback-surface-design.md`, which already passed `/autoplan` review with 6 of 12 mistral findings accepted; 2 operator-pending taste decisions T1+T2 still open): 1. **Schema additions** — extend `submission-observation` (or new submission types) to carry the three ratings. 2. **Agent instructions** — write the rubric the agent uses to self-assess each dimension. 3. **5-star prompting** — the rubric should explicitly trigger the "what would make this 5 stars next time?" question. 4. **Aggregation surface** — decide what's published. 5. **Anonymity invariant** — ratings must not become an identity vector. The design doc exists; the implementation is what's queued here. Companion deliverable: a written-down assessment rubric the operator can also use as a manual sanity check against AI-driven ratings. --- ## 3. Parking lot > **Item removed 2026-05-10:** "Agent UX testing programme — fixtures, sub-agent/skill, two-agent simulation" (parked since 2026-05-08) was promoted into W20 via `bc-operations/docs/2026-05-08-agent-ux-test-infra-design.md` (canonicalized 2026-05-10). The W20 spike implementation tracks under sprint item 10 (T0–T3 spikes). > **Items folded into W25 active sprint 2026-05-19:** four small corpus + harness catches from the 2026-05-19 plugin-test debrief — Brussels BAPA Annexe 3.1 combined attestation (W25.6), residency-clock probe inputs (W25.7), fee-timing warning (W25.8), MECE-lint harness instruction (W25.9) — are in-sprint implementation work, not backlog items. ```yaml --- title: Per-commune nationality surcharge survey (per-NIS5 VV catalogue) source: 2026-05-13 nationality-application round-7.2 migration — dropped from [Requests for contributions] under the three-affirmations gate; this is a "KNOW eventually" item that just needs more research, not a community ask severity: 🟡 scope: M status: queued owner: researcher-author linked_docs: - ../docs/2026-05-13-canonical-shape-evolution.md --- ``` Build a per-NIS5 catalogue of commune-applied surcharges on the federal art. 12bis nationality declaration fee. Schaerbeek confirmed at €100; other Brussels and Wallonia communes range €0–€30; Flemish communes typically charge nothing. Target shape: VV rows under naming pattern `commune--nationality-surcharge-eur` (e.g. `commune-21015-nationality-surcharge-eur`). Source via fiche-d'information screenshots from each commune's nationality desk page or a `dev` MCP probe. Replaces the existing generic `cnb-commune-surcharge-eur-typical` VV with per-commune rows once coverage reaches the major Brussels-19 + the largest Walloon and Flemish communes. Discovered during the nationality-application round-7.2 migration: this was originally proposed as a community-contribution ask, but per the round-7.2 three-affirmations gate (tried/walled/material), it's actually a KNOW gap the walker can close with more research effort — it should not live in §[Requests for contributions]. ```yaml --- title: commune-nationality-appointment-booking path walk (purpose: tool) source: 2026-05-13 nationality-application round-7.2 migration — appointment lead times vary widely and a path is the right shape; agent can route the user to the live online booking surface rather than the skill carrying a stale lead-time estimate severity: 🟡 scope: M status: queued owner: path-walker linked_docs: - ../docs/2026-05-13-canonical-shape-evolution.md --- ``` Walk a `commune-nationality-appointment-booking` path entry (purpose: `tool`) per §6.12 path-shape with per-commune `sources[]` entries pointing at each commune's online appointment-booking surface for the *Service Population / Bevolkingsdienst* nationality desk. Brussels-19 + the largest Walloon and Flemish communes as the V0 coverage target. Each source carries: the deeplink (where available — many communes use a generic booking portal with category selection), the booking-channel enum (online portal, email, in-person walk-in), and any commune-specific notes (e.g. "Schaerbeek requires the user to first call to be added to a waitlist"). The path replaces the standing [Requests for contributions] ask about appointment lead times that the round-7.2 migration removed from `nationality-application` — agents route users to the live tool rather than the skill carrying stale numbers. ```yaml --- title: CORS headers on becivic.be renderer worker (apex CORS) source: 2026-05-11 MCP audit — probed apex; OPTIONS /llms.txt → 405, GET → 200 with no Access-Control-Allow-Origin response header. Browser-based AI agents (Custom GPTs, extension agents, in-browser JS) get CORS-blocked when reading becivic.be directly severity: 🟠 scope: S status: queued owner: renderer-author trigger: as soon as MCP runtime fix (W1) ships — same shape of fix on a different worker linked_docs: - ../docs/2026-05-11-mcp-server-fixes-plan.md --- ``` Sibling fix to the MCP CORS work in W1, but in the renderer worker (`bc-docs/site/sites/becivic/`) — not the MCP worker. Apex becivic.be currently has no CORS headers on any path, including `/llms.txt`, `/llms-full.txt`, `/skills/*/canonical`, `/agents/*`. Browser-context AI agents get blocked at preflight; server-side fetchers (Claude.ai WebFetch backend, Anthropic SDK) bypass CORS so the failure is intermittent and client-dependent. Fix mirrors the MCP plan's CORS approach: `Access-Control-Allow-Origin: *` (matches W1 decision — public read, no credentials), `Vary: Origin`, OPTIONS → 204 short-circuit. ~30 LOC in `site/core/worker.ts`. Bundle with W1 deploy or ship as a follow-up; renderer redeploys independently so timing is flexible. ```yaml --- title: Tag-resolution model + walking-procedure rework (W2) source: 2026-05-11 MCP audit — found alpha corpus authoring layer doesn't use / MDX tags as walking-procedure.md mandates severity: 🟠 scope: L status: parked owner: operator (walking-procedure rework) + renderer-author + corpus-walker trigger: operator has time to think through the walking-procedure rework; likely after MCP runtime fix (W1) ships and a launch-prep breath opens linked_docs: - ../docs/2026-05-11-tag-resolution-model-rework.md - ../docs/skill-universe/walking-procedure.md - ../docs/2026-05-11-mcp-server-fixes-plan.md --- ``` The 47 alpha skills declare volatile_values + references in frontmatter but the body uses prose + markdown-bracket `[ref-id]` shorthand instead of the `` / `` MDX tags that walking-procedure.md §Phase 4 mandates. The catalogue rows exist but aren't linked from any skill body — they're "just a target for feedback," not part of the agent's read path. Decided direction (operator, 2026-05-11): MDX components with value/label as children, renderer-side resolution, build-time substitution. Three sub-workstreams once activated: W2.A walking-procedure rework (operator-driven, locks the contract + name-space reconciliation), W2.B renderer change (emit value-wrapped tags in markdown output, not just HTML), W2.C corpus rebase (47 alpha skills, mechanical-with-judgement). Until activated, MCP `read_skill`'s description references tag resolution that doesn't yet apply — harmless because no tags exist to resolve. Working doc captures the decided direction + open questions to settle before this becomes an actionable plan. Resume with `/office-hours` or `/autoplan` on the working doc once the operator picks it up. ```yaml --- title: Project-plan / tracker artifact in the harness source: bc-bmd/interviews/ES-0001 — citizenship-flow user interview 2026-05-11 severity: 🟡 scope: M status: parked owner: harness-author (when activated) trigger: second observed-use session (FU-0006, ~2026-06-15) confirms the project-artifact wedge holds against a stubbed citizenship skill linked_docs: - ../../bc-bmd/interviews/ES-0001-citizenship-flow-debrief.md - ../../bc-bmd/data/opportunities.json (OPP-0001) --- ``` In ES-0001 the subject — an Australian, ~10 years in Belgium, real active 10-year-route file — asked twice unprompted for a "project outline" while navigating Belgian citizenship on naked Claude.ai Sonnet, and neither configuration produced one. The word she used was "project," not "answer." Reframes a candidate primary deliverable of the harness from Q&A toward a living project artifact: short structured intake → generated plan with documents-to-gather, dates-to-watch, dependencies, next-actions, refreshed turn-by-turn as the user answers more questions. Adjacent expansion path also user-named, unprompted: non-citizenship life-admin events ("an AI project manager would have been useful when I was moving house"). Out-of-scope for v1 harness — validate first against the stubbed citizenship skill (ES-0001 follow-up FU-0001, due ~2026-05-25), then a second observed-use session with the same subject (FU-0006). Promote to next sprint only if session 2 confirms the artifact closes the unmet need that session 1 surfaced. Until then, parking lot. ```yaml --- title: becivic.be rotating-prompt copy-affordance fix source: bc-bmd/interviews/ES-0001 — citizenship-flow user interview 2026-05-11 severity: 🟠 scope: S status: parked owner: landing-builder linked_pr: linked_docs: - ../../bc-bmd/interviews/ES-0001-citizenship-flow-debrief.md --- ``` In ES-0001 the subject reached the becivic.be prompt block — the desired conversion event for free-tier first-touch users — and tried to copy the prompt. The rotating fragment of the prompt was not separately addressable as a copy target and the click affordance was unclear; she attempted a click, it did not behave as expected, and she pasted the visible static prompt into Claude instead. The handoff recovered, but the rotating intent (showcasing different first-prompts to surface the corpus's breadth) does not survive contact with a real first-touch user. Fix: separate the rotating fragment into its own component with an explicit copy-button affordance and visible state-feedback ("copied"). Related to but distinct from the F1 fix in §2 (which is about *where* the prompt routes capable agents — to the harness install vs `/agents`); this item is about *whether the copy interaction is legible* in the first place. If both are picked up in the same window, bundle them in one PR — both touch the same prompt block. ```yaml --- title: Rotating AI-session observations as landing social proof source: bc-bmd/interviews/ES-0001 facilitator self-debrief 2026-05-11 severity: 🟢 scope: M status: parked owner: landing-builder trigger: observation volume crosses a threshold worth surfacing publicly (operator-judged; likely after first 50–100 vetted AI-session observations submitted through the corpus pipeline) linked_docs: - ../../bc-bmd/interviews/ES-0001-citizenship-flow-debrief.md - ../legal/legal-review-2026-05-08.md --- ``` Distinct from any user testimonial mechanic: these are observations *made by AI sessions during real Be Civic use* (the existing `agents/submit/observation` pipeline output), curated for public display and rotated on the homepage as system-generated social proof — "an AI helping a Brussels expat just discovered X about the residence-history rule." Reinforces both value-prop (the corpus learns from real use) and the substrate-agnostic framing (multiple AI runtimes contributing). Not actionable now — no observation volume yet — but worth marking so it's not re-invented when the volume arrives. Constraints at trigger time: must clear the same anonymity invariants as the rest of the observation pipeline (see `legal/legal-review-2026-05-08.md`), must obviously route to source skill / source observation page rather than being decorative, must degrade gracefully when volume is low (don't ship a 3-item rotator that loops every 9 seconds). — the desired conversion event for free-tier first-touch users — and tried to copy the prompt. The rotating fragment of the prompt was not separately addressable as a copy target and the click affordance was unclear; she attempted a click, it did not behave as expected, and she pasted the visible static prompt into Claude instead. The handoff recovered, but the rotating intent (showcasing different first-prompts to surface the corpus's breadth) does not survive contact with a real first-touch user. Fix: separate the rotating fragment into its own component with an explicit copy-button affordance and visible state-feedback ("copied"). Related to but distinct from the F1 fix in §2 (which is about *where* the prompt routes capable agents — to the harness install vs `/agents`); this item is about *whether the copy interaction is legible* in the first place. If both are picked up in the same window, bundle them in one PR — both touch the same prompt block. ```yaml --- title: PR #124 follow-up — schema housekeeping source: pr-124-code-review-2026-05-08 severity: 🟡 scope: S status: queued owner: agents-reviewer or operator linked_docs: - bc-operations/docs/2026-05-08-pr-124-code-review.md --- ``` Four cleanup items surfaced by the PR-124 code review (already-merged in 2026-05-08): (b) bump fixture envelopes (`tests/fixtures/skills/*`) to `schema_version: 4` or delete the python validator suite; (c) communications note that `render-roadmap.ts` is now a no-op stub (roadmap moves to PR labels / GitHub Project boards); (d) cleanup PR scrubbing dead `CORPUS_STATUS_VALUES` export, dead `rolled_back`/`retracted` constants, the v3 schema title strings, and the `state-machine.ts` Status type drift; (e) document the D1 caveat in the rollback playbook. None block production; bundle as a single small follow-up PR. ```yaml --- title: /agents/handshake endpoint source: agents-redesign-review 2026-05-07 R7 severity: 🟡 scope: M status: parked owner: agents-reviewer (when activated) trigger: post-launch — desire for honor-system "agents in the wild" telemetry --- ``` A `POST /api/handshake` endpoint AIs can ping at session start to confirm reachability and report capabilities. Operator deferred to v1.1 in legal review. Lightweight; ship when there's a use case beyond pure verification. ```yaml --- title: Periodic re-scrub cron source: legal-review-2026-05-08 #10 severity: 🟡 scope: S status: parked owner: agents-reviewer or operator trigger: post-launch ops --- ``` Monthly cron that re-runs regex + LLM scrub against the committed corpus to catch PII that earlier rules missed. Extend `tools/staging-worker`. Out-of-scope for launch; useful as a backstop once corpus has user submissions. ```yaml --- title: Defamation guard in observation pipeline source: legal-review-2026-05-08 #8 severity: 🟡 scope: M status: parked owner: agents-reviewer trigger: next observation-pipeline sprint --- ``` Extend regex/LLM scrub to flag adjectival reputational claims about named entities ("commune X is corrupt", "VFS is unreliable"). Not a launch blocker — corpus is small and submissions are operator-reviewable today. Wire into staging-worker or per-submission validator when observation volume grows. ```yaml --- title: Trademark TMView confirmatory search source: legal-review-2026-05-08 #7 severity: 🟡 scope: S status: parked owner: operator trigger: convenience — 10 min, free, no obligation --- ``` 10-minute search at TMView.eu confirming "Be Civic" mark isn't blocked. Methodology in [trademark-search-be-civic-2026-05-08.md](../legal/trademark-search-be-civic-2026-05-08.md). No filing yet — that waits on entity formation. ```yaml --- title: Agent protocol nice-to-haves (R6, R8, R9, R10, R11, R12) source: agents-redesign-review 2026-05-07 severity: 🟡 scope: S–M each status: parked owner: agents-reviewer (when activated) trigger: post-launch demand or operator decision --- ``` From the agents-redesign-review doc, deferred to v1.1: R6 quickstart page, R8 changelog, R9 Deprecation HTTP headers, R10 try-it-now widget, R11 link rels (already done — close), R12 meta-skills surface. Pull individually as needed. --- ## 4. Frozen / triggered ```yaml --- title: Company imprint (Code Économique XII.6) source: legal-review-2026-05-08 (deferred section) severity: 🟢 scope: S status: frozen trigger: when business entity is registered --- ``` ```yaml --- title: BOIP trademark filing source: legal-review-2026-05-08 #7 severity: 🟢 scope: M status: frozen trigger: when there is something to defend (paying customer / competitive moat) --- ``` ```yaml --- title: Code licence cleanup (split CC BY 4.0 / Apache 2.0) source: legal-review-2026-05-08 (deferred section) severity: 🟢 scope: S status: frozen trigger: when any code goes public --- ``` ```yaml --- title: LICENSE file rewording — scope CC BY 4.0 to corpus only source: legal-review-2026-05-08 #12 severity: 🟢 scope: S status: frozen trigger: when entity is registered (private repo only — no public exposure today) --- ``` ```yaml --- title: Cross-runtime state sync for the Be Civic harness source: 2026-05-08 office-hours design — agent harness (skill-as-delivery) severity: 🟢 scope: M status: frozen trigger: when a second runtime adapter ships AND user-reports of duplicate-observation submissions or lost drafts surface linked_docs: - bc-operations/docs/2026-05-08-agent-harness-design.md --- ``` When a user installs Be Civic on multiple runtimes on the same machine (e.g. Claude Code AND Claude.ai web Skills), each install has independent state — independent `observations-buffer.jsonl`, independent session histories. v1 ships single-runtime so divergence isn't reachable yet. v2 adds a second adapter and the risk becomes real. Mitigation options at trigger time: shared-state opt-in via settings.json, server-side reconciliation by session_id, or explicit user prompt at second-install time ("we found existing Be Civic state — import?"). Don't build pre-emptively; wait for the failure mode to materialise. ```yaml --- title: CC BY 4.0 enforcement against forks source: legal-review-2026-05-08 (deferred section) severity: 🟢 scope: variable status: frozen trigger: when corpus becomes a competitive moat someone is trying to take --- ``` ```yaml --- title: AI Act Art. 50 transparency source: legal-review-2026-05-08 #10 severity: 🟢 scope: S status: frozen trigger: if/when Be Civic ships its own consumer AI surface --- ``` --- ## 5. Sprint history - **[2026-W21 — path-directory](sprints/archive/2026-W21-path-directory.md)** (opened 2026-05-11, closed + merged 2026-05-13) — Path Directory V0 end-to-end against the nationality skill graph. Shipped: spec reconciliation v0.5 → v0.5.3, 5 new schemas (path / path-source / paths-index / path-amendment / path-draft), 16 alpha paths × 57 sources at `paths/index.json`, `data/communes.json` (565 entries), 4 new API endpoints, 5 new MCP tools, renderer module + requires_paths backref on skill pages, harness §31 path-traversal, bc-corpus-creator path-mode integration, PR-CI gating (schema-validate + pii-guard + cross-ref). 28 bc-docs commits on `dev` + 7 bc-ops commits. Rolled up as `dev → main` PR #151, merged as squash `7991389`. Three operator-direction items resolved pre-merge: path_source self-validation prevention (DDR-2-mirrored at path scope), GET /api/paths quarantined-filter enabled, bootstrap.zip relocated to bc-operations for internal use. Live probes confirm V0 catalogue serving from production. Compression ~20–25×. - **[2026-W20 — two-track-launch](sprints/archive/2026-W20-two-track-launch.md)** (closed 2026-05-10, same day opened, Phase 1 + Phase 2) — standing up the `dev` / `main` two-track CI/CD pipeline, branch protection on `main`, harness unblock, `run_worker_first` quick-win validation, plus the pre-launch readiness queue (F1 fix, welcome-to-belgium scrub, PR-7, sidebar nav auto-generation, feedback-surface design via /autoplan, harness implementation H1–H10 + H7b, test-infra spikes T0–T3). 7 PRs merged, 16 bc-ops commits, ~5.5h CC time, 19 surprises captured. - **[2026-W19 — launch-prep](sprints/archive/2026-W19-launch-prep.md)** (closed 2026-05-08, 1-day pre-launch ad-hoc) — shipped 17 PRs incl. legal-review delta (PR-L1, PR-A0, PR-A2), v3→v4 schema cutover (#124), 23 new alpha skills across 7 skill-walk PRs, apex Two-Doors swap (#135), and 4-PR SEO/UX hygiene sweep (#136-#139). Belgian-lawyer review + native FR/NL/DE translation review slipped to W20 (operator-arranged, not blocked on us). - **[2026-W25 — dossier rebuild + handoff fix](sprints/2026-W25-dossier-and-handoff.md)** (closed 2026-05-21 **with carry-over**) — shipped 17 of 20 implementation items: vendored dossier renderer (fpdf2 + pypdf + fonts), bc-dossier-compilation rewrite + module + templates + render.py codegen, row_list form-rendering infrastructure (type spec + sub-scalars + Handlebars widget + JS hydration), 5 corpus catches (terminal Skill tag, BAPA combined cert, fee-timing warning, card-type enum 16→23, nationality input declaration). Rollup PRs merged: bc-docs #171, be-civic-plugin #1. **Carry-over** (parked at rm-w25-carryover above): W25.2 + W25.3 + W25.8 + structural harness-load issue. Dogfood (Imogen, 2026-05-20) confirmed harness handoff failure mode is still live — captured as structural item in the carryover. --- ## 6. Source index | Source | Date | Items still in scope | |---|---|---| | [legal-review-2026-05-08](../legal/legal-review-2026-05-08.md) | 2026-05-08 | takedown contract, footer disclaimer, lightweight licence-ack, prohibited-source-class, Belgian-lawyer review, monthly re-scrub, defamation guard, TMView search, frozen items | | [pr-124-code-review-2026-05-08](../docs/2026-05-08-pr-124-code-review.md) | 2026-05-08 | F1 + F2 fixed and shipped; (b)/(c)/(d)/(e) follow-ups parked as schema housekeeping bundle | | [pr-124-ship-report-2026-05-08](../docs/2026-05-08-pr-124-ship-report.md) | 2026-05-08 | F1 caught + fixed; ship-runner forensic note re: agent-team git-race | | [ci-cd-two-track-design-2026-05-08](../docs/2026-05-08-ci-cd-two-track-design.md) | 2026-05-08 | In W20 (`2026-W20-two-track-launch`); `run_worker_first` quick-win piggybacked in W20-6 | | [2026-W21 path-directory retro](sprints/archive/2026-W21-path-directory.md) | 2026-05-13 | path_amendment/path_draft auto-commit (W22 queued), live MCP tools/call probe (W22 queued), CF Access service token for /qa (parked), Saint-Josse-ten-Noode Irisbox probe (operator-pending), bc-corpus-creator path-mode dogfood walk (continuous) | | [2026-05-19 plugin-test debrief](../docs/agent-ux/sessions/2026-05-19-plugin-test/session-debrief-2026-05-19.md) | 2026-05-19 | W25 active sprint (dossier rebuild + bc-onboarding handoff fix + four corpus/harness catches as in-sprint items) | | [agents-redesign-review-2026-05-07](../docs/2026-05-07-agents-redesign-review.md) | 2026-05-07 | R7 handshake (parked), R6/R8/R9/R10/R12 nice-to-haves (parked); R1–R5 + R13–R15 already shipped | | [landing-architecture design 2026-05-07](~/.gstack/projects/Be-Civic-be-civic/gstack-main-design-20260507-113730.md) | 2026-05-07 | PR-7 source-file deletion, native FR/NL/DE review, AR/UK provisional-translation review | --- ## Operating notes - gstack-native: this file is markdown + YAML frontmatter, gbrain-readable, fits the same pattern as specs and design conversations. - Pairs with `/context-save` and `/context-restore` (session state) — roadmap is the multi-session counterpart for product state. - Items move between sections; severity is sticky; status changes as items progress. Owner can be a teammate name, "operator", or unassigned. - Every shipped item should leave a trail: PR link in `linked_pr`, mention in the active sprint file's retro.