Commit Graph
100 Commits
Author SHA1 Message Date
kawaandClaude Sonnet 4.6 df01919220 docs(11): research UI enhancements phase domain
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 10:39:48 +02:00
kawa e726cab548 docs(state): record phase 11 context session 2026-04-15 10:33:10 +02:00
kawa b0df0619b1 docs(11): capture phase context 2026-04-15 10:33:04 +02:00
kawaandClaude Sonnet 4.6 036b048705 docs(phase-09): complete phase execution and human sign-off
All 3 UX defects fixed, 11/11 must-haves verified, human-approved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 09:52:43 +02:00
kawaandClaude Sonnet 4.6 70454c8e14 docs(09-02): complete playwright-port-autofill plan
- STATE.md: advance to plan 2, record UX-02 closure decisions
- ROADMAP.md: Phase 9 now 3/3 summaries (Complete)
- Task commits already in history: 4e9bd9b (scaffolding) + 322fc20 (test)
- 1 Playwright test green: test_port_autofill[chromium] PASSED in 5.49s
- 113 unit tests unaffected

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 17:46:38 +02:00
kawaandClaude Sonnet 4.6 fb7555e6b5 docs(09-01): complete driver-upload-fix-and-inline-oob plan
- STATE.md: advance to Phase 09-01 active, completed_plans=15
- ROADMAP.md: Phase 8 marked Complete 8/8, Phase 9 progress row fixed
- All 3 tasks complete: 500 regression fixed, OOB template created, printer form wired
- 113 tests passing (pytest tests/ -x -q --ignore=tests/e2e)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 17:42:47 +02:00
kawa f32c99dfbf docs(phase-08): complete Nyquist validation track (45/45 pass, human sign-off) 2026-04-13 16:39:27 +02:00
kawa ffcc3be3aa docs(08-08): complete v1.0 validation index rollup plan
- Create 08-08-SUMMARY.md (Phase 8 closure, NYQ track complete)
- Advance STATE.md (Phase 8 ready_for_verification, 27/30 plans complete)
- Update ROADMAP.md Phase 8 progress to 8/8 Complete
2026-04-13 16:36:14 +02:00
kawa 732582021a docs(08-08): human sign-off on v1.0-VALIDATION-INDEX.md (NYQ-02/03 complete)
- Flip v1.0-VALIDATION-INDEX.md frontmatter draft -> signed-off (Sébastien QUEROL, 2026-04-13)
- Tick index sign-off line (45/45 pass, 0 fail-fix-v1.1)
- Replicate dated sign-off line into all 7 per-phase VALIDATION.md Validation Sign-Off blocks
- Tick nyquist_compliant checkbox in phases 01/02/03/04/05/07 (06 already ticked)
- Upgrade Approval lines phases 01-05 from 'pending' to signed-off with index back-link
- Tick REQUIREMENTS.md NYQ-02/NYQ-03 and flip Traceability Pending -> Complete
- Phase 4 attestation-only runtime gap recorded in index Residual Risk block (not reopened per plan 10-03 sign-off)
2026-04-13 16:36:08 +02:00
kawa 192a64d574 docs(08-08): compile v1.0-VALIDATION-INDEX rollup (45/45 pass, draft)
- Flat table with one row per v1.0 success criterion across Phases 1-7
- Tally: 45/45 pass, 0 fail-fix, 0 deferred, 0 wont-do
- Gap validation block cross-checks all 5 historical-gap closures against REQUIREMENTS.md + fixing SUMMARY.md
- Attestation-gap residual risk (SCRPT-01..05 / RTVAL-02/03/04) documented explicitly for Phase 11 rollout
- Sign-off line unchecked (draft), frontmatter status=draft pending Task 2 human verification
2026-04-13 16:24:39 +02:00
kawa dc70acf5f2 docs(08-07): complete Phase 7 Nyquist audit plan
- 4/4 pass (3 in-scope + 1 UX-03 carry-over to Phase 9)
- per-phase NYQ-01 coverage complete (7/7 v1.0 phases, 45 rows, 0 roll-forward)
- STATE advanced to plan 8 (final 08-08 rollup remaining)
2026-04-13 16:20:34 +02:00
kawa 7e78b1714e docs(08-07): add Phase 7 Nyquist Record (4/4 pass)
- 3 in-scope rows for /packages 200, dashboard recent printers, dashboard recent packages
- 1 carry-over row for UX-03 (Phase 5 origin, closed in Phase 9 / 09-03)
- cites TDD commits 8cf47f5 + 91910ad (Phase 7) and d359001 + 68a2935 (Phase 9 UX-03)
- completes per-phase NYQ-01 coverage across all 7 v1.0 phases (45 total audit rows)
2026-04-13 16:18:15 +02:00
kawa 9c52cb45c2 docs(08-06): complete Phase 6 Nyquist audit plan
- SUMMARY.md documents 1-row Nyquist Record (PKG-04 icon embedding)
- Bidirectional gap-closure citation loop with 05-VALIDATION row 4
- RTVAL-01 cited as supporting transitive runtime evidence
- STATE advanced to plan 7, ROADMAP Phase 08 progress 6/8
2026-04-13 16:15:42 +02:00
kawa bb62174917 docs(08-06): Phase 6 Nyquist audit - PKG-04 icon embedding 1/1 pass
- Add ## Nyquist Record (1 row) to 06-VALIDATION.md
- PKG-04 row cites TestIntunewinIconInclusion (2 tests) + commits 2723cc8/6310be5
- Supporting transitive evidence: Phase 10 RTVAL-01 artifact-backed PASS (same build_intunewin path)
- Manual-Only residue: icon-tile visual check deferred to Phase 11 rollout polish
- Frontmatter nyquist_compliant true, nyquist_audited 2026-04-13, nyquist_auditor set
- Sign-Off checkboxes ticked
2026-04-13 16:14:09 +02:00
kawa 885b0ea8a3 docs(08-05): complete Phase 5 Nyquist audit plan
- SUMMARY.md: PKG-02 is only artifact-backed runtime row (RTVAL-01)
- PKG-04 icon-embedding historical gap closed via Phase 6 citation
- Fix commits 74535ea + 7716246 surfaced as audit-trail highlight
- STATE.md + ROADMAP.md advanced to plan 06 (5/8 complete)
2026-04-13 16:12:13 +02:00
kawa cecf9171b0 docs(08-05): add Phase 5 Nyquist Record to 05-VALIDATION.md
- 5 rows (PKG-01..05), all pass
- PKG-02 row cites RTVAL-01 artifact-backed tenant PASS on rubis.fr
  (commits 74535ea + 7716246 flipped initial FAIL to PASS)
