- 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
102 lines
7.0 KiB
Markdown
102 lines
7.0 KiB
Markdown
---
|
|
phase: 6
|
|
slug: wire-icon-intunewin
|
|
status: draft
|
|
nyquist_compliant: true
|
|
wave_0_complete: false
|
|
created: 2026-04-10
|
|
nyquist_audited: 2026-04-13
|
|
nyquist_auditor: Claude (gsd-executor, plan 08-06)
|
|
---
|
|
|
|
# Phase 6 — Validation Strategy
|
|
|
|
> Per-phase validation contract for feedback sampling during execution.
|
|
|
|
---
|
|
|
|
## Test Infrastructure
|
|
|
|
| Property | Value |
|
|
|----------|-------|
|
|
| **Framework** | pytest |
|
|
| **Config file** | none — runs via `python -m pytest` |
|
|
| **Quick run command** | `python -m pytest tests/test_packages.py -x -q` |
|
|
| **Full suite command** | `python -m pytest tests/ -q` |
|
|
| **Estimated runtime** | ~5 seconds |
|
|
|
|
---
|
|
|
|
## Sampling Rate
|
|
|
|
- **After every task commit:** Run `python -m pytest tests/test_packages.py -x -q`
|
|
- **After every plan wave:** Run `python -m pytest tests/ -q`
|
|
- **Before `/gsd:verify-work`:** Full suite must be green
|
|
- **Max feedback latency:** 5 seconds
|
|
|
|
---
|
|
|
|
## Per-Task Verification Map
|
|
|
|
| Task ID | Plan | Wave | Requirement | Test Type | Automated Command | File Exists | Status |
|
|
|---------|------|------|-------------|-----------|-------------------|-------------|--------|
|
|
| 06-01-01 | 01 | 1 | PKG-04 | integration | `python -m pytest tests/test_packages.py::test_intunewin_includes_icon -x -q` | ❌ W0 | ⬜ pending |
|
|
| 06-01-02 | 01 | 1 | PKG-04 | integration | `python -m pytest tests/test_packages.py::test_intunewin_without_icon_succeeds -x -q` | ❌ W0 | ⬜ pending |
|
|
|
|
*Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky*
|
|
|
|
---
|
|
|
|
## Wave 0 Requirements
|
|
|
|
- [ ] `tests/test_packages.py` — add `test_intunewin_includes_icon` (monkeypatch `build_intunewin` to capture staging dir contents)
|
|
- [ ] `tests/test_packages.py` — add `test_intunewin_without_icon_succeeds` (baseline: export without icon)
|
|
|
|
*Existing test infrastructure covers the rest — no new files or fixtures needed.*
|
|
|
|
---
|
|
|
|
## Manual-Only Verifications
|
|
|
|
*All phase behaviors have automated verification.*
|
|
|
|
---
|
|
|
|
## Nyquist Record
|
|
|
|
> Audited 2026-04-13 by Claude (gsd-executor, plan 08-06). Phase 6 is a **gap-closure phase** with a single success criterion (PKG-04 icon embedding) spawned after the first v1.0 milestone audit flagged that Phase 5 had shipped icon upload+storage but never wired the icon into `.intunewin` output. One row per Phase 6 success criterion, derived from `milestones/v1.0-ROADMAP.md` Phase 6 goal block + `REQUIREMENTS.md` PKG-04, cross-checked against `06-VERIFICATION.md` (2/2 truths VERIFIED 2026-04-10) and `06-01-SUMMARY.md`. Evidence cites committed pytest invocations, source lines, commit SHAs, and — as supporting transitive evidence — Phase 10 `RUNTIME-VALIDATION.md` RTVAL-01 (artifact-backed tenant acceptance of the exact `.intunewin` builder path on tenant rubis.fr, 2026-04-13).
|
|
>
|
|
> **Phase 6 goal (v1.0-ROADMAP.md):** *"Uploaded PNG icon is embedded in the .intunewin package so Intune displays it as the app icon."*
|
|
>
|
|
> **Single-criterion phase:** Unlike Phases 1-5 which enumerate multiple requirements, Phase 6 has exactly one requirement (PKG-04) and one plan (06-01). The Nyquist Record therefore contains exactly one row. This mirrors the plan 08-05 row-4 (PKG-04) closure citation in reverse direction: 05-VALIDATION.md rows 4 cites **this** phase's test as its closure evidence; this phase's row cites the same test as its canonical evidence.
|
|
>
|
|
> **RTVAL-01 transitive coverage:** RTVAL-01 PASS on tenant rubis.fr (screenshots `rtval-01-tenant-upload.png` + `rtval-01-app-assigned.png`, committed package `Copieur_2eme.intunewin`) exercised the exact same `build_intunewin()` staging path that Phase 6's `shutil.copy2(...'icon.png')` feeds into. The test package was built with the icon-wiring code live, so Intune's successful ingestion of the package is transitive evidence that the icon staging does not corrupt the `.intunewin` output. The PKG-04 row notes this as supporting — not primary — evidence because RTVAL-01's observable check was "tenant accepts package", not "icon appears on Intune app tile" (the latter remains a Manual-Only polish item owned by Phase 11 rollout).
|
|
|
|
| # | Criterion | Observable Check | Evidence | Status | Notes |
|
|
|---|-----------|-----------------|----------|--------|-------|
|
|
| 1 | **PKG-04:** Uploaded PNG icon is embedded in `.intunewin` output so Intune displays it as the app icon | `python -m pytest tests/test_packages.py::TestIntunewinIconInclusion -x -q` (2 tests: `test_intunewin_includes_icon` asserts `icon.png` appears in staged files via monkeypatched `build_intunewin`; `test_intunewin_without_icon_succeeds` asserts baseline export returns 200 when no icon uploaded) | Tests: `tests/test_packages.py::TestIntunewinIconInclusion::test_intunewin_includes_icon` (lines 200-231) + `::test_intunewin_without_icon_succeeds` (lines 233-245). Source: `imptune/api/packages.py` line 149 (`Icon.get_or_none(Icon.printer == printer.id)`), line 151 (`cfg.ICONS_DIR`), line 153 (`shutil.copy2` as `icon.png`), line 157 (`build_intunewin` call — staging BEFORE build confirmed). Imports: `Icon` from `imptune.db.models` (line 13), `cfg` (line 13). Commits: `2723cc8` (06-01 TDD RED — failing test) + `6310be5` (06-01 TDD GREEN — 4-line icon staging block). 06-VERIFICATION.md (2026-04-10): 2/2 truths VERIFIED, key links WIRED, PKG-04 SATISFIED, no anti-patterns, full suite 96/96 green. Supporting: Phase 10 `RUNTIME-VALIDATION.md` RTVAL-01 PASS on tenant rubis.fr (2026-04-13) — same `build_intunewin` path with icon-wiring code live, package `Copieur_2eme.intunewin` accepted by tenant after fix commits `74535ea` + `7716246`. | pass | Silent-skip pattern: missing `Icon` DB record or missing disk file both skip the copy; export always succeeds (decision in 06-01-SUMMARY.md). Icon staged as constant filename `icon.png` regardless of original filename. **Manual-Only polish item:** Visual confirmation that the icon actually appears on the Intune app tile in the portal is NOT covered by this row — RTVAL-01 proved ingestion, not icon-tile rendering. This cosmetic check is Manual-Only and owned by Phase 11 rollout visual polish (same as 05-VALIDATION.md row 4 notes). Audit trail for the embedding mechanism itself is strong (pytest + source review + TDD commits + transitive real-tenant ingestion). |
|
|
|
|
### Audit Outcome
|
|
|
|
| Status | Count |
|
|
|---------------|-------|
|
|
| pass | 1 |
|
|
| fail-fix-v1.1 | 0 |
|
|
| deferred-v1.2 | 0 |
|
|
| wont-do | 0 |
|
|
|
|
Phase 6 is Nyquist-compliant. The single gap-closure criterion is satisfied with strong test-level evidence plus transitive artifact-backed runtime coverage via RTVAL-01. The only residual item is the cosmetic "does the icon actually show on the Intune app tile" visual check, which is Manual-Only and correctly deferred to Phase 11 rollout.
|
|
|
|
---
|
|
|
|
## Validation Sign-Off
|
|
|
|
- [x] All tasks have `<automated>` verify or Wave 0 dependencies
|
|
- [x] Sampling continuity: no 3 consecutive tasks without automated verify
|
|
- [x] Wave 0 covers all MISSING references
|
|
- [x] No watch-mode flags
|
|
- [x] Feedback latency < 5s
|
|
- [x] `nyquist_compliant: true` set in frontmatter
|
|
|
|
**Approval:** Nyquist-audited 2026-04-13 by Claude (gsd-executor, plan 08-06) — 1/1 pass
|