Skip to content

feat(unic-archon-dlc): complete plugin — all 16 slices (v0.1.0)#36

Open
orioltf wants to merge 22 commits into
developfrom
feature/unic-archon-dlc
Open

feat(unic-archon-dlc): complete plugin — all 16 slices (v0.1.0)#36
orioltf wants to merge 22 commits into
developfrom
feature/unic-archon-dlc

Conversation

@orioltf
Copy link
Copy Markdown
Member

@orioltf orioltf commented May 15, 2026

Summary

  • Complete implementation of the unic-archon-dlc Claude Code plugin (v0.1.0)
  • Six Archon workflow DAGs: triage, explore, plan, build, qa, cleanup
  • Self-contained /unic-dlc-review command (no dependency on pr-review-toolkit)
  • 86 node:test tests covering all 13 lib modules
  • README with Mermaid flowchart, node reference table, config reference, and docs/workflow/ layout

What was built (slice-by-slice)

Slice What
01 Plugin scaffold, config-loader, setup-explorer, tracer install hook
02 Full install hook, label config, agent-docs-writer, CLAUDE.md marker block
03 Triage workflow, tracker adapter, handoff generator
04 Explore — parallel research + synthesize
05 Explore — prototype, spike verdicts, code-preserve gate
06 Plan — specs loop, to-prd, prd-gate, prd-writer
07 Plan — to-issues, nyquist-map, issues-schema (topological sort)
08 Plan — plan-checker loop, yaml-gen, plan-pr-gate, dag-builder
09 Build — slopcheck package gate, /unic-dlc-build command
10 Build — verification, goals-check, report, build-pr-gate, stub-detector
11 Self-contained /unic-dlc-review command
12 QA workflow — e2e, coverage-gate, uat-gate, merge
13 Cleanup workflow — arch-review, adr-consolidation, run-triage
14 README, node reference table, Mermaid flowchart, CHANGELOG 0.1.0
15 Fix: add fresh_context to prd-gate (interactive loop crash prevention)
16 Fix: verify-pr-base bash node in qa.yaml before merge

Test plan

  • pnpm test — 86/86 pass
  • pnpm typecheck — clean
  • pnpm verify:changelog — ok
  • All interactive nodes have fresh_context: true
  • All command files use unic-dlc- prefix
  • No circular dependencies in dag-builder (13 tests)
  • Slopcheck defaults to [ASSUMED] when no registry available

🤖 Generated with Claude Code

orioltf and others added 18 commits May 15, 2026 13:41
- Plugin manifest at apps/claude-code/unic-archon-dlc/.claude-plugin/
- Placeholder .archon/workflows/ and .archon/commands/ dirs
- lib/config-loader.mjs: loadConfig() returns typed object or structured error
- lib/setup-explorer.mjs: exploreProject() reads project state, absent = absent not throw
- hooks/install.mjs: idempotent install with archon binary check, mandatory question tier, outputs .archon/unic-dlc.config.json + docs/agents/issue-tracker.md
- 4 node:test cases passing; biome + typecheck clean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…iter (slice 02)

