Skip to content

Split app release readiness from continuous release readiness - #372

Merged
mergify[bot] merged 1 commit into
mainfrom
claude/m4-r27-01-readiness-split
Oct 4, 2026
Merged

mergify[bot] merged 1 commit into
mainfrom
claude/m4-r27-01-readiness-split

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Der Bericht trennt jetzt den App-Release (v1.5.0) vom Dauerbetrieb-Release: appReleaseEligible wird nur durch deine eigene Bestätigung (appReleaseAttested) wahr und setzt nur Einrichtung und Maschinenschnittstelle voraus. Der Dauerbetrieb bleibt exakt so streng gesperrt wie bisher (continuousReleaseEligible). Das alte Feld releaseEligible bleibt für ein Release als veralteter Alias, der nicht „Release ok“ bedeutet.

Report

What changed (E20 option A, M4-R27-01; base origin/main 9e58578)

  • scripts/lib/continuous-readiness.mjs: releaseEligible computed as continuousReleaseEligible; releaseEligible kept as deprecated alias (commented); new appReleaseEligible = configuration ready && machineInterface ready && explicitState(evidence,'appReleaseAttested'), appRelease: 'eligible-after-explicit-release' | 'blocked', blocker attestation:appRelease; schemaVersion 2.
  • scripts/continuous-audit.mjs: exit code now uses continuousReleaseEligible (unchanged semantics), hardcoded appReleaseAttested: false, dropped the shadowed outer schemaVersion: 1 (the spread already overrode it). scripts/hq-live.mjs: appReleaseAttested: false. No agent writes the attestation.
  • Consumers: grep of src/ and scripts/ found no UI/HQ label using releaseEligible; only hq-routes.test.mjs (now asserts the new fields) and docs/development/CONTINUOUS.md (updated).
  • Tests: 4 new in continuous-readiness.test.mjs (app false without attestation, true with it while continuous stays false, needs setup/runtime, schema 2); alias equality asserted in existing tests.

Evidence

  • bash scripts/ci/red-first.sh exit 0 (4 new tests red/missing at merge base, green at head).
  • node --test scripts/lib/continuous-readiness.test.mjs scripts/lib/hq-routes.test.mjs exit 0 (17 tests).
  • node scripts/ci/architecture-drift.mjs check exit 0 (no new occurrences).
  • bash scripts/ci/gates.sh lane prepush exit 0 at bce2eda (independent reviewer run: 1769 Rust tests, 520 HQ tests and 480 frontend tests passed).
  • gh pr checks 372 exit 0; required PR checks reported pass on candidate bce2eda.
  • Diff: 6 files, +71/-9.

Architecture drift: none; the drift gate reported no new occurrences and the review found no competing frontend state, command-result/error, store/lock, IPC-name, or Rust-to-frontend event pattern.

NICHT ABGEDECKT: #[cfg(windows)] tests and Windows clippy arms (Windows lane runs in the merge queue); no GUI/HQ screenshot (no UI change); .pa/release_attestation_v1.5.0.json reader not part of this package. The local prepush lane also does not cover Browser Smoke, the frontend production build, workflow gates, or external updater/OmniRoute/mirror services.

Review disposition

  • Reviewer: Codex (OpenAI), GPT-5; candidate bce2eda833b8adc74fb0a7a76adc384869577f1a; tier B; reviewed 2026-10-04.
  • B1 — high, scripts/lib/continuous-readiness.mjs:82: E20 option A is implemented as the app-release eligibility contract although the current origin/main still records E20 in docs/PLAN.md:489 as open, user. The review checked the current remote plan, the complete diff, PR body, PR comments, and actual callers. The hardcoded appReleaseAttested: false prevents an immediate release through the current audit, but it does not authorize or cure the new public readiness contract. Resolved (coordinator, 2026-10-04 23:50): the finding was correct about the missing record, but the decision itself exists: the user chose E20 option A on 2026-10-04 in the orchestrator session (his literal answer: "Option A"). The plan record is PR docs(plan): record user decision E20 (option A) #390 (docs/PLAN.md E20 -> "✓ entschieden (Nutzer 04.10.): Option A"), labelled priority so it merges first. No code change needed here.
  • Other candidates rejected after counter-check: the missing attestation-file reader is explicitly outside this package and fail-closed; the additional app-attestation blocker and schema-version bump are intentional parts of the combined versioned report; no architecture-drift finding remains.

