psadt-deploy-skill 0.31.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +43 -30
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -52,7 +52,7 @@ Twelve phases, each owned by a script rather than by prose, so a step either pas
52
52
  | Phase | What happens | Owner |
53
53
  |---|---|---|
54
54
  | **0** Setup | 13 prerequisite checks, GREEN/YELLOW/RED, `-Fix` provisions | `Initialize-PsadtSkill.ps1` |
55
- | **1–2** Intake + research | blocker questions as clickable options; parallel research of version, silent switches, Intune pitfalls | agent (gates 1–2) |
55
+ | **1–2** Intake + research | blocker questions as clickable options; a local-evidence ladder (installed here? binary here? already written down?) answers what it can, and a research agent is dispatched only per question it leaves open | agent (gates 1–2) |
56
56
  | **3** Scaffold | a generator writes launcher + detection + per-run log name + manifest; `New-ADTTemplate` only when none fits | `New-MsiPackage` · `New-BrowserExtensionPackage` · `New-WindowsFeaturePackage` · `New-DriverPackage` |
57
57
  | **4** Customize | all three hooks filled from the research, helpers in the Extensions module | agent |
58
58
  | **5** Pre-flight | 10 checks (encoding, AST parse, v3 cmdlets, structure, detection contract, manifest, log name, driver trust …) → GREEN/RED | `Invoke-PsadtPreflight.ps1` |
@@ -196,7 +196,7 @@ The app's **native installer is always the default**. Everything else is opt-in
196
196
  matrix and the manual portal route: `references/app-registration.md`.
197
197
  - For **Pester tests**: Pester 5+ (`Install-Module Pester -MinimumVersion 5.0 -Scope CurrentUser`)
