devlyn-cli 2.6.1 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/AGENTS.md +10 -72
  2. package/CLAUDE.md +29 -12
  3. package/README.md +7 -5
  4. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +8 -0
  5. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +28 -0
  6. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +15 -0
  7. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +57 -0
  8. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +10 -0
  9. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +50 -0
  10. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +59 -0
  11. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +9 -0
  12. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +88 -0
  13. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +45 -0
  14. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +30 -0
  15. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +16 -0
  16. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +64 -0
  17. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +10 -0
  18. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +21 -0
  19. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +58 -0
  20. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +9 -0
  21. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +54 -0
  22. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +82 -0
  23. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +77 -0
  24. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +99 -0
  25. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +18 -0
  26. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +64 -0
  27. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +10 -0
  28. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +4 -0
  29. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +61 -0
  30. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +9 -0
  31. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +135 -0
  32. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +100 -0
  33. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +75 -0
  34. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +93 -0
  35. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +16 -0
  36. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +65 -0
  37. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +10 -0
  38. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +18 -0
  39. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +66 -0
  40. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +9 -0
  41. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +84 -0
  42. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +184 -0
  43. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +74 -0
  44. package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +12 -0
  45. package/benchmark/auto-resolve/scripts/run-fixture.sh +39 -1
  46. package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +1 -1
  47. package/bin/devlyn.js +71 -83
  48. package/config/skills/_shared/adapters/README.md +7 -0
  49. package/config/skills/_shared/adapters/claude.md +49 -2
  50. package/config/skills/_shared/adapters/omp.md +17 -0
  51. package/config/skills/_shared/archive_run.py +8 -2
  52. package/config/skills/_shared/codex-config.md +22 -6
  53. package/config/skills/_shared/engine-doctor.sh +107 -0
  54. package/config/skills/_shared/engine-preflight.md +18 -11
  55. package/config/skills/_shared/expected.schema.json +26 -0
  56. package/config/skills/_shared/pair-plan-schema.md +2 -2
  57. package/config/skills/_shared/runtime-principles.md +1 -1
  58. package/config/skills/_shared/spec-verify-check.py +773 -486
  59. package/config/skills/_shared/state-phase-write.py +374 -0
  60. package/config/skills/_shared/verify-merge-findings.py +177 -61
  61. package/config/skills/devlyn:engines/SKILL.md +47 -0
  62. package/config/skills/devlyn:ideate/SKILL.md +22 -3
  63. package/config/skills/devlyn:ideate/references/elicitation.md +2 -2
  64. package/config/skills/devlyn:ideate/references/from-spec-mode.md +2 -2
  65. package/config/skills/devlyn:ideate/references/project-mode.md +1 -1
  66. package/config/skills/devlyn:ideate/references/spec-template.md +15 -4
  67. package/config/skills/devlyn:queue/SKILL.md +26 -0
  68. package/config/skills/devlyn:resolve/SKILL.md +55 -25
  69. package/config/skills/devlyn:resolve/references/free-form-mode.md +1 -1
  70. package/config/skills/devlyn:resolve/references/phases/build-gate.md +2 -2
  71. package/config/skills/devlyn:resolve/references/phases/cleanup.md +1 -1
  72. package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
  73. package/config/skills/devlyn:resolve/references/phases/plan.md +3 -2
  74. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +8 -0
  75. package/config/skills/devlyn:resolve/references/phases/verify.md +18 -9
  76. package/config/skills/devlyn:resolve/references/state-schema.md +11 -7
  77. package/optional-skills/devlyn:pencil-pull/SKILL.md +5 -0
  78. package/optional-skills/devlyn:pencil-push/SKILL.md +5 -0
  79. package/package.json +1 -2
  80. package/scripts/lint-skills.sh +55 -46
  81. package/agents-config/evaluator.md +0 -64
