Files
factory/vibe/PRD/ai-back-office/STATUS.md
T
arcodangeandClaude Fable 5 e15a6d68c5 docs(prd): milestone closure protocol — QA-gated doc-freshness sweep
Operator requirement: the resume protocol's twin. A milestone closes
only through an 8-step sweep that OPENS with a QA gate (acceptance
criteria re-verified with evidence, test suites green — golden-set
bars, injection fixtures, linter suites incl. seeded-wrong provenance
FAILs, idempotency replay; catalog status flips backed by proving-
protocol evidence; can't pass QA -> shed scope, don't close) and ENDS
with doc-surface QA (link/anchor check, deprecation grep of the claims
the milestone retired, fresh-reader smoke test by a context-free
subagent). In between: STATUS flip, roadmap re-baseline (diamonds never
move), no-tombstone truth-pass of leaves, AGENTS.md/SKILL.md/guidebook
sweep, outward loop (ADRs, memories, second-brain REX). Reader's half:
trust order live system > code > STATUS > leaves > memories; stale
Last Updated = suspect. Summarized as a house rule in factory
AGENTS.md, canonical checklist in the PRD STATUS.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-11 20:16:13 +02:00

72 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[vibe](../../README.md) > [PRD](../README.md) > [AI back-office](README.md) > **STATUS**
# STATUS — implementation tracker
> **Status:** 🟢 Current — backlog decomposed into issues (2026-07-11)
> **Last Updated:** 2026-07-11
> **Up:** [AI back-office hub](README.md)
> **Related:** [POC plan](poc-plan.md) · [Roadmap](roadmap.md) (dated plan; actuals and slips land here)
## Phase tracker
| Phase | Scope | State |
| --- | --- | --- |
| 0 — Foundations | read skills, sandbox + promote, backups, snapshots, bank reco, email ingest, Telegram gateway MVP | ✅ shipped pre-PRD (ledger below) |
| 1 — Flagship pipeline | [POC-1](poc-plan.md#poc-1--supplier-invoice-end-to-end) + [POC-5](poc-plan.md#poc-5--model-routing-bench) | ⬜ decomposed → [erp milestone P1](https://gitea.arcodange.lab/arcodange-org/erp/milestone/1) (erp#3845, #47) |
| 2 — Urgent compliance | [POC-6](poc-plan.md#poc-6--e-invoicing-readiness-spike) — **hard deadline 2026-09-01** | ⬜ decomposed → [erp milestone P2](https://gitea.arcodange.lab/arcodange-org/erp/milestone/2) (erp#46) |
| 3 — Standing fleet | [POC-2](poc-plan.md#poc-2--pi-sentinel), queue, digest + approval cards | ⬜ decomposed → [erp milestone P3](https://gitea.arcodange.lab/arcodange-org/erp/milestone/3) (erp#4850) + [gateway#1](https://gitea.arcodange.lab/arcodange/telegram-gateway/issues/1)/[#2](https://gitea.arcodange.lab/arcodange/telegram-gateway/issues/2) |
| Ledger compliance (cross-cutting) | [Dolibarr verifications](compliance.md#dolibarr-verifications-sandbox-first) | ⬜ decomposed → [erp milestone](https://gitea.arcodange.lab/arcodange-org/erp/milestone/4) (erp#51) |
| 4 — Money loops | [POC-3](poc-plan.md#poc-3--reconciliation--payment-recording), dunning, cash report | ⬜ decomposed → [erp milestone P4](https://gitea.arcodange.lab/arcodange-org/erp/milestone/5) (erp#5253) |
| 5 — Fiscal autopilot | [POC-4](poc-plan.md#poc-4--tva-dry-run), compliance calendar | ⬜ decomposed → [erp milestone P5](https://gitea.arcodange.lab/arcodange-org/erp/milestone/6) (erp#5455) |
| 6 — Emission era | e-invoice emission + e-reporting — **hard deadline 2027-09-01** | ⬜ not yet decomposed (starts 2027-05; requirements captured by erp#46 deliverable 4) |
## Backlog map
Every phase is decomposed into **self-contained issues** (context, deliverables, acceptance criteria, dependencies, PRD links). How a future session resumes: **pick the top unblocked issue of the earliest open milestone** — nothing else is needed; the issue body carries everything. Cross-cutting decisions get their ADRs via [factory#22](https://gitea.arcodange.lab/arcodange-org/factory/issues/22).
| Repo | Issues |
| --- | --- |
| [erp](https://gitea.arcodange.lab/arcodange-org/erp/issues) | **P1:** #38 fleet scaffold+AGENTS.md (D8) · #39 golden set+injection fixtures · #40 invoice-extract atom · #41 provenance checker · #42 compliance linter · #43 GED attach op · #44 idempotency keys · #45 POC-5 routing bench (D5) · #47 POC-1 exit gate — **P2:** #46 POC-6 Qonto-as-PA (D4) — **P3:** #48 watchdogs T13/T14 · #49 T17 second-brain hooks (D7) · #50 POC-2 Pi sentinel (D6) — **Compliance:** #51 Dolibarr verifications (FEC/BlockedLog) — **P4:** #52 POC-3 reco+payments · #53 T05 client invoice (D3, ⚠️ July manual ~07-23) — **P5:** #54 fiscal profile+calendar+T11 · #55 POC-4 TVA dry-runs — **Ops:** #56 known-patterns fix · #57 bucket C + document gaps |
| [telegram-gateway](https://gitea.arcodange.lab/arcodange/telegram-gateway/issues) | #1 Postgres durable queue (D1) · #2 daily digest + approval cards |
| [factory](https://gitea.arcodange.lab/arcodange-org/factory/issues) | #22 ADRs as decisions close (D1/D2/D4/D6/D7) |
## Closure protocol — per milestone
The resume protocol tells a session where to pick up work; this one keeps the doc surface **currently true** when work lands. Docs describe intent; **this file + git describe reality**. A Gitea milestone is closed only after the sweep — and the sweep starts with QA, because nothing gets documented as done before it is *proven* done:
1. **QA gate — verify before documenting.** (a) Every closed issue's **acceptance criteria re-verified** with evidence linked (eval scores, run journals, exit-gate results — not memory of them); (b) the milestone's **test suites green**: golden-set regressions at their bars, injection fixtures quarantined, linter suites behaving (forbidden manifests rejected, seeded-wrong provenance fixtures FAIL), idempotency replay no-op, watchdog/heartbeat checks where the milestone ships standing loops ([QA strategy](qa-strategy.md)); (c) any 🧪→✅ flip in the [agent-catalog](agent-catalog.md) backed by its proving-protocol evidence. A milestone that can't pass its own QA doesn't close — it sheds scope back into open issues.
2. **Flip the phase row** above (✅ + date + PR links) and prune the backlog map of closed issues.
3. **Re-baseline the [roadmap](roadmap.md)** at the boundary: mark the stream done, re-date downstream engineering bars if they slipped — regulatory diamonds never move; slips shed scope instead. Bump its Last Updated.
4. **Truth-pass the affected leaves** (no-tombstone — rewrite as currently true, no "previously/now"): the [task inventory](task-inventory.md) `Today:`/`Target:` lines the milestone changed; the agent-catalog matrix; `not yet`/candidate claims in [architecture](agent-architecture.md), [model-fleet](model-fleet.md), [compliance](compliance.md). Bump Last Updated **only on files whose claims changed**.
5. **Sweep the orientation layer**: repo `AGENTS.md` files (map rows, "not yet landed" pointers), touched `SKILL.md`s, and any [guidebook](../../guidebooks/erp/README.md) page mapping a changed component (house same-change rule).
6. **Doc-surface QA — mechanical + fresh-reader.** (a) Run the link/anchor/convention check over the PRD tree (the `prd_check` pattern: every relative link + heading anchor resolves, breadcrumbs, stamps) — zero broken; (b) **deprecation grep**: list the claims the milestone retired (read them off the closed issues — e.g. `frequency=0`, "not yet landed", "no fleet wiring") and grep `vibe/` + the repos' `AGENTS.md`/`SKILL.md` for them — zero hits or fixed; (c) **fresh-reader smoke test**: a context-free subagent reads only STATUS + the repo `AGENTS.md` and must answer "what shipped, what's next, what would you verify before trusting?" correctly — if it lands on a stale claim, real sessions will too.
7. **Close the loop outward**: ADRs for decisions the milestone settled ([factory#22](https://gitea.arcodange.lab/arcodange-org/factory/issues/22)), agent memories updated or pruned, a REX note into the second brain (T17 once live).
8. Only then **close the Gitea milestone**.
Between milestones, the continuous rule stands: **a PR that makes any documented claim false updates that doc in the same PR** — a change that leaves its docs stale is an incomplete change.
**Reader's half — trust order.** Any session, before acting on a versionable claim (a path exists, a flag's value, a status emoji): verify against **live system > code/git log > this STATUS > PRD leaves > agent memories/plans**. A page whose Last Updated predates the newest closed milestone in its area is suspect — verify before relying on it.
## Foundation ledger (shipped pre-PRD)
The bricks this PRD builds on, in the [erp](https://gitea.arcodange.lab/arcodange-org/erp), [factory](https://gitea.arcodange.lab/arcodange-org/factory) and [tools](https://gitea.arcodange.lab/arcodange-org/tools) repos:
| Brick | What it gives the fleet | Key PRs |
| --- | --- | --- |
| Read-only skill catalogue + `bin/arcodange` CLI | invoices, payments, TVA (collectée/déductible/summary), thirdparty completeness, recurring templates, snapshots — the fleet's A3 read layer | erp (V1V8 skill series) |
| Multi-env: `erp-sandbox` live in-cluster | the rehearsal environment ([ADR 0002](../../ADR/0002-per-application-environments.md)) | factory [#15](https://gitea.arcodange.lab/arcodange-org/factory/pulls/15)[#18](https://gitea.arcodange.lab/arcodange-org/factory/pulls/18), erp [#11](https://gitea.arcodange.lab/arcodange-org/erp/pulls/11)[#12](https://gitea.arcodange.lab/arcodange-org/erp/pulls/12), tools [#2](https://gitea.arcodange.lab/arcodange-org/tools/pulls/2)[#3](https://gitea.arcodange.lab/arcodange-org/tools/pulls/3) |
| Sandbox write skill (fiches, invoices, payments, avoirs) | the A2 write layer, host-guarded to the sandbox | erp [#21](https://gitea.arcodange.lab/arcodange-org/erp/pulls/21), [#22](https://gitea.arcodange.lab/arcodange-org/erp/pulls/22), [#25](https://gitea.arcodange.lab/arcodange-org/erp/pulls/25) |
| Promote flow (manifests, business-key lookup, prod gate) | the ADR-0003 capstone: rehearse → review → human-gated prod apply ([ADR 0003](../../ADR/0003-sandbox-state-lifecycle.md), factory [#19](https://gitea.arcodange.lab/arcodange-org/factory/pulls/19)) | erp [#23](https://gitea.arcodange.lab/arcodange-org/erp/pulls/23), [#24](https://gitea.arcodange.lab/arcodange-org/erp/pulls/24) |
| Deterministic payment↔bank linkage | `transaction_id` end-to-end: record with the feed id, reconcile by id (PASS 0) | erp [#26](https://gitea.arcodange.lab/arcodange-org/erp/pulls/26)[#28](https://gitea.arcodange.lab/arcodange-org/erp/pulls/28) |
| Sandbox checkpoint lifecycle + CLI | iso-prod refresh, write-agent provisioning, `.env` relink | erp [#29](https://gitea.arcodange.lab/arcodange-org/erp/pulls/29), [#30](https://gitea.arcodange.lab/arcodange-org/erp/pulls/30), [#35](https://gitea.arcodange.lab/arcodange-org/erp/pulls/35) |
| Dedicated Dolibarr backup (daily CronJob, 10 y retention, tested restore) | the evidence/recovery floor | erp [#31](https://gitea.arcodange.lab/arcodange-org/erp/pulls/31)[#34](https://gitea.arcodange.lab/arcodange-org/erp/pulls/34), tools [#5](https://gitea.arcodange.lab/arcodange-org/tools/pulls/5) |
| Bank reco + email ingest skills | Qonto/Wise feeds, Zoho `books@`/`bureaux@` ingestion (read-only) | erp (skill series) |
| telegram-gateway MVP | the human channel's transport (webhook echo proven; queue + async handlers roadmapped) | [telegram-gateway](https://gitea.arcodange.lab/arcodange-org/telegram-gateway) repo |
| Second brain (Obsidian vault + automation) | the fleet's knowledge layer: PARA vault git-synced, `sb.py` jobs (digest / inbox triage / daily / Gitea-ingest) on the hermes cron ticker, local Ornith runtime, `mcp-obsidian` access | [SecondBrain](https://gitea.arcodange.lab/arcodange/SecondBrain) repo |
## PR log (this PRD)
| Date | PR | What shipped |
| --- | --- | --- |
| 2026-07-11 | [factory#21](https://gitea.arcodange.lab/arcodange-org/factory/pulls/21) | PRD authored: hub + task inventory + agent architecture + model fleet + challenges + POC plan + QA strategy. |