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.
- package/AGENTS.md +10 -72
- package/CLAUDE.md +29 -12
- package/README.md +7 -5
- package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +8 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +28 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +15 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +57 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +10 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +50 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +59 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +9 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +88 -0
- package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +45 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +30 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +16 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +64 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +10 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +21 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +58 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +9 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +54 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +82 -0
- package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +77 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +99 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +18 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +64 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +10 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +4 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +61 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +9 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +135 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +100 -0
- package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +75 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +93 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +16 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +65 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +10 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +18 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +66 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +9 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +84 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +184 -0
- package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +74 -0
- package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +12 -0
- package/benchmark/auto-resolve/scripts/run-fixture.sh +39 -1
- package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +1 -1
- package/bin/devlyn.js +71 -83
- package/config/skills/_shared/adapters/README.md +7 -0
- package/config/skills/_shared/adapters/claude.md +49 -2
- package/config/skills/_shared/adapters/omp.md +17 -0
- package/config/skills/_shared/archive_run.py +8 -2
- package/config/skills/_shared/codex-config.md +22 -6
- package/config/skills/_shared/engine-doctor.sh +107 -0
- package/config/skills/_shared/engine-preflight.md +18 -11
- package/config/skills/_shared/expected.schema.json +26 -0
- package/config/skills/_shared/pair-plan-schema.md +2 -2
- package/config/skills/_shared/runtime-principles.md +1 -1
- package/config/skills/_shared/spec-verify-check.py +773 -486
- package/config/skills/_shared/state-phase-write.py +374 -0
- package/config/skills/_shared/verify-merge-findings.py +177 -61
- package/config/skills/devlyn:engines/SKILL.md +47 -0
- package/config/skills/devlyn:ideate/SKILL.md +22 -3
- package/config/skills/devlyn:ideate/references/elicitation.md +2 -2
- package/config/skills/devlyn:ideate/references/from-spec-mode.md +2 -2
- package/config/skills/devlyn:ideate/references/project-mode.md +1 -1
- package/config/skills/devlyn:ideate/references/spec-template.md +15 -4
- package/config/skills/devlyn:queue/SKILL.md +26 -0
- package/config/skills/devlyn:resolve/SKILL.md +55 -25
- package/config/skills/devlyn:resolve/references/free-form-mode.md +1 -1
- package/config/skills/devlyn:resolve/references/phases/build-gate.md +2 -2
- package/config/skills/devlyn:resolve/references/phases/cleanup.md +1 -1
- package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
- package/config/skills/devlyn:resolve/references/phases/plan.md +3 -2
- package/config/skills/devlyn:resolve/references/phases/probe-derive.md +8 -0
- package/config/skills/devlyn:resolve/references/phases/verify.md +18 -9
- package/config/skills/devlyn:resolve/references/state-schema.md +11 -7
- package/optional-skills/devlyn:pencil-pull/SKILL.md +5 -0
- package/optional-skills/devlyn:pencil-push/SKILL.md +5 -0
- package/package.json +1 -2
- package/scripts/lint-skills.sh +55 -46
- package/agents-config/evaluator.md +0 -64
package/scripts/lint-skills.sh
CHANGED
|
@@ -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
|
|
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
|
|
202
|
-
offenders=$(grep -
|
|
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 "
|
|
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 '"
|
|
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 '
|
|
604
|
-
|| ! grep -Fq '
|
|
605
|
-
|
|
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 '
|
|
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 '
|
|
648
|
-
|| ! grep -Fq '
|
|
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
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
|
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.
|