198
198
  - **Optional (recommended): the [superpowers](https://github.com/obra/superpowers) plugin** — if installed,
199
- the research fan-out and the reviewer gate use it. Not required: without it the skill falls back to the
199
+ the gated research fan-out and the reviewer gate use it. Not required: without it the skill falls back to the
200
200
  native Agent tool and `/code-review`, and nothing in the workflow depends on the plugin.
201
201
 
202
202
  ## Installation
@@ -434,31 +434,44 @@ The two most recent releases are below. **[CHANGELOG.md](CHANGELOG.md)** carries
434
434
  every release since 0.1.0, and nothing is ever removed from it - this section is a window onto it, not a
435
435
  second copy to keep in sync.
436
436
 
437
- ### 0.31.0 - 2026-09-14
438
- - **Added: the guest window shows every phase of the run at once.** Until now it showed one line, the step
439
- running right now, so a run three phases in looked like one stuck on its first and a failed phase left
440
- nothing to read. It is a WPF master/detail window now: tick, cross or live marker per phase, and for the
441
- selected one its exit code, duration, start and end, timeout, detection result and its own transcript.
442
- Still a separate process polling a file, still passive - it never drives the run and closing it stops
443
- nothing.
444
- - **Added: `progress.json` carries a `phases[]` plan derived from `-Scenarios`.** The hardcoded `total = 14`
445
- it published before was wrong for every partial run, and wrong for the full gate too, which has 15 steps.
446
- The older top-level fields are unchanged.
447
- - **Measured in the guest before the port, not after:** WPF loads there under Windows PowerShell 5.1,
448
- the real XAML parses, and the window paints at render tier 0 with no vGPU - a PNG of it came back out of
449
- the VM as the proof. New guards in `tests/SandboxProgressUi.Tests.ps1` cover ASCII, parsing, XAML loading
450
- and the phase plan. Suite 554 -> 569.
451
-
452
- ### 0.30.2 - 2026-09-14
453
- - **Changed: a vendor-specific success code has to be in BOTH lists.** A sandbox step is judged twice, by
454
- two independent lists that share a parameter name: PSADT's `-SuccessExitCodes` in the launcher decides
455
- whether the deployment throws, `Invoke-PsadtSandboxTest.ps1 -SuccessExitCodes` decides whether the step
456
- is painted green. Citrix Workspace Repair returns the documented success code 40032; it went into the
457
- launcher, the run still came back RED, and three further runs were spent re-editing a launcher that had
458
- been correct all along. Guide 6.1, Appendix B and Appendix G now say so, and a drift guard keeps the
459
- documented default equal to the actual one.
460
- - **Changed: four silent PowerShell traps** added to Appendix B, each of which cost a run here: `@(...)`
461
- around an EMPTY `Generic.List` throws in 5.1 and 7 alike; `-WindowStyle Hidden` is inherited by the
462
- child's first window, so a progress GUI runs windowless and looks like a hang; two variables differing
463
- only in case are the same variable; `-like` against a literal containing `*` matches too much.
464
- - All 12 applications packaged with 0.30.x are GREEN, Citrix Workspace included. Suite 552 -> 554.
437
+ ### 0.34.0 - 2026-09-16
438
+ - **Added: `-TrustedPublisherCert` on `Invoke-PsadtSandboxTest.ps1`.** An installer that stages a
439
+ third-party driver raises the Windows "install device software?" prompt unless the signer is already in
440
+ `TrustedPublisher` - and in the guest that prompt is **invisible**, because every action runs as SYSTEM
441
+ through a scheduled task and draws nothing on the desktop. The installer waits for an answer nobody can
442
+ give and the phase burns its whole timeout, looking exactly like a slow installer. Pass the `.cer` and
443
+ the harness imports it during GuestPrepare, the same thing an Intune `RootCATrustedCertificates` profile
444
+ does on the fleet. Measured on Time-Access 3010 / EDIsecure: **25 minutes of timeout versus 43 seconds**.
445
+ The import uses `certutil` (`Import-Certificate` returns `E_ACCESSDENIED` in the guest even when
446
+ elevated) and is **verified by reading the store back** - a failed import is indistinguishable from a
447
+ successful one when only the return value is logged, and that cost a full run.
448
+ - **Fixed: the elapsed timer in the guest window stopped counting.** It rendered `progress.json` verbatim,
449
+ but `Update-Ui` returns early when that file has not changed - right for the phase list, fatal for a
450
+ clock, and phases that are not an action wait loop never rewrite the file at all (GuestPrepare alone can
451
+ sit there for 90 seconds). The one element whose job is to prove the run is alive was frozen exactly
452
+ when that gets asked. It now ticks on the window's own 1s timer and re-syncs on every file value.
453
+ - **Fixed: the heartbeat was up to 20 seconds stale** - the guest wrote every 10s and the host read every
454
+ 10s, and the two stacked. Both are 1s now; the console line and transcript keep the coarser beat so
455
+ phase boundaries stay legible.
456
+ - Phase 6.1 now documents cancelling with `STOP.txt` (killing the process orphans `vmmemWindowsSandbox`
457
+ and blocks every further run) and scoping with `-Scenarios` while iterating. Suite 624, unchanged by this release - the new behaviour is guarded by the existing sandbox-harness and progress-UI tests.
458
+ ### 0.33.0 - 2026-09-16
459
+ - **Fixed: the Phase 2 research fan-out is gated.** `SKILL.md` ordered it in the imperative - *"Dispatch
460
+ the three Researcher roles concurrently"* - one line above the two probe sentences, and rule 1 routed
461
+ every unknown into it because asking is forbidden. Three agents ran whether or not anyone needed them;
462
+ on an app already installed on the packaging machine, one such run cost 400k tokens to rediscover a
463
+ `QuietUninstallString` the Uninstall registry had been holding all along.
464
+ - **Added: `scripts/Get-PsadtLocalEvidence.ps1`**, the ladder that decides whether an agent is warranted.
465
+ Four rungs, deterministic and offline: the installed PSADT module's manifest (retiring the
466
+ version/command-drift research topic outright), the Uninstall registry, the existing MSI and
467
+ switch-candidate probes composed rather than reimplemented, and this skill's own corpus plus a vendor
468
+ doc URL it **names but never fetches**. It reports `OpenQuestions[]` and `AgentBudget`, and that number
469
+ is the dispatch cap: zero open questions, zero sub-agents.
470
+ - **Capped by family, so the cap is structural.** Questions one vendor deployment page answers fold into
471
+ a single agent. Three families can ever dispatch, so the budget cannot exceed three however the
472
+ question set grows - measured at **2 for an MSI or an app installed locally, 3 at worst**.
473
+ - **Honest about its limits.** The external runtime prerequisite and known Intune pitfalls are marked
474
+ `CanCloseLocally = $false` - a statement about other people's fleets does not follow from this machine -
475
+ so the realistic floor is two agents, not zero. Everything open but not worth an agent lands in
476
+ `Deferred[]` with a reason, and `repair-strategy` is now a first-class question because
477
+ `rule:all-three-deployment-types` makes Repair a deliverable.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psadt-deploy-skill",
3
- "version": "0.31.0",
3
+ "version": "0.34.0",
4
4
  "description": "Installer for the psadt-deploy Claude Code skill: build, test and deploy PSADT v4.x Intune Win32 packages.",
5
5
  "keywords": [
6
6
  "psadt",