Commit Graph

1222 Commits

Author SHA1 Message Date
rcourtman 3826316eec Split Windows signing submission from approval-bound collection
Production SignPath signing requests require manual approval in the
SignPath UI, so the previous single-job flow (submit with
wait-for-completion inside a 40-minute window) let approval latency fail
the Windows build, and any re-run rebuilt the binaries and submitted a
second request needing a second approval.

The Windows lane is now two jobs: sign-windows-agent builds the unsigned
executables, submits the SignPath request without waiting, and uploads a
7-day signing-request record; collect-windows-signing absorbs approval
latency by polling the recorded request, downloads the signed artifact
by request id, and keeps the existing verification and evidence steps.
If approval outlasts the 115-minute polling window, the collection job
fails with re-run guidance and "Re-run failed jobs" collects the same
recorded request - no rebuild, no resubmission. The legacy PFX
break-glass backend rides the same two-job shape via an artifact
hand-off. Workflow output wiring, artifact names, and evidence content
are unchanged for downstream consumers.

The shape test now pins the async invariants (no wait-for-completion:
true in the candidate workflow), and the code signing policy plus the
deployment-installability contract describe the two-phase flow.
2026-08-11 15:50:25 +01:00
rcourtman c17664b3da Distinguish MSP evaluation issuance from readiness 2026-08-11 14:50:47 +01:00
rcourtman 9449a6909e Make provider MSP evaluation activation attributable 2026-08-11 14:27:29 +01:00
rcourtman 44a3f19454 Fix large Proxmox cluster poll exhaustion 2026-08-10 14:39:01 +01:00
rcourtman bcb172c127 Authorize unsigned Windows artifacts for v6.2.1 2026-08-10 08:24:09 +01:00
rcourtman 5112ae3ea4 Document update-check age in v6.2.1 2026-08-10 08:01:26 +01:00
rcourtman 5a865820a6 Prepare v6.2.1 emergency patch release 2026-08-10 00:54:43 +01:00
rcourtman 837ce57106 Fix agent download preflight redirects (#1696) 2026-08-09 20:57:52 +01:00
rcourtman 6c150973b4 Fix Agent Doctor credential recovery 2026-08-09 20:47:11 +01:00
rcourtman cd63e0848a Record v6.2.0 release completion 2026-08-09 20:06:42 +01:00
rcourtman 83273de91c Fix post-activation demo convergence 2026-08-09 19:54:14 +01:00
rcourtman be18f99d24 fix(rbac): make SSO user access manageable 2026-08-09 13:36:07 +01:00
rcourtman e2a2e7d4d2 Record v6.2.0 Windows signing exception 2026-08-09 11:05:20 +01:00
rcourtman e9904157e7 Prepare v6.2.0 stable release 2026-08-09 10:43:19 +01:00
rcourtman 63a0adf9ac Repair rejected agent credentials safely 2026-08-09 00:51:38 +01:00
rcourtman 4e1d2f6d5d fix(telemetry): scale adoption reporting 2026-08-09 00:35:40 +01:00
Richard Courtman 1b804cf206 fix(release): wait for convergence metadata 2026-08-08 22:18:39 +01:00
Richard Courtman e245aa11e2 fix(release): add activation-only recovery 2026-08-08 22:10:49 +01:00
Richard Courtman 894e0eb213 chore(release): prepare v6.2.0-rc.11 2026-08-08 20:26:15 +01:00
rcourtman 52fbcfd341 fix(release): allow draft asset smoke access 2026-08-08 18:57:11 +01:00
rcourtman 81ccca17a5 Prepare v6.2.0-rc.10 release 2026-08-08 17:34:07 +01:00
rcourtman 8ff64e0dee Fix PBS node identity retry classification 2026-08-08 09:39:02 +01:00
rcourtman 79f3187d18 fix(ci): repair script smoke tests on main
Two failures landed this morning:

- test_gitleaks_ignore.py's historical-fingerprint resolution (added in
  d1fa7f38c) needs branch- and tag-reachable history, but the
  scripts-and-build job used a depth-1 checkout, so all 37 fingerprints
  failed to resolve in CI. Fetch full history like the gitleaks and
  changes jobs already do.

- d1f687c0e routed frontend-modern/package.json and package-lock.json to
  the new frontend-dependency-security path policy without updating the
  manifest expectations pinned in test-hot-dev-bg.sh. Pin the effective
  first-match policy per manifest instead of bare membership so the
  routing stays asserted and shadowed entries cannot fake coverage.

