Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
432ae3b
fix(logging): remove console logging for warning level in MigrationPl…
MrHinsh Jun 8, 2026
67a2425
fix(features): remove obsolete feature files for resume mode, identit…
MrHinsh Jun 8, 2026
fb8322e
migrate: agent-job-context feature → DSL
MrHinsh Jun 8, 2026
2debb02
migrate: config-polymorphic-endpoint-config feature → DSL
MrHinsh Jun 8, 2026
07d4aeb
feat(features): remove scenarios with confirmed DSL test coverage
MrHinsh Jun 8, 2026
72f8435
test: discovery-cross-project-link-detection — Detect cross-organisat…
MrHinsh Jun 8, 2026
8dd0a8d
migrate: discovery-cross-project-link-detection feature → DSL
MrHinsh Jun 8, 2026
530dcb6
test: discovery-dependency-discovery-execution — Resume dependency di…
MrHinsh Jun 8, 2026
dfa949a
migrate: discovery-dependency-discovery-execution feature → DSL
MrHinsh Jun 8, 2026
d13f199
test: field-transform-field-transform-pipeline — all 4 scenarios mapp…
MrHinsh Jun 8, 2026
991fcf4
test: iproject-analyser-removal-US3-iproject-analyser-removed — Solut…
MrHinsh Jun 8, 2026
8737ced
migrate: iproject-analyser-removal-US3-iproject-analyser-removed feat…
MrHinsh Jun 8, 2026
b48cb00
test: add verification PASS for iproject-analyser-removal-US3
MrHinsh Jun 8, 2026
088a8dc
test: job-execution-plan — all 4 scenarios mapped to DSL
MrHinsh Jun 8, 2026
0ff2a79
migrate: job-execution-plan feature → DSL
MrHinsh Jun 8, 2026
c2dff5f
test: jobs-job-lifecycle — all 4 lifecycle scenarios mapped to DSL
MrHinsh Jun 8, 2026
97feb54
migrate: jobs-job-lifecycle feature → DSL
MrHinsh Jun 8, 2026
5aada80
docs: jobs-job-lifecycle verification PASS
MrHinsh Jun 8, 2026
15af0d8
test: jobs-job-submission — all 4 scenarios mapped to DSL
MrHinsh Jun 8, 2026
b50b0f9
migrate: jobs-job-submission feature → DSL
MrHinsh Jun 8, 2026
78bf26e
docs: jobs-job-submission DSL migration output artifacts
MrHinsh Jun 8, 2026
9750e8f
test: module-isolation — all 4 scenarios mapped to DSL
MrHinsh Jun 8, 2026
d5cafda
migrate: module-isolation feature -> DSL (output artifacts)
MrHinsh Jun 8, 2026
485e238
test: observability-diagnostics-streaming — all 3 scenarios mapped to…
MrHinsh Jun 8, 2026
7d117be
migrate: observability-diagnostics-streaming feature → DSL
MrHinsh Jun 8, 2026
42f4e29
test: observability-log-download — Download progress log file from th…
MrHinsh Jun 8, 2026
9824ec8
migrate: observability-log-download feature → DSL
MrHinsh Jun 8, 2026
258a41c
test: observability-package-diagnostics-sink — all 5 scenarios mapped…
MrHinsh Jun 8, 2026
c895c88
migrate: observability-package-diagnostics-sink feature → DSL
MrHinsh Jun 8, 2026
f1d9adb
test: observability-package-progress-sink — Progress sink writes are …
MrHinsh Jun 8, 2026
d223899
migrate: observability-package-progress-sink feature → DSL
MrHinsh Jun 8, 2026
75f9984
fix(build): resolve NuGet package downgrade errors from ServiceDiscov…
MrHinsh Jun 8, 2026
47bc43d
test: observability-tiered-log-levels — Agent writes at its configure…
MrHinsh Jun 8, 2026
f9f59d7
test: observability-tiered-log-levels — Standalone mode aligns contro…
MrHinsh Jun 8, 2026
bc5f1a2
feat: add workflows and prompts for nkda-testdsl migration; update ve…
MrHinsh Jun 8, 2026
b465c31
migrate: observability-tiered-log-levels feature → DSL
MrHinsh Jun 8, 2026
3987229
test: package-lock-exclusive-package-lock — all 3 scenarios mapped to…
MrHinsh Jun 8, 2026
9bc0495
migrate: package-lock-exclusive-package-lock feature → DSL
MrHinsh Jun 8, 2026
6d287ee
docs: package-lock-exclusive-package-lock DSL migration output artifacts
MrHinsh Jun 8, 2026
3813f22
test: parallel-module-execution — Import tier-0 tasks start concurren…
MrHinsh Jun 8, 2026
70953ac
migrate: parallel-module-execution feature → DSL
MrHinsh Jun 8, 2026
5d6afa3
docs: parallel-module-execution verification PASS
MrHinsh Jun 8, 2026
7183de0
test: plan-driven-execution — ForceFresh deletes plan file and rebuil…
MrHinsh Jun 8, 2026
dfb82e3
migrate: plan-driven-execution feature → DSL
MrHinsh Jun 8, 2026
831aab1
test: prepare-phase — Prepare discovers target identities and produce…
MrHinsh Jun 8, 2026
21657d7
test: prepare-phase — Import proceeds/logs warning mapped to DSL
MrHinsh Jun 8, 2026
01641ee
migrate: configuration-flow feature → DSL
MrHinsh Jun 8, 2026
d07ec7a
test: project-lifecycle-ephemeral-project-lifecycle — Eligible run cr…
MrHinsh Jun 8, 2026
6321e8d
migrate: project-lifecycle-ephemeral-project-lifecycle feature → DSL
MrHinsh Jun 8, 2026
b27c0e0
test: runtime-state-authority-US1-authoritative-state-scopes — Resume…
MrHinsh Jun 8, 2026
aad06d8
migrate: runtime-state-authority-US1-authoritative-state-scopes featu…
MrHinsh Jun 8, 2026
83d4824
migrate(partial): commands-execute-successfully 0 scenarios retired
MrHinsh Jun 8, 2026
a104b26
test: runtime-state-cadence-US3-fine-grained-progress-save-cadence — …
MrHinsh Jun 8, 2026
f94982f
migrate: runtime-state-cadence-US3-fine-grained-progress-save-cadence…
MrHinsh Jun 8, 2026
78d265c
test: runtime-state-identity-US2-action-qualified-cursors — CursorIde…
MrHinsh Jun 8, 2026
ef35a8d
test: task-attribution — all 4 scenarios mapped to DSL
MrHinsh Jun 8, 2026
21ebef6
migrate: host-builder-architecture feature → DSL
MrHinsh Jun 8, 2026
e822303
migrate: task-attribution feature → DSL
MrHinsh Jun 8, 2026
ebb9612
docs: task-attribution DSL migration output artifacts
MrHinsh Jun 8, 2026
5216816
test: telemetry-data-classification-filtering — Customer-classified l…
MrHinsh Jun 8, 2026
dbc4dab
migrate: telemetry-data-classification-filtering feature → DSL
MrHinsh Jun 8, 2026
139c246
test: telemetry-idempotency-metric-registration — Deferred idempotenc…
MrHinsh Jun 8, 2026
9b2c204
migrate: telemetry-idempotency-metric-registration feature -> DSL
MrHinsh Jun 8, 2026
6bbf973
test: telemetry-in-flight-concurrency-metrics — In-flight counter ref…
MrHinsh Jun 8, 2026
11e2fe4
migrate: telemetry-in-flight-concurrency-metrics feature → DSL
MrHinsh Jun 8, 2026
02a36e5
test: telemetry-metric-snapshot-relay — all 6 scenarios mapped to DSL
MrHinsh Jun 8, 2026
03d71a7
migrate: telemetry-metric-snapshot-relay feature -> DSL
MrHinsh Jun 8, 2026
719d915
test: telemetry-otel-cloud-export — all 5 scenarios mapped to DSL
MrHinsh Jun 8, 2026
8bc5649
migrate: telemetry-otel-cloud-export feature → DSL
MrHinsh Jun 8, 2026
5276676
docs: telemetry-otel-cloud-export DSL migration artifacts
MrHinsh Jun 8, 2026
672efbd
test: telemetry-progress-sink — all 3 scenarios mapped to DSL
MrHinsh Jun 8, 2026
5f6950d
migrate: telemetry-progress-sink feature → DSL
MrHinsh Jun 8, 2026
833b6d0
docs: telemetry-progress-sink DSL migration output artifacts
MrHinsh Jun 8, 2026
ada1433
test: telemetry-tui-metrics-panel — Telemetry endpoint 204/200/400 ma…
MrHinsh Jun 8, 2026
6bff91d
test: telemetry-tui-metrics-panel — TUI panel waiting/display/polling…
MrHinsh Jun 8, 2026
c0a1300
migrate: telemetry-tui-metrics-panel feature → DSL
MrHinsh Jun 8, 2026
58050f5
test: validation-package-validation — all scenarios mapped to DSL
MrHinsh Jun 8, 2026
7e4b8f2
migrate: validation-package-validation feature → DSL
MrHinsh Jun 8, 2026
661b18c
test: validation-post-flight-correctness-metrics — all 4 scenarios ma…
MrHinsh Jun 8, 2026
914db96
migrate: validation-post-flight-correctness-metrics feature → DSL
MrHinsh Jun 8, 2026
aff3c4c
migrate: module-isolation feature → DSL (cleanup)
MrHinsh Jun 8, 2026
8291929
chore: stage workflow rename and migration artefact cleanup
MrHinsh Jun 9, 2026
eec594b
fix(tests): fix commands-execute-successfully tests against real CLI …
MrHinsh Jun 9, 2026
e465073
fix(workflow): default DSL migration scope to features/platform not t…
MrHinsh Jun 9, 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
1 change: 1 addition & 0 deletions .agents/configure.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ Ensure-Symlink '.claude\skills' '..\.agents\skills'
Ensure-Symlink '.claude\agents' '..\.agents\agents'
Ensure-Symlink '.claude\commands' '..\.agents\commands'
Ensure-Symlink '.claude\prompts' '..\.agents\prompts'
Ensure-Symlink '.claude\workflows' '..\.agents\workflows'

# -- .github symlinks --------------------------------------------------------
Write-Host ""
Expand Down
14 changes: 10 additions & 4 deletions .agents/skills/nkda-testdsl-autonomous/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,18 +85,24 @@ Run `nkda-testdsl-refactor` → produce `05-refactor-summary.md`.

Run `nkda-testdsl-verification` → produce `06-verification.md`.

- Run converted/affected tests first.
**Verification gate — ALL of the following must pass before ANY commit:**

1. **Scenario unit tests pass** — run `dotnet test <test-project> --filter "FullyQualifiedName~<TestClass>"` for each new or modified test class. Every mapped test must be green.
2. **Full solution build passes** — run `dotnet build` from the repo root. Zero errors. A build failure is a hard blocker — fix it before proceeding, do not commit around it.
3. **Full unit test suite passes** — run `dotnet test` from the repo root. Every test in every project must pass. A failure in ANY test project, even one unrelated to this family, must be investigated and fixed before committing.

**Do not commit if any of these three gates fail.** Fix the failure first.

- Verify every retired scenario has a mapped passing test with `path:line` evidence.
- If all scenarios are retired and tests are green, run the full repository test suite.
- If verification returns `PASS`:
- If all three gates pass:
- Delete the `.feature` file.
- Delete any generated `.feature.cs` and legacy `*Steps.cs` scoped to wiring state.
- **Commit all changes** with message: `migrate: <family-name> feature → DSL`.
- If verification returns `BLOCKED` or `FAIL`:
- Retain the `.feature` file (with only unconverted scenarios remaining).
- Record the reason in `06-verification.md`.
- **Append every retained scenario as an entry in `analysis/dsl-gaps-detected.md`** with the gap-type, family, file path, scenario title, wiring state, and specific engineering detail. Do not leave a scenario retained without a gap entry.
- **Commit partial progress** (retired scenarios removed, new tests added, gap entries written) with message: `migrate(partial): <family-name> <N> scenarios retired`.
- Only commit partial progress once gates 1–3 above are satisfied for the work done so far: `migrate(partial): <family-name> <N> scenarios retired`.