- lib/labels-config.mjs: getDefaultLabels() returns three-tier canonical→tracker mappings
- lib/agent-docs-writer.mjs: writeAgentDocs() + updateAgentSkillsBlock() (marker-delimited idempotent CLAUDE.md update)
- hooks/install.mjs: expanded to all config tiers (mandatory, skippable e2e, defaults, labels, repo_layout) and writes all 5 docs/agents/*.md files
- 9 node:test cases passing; biome + typecheck clean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rator (slice 03)

- lib/tracker-adapter.mjs: translateLabel(), buildCreateCommand(), buildUpdateCommand() for all 4 backends (github/ado/jira/local-markdown)
- lib/handoff-generator.mjs: buildHandoff() 4-section output, updateRoadmap() marker-delimited idempotent ROADMAP.md
- .archon/workflows/triage.yaml: read-state + produce-handoff prompt nodes
- .archon/commands/unic-dlc-triage.md: command file with unic-dlc- prefix
- 19 node:test cases passing; biome + typecheck clean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e (slice 04)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rd, prd-gate + prd-writer (slice 06)

Adds the first half of the plan workflow DAG: load-context loads CONTEXT.md,
CONTEXT-MAP.md, ADRs, and findings.md; specs runs an adversarial interview
(interview/assumptions mode) writing ADRs live; to-prd synthesises the transcript
into a 7-section PRD.md; prd-gate opens a PR and returns control to specs on rejection.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…h gate (slice 05)

Adds lib/spike-verdicts.mjs (appendSpikeVerdicts + parseSpikeVerdicts), extends
explore.yaml with prototype/code-preserve-gate/create-spike-ticket nodes, and
covers all paths with 7 passing node:test tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…slice 07)

Adds lib/issues-schema.mjs with validateIssue, sortByDependency (Kahn's
algorithm, throws on cycles), and buildIssuesJson. Extends plan.yaml with
to-issues (PRD decomposition + tracker publish + issues.json) and nyquist-map
(test_command / test_command_planned annotation) nodes. 13 passing node:test
tests; Biome + typecheck clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…g-builder (slice 08)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e (slice 09)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…te (slice 10)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add /unic-dlc-review command and review.yaml workflow. Single-node DAG
covers four aspects (code quality, test coverage, silent failures, type
design), posts a sentinel-marked comment via tracker-adapter, and updates
in-place on re-run. No runtime dependency on pr-review-toolkit.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e (slice 12)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…n, run-triage (slice 13)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ode in qa (slices 15+16)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t, CHANGELOG 0.1.0 (slice 14)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…b modules

- Extract IssueType and IssuePriority string literal unions in issues-schema.mjs; dag-builder now re-uses the canonical Issue typedef via import instead of duplicating it
- Add TrackerBackend, PrStrategy, BranchingStrategy string literal unions; propagate through tracker-adapter, config-loader, agent-docs-writer, and install.mjs
- Add WorkflowPhase literal union in handoff-generator; narrow phase fields on HandoffSnapshot and updateRoadmap param
- Add isConfigError() type guard to config-loader for safe union discrimination
- Expand three single-line @typedef entries in slopcheck.mjs to proper block-form typedefs (required for tsc resolution of PackageVerdict)
- Fix bare catch blocks in setup-explorer.mjs to re-throw non-ENOENT errors rather than silently swallowing them
- Add explicit precondition guard in spike-verdicts.appendSpikeVerdicts (throws when findings.md absent)
- Update test fixtures in dag-builder and handoff-generator to carry explicit @type annotations so tsc validates the narrower field types

All 86 tests pass; pnpm typecheck clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…iome/Prettier

- lib/agent-docs-writer.mjs: use relative() instead of string replace for
  CONTEXT-MAP.md path — fixes Windows path separator bug
- lib/config-loader.mjs: rename coverage_thresholds → coverage_threshold in
  KNOWN_FIELDS and add @Property to DlcConfig typedef; plural form was being
  passed through silently while workflows read the singular key
- test/slopcheck.test.mjs: @ts-ignore@ts-expect-error (Biome CI gate)
- README.md + 4 command files: Prettier formatting (CI gate)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@orioltf
Copy link
Copy Markdown
Member Author

orioltf commented May 15, 2026

PR Review: feat(unic-archon-dlc) v0.1.0

Five specialized agents reviewed this PR. 86/86 tests pass throughout. Most findings have been auto-fixed in two commits already on this branch; the ones requiring a design decision or manual action are flagged below.


Auto-fixed (already committed)

Commit What
ee63b38 Type invariants: IssueType/IssuePriority literal unions, TrackerBackend/PrStrategy/BranchingStrategy on config, WorkflowPhase on handoff, duplicate Issue typedef removed from dag-builder, isConfigError() type guard, TOCTOU fix in agent-docs-writer, silent-failure guards in setup-explorer/slopcheck/install/spike-verdicts
b097f8d Review fixes: Windows path bug in agent-docs-writer (relative() instead of replace()), coverage_thresholdscoverage_threshold in KNOWN_FIELDS + added @property to DlcConfig, @ts-ignore@ts-expect-error (Biome gate), Prettier on README + 4 command files (Prettier gate)

🔴 CRITICAL — Requires decision before merge

1. Slash commands not discoverable by Claude Code

All 7 slash commands are under .archon/commands/ but Claude Code auto-discovery expects them at commands/ (compare with apps/claude-code/pr-review/commands/). Users who install the plugin will have no slash commands.

Two options:

  • (a) Move .archon/commands/*.mdcommands/ (follows monorepo convention)
  • (b) Add "commands": ".archon/commands" (or equivalent) to .claude-plugin/plugin.json

2. README documents /unic-dlc-install but no command file exists

README.md:136 Quick start tells users to run /unic-dlc-install. There is no unic-dlc-install.md. Either ship the command file or update the Quick start to use the correct install flow.


🟠 HIGH — Manual fixes needed in docs

3. unic-dlc-explore.md workflow diagram omits 3 nodes

The diagram ends at synthesize — it omits prototype, code-preserve-gate (interactive), and create-spike-ticket. A user reading the command doc will be surprised when the workflow pauses at a gate they didn't know existed.

4. unic-dlc-plan.md workflow diagram omits 5 of 9 nodes

Only shows load-context → specs → to-prd → prd-gate. Missing: to-issues, nyquist-map, plan-checker, yaml-gen, plan-pr-gate.

5. README HANDOFF.md placement wrong

README shows HANDOFF.md under docs/workflow/, but triage.yaml and unic-dlc-triage.md both write it to the repo root. Fix the tree and table in README.

6. README config reference has three inaccuracies

Field Problem
repo_layout Default documented as single; install hook writes single-context
e2e_command Default documented as ""; install hook sets null when blank
pr_strategy Documents rebase as valid; qa.yaml merge node has no rebase branch (falls through to --squash)

7. create-spike-ticket node in explore.yaml wrong API call

Inline prompt tells the LLM to call loadConfig(projectDir), but the actual signature is loadConfig(configFilePath). Should be: loadConfig(join(projectDir, '.archon', 'unic-dlc.config.json')).


🟡 MEDIUM — Informational, no block

Test coverage gaps (all tests pass, these are missing edge case coverage):

  • config-loader: no test for non-existent file path (error branch)
  • tracker-adapter.buildUpdateCommand: only github branch tested; ado/jira/local-markdown untested
  • dag-builder.buildYaml: test_command conditional branch never hit
  • spike-verdicts.appendSpikeVerdicts: "section after spike verdicts" branch not exercised
  • setup-explorer: no test with a real git remote (positive path always skipped)

Other medium findings:

  • tracker-adapter default case falls through to github format silently for unknown tracker strings — should warn
  • config-loader: non-object JSON (e.g. []) produces misleading "missing fields" error
  • Issue docs reference wrong node names: Agentic flow updates #15 says plan-gate/stall-gate (real: plan-pr-gate); pr-reviews rereviews specs #16 says merge-pr five times (real: merge)
  • unic-archon-dlc is missing from CONTEXT-MAP.md and has no CONTEXT.md — breaks multi-context navigation for agents working in this repo

Dead code (low priority):

  • dag-builder.mjs: (issue.blocked_by ?? []) is redundant since blocked_by: string[] is non-optional
  • agent-docs-writer.mjs: const mainBranch = isGitflow ? 'main' : 'main' — both arms return 'main'

✅ Confirmed working

  • 86/86 tests pass (including 13 circular-dep tests in dag-builder)
  • pnpm typecheck clean
  • No external runtime deps (meets the auto-format-zero-deps bar)
  • Plugin versions consistent: plugin.json, marketplace.json, CHANGELOG.md all say 0.1.0
  • No duplicate primitives with pr-review toolkit
  • All interactive workflow nodes have fresh_context: true
  • Node reference table in README verified accurate against all 7 workflow YAMLs
  • slopcheck correctly defaults to [ASSUMED] when no registry provided

🤖 Reviewed by 5 parallel agents: code-quality, test-coverage, silent-failure-hunter, type-design, comment-accuracy

@orioltf
Copy link
Copy Markdown
Member Author

orioltf commented May 15, 2026

🔍 Comprehensive PR Review

PR: #36 — feat(unic-archon-dlc): complete plugin — all 16 slices (v0.1.0)
Reviewed by: 5 specialized agents (code-review, error-handling, test-coverage, comment-quality, docs-impact)
Date: 2026-05-15


Summary

unic-archon-dlc is a well-engineered, zero-external-dependency plugin that follows all project conventions (Biome, ESM, // @ts-check, tabs, cross-platform APIs). The 86-test suite uses real filesystem I/O throughout and the workflow YAML files are clearly structured. The CI failure is pre-existing from a previously merged PR — not caused by this PR's changes.

Verdict: REQUEST_CHANGES

Severity Count
🔴 HIGH (must fix before merge) 7
🟠 MEDIUM (author decides) 7
🟢 LOW (optional / future) 8
Total 22

🔴 HIGH Issues (Must Fix Before Merge)

H1: appendSpikeVerdicts crashes with raw ENOENT when findings.md is absent

📍 lib/spike-verdicts.mjs:38

readFileSync is called unconditionally. If called before writeFindingsMd, Node.js throws a raw ENOENT with no context. readFindingsMd in the same module guards correctly — this function doesn't.

View fix
export function appendSpikeVerdicts(findingsDir, verdicts) {
  const filePath = join(findingsDir, 'findings.md')
  if (!existsSync(filePath)) {
    throw new Error(
      `appendSpikeVerdicts: findings.md not found at ${filePath}. ` +
      `Run the explore workflow first to create it.`
    )
  }
  const existing = readFileSync(filePath, 'utf8')
  // ... rest unchanged

H2: Duplicate Issue typedef in dag-builder.mjs

📍 lib/dag-builder.mjs:8-14

Structurally identical to the canonical Issue typedef in issues-schema.mjs. Two places to update on any schema change; silent divergence risk.

View fix
// lib/dag-builder.mjs — replace the local typedef block with:
/** @typedef {import('./issues-schema.mjs').Issue} Issue */