Rename the computed releaseEligible to continuousReleaseEligible (keep a
deprecated alias for one release), add appReleaseEligible gated on the
configuration and machineInterface phases plus the user's appReleaseAttested,
and bump the report schemaVersion to 2 (E20 option A).

Test-First: scripts/lib/continuous-readiness.test.mjs::app release is blocked without the user attestation
Test-First: scripts/lib/continuous-readiness.test.mjs::app release attestation does not make continuous mode release-eligible
Test-First: scripts/lib/continuous-readiness.test.mjs::app release still needs configuration and machine interface
Test-First: scripts/lib/continuous-readiness.test.mjs::readiness report is schema version 2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@Cuarroc
Cuarroc marked this pull request as ready for review October 4, 2026 20:55
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-04T20:58:04.918351Z bce2eda Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bce2eda833

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +82 to +88
// App release (E20): needs only the `configuration` and `machineInterface`
// phases plus the user's own attestation; it never depends on the continuous
// phases (runtime, delivery, rollout) and never enables continuous mode.
const appReleaseState = explicitState(evidence, 'appReleaseAttested', 'app release');
const appReleaseEligible = phases.configuration.state === 'ready'
&& phases.machineInterface.state === 'ready'
&& appReleaseState.state === 'ready';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Wait for approval before adopting the new release path

At this commit's base, docs/PLAN.md:489 records E20 option A as offen, Nutzer, but these lines implement that option by making the app release eligible with only setup, the machine interface, and a supplied boolean, omitting the existing continuous/review/delivery gates. This is a release-policy change rather than neutral plumbing, so it should retain the prior semantics until the user selects an option and that approval is recorded.

AGENTS.md reference: AGENTS.md:L125-L128

Useful? React with 👍 / 👎.

appReleaseEligible,
continuousMode: continuousEligible ? 'eligible-but-disabled-until-explicit-enable' : 'blocked',
stableRelease: releaseEligible ? 'eligible-after-explicit-release' : 'blocked',
stableRelease: continuousReleaseEligible ? 'eligible-after-explicit-release' : 'blocked',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Label the legacy stable release as continuous-only

When all continuous gates pass but appReleaseAttested is false, this field becomes eligible-after-explicit-release while the new appRelease field remains blocked. The existing consumer in docs/dev-hq/hq.js:731 renders stableRelease under the generic label release, so the human cockpit can say the release is eligible before the user's app-release attestation; rename/deprecate this field as continuous-only or update that consumer to display both domains explicitly.

AGENTS.md reference: AGENTS.md:L44-L48

Useful? React with 👍 / 👎.

continuousReleaseEligible,
// Deprecated alias of `continuousReleaseEligible` (not the app release);
// kept for one release, then removed. Do not present it as "release ok".
releaseEligible: continuousReleaseEligible,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Point the acceptance matrix at app release readiness

The canonical acceptance contract in .pa/continuous_acceptance_matrix.md:37 still requires the audit to produce releaseEligible: true, but this line deliberately keeps that field aliased to continuous-release eligibility. With continuous mode intentionally disabled, a user can therefore attest the app release and obtain appReleaseEligible: true while matrix row 27 remains impossible to satisfy, so this change does not actually remove the E20 release blocker; after approval, update the contract to require the new app-specific field.

Useful? React with 👍 / 👎.

@mergify

mergify Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Queued — the merge queue status continues in this comment ↓.

@Cuarroc

Cuarroc commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Coordinator: B1 (E20 user decision missing) resolved. The user decided option A on 2026-10-04; record in #390. See review disposition.

@Cuarroc

Cuarroc commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

@Mergifyio queue

@mergify mergify Bot added the queued label Oct 4, 2026
@mergify
mergify Bot merged commit 5ef7e7d into main Oct 4, 2026
15 checks passed
@mergify
mergify Bot deleted the claude/m4-r27-01-readiness-split branch October 4, 2026 22:09
@mergify

mergify Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

This pull request spent 22 minutes 1 second in the queue, including 12 minutes 5 seconds running CI.

Required conditions to merge

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant