diff --git a/CHANGELOG.md b/CHANGELOG.md index 3af8678..ddaae2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,20 @@ major version, and each entry says so when it happens. ## [Unreleased] +## [1.9.0-rc.7] — 2026-08-28 + +### Fixed + +- The refresh-reminder guidance now names the deployment's actual verified-date + field: the workflow reads the schema's `entry.verified_key` from the script + instead of assuming a field literally named `verified`, so a catalog that + renamed the field is told to stamp the right key. +- The verification sweep hands its drafted issue bodies to the follow-up step + through a file under the runner's temp directory instead of a step output, so + a sweep that drafts many reminders in one run can no longer hit the runner's + per-environment-entry size cap; `count`, `slugs` and `max_new` remain + ordinary outputs. + ## [1.9.0-rc.6] — 2026-08-27 ### Added @@ -1168,7 +1182,8 @@ fixed in this release, and the remaining P3s are listed in `docs/roadmap.md`. in-browser and CLI configurators, GitHub-issue submission flow, events / cohorts / resources modules, Lunr search, thumbnails workflow. -[Unreleased]: https://github.com/crypticpy/phct/compare/v1.9.0-rc.6...HEAD +[Unreleased]: https://github.com/crypticpy/phct/compare/v1.9.0-rc.7...HEAD +[1.9.0-rc.7]: https://github.com/crypticpy/phct/compare/v1.9.0-rc.6...v1.9.0-rc.7 [1.9.0-rc.6]: https://github.com/crypticpy/phct/compare/v1.9.0-rc.5...v1.9.0-rc.6 [1.9.0-rc.5]: https://github.com/crypticpy/phct/compare/v1.9.0-rc.4...v1.9.0-rc.5 [1.9.0-rc.4]: https://github.com/crypticpy/phct/compare/v1.9.0-rc.3...v1.9.0-rc.4 diff --git a/README.md b/README.md index 35b3384..3c64d3b 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ A fork is a copy, not a subscription: template releases do not reach you on thei ```bash git remote add template https://github.com/crypticpy/phct.git git fetch template --tags -npm run upgrade:check -- --to v1.9.0-rc.6 # read-only: what this exact release changes, in two lists +npm run upgrade:check -- --to v1.9.0-rc.7 # read-only: what this exact release changes, in two lists ``` The whole protected-update and manual-recovery recipe: [`docs/upgrading.md`](docs/upgrading.md). diff --git a/docs/polish-and-publish-plan.md b/docs/polish-and-publish-plan.md index 146dc63..06ee33a 100644 --- a/docs/polish-and-publish-plan.md +++ b/docs/polish-and-publish-plan.md @@ -251,17 +251,17 @@ maintainer can diagnose a failed workflow and roll back without live coaching. After work packages 0–4 are green: 1. Freeze reusable changes and update the evidence ledger from current live data. -2. Open a release-record PR that sets the package/lock version to `1.9.0-rc.6`, updates CHANGELOG, +2. Open a release-record PR that sets the package/lock version to `1.9.0-rc.7`, updates CHANGELOG, migration notes, documentation status, supported scale/browser statements, and release links. 3. Run the entire parent suite from a clean clone and require every protected check on the exact release-record head. 4. Confirm the generated showcase and every preset come from that same commit. -5. Create immutable tag `v1.9.0-rc.6` only from the merged, verified release commit. +5. Create immutable tag `v1.9.0-rc.7` only from the merged, verified release commit. 6. Publish candidate notes with full SHA, compatibility impact, protected-path migrations, rollback instructions, known limitations, SBOM, SBOM SHA-256, and CI evidence. 7. Verify tag-to-commit equality and download/inspect the published release assets. -If further parent fixes are required, create rc.7; never move or replace rc.6. +If further parent fixes are required, create rc.8; never move or replace rc.7. Exit: one immutable parent candidate contains all intended reusable polish and complete evidence. @@ -314,8 +314,8 @@ does not imply that fictional content is real. ## Work package 8 — stable publication and deployment 1. After the candidate and live gates pass, open a stable release-record PR directly on top of the - accepted rc.6 commit. Change `package.json`, `package-lock.json`, CHANGELOG, release status, and - other version-bearing release documentation from `1.9.0-rc.6` to `1.9.0`; do not include a + accepted rc.7 commit. Change `package.json`, `package-lock.json`, CHANGELOG, release status, and + other version-bearing release documentation from `1.9.0-rc.7` to `1.9.0`; do not include a reusable behaviour change. 2. Review the candidate-to-stable diff against that allowlist and run every protected parent check on the exact stable-version head. @@ -325,7 +325,7 @@ does not imply that fictional content is real. statement, known limitations, candidate provenance, and links to exact CI runs. 5. Run BCHC's updater against `v1.9.0`. Let it open a stable update PR whose lock release, lock SHA, parent package version, and fetched tag all agree; do not hand-edit the candidate lock. -6. Mark the rc.6 BCHC candidate PR superseded only after the stable update PR exists and its +6. Mark the rc.7 BCHC candidate PR superseded only after the stable update PR exists and its provenance is verified. Retain both PRs as evidence. 7. Re-run protected-file checksums and the complete downstream suite on the stable update head. 8. Human-review and merge the stable BCHC update, then verify the Pages deployment SHA and all diff --git a/docs/release-readiness-plan.md b/docs/release-readiness-plan.md index 49f1369..0d8ad47 100644 --- a/docs/release-readiness-plan.md +++ b/docs/release-readiness-plan.md @@ -3,7 +3,7 @@ - Status: in execution; automated baseline implemented 2026-08-22 - Created: 2026-08-21 - Target: a release candidate suitable for the wider BCHC demo audience next week -- Candidate: `v1.9.0-rc.6` +- Candidate: `v1.9.0-rc.7` - Parent repository: [`crypticpy/phct`](https://github.com/crypticpy/phct) - Downstream demo: [`crypticpy/bchc-ai-use-case-catalog`](https://github.com/crypticpy/bchc-ai-use-case-catalog) diff --git a/docs/release-readiness-status.md b/docs/release-readiness-status.md index 81f3d5b..6120437 100644 --- a/docs/release-readiness-status.md +++ b/docs/release-readiness-status.md @@ -2,17 +2,20 @@ - Evidence date: 2026-08-28 - PHCT starting baseline: `c9fcb223826f2fc8c945d894420c16a2b8ff5da0` -- PHCT candidate: `v1.9.0-rc.6`, cut from protected `main` at the merge of the - searchable "Also deployed by" listings ([PR #46](https://github.com/crypticpy/phct/pull/46), - all ruleset-required contexts plus scale, audit, and CodeQL green at merged head - `cf55fd735d091172222801d551ee989abb3b0319`) — the head of the entry-lifecycle, - concept-search and search-performance line merged in +- PHCT candidate: `v1.9.0-rc.7`, cut from protected `main` at the merge of the two + rc.6 refresh-cycle robustness fixes found in downstream review + ([PR #49](https://github.com/crypticpy/phct/pull/49), merged at + `af54f2810ed9d94fbfbb9b92ecf500ceaba18ddb`) and this release pull request. + It supersedes + [`v1.9.0-rc.6`](https://github.com/crypticpy/phct/releases/tag/v1.9.0-rc.6), published at + immutable commit `c33e76b05fda6a9bdaa7beea7527414b13d74c1b` — cut at the merge of the + searchable "Also deployed by" listings ([PR #46](https://github.com/crypticpy/phct/pull/46)), + the head of the entry-lifecycle, concept-search and search-performance line merged in [PR #43](https://github.com/crypticpy/phct/pull/43), [PR #44](https://github.com/crypticpy/phct/pull/44) and - [PR #45](https://github.com/crypticpy/phct/pull/45) — and this release pull request. - It supersedes - [`v1.9.0-rc.5`](https://github.com/crypticpy/phct/releases/tag/v1.9.0-rc.5), published at - immutable commit `607169f1b12c6bb44e959e626c19f2ca9eefa6f0`, which itself superseded + [PR #45](https://github.com/crypticpy/phct/pull/45) — which itself superseded + [`v1.9.0-rc.5`](https://github.com/crypticpy/phct/releases/tag/v1.9.0-rc.5) at + immutable commit `607169f1b12c6bb44e959e626c19f2ca9eefa6f0`, which superseded [`v1.9.0-rc.4`](https://github.com/crypticpy/phct/releases/tag/v1.9.0-rc.4) at `c41149eaacab353c82403477bf0c5b2f26a48650`; the [`v1.9.0-rc.2`](https://github.com/crypticpy/phct/releases/tag/v1.9.0-rc.2) record at @@ -51,7 +54,7 @@ that updater succeeds. |---|---|---| | Reproducible toolchain | Pass | Node 22.22.2, npm 10.9.4, Ruby 3.3.11, and Bundler 4.0.11 are exact-pinned and checked by `npm run doctor`. | | Live pull-request CI | Pass at reviewed heads | The rc.2 implementation retained the full Validate, coverage, preset matrix, scale/Chrome, supply-chain, CodeQL, workflow-lint, pa11y, assistive-flow, and desktop/mobile Lighthouse gates. PHCT PRs #17/#20 passed protected CI and review. The generated metrics head `9a486f6` then passed all seven ruleset-required contexts plus browser quality through trusted dispatches before PR #19 was intentionally closed unmerged. Every check on BCHC rc.2 update head `2017cda` is green. | -| PHCT release verification | Pass | `npm run verify` completed under the exact-pinned toolchain at release-record commit `ce46cbdc5cdddda78878cb367b119fe9ef440aa1`: 796 Node tests across 3 suites, 233 Ruby tests with 578 assertions, 109 build-matrix tests across 6 suites, plus lint, formatting, coverage, generated-file, data/front-matter, license, security-exception, SBOM, image-derivative, production CSS, Jekyll production build, and built-site link gates. The final release-record head differs from that commit only by this evidence sentence, and every protected CI context runs on the exact head in the release pull request. | +| PHCT release verification | Pass | `npm run verify` completed under the exact-pinned toolchain at release-record commit `f1e5699f147ce770137cc50d3d7c86c372c83a37`: 799 Node tests across 3 suites, 233 Ruby tests with 578 assertions, 109 build-matrix tests across 6 suites, plus lint, formatting, coverage, generated-file, data/front-matter, license, security-exception, SBOM, image-derivative, production CSS, Jekyll production build, and built-site link gates. The final release-record head differs from that commit only by this evidence sentence, and every protected CI context runs on the exact head in the release pull request. | | Code coverage | Pass locally and in exact-head CI | Pinned runtime coverage passed reviewed regression floors: complete loaded Node production code 84.81% lines / 75.94% branches / 80.07% functions; focused security parsers 90.54% / 80.55% / 93.59%; updater and release-lock logic 72.79% / 77.39% / 87.76%; loaded Ruby production code 93.29% lines / 85.13% branches / 77.69% methods. Six Ruby CLI sources exercised by subprocess or integration gates are explicitly inventoried, and any new unrepresented Ruby source fails the gate. Validate retains JSON and raw TAP artifacts even when a floor fails. | | Exact BCHC update rehearsal | Pass for rc.6 | The real rc.4 updater run resolved `v1.9.0-rc.4` to full SHA `c41149eaacab353c82403477bf0c5b2f26a48650`, preserved the protected BCHC paths, regenerated BCHC-owned deployment output, and opened candidate [PR #7](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/7) at `c4ac0d5de1921f8047cabbe3264b6cda517c52b2`. The complete downstream required-check set was green, and the PR merged at `fd7206981c58107df626f50062f08ad6aee1a0e0`, locking the published BCHC demo to `v1.9.0-rc.4`. The rc.2 rehearsal ([PR #4](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/4) at `2017cda8b731ae52103c6b44232496d2c2fc8662`, 116 protected files byte-identical) remains the recorded checksum baseline. The rc.6 update repeated the rehearsal live on 2026-08-28: the updater first failed closed on the pending ownership-contract migration ([run 33134382533](https://github.com/crypticpy/bchc-ai-use-case-catalog/actions/runs/33134382533)), passed once [BCHC PR #29](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/29) merged, and opened the machine-verified [BCHC PR #30](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/30), which merged after human review at `c0826d9776747c2838daaba91991628e4301f7bf`, locking the published demo to `v1.9.0-rc.6`. Repeat the same rehearsal and checksum gate for rc.7 and the stable update. | | Dependency vulnerabilities | Pass | The exact-head Supply chain job passed parsed npm and Bundler audits with zero active exceptions; critical or unidentified findings cannot be waived, and stale/expired/unused exceptions fail closed. | @@ -135,7 +138,7 @@ No automated P0 or P1 defect is known at this checkpoint. |---|---|---|---| | RR-H01 | Review these changes and obtain green required CI plus independent human approval in PHCT and BCHC. | PHCT maintainer | In progress — rc.6's machine-verified update ([BCHC PR #30](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/30)) and the feature adoption ([BCHC PR #31](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/31)) merged 2026-08-28 with green required checks after human review of #30. The [PHCT PR #49](https://github.com/crypticpy/phct/pull/49) merge resets the line: the stable cut now requires an rc.7 candidate and one more human-reviewed BCHC update. | | RR-H02 | Tag an immutable PHCT release candidate, run the actual BCHC update workflow, review the checksum report and generated changes, then prove revert/rollback of the update pull request. | PHCT maintainer | Complete for rc.6 — immutable `v1.9.0-rc.6` consumed through the live updater with the fail-closed ownership-contract gate proven ([run 33134382533](https://github.com/crypticpy/bchc-ai-use-case-catalog/actions/runs/33134382533)) before [BCHC PR #30](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/30); offline rollback proof retained 2026-08-28: reverting update merge `c0826d9` restores the full `v1.9.0-rc.5` state (58 template files, lock included) touching zero deployment-owned content — the live revert-PR path stays open under RR-H07. Repeat for rc.7 and the stable tag. | -| RR-H03 | Complete a real issue → pull request → media processing → review → merge → Pages deploy → notification rehearsal in both repositories. Use non-sensitive test content and remove it afterward. | Repository admins | In progress — the BCHC leg completed 2026-08-28: a real web-form submission became [BCHC PR #27](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/27) carrying real media (PDF deck plus generated AVIF/WebP derivatives), merged at `610c0fc`, deployed through Pages, and was verified live (entry page, media files, and `search.json`); the test entry was then removed end to end via [BCHC PR #32](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/32) and verified gone. The PHCT-side rehearsal and the notification-delivery confirmation remain open. | +| RR-H03 | Complete a real issue → pull request → media processing → review → merge → Pages deploy → notification rehearsal in both repositories. Use non-sensitive test content and remove it afterward. | Repository admins | In progress — the BCHC leg completed 2026-08-28: a real web-form submission became [BCHC PR #27](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/27) carrying real media (PDF deck plus generated AVIF/WebP derivatives), merged at `610c0fc`, deployed through Pages, and was verified live (entry page, media files, and `search.json`); the test entry was then removed end to end via [BCHC PR #32](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/32) and verified gone. The PHCT leg completed later the same day: form-contract issue [#51](https://github.com/crypticpy/phct/issues/51) was scaffolded into [PR #52](https://github.com/crypticpy/phct/pull/52), the content gates correctly rejected the link-less draft until the maintainer amendment `84dd8bf` (the exact remedies the admin guide prescribes), it merged at `3a3e717`, was verified live on the deployed showcase (entry page and search index), and was removed via [PR #53](https://github.com/crypticpy/phct/pull/53) with the removal verified live. Only the notification-delivery confirmation remains open. | | RR-H04 | Name a BCHC product owner and backup technical maintainer; grant least-privilege access; update `CODEOWNERS`, `MAINTAINERS.md`, and the private contact system. | BCHC sponsor | Deferred until organizational handoff; it is not a wider-demo prerequisite. | | RR-H05 | Correct and verify branch rules, required checks/approval, Pages environment protection, Actions permissions, secrets/variables, domain/DNS, security settings, labels, and notifications against `docs/bchc/operations-inventory.yml`. | Repository admins | In progress — a fresh read-only API audit on 2026-08-28 was synced into `docs/bchc/operations-inventory.yml` (BCHC PRs [#31](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/31) and [#33](https://github.com/crypticpy/bchc-ai-use-case-catalog/pull/33)); the intentionally-unset repository variables are documented as default-on. Four admin items remain manual: require a human approval, disable Actions PR approval, protect release tags, and confirm notification delivery. | | RR-H06 | Manually test current Firefox, Safari, Edge, iOS Safari, and Android Chrome plus VoiceOver and NVDA; verify 200%/400% zoom, keyboard-only use, visible focus, forced colors, reduced motion, and representative long/empty/error content. | Accessibility reviewer | Open | diff --git a/package-lock.json b/package-lock.json index 160c862..2ece4a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "phct", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "phct", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.7", "devDependencies": { "@eslint/js": "^10.0.1", "@tailwindcss/forms": "^0.5.10", diff --git a/package.json b/package.json index c07d205..8dad5d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "phct", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.7", "private": true, "packageManager": "npm@10.9.4", "engines": {