Files
ImpTune/.planning/MILESTONES.md
T
kawaandClaude Opus 4.6 67a1cd66ec chore: complete v1.0 milestone
Archive v1.0 MVP: 7 phases, 13 plans, 27/27 requirements.

- Archive roadmap to milestones/v1.0-ROADMAP.md
- Archive requirements to milestones/v1.0-REQUIREMENTS.md
- Move milestone audit into milestones/
- Create MILESTONES.md with v1.0 entry
- Evolve PROJECT.md: move shipped requirements to Validated,
  update Context with stack/LOC, log Key Decisions with outcomes
- Collapse ROADMAP.md to one-line milestone summary
- Update STATE.md to shipped status
- Back-fill stale requirements-completed frontmatter on
  02-01, 04-01, 05-01, 06-01 SUMMARY.md files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 09:47:37 +02:00

54 lines
3.5 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.
# ImpTune Milestones
Historical record of shipped versions.
---
## v1.0 — ImpTune MVP
**Shipped:** 2026-04-13
**Timeline:** 2026-04-10 → 2026-04-13 (4 days)
**Phases:** 7 (17, including gap-closure phases 6 & 7)
**Plans:** 13
**Requirements:** 27/27 satisfied
**Git tag:** `v1.0`
### Delivered
A self-hosted single-container webapp that takes a driver ZIP + printer configuration and produces ready-to-deploy packages for Microsoft Intune (.intunewin, Python-native) or NinjaRMM (ZIP) — covering driver INF parsing, full printer configuration with client/tenant grouping, PowerShell install/uninstall/detect generation with UAC + WOW64 guards, icon embedding, and command-preview UI.
### Key Accomplishments
1. **Python-native `.intunewin` format** — reimplemented AES-256-CBC + HMAC-SHA256 encrypted ZIP-in-ZIP with detection.xml, validated byte-level (Phase 1 / 01-03)
2. **Driver upload with INF parsing** — RawConfigParser-based parser handles BOM/UTF-16, `%TOKEN%` resolution, multi-model drivers, and unused-file detection; backed by SHA256 content-addressed storage (Phase 2)
3. **Full printer CRUD** — all 10 PRNT requirements (name, IP, port, duplex, color, paper, collate, client assignment, persistence, regenerate), HTMX forms, Alpine.js IP→port auto-derivation (Phase 3)
4. **Production-ready PowerShell generators** — install/uninstall/detect with SYSTEM-vs-user UAC elevation, WOW64 64-bit relaunch guard, pnputil two-step staging, duplex mapping (Phase 4)
5. **One-click package export**`/packages/intunewin` and `/packages/ninja` endpoints assemble complete ready-to-deploy artifacts from a saved printer config (Phase 5)
6. **Icon upload + embedding** — Pillow-validated 256×256 PNG ≤750KB, SHA256-addressed storage, wired into .intunewin output (Phases 5 + 6)
7. **Working dashboard + nav**`/packages` listing page, live `recent_printers` / `recent_packages` DB queries on dashboard (Phase 7 gap closure)
### Architecture / Stack
Python 3.12 · FastAPI · Jinja2 · HTMX · Alpine.js · Pico CSS · SQLite (Peewee WAL) · pycryptodome · Pillow — single Docker container, no Node.js, no external DB, no auth.
### Known Gaps / Tech Debt carried into v1.1
- Printer form driver dropdown requires manual page reload after new driver upload (Phase 2)
- PRNT-03 Alpine.js port auto-derivation — code verified, live browser runtime verification pending (Phase 3)
- No UI links to individual script downloads — only via package export or direct URL (Phase 5)
- `.intunewin` byte-level format validation against a real Intune tenant
- `pnputil` + `$PSScriptRoot` path resolution under SYSTEM context on a real Intune-managed device
- Nyquist validation: all 7 phases have draft VALIDATION.md but none are Nyquist-compliant — separate track for v1.1
### Notable Fixes Late in Milestone (2026-04-13)
- **BLOCKER:** DriverStore saved files at `{sha256}` but `packages.py` looked up `{sha256}.zip` — upload→export flow was broken in production, masked by pre-staged test fixtures. Fixed by centralizing path in `DriverStore.get_path()`; added `tests/test_upload_export_roundtrip.py` regression test.
- Peewee `datetime.utcnow()` deprecation eliminated (`_utcnow()` helper in `db/models.py`)
- Stale `requirements-completed` frontmatter back-filled on 5 SUMMARY.md files
### Archives
- Roadmap: [`milestones/v1.0-ROADMAP.md`](milestones/v1.0-ROADMAP.md)
- Requirements: [`milestones/v1.0-REQUIREMENTS.md`](milestones/v1.0-REQUIREMENTS.md)
- Audit report: [`milestones/v1.0-MILESTONE-AUDIT.md`](milestones/v1.0-MILESTONE-AUDIT.md)