Same pattern already used in tracker-adapter.mjs:12 for LabelMapping.


H3: buildUpdateCommand — 4 of 5 tracker branches untested

📍 lib/tracker-adapter.mjs:69-88

Only the github branch is tested. ado, jira, local-markdown, and default have zero coverage. A swapped command string would be undetected.

View fix
test('ado: buildUpdateCommand produces a valid az boards CLI string', () => {
  const cmd = buildUpdateCommand('ado', '99', 'resolved', labels)
  assert.ok(cmd.startsWith('az boards work-item update'), `expected az boards, got: ${cmd}`)
  assert.ok(cmd.includes('99'))
})
test('jira: buildUpdateCommand produces a valid jira CLI string', () => {
  const cmd = buildUpdateCommand('jira', 'PROJ-42', 'ready-for-agent', labels)
  assert.ok(cmd.startsWith('jira issue edit'))
  assert.ok(cmd.includes('PROJ-42'))
})
test('local-markdown: buildUpdateCommand produces a human-readable instruction', () => {
  const cmd = buildUpdateCommand('local-markdown', 'fix-login', 'resolved', labels)
  assert.ok(cmd.includes('Status:'))
})
test('default tracker: buildUpdateCommand falls back to gh issue edit', () => {
  const cmd = buildUpdateCommand('unknown-tracker', '7', 'closed', labels)
  assert.ok(cmd.startsWith('gh issue edit'))
})

