What's new in v0.9.0
Changelog
Features
- 538fe0d dotted phase filters and stranded-install alert (@tj-smith47)
- 3506542 refresh package indexes in one concurrent pre-pass ahead of every phase (@tj-smith47)
- 566ba34 render one run skeleton for plan and apply — header rows, owner-grouped preview, single rollup (@tj-smith47)
- 3982ea6 render a backup run as a Backups pseudo-phase with one backup: group per unit (@tj-smith47)
- 5070649 accept a GitHub owner/repo shorthand wherever a repo URL is taken (@tj-smith47)
- 12956e3 carry structured manager payloads on -o json plans, and restore cfgd diff/verify manager-drift reporting (@tj-smith47)
- 9663174 head module updates and pending decisions with their owner tokens, so one screen never names the same thing two ways (@tj-smith47)
- 3b7e2a3 head status modules and rollback file work with the owner token and phase name the plan uses (@tj-smith47)
- 6904fd4 name the module review, source override and backup restore subjects with their owner tokens (@tj-smith47)
- 563f665 report cfgd diff as the plan's own phase and owner tree, so drift names the coordinates that fix it (@tj-smith47)
- 37ade4e expand array-of-object and oneOf (untagged-enum) fields (@tj-smith47)
- d4cd174 nest the plan payload actions under phases[].groups[], each carrying its owner and token #minor (@tj-smith47)
- fa9f33e commit a phase heading before the phase paints anything, and stream the prerequisites env and session groups below the managers tree (@tj-smith47)
- b08175d give init --apply, module create --apply and the daemon the one apply run skeleton (@tj-smith47)
- b38e55d owner labels, colour seams and one-block emission (@tj-smith47)
- 4aa8278 put a single-owner lane group's label on screen before its lanes paint anything under it (@tj-smith47)
- 94e31f2 settle each concurrent action's row in place as it finishes, instead of painting the phase tree only when the last lane drains (@tj-smith47)
- 8302ee1 collapse every manager one mediator installs into a single provision line and a single install command, so
npmandpipxarrive as oneapt-get install nodejs npm pipxwhile --skip/--only/--phase still address each manager on its own (@tj-smith47) - d89fe2c give every manager a bootstrap plan naming its tools, method and PATH dirs (@tj-smith47)
- 65cbd3f plan a bootstrap around a tool a system manager can install, instead of dropping the manager when it is missing (@tj-smith47)
- 6cc0f8e fold a to-be-provisioned manager's declared PATH dirs into the planned env file (@tj-smith47)
- ae9ffdb group plan actions by owner and route module work by kind (@tj-smith47)
- 2bba402 install packages concurrently, one lane per package manager (@tj-smith47)
- adc1132 plan a Prerequisites phase that names every package manager the run depends on, so provisioning is previewed and reported instead of happening inside a package install (@tj-smith47)
- 184f290 render apply execution as a phase/owner tree with one status line per action (@tj-smith47)
- 043d3bd auto-accept a source-delivered package the machine already runs when it satisfies the version spec (@tj-smith47)
- 1e9010d name every source surface with its source: owner token instead of four spellings of the same thing (@tj-smith47)
- 45778aa record when each action finished in apply_journal.completion_index, so a rollback report stays most-recent-first under concurrent installs (@tj-smith47)
Bug Fixes
- b28b21d copy an unmanaged file aside instead of moving it, and settle conflicts with --on-conflict (@tj-smith47)
- aa14504 count the action a signal killed in an aborted run, in the closing line and in the payload (@tj-smith47)
- ff2af6a emit exactly one status line per action, including shell-outs (@tj-smith47)
- 0a1d938 fold the managed-file lookup to posix, settle every conflict on a policy that has no ask, and fsync the sidecar into its directory (@tj-smith47)
- 4bed09a key --phase/--skip/--only prerequisite selectors on tool, not installer, and stop --only from pruning explicit selections (@tj-smith47)
- 7b7c893 run the index-refresh pre-pass windowless and mirror its bootstrap gate everywhere (@tj-smith47)
- ef406cb hash and scan the system settings a module contributes, which the gateway never saw (@tj-smith47)
- 5a4bae4 accept a prerequisite tool as a
--phase prerequisites.<selector>, the spelling the matcher and--skipalready took (@tj-smith47) - 38683e2 agree the module health line's units with their own counts, so one package reads 1 pkg rather than 1 pkgs (@tj-smith47)
- 2600448 attach system-configurator narration under its own apply action line instead of printing beside it (@tj-smith47)
- f140c97 carry a machine-stable classificationDegradedCode beside the degraded-classification reason in status and decide payloads (@tj-smith47)
- 5d90e07 clear drained config deprecations and dedupe the module-scoped fallback load (@tj-smith47)
- 43ca25d drain a non-default --config compliance file manager load (@tj-smith47)
- bfe5007 drain config deprecations from cfgd secret encrypt/decrypt/edit (@tj-smith47)
- 5b8c8ea drain theme deprecation warnings through the printer instead of tracing (@tj-smith47)
- 43f6861 head each pending-decisions source group with its source: owner token through one shared renderer on decide and status (@tj-smith47)
- e9e9794 let --model/--provider/--yes follow a
cfgd generatesubcommand, so the documentedgenerate profile <name> --model <m>invocation parses instead of erroring (@tj-smith47) - 8bff2ae mark a degraded source-decision classification structurally in the status and decide -o json payloads (@tj-smith47)
- 446a2e5 name undecidable dotted-manager source batches on the status and decide dashboards (@tj-smith47)
- 7c6b149 open the state store for the run's own --scope, so a system-scope command never judges ownership against the per-user store (@tj-smith47)
- 8121ebf re-cut every backup example in
--helpand the exported schema onto a command that runs, and stop the schema telling users the backup engine is unimplemented when it ships (@tj-smith47) - 4614f47 report a system check that could not run as undetermined rather than clean, on cfgd diff’s human, JSON and exit-code answers alike (@tj-smith47)
- 3d895af serve and probe the scope-resolved state store from mcp-server and the doctor state check (@tj-smith47)
- cff0e8d thread --color/--no-color through the kubectl plugin instead of hardcoding Auto (@tj-smith47)
- 7b07229 stop dropping duplicate-keyed checks from compliance diffs (@tj-smith47)
- 7800b02 drain theme deprecation notices at daemon startup and SIGHUP reload (@tj-smith47)
- 6a08b6f stop hashing a compliance snapshot's collection timestamp, so an unchanged machine no longer appends a snapshot every tick (@tj-smith47)
- b86ee1c take the config by mutable reference when draining its deprecations on Windows, so
daemon installcompiles on the one platform that reads windowsEventLog (@tj-smith47) - da7014a restate internal dep floors stranded off-master by failed Advance-master (@tj-smith47)
- 2963096 stop five HashMap/HashSet iteration orders from reshuffling per run (@tj-smith47)
- 68912a6 derive an unprovisionable manager's wording once, so
diffandverifystop spelling one refusal two ways (@tj-smith47) - 84b6f8c close cmd_verify's manager-drift gap, align diff shape vocab (@tj-smith47)
- 675f664 route a never-registered package manager to ManagerNotFound everywhere (@tj-smith47)
- 8d1af36 resolve field paths past a oneOf variant boundary (@tj-smith47)
- 702313d add Printer::alert and make an unsorted plan phase unrepresentable (@tj-smith47)
- 4d1396e decide a printer's colour once at construction and fold it into its theme, so a capture buffer can no longer be styled by a flag another thread flipped (@tj-smith47)
- 4dbb578 derive a hook status subject once, so its alignment column and its status line cannot disagree (@tj-smith47)
- 8918162 give a caller-owned action exactly one status line, from one subject (@tj-smith47)
- 0fe85a7 hand every derived printer the colour and theme its parent settled, so
--no-colorreaches the daemon's reconcile tree andspec.theme.overridesstops being inert (@tj-smith47) - 4152aee keep every running row on screen when a phase outgrows the terminal, and hold the settled ones behind a counted elision line (@tj-smith47)
- 6934d73 lead a partly-applied run with its verdict instead of a green tick (@tj-smith47)
- 7b3ccd6 render the re-source reminder as the warning it is, say what the session publish does, and paint the phase heading in its heading, separator and accent slots (@tj-smith47)
- 6df8b08 report a signal-killed command by its signal instead of an exit code -1 no process ever returned (@tj-smith47)
- 00df162 restore strip_ansi rustdoc and drop the Profile row from a module-only plan (@tj-smith47)
- dd817bd route every nothing-in-scope verdict through its one owner and catalog the hook-subject helpers (@tj-smith47)
- 22860d3 declare the roaming AppData scripts directory pip installs pipx into on Windows (@tj-smith47)
- 9ebdae6 find a pipx that pip installed into the roaming AppData scripts tree off PATH (@tj-smith47)
- 69b3636 keep the apt→dnf→zypper method detector on the platform that has one (@tj-smith47)
- b5bb681 keep the cause of a failed install on the status line that reports it (@tj-smith47)
- e45b55c plan a manager only through a mediator the host can run, and hand every package-manager child the dirs bootstrapped this run (@tj-smith47)
- b839f25 provision a manager through the mediator its plan named, and resolve the binaries that provision installed (@tj-smith47)
- 3eadb43 record a provision's PATH directories from the method the plan named, and add a directory an install created to the manager's record instead of replacing it (@tj-smith47)
- b89d0d3 refresh a manager index without upgrading every package on the machine, and plan no refresh for a manager that keeps no index (@tj-smith47)
- f31e089 write a PATH directory cfgd created into the generated env file whoever installed the manager, and answer path_dirs from the run's own decision rather than a live re-probe (@tj-smith47)
- 5385586 unify action-text grammar between profile and module display paths (@tj-smith47)
- 8d19ac1 fold this run's own provisioning into the PATH convergence-net baseline (@tj-smith47)
- e542ecf give each package-manager FAMILY one lane, so brew, brew-tap and brew-cask no longer run three concurrent brew processes (@tj-smith47)
- f84f042 mint the refusal a manager cfgd cannot provision earns, refresh only an index the run reads, and keep cfgd own scaffolding out of the resources a user declared (@tj-smith47)
- 706b752 resolve run: script paths correctly and stop detaching interactive scripts from the terminal (@tj-smith47)
- 5fb2c42 stop test builds resolving the operator's real home directory (@tj-smith47)
- fdc27b3 stop reporting module file deploys as unrecoverable actions (@tj-smith47)
- 1a76e99 resolve a repository reference identically on every surface, so an existing local path is never silently expanded to a GitHub URL (@tj-smith47)
- 7540c7d scaffold and edit cfgd-source.yaml in the current directory, not the machine config dir (@tj-smith47)
- 0fafd63 stop 'source show' from live-fetching a source just to render its cached manifest (@tj-smith47)
- ce89c10 apply the auto-apply policy on every path and stop a decision suppressing the operator's own declaration (@tj-smith47)
- 4b888d3 ask before installing a source item on every path, and read its tier from the layer that delivered it (@tj-smith47)
- 754a21b fold a listed package name through its own identity space, so a non-fixed-point manager identity cannot mint auto-accept consent for an uninstalled package (@tj-smith47)
- 8e90123 judge a pinned source package against the manager-reported installed version, so a satisfied pin auto-accepts in production (@tj-smith47)
- 921b359 let cfgd decide answer and cfgd status list source items no run has recorded yet (@tj-smith47)
- de6d91c scope decision withholding to subscribed sources and show every withheld item (@tj-smith47)
- 9037cf2 scope decision writes to the run's own scope and record only the item decide answers (@tj-smith47)
- 8824b0b withhold a dotted custom manager's source packages fail-closed, with the run warning where a decision row cannot (@tj-smith47)
- 55a7e83 withhold undecided source items from plan and apply, not just the daemon (@tj-smith47)
- d9e557f derive a compliance snapshot hash from one serialization, so a daemon tick after a CLI snapshot no longer reads as changed (@tj-smith47)
- 35c945f stop reporting no drift detected when the dashboard scanned nothing (@tj-smith47)
- a4a7472 close the configurator printer bypass by construction and pin the attached narration shape in the goldens (@tj-smith47)
- 32bf82d gate the snapshot bridge to unix, the widest platform whose bridges use it (@tj-smith47)
- f02f1ab gate the two test-only system helpers to the platforms that call them (@tj-smith47)
- cb64f8f stop a diff stalling ~90s per unit on a host whose systemd is installed but not running (@tj-smith47)
- 3a3a8cd stop six configurators repeating their own name in the drift key, and rewrite the doubled ids already persisted (@tj-smith47)
- 81188ac compile init tests on Windows and macOS — gate the unix-only prerequisite import, drop a stale InitArgs field the Linux build could not see (@tj-smith47)
- 74e7091 decide a test printer's colour, live region and stdin at construction, so the suite stops answering to the terminal it was started from (@tj-smith47)
- 355409a gate the phase-tree fixture import to unix so the Windows -D warnings sweep of apply_snapshots compiles (@tj-smith47)
- 1dbb546 hold the PATH read guard across both probe passes of the bootstrap-plan feasibility gate so a concurrent PATH-emptying test cannot split them (@tj-smith47)
- 6812769 make the Windows suite green — posix-folded state ids in unmanaged-file tests, per-shell Auto quoting expectations, unix-only getcwd-symlink pins, a Windows env-target-count arm (@tj-smith47)
- ad75285 pin env-host-probe seam, fix macOS symlink CWD tests, widen Windows configurator test coverage (@tj-smith47)
- 515266d assert what a provider availability probe resolves instead of restating the host it ran on (@tj-smith47)
- b9a742c compile the snap and flatpak suites on every OS and hold the PATH read guard across their bootstrap-plan probes (@tj-smith47)
- 73a4e00 drive the missing-tool arm of every availability gate from a probe PATH, which no host cfgd is tested on ever reached (@tj-smith47)
- a175181 expect the pipx bootstrap plan unconditionally and size the env-action count to the platform session-file target (@tj-smith47)
- 5af8545 judge a declared PATH dir rooted by its folded string, since Windows calls a POSIX root relative (@tj-smith47)
- e179da0 pin the dispatch and sudo-prefix rules that only asserted on hosts nobody runs (@tj-smith47)
- 4d4bd7e stop four tests restarting the host kubelet, and make three more assert what the shim recorded (@tj-smith47)
- 2647df4 derive a backup run’s busy units from its reports and pin the spec-to-report pairing at both payload boundaries (@tj-smith47)
- d2b4c2f key-order spec.system everywhere it is declared, merged and read, so the checkin payload and compliance snapshot stop reshuffling on an unchanged machine (@tj-smith47)
- a245e88 serve one byte-size renderer from cfgd-core, so a core backup line and the CLI cannot report two scales for one number (@tj-smith47)
- 26e152f build the plan payload from the same in-scope walk the tree renders (@tj-smith47)
- e6cd247 ask the four question-only sites whether a manager can bootstrap, instead of deriving a plan each drops (@tj-smith47)
- ef49008 remove PackageAction::Bootstrap and Tier::Bootstraps (@tj-smith47)
- 9852a86 rewrite comments citing the deleted inline bootstrap and re-model off-model manager-action test fixtures (@tj-smith47)
Released with anodizer