- PKG-04 row records Phase 6 icon-embedding gap closure in place
- Frontmatter: nyquist_compliant true, nyquist_audited 2026-04-13
2026-04-13 16:10:08 +02:00
kawa 800fa76a6d docs(08-04): complete Phase 4 Nyquist audit plan
- Add 08-04-SUMMARY.md with 5/5 pass outcome
- Faithfully records Phase 10 RTVAL-02/03/04 attestation-only gap in Notes
- Update STATE.md (advance plan, add decision, record session)
- Update ROADMAP.md Phase 08 progress (4/8 summaries)
2026-04-13 16:07:15 +02:00
kawa 60654afc8e docs(08-04): add Phase 4 Nyquist Record to 04-VALIDATION.md
- 5 rows: one per SCRPT-01..05 success criterion
- All rows pass at template level (pytest-backed)
- SYSTEM-context rows (SCRPT-01/02/03/04/05) cite Phase 10 RTVAL-02/03/04
  with explicit attestation-only caveat per STATE.md 2026-04-13
- Frontmatter: nyquist_compliant true, nyquist_audited 2026-04-13
2026-04-13 16:05:40 +02:00
kawa e9e95e74c5 docs(08-03): complete Phase 3 Nyquist audit plan 2026-04-13 16:03:32 +02:00
kawa 3f03b35bf2 docs(08-03): add Phase 3 Nyquist Record to 03-VALIDATION.md
- 10 rows (one per PRNT-01..10 success criterion), all pass
- Row 3 (PRNT-03 Alpine.js IP->port) closed as pass citing Phase 9 UX-02
  Playwright fixing commits 322fc20 (test) + 37a06da (docs)
- Frontmatter: nyquist_compliant true, nyquist_audited 2026-04-13,
  nyquist_auditor Claude (gsd-executor, plan 08-03)
- Preserves Test Infrastructure, Sampling Rate, Per-Task Verification Map,
  Wave 0, Manual-Only Verifications, Validation Sign-Off verbatim