H4: Inaccurate JSDoc — updateAgentSkillsBlock says "No-ops if CLAUDE.md does not exist"

📍 lib/agent-docs-writer.mjs:46-50

The code creates the file when absent. "No-ops" is the opposite of what happens. A future caller reading the JSDoc could be badly misled.

View fix
/**
 * Append or refresh the ## Agent skills block in CLAUDE.md using marker-delimited regions.
 * Does not destroy any content outside the marked block.
 * Creates CLAUDE.md with only the skills block if the file does not yet exist.
 * @param {string} projectDir
 */

H5: Root README.md — new plugin missing from Plugins table and install commands

📍 README.md

Anyone browsing the repo or following the install flow cannot discover unic-archon-dlc from the docs.

View fix

Add one table row:

| [`unic-archon-dlc`](apps/claude-code/unic-archon-dlc/) | Claude Code | Archon-powered AI development lifecycle (explore → plan → build → qa → cleanup → triage) |

And one install line:

/plugin install unic-archon-dlc@unic-agent-plugins

H6: CONTEXT-MAP.md — new plugin context missing; Archon relationship undocumented

📍 CONTEXT-MAP.md

Domain-aware agents (/grill-with-docs, /grill-me) use this as their navigation index. After H7 is done, add:

View fix
- [unic-archon-dlc](./apps/claude-code/unic-archon-dlc/CONTEXT.md) — Archon-powered AI development lifecycle DLC

