devlyn-cli 2.7.0 → 2.8.1

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 (79) hide show
  1. package/AGENTS.md +9 -1
  2. package/CLAUDE.md +30 -11
  3. package/README.md +14 -2
  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 +42 -1
  48. package/config/skills/_shared/adapters/README.md +7 -0
  49. package/config/skills/_shared/adapters/claude.md +47 -0
  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/runtime-principles.md +1 -1
  57. package/config/skills/_shared/spec-verify-check.py +773 -486
  58. package/config/skills/_shared/state-phase-write.py +374 -0
  59. package/config/skills/_shared/verify-merge-findings.py +177 -61
  60. package/config/skills/devlyn:engines/SKILL.md +47 -0
  61. package/config/skills/devlyn:ideate/SKILL.md +22 -3
  62. package/config/skills/devlyn:ideate/references/elicitation.md +2 -2
  63. package/config/skills/devlyn:ideate/references/from-spec-mode.md +2 -2
  64. package/config/skills/devlyn:ideate/references/project-mode.md +1 -1
  65. package/config/skills/devlyn:ideate/references/spec-template.md +15 -4
  66. package/config/skills/devlyn:queue/SKILL.md +26 -0
  67. package/config/skills/devlyn:resolve/SKILL.md +54 -24
  68. package/config/skills/devlyn:resolve/references/free-form-mode.md +1 -1
  69. package/config/skills/devlyn:resolve/references/phases/build-gate.md +2 -2
  70. package/config/skills/devlyn:resolve/references/phases/cleanup.md +1 -1
  71. package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
  72. package/config/skills/devlyn:resolve/references/phases/plan.md +3 -2
  73. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +8 -0
  74. package/config/skills/devlyn:resolve/references/phases/verify.md +18 -9
  75. package/config/skills/devlyn:resolve/references/state-schema.md +10 -6
  76. package/optional-skills/devlyn:pencil-pull/SKILL.md +5 -0
  77. package/optional-skills/devlyn:pencil-push/SKILL.md +5 -0
  78. package/package.json +1 -1
  79. package/scripts/lint-skills.sh +48 -41
@@ -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
@@ -243,7 +245,7 @@ if [ ! -e "optional-skills/devlyn:design-ui" ]; then
243
245
  else
244
246
  bad "devlyn:design-ui must not be installed as an optional addon"
245
247
  fi
246
- 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 \
247
249
  && grep -Fq "skillsToInstall: DEVLYN_CORE_SKILLS" bin/devlyn.js; then
248
250
  ok "Codex install includes devlyn:design-ui (via shared DEVLYN_CORE_SKILLS bundle)"
249
251
  else
@@ -394,7 +396,7 @@ if ! grep -Fq 'SAFE_RUN_ID_RE' config/skills/_shared/archive_run.py \
394
396
  || ! grep -Fq 'invalid JSON numeric constant: NaN' config/skills/_shared/archive_run.py \
395
397
  || ! grep -Fq '"verify.pair.findings.jsonl"' config/skills/_shared/archive_run.py \
396
398
  || ! grep -Fq '"verify-merge.summary.json"' config/skills/_shared/archive_run.py \
397
- || ! grep -Fq '"codex-judge.*"' config/skills/_shared/archive_run.py; then
399
+ || ! grep -Fq '"*-judge.*"' config/skills/_shared/archive_run.py; then
398
400
  bad "archive_run.py must safely archive pair/risk-probe evidence and reject unsafe run ids"
399
401
  fi
400
402
 
@@ -601,9 +603,16 @@ then
601
603
  else
602
604
  bad "solo-headroom command detection constants must stay in parity"
603
605
  fi
604
- if ! grep -Fq 'required.add("rollback_state")' config/skills/_shared/spec-verify-check.py \
605
- || ! grep -Fq 'rollback verification text did not require rollback_state probe tag' config/skills/_shared/spec-verify-check.py; then
606
- 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)"
607
616
  fi
608
617
  if ! grep -Fq 'spec.expected.json top-level array produced a traceback' config/skills/_shared/spec-verify-check.py \
609
618
  || ! grep -Fq 'invalid spec.expected.json produced a traceback' config/skills/_shared/spec-verify-check.py \
@@ -616,10 +625,6 @@ if ! grep -Fq 'spec.expected.json top-level array produced a traceback' config/s
616
625
  || ! grep -Fq 'has invalid JSON' config/skills/_shared/spec-verify-check.py; then
617
626
  bad "spec-verify-check.py self-test must fail malformed spec.expected.json cleanly without traceback"
618
627
  fi
619
- if ! grep -Fq 'required.add("error_contract")' config/skills/_shared/spec-verify-check.py \
620
- || ! grep -Fq 'error_contract without exit-code evidence was accepted' config/skills/_shared/spec-verify-check.py; then
621
- bad "spec-verify-check.py must require error_contract risk probes for invalid/stderr/JSON-error/exit-2 verification text"
622
- fi
623
628
  if ! grep -Fq '"asserts_named_stream_output"' config/skills/_shared/spec-verify-check.py \
624
629
  || ! grep -Fq '"asserts_error_payload_or_stderr"' config/skills/_shared/spec-verify-check.py \
625
630
  || ! grep -Fq '"asserts_nonzero_or_exit_2"' config/skills/_shared/spec-verify-check.py \
@@ -632,7 +637,6 @@ if ! grep -Fq '"asserts_named_stream_output"' config/skills/_shared/spec-verify-
632
637
  fi
633
638
  if ! grep -Fq '"http_error_contract"' config/skills/_shared/spec-verify-check.py \
634
639
  || ! grep -Fq 'asserts_http_error_status' config/skills/_shared/spec-verify-check.py \
635
- || ! grep -Fq 'http error text did not require http_error_contract tag' config/skills/_shared/spec-verify-check.py \
636
640
  || ! grep -Fq 'http_error_contract without payload evidence was accepted' config/skills/_shared/spec-verify-check.py \
637
641
  || ! grep -Fq 'exact error body shape_contract without exact object evidence was accepted' config/skills/_shared/spec-verify-check.py \
638
642
  || ! grep -Fq 'exact error body shape_contract with exact object evidence was rejected' config/skills/_shared/spec-verify-check.py \
@@ -643,55 +647,31 @@ fi
643
647
  if ! grep -Fq '"uses_visible_input_key_names"' config/skills/_shared/spec-verify-check.py \
644
648
  || ! grep -Fq '"asserts_visible_output_key_names"' config/skills/_shared/spec-verify-check.py \
645
649
  || ! grep -Fq '"asserts_no_unexpected_output_keys"' config/skills/_shared/spec-verify-check.py \
646
- || ! 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 \
647
651
  || ! grep -Fq 'JSON error object shape_contract with exact object evidence was rejected' config/skills/_shared/spec-verify-check.py \
648
- || ! grep -Fq 'INLINE_JSON_OBJECT_RE' config/skills/_shared/spec-verify-check.py \
649
- || ! grep -Fq 'inline JSON object text did not require shape_contract tag' config/skills/_shared/spec-verify-check.py \
650
- || ! grep -Fq 'inline JSON object shape_contract with key evidence was rejected' config/skills/_shared/spec-verify-check.py \
651
- || ! grep -Fq 'inline JSON error text did not require shape_contract tag' config/skills/_shared/spec-verify-check.py \
652
- || ! grep -Fq 'inline JSON error shape_contract with exact object evidence was rejected' config/skills/_shared/spec-verify-check.py \
653
- || ! 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 \
654
654
  || ! grep -Fq '`shape_contract` when the visible text names exact keys' config/skills/devlyn:resolve/references/phases/probe-derive.md \
655
655
  || ! grep -Fq '`shape_contract` must' config/skills/devlyn:resolve/SKILL.md; then
656
- bad "risk-probe shape contracts must require exact visible input/output key evidence when visible text names shape"
657
- fi
658
- if ! grep -Fq "forbidden[ -]+window" config/skills/_shared/spec-verify-check.py \
659
- || grep -Fq "r'blocked|overlap|forbidden|window'" config/skills/_shared/spec-verify-check.py \
660
- || ! grep -Fq 'generic forbidden-pattern verification text incorrectly required boundary_overlap' config/skills/_shared/spec-verify-check.py; then
661
- bad "risk-probe boundary_overlap must trigger for forbidden windows / blocked overlap, not generic forbidden pattern text"
662
- fi
663
- if ! grep -Fq '(?:stock|inventory|balance|availability).{0,80}(?:later|remaining|after failures)' config/skills/_shared/spec-verify-check.py \
664
- || ! grep -Fq 'stock validation error text incorrectly required prior_consumption' config/skills/_shared/spec-verify-check.py; then
665
- 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"
666
657
  fi
667
658
  if ! grep -Fq '"auth_signature_contract"' config/skills/_shared/spec-verify-check.py \
668
659
  || ! grep -Fq '"idempotency_replay"' config/skills/_shared/spec-verify-check.py \
669
660
  || ! grep -Fq 'asserts_signature_over_exact_bytes' config/skills/_shared/spec-verify-check.py \
670
661
  || ! grep -Fq 'duplicate_id_rejected_regardless_of_body' config/skills/_shared/spec-verify-check.py \
671
- || ! grep -Fq 'webhook signature/replay text did not require auth/idempotency probe tags' config/skills/_shared/spec-verify-check.py \
672
662
  || ! grep -Fq '`auth_signature_contract`: `asserts_signature_over_exact_bytes`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
673
663
  || ! grep -Fq '`idempotency_replay`: `first_delivery_then_duplicate`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
674
664
  || ! grep -Fq '`auth_signature_contract` must include `asserts_signature_over_exact_bytes`' config/skills/devlyn:resolve/SKILL.md; then
675
665
  bad "risk-probe webhook/signature/replay contracts must require concrete auth_signature_contract and idempotency_replay tags"
676
666
  fi
677
- if ! grep -Fq 'signing|signed' config/skills/_shared/spec-verify-check.py \
678
- || ! grep -Fq 'same.{0,40}`?id`?' config/skills/_shared/spec-verify-check.py; then
679
- bad "risk-probe webhook signature/replay trigger must catch signing/signed and same accepted id wording"
680
- fi
681
- if ! grep -Fq 'duplicate[ -]+(?:delivery|event|id)' config/skills/_shared/spec-verify-check.py \
682
- || ! grep -Fq 'duplicate SKU verification text incorrectly required idempotency_replay' config/skills/_shared/spec-verify-check.py; then
683
- bad "risk-probe idempotency_replay must trigger on duplicate delivery/event/id, not duplicate SKU aggregation"
684
- fi
685
667
  if ! grep -Fq '"concurrent_state_consistency"' config/skills/_shared/spec-verify-check.py \
686
668
  || ! grep -Fq 'overlapping_mutations_exercised' config/skills/_shared/spec-verify-check.py \
687
- || ! grep -Fq 'concurrent state text did not require concurrent_state_consistency tag' config/skills/_shared/spec-verify-check.py \
688
669
  || ! grep -Fq '`concurrent_state_consistency`: `overlapping_mutations_exercised`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
689
670
  || ! grep -Fq '`concurrent_state_consistency` must' config/skills/devlyn:resolve/SKILL.md; then
690
671
  bad "risk-probe concurrent state contracts must require concrete concurrent_state_consistency markers"
691
672
  fi
692
673
  if ! grep -Fq '"atomic_batch_state"' config/skills/_shared/spec-verify-check.py \
693
674
  || ! grep -Fq 'mixed_valid_invalid_batch' config/skills/_shared/spec-verify-check.py \
694
- || ! grep -Fq 'atomic batch text did not require atomic_batch_state tag' config/skills/_shared/spec-verify-check.py \
695
675
  || ! grep -Fq 'atomic_batch_state without success-order evidence was accepted' config/skills/_shared/spec-verify-check.py \
696
676
  || ! grep -Fq '`atomic_batch_state`: `mixed_valid_invalid_batch`' config/skills/devlyn:resolve/references/phases/probe-derive.md \
697
677
  || ! grep -Fq '`atomic_batch_state` must include `mixed_valid_invalid_batch`' config/skills/devlyn:resolve/SKILL.md; then
@@ -1098,6 +1078,20 @@ if ! grep -Fq 'If the spec includes a solo-headroom hypothesis, one of the two t
1098
1078
  else
1099
1079
  ok "resolve pair-JUDGE prompts prioritize solo-headroom hypothesis"
1100
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
1101
1095
  if ! grep -Fq 'current free-form `state.complexity` is `"large"`' config/skills/devlyn:resolve/SKILL.md \
1102
1096
  || ! grep -Fq 'current free-form `state.complexity` is `"large"`' .claude/skills/devlyn:resolve/SKILL.md \
1103
1097
  || ! grep -Fq 'current free-form `state.complexity` is `"large"`' .agents/skills/devlyn:resolve/SKILL.md \
@@ -1352,7 +1346,7 @@ for file in \
1352
1346
  .agents/skills/devlyn:resolve/references/state-schema.md
1353
1347
  do
1354
1348
  if ! grep -Fq 'MECHANICAL and the primary JUDGE have no verdict-binding blockers' "$file" \
1355
- || ! 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" \
1356
1350
  || ! grep -Fq '`risk_profile` must remain an object with boolean' "$file" \
1357
1351
  || ! grep -Fq 'state implies a pair decision is required but `pair_trigger` is missing' "$file"; then
1358
1352
  bad "$file — state schema must document pair_trigger blocker and missing-trigger enforcement"
@@ -1458,7 +1452,7 @@ isolation_missing=0
1458
1452
  for needle in \
1459
1453
  'CODEX_MONITORED_ISOLATED=1 bash "$CODEX_MONITORED_PATH"' \
1460
1454
  'CODEX_MONITORED_ISOLATED=1` and `-c model_reasoning_effort=medium' \
1461
- 'CODEX_MONITORED_ISOLATED=1 bash .claude/skills/_shared/codex-monitored.sh'
1455
+ 'CODEX_MONITORED_PATH="$DEVLYN_SHARED_DIR/codex-monitored.sh"'
1462
1456
  do
1463
1457
  if ! grep -RInF "$needle" config/skills >/dev/null 2>&1; then
1464
1458
  bad "missing isolated Codex invocation contract: $needle"
@@ -1544,6 +1538,19 @@ if [ $isolation_missing -eq 0 ]; then
1544
1538
  ok "bounded Codex probe/judge calls require isolated wrapper mode"
1545
1539
  fi
1546
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
+
1547
1554
  # ---------------------------------------------------------------------------
1548
1555
  # 10b. Shared routing docs must describe the current 2-skill surface.
1549
1556
  # A stale auto-resolve/preflight/ideate-CHALLENGE reference can misroute
@@ -3640,7 +3647,7 @@ if ! grep -Fq 'high-risk fixture must include a resolve risk-trigger term' scrip
3640
3647
  || ! grep -Fq 'DEVLYN_FIXTURES_DIR="$FIXTURES_DIR" bash "$ROOT/scripts/lint-fixtures.sh"' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3641
3648
  || ! grep -Fq 'DEVLYN_LINT_FIXTURES_NO_JSONSCHEMA=1' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3642
3649
  || ! grep -Fq 'spec-verify-check --check-expected failed' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3643
- || ! 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 \
3644
3651
  || ! grep -Fq 'verification_commands must be an array' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3645
3652
  || ! grep -Fq 'expected.json must be an object' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \
3646
3653
  || ! grep -Fq 'hidden oracle missing contract_refs' benchmark/auto-resolve/scripts/test-lint-fixtures.sh \