# Execution Board (Living Kanban) *Last updated: 2026-04-17* --- ## Completed (v1 — CLI Pipeline) - [x] Adobe Sign OAuth setup + token auto-refresh (`src/auth_adobe.py`, `src/adobe_api.py`) ✅ - [x] Template download pipeline — metadata, fields, docs, PDF (`src/download_templates.py`) ✅ - [x] Field type mapping — all major Adobe field types → DocuSign tabs ✅ (see `field-mapping.md`) - [x] Coordinate system fix — y passthrough (top-origin, no conversion needed) ✅ - [x] Conditional logic mapping → `conditionalParentLabel/Value` ✅ (see `validation/conditional-logic-eval.md`) - [x] DocuSign template JSON composition (`src/compose_docusign_template.py`) ✅ - [x] DocuSign JWT upload (`src/upload_docusign_template.py`) ✅ - [x] Regression checklist for all field types ✅ (see `tests/FIELD-TYPE-REGRESSION.md`) - [x] End-to-end round-trip test (3 real Adobe templates → DocuSign) ✅ --- ## Phase 1 — Idempotent Upload ✅ (2026-04-17) - [x] Add `find_existing_template(name)` to `upload_docusign_template.py` — lists DS templates by name, returns most-recently-modified match - [x] Change `upload_template()` to upsert: PUT if match found, POST if not - [x] Add `--force-create` CLI flag to bypass upsert - [x] Write `tests/test_upload_upsert.py` — 4 tests passing --- ## Phase 2 — FastAPI Backend Foundation ✅ (2026-04-17) - [x] Add new dependencies to `requirements.txt` - [x] Create `web/` directory structure (app.py, config.py, session.py, routers/, static/) - [x] Implement `GET /health` endpoint - [x] Write `tests/test_api_health.py` — 2 tests passing --- ## Phase 3 — Auth Endpoints ✅ (2026-04-17) - [x] Implement Adobe Sign OAuth start + callback + disconnect in `web/routers/auth.py` - [x] Implement DocuSign OAuth start + callback + disconnect - [x] Implement `GET /api/auth/status` - [x] Write `tests/test_api_auth.py` — 4 tests passing --- ## Phase 4 — Template Listing API ✅ (2026-04-17) - [x] Implement `GET /api/templates/adobe` in `web/routers/templates.py` - [x] Implement `GET /api/templates/docusign` - [x] Implement `GET /api/templates/status` — computes `not_migrated / migrated / needs_update` - [x] Write `tests/test_api_templates.py` — 7 tests passing --- ## Phase 5 — Migration API ✅ (2026-04-17) - [x] Implement `POST /api/migrate` in `web/routers/migrate.py` — download → compose → upsert pipeline - [x] Implement `GET /api/migrate/history` — reads/writes `migration-output/.history.json` - [x] Write `tests/test_api_migrate.py` — 7 tests passing --- ## Phase 6 — Frontend ✅ (2026-04-17) - [x] Create `web/static/index.html` — side-by-side template browser layout - [x] Create `web/static/app.js` — auth status check, template listing, migrate flow, history - [x] Create `web/static/style.css` — status badges, layout --- ## Phase 7 — End-to-End & Regression ✅ (2026-04-17) - [x] Write `tests/test_e2e.py` — 7-step full pipeline test, 1 test passing - [x] Write `tests/test_regression.py` — compose pipeline vs snapshots, 4 tests passing - [x] Create `tests/fixtures/expected/` — snapshot JSONs for David Tag Demo, NDA, Rob Test - [x] Full suite: **29/29 passing** --- ## Gitea - [x] Committed and pushed all changes (2026-04-17) --- ## Results & Lessons Learned - (2026-04-14) NDA, David Tag Demo, Rob Test all converted cleanly - (2026-04-15) Coordinate bug fixed — y is top-origin in both platforms, no conversion needed - (2026-04-15) Paul Adobe Template created via API; Company/Title fields require manual UI fix (API limitation) - (2026-04-17) v2 planning complete — idempotent upload + web UI implementation begins