Skip to content

feat: API-first configuration preview, read visibility and equivalent UI - #81

Open
iperev wants to merge 1 commit into
feat/capability-diagnosticsfrom
feat/config-lifecycle-parity
Open

iperev wants to merge 1 commit into
feat/capability-diagnosticsfrom
feat/config-lifecycle-parity

Conversation

@iperev

@iperev iperev commented Oct 12, 2026

Copy link
Copy Markdown
Contributor

Stacked PR 26 — base: #80 (feat/capability-diagnostics). Do not merge yet. Review only the top commit.

Context

ROADMAP CI-019 requires API-first configuration journeys with equivalent UI and separated visibility/command authority. Status and export both required configure, status could not show valid D8 rollback targets, no read API exposed the semantic diff, and the UI could neither review nor activate a registered custom epoch (CI-018 wire existed without UI).

What changed

Provisional owner decisions (2026-10-11):

  • D1: "files" = existing single-document import/export.
  • D2: a read-only GET …/epochs/{epoch_id}/preview?baseEpochId= (ci-config-epoch-preview/v1) returns the review-owner policy-semantic-diff/v1 pointers and hash plus the rollback coverage relation; validation stays pure.
  • D3: status and preview need read; exact export keeps configure. The pointer-disclosure analysis (closed schema, changed arrays reported as one pointer) is recorded in the lifecycle doc.

Status is ci-config-epoch-status/v2 with previouslyActivated (exact D8 journal check, one bounded query, no migration). The UI gates each control by its route role, offers rollback only for previously activated epochs, compares with the active epoch, starts the registered-epoch GitHub review, and activates the returned review via v3. For a read session with a reviewed baseline, activation stays disabled until the preview shows a terminal result (diff, over-limit relation or failure notice). The preview reads only while Configuration is visible; leaving the view or hiding the document aborts and discards it, and it is read again on return. The HTTP profile, OpenAPI/TS, requirements (REQ-CI-CONTROL-009, REQ-CI-UI-024), Proofkit bindings, docs and ROADMAP row are updated.

Expected result

Exact-head CI runs the new and updated unit, PostgreSQL, vitest and browser tests.

Non-claims: no local test execution; no browser tests for the new journeys; no live GitHub step-up, deployed hot-reload effect or production identity evidence; REQ-CI-CONTROL-008 stays deferred; CI-019 stays open pending merged exact-source qualification.

Risks

  • Hiding Configuration and returning re-reads the preview, so each return costs one more server-side diff/admission pass under read.
  • On the hide-by-spy path the new tests rely on vi.restoreAllMocks() from onTestFinished. That is unverified until CI runs.
  • The earlier risks still stand: status v2 has no dual-version support, the review hint stays in the URL after activation, and live GitHub step-up is unproven.

Recommended next step: one focused reviewer pass on the four changed UI files and the two new tests, then exact-head CI.

Independent review: gpt-6-astra (xhigh); findings addressed or rejected with reasons in the single commit. Provisional owner decisions (2026-10-11) are labelled in the changed documents.

ROADMAP CI-019 asked for API-first configuration journeys with equivalent UI
and separated visibility and command authority. Status and export both
required `configure`, status could not tell which retained epochs are valid
rollback targets under D8, no read API exposed a semantic diff, and the UI
could neither review nor activate a registered custom epoch.

Provisional owner decisions (2026-10-11), recorded in the API lifecycle
design: D1 "files" is the existing single-document import/export; D2 a
separate read-only preview compares two retained epochs while validation
stays pure; D3 status and preview need `read`, exact export keeps
`configure`. Every policy-schema object is closed and changed arrays collapse
to their own pointer, so preview pointers name schema fields only.

Backend: GET .../epochs/{epoch_id}/preview?baseEpochId= returns
ci-config-epoch-preview/v1 with the proposal-review policy-semantic-diff/v1
pointers and hash plus the conservative rollback coverage relation of the
target against the base; an over-limit diff keeps the relation. Status is
ci-config-epoch-status/v2 and projects previouslyActivated with the exact D8
journal predicate through one bounded query over the page identities; no
table, index or migration. The HTTP profile, OpenAPI and generated client
are regenerated.

UI: each control mirrors its route role; the table shows previous
activation and rollback is offered only for such targets; an explicit
comparison renders pointers, coverage and diff identity; a non-active epoch
can start the registered-epoch GitHub review; the review callback lands on
Configuration, shows the preview and activates through v3 inside the
existing serialized command hook with uncertain-command retention.

Unit, PostgreSQL, vitest and browser witnesses are authored or updated but
not executed locally; they run in GitHub CI. No live GitHub step-up,
deployed hot-reload effect or browser evidence for the new journeys is
claimed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant