Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 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
ff2ae5d
feat: 1C.0: bootstrap :cli module with Picocli + Quarkus skeleton
May 4, 2026
3581ed6
docs(dial-unified-config): mark slice 1C.0 merged with B1 keystore de…
May 4, 2026
9f4efd7
feat: 1C.1: dial-cli env list / current / use / check
May 5, 2026
700bc74
docs(dial-unified-config): mark slice 1C.1 merged with config-only en…
May 5, 2026
f1fcbf3
feat: 1C.2: dial-cli model get / list + get-models alias + HTTP client
May 5, 2026
3770541
docs(dial-unified-config): mark slice 1C.2 merged with HTTP-pattern d…
May 5, 2026
c987893
feat: 1C.3: extend dial-cli read to 8 admin-config types
May 5, 2026
c1b5e4d
docs(dial-unified-config): mark slice 1C.3 merged with Reading A scop…
May 5, 2026
862bbea
feat: 1C.4: dial-cli export streams /v1/admin/export to stdout / file
May 5, 2026
8b589d2
docs(dial-unified-config): mark slice 1C.4 merged with format-negotia…
May 5, 2026
4e5f69a
feat: 1C.5: dial-cli diff --source --target structural diff
May 5, 2026
b233c03
docs(dial-unified-config): mark slice 1C.5 merged with structural-dif…
May 5, 2026
ef978b3
feat: 1C.6: dial-cli completion bash | zsh | fish
May 5, 2026
110cb4d
docs(dial-unified-config): mark slice 1C.6 merged with fish caveat
May 5, 2026
6ba4aa5
feat: 2C.0: dial-cli model add (POST) with --dry-run
May 5, 2026
da46aa6
docs(dial-unified-config): mark slice 2C.0 merged with design-call notes
May 5, 2026
0695d5f
chore: add /dial-uc-debug for unified-config investigation with plan-…
May 5, 2026
c2bdd1a
feat: 2C.1: dial-cli model update (PUT) with --set + --if-match
May 5, 2026
4fdc537
docs(dial-unified-config): mark slice 2C.1 merged with design-call notes
May 5, 2026
de4e833
feat: 2C.2: dial-cli model delete with --if-match
May 5, 2026
4b92b7d
docs(dial-unified-config): mark slice 2C.2 merged with design-call notes
May 5, 2026
4fafbdb
feat: 2C.3: dial-cli model validate against POST /v1/admin/validate
May 5, 2026
674aa3e
docs(dial-unified-config): mark slice 2C.3 merged with design-call notes
May 5, 2026
188f143
feat: 2C.4: dial-cli model promote --from --to (as-is mode)
May 5, 2026
cb24aa5
docs(dial-unified-config): mark slice 2C.4 merged with Option A narro…
May 5, 2026
4adfd76
feat: 2C.5: dial-cli model diff --source --target (single-type)
May 5, 2026
2d0f05e
docs(dial-unified-config): mark slice 2C.5 merged with design-call notes
May 5, 2026
e0e1039
feat: 2S.15: canonical IDs in entity.getName() for API-managed entries
May 5, 2026
ace3397
docs(dial-unified-config): mark slice 2S.15 merged
May 5, 2026
88a9586
feat: 3C.0: dial-cli write commands for all admin-config entity types
May 5, 2026
295f9f3
docs(dial-unified-config): mark slice 3C.0 merged
May 5, 2026
861e112
fix: declare cli lombok task ordering vs Quarkus generated-sources co…
May 5, 2026
74acbba
feat: 4C.0: dial-cli apply -f for fully-resolved manifests
May 5, 2026
a23c766
docs(dial-unified-config): mark slice 4C.0 merged
May 5, 2026
ba8d6d5
chore: Dist.1: bundle dial-cli uber-jar into ai-dial-core image
May 5, 2026
b8c4165
docs(dial-unified-config): rewrite 09-mcp-spec as unified building-bl…
May 5, 2026
357b61e
docs(dial-unified-config): file Cli.1 + Cli.2 follow-ons surfaced by …
May 5, 2026
4bd537c
fix: Cli.1: honor DIAL_CLI_CONFIG env var in ProfileLoader
May 5, 2026
2369fac
fix: Cli.2: wire dial-cli --version via @Command version attribute
May 5, 2026
bd444b4
docs(dial-unified-config): tighten 09-mcp-spec M4 wording and summary…
May 5, 2026
ca335d3
docs(dial-unified-config): drop 09-mcp-spec Success Metrics section
May 5, 2026
7ff1844
chore: Dist.2: sample/dial-cli/ newcomer playground
May 5, 2026
94bf1f3
docs(dial-unified-config): pivot 09-mcp-spec to v0.3 in-repo Java module
May 6, 2026
e702dfb
docs(dial-unified-config): resolve all 8 MCP-OQs in 09-mcp-spec (v0.4)
May 6, 2026
5367a0c
mcp spec polishing
May 6, 2026
bf35623
chore: add MCP wrapper slices to IMPLEMENTATION.md (Track C)
May 6, 2026
5a60bf9
feat: M.0-pre: bootstrap :mcp Gradle module + /mcp 503 stub
May 6, 2026
736235f
docs: M.0-pre: backfill commit SHA in §5.6 register
May 6, 2026
bc1459e
feat: M.0.0-bridge: wire Vert.x ↔ MCP-SDK Streamable HTTP transport
May 6, 2026
c66f0a5
docs: M.0.0-bridge: backfill commit SHA in §5.6 register
May 6, 2026
f07c786
feat: M.0.1-pre: lock captured-context bridge and add DialClient loop…
May 6, 2026
94d0021
docs: M.0.1-pre: backfill commit SHA in §5.6 register
May 6, 2026
31cd5e4
feat: M.0.2-pre: per-session rate-limit and concurrency cap for MCP
May 6, 2026
00caaad
docs: M.0.2-pre: backfill commit SHA in §5.6 register
May 6, 2026
5b9e174
docs: Dist.2: fix docker-alias profile path, expand README with verb …
May 6, 2026
4bcff44
feat: M.1.0: read tools bootstrap for DIAL MCP — describe_schema, lis…
May 7, 2026
cc150a9
docs: M.1.0: backfill commit SHA in §5.6 register
May 7, 2026
23c00e2
feat: M.1.1: read-tools entity-type sweep — full 12-type catalog + hi…
May 7, 2026
3c7f222
docs: M.1.1: backfill commit SHA + slice retrospective in §5.6 register
May 7, 2026
313b351
feat: M.2.0: bootstrap dial_create/update/delete_resource MCP write t…
May 7, 2026
06c37af
docs: M.2.0: mark slice ✅ and capture write-tools retrospective
May 7, 2026
b12cf0d
feat: M.2.1: extend MCP write tools to settings + files DELETE specials
May 7, 2026
1a6c1b0
docs: M.2.1: mark slice ✅ and capture write-tools sweep retrospective
May 7, 2026
7cacc4f
chore: insert M.3.1-handshake-readiness slice (Track C)
May 7, 2026
f7769e1
feat: M.3.1-handshake-readiness: defer /mcp dispatch until McpVerticl…
May 7, 2026
35ff5dd
docs: M.3.1: mark slice ✅ and capture handshake-readiness retrospective
May 7, 2026
9ee807e
feat: M.3.0: ship dial_upload_file + dial_download_file MCP tools
May 7, 2026
b576135
docs: M.3.0: mark slice ✅ and capture file-tools retrospective
May 7, 2026
12ba627
feat: M.4.0: ship dial_publish_resource MCP tool
May 7, 2026
45568ea
docs: M.4.0: mark slice ✅ and capture publication-tool retrospective
May 7, 2026
3b7bcd9
fix: unblock PR CI — bump Netty to 4.1.133.Final and dedupe vertx-web…
May 7, 2026
9bd05d6
ci: ignore epoll CVE-2026-42577 in Trivy and bypass ORT until upstrea…
May 8, 2026
04c4dce
Revert "ci: ignore epoll CVE-2026-42577 in Trivy and bypass ORT until…
May 8, 2026
811d235
feat: Polish.1: listing canonical IDs for API entries + dedup-by-key
May 8, 2026
30e4e28
docs(dial-unified-config): mark slice Polish.1 merged with halt-at-sc…
May 8, 2026
1da4a89
feat: Cli.3: -o INHERIT scope + friendly HTTP errors + strip-projecti…
May 8, 2026
78a69ef
docs(dial-unified-config): backfill Cli.3 commit SHA
May 8, 2026
299885a
feat: Cli.4: --from-file accepts manifest envelopes on add/validate
May 9, 2026
a1b7a17
docs(dial-unified-config): backfill Cli.4 commit SHA
May 9, 2026
bbc03a5
docs(dial-unified-config): promote 4C.1–4C.5 + 4C.7 into MVP scope
May 9, 2026
fb11db6
feat: 4C.1: template DSL (extends/includes/!if/!for + functions + pla…
May 10, 2026
9faa33f
docs(dial-unified-config): mark slice 4C.1 merged with retrospective
May 10, 2026
200f2e3
feat: 4C.7: dial-cli apply -f accepts a directory
May 10, 2026
1b68471
docs(dial-unified-config): mark slice 4C.7 merged with retrospective
May 10, 2026
5d118a2
feat: 4C.4: ${SECRET:*} resolver via System.getenv + ${ENV_VAR} fallback
May 10, 2026
c757a0f
docs(dial-unified-config): mark slice 4C.4 merged with retrospective
May 10, 2026
b4dce13
feat: 4C.2: dial-cli apply --overlay env-overlay support
May 11, 2026
69f80ec
docs(dial-unified-config): mark slice 4C.2 merged with retrospective
May 11, 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