Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
f6c4e95
chore: add dial-unified-config proposal documentation
May 1, 2026
14d0fe5
chore: add dial-unified-config implementation plan
May 1, 2026
2eb9144
chore: add /dial-mvp orchestrator slash command
May 1, 2026
2443514
chore: gitignore Eclipse / JDTLS IDE artifacts
May 1, 2026
fd71f98
chore: gitignore personal review-unified-config slash command
May 1, 2026
30d2133
chore: allow per-sync merge override on feature-branch integration
May 1, 2026
f8bf0e9
docs(dial-unified-config): apply 2026-05-01 default-flip and settings…
May 1, 2026
7919653
chore: rename slice sub-branches to use hyphen separator
May 1, 2026
14c4d39
feat: 1S.0: bootstrap CONFIG_RESOURCE route, ConfigAuthorizationServi…
siarhei-fedziukovich May 2, 2026
ad0bf50
docs(dial-unified-config): mark slice 1S.0 merged
May 2, 2026
42596ff
chore: drop per-slice PRs in favor of local squash-merge
May 2, 2026
e105603
feat: 1S.1: GET /v1/models/public/{name} read with Public/Owner proje…
May 2, 2026
797e2a7
docs(dial-unified-config): mark slice 1S.1 merged
May 2, 2026
b692a10
chore: add /dial-mvp-auto for batch slice execution with self-test gates
May 2, 2026
395a936
feat: 1S.2: GET /v1/models/public/ listing with pagination envelope
May 2, 2026
76d3a0d
docs(dial-unified-config): mark slice 1S.2 merged
May 2, 2026
af64319
feat: 1S.3: read API for platform-bucket types + schemas/settings
May 2, 2026
c0ae13d
docs(dial-unified-config): mark slice 1S.3 merged
May 2, 2026
acfe1ac
feat: 1S.4: ConfigAuthorizationService preflight for app/toolset reads
May 2, 2026
f33ffac
docs(dial-unified-config): mark slice 1S.4 merged
May 2, 2026
7be8db9
feat: 1S.5: admin authz preflight on FILES/RESOURCE controllers
May 2, 2026
9012d70
docs(dial-unified-config): mark slice 1S.5 merged
May 2, 2026
ec1ac53
feat: 1S.6: GET /v1/admin/export — full Config snapshot (JSON/YAML)
May 2, 2026
608a0ea
docs(dial-unified-config): mark slice 1S.6 merged
May 2, 2026
2a5a10a
feat: 1S.7: GET /v1/admin/health/config — Phase 1 healthy stub
May 2, 2026
b98c9e6
docs(dial-unified-config): mark slice 1S.7 merged
May 2, 2026
00ba6ec
fix(test): update ConfigBootstrapTest expectation for 1S.3 intercepto…
May 3, 2026
e34332b
docs(dial-unified-config): clarify §A item 4 for pure-internal refactors
May 3, 2026
c551a7b
refactor: 2S.0-pre: ApiKeyStore.addProjectKeys() dual-format guard
May 3, 2026
795b518
docs(dial-unified-config): mark slice 2S.0-pre merged
May 3, 2026
a56bed3
refactor: 2S.1-pre: platform/ bucket plumbing — constants, factory, R…
May 3, 2026
f86f37c
docs(dial-unified-config): mark slice 2S.1-pre merged
May 3, 2026
83645a5
refactor: 2S.2-pre: ResourceType.urlSegment() decouples URL from blob…
May 3, 2026
cdce3e6
docs(dial-unified-config): mark slice 2S.2-pre merged
May 3, 2026
a573bfc
refactor: 2S.3-pre: ApiKeyStore concurrent migration + OQ-12 put-by-s…
May 3, 2026
0ca6c01
docs(dial-unified-config): mark slice 2S.3-pre merged + amend row scope
May 3, 2026
c580ae3
docs(dial-unified-config): drop slice 2S.4-pre — capability already e…
May 3, 2026
fad2822
refactor: 2S.5-pre: FileConfigStore initialOnReloadCallbacks
May 3, 2026
b47721d
docs(dial-unified-config): mark slice 2S.5-pre merged
May 3, 2026
65d8cd8
refactor: 2S.7-pre: extract ConfigPostProcessor from FileConfigStore.…
May 3, 2026
f311ab1
docs(dial-unified-config): record 2S.7-pre commit SHA
May 3, 2026
c5a115e
refactor: 2S.6-pre: move addProjectKeys into ConfigPostProcessor
May 3, 2026
af7302b
docs(dial-unified-config): mark slice 2S.6-pre merged + record 2S.7-p…
May 3, 2026
4f8b793
feat: 2S.8: introduce MergedConfigStore unioning FileConfigStore + Re…
May 3, 2026
948a10b
docs(dial-unified-config): mark slice 2S.8 merged + record Option C s…
May 3, 2026
a8f1594
feat: 2S.9: invalid-entity sibling store + skip|abort knob
May 3, 2026
fd159f7
docs(dial-unified-config): mark slice 2S.9 merged
May 3, 2026
7d9485a
feat: 2S.10: SecretFieldProcessor + dual ObjectMapper for @EncryptedF…
May 3, 2026
ac280b6
docs(dial-unified-config): mark slice 2S.10 merged
May 3, 2026
33543a7
feat: 2S.11: MODEL POST/PUT/DELETE on /v1/models/public/{name}
May 3, 2026
a1b9f43
docs(dial-unified-config): mark slice 2S.11 merged
May 3, 2026
c92d14c
feat: 2S.12: POST /v1/admin/validate model-scoped
May 3, 2026
ef0e36a
docs(dial-unified-config): mark slice 2S.12 merged
May 3, 2026
7204bea
feat: 2S.13: cross-ref validation on per-entity model writes
May 3, 2026
e272d91
docs(dial-unified-config): mark slice 2S.13 merged
May 3, 2026
dac5319
feat: 2S.14: writer-pod immediate Config swap via rebuildNow()
May 3, 2026
d3955de
docs(dial-unified-config): mark slice 2S.14 merged
May 3, 2026
4a0dc6d
feat: 1.5S.0-pre: ResourceTopic codec tolerates unknown fields
May 3, 2026
31af9e0
docs(dial-unified-config): mark slice 1.5S.0-pre merged
May 3, 2026
d322784
feat: 1.5S.1: ResourceTopic.subscribeAll for cross-cutting listeners
May 3, 2026
3f12553
docs(dial-unified-config): mark slice 1.5S.1 merged
May 3, 2026
5dabec8
feat: 1.5S.2: stamp senderPodId on every ResourceEvent
May 4, 2026
add8fd0
docs(dial-unified-config): mark slice 1.5S.2 merged
May 4, 2026
3f8cc23
feat: 1.5S.3: MergedConfigStore subscribeAll listener
May 4, 2026
679c04e
docs(dial-unified-config): mark slice 1.5S.3 merged
May 4, 2026
56c54f4
feat: 3S.0-pre: codeVerifier encryption with lazy plaintext fallback
May 4, 2026
5354b22
docs(dial-unified-config): mark slice 3S.0-pre merged
May 4, 2026
778d8f1
feat: 3S.1: BlobEntityValidator helper for apps/toolsets
May 4, 2026
8bb531d
docs(dial-unified-config): mark slice 3S.1 merged
May 4, 2026
d66af8a
feat: 3S.4: admin write paths for files/prompts/conversations (tests)
May 4, 2026
dd3917e
docs(dial-unified-config): mark slice 3S.4 merged
May 4, 2026
161d522
feat: 3S.2: write API for interceptors/roles/keys/routes/schemas
May 4, 2026
97e0934
docs(dial-unified-config): mark slice 3S.2 merged; add 3S.2-settings …
May 4, 2026
821d146
feat: 3S.2-settings: settings singleton write API + GET-from-blob
May 4, 2026
2d2e651
docs(dial-unified-config): mark slice 3S.2-settings merged
May 4, 2026
b1a47e6
feat: 3S.3: admin write paths for applications/toolsets (tests)
May 4, 2026
b4ff996
docs(dial-unified-config): mark slice 3S.3 merged with scope narrow note
May 4, 2026
c658d7f
feat: 4S.0: POST /v1/admin/apply bulk admin write endpoint
May 4, 2026
0dd7be2
docs(dial-unified-config): mark slice 4S.0 merged with unknown-kind n…
May 4, 2026
a2ea066
feat: 4S.1: POST /v1/admin/validate multi-entity batch validate
May 4, 2026
2461ada
docs(dial-unified-config): mark slice 4S.1 merged with phase-2 replac…
May 4, 2026
4093c0d
test: cover api-key→admin-role authz path on /v1/roles/platform/
May 4, 2026
92adf74
test: cover api-key→admin-role authz path on /v1/roles/platform/
May 4, 2026
5f1e72d
chore: add /dial-uc-debug for unified-config investigation with plan-…
May 5, 2026
986d324
feat: 2S.15: canonical IDs in entity.getName() for API-managed entries
May 5, 2026
3b2c52b
docs(dial-unified-config): mark slice 2S.15 merged
May 5, 2026
854a6e9
chore: add MCP wrapper slices to IMPLEMENTATION.md (Track C)
May 6, 2026
629fe05
fix: unblock PR CI — bump Netty to 4.1.133.Final and dedupe vertx-web…
May 7, 2026
18dac0f
feat: Polish.1: listing canonical IDs for API entries + dedup-by-key
May 8, 2026
70252cb
docs(dial-unified-config): mark slice Polish.1 merged with halt-at-sc…
May 8, 2026
50d8f61
feat: Polish.2: perf/correctness fixes from PR #1529 review
May 14, 2026
4dc0923
docs(dial-unified-config): mark slice Polish.2 merged with auto-mode …
May 14, 2026
2a7f4ae
fix: reject canonical-ID-shaped file map keys at load (PR #1529 threa…
May 14, 2026
e3577d4
refactor: simplify canonical-ID-shape rejection in FileConfigStore
May 14, 2026
855d971
fix: tighten canonical-ID-shape check to cover empty-bucket and trail…
May 14, 2026
34e5b0e
fix: honor If-None-Match on POST + clarify SecretFieldProcessor refer…
May 15, 2026
905c13e
fix: PR #1529 review block — event-loop stall, key-leak, auth-bearer,…
May 15, 2026
5cfeb57
fix: PR #1529 review block follow-ups — finish secret-echo hardening …
May 15, 2026
12256a9
refactor: PR #1529 review threads CS4LW/CS5Xf/CS7X2/CUlBi
May 15, 2026
8626c96
fix: PR #1529 review threads — drop dead auth check, offload admin ex…
May 15, 2026
4cb0a7c
add `lightweight` version of dial-unified-config proposal
May 16, 2026
38c0ae0
sync `lightweight` version of dial-unified-config proposal
May 18, 2026
84de002
polish `lightweight` version of dial-unified-config proposal
May 18, 2026
e50e6fb
refactor: PR #1529 review threads — virtual-thread-friendly MergedCon…
May 18, 2026
95d6f58
fix: PR #1529 review threads — drop redundant admin preflight, decode…
May 18, 2026
4d13e59
feat: 4S.3: serialize admin writes cluster-wide via AdminWriteLockSer…
May 19, 2026
9a3235c
docs(dial-unified-config): mark slice 4S.3 merged
May 19, 2026
a9f718a
feat: 4S.4: partial-update fast path for MergedConfigStore (closes OQ…
May 19, 2026
ef1a72a
docs(dial-unified-config): register slice 4S.5 + mark 4S.4 merged
May 19, 2026
3a61117
feat: 4S.5: partial-update fast path for replica pods on pub/sub
May 19, 2026
55f33f4
docs(dial-unified-config): mark slice 4S.5 merged
May 19, 2026
b1beac5
fix: PR #1529 review — author propagation + drop redundant per-resour…
May 19, 2026
e9f0944
feat: U.0: unify admin-config wire shape with existing Resource API
May 20, 2026
a580ab5
docs(dial-unified-config): mark slice U.0 merged with SIMPLIFY/REVIEW…
May 20, 2026
9d85c35
refactor: Defer.1: defer /v1/admin/export endpoint from MVP
May 20, 2026
de19d38
docs(dial-unified-config): mark slice Defer.1 merged
May 20, 2026
b0f26f7
feat: extend entity name regex to include % and :, enforce in code
May 20, 2026
f45cd86
feat: U.1: separate /v1/admin/config/file/* surface for file-sourced …
May 21, 2026
3b2818a
docs(dial-unified-config): mark slice U.1 merged
May 21, 2026
a8077b4
fix: PR #1529 thread — delegate AdminWriteLockService to per-bucket l…
May 21, 2026
8801bf9
docs(dial-unified-config): amend §1.5 projection lock; queue U.2 slice
May 21, 2026
6cf546d
fix: PR #1529 thread — O(n²) batch update in MergedConfigStore.applyB…
May 22, 2026
aef393c
refactor: PR #1529 thread — drop AdminWriteLockService wrapper
May 22, 2026
1f86966
Merge branch 'development' into feature/unified-config-server
May 23, 2026
ed5b652
feat: U.3: allow admin to set forwardAuthToken on apps/toolsets
May 26, 2026
a7f5410
refactor: U.4: remove security-admin role and *** mask sentinel
May 26, 2026
1acd285
docs(dial-unified-config): mark slices U.3 and U.4 merged
May 26, 2026
d8e10df
fix: PR #1529 thread — extend admin bucket locks to rebuild/replica/r…
May 26, 2026
68f8066
Revert "fix: PR #1529 thread — extend admin bucket locks to rebuild/r…
May 26, 2026
71d9066
fix: PR #1529 thread r3302786719 — serialize MergedConfigStore rebuil…
May 31, 2026
b5463ca
docs(dial-unified-config-lite): sync lock model with r3302786719 fix
May 31, 2026
a06cb8e
Merge branch 'development' into feature/unified-config-server
Jun 3, 2026
3458b73
Merge branch 'development' into feature/unified-config-server
Jun 3, 2026
690b5b8
docs(dial-unified-config): propose extraData duality split (OQ-34, U.5)
Jun 3, 2026
69c8656
docs(dial-unified-config-lite): sync file-config surface with U.4 key…
Jun 3, 2026
ea0a7f4
docs(dial-unified-config): pin names-only wire shape for file-config …
Jun 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions .claude/commands/dial-mvp-auto.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
---
description: Run multiple dial-mvp slices sequentially in auto-approve mode — halt only on concerns, ambiguity, test failures, or §4.1 conditions.
argument-hint: [<count> | until-blocked | until-phase-end]
allowed-tools: Read, Edit, Write, Glob, Grep, Agent, Skill, LSP, TaskCreate, TaskUpdate, TaskList, Bash(./gradlew:*), Bash(git:*), Bash(gh:*), Bash(ls:*), Bash(find:*), Bash(cat:*)
---

# Dial-MVP Auto-Mode (multi-slice batch)

Run multiple `dial-mvp` slices sequentially. Apply IMPLEMENTATION.md §2 (principles), §4 (agent loop), and §4.1 (halt conditions) exactly as `/dial-mvp` does — but the two routine halts (architect-plan approval, merge-diff approval) become **conditional**, gated by the self-tests in IMPLEMENTATION.md §4.2.

Auto-approval is **earned, not assumed**. Default to halting on uncertainty.

Argument: `$ARGUMENTS`

## Prerequisites

Same as `/dial-mvp`:

- Working tree on `feature/unified-config` (or a slice sub-branch).
- `git status` is clean.
- IMPLEMENTATION.md + project memory accessible.
- `./gradlew build -x test` runs cleanly with current credentials.

## Step 1 — Load context

Read in parallel:

- `docs/sandbox/dial-unified-config/IMPLEMENTATION.md`
- Project memory `project_unified_config_review.md`
- Project memory `project_unified_config_implementation.md`

Required before any planning.

## Step 2 — Plan the batch

Determine the slices to run from §5:

- **Filter**: status `📋` + every `Depends on` slice in status `✅`.
- **Sort**: by phase, then by slice ID.
- **Cap by `$ARGUMENTS`**:
- empty or `until-blocked` → all runnable slices until any halt.
- integer (`3`) → exactly that many slices.
- `until-phase-end` → run until the next phase boundary in §5.

Print the batch list to the user: slice IDs, titles, deps satisfied, est. track. **Halt for the user's confirmation that the batch is correct before starting.** This is the only mandatory halt at the start of the batch.

## Step 3 — Per-slice loop with conditional halts

For each slice in the confirmed batch:

1. **Branch**: cut `feature/unified-config-<slice-id>-<short-title>` from the latest `feature/unified-config`. Hyphen separator (§3.2).

2. **EXPLORE** *(skippable per `/dial-mvp` rules)* — feature-dev:code-explorer; LSP `documentSymbol` / `workspaceSymbol`.

3. **ARCHITECT** — feature-dev:code-architect produces the file-level plan. Run the **§A self-test** (IMPLEMENTATION.md §4.2):
- If **every item passes** → proceed without asking. Print: `[<slice-id>] ARCHITECT auto-proceed (N/N self-test items passed)`.
- If **any item is uncertain or false** → halt per §4.1 format. Wait.

4. **IMPLEMENT** — execute the approved plan; TDD; run `./gradlew checkstyleMain :server:test` and module-specific tests.

5. **SIMPLIFY** — invoke the `simplify` skill on changed files.

6. **REVIEW** — feature-dev:code-reviewer; LSP `findReferences` on touched methods.

7. **MERGE LOCALLY** — run the **§B self-test** (IMPLEMENTATION.md §4.2):
- If **every item passes** → squash-merge per `/dial-mvp` step 7 procedure (a–h). Print: `[<slice-id>] MERGED auto (N/N self-test items passed) → <short-sha>`.
- If **any item is uncertain or false** → halt per §4.1 format. Wait.

8. **Inter-slice progress**: print one-line summary `[N/M slices done, next: <slice-id>]`.

## Stop conditions

- Batch completed → print summary (slices merged, short-SHAs, brief titles) and stop.
- Any §4.1 halt condition triggered → halt as documented; do not continue.
- Any §4.2 self-test fails → halt as documented; do not continue.
- `$ARGUMENTS` count reached → print summary, stop.

## Important

- **Use only for mechanical or semi-mechanical slices** — Phase-3 entity-type sweep (3S.2 after the first type validates the pattern), Phase-3 CLI extension (3C.0), Phase-2 prereqs that are isolated refactors (2S.0-pre, 2S.1-pre, 2S.2-pre), MCP read-tools sweep (**M.1.1**, after M.1.0 pattern locked), MCP write-tools sweep (**M.2.1**, after M.2.0 pattern locked).
- **Don't use for high-uncertainty slices** — 1S.0 bootstrap, 2S.8 `MergedConfigStore`, 2S.10 `SecretFieldProcessor`, 4S.0 apply endpoint. Use plain `/dial-mvp <id>` for those — every halt becomes a real halt and the user reviews the architect plan and the diff.
- The user pre-approves the **batch** at Step 2, not the individual slices. Each slice's self-tests still gate auto-proceed at the architect and merge halts.
- Self-test items are **halt triggers, not pass-fail booleans the orchestrator gets to game**. When in doubt, halt.
- All other rules from `/dial-mvp` apply: §4.1 halt conditions, §3.2 branching, §3.5 commit format, §8 doc-amendment lifecycle.
- After the batch completes or halts, stop and hand off to the user. The next batch begins on the user's signal in a fresh session.
87 changes: 87 additions & 0 deletions .claude/commands/dial-mvp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
---
description: Resume the dial-unified-config MVP — pick or continue a slice from IMPLEMENTATION.md and run the agent loop.
argument-hint: [<slice-id> | status]
allowed-tools: Read, Edit, Write, Glob, Grep, Agent, Skill, LSP, TaskCreate, TaskUpdate, TaskList, Bash(./gradlew:*), Bash(git:*), Bash(gh:*), Bash(ls:*), Bash(find:*), Bash(cat:*)
---

# Dial-Unified-Config MVP Orchestrator

You are the orchestrator for the dial-unified-config MVP implementation. The execution playbook is at `docs/sandbox/dial-unified-config/IMPLEMENTATION.md`. Apply its rules — especially principles §2, the agent loop §4, and the halt conditions §4.1 — to every step.

Argument: `$ARGUMENTS`

## Prerequisites

- The repo is on or near `feature/unified-config` (or you can switch to it).
- `IMPLEMENTATION.md` exists at `docs/sandbox/dial-unified-config/IMPLEMENTATION.md`.

## Step 1 — Load context

Read in parallel:

- `docs/sandbox/dial-unified-config/IMPLEMENTATION.md`
- The project memory entries: search the user's memory directory for `project_unified_config_review.md` and `project_unified_config_implementation.md`. Both are required context.

Do not proceed past this step until both files are loaded.

## Step 2 — Determine the slice

Interpret `$ARGUMENTS`:

- **Empty**: list every slice in §5 with status `📋` or `🚧` or `🔍`. Recommend the first `📋` slice whose dependencies are all `✅`. Ask the user to confirm the recommendation or pick a different slice ID. Stop and wait.
- **`status`**: print a short status report — counts by status, currently in-flight slices, blocked slices (whose deps aren't merged) — and stop. Do not start any work.
- **A slice ID** (e.g. `1S.0`, `2S.11`, `1C.2`): jump to Step 3 with that slice. If its dependencies aren't all `✅`, halt per §4.1 and surface the dependency gap before proceeding.

## Step 3 — Run the agent loop (§4 of IMPLEMENTATION.md)

For the chosen slice:

1. **Branch**: ensure you're on a sub-branch named `feature/unified-config-<slice-id>-<short-title>` (hyphen separator — slash is rejected by Git because `feature/unified-config` is itself a branch ref) cut from the latest `feature/unified-config`. Create it if missing. The current `git status` should be clean.

2. **EXPLORE** *(skip if the code area is already known this session)* — dispatch `feature-dev:code-explorer` to trace existing patterns in the touched area. Use LSP `documentSymbol` / `workspaceSymbol` to map class shapes; reach for grep only when LSP can't resolve (jclouds-dependent files in `:credentials` — see IMPLEMENTATION.md §7.5). Output: file paths + 5-line summary per layer.

3. **ARCHITECT** — dispatch `feature-dev:code-architect` with the design anchors from the slice's row, the principles in §2, and the Explore output. **Verify each design-doc anchor with LSP before producing the plan** — does the cited class/method exist with the expected signature on the expected line? Stale anchors trigger halt condition §4.1 #2. Produce a file-level plan citing the design anchor for each design decision. **Halt and present the plan to the user for approval before any code changes.**

4. **IMPLEMENT** — execute the approved plan as a fork or `general-purpose` agent (use `isolation: "worktree"` if the slice is independent of in-flight work). Before changing a method signature or extending a class, use LSP `findReferences` / `incomingCalls` to bound the blast radius — if it exceeds the slice plan, halt per §4.1 #3 (scope drift). TDD: write the integration test first using the `ResourceApiTest` pattern, then make it pass. Run `./gradlew checkstyleMain :server:test` (and the relevant module-specific tests) before reporting done.

5. **SIMPLIFY** — invoke the `simplify` skill on the changed files. Apply principles §2.1 / §2.2 (Simplicity First, Surgical Changes). Fix issues found; do not touch unrelated code.

6. **REVIEW** — dispatch `feature-dev:code-reviewer` for a final pre-PR pass. Focus areas: bugs, Vert.x event-loop violations (§7.3), security, naming alignment with the locked vocabulary (§2.3), test coverage. Use LSP `findReferences` on every method the slice modified to confirm surgical-cleanup orphaned nothing (§2.2). Ignore LSP diagnostics on files the slice didn't touch — they aren't introduced by your work.

7. **MERGE LOCALLY** — once SIMPLIFY + REVIEW pass cleanly:

a. Verify `git status` is clean on the slice sub-branch.
b. Present the slice diff (`git diff feature/unified-config..HEAD`) and a draft commit message in IMPLEMENTATION.md §3.5 format. **Halt for the user's approval** before merging.
c. Switch to integration: `git checkout feature/unified-config`.
d. Squash-merge: `git merge --squash <sub-branch>` (stages all sub-branch changes without committing).
e. Commit with the approved message via HEREDOC; include the `Co-Authored-By` trailer.
f. Delete the sub-branch: `git branch -D <sub-branch>`.
g. Update IMPLEMENTATION.md §5: slice `Status` `🚧` → `✅`, fill the `Commit` column with the squash commit's short SHA.
h. Stop and hand off to the user. The next slice begins on the user's signal in a fresh session.

## Step 4 — Update the slice register

After each transition, edit `docs/sandbox/dial-unified-config/IMPLEMENTATION.md` §5: update the slice's `Status` column (`📋` → `🚧` → `🔍` → `✅`) and `PR` column. Never re-number slice IDs — they are stable references.

## Halt conditions (§4.1 — non-negotiable)

Stop the loop and ask the user when:

- Discovered constraint contradicts the plan (e.g. CI mismatch, missing dependency).
- Existing code differs materially from the design-doc anchors (renamed class, moved file, changed signature).
- Slice scope would need to grow beyond its register row.
- Tests fail in ways the architect plan didn't predict.
- A cross-slice contract change is implied by the current work.
- A locked decision in §9 or memory needs amending to make progress.
- Implementation would require violating a §2 principle.
- Two or more readings of the design are equally valid.

**Halt format**: (1) what was discovered, (2) why it blocks the current path, (3) two-or-three options with trade-offs, (4) your recommendation, (5) wait. Do not proceed until the user responds. Do not start parallel "just-in-case" work.

## Important

- The user is the only approver of architect plans, slice diffs, and halt-decisions. There is no per-slice formal code-owner review — that happens once at MVP-complete via the big PR `feature/unified-config` → `development`.
- **Track C (MCP)** slices use the same agent loop and halt rules as Track A / B. Slice ID prefix `M.*` (e.g. `M.0-pre`, `M.1.0`, `M.2.1`). MCP read tools depend on Phase 1 read API; write tools on Phase 2/3. See IMPLEMENTATION.md §5.6 for the full register.
- Update slice statuses as you go; don't batch the edits to the end.
- If a review round amends a design doc, also add a one-line entry to the project memory `project_unified_config_review.md` per IMPLEMENTATION.md §8.
- After the slice is squash-merged into `feature/unified-config`, stop and hand off to the user. The next slice begins on the user's signal in a fresh session.
Loading
Loading