And in Relationships:

- **unic-archon-dlc** requires the Archon workflow engine (version ≥ 0.10); no runtime dependencies on other plugins in this repo

H7: Missing apps/claude-code/unic-archon-dlc/CONTEXT.md

📍 apps/claude-code/unic-archon-dlc/CONTEXT.md (does not exist)

Every existing plugin has a CONTEXT.md — CLAUDE.md explicitly requires it. This plugin introduces 15+ domain terms (Slug, Session, Findings, PRD, Slopcheck gate, Nyquist map, code-red/code-green, HANDOFF, ROADMAP, arch-review, ADR, yaml-gen, etc.) with no canonical vocabulary source. The docs-impact-findings.md artifact contains a complete skeleton.


🟠 MEDIUM Issues (Author Decides: Fix Now | Create Issue | Skip)

M1: Dead ternary mainBranch = isGitflow ? 'main' : 'main'

📍 lib/agent-docs-writer.mjs:169
Both branches return 'main'. Looks incomplete. Recommendation: Fix now (one line).

M2: validateIssue accepts empty strings for mandatory fields

📍 lib/issues-schema.mjs:47-49
An empty id produces invalid YAML node identifiers (code-red-). Recommendation: Fix now (4-line extension of existing loop).

M3: exploreProject unnecessarily declared async

📍 lib/setup-explorer.mjs:41
All I/O inside is synchronous. Forces callers to await for no reason. Recommendation: Fix now (remove keyword + update one caller).

M4: checkArchon() maps all errors to misleading "not found" message

📍 hooks/install.mjs:57-61
A corrupt or non-executable binary produces "archon binary not found on PATH". Recommendation: Fix now (branch on err.code === 'ENOENT').

M5: classifyPackages() — registry failures silently become assumed: true

📍 lib/slopcheck.mjs:39
A network timeout makes all packages appear [ASSUMED]. Caller can't distinguish "package missing" from "connectivity problem". Recommendation: Create issue — non-breaking checkError?: boolean extension, good for a dedicated PR.

M6: Private helpers in install.mjs contain untestable business logic

📍 hooks/install.mjs:29-70
detectTracker, deducePrStrategy, detectRepoLayout are not exported. A visualstudio.com → ADO mapping regression would be silent. Recommendation: Fix now — export + 7 unit tests, low effort.

M7: CLAUDE.md workspace layout missing unic-archon-dlc

📍 CLAUDE.md — workspace layout tree
AI agents using CLAUDE.md for orientation will miss the fourth plugin. Recommendation: Fix now (one line).


🟢 LOW Issues

View 8 low-priority suggestions
# Issue Location Agent Suggestion
L1 Unescaped " in CLI command strings lib/tracker-adapter.mjs:39-43 code-review Add escapeShellArg(s) helper; apply to title
L2 main().catch() may print undefined hooks/install.mjs:171-174 error-handling err instanceof Error ? err.message : String(err)
L3 readOptional() treats EACCES as absent lib/setup-explorer.mjs:30-33 error-handling Only suppress ENOENT; rethrow EACCES, EMFILE
L4 agent-docs-writer github-flow/multi-context untested lib/agent-docs-writer.mjs:167-221 test-coverage Add test with branching: 'github-flow' + repo_layout: 'multi-context'
L5 config-loader file-not-found path untested lib/config-loader.mjs:54-57 test-coverage Pass non-existent path; assert error: true, missing: []
L6 labels-config ado/jira backends untested lib/labels-config.mjs test-coverage Assert all canonical keys present for ado and jira
L7 deducePrStrategy missing @returns + rationale hooks/install.mjs:37-40 comment-quality Add @returns {'squash' | 'merge'} + one-line rationale
L8 readOptional missing description lib/setup-explorer.mjs:27-33 comment-quality Add: "absent or unreadable → both return present: false"