@@ -59,6 +59,7 @@ critical_path_files=$(cat <<'EOF'
59
59
  _shared/spec-verify-check.py
60
60
  _shared/collect-codex-findings.py
61
61
  _shared/verify-merge-findings.py
62
+ _shared/state-phase-write.py
62
63
  devlyn:ideate/SKILL.md
63
64
  devlyn:ideate/references/spec-template.md
64
65
  devlyn:ideate/references/elicitation.md
@@ -77,6 +78,7 @@ _shared/expected.schema.json
77
78
  _shared/adapters/README.md
78
79
  _shared/adapters/claude.md
79
80
  _shared/adapters/codex.md
81
+ _shared/adapters/omp.md
80
82
  _shared/codex-config.md
81
83
  _shared/codex-monitored.sh
82
84
  _shared/engine-preflight.md
@@ -196,10 +198,11 @@ else
196
198
  fi
197
199
 
198
200
  # ---------------------------------------------------------------------------
199
- # 4. No stale Opus 4.6 benchmark references (should be 4.7 after P1).
201
+ # 4. No model-pinned Claude references, any generation. Engine-scope docs say
202
+ # "Claude"; exact model ids belong in run metadata only.
200
203
  # ---------------------------------------------------------------------------
201
- section "Check 4: No stale 'Claude Opus 4.6' in routing table"
202
- offenders=$(grep -RIln 'Claude Opus 4\.6' \
204
+ section "Check 4: No model-pinned Claude references"
205
+ offenders=$(grep -RIlnE 'Claude (Opus|Sonnet|Haiku|Fable)|claude-(opus|sonnet|haiku|fable)-[0-9]' \
203
206
  config/skills 2>/dev/null \
204
207
  | grep -v 'config/skills/roadmap-archival-workspace/' \
205
208
  | grep -v 'config/skills/devlyn:auto-resolve-workspace/' \
@@ -207,7 +210,7 @@ offenders=$(grep -RIln 'Claude Opus 4\.6' \
207
210
  | grep -v 'config/skills/preflight-workspace/' \
208
211
  || true)
209
212
  if [ -z "$offenders" ]; then
210
- ok "routing table on Opus 4.7"
213
+ ok "no model-pinned Claude references"
211
214
  else
212
215
  while IFS= read -r f; do bad "$f"; done <<< "$offenders"
213
216
  fi
@@ -242,7 +245,7 @@ if [ ! -e "optional-skills/devlyn:design-ui" ]; then
242
245
  else
243
246
  bad "devlyn:design-ui must not be installed as an optional addon"
244
247
  fi
245
- if grep -Fq "const DEVLYN_CORE_SKILLS = ['devlyn:resolve', 'devlyn:ideate', 'devlyn:design-ui', '_shared'];" bin/devlyn.js \
248
+ if grep -Fq "const DEVLYN_CORE_SKILLS = ['devlyn:resolve', 'devlyn:ideate', 'devlyn:design-ui', 'devlyn:engines', 'devlyn:queue', '_shared'];" bin/devlyn.js \
246
249
  && grep -Fq "skillsToInstall: DEVLYN_CORE_SKILLS" bin/devlyn.js; then
247
250
  ok "Codex install includes devlyn:design-ui (via shared DEVLYN_CORE_SKILLS bundle)"
248
251
  else
@@ -393,7 +396,7 @@ if ! grep -Fq 'SAFE_RUN_ID_RE' config/skills/_shared/archive_run.py \
393
396
  || ! grep -Fq 'invalid JSON numeric constant: NaN' config/skills/_shared/archive_run.py \
394
397
  || ! grep -Fq '"verify.pair.findings.jsonl"' config/skills/_shared/archive_run.py \
395
398
  || ! grep -Fq '"verify-merge.summary.json"' config/skills/_shared/archive_run.py \
396
- || ! grep -Fq '"codex-judge.*"' config/skills/_shared/archive_run.py; then
399
+ || ! grep -Fq '"*-judge.*"' config/skills/_shared/archive_run.py; then
397
400
  bad "archive_run.py must safely archive pair/risk-probe evidence and reject unsafe run ids"
398
401
  fi
399
402
 
@@ -600,9 +603,16 @@ then
600
603
  else
601
604
  bad "solo-headroom command detection constants must stay in parity"
602
605
  fi
603
- if ! grep -Fq 'required.add("rollback_state")' config/skills/_shared/spec-verify-check.py \
604
- || ! grep -Fq 'rollback verification text did not require rollback_state probe tag' config/skills/_shared/spec-verify-check.py; then
605
- bad "spec-verify-check.py must require rollback_state risk probes for rollback/all-or-nothing verification text"
606
+ if ! grep -Fq 'def resolve_required_risk_probe_requirements' config/skills/_shared/spec-verify-check.py \
607
+ || ! grep -Fq 'def validate_required_risk_probe_requirement' config/skills/_shared/spec-verify-check.py \
608
+ || ! grep -Fq 'missing required probe(s)' config/skills/_shared/spec-verify-check.py \
609
+ || ! grep -Fq 'risk-probes.jsonl missing a declared required_risk_probe_requirements' config/skills/_shared/spec-verify-check.py \
610
+ || ! grep -Fq 'risk-probes.jsonl covering a declared required_risk_probe_requirements' config/skills/_shared/spec-verify-check.py \
611
+ || ! grep -Fq 'required_risk_probe_requirements with an unknown tag was accepted' config/skills/_shared/spec-verify-check.py \
612
+ || ! grep -Fq 'required_risk_probe_requirements.derived_from not present in the' config/skills/_shared/spec-verify-check.py \
613
+ || ! grep -Fq 'required_risk_probe_requirements' config/skills/_shared/expected.schema.json \
614
+ || ! grep -Fq 'required_risk_probe_requirements' config/skills/devlyn:ideate/references/spec-template.md; then
615
+ bad "spec-verify-check.py must enforce declared required_risk_probe_requirements (iter-0049 language-neutral F3 replacement)"
606
616
  fi
607
617
  if ! grep -Fq 'spec.expected.json top-level array produced a traceback' config/skills/_shared/spec-verify-check.py \
608
618
  || ! grep -Fq 'invalid spec.expected.json produced a traceback' config/skills/_shared/spec-verify-check.py \
@@ -615,10 +625,6 @@ if ! grep -Fq 'spec.expected.json top-level array produced a traceback' config/s
615
625
  || ! grep -Fq 'has invalid JSON' config/skills/_shared/spec-verify-check.py; then
616
626
  bad "spec-verify-check.py self-test must fail malformed spec.expected.json cleanly without traceback"
617
627
  fi
618
- if ! grep -Fq 'required.add("error_contract")' config/skills/_shared/spec-verify-check.py \
619
- || ! grep -Fq 'error_contract without exit-code evidence was accepted' config/skills/_shared/spec-verify-check.py; then
620
- bad "spec-verify-check.py must require error_contract risk probes for invalid/stderr/JSON-error/exit-2 verification text"
621
- fi
622
628
  if ! grep -Fq '"asserts_named_stream_output"' config/skills/_shared/spec-verify-check.py \
623
629
  || ! grep -Fq '"asserts_error_payload_or_stderr"' config/skills/_shared/spec-verify-check.py \
624
630
  || ! grep -Fq '"asserts_nonzero_or_exit_2"' config/skills/_shared/spec-verify-check.py \
@@ -631,7 +637,6 @@ if ! grep -Fq '"asserts_named_stream_output"' config/skills/_shared/spec-verify-
631
637
  fi
632
638
  if ! grep -Fq '"http_error_contract"' config/skills/_shared/spec-verify-check.py \
633
639
  || ! grep -Fq 'asserts_http_error_status' config/skills/_shared/spec-verify-check.py \
634
- || ! grep -Fq 'http error text did not require http_error_contract tag' config/skills/_shared/spec-verify-check.py \
635
640
  || ! grep -Fq 'http_error_contract without payload evidence was accepted' config/skills/_shared/spec-verify-check.py \
636
641
  || ! grep -Fq 'exact error body shape_contract without exact object evidence was accepted' config/skills/_shared/spec-verify-check.py \
637
642
  || ! grep -Fq 'exact error body shape_contract with exact object evidence was rejected' config/skills/_shared/spec-verify-check.py \
@@ -642,55 +647,31 @@ fi
642
647
  if ! grep -Fq '"uses_visible_input_key_names"' config/skills/_shared/spec-verify-check.py \
643
648
  || ! grep -Fq '"asserts_visible_output_key_names"' config/skills/_shared/spec-verify-check.py \
644
649
  || ! grep -Fq '"asserts_no_unexpected_output_keys"' config/skills/_shared/spec-verify-check.py \
645
- || ! grep -Fq 'JSON error object text did not require shape_contract tag' config/skills/_shared/spec-verify-check.py \
650
+ || ! grep -Fq 'shape_contract co-occurring with error_contract without' config/skills/_shared/spec-verify-check.py \
646
651
  || ! grep -Fq 'JSON error object shape_contract with exact object evidence was rejected' config/skills/_shared/spec-verify-check.py \
647
- || ! grep -Fq 'INLINE_JSON_OBJECT_RE' config/skills/_shared/spec-verify-check.py \
648
- || ! grep -Fq 'inline JSON object text did not require shape_contract tag' config/skills/_shared/spec-verify-check.py \
649
- || ! grep -Fq 'inline JSON object shape_contract with key evidence was rejected' config/skills/_shared/spec-verify-check.py \
650
- || ! grep -Fq 'inline JSON error text did not require shape_contract tag' config/skills/_shared/spec-verify-check.py \
651
- || ! grep -Fq 'inline JSON error shape_contract with exact object evidence was rejected' config/skills/_shared/spec-verify-check.py \
652
- || ! grep -Fq 'shape_contract without exact key evidence was accepted' config/skills/_shared/spec-verify-check.py \
652
+ || ! grep -Fq 'shape_contract without any evidence was accepted' config/skills/_shared/spec-verify-check.py \
653
+ || ! grep -Fq 'shape_contract with exact key evidence was rejected' config/skills/_shared/spec-verify-check.py \
653
654
  || ! grep -Fq '`shape_contract` when the visible text names exact keys' config/skills/devlyn:resolve/references/phases/probe-derive.md \
654
655
  || ! grep -Fq '`shape_contract` must' config/skills/devlyn:resolve/SKILL.md; then
655
- bad "risk-probe shape contracts must require exact visible input/output key evidence when visible text names shape"
656
- fi
657
- if ! grep -Fq "forbidden[ -]+window" config/skills/_shared/spec-verify-check.py \
658
- || grep -Fq "r'blocked|overlap|forbidden|window'" config/skills/_shared/spec-verify-check.py \
659
- || ! grep -Fq 'generic forbidden-pattern verification text incorrectly required boundary_overlap' config/skills/_shared/spec-verify-check.py; then
660
- bad "risk-probe boundary_overlap must trigger for forbidden windows / blocked overlap, not generic forbidden pattern text"
661
- fi
662
- if ! grep -Fq '(?:stock|inventory|balance|availability).{0,80}(?:later|remaining|after failures)' config/skills/_shared/spec-verify-check.py \
663
- || ! grep -Fq 'stock validation error text incorrectly required prior_consumption' config/skills/_shared/spec-verify-check.py; then
664
- bad "risk-probe prior_consumption must trigger on later/remaining state consumption, not plain stock validation errors"
656
+ bad "risk-probe shape contracts must require exact visible input/output key evidence unconditionally, and asserts_exact_error_object when co-occurring with error_contract/http_error_contract"
665
657
  fi
666
658
  if ! grep -Fq '"auth_signature_contract"' config/skills/_shared/spec-verify-check.py \
667
659
  || ! grep -Fq '"idempotency_replay"' config/skills/_shared/spec-verify-check.py \
668
660
  || ! grep -Fq 'asserts_signature_over_exact_bytes' config/skills/_shared/spec-verify-check.py \
669
661
  || ! grep -Fq 'duplicate_id_rejected_regardless_of_body' config/skills/_shared/spec-verify-check.py \
670
- || ! grep -Fq 'webhook signature/replay text did not require auth/idempotency probe tags' config/skills/_shared/spec-verify-check.py \
671
662
  || ! grep -Fq '`auth_signature_contract`: `asserts_signature_over_exact_bytes`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
672
663
  || ! grep -Fq '`idempotency_replay`: `first_delivery_then_duplicate`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
673
664
  || ! grep -Fq '`auth_signature_contract` must include `asserts_signature_over_exact_bytes`' config/skills/devlyn:resolve/SKILL.md; then
674
665
  bad "risk-probe webhook/signature/replay contracts must require concrete auth_signature_contract and idempotency_replay tags"
675
666
  fi
676
- if ! grep -Fq 'signing|signed' config/skills/_shared/spec-verify-check.py \
677
- || ! grep -Fq 'same.{0,40}`?id`?' config/skills/_shared/spec-verify-check.py; then
678
- bad "risk-probe webhook signature/replay trigger must catch signing/signed and same accepted id wording"
679
- fi
680
- if ! grep -Fq 'duplicate[ -]+(?:delivery|event|id)' config/skills/_shared/spec-verify-check.py \
681
- || ! grep -Fq 'duplicate SKU verification text incorrectly required idempotency_replay' config/skills/_shared/spec-verify-check.py; then
682
- bad "risk-probe idempotency_replay must trigger on duplicate delivery/event/id, not duplicate SKU aggregation"
683
- fi
684
667
  if ! grep -Fq '"concurrent_state_consistency"' config/skills/_shared/spec-verify-check.py \
685
668
  || ! grep -Fq 'overlapping_mutations_exercised' config/skills/_shared/spec-verify-check.py \
686
- || ! grep -Fq 'concurrent state text did not require concurrent_state_consistency tag' config/skills/_shared/spec-verify-check.py \
687
669
  || ! grep -Fq '`concurrent_state_consistency`: `overlapping_mutations_exercised`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
688
670
  || ! grep -Fq '`concurrent_state_consistency` must' config/skills/devlyn:resolve/SKILL.md; then
689
671
  bad "risk-probe concurrent state contracts must require concrete concurrent_state_consistency markers"
690
672
  fi
691
673
  if ! grep -Fq '"atomic_batch_state"' config/skills/_shared/spec-verify-check.py \
692
674
  || ! grep -Fq 'mixed_valid_invalid_batch' config/skills/_shared/spec-verify-check.py \
693
- || ! grep -Fq 'atomic batch text did not require atomic_batch_state tag' config/skills/_shared/spec-verify-check.py \
694
675
  || ! grep -Fq 'atomic_batch_state without success-order evidence was accepted' config/skills/_shared/spec-verify-check.py \
695
676
  || ! grep -Fq '`atomic_batch_state`: `mixed_valid_invalid_batch`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
696
677
  || ! grep -Fq '`atomic_batch_state` must include `mixed_valid_invalid_batch`' config/skills/devlyn:resolve/SKILL.md; then
@@ -1097,6 +1078,20 @@ if ! grep -Fq 'If the spec includes a solo-headroom hypothesis, one of the two t
1097
1078
  else
1098
1079
  ok "resolve pair-JUDGE prompts prioritize solo-headroom hypothesis"
1099
1080
  fi
1081
+ if ! grep -Fq 'names the primary judge; if pair-mode triggers, the first available OTHER' config/skills/devlyn:resolve/references/phases/verify.md \
1082
+ || ! grep -Fq 'names the primary judge; if pair-mode triggers, the first available OTHER' .claude/skills/devlyn:resolve/references/phases/verify.md \
1083
+ || ! grep -Fq 'names the primary judge; if pair-mode triggers, the first available OTHER' .agents/skills/devlyn:resolve/references/phases/verify.md \
1084
+ || ! grep -Fq 'do not run the OTHER engine as the' config/skills/devlyn:resolve/SKILL.md \
1085
+ || ! grep -Fq 'do not run the OTHER engine as the' .claude/skills/devlyn:resolve/SKILL.md \
1086
+ || ! grep -Fq 'do not run the OTHER engine as the' .agents/skills/devlyn:resolve/SKILL.md \
1087
+ || ! grep -Fq '_shared/adapters/claude.md` `## Invocation' config/skills/devlyn:resolve/references/phases/verify.md \
1088
+ || ! grep -Fq '_shared/adapters/claude.md` `## Invocation' config/skills/devlyn:resolve/SKILL.md \
1089
+ || ! grep -Fq '## Invocation' config/skills/_shared/adapters/claude.md \
1090
+ || ! grep -Fq '.devlyn/claude-judge.stdout' config/skills/_shared/adapters/claude.md; then
1091
+ bad "engine-neutral pair-judge dual declaration (iter-0060) out of sync"
1092
+ else
1093
+ ok "engine-neutral pair-judge dual declaration (iter-0060) in sync"
1094
+ fi
1100
1095
  if ! grep -Fq 'current free-form `state.complexity` is `"large"`' config/skills/devlyn:resolve/SKILL.md \
1101
1096
  || ! grep -Fq 'current free-form `state.complexity` is `"large"`' .claude/skills/devlyn:resolve/SKILL.md \
1102
1097
  || ! grep -Fq 'current free-form `state.complexity` is `"large"`' .agents/skills/devlyn:resolve/SKILL.md \
@@ -1351,7 +1346,7 @@ for file in \
1351
1346
  .agents/skills/devlyn:resolve/references/state-schema.md
1352
1347
  do
1353
1348
  if ! grep -Fq 'MECHANICAL and the primary JUDGE have no verdict-binding blockers' "$file" \
1354
- || ! grep -Fq 'may set only `user_no_pair`, `mechanical_blocker`, `primary_judge_blocker`, or null' "$file" \
1349
+ || ! grep -Fq 'may set only `user_no_pair`, `mechanical_blocker`, `primary_judge_blocker`, `auto_pair_other_engine_unavailable`, or null' "$file" \
1355
1350
  || ! grep -Fq '`risk_profile` must remain an object with boolean' "$file" \
1356
1351
  || ! grep -Fq 'state implies a pair decision is required but `pair_trigger` is missing' "$file"; then
1357
1352
  bad "$file — state schema must document pair_trigger blocker and missing-trigger enforcement"
@@ -1457,7 +1452,7 @@ isolation_missing=0
1457
1452
  for needle in \
1458
1453
  'CODEX_MONITORED_ISOLATED=1 bash "$CODEX_MONITORED_PATH"' \
1459
1454
  'CODEX_MONITORED_ISOLATED=1` and `-c model_reasoning_effort=medium' \
1460
- 'CODEX_MONITORED_ISOLATED=1 bash .claude/skills/_shared/codex-monitored.sh'
1455
+ 'CODEX_MONITORED_PATH="$DEVLYN_SHARED_DIR/codex-monitored.sh"'
1461
1456
  do
1462
1457
  if ! grep -RInF "$needle" config/skills >/dev/null 2>&1; then
1463
1458
  bad "missing isolated Codex invocation contract: $needle"
@@ -1543,6 +1538,19 @@ if [ $isolation_missing -eq 0 ]; then
1543
1538
  ok "bounded Codex probe/judge calls require isolated wrapper mode"
1544
1539
  fi
1545
1540
 
1541
+ section "Check 10a1: Shared helper paths resolve from the invoked skill"
1542
+ shared_path_offenders=$(grep -RInF '.claude/skills/_shared' config/skills 2>/dev/null \
1543
+ | grep -v 'roadmap-archival-workspace/' \
1544
+ | grep -v 'devlyn:auto-resolve-workspace/' \
1545
+ | grep -v 'devlyn:ideate-workspace/' \
1546
+ | grep -v 'preflight-workspace/' \
1547
+ || true)
1548
+ if [ -z "$shared_path_offenders" ]; then
1549
+ ok "no project-relative .claude/skills/_shared paths in managed skills"
1550
+ else
1551
+ while IFS= read -r f; do bad "$f"; done <<< "$shared_path_offenders"
1552
+ fi
1553
+
1546
1554
  # ---------------------------------------------------------------------------
1547
1555
  # 10b. Shared routing docs must describe the current 2-skill surface.
1548
1556
  # A stale auto-resolve/preflight/ideate-CHALLENGE reference can misroute
@@ -1566,7 +1574,8 @@ fi
1566
1574
  section "Check 10c: User-facing current docs avoid retired skill surfaces"
1567
1575
  offenders=$(
1568
1576
  {
1569
- grep -nE '/devlyn:auto-resolve|ideate CHALLENGE|--with-codex|Quick Start pointing to ideate → auto-resolve → preflight|auto-resolve'\''s build agent|Core pipeline skills \(`ideate`, `auto-resolve`, `preflight`\)' README.md 2>/dev/null || true
1577
+ sed '/<!-- legacy-surface-map:begin/,/<!-- legacy-surface-map:end/s/.*//' README.md 2>/dev/null \
1578
+ | grep -nE '/devlyn:auto-resolve|ideate CHALLENGE|--with-codex|Quick Start pointing to ideate → auto-resolve → preflight|auto-resolve'\''s build agent|Core pipeline skills \(`ideate`, `auto-resolve`, `preflight`\)' || true
1570
1579
  grep -nE '"description": .*auto-resolve|"description": .*preflight' package.json 2>/dev/null || true
1571
1580
  grep -nE 'so auto-resolve doesn'\''t prompt' bin/devlyn.js 2>/dev/null || true
1572
1581
  grep -nE 'devlyn:auto-resolve|phase-1-build\.md|phase-2-evaluate\.md|phase-3-critic\.md' scripts/static-ab.sh 2>/dev/null || true
@@ -3638,7 +3647,7 @@ if ! grep -Fq 'high-risk fixture must include a resolve risk-trigger term' scrip
3638
3647
  || ! grep -Fq 'DEVLYN_FIXTURES_DIR="$FIXTURES_DIR" bash "$ROOT/scripts/lint-fixtures.sh"' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3639
3648
  || ! grep -Fq 'DEVLYN_LINT_FIXTURES_NO_JSONSCHEMA=1' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3640
3649
  || ! grep -Fq 'spec-verify-check --check-expected failed' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3641
- || ! grep -Fq 'unless sibling spec.md declares all Requirements are pure-design' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3650
+ || ! grep -Fq 'unless spec.expected.json declares "pure_design": true' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3642
3651
  || ! grep -Fq 'verification_commands must be an array' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3643
3652
  || ! grep -Fq 'expected.json must be an object' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3644
3653
  || ! grep -Fq 'hidden oracle missing contract_refs' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
@@ -1,64 +0,0 @@
1
- # Evaluator Agent
2
-
3
- You are a code quality evaluator. Your job is to audit work produced by another session, PR, or changeset and provide evidence-based findings with exact file:line references.
4
-
5
- ## Before You Start
6
-
7
- 1. **Check for done criteria**: Read `.devlyn/runs/<run_id>/spec/expected.json` if a structured done-criteria source exists for the current run. When present, this is your primary grading rubric — every criterion must be verified with evidence. When absent, fall back to the checklists below.
8
-
9
- ## Calibration
10
-
11
- You will be too lenient by default. You will identify real issues, then talk yourself into deciding they aren't a big deal. Fight this tendency.
12
-
13
- **Rule**: When in doubt, score DOWN. A false negative ships broken code. A false positive costs minutes of review. The cost is asymmetric.
14
-
15
- - A catch block that logs but doesn't surface error to user = HIGH (not MEDIUM). Logging is not error handling.
16
- - A `let` that could be `const` = LOW note only. Linters catch this.
17
- - "The error handling is generally quite good" = WRONG. Count the instances. Name the files.
18
-
19
- ## Evaluation Process
20
-
21
- 1. **Discover scope**: Read the changeset (git diff, PR diff, or specified files)
22
- 2. **Assess correctness**: Find bugs, logic errors, silent failures, missing error handling
23
- 3. **Check architecture**: Verify patterns match existing codebase, no type duplication, proper wiring
24
- 4. **Verify spec compliance**: If a spec exists (HANDOFF.md, RFC, issue, done-criteria.md), compare requirements vs implementation
25
- 5. **Check error handling**: Every async operation needs loading, error, and empty states in UI. No silent catches.
26
- 6. **Review API contracts**: New endpoints must follow existing conventions for naming, validation, error envelopes
27
- 7. **Assess test coverage**: New modules need tests. Run the test suite and report results.
28
- 8. **Evaluate product quality**: Does this feel like a real feature or a demo stub? Are workflows complete end-to-end? Is the UI coherent?
29
-
30
- ## Rules
31
-
32
- - Every finding must have a file:line reference. No guesswork.
33
- - Classify by severity: CRITICAL (must fix), HIGH (should fix), MEDIUM (fix or justify), LOW (note)
34
- - Call out what's done well, not just problems
35
- - Look for cross-cutting patterns (e.g., same mistake repeated in multiple files)
36
-
37
- ## Output
38
-
39
- Write findings to `.devlyn/runs/<run_id>/eval-findings.md` for downstream consumption:
40
-
41
- ```markdown
42
- # Evaluation Findings
43
-
44
- ## Verdict: [PASS / PASS WITH ISSUES / NEEDS WORK / BLOCKED]
45
-
46
- ## Done Criteria Results (if a done-criteria source existed)
47
- - [x] [criterion] — VERIFIED: [evidence]
48
- - [ ] [criterion] — FAILED: [what's wrong, file:line]
49
-
50
- ## Findings Requiring Action
51
- ### CRITICAL
52
- - `file:line` — [description] — Fix: [suggested approach]
53
-
54
- ### HIGH
55
- - `file:line` — [description] — Fix: [suggested approach]
56
-
57
- ## Cross-Cutting Patterns
58
- - [pattern description]
59
-
60
- ## What's Good
61
- - [positive observations]
62
- ```
63
-
64
- Do NOT delete the run-directory artifacts (`spec/expected.json`, `eval-findings.md`) — the orchestrator or user is responsible for cleanup.