### Step 11 — Report and stop

Expand Down
9 changes: 6 additions & 3 deletions .agents/skills/nkda-testdsl-verification/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,14 @@ description: Use when conversion and refactor are done and parity, artefact remo

## Required Test Execution Order

1. Run the converted/affected feature-family tests first.
1. Run the converted/affected feature-family tests first (`dotnet test <project> --filter "FullyQualifiedName~<TestClass>"`). Every mapped test must be green before proceeding.
2. Score any intent-derived tests with test-validity dimensions and reject `WASTE` or `LOW VALUE` tests.
3. Confirm scenario inventory coverage and tag compliance are complete.
4. If and only if tests are green, validity gate passes, and inventory/tag checks pass, run the full repository test suite.
5. Record commands, outcomes, validity scores, and inventory/tag verdict in `06-verification.md`.
4. Run `dotnet build` from the repo root. If the build fails, return `FAIL` immediately — do not proceed. Investigate and fix any break, including NuGet version conflicts or compilation errors introduced by this or prior migrations.
5. If and only if the build succeeds, tests are green, validity gate passes, and inventory/tag checks pass, run `dotnet test` from the repo root (the full unit test suite across all projects).
6. Record commands, outcomes, build result, validity scores, and inventory/tag verdict in `06-verification.md`.

**A commit must never be made unless all three — scenario tests green, full build green, full test suite green — are confirmed in that order.**

## Artefact Deletion Gate

Expand Down
313 changes: 313 additions & 0 deletions .agents/workflows/nkda-testdsl-workflow.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
export const meta = {
name: 'nkda-testdsl-workflow',
description: 'Migrate Reqnroll feature families to internal DSL — enumerate all files, process each sequentially through the full phase pipeline',
phases: [
{ title: 'Enumerate', detail: 'Discover all .feature files and filter already-PASS families' },
{ title: 'Assessment', detail: 'Run nkda-testdsl-feature-assessment for the current family' },
{ title: 'DSL Design', detail: 'Run nkda-testdsl-dsl-design for the current family' },
{ title: 'Extraction', detail: 'Run nkda-testdsl-extraction for the current family' },
{ title: 'Conversion', detail: 'Run nkda-testdsl-feature-conversion for the current family' },
{ title: 'Refactor', detail: 'Run nkda-testdsl-refactor for the current family' },
{ title: 'Verification', detail: 'Run nkda-testdsl-verification and commit for the current family' },
],
}

// args: feature family name, folder path, or feature file path.
// If omitted, defaults to the canonical feature folder.
const scope = args || 'features/platform'

// ---------------------------------------------------------------------------
// Phase: Enumerate
// ---------------------------------------------------------------------------
phase('Enumerate')

const ENUMERATE_SCHEMA = {
type: 'object',
properties: {
files: {
type: 'array',
items: {
type: 'object',
properties: {
featureFilePath: { type: 'string' },
familyName: { type: 'string' },
alreadyPassed: { type: 'boolean' },
},
required: ['featureFilePath', 'familyName', 'alreadyPassed'],
},
},
},
required: ['files'],
}

const enumResult = await agent(
`You are enumerating Reqnroll .feature files for migration scope: "${scope}".

Tasks:
1. Find all .feature files under the scope path (or the single file if a file path was given).
2. For each file, derive the family name (the .feature filename without extension, or use folder-based naming if multiple files share a folder).
3. For each family, check whether .output/nkda-testdsl/<family-name>/06-verification.md exists AND contains a PASS verdict. If both conditions are true, set alreadyPassed=true.
4. Return every file including already-passed ones so the workflow can report them.

Return a structured list.`,
{ label: 'enumerate:scope', phase: 'Enumerate', schema: ENUMERATE_SCHEMA }
)

if (!enumResult || enumResult.files.length === 0) {
log('No .feature files found in scope. Nothing to do.')
} else {
const pending = enumResult.files.filter(f => !f.alreadyPassed)
const skipped = enumResult.files.filter(f => f.alreadyPassed)

if (skipped.length > 0) {
log(`Skipping ${skipped.length} already-PASS families: ${skipped.map(f => f.familyName).join(', ')}`)
}

if (pending.length === 0) {
log('All families already have PASS verdicts. Nothing to migrate.')
} else {
log(`Processing ${pending.length} families sequentially: ${pending.map(f => f.familyName).join(', ')}`)

// ---------------------------------------------------------------------------
// Sequential loop: one family fully completes (all phases + commit) before
// the next starts. This is required because:
// - all families share tests/DevOpsMigrationPlatform.Testing
// - only one dotnet test run can execute at a time
// - git commits must be sequential
// ---------------------------------------------------------------------------

const PHASE_SCHEMA = {
type: 'object',
properties: {
familyName: { type: 'string' },
status: { type: 'string', enum: ['ok', 'blocked', 'failed'] },
outputFile: { type: 'string' },
summary: { type: 'string' },
},
required: ['familyName', 'status', 'outputFile', 'summary'],
}

const VERIFICATION_SCHEMA = {
type: 'object',
properties: {
familyName: { type: 'string' },
verdict: { type: 'string', enum: ['PASS', 'BLOCKED', 'FAIL'] },
migratedScenarios: { type: 'array', items: { type: 'string' } },
blockedScenarios: { type: 'array', items: { type: 'string' } },
failedScenarios: { type: 'array', items: { type: 'string' } },
wiringState: { type: 'string' },
commitSha: { type: 'string' },
commitMessage: { type: 'string' },
summary: { type: 'string' },
},
required: ['familyName', 'verdict', 'migratedScenarios', 'blockedScenarios', 'failedScenarios', 'wiringState', 'summary'],
}

const results = []

for (const file of pending) {
log(`Starting family: ${file.familyName} (${file.featureFilePath})`)
let blocked = false
let blockReason = ''

// --- Phase: Assessment ---
phase('Assessment')
const assessment = await agent(
`Run the nkda-testdsl-feature-assessment skill for feature family "${file.familyName}".
Feature file: ${file.featureFilePath}

Follow the skill exactly as written in .agents/skills/nkda-testdsl-feature-assessment/SKILL.md.
Produce:
- .output/nkda-testdsl/${file.familyName}/00-scenario-test-inventory.md
- .output/nkda-testdsl/${file.familyName}/01-feature-assessment.md

Return structured output.`,
{ label: `assessment:${file.familyName}`, schema: PHASE_SCHEMA }
)
if (!assessment || assessment.status === 'failed') {
blocked = true
blockReason = assessment?.summary || 'Assessment failed'
}

// --- Phase: DSL Design ---
if (!blocked) {
phase('DSL Design')
const dslDesign = await agent(
`Run the nkda-testdsl-dsl-design skill for feature family "${file.familyName}".
Feature file: ${file.featureFilePath}

Consume .output/nkda-testdsl/${file.familyName}/01-feature-assessment.md.
Follow the skill exactly as written in .agents/skills/nkda-testdsl-dsl-design/SKILL.md.
Produce .output/nkda-testdsl/${file.familyName}/02-dsl-design.md.

Return structured output.`,
{ label: `dsl-design:${file.familyName}`, schema: PHASE_SCHEMA }
)
if (!dslDesign || dslDesign.status === 'failed') {
blocked = true
blockReason = dslDesign?.summary || 'DSL Design failed'
}
}

// --- Phase: Extraction ---
if (!blocked) {
phase('Extraction')
const extraction = await agent(
`Run the nkda-testdsl-extraction skill for feature family "${file.familyName}".
Feature file: ${file.featureFilePath}

Consume .output/nkda-testdsl/${file.familyName}/02-dsl-design.md.
Follow the skill exactly as written in .agents/skills/nkda-testdsl-extraction/SKILL.md.

Bootstrap tests/DevOpsMigrationPlatform.Testing if it does not exist — this is never a blocker.
Purge orphaned generated Features/*.feature.cs files in the target test project before extraction.
Produce .output/nkda-testdsl/${file.familyName}/03-extraction-summary.md.

Return structured output.`,
{ label: `extraction:${file.familyName}`, schema: PHASE_SCHEMA }
)
if (!extraction || extraction.status === 'failed') {
blocked = true
blockReason = extraction?.summary || 'Extraction failed'
}
}

// --- Phase: Conversion ---
if (!blocked) {
phase('Conversion')
const conversion = await agent(
`Run the nkda-testdsl-feature-conversion skill for feature family "${file.familyName}".
Feature file: ${file.featureFilePath}

Consume:
- .output/nkda-testdsl/${file.familyName}/01-feature-assessment.md
- .output/nkda-testdsl/${file.familyName}/02-dsl-design.md

Follow the skill exactly as written in .agents/skills/nkda-testdsl-feature-conversion/SKILL.md.

For each scenario:
- Build and run its mapped test.
- If the test passes: retire the scenario from the .feature file (remove that scenario block).
- If the test fails: retain the scenario in the .feature file.
- Every new or modified test method must carry [TestCategory("UnitTest")] immediately above [TestMethod].
- Check the existing test corpus before building any test; map to pre-existing, extend partial-existing, build only to-build.
- For missing-step scenarios with no pre-existing coverage, generate intent-derived tests.

Produce .output/nkda-testdsl/${file.familyName}/04-conversion-summary.md.

Return structured output.`,
{ label: `conversion:${file.familyName}`, schema: PHASE_SCHEMA }
)
if (!conversion || conversion.status === 'failed') {
blocked = true
blockReason = conversion?.summary || 'Conversion failed'
}
}

// --- Phase: Refactor ---
if (!blocked) {
phase('Refactor')
const refactor = await agent(
`Run the nkda-testdsl-refactor skill for feature family "${file.familyName}".
Feature file: ${file.featureFilePath}

Follow the skill exactly as written in .agents/skills/nkda-testdsl-refactor/SKILL.md.
Produce .output/nkda-testdsl/${file.familyName}/05-refactor-summary.md.

Return structured output.`,
{ label: `refactor:${file.familyName}`, schema: PHASE_SCHEMA }
)
if (!refactor || refactor.status === 'failed') {
blocked = true
blockReason = refactor?.summary || 'Refactor failed'
}
}

// --- Phase: Verification + Commit ---
phase('Verification')
let verificationResult
if (blocked) {
verificationResult = {
familyName: file.familyName,
verdict: 'BLOCKED',
migratedScenarios: [],
blockedScenarios: [],
failedScenarios: [],
wiringState: 'unknown',
commitSha: '',
commitMessage: '',
summary: blockReason,
}
} else {
verificationResult = await agent(
`Run the nkda-testdsl-verification skill for feature family "${file.familyName}".
Feature file: ${file.featureFilePath}

Follow the skill exactly as written in .agents/skills/nkda-testdsl-verification/SKILL.md.

Required test execution order:
1. Run converted/affected feature-family tests first.
2. Verify every retired scenario has a mapped passing test with path:line evidence.
3. If all scenarios are retired and tests are green, run the full repository test suite.

If verification returns PASS:
- Delete the .feature file.
- Delete any generated .feature.cs and legacy *Steps.cs scoped to wiring state.
- Commit all changes with message: migrate: ${file.familyName} feature → DSL

If verification returns BLOCKED or FAIL:
- Retain the .feature file (with only unconverted scenarios remaining).
- Append every retained scenario as an entry in analysis/dsl-gaps-detected.md.
- Commit partial progress with message: migrate(partial): ${file.familyName} <N> scenarios retired

Produce .output/nkda-testdsl/${file.familyName}/06-verification.md.

Return structured output including the verdict, lists of migrated/blocked/failed scenarios, wiring state, and commit SHA.`,
{ label: `verification:${file.familyName}`, schema: VERIFICATION_SCHEMA }
)
}

results.push(verificationResult)
log(`Completed family: ${file.familyName} — ${verificationResult?.verdict ?? 'unknown'}`)
}

// ---------------------------------------------------------------------------
// Terminal report
// ---------------------------------------------------------------------------
const verified = results.filter(Boolean)

for (const r of verified) {
const terminalStatus =
r.verdict === 'PASS'
? (r.migratedScenarios?.length > 0 ? 'converted' : 'already-adapted')
: r.verdict === 'BLOCKED'
? 'blocked'
: 'failed'

log(`
**\`${r.familyName}\` — \`${terminalStatus}\`**

| | Count |
|---|---|
| ✅ Migrated & committed | ${r.migratedScenarios?.length ?? 0} |
| 🚧 Blocked (gap) | ${r.blockedScenarios?.length ?? 0} |
| ⚠️ Failed | ${r.failedScenarios?.length ?? 0} |
| Total | ${(r.migratedScenarios?.length ?? 0) + (r.blockedScenarios?.length ?? 0) + (r.failedScenarios?.length ?? 0)} |

**Migrated:**
${(r.migratedScenarios ?? []).map(s => `- ${s} ✅`).join('\n') || '- (none)'}

**Blocked:**
${(r.blockedScenarios ?? []).map(s => `- ${s}`).join('\n') || '- (none)'}

**Failed:**
${(r.failedScenarios ?? []).map(s => `- ${s}`).join('\n') || '- (none)'}

**Wiring state:** \`${r.wiringState}\`
**Commit:** \`${r.commitSha || 'none'}\` — ${r.commitMessage || r.summary}
`)
}

return { processed: verified.length, results: verified }
}
}
1 change: 1 addition & 0 deletions .claude/prompts
1 change: 1 addition & 0 deletions .claude/workflows
Loading
Loading