✅ What's Good

  • Zero runtime dependencies — all 13 lib modules use only node: APIs. The auto-format bar is met.
  • 86 real-fs tests across 14 files — no mocks, DAMP style, idempotency verified across all file-update utilities.
  • Typed error returnsconfig-loader.mjs DlcConfig | ConfigError union avoids exceptions for recoverable errors.
  • Algorithmic annotations — DFS three-colour and Kahn's BFS documented inline with named algorithm references.
  • Idempotent file operationsinitFindingsDir, updateRoadmap, updateAgentSkillsBlock all tested with multiple-run assertions.
  • Workflow YAML quality — 7 well-structured DAGs with explicit depends_on edges and fresh_context: true on interactive gates.
  • Excellent plugin README — Mermaid flowchart, node reference table, config reference, docs-layout table, dependency map.
  • CLAUDE.md compliance — 11/11 rules verified.

⚠️ CI Note

The CI failure is not caused by this PR:

  1. @ts-ignore at apps/claude-code/pr-review/tests/notices.test.mjs:134 — pre-existing. Fix: change to @ts-expect-error in a separate PR on develop.
  2. Prettier warnings on .claude/worktrees/**/*.md — local worktree artifacts, not in this diff. Fix: add .claude/worktrees/ to .prettierignore.

📋 Suggested Follow-up Issues

Title Priority
slopcheck: add checkError flag to PackageVerdict for registry failures P2
tracker-adapter: escape double-quotes in tracker CLI title arguments P3
setup-explorer: narrow readOptional catch to ENOENT only P3
agent-docs-writer: add tests for github-flow + multi-context branches P3

Next Steps

  1. Fix H1–H7 (required before merge)
  2. Decide on M1–M7 (fix now, create issue, or skip)
  3. Merge when ready — the code quality is solid

Reviewed by Archon comprehensive-pr-review workflow
Full artifacts: /Users/oriol.torrent/.archon/workspaces/unic/unic-agents-plugins/artifacts/runs/4c1b7ca61e20c9b7072f8637556e430f/review/

… review

Fixes applied:
- H3: add 4 missing buildUpdateCommand tests (ado, jira, local-markdown, default)
- H4: fix inaccurate JSDoc on updateAgentSkillsBlock — creates CLAUDE.md, does not no-op
- H5: add unic-archon-dlc to root README.md plugins table and install commands
- H6: add unic-archon-dlc entry and Archon relationship to CONTEXT-MAP.md
- H7: create apps/claude-code/unic-archon-dlc/CONTEXT.md with domain vocabulary
- M1: replace dead ternary mainBranch with plain const + explanatory comment
- M7: add unic-archon-dlc to AGENTS.md workspace layout tree

Also fixed:
- Remove stale @ts-expect-error in slopcheck.test.mjs (null now accepted by JSDoc type)

Notes:
- H1 (spike-verdicts ENOENT guard) already fixed in prior commit
- H2 (duplicate Issue typedef) already fixed in prior commit

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@orioltf
Copy link
Copy Markdown
Member Author

orioltf commented May 15, 2026

⚡ Auto-Fix Report

Status: COMPLETE ✅
Pushed: Changes pushed to feature/unic-archon-dlc (commit 08396b3)


Fixes Applied

Severity Fixed Skipped
🔴 HIGH 7/7 0
🟠 MEDIUM (bonus) 2/7 5 (author decides)

