Internal · ECE programme (CR #1173)

October plan — re-cut on real numbers

Both unknowns that the previous version scheduled a week to discover are closed — by reading the spec and auditing the model, in an afternoon. Both came back favourable. This plan uses what was measured, and it assumes the team is AI-augmented: mechanical work collapses; verification, vendor access and human decisions do not.

2026-09-19 · window Thu 1 Oct – Fri 30 Oct · 22 working days less 5 = 17 per dev, 34 dev-days · design · client questions · goal
What changed since the last version — two guesses became two measurements

maptara.claim.batch is real. 317 lines, 22 fields, state machine, IK, totals, copayment/insurance split, wizard, report, 387 lines of tests. Missing exactly one thing: file generation. azh is a serialiser over an existing model, not a rewrite.

The §302 mapping is a finished spec. 34 fields, every one with a Maptara source and an azh XML element. Its own conclusion: all required data already exists in Maptara. Zero new custom fields. XSDs and worked examples are on disk.

The old plan spent Dev B's entire first week finding this out. That week is now free.

Day figures are judgement. Blocker ages are measured. "Compresses" means AI-assisted mechanical work; "does not" means gated on something no tool speeds up.
Capacity
34

dev-days, 17 each

Planned work
24

12 each — fits with room

Both milestones
Fri 16 Oct

azh dry-run complete · Egeko rewrite done

Slack
10 d

5 each — real, not decorative

What compresses and what does not

Work1990 est.NowWhy
Test baseline + de-brand 106 lines across 10 files + ACL fix4 d1 dMechanical string work with a grep as the exit criterion. The cron migration is the only part needing thought.
Driver contract + ConnectionConfig + bind Egeko's 7 methods3 d1 d~200 lines from a written design; the pattern exists 12× in the repo already.
Read the §302 spec, audit claim.batch5 ddoneDone this afternoon. This is the largest single saving and it cost nothing.
§302 serialiser — 34 fields, 2 XML files, zip, 3 000-split5 d3 dSources known, XSDs on disk with examples. Assertions written before the serialiser.
SFTP driver incl. dry-run5 d3 dSmall, but paramiko is net new here and the host-key policy is a decision, not typing.
Egeko rewrite (R0 oracle + R3)15 d10 dCompresses least. AI writes the 263-line method fast; nothing validates it until the oracle is wired. Correctness-gated, not typing-gated.
Proof against azh's real hostDoes not compress at all. No account, no test environment. 46 days unclaimed.
7 client decisionsEmails and meetings. See the questions.

The plan — two lanes, 12 days each

W1 · 1–7 OctW2 · 8–14 W3 · 15–21W4 · 22–2829–30 30 Oct LIVIU — shared contract, then Egeko  ·  12 days + 5 slack Foundations + CONTRACT R0 — wire the payload oracle R3 Egeko rewrite — 8 d 5 d slack · then R6 (2 d) + R5 REST (3 d) — R5 drops first BOGDAN — SFTP, then azh §302  ·  12 days + 5 slack SFTP spike SftpDriver + dry-run claim.submission + submit_batch §302 serialiser — 34 fields return files · EPO/AVO/NVD/DIFF end-to-end dry run 5 d slack · barcode (Q10) · client answers the only handoff contract ready Fri 2 · first needed Tue 6 → 2 days of buffer ▲ FRI 16 OCT — both milestones: Egeko rewritten AND azh dry-run complete Why the lanes barely touch: different modules. Liviu owns provider_base, provider_egeko and driver_soap; Bogdan owns driver_sftp, the new azh plugin, claim.submission and one additive field on claim.batch. Merge conflicts should be near zero. Solid = planned, hatched = slack, grey band = only 2 working days exist after 28 Oct.
The October schedule. The red arrow is the entire coupling between the two people: the driver contract lands end of Friday 2 and Bogdan first needs it on Tuesday 6. Everything before that he spends on SFTP, which depends on nothing of Liviu's. If that one handoff slips, both lanes slip; nothing else in the month has that property.

DEV A — LIVIU  ·  base, contract, Egeko

Thu 1Foundations, all of it. Baseline the 112 tests; write the missing portal test; de-brand structure and vocabulary; cron migration by XML ID; ACL — keep read, drop write/create/unlink, groups= on secrets; delete maptara.provider.uom. Exit: grep for vendor names in non-test base = 0, Codexa form still opens.
Fri 2Contract + ConnectionConfig. provider.driver AbstractModel, 7 outbound ops + submit_batch, capability flags, declared inbound hole. Bind Egeko's existing 7 methods unchanged. If they fight the contract, you learn it today. Dev B is unblocked from here.
Mon 5 – Tue 6R0 — the oracle. Wire tools/ekv_body_diff.py (630 existing lines, called by nothing) into the suite. Exit: a deliberately misspelled wire key turns it red.
Wed 7 – Fri 16R3 — Egeko rewrite, 8 days. Split generate_document_template into read → dict → format. Lift ~200 transport lines into SoapDriver with the timeout and retry fixes. Collapse six credential blocks to one. Preserve: four status buckets, de_price precision, dhpIdentNumer misspelled.
Mon 19 – Fri 305 days slack + R6 licence sweep (2 d) + R5 REST driver (3 d) if slack is unused. R5 is the first thing dropped.

DEV B  ·  SFTP, then azh §302 end to end

Thu 1SFTP spike → driver skeleton. paramiko against a local server: connect, put, list, get. Decide host-key policy today. Module maptara_driver_sftp, depends: ['base'], dependency declared.
Fri 2 – Mon 5SftpDriver complete. Atomic put (temp + rename), probe with three stages, dry-run directory mode — the only pre-production test azh will ever have. Offline tests, no database.
Tue 6 – Wed 7Data model. maptara.claim.submission (Block A: SendungsId, timestamp, state, files). submission_state + double-send lock on claim.batchwithout touching its 387 lines of tests. submit_batch wired through the contract. Add now, free: the six IK kinds (Liefer, Abrechnungs, Zahlungs, Zertifikats, Kostenträger, DAS), route and bundling_signature — #1319's Release 2 then finds the model already shaped.
Thu 8 – Mon 12§302 serialiser, 3 days. Assertions first, from the XSD and examples. Begleitdatei (9 elements), Datendatei (79), zip with PDFs, split at 3 000. ISO dates — not Egeko's comma decimals; derive every format from the schema.
Tue 13 – Wed 14Return files. Parse *EPO/*AVO/*NVD/*DIFF. NVD → state Fehler, correction + resubmit. State is written from the return file, never optimistically from the send — the exact bug Egeko has.
Thu 15 – Fri 16End to end, dry run. Select invoices → submission → files in the dry-run dir → validate against XSD → simulate a return → state moves. Milestone: azh submission works locally.
Mon 19 – Fri 305 days slack + barcode print (Q10, 1–2 d if the report exists) + anything the client answers change.
Fri 16 Oct — both lanes done, or the plan is wrong:
  1. Base has zero vendor names outside tests; ACL fixed; Codexa untouched. Day 1.
  2. Contract exists; Egeko's 7 methods bound unchanged; Dev B consumes it. Day 2.
  3. A misspelled Egeko wire key turns the suite red. Day 4.
  4. Egeko rewritten on the contract, all 83 existing tests green, oracle green. Day 12.
  5. azh: select → submit → XSD-valid files in the dry-run dir → simulated NVD flips state to Fehler. Day 12.
What this plan cannot deliver, and why no velocity fixes it

A file that azh has accepted. Not because of us — because there is no account and no test environment. The SFTP access was offered on 4 August. Everything up to "the bytes are in the dry-run directory and validate against azh's own XSD" is in our hands. The last step is an email that has been unsent for 46 days.

Correct LEGS keys, correct EinlieferungsArt, a confirmed Sondererfassung1. All client answers. The serialiser is built to take them as data, so late answers cost a config change, not a rebuild — but "late" still means "not in the first real submission".

Out of scope, by decision

CutWhy
MIP pluginYour call — not now. Credentials from #1271 are live; protocol still unconfirmed (per-customer md5 key ≠ REST).
Inbound ops — Direktauftrag #1274, Versorgungsanfrage #1276, inbound messages #1275Blocked on Q11 in the client questions. Contract gets a declared hole on day 2.
eKV module splitDropped. Zero behaviour change, real production-migration risk, cost never rises.
Direct GKV-DTA (CR #1319)Release 2. A second plugin on the unchanged contract — EDIFACT ESOL/AUF, per-payer encryption, DAVASO, Dakota, KOTR. Greenfield; the generated module contributes field names, not code (08). Two free additions land in October: the six IK kinds and route/bundling_signature on claim.submission.

Still on a human

ItemAgeWho
azh SFTP account + SSH key — the only thing between "works in a directory" and "works"46 dus — send it Monday
Q6 EinlieferungsArt — paper or digital; largest scope variableproduct — building paper-only unless told
Q10 prescription printing — does Maptara print the Muster 16 today?product — decides whether barcode is 1 day or a new report
Any VDMS ticketyou

Window: October 2026, 22 working days (3 Oct is a Saturday), less 5 = 17 per developer. Planned 12 each; 5 each slack. Blocker age from ticket date 2026-08-04, today 2026-09-19. Estimates assume AI-assisted development for mechanical work and make no such assumption for verification, vendor access, or decisions. Previous "week 1 then re-cut" version superseded — the re-cut happened the same day, by doing the reading instead of scheduling it.

Internal planning document. Nothing here has been implemented.