2026-04-13 16:02:13 +02:00
kawa 0cbc757874 docs(08-02): complete Phase 2 Nyquist audit plan
- 08-02-SUMMARY.md (6/6 pass rows, historical-gap closure pattern)
- STATE.md advanced to plan 3/8; decision logged
- ROADMAP.md Phase 8 progress 2/8 summaries
2026-04-13 16:00:08 +02:00
kawa dff5a9c4a5 docs(08-02): add Phase 2 Nyquist Record (6 rows, all pass)
- Append Nyquist Record table to 02-VALIDATION.md (DRV-01..05 + upload-500 historical gap)
- Flip frontmatter nyquist_compliant=true; add nyquist_audited + nyquist_auditor
- Row 6 records the Phase 8 kickoff POST /drivers/upload 500 as pass via Phase 9 / UX-01 fixing commits (d1de839, 10ee09a, 72c6a98)
- Follows the 08-01 precedent (Phase 1 row 14 closed via Phase 10 RTVAL-01)
2026-04-13 15:58:52 +02:00
kawa 42ec015a16 docs(08-01): complete Phase 1 Nyquist audit plan
- Add 08-01-SUMMARY.md (14/14 pass, NYQ-01 ticked)
- STATE.md advanced to Phase 08 plan 02/8
- ROADMAP.md phase 08 progress updated via gsd-tools
- REQUIREMENTS.md NYQ-01 marked complete
2026-04-13 15:56:42 +02:00
kawa d37a196ee7 docs(08-01): add Phase 1 Nyquist Record to 01-VALIDATION.md
- Append ## Nyquist Record table above Validation Sign-Off
- 14 rows: one observable check per Phase 1 success criterion (derived from v1.0-ROADMAP.md goal + plan outcomes)
- Evidence cites committed tests (test_health, test_static, test_db, test_intunewin), source file:lines, commit SHAs, or 01-VERIFICATION.md rows
- Row 14 closes former 'Upload to real Intune tenant' spike: fail-fix-v1.1 -> resolved PASS citing Phase 10 RTVAL-01 sign-off (2026-04-13)
- Frontmatter: nyquist_compliant true, nyquist_audited 2026-04-13, nyquist_auditor set
- All historical sections preserved verbatim
2026-04-13 15:55:13 +02:00
kawa 7b37bdbb4a docs(phase-08): create Nyquist validation track phase plan (8 plans, sequential) 2026-04-13 15:45:52 +02:00
kawaandClaude Opus 4.6 442b7d680a docs(phase-11): close rollout phase on operator attestation
Technician confirmed real-world rollout: ImpTune ran in its local Docker
container, generated printer packages were delivered end-to-end via BOTH
Intune and NinjaRMM to real endpoints, and all tested installs succeeded
with no blocking items to triage.

