psadt-deploy-skill 0.32.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 -34
  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,35 +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.32.0 - 2026-09-15
438
- - **Fixed: the dossier now reads the sandbox verdict instead of asking for it.** `New-PsadtReport.ps1`
439
- took identity, artefacts and return codes from the manifest but not the test result, so without a
440
- hand-built `-Metadata SystemTest` it printed "the SYSTEM test was not run (no evidence)" on packages
441
- whose gate was GREEN. It reads `results.sandboxTest.resultPath` now and **judges** the rows: an action
442
- that exits 0 while the detection rule disagrees is a fail, not a pass - that combination is the
443
- signature of a per-user install. A caller-supplied `SystemTest` still wins, and an unreadable
444
- result.json keeps the honest "not run" default.
445
- - **Fixed: the guest progress window hung off the right edge** of the sandbox desktop, taking the TIMEOUT
446
- and DETECTION columns with it. Sized against the work area and positioned explicitly now; verified in
447
- the guest.
448
- - **Changed: a fourth BINDING trap in App. L.7** - re-running the installer over an existing install is
449
- not a safe repair. Measured on JetBrains PyCharm 2026.2.2 as SYSTEM: `/S` over an existing install of
450
- the same version never returned (killed at 603 s, no child process, no error), while Install and
451
- Reinstall on a clean machine both exited 0. Repair is an explicit uninstall followed by an install.
452
- - PyCharm 2026.2.2 (908 MB, the largest package built with this skill) then passed the full gate GREEN.
453
- Suite 572 -> 576.
454
-
455
- ### 0.31.0 - 2026-09-14
456
- - **Added: the guest window shows every phase of the run at once.** Until now it showed one line, the step
457
- running right now, so a run three phases in looked like one stuck on its first and a failed phase left
458
- nothing to read. It is a WPF master/detail window now: tick, cross or live marker per phase, and for the
459
- selected one its exit code, duration, start and end, timeout, detection result and its own transcript.
460
- Still a separate process polling a file, still passive - it never drives the run and closing it stops
461
- nothing.
462
- - **Added: `progress.json` carries a `phases[]` plan derived from `-Scenarios`.** The hardcoded `total = 14`
463
- it published before was wrong for every partial run, and wrong for the full gate too, which has 15 steps.
464
- The older top-level fields are unchanged.
465
- - **Measured in the guest before the port, not after:** WPF loads there under Windows PowerShell 5.1,
466
- the real XAML parses, and the window paints at render tier 0 with no vGPU - a PNG of it came back out of
467
- the VM as the proof. New guards in `tests/SandboxProgressUi.Tests.ps1` cover ASCII, parsing, XAML loading
468
- and the phase plan. Suite 554 -> 569.
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.32.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",