Contract-Neutral: CI-only fix: full-history checkout for gitleaks fingerprint resolution test and re-pin hot-dev manifest policy expectations to the registry routing d1f687c0e already established; no contract delta
2026-08-08 06:17:26 +01:00
rcourtman d45e597dbb fix(governance): block prerelease on credential containment 2026-08-08 05:55:12 +01:00
rcourtman e434466269 fix(security): verify SSH hosts during proxy cleanup 2026-08-08 05:18:55 +01:00
rcourtman 8e8edbf7de fix(governance): isolate release-control worktree roots 2026-08-08 05:12:07 +01:00
rcourtman ebff6f9946 fix(governance): restore advertised worktree helpers 2026-08-08 04:08:35 +01:00
Richard Courtman 7fd33dd6fa test(governance): update backend proof snapshot 2026-08-08 03:49:55 +01:00
rcourtman d1f687c0ea fix(governance): enforce frontend dependency audits 2026-08-08 03:26:36 +01:00
rcourtman d1fa7f38c7 security: narrow historical secret scan allowlist 2026-08-08 03:17:57 +01:00
rcourtman 633d3117f7 fix(governance): fail closed on unsupported commercial evidence 2026-08-08 03:11:12 +01:00
rcourtman d130d00867 fix(release): make customer promotion convergent 2026-08-08 02:36:28 +01:00
rcourtman fbee92614a fix(release): restore verifiable MSP evaluation delivery 2026-08-08 01:04:07 +01:00
rcourtman b0759d20d7 fix(release): activate before mutable customer promotion 2026-08-08 00:58:18 +01:00
rcourtman 4739d9af07 fix(release): reject issue references in highlights 2026-08-08 00:54:38 +01:00
rcourtman 8fd43b307b fix(release): simplify in-app highlights 2026-08-07 15:50:39 +01:00
rcourtman 1019310adf fix(release-control): unblock RA10 documentation currentness proof
The public repository surface refresh (40d29ca44) hard-wrapped the
Settings → Infrastructure → Install on a host phrase mid-line and
dropped the v5-to-v6 agent upgrades mention from README.md, breaking
RA10's documentation-currentness-tests proof on main.

- documentation_currentness_test.py: match prose fragments against
  whitespace-normalized content, the way markdown renders it, so an
  editorial rewrap can no longer fail the guard. Structural fragments
  (table rows, gate headings) and all assertNotIn checks still match
  raw source.
- README.md: restore the v5-to-v6 agent upgrades mention the refresh
  dropped; the invariant is still live while v5 installs migrate.
2026-08-07 13:17:19 +01:00
Richard Courtman 5e9db16927 fix(release): stage artifacts before publication 2026-08-07 12:27:36 +01:00
rcourtman 4885c378aa Keep the operator .env out of the Traefik container and unhardcode the DNS-01 provider
Traefik took the whole operator .env via env_file, so the internet-facing
container's environment carried CP_ADMIN_KEY and the entitlement signing
private key, neither of which it needs. It now receives only ACME/DNS
material: the CF token by explicit passthrough plus an optional
dns-credentials.env that setup.sh creates 0600.

The same wiring removes the silent Cloudflare-only narrowing: the resolver
provider is now ACME_DNS_PROVIDER (default cloudflare) via Traefik's env
override, the CF token is required only for the default provider, and any
other Traefik dnsChallenge provider supplies its credential variables through
dns-credentials.env. Pinned by
TestProviderMSPTraefikEnvIsMinimalAndDNSProviderOverridable; contract delta
in deployment-installability.
2026-08-07 10:47:13 +01:00
Richard Courtman 8a616b4b56 Prepare v6.2.0-rc.9 release 2026-08-07 10:03:16 +01:00
rcourtman c9e66b2295 release: pin code-signing policy link to the release tag
The docs link drift guard (test_repo_docs_link_drift.py) fails CI because
render_release_body.py links docs/CODE_SIGNING_POLICY.md at blob/main.
Release bodies must reference the docs snapshot of the release they
describe, so the installation section now links blob/v{version}, matching
how the rest of the body pins to the version being cut. The unit test pin
follows. Also skip .claude/ in the drift guard so local runs on a shared
tree are not polluted by stale agent worktrees under .claude/worktrees
that CI never checks out.
2026-08-07 01:13:56 +01:00
rcourtman 4e67b8117d fix(governance): exempt pure prettier reformats from browser proof
A `make format` sweep re-lays-out already-committed files without
changing a single token, so it cannot change what renders. The browser
verification guard still demanded a fresh receipt for it, which would
mean recording routes, viewports, states and interactions nobody
exercised in order to describe a diff with no visual delta. A guard that
can only be satisfied by an untrue receipt teaches people to write
untrue receipts.

Exempt a path only when its new content is byte-identical to prettier's
output for its committed content. That is provable, not a judgement
call: if the two match, the sole difference from HEAD is layout.

Fails closed everywhere else -- added or deleted files, unreadable
blobs, prettier missing, or any non-identical output all fall through
and still require the receipt. A reformat that also changes a value is
covered by a test and still blocks.
2026-08-06 21:53:44 +01:00
rcourtman ff58c33cfb fix(tooling): stop worktree commits from skipping prettier
The pre-commit frontend formatter resolved prettier at
REPO_ROOT/frontend-modern/node_modules/.bin/prettier, where REPO_ROOT is
derived from the script's own path. In a linked worktree that is the
worktree root, which never runs npm install, so prettier_bin() returned
None and the formatter silently returned 0. Every frontend commit made
from a Claude or Codex agent worktree skipped formatting entirely, and
the drift accumulated in already-committed files until someone ran
`make format` and picked up 14 files of unrelated churn.

The skip path's comment claimed "CI's prettier check still catches drift
that slips through here." No such check existed -- nothing under
.github/workflows referenced prettier -- so there was no backstop at all.

- Fall back to the primary worktree's node_modules, resolved via
  `git rev-parse --git-common-dir`, and say so in the hook output so a
  version mismatch between the two checkouts stays visible.
- Add the whole-tree "Check frontend formatting" step to the frontend CI
  job that the comment already promised. Staged-only formatting cannot
  see drift in untouched files; this can.
- Pin prettier exactly. "^3.3.0" let the tracked package-lock.json land
  on 3.9.5 while the gitignored pnpm-lock.yaml resolved 3.9.6, so CI and
  the dev machine were free to run different formatters.
- Resolve the test suite's prettier the same way, so its two real
  coverage tests stop silently skipping in worktrees.

Contract-Neutral: devDependency prettier version pin plus pre-commit/CI formatter tooling; no runtime, API, or deployment-surface delta
2026-08-06 21:53:44 +01:00
Richard Courtman 25ba5fd63e docs: publish SignPath policy links 2026-08-06 17:42:08 +01:00
Richard Courtman dbd353427b docs(governance): establish localized product lane 2026-08-06 17:26:12 +01:00
rcourtman 0dd9c92cb8 ci(signing): trust test certificate at machine scope 2026-08-06 16:08:33 +01:00
rcourtman 5ed518403f ci(signing): bound certificate store mutation 2026-08-06 16:00:41 +01:00
rcourtman 9d4f6ae923 fix(install): stop the agent version warning firing on correct installs
The installer compares the agent binary it downloaded against the server that
served it, stripping a leading "v" so "v6.0.4" and "6.0.4" match. It did not
strip semver build metadata, so a server built from a working tree reporting
"6.2.0-rc.8+git.46.g98a638e00.dirty" never matched the "v6.2.0-rc.8" agent it
had just served, and the mismatch warning fired on every correct development
install.

This is the warning's whole job, so a false positive is expensive. It is the
only client-side signal that a stale agent was downloaded, and because it
always fired it read as background noise. That is exactly how a genuinely
stale v6.0.5 agent was installed on a live host earlier today: the warning
was there, above the install output, and looked like the one that always
appears.

Strip build metadata from both sides before comparing, keeping the prerelease
suffix because 6.2.0-rc.8 and 6.2.0 are genuinely different releases. This is
the same release-identity reduction the server applies when deciding whether a
local agent artifact is fresh enough to serve; the contracts now state that
one definition governs both ends rather than leaving each side to invent its
own.

Guarded by a test that pins both normalisation steps and exercises the
comparison across the cases that matter: the dev-server shape that used to
warn wrongly, the stale-download shape that must still warn, and a prerelease
against its release. Verified to fail when either strip is removed.
2026-08-06 15:50:47 +01:00
rcourtman 1f45db6e54 ci(signing): avoid interactive certificate import 2026-08-06 15:47:58 +01:00
rcourtman 98c6e2c46e ci(signing): bound test signature verification 2026-08-06 15:37:47 +01:00