What Was Fixed

  • H1: appendSpikeVerdicts ENOENT crash (lib/spike-verdicts.mjs:38) — already fixed in prior commit b097f8d
  • H2: Duplicate Issue typedef (lib/dag-builder.mjs:8-14) — already fixed in prior commit b097f8d
  • H3: buildUpdateCommand 4 branches untested (test/tracker-adapter.test.mjs) — added 4 tests: ado, jira, local-markdown, default
  • H4: Inaccurate JSDoc updateAgentSkillsBlock (lib/agent-docs-writer.mjs:50) — "No-ops if absent" → "Creates CLAUDE.md with only the skills block if absent"
  • H5: README.md missing plugin entry (README.md) — added table row + install command
  • H6: CONTEXT-MAP.md missing entry (CONTEXT-MAP.md) — added pointer + Archon relationship note
  • H7: Missing CONTEXT.md (apps/claude-code/unic-archon-dlc/CONTEXT.md) — created with 15+ domain terms (Slug, Session, PRD, Findings, code-red/code-green, yaml-gen, Nyquist map, Slopcheck gate, arch-review, ADR, HANDOFF, ROADMAP, and more)
  • M1: Dead ternary mainBranch (bonus) — isGitflow ? 'main' : 'main'const mainBranch = 'main' + comment
  • M7: AGENTS.md workspace layout (bonus) — added unic-archon-dlc/ to the tree

Tests Added

  • test/tracker-adapter.test.mjs: 4 new buildUpdateCommand test cases (ado, jira, local-markdown, default)
  • Suite: 90/90 tests pass (was 86)

Bonus Fix

  • Removed stale @ts-expect-error in test/slopcheck.test.mjs:24 — became obsolete when parseNewPackages JSDoc was updated to accept null | undefined

🟠 MEDIUM Issues — Your Decision

These were left for you to decide: fix now, create issue, or skip.

Issue Location Recommendation
M2: validateIssue accepts empty strings lib/issues-schema.mjs:47-49 Fix now (LLM-generated empty id → broken yaml-gen)
M3: exploreProject unnecessary async lib/setup-explorer.mjs:41 Fix now (trivial)
M4: checkArchon() misleading error hooks/install.mjs:57-61 Fix now (branch on err.code === 'ENOENT')
M5: classifyPackages silent registry failure lib/slopcheck.mjs:39 Create issue (API change, good for separate PR)
M6: Private helpers untestable hooks/install.mjs:29-70 Fix now (export + 7 unit tests)

📋 Suggested Follow-up Issues

  1. slopcheck: add checkError flag to PackageVerdict (P2) — distinguish registry miss from connectivity failure
  2. install: export detectTracker/deducePrStrategy/detectRepoLayout for unit testing (P2) — prevent silent tracker-detection regressions
  3. tracker-adapter: escape double-quotes in tracker CLI title arguments (P3) — L1 from review
  4. setup-explorer: narrow readOptional catch to ENOENT only (P3) — L3 from review
  5. agent-docs-writer: add tests for github-flow + multi-context branches (P3) — L4 from review

Validation

✅ Typecheck (tsc --noEmit) | ✅ Biome | ✅ Prettier | ✅ 90/90 tests


Auto-fixed by Archon comprehensive-pr-review workflow
Fixes pushed to branch feature/unic-archon-dlc — commit 08396b3

orioltf and others added 3 commits May 15, 2026 18:59
…36

- M2: validateIssue now rejects empty strings for mandatory fields
  (empty id would produce invalid YAML node identifiers like 'code-red-')
- M3: exploreProject is no longer async (all I/O is synchronous);
  remove await at the call site in install.mjs and setup-explorer test
- M4: checkArchon branches on ENOENT to distinguish 'binary not found'
  from other exec failures (corrupt binary, permission error, etc.)
- M6: export detectTracker, deducePrStrategy, detectRepoLayout from
  install.mjs; guard main() with import.meta.url so the file is
  importable without side-effects; add test/install-helpers.test.mjs
  (13 cases covering all tracker/strategy/layout branches)

M5 tracked as issue: #37

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…est.mjs

Fixes pre-existing Biome lint error that was blocking CI on feature/unic-archon-dlc.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant