spec(prometheus-direct-charting): sync into canonical prometheus-charting domain

New canonical domain openspec/specs/prometheus-charting/spec.md with all
27 requirements (SC-101..127) as the durable post-change contract. Change-side
delta specs/prometheus-charting/spec.md + sync-report.md. web-ui canonical
untouched (different concern).
This commit is contained in:
Developer
2026-07-08 22:57:29 +00:00
parent 7440603cdb
commit 3e77075171
3 changed files with 431 additions and 0 deletions
@@ -0,0 +1,168 @@
# Sync Report — `prometheus-direct-charting`
> Phase: **sync** · Change: `prometheus-direct-charting` · Repo: `/home/user/manage`
> Mode: file-backed (`artifactStore: openspec`). No source-code edits; only OpenSpec artifacts were
> written. Not committed (parent owns the commit). The change folder was **not** moved (that is
> `sdd-archive`'s job).
**Status: SYNCED.** A new canonical domain `openspec/specs/prometheus-charting/spec.md` was created
from the verified change, and the change-side domain delta spec that unblocks the native status
engine's `sync`/`archive` gates is also in place.
---
## 1. Executive summary
The `prometheus-direct-charting` change shipped a **complete but flat** `openspec/changes/prometheus-direct-charting/spec.md`
(27 requirements, SC-101 … SC-127) with **no** per-domain delta spec under
`openspec/changes/prometheus-direct-charting/specs/<domain>/`. `sdd-sync` requires a domain delta
spec; the flat spec alone does not satisfy the canonical-merge contract.
Verify already returned **PASS** (verdict in `verify-report.md`; all four gates green — backend
`pytest` 293 passed, `ruff` clean, frontend `npm run build` exit 0, `npm run lint` 0 errors).
Functional coverage was 26/27 fully PASS, with SC-125 PARTIAL on test coverage only (loading-state
test gap) — a non-blocking coverage finding, not a functional defect; the task framing treats it as
PARTIAL→PASS after coverage close. The verify report's single CRITICAL was an **archive** blocker
(19 unchecked task checkboxes + missing `apply-progress.md`); the `apply-progress.md` artifact now
exists and that condition does **not** block `sdd-sync` of the green code.
This sync **reconciles** the flat-spec-vs-domain-spec gap:
1. Authored the missing **change-side domain delta spec**
`openspec/changes/prometheus-direct-charting/specs/prometheus-charting/spec.md` — using a clean
`## ADDED Requirements` structure that preserves the exact requirement IDs (SC-101 … SC-127) and
text (including the patched SC-116 / SC-118 wording) from the verified flat `spec.md`. This is
what flips the native status engine's `specs` artifact from partial → done.
2. **Synced** the end-state into the **canonical store**
`openspec/specs/prometheus-charting/spec.md` — the actual sync target. Because the canonical
`prometheus-charting` domain did not previously exist, the native helper rule applies: *when the
canonical spec does not exist, the change spec becomes the new canonical spec.* The two files
therefore carry identical requirement bodies (delta under `## ADDED Requirements`; canonical
under `## Requirements`), verified byte-identical for the requirement region.
Domain name **`prometheus-charting`** was chosen (per the dispatch brief) because it covers the
full new model: direct Prometheus range-query charting, the gauge and mean modes, and the Grafana
removal that established the new direct-query model. It is distinct from the existing canonical
`web-ui` domain (MUI→shadcn migration — a different concern), which was **not touched**.
## 2. Structured status & actionContext findings
The native `gentle-pi.sdd-status` passed by the parent reports `changeName: null` with
`blockedReasons: ["Change selection is ambiguous: mobile-responsive-parity, prometheus-direct-charting,
prometheus-direct-charting, service-storage-harness, services-as-hub-ia."]` because the engine
auto-detected four active changes. This sync task was **explicitly assigned**
`prometheus-direct-charting`; the ambiguity is a parent-resolution artifact and does not block this
phase (`isNonAuthoritative: false`).
- `artifactStore: openspec`; change root `openspec/changes/prometheus-direct-charting/`.
- Artifacts present: `proposal.md`, `spec.md`, `design.md`, `tasks.md`, `verify-report.md`,
`apply-progress.md`.
- `verify: PASS` (verify-report verdict; gates green at `67ca0fc`).
- `actionContext`: `mode: repo-local`, `workspaceRoot: /home/user/manage`,
`allowedEditRoots: ["/home/user/manage"]`, `warnings: []`. All three files written are inside the
authoritative workspace / allowed edit roots. ✓
- `relationships.sameDomainActiveChanges: []`, `collisions: []` — **no active same-domain
collisions**, so no archive/sync ordering decision was required.
- The new `prometheus-charting` domain is distinct from the existing `web-ui` canonical domain;
`openspec/specs/web-ui/spec.md` was left untouched.
**Post-sync structural change:** `openspec/changes/prometheus-direct-charting/specs/prometheus-charting/spec.md`
now exists (`hasDomainSpecs` → true), resolving the missing-domain-spec condition that gated sync.
The flat `spec.md` is intentionally **left in place** as the authoritative planning artifact the
work was built against (the archive convention keeps flat specs too); it no longer triggers the
"flat spec without domain specs" condition now that a domain delta sits alongside it.
## 3. Domains synced & canonical files updated
| Domain | Change-side delta (source) | Canonical (sync target) | Action |
|---|---|---|---|
| `prometheus-charting` | `openspec/changes/prometheus-direct-charting/specs/prometheus-charting/spec.md` | `openspec/specs/prometheus-charting/spec.md` | **NEW domain**`## ADDED Requirements` copied into canonical as a new spec |
- **Canonical file created:** `openspec/specs/prometheus-charting/spec.md` (27 requirements).
- **Change-side delta created:** `openspec/changes/prometheus-direct-charting/specs/prometheus-charting/spec.md`
(27 requirements, all `## ADDED Requirements`).
## 4. Requirement delta (ADDED / MODIFIED / REMOVED)
- **ADDED (27)** — all to the new `prometheus-charting` domain (canonical did not exist pre-change).
IDs and text preserved verbatim from the verified flat `spec.md`. Grouped logically:
- *Direct Prometheus range query path* — SC-101, SC-102, SC-103, SC-104
- *Prometheus chart widget (rebrand + rebind)* — SC-105, SC-106, SC-107, SC-108
- *Prometheus gauge widget* — SC-109, SC-110, SC-111
- *Prometheus mean widget* — SC-112, SC-113, SC-114
- *Grafana removal* — SC-115, SC-116, SC-117, SC-118, SC-119, SC-120
- *Configuration documentation accuracy* — SC-121, SC-122
- *Test and build greenness* — SC-123, SC-124, SC-125
- *Migration guidance* — SC-126, SC-127
- **MODIFIED (0)** — none (new domain; no pre-existing canonical requirements to replace).
- **REMOVED (0)** — none.
- **RENAMED (0)** — none (RENAMED is intentionally unsupported by the native delta helper; not used).
## 5. Guardrails, approvals & destructive-sync assessment
- **Same-domain collisions:** none (`sameDomainActiveChanges: []`, `collisions: []`). The new
`prometheus-charting` domain does not overlap the existing `web-ui` canonical domain. No ordering
decision was needed.
- **Destructive sync:** **not applicable.** There are zero REMOVED requirements and zero large
MODIFIED blocks (new domain; everything is ADDED). No destructive-sync parent approval was
required for this sync beyond the explicit reconciliation instruction in the task.
- **Legacy flat spec:** detected pre-sync; resolved by adding the domain delta spec alongside it
(the block condition is specifically "flat spec *without* domain specs"). The flat spec was left
in place as a planning artifact.
- **`web-ui` canonical isolation:** the existing `openspec/specs/web-ui/spec.md` (the MUI→shadcn
rework) was **not modified** — verified untouched by `git status` (mtime `2026-06-17T19:11`,
not in the modified set). The two domains are independent.
## 6. Validation / checks performed (file-backed, read-only)
Run from `/home/user/manage` (no source edits, no test re-runs — those are owned by verify and were
already green at `67ca0fc`):
| Check | Command | Result |
|---|---|---|
| Canonical store populated | `ls openspec/specs/prometheus-charting/spec.md` | present ✓ |
| Change-side domain spec present | `ls openspec/changes/prometheus-direct-charting/specs/prometheus-charting/spec.md` | present ✓ |
| Requirement-ID parity (flat ↔ delta ↔ canonical) | `grep -oE 'SC-[0-9]+'` all three files, `sort -u` | **27 == 27 == 27**, identical IDs SC-101…SC-127 ✓ |
| Body-text parity (delta ↔ canonical) | `diff` of the `^### Requirement:` region of both files | **identical** ✓ |
| Patched SC-116 wording present | `grep "service-tabs/"` both delta + canonical | present in both ✓ |
| Patched SC-118 wording present | `grep "service-tabs/LinksTab.tsx"` both delta + canonical | present in both ✓ |
| Delta is pure ADDED | count `## ADDED/MODIFIED/REMOVED/RENAMED Requirements` | ADDED=1, MODIFIED=0, REMOVED=0, RENAMED=0 ✓ (no destructive sync) |
| `web-ui` canonical untouched | `git status --porcelain openspec/specs/web-ui/spec.md` | empty (not modified) ✓ |
| No edits outside openspec | `git status --porcelain` (filtered) | only `openspec/specs/prometheus-charting/`, `openspec/changes/prometheus-direct-charting/specs/`, and this report added; pre-existing dirty/untracked items unrelated to this sync unchanged ✓ |
| Markdown validity | write-time lint | all three files "Markdown clean" ✓ |
## 7. Carry-over items for the archive summary
These verify-phase findings are non-blocking for sync and should land in the archive summary:
1. **[INFO] SC-125 was PARTIAL in verify** (no explicit `isLoading:true` loading-state test in any of
the three new widget test files — coverage gap, not a functional defect). The task framing treats
this as PARTIAL→PASS after coverage close; if a loading-state case per widget has not been added,
`sdd-archive` may want to confirm or note it.
2. **[CRITICAL-process, archive-only] Unchecked task checkboxes.** At verify time, 19 implementation
/ verification task checkboxes (Slice 3 §3.13.14 and Integration §4.14.5) were unchecked and
`apply-progress.md` was missing. `apply-progress.md` now exists (created after the verify pass);
`sdd-archive` should re-scan the native status engine to confirm `tasks: done` / `applyProgress:
present` before moving the change to archive, and tick any remaining unchecked boxes if needed.
3. **[INFO] Stale generated `.pi-map.md`** files still reference Grafana / `ObservabilityPage.tsx`
(generated artifacts, not deliverable source; ignored by SC-115/116). Regenerate via
`project_map_patch` / `project_map_validate`.
4. **[INFO] Slice-2 review-budget variance** (~707 insertions vs ~310400 forecast) — additive
feature code + tests; boundary is the gauge+mean feature, not scope creep. Non-blocking; record
in the archive summary.
## 8. Next recommended phase
**`sdd-archive`** (clean). Confirm the native status re-scan reports `specs: done` / `sync: ready`
/ `archive: ready`, then move the change to
`openspec/changes/archive/YYYY-MM-DD-prometheus-direct-charting`, carrying over the items in §7 into
the archive summary. Do **not** commit or push — the parent owns the commit with explicit paths.
---
### Appendix — Files written by this sync (OpenSpec only; no source code)
- `openspec/changes/prometheus-direct-charting/specs/prometheus-charting/spec.md` — **change-side
domain delta (`## ADDED Requirements`), 27 requirements SC-101…SC-127.**
- `openspec/specs/prometheus-charting/spec.md`**canonical spec (new domain), 27 requirements.**
- `openspec/changes/prometheus-direct-charting/sync-report.md` — this report.