Closes RWR-01..04. Attestation-only (mirrors Phase 10 accepted gap) -
no artifact evidence captured.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:50:05 +02:00
kawa 43081c6828 docs(phase-11): create rollout phase plan (deploy, push, feedback triage) 2026-04-13 14:42:20 +02:00
kawa cd2df1e163 docs(10-03): complete report-signoff plan and close Phase 10
- Mark Phase 10 complete in ROADMAP.md (3/3 plans, 2026-04-13)
- Create 10-03-report-signoff-SUMMARY.md with attestation-gap closure note
- Update STATE.md: plan 10-03 complete, Phase 10 closed, next is phase 8 or 11
- REQUIREMENTS.md RTVAL-01..05 ticks already landed in 10-02 completion commit (idempotent)
2026-04-13 14:32:24 +02:00
kawa 5685fd97dc docs(phase-10): human sign-off on RUNTIME-VALIDATION.md (attestation gap acknowledged)
- Status flipped from READY FOR SIGN-OFF to SIGNED OFF
- Signed off by Sébastien QUEROL on 2026-04-13
- All three sign-off checkboxes ticked
- Reviewer explicitly acknowledged attestation-only audit-trail gap for RTVAL-02/03/04
- Only RTVAL-01 is artifact-backed; RTVAL-02/03/04 accepted on technician attestation
2026-04-13 14:30:45 +02:00
kawa d05b87aafa docs(10-03): finalize RUNTIME-VALIDATION.md report body for sign-off
- Status moved from IN PROGRESS to READY FOR SIGN-OFF
- RTVAL-01 evidence converted to markdown relative links (tenant-upload, app-assigned, .intunewin package)
- Sign-off section rewritten to surface attestation-only audit trail damage prominently
- Three sign-off checkboxes restructured to force explicit reviewer acknowledgement of RTVAL-02/03/04 attestation-only nature
- Compensating controls block added (known device, known tenant, single session, known-good generator)
- Duplicate Signed off by header removed from top; consolidated in Sign-off section
2026-04-13 14:27:18 +02:00
kawa 206648c360 docs(10-02): complete live-intune-runtime-validation plan
- SUMMARY.md documents all 4 RTVAL runtime checks recorded on rubis.fr / ARES-5CG5220YTM
- RTVAL-01 artifact-backed PASS (after fixing HMAC scope + Detection.xml defects)
- RTVAL-02/03/04 attestation-only PASSes — three consecutive; user warned twice, approved
- SUMMARY.md flags attestation-only audit-trail damage prominently for wave-3 + phase verifiers
- STATE.md advanced; next plan is 10-03 (sign-off and phase closure)
- ROADMAP.md plan progress updated for phase 10
- REQUIREMENTS.md: RTVAL-01..04 marked complete
2026-04-13 14:25:19 +02:00
kawa 2c912caa60 docs(phase-10): record RTVAL-04 PASS (technician attestation, no artifact)
- Status: PASS (attested, no artifact) — third consecutive attestation-only check
- No uninstall log or portal screenshot captured
- Technician verbally confirmed uninstall under SYSTEM, clean removal from ARES-5CG5220YTM
- RTVAL-02/03/04 together constitute an attestation-only runtime half for Phase 10
- User warned twice and still chose attestation-only; audit trail weakened
- Top-level Status line updated to reflect all four RTVAL checks recorded
2026-04-13 14:22:26 +02:00
kawa b0be3d3449 docs(phase-10): advance STATE.md to Task 4 after RTVAL-03 PASS (attested) 2026-04-13 14:17:18 +02:00
kawa 475d59348f docs(phase-10): record RTVAL-03 PASS (technician attestation, no artifact)
- Status: PASS (attested, no artifact) — second consecutive attestation-only check
- No evidence/rtval-03-detection.png or rtval-03-detect-manual.txt captured
- Technician verbally confirmed Intune 'Installed' on ARES-5CG5220YTM
- User warned about weakened audit trail and chose to proceed anyway
- Plan 10-02 advanced to Task 4 (RTVAL-04 uninstall under SYSTEM)
2026-04-13 14:16:32 +02:00
kawa d86199fefd docs(state): advance plan 10-02 to Task 3 after RTVAL-02 attestation PASS 2026-04-13 14:14:50 +02:00
kawa 870158b113 docs(phase-10): record RTVAL-02 PASS (technician attestation, no artifact)
- Mark RTVAL-02 PASS based on technician verbal attestation
- Flag explicitly as attestation-only: no log excerpt, no screenshot
- Audit trail weakened for this check (documented in Notes)
- User approved proceeding without evidence on 2026-04-13
- Advance report header to 'paused at Task 3 (RTVAL-03)'
2026-04-13 14:13:59 +02:00
kawa bcd12a36c0 docs(10-02): clear BLOCKER-01 and resume plan at Task 2 after RTVAL-01 PASS
- STATE.md: status in-progress, stopped_at Task 2, BLOCKER-01 cleared
- ROADMAP.md: phase 10 plan progress recalculated
2026-04-13 14:11:39 +02:00
kawa cf3b86a696 docs(phase-10): record RTVAL-01 PASS on re-test with fixed .intunewin build
- Flip RTVAL-01 from FAIL to PASS after re-test against live tenant rubis.fr
- Reference evidence screenshots (tenant-upload, app-assigned)
- Fix Package SHA256 (strip trailing garbage) to 8818124aa97ed3da24bf73a1f08f43065e6efea46f44a3abffc9983b097d3ddc
- Update top-level Status to IN PROGRESS; plan 10-02 resumed at Task 2
- Resolve ISSUE-01 (fixed in 74535ea HMAC scope + 7716246 Detection.xml alignment)
- Lock package to ImpTune commit 00b709d
2026-04-13 14:10:43 +02:00
kawaandClaude Sonnet 4.6 00b709d25a docs(debug): resolve phase-10 intunewin parse failure
Two-bug root cause confirmed against live arescom.fr Intune tenant:
(1) Detection.xml structural deviations (commit 7716246)
(2) HMAC scope bug — iv+ciphertext vs ciphertext-only (commit 74535ea)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 13:37:32 +02:00
kawaandClaude Sonnet 4.6 35d4edc623 docs: update debug session — HMAC scope bug identified and fixed
Session now records the second root cause (HMAC over ciphertext-only vs
IV+ciphertext) and the fix applied in commit 74535ea. Status moved back
to awaiting_human_verify for next Intune upload retry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 12:08:59 +02:00
kawaandClaude Sonnet 4.6 74535ea089 fix(intunewin): compute HMAC over IV+ciphertext, not ciphertext alone
The reference implementation (svrooij/ContentPrep Zipper.cs DecryptFileAsync)
reads the first 32 bytes as the stored HMAC, then hashes the *remaining* bytes
— i.e. IV (16 bytes) || ciphertext — to verify integrity. ImpTune was computing
HMAC(mac_key, ciphertext) which omits the IV. Intune's server-side HMAC check
would therefore always fail, manifesting as the same silent symptom as the
Detection.xml bug: empty wizard fields, greyed OK button, no error banner.

The blob layout is unchanged: [HMAC(32)] + [IV(16)] + [ciphertext].
Only the hash input is corrected: iv + ciphertext instead of ciphertext.

The Mac field in Detection.xml is also updated accordingly (it stores the same
HMAC value that is prepended to the blob).

Tests updated: test_hmac_matches now verifies HMAC over blob[32:] (= IV+ciphertext),
which is exactly what the reference decryption algorithm verifies against.

All 114 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 12:08:43 +02:00
kawaandClaude Sonnet 4.6 44a4f2c573 docs: record debug session phase-10-rtval-01-intunewin-parse-fail
Debug session documenting root cause and fix for Intune upload wizard
silent metadata-parse failure. Status: awaiting_human_verify.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:48:49 +02:00
kawaandClaude Sonnet 4.6 77162466d5 fix(intunewin): align Detection.xml with IntuneWinAppUtil.exe reference format
Four structural defects in the generated Detection.xml caused Intune's upload
wizard to silently fail metadata parsing (empty form, OK button greyed):

1. Missing ToolVersion="1.8.6.0" XML attribute on ApplicationInfo — the wizard
   uses this to validate the package was produced by a compatible tool.
2. Spurious xmlns="http://schemas.microsoft.com/IntuneWin" namespace — changes
   element identity for Intune's XML parser (reference emits no namespace).
3. <?xml version="1.0" ?> declaration header — reference uses OmitXmlDeclaration=true.
4. Extra <MacAlgorithm> child element inside EncryptionInfo — not present in
   the reference FileEncryptionInfo model (svrooij/ContentPrep verified).

Fix: switched from toprettyxml() to tostring(xml_declaration=False)+indent(),
added ToolVersion attribute, removed xmlns and MacAlgorithm.
Tests updated to assert the corrected reference format; all 114 pass.

Root cause verified against svrooij/ContentPrep Packager.cs + ApplicationInfo.cs
(open-source C# reference implementation of IntuneWinAppUtil.exe).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:48:36 +02:00
kawa 46cfde00e0 chore(10-02): update STATE.md — plan blocked at RTVAL-01 FAIL
- Status set to BLOCKED with .intunewin structure defect as blocker
- BLOCKER-01 raised: Detection.xml missing/malformed in generated package
- Decision recorded: stop plan 10-02, gap-closure via /gsd:debug or /gsd:plan-phase 10 --gaps
- Session continuity updated to reflect RTVAL-01 FAIL stop point
2026-04-13 11:39:31 +02:00
kawa 403a0a5e69 fix(10-02): record RTVAL-01 fail — Intune cannot parse generated .intunewin
- RTVAL-01 status set to FAIL: Win32 app wizard fields stayed empty, OK greyed out
- Verbatim technician symptom quoted verbatim in report
- Interpretation: Detection.xml / package metadata malformed or missing in .intunewin archive
- RTVAL-02, RTVAL-03, RTVAL-04 marked BLOCKED (all depend on RTVAL-01 PASS)
- ISSUE-01 raised in Issues Found with root cause hypothesis and resolution path
- Plan 10-02 stopped; gap-closure cycle required before retesting
2026-04-13 11:38:53 +02:00
kawa 93a4e30bd4 docs(10-01): complete preflight-package-and-scaffold plan
- Add 10-01-preflight-package-and-scaffold-SUMMARY.md
- Update STATE.md: position moved to Phase 10 plan 01 complete
- Update ROADMAP.md: Phase 10 shows 1/3 summaries (In Progress)
- Mark RTVAL-05 complete in REQUIREMENTS.md
2026-04-13 11:33:23 +02:00
kawa 88cf53d660 chore(10-01): record technician metadata and drop .intunewin evidence
- RUNTIME-VALIDATION.md: populate all Tenant & Environment rows
  (tenant domain, device hostname, OS build 26200.7171, driver vendor,
  commit SHA, package filename, SHA256, generated-at date)
- Set Started date to 2026-04-13
- Add Copieur_2eme.intunewin to evidence/ (Ricoh PCL6 Universal Print)
2026-04-13 11:32:05 +02:00
kawa 1c3f458583 feat(10-01): scaffold RUNTIME-VALIDATION.md and evidence folder
- Create RUNTIME-VALIDATION.md with Tenant & Environment metadata table
- Add RTVAL-01 through RTVAL-04 sections with PENDING status
- Add Issues Found and Sign-off checklist sections
- Create evidence/.gitkeep so git tracks the evidence directory
2026-04-13 11:24:11 +02:00
kawa de24e1d18e docs(phase-10): finalize Phase 10 plan list in ROADMAP 2026-04-13 11:20:35 +02:00
kawa 5e2210ecc0 docs(phase-10): create runtime validation phase plan 2026-04-13 11:20:04 +02:00
kawaandClaude Opus 4.6 973b0c7807 docs(phase-09): complete phase execution
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:12:05 +02:00
kawaandClaude Opus 4.6 27ddc77ee1 fix(inf-parser): tolerate bare-line sections in real vendor INFs
Real INFs (e.g. Ricoh oemsetup.inf) include [SourceDisksFiles] entries
with bare filename lines (no '='), which strict configparser rejects
with ParsingError, surfacing as a 500 on /drivers/upload.

Pre-process the INF text to rewrite bare lines into synthetic
__bare_N = <line> entries before parsing, and filter those synthetic
keys out of DriverDesc extraction so they cannot leak into driver_names.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:11:45 +02:00
kawa 37a06dac89 docs(09-02): complete playwright-port-autofill plan
- Create 09-02-SUMMARY.md with Playwright e2e evidence for UX-02
- Update STATE.md: decisions, session continuity, progress bar
- Update ROADMAP.md: phase 9 marked complete (3/3 plans with summaries)
- Update REQUIREMENTS.md: UX-02 marked complete
2026-04-13 10:58:51 +02:00
kawa 322fc2050f test(09-02): add Playwright UX-02 port autofill test
- Create tests/e2e/test_port_autofill.py - headless chromium test for PRNT-03
- Verifies IP->port_name auto-derivation via Alpine @input handler at /printers
- Update 09-VALIDATION.md: mark UX-02 tasks green, cite test file as evidence
2026-04-13 10:57:07 +02:00
kawa 4e9bd9b1ab chore(09-02): add Playwright dev deps and e2e package scaffolding
- Add pytest-playwright and playwright to requirements-dev.txt
- Create tests/e2e/__init__.py package marker
- Create tests/e2e/conftest.py with session-scoped live_server fixture
2026-04-13 10:55:49 +02:00
kawa 9902e2a5b8 docs(09-01): complete driver-upload-fix-and-inline-oob plan
- Create 09-01-SUMMARY.md: documents OOB swap fix, file changes, TDD outcomes
- Update STATE.md: advance session, add decisions, update progress (94%)
- Update ROADMAP.md: phase 9 in progress (2/3 summaries)
- Update REQUIREMENTS.md: mark UX-01 complete
2026-04-13 10:53:13 +02:00
kawa 72c6a98578 feat(09-01): add inline driver upload to printer form with OOB refresh
- Add id="printer-form-driver-select" to driver <select> (OOB swap target)
- Add sibling <form hx-post="/drivers/upload"> AFTER printer </form>,
  inside Alpine x-data div — avoids invalid nested form HTML
- Hidden <input name="caller" value="printer_form"> sentinel triggers OOB path
- Add hidden <div id="driver-list"> anchor for HTMX outerHTML swap target
- Create tests/test_printer_form.py with test_printer_form_has_inline_driver_upload
  asserting stable select id, caller sentinel, and non-nested upload form

Full non-e2e suite: 112 passed.
2026-04-13 10:51:46 +02:00
kawa 10ee09a5aa fix(09-01): resolve driver upload 500 and add HTMX OOB refresh path
- Import Form from fastapi for mixed multipart + form field support
- Add caller: str = Form('') parameter to upload_driver handler
- Capture new_driver from Driver.get_or_create() return tuple
- Branch on caller == 'printer_form' to emit OOB-enabled response
- Create partials/driver_upload_with_oob.html with primary driver_list
  include + hx-swap-oob select targeting id=printer-form-driver-select
- New driver is auto-selected via new_driver_id context variable

All 13 driver upload tests pass including 4 new OOB contract tests.
Full non-e2e suite: 111 passed.
2026-04-13 10:50:27 +02:00
kawa c6fe284e28 docs(09-03): complete script-download-links plan
- Add 09-03-SUMMARY.md documenting .ps1 routes + detail-page links
- Update STATE.md with decisions and session info
- Update ROADMAP.md phase 9 progress (1/3 summaries)
- Mark UX-03 complete in REQUIREMENTS.md
2026-04-13 10:49:47 +02:00
kawa d1de8395a3 test(09-01): add failing driver upload 500 regression + OOB contract tests
- Add _make_driver_zip_with_cat() helper for .inf + .cat fixture ZIPs
- Add _make_bom_driver_zip() helper for UTF-16 LE BOM encoded INF edge case
- Add test_upload_500_regression (parametrized: plain UTF-8 + BOM variant)
- Add test_upload_returns_oob_when_called_from_form (RED: handler lacks caller param)
- Add test_upload_oob_autoselects_new_driver (RED: no OOB fragment emitted)
- Add test_upload_no_oob_from_standalone_drivers_page

OOB tests fail: handler returns driver_list.html always regardless of caller field.
500 regression tests pass: existing synthetic ZIPs work fine against current handler.
2026-04-13 10:49:34 +02:00
kawa 68a2935af2 feat(09-03): add .ps1 script download routes and detail-page links
- Refactor install/uninstall/detect handlers into shared _*_response() helpers
- Add .ps1 route aliases: /scripts/install.ps1, /scripts/uninstall.ps1, /scripts/detect.ps1
- Add Scripts section to printer_detail.html inside {% if has_driver %} with 3 download links
- All 6 new tests green, full suite 106/106 passing
2026-04-13 10:48:43 +02:00
kawa d3590017e9 test(09-03): add failing .ps1 route and detail-page link tests
- Create tests/test_script_download.py with 5 tests for .ps1 routes (install/uninstall/detect, 404, 422)
- Add test_detail_page_shows_script_links to TestCommandPreview in tests/test_packages.py
- All 6 new tests go RED (routes and template links do not exist yet)
2026-04-13 10:47:09 +02:00
kawa 71c808601c docs(09): create phase plan for UX tech debt closure
Three plans covering UX-01 (driver upload 500 fix + inline HTMX OOB
refresh on printer form), UX-02 (Playwright headless test for PRNT-03
IP->port auto-fill), and UX-03 (.ps1 script download routes + detail
page links). VALIDATION.md finalized with real task IDs and
nyquist_compliant=true. ROADMAP Phase 9 plan list filled in.
2026-04-13 10:29:43 +02:00
kawa 84a350f233 'docs(09):_add_research_validation_strategy' 2026-04-13 10:23:47 +02:00
kawaandClaude Sonnet 4.6 73ea2d7fed docs(09): research phase UX tech debt closure
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 10:22:32 +02:00
kawa 5476160417 docs(09): capture phase context 2026-04-13 10:16:54 +02:00
kawa 57dc82876e docs(08): note driver upload 500 as pre-surfaced Nyquist gap 2026-04-13 10:04:48 +02:00
kawa e5ea4db911 docs(08): capture phase context 2026-04-13 10:02:10 +02:00
kawa d2f66d4b43 docs: create milestone v1.1 roadmap (4 phases) 2026-04-13 09:58:23 +02:00
kawa 30707f9cce docs: define milestone v1.1 requirements 2026-04-13 09:55:31 +02:00
kawa c9a7f70338 docs: start milestone v1.1 hardening and validation 2026-04-13 09:53:04 +02:00
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
kawa 63c935e860 docs(phase-07): complete phase execution 2026-04-13 09:01:45 +02:00
kawa 14293a8443 docs(07-01): complete dashboard and navigation polish plan
- SUMMARY.md documents /packages route, dashboard live queries, 99 tests green
- STATE.md advanced to 7/7 phases complete (100%)
- ROADMAP.md marks Phase 7 and plan 07-01 complete
2026-04-13 09:00:01 +02:00
kawa 91910ad97d feat(07-01): wire dashboard data and add /packages listing page
- Dashboard queries 5 most recent Printer records and 5 most recent driver-assigned ones
- New /packages route lists printers with drivers, with intunewin/ninja download links
- packages.html template extends base.html with Pico grid table
- Dashboard printer/package items now link to detail pages
- Quick action buttons wired to real routes (removed aria-disabled)
2026-04-13 08:58:13 +02:00
kawa 8cf47f5c89 test(07-01): add failing tests for /packages route and dashboard data
- test_packages_returns_200 asserts /packages returns 200
- test_dashboard_shows_recent_printers verifies recent printers rendered
- test_dashboard_shows_recent_packages verifies only driver-assigned printers shown
2026-04-13 08:57:20 +02:00
kawaandClaude Opus 4.6 c402bff54a docs(07): create phase plan for dashboard and navigation polish
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 17:05:37 +02:00
kawa 56578c8e9f docs(phase-07): add validation strategy 2026-04-10 17:03:46 +02:00
kawa 3e3d4860aa docs(phase-07): research dashboard and navigation polish phase 2026-04-10 17:02:49 +02:00
kawaandClaude Opus 4.6 9ba8743144 docs(phase-06): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 16:24:21 +02:00
kawa 906f3ca101 docs(06-01): complete wire-icon-intunewin plan
- SUMMARY.md: icon lookup + copy into .intunewin staging
- STATE.md: advanced to 06-01 complete, 100% progress, PKG-04 decision recorded
- ROADMAP.md: phase 06 marked Complete (1/1 plans)
- REQUIREMENTS.md: PKG-04 marked complete
2026-04-10 16:22:22 +02:00
kawa 6310be5e76 feat(06-01): wire icon into .intunewin staging before build
- Add shutil import and Icon import to packages.py
- After driver extraction, look up Icon record for printer
- If found and file exists on disk, copy to tmpdir/icon.png
- Missing icon (no DB record or missing file) silently skipped — export still succeeds
- PKG-04 requirement satisfied
2026-04-10 16:21:34 +02:00
kawa 2723cc8974 test(06-01): add failing test for icon inclusion in .intunewin export
- test_intunewin_includes_icon: uploads PNG icon, asserts icon.png in staged files
- test_intunewin_without_icon_succeeds: baseline no-icon export passes (already green)
2026-04-10 16:21:04 +02:00
kawaandClaude Opus 4.6 9f3d35b72f docs(06): create phase plan for wiring icon into intunewin export
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:41:05 +02:00
kawa 9912378563 docs(06): add research and validation strategy 2026-04-10 15:39:22 +02:00
kawaandClaude Sonnet 4.6 ba106eecbe docs(06): research phase — wire icon into .intunewin export
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 15:38:22 +02:00
kawaandClaude Opus 4.6 a6d8e15210 docs(roadmap): add gap closure phases 6-7
Phase 6 wires icon into .intunewin export (closes PKG-04).
Phase 7 fixes dashboard empty state and /packages 404 nav link.
PKG-04 reset to Pending in REQUIREMENTS.md traceability table.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:32:52 +02:00
kawaandClaude Opus 4.6 624b3f0090 docs(phase-05): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:11:11 +02:00
kawa fba03b5241 docs(05-02): complete icon upload and export UI plan
- Create 05-02-SUMMARY.md with full execution details
- Update STATE.md progress to 100%, add 4 key decisions, record metrics
- Update ROADMAP.md phase 5 status to Complete
- Mark requirements PKG-04 and PKG-05 complete
2026-04-10 15:08:02 +02:00
kawa f96ea6fec9 feat(05-02): printer detail page with export buttons and command preview
- Update printer_detail() to pass install_cmd, uninstall_cmd, has_driver, has_icon to template
- Rewrite printer_detail.html with Intune Commands, Export, and Icon sections
- Show command strings with Alpine.js copy-to-clipboard buttons (install-cmd, uninstall-cmd)
- Show NinjaRMM ZIP and .intunewin download links when driver assigned
- Add HTMX icon upload form with #icon-status swap target
- Remove disabled placeholder Regenerate Package button
- Add TestCommandPreview class (4 tests) to test_packages.py
- All 94 tests pass
2026-04-10 15:06:45 +02:00
kawa f9e13ba96f feat(05-02): icon upload endpoint with validation
- Create imptune/api/icons.py with POST /printers/{printer_id}/icon
- Validate PNG format, 256x256 dimensions, 750KB max size
- Store icons SHA256-addressed under cfg.DATA_DIR/icons/
- Replace existing Icon record on re-upload
- Register icons.router in main.py with ICONS_DIR makedirs
- Patch cfg.ICONS_DIR in conftest.py for tests
- All 6 icon upload tests pass
2026-04-10 15:05:36 +02:00
kawa dd6cedfed9 feat(05-01): implement NinjaRMM ZIP and intunewin package export endpoints
- GET /printers/{id}/packages/ninja: in-memory ZIP with install.ps1 + driver files in named subfolder
- GET /printers/{id}/packages/intunewin: temp dir build of .intunewin via build_intunewin()
- _get_printer_and_driver() helper validates printer, driver, inf, desc
- Driver ZIP file existence check before processing (RESEARCH pitfall 3)
- TemporaryDirectory context manager for auto-cleanup (RESEARCH pitfall 1)
- Router registered in main.py after scripts router
- All 9 package tests pass, 84 total tests green
2026-04-10 15:05:29 +02:00
kawa d8ce223b38 test(05-02): add failing tests for icon upload endpoint
- Add test_icon_upload.py with 6 TDD RED tests for PKG-04
- Add Pillow>=10.0 to requirements.txt
- Add ICONS_DIR to imptune/config.py
2026-04-10 15:04:38 +02:00
kawa a31c71e11f test(05-01): add failing tests for NinjaRMM ZIP and intunewin package export endpoints
- TestNinjaDownload: 5 tests covering ZIP response, install.ps1, driver files, 404, 422
- TestIntunewinDownload: 4 tests covering .intunewin response, structure, 404, 422
- Fixtures: driver_zip_bytes, setup_printer_with_driver, printer_no_driver
2026-04-10 15:04:11 +02:00
kawaandClaude Opus 4.6 f2d12e53d9 docs(05): create phase 5 package export plans
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 13:53:31 +02:00
kawaandClaude Opus 4.6 cf7adecb06 docs(phase-5): add research and validation strategy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 13:48:18 +02:00
kawaandClaude Sonnet 4.6 ec6c150585 docs(phase-05): research package export domain
Cover .intunewin assembly (wiring Phase 1 spike), NinjaRMM ZIP builder,
icon upload/validation, and Alpine.js clipboard preview patterns.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 13:47:12 +02:00
kawaandClaude Opus 4.6 55dc7f5e09 docs(phase-04): complete phase execution and verification
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 13:40:54 +02:00
kawa ed0f0a0607 docs(04-02): complete uninstall+detect templates and script API endpoints plan
- 04-02-SUMMARY.md: TDD execution, 3 commits, 6 files, 75 tests green
- STATE.md: advanced to 04-02 complete, added 3 new decisions
- ROADMAP.md: phase 4 marked complete (2/2 plans done)
- REQUIREMENTS.md: SCRPT-02 and SCRPT-03 marked complete
2026-04-10 13:37:53 +02:00
kawa b7b0d1b4a5 feat(04-02): add script download API endpoints and router registration
- imptune/api/scripts.py: GET /printers/{id}/scripts/{install,uninstall,detect}
- 404 for missing printer, 422 for missing driver/INF/driver_desc
- Content-Disposition attachment header on all responses
- imptune/main.py: register scripts.router
- 5 integration tests covering all endpoint cases (200/404/422)
2026-04-10 13:36:07 +02:00