@@ -559,62 +559,64 @@ Classification criteria:
559559
560560| Case | Type | Rationale | Status |
561561| ------| ------| -----------| ---------|
562- | 1.1 Load valid config| Integration | Parses real file from disk and produces model used by other commands| Automated |
563- | 1.2 Missing config file| Integration | Depends on filesystem error handling| Automated |
564- | 1.3 Malformed YAML| Unit | Focus on parse failure surfaced by loader logic| Gap |
565- | 1.4 Path forms (abs/rel)| Unit | Pure path resolution logic; can be isolated| Automated |
566- | 1.5 Empty repositories list| Unit | Behavior is early-return logic| Automated |
567- | 1.6 Empty recipes list| Unit | Lookup logic and conditional absence handling| Gap |
568- | 1.7 Resolve recipe names uniquely| Unit | Name lookup & matching only| Automated |
562+ | 1.1 Load valid config| Integration | Parses real file from disk and produces model used by other commands| ✅ Automated |
563+ | 1.2 Missing config file| Integration | Depends on filesystem error handling| ✅ Automated |
564+ | 1.3 Malformed YAML| Unit | Focus on parse failure surfaced by loader logic| ⚠️ Partial - need structured tests |
565+ | 1.4 Path forms (abs/rel)| Unit | Pure path resolution logic; can be isolated| ✅ Automated |
566+ | 1.5 Empty repositories list| Unit | Behavior is early-return logic| ✅ Automated |
567+ | 1.6 Empty recipes list| Unit | Lookup logic and conditional absence handling| ⚠️ Partial - needs dedicated tests |
568+ | 1.7 Resolve recipe names uniquely| Unit | Name lookup & matching only| ✅ Automated |
569+ | Symlink repository path resolution| Integration | FS symlink target resolution & safety| ❌ Gap |
569570
570571### 18.2 Repository Management
571572
572573| Case | Type | Rationale | Status |
573574| ------| ------| -----------| ---------|
574- | 2.1 Clone single repository| Integration | Invokes ` git clone ` and filesystem| Automated |
575- | 2.2 Clone multiple sequential| Integration | Iterative multi repo interaction| Automated |
576- | 2.3 Clone multiple parallel| Integration | Concurrency + multiple git operations| Automated |
577- | 2.4 Skip cloning if directory exists| Integration | Relies on FS presence checks| Automated |
578- | 2.5 Invalid repo URL| Integration | Captures external command failure| Automated |
579- | 2.6 Branch override| Integration | Uses git branch checkout| Gap |
580- | 2.7 Tag filtering include-only| Unit | Pure filtering logic| Automated |
581- | 2.8 Tag exclusion| Unit | Pure filtering logic| Automated |
582- | 2.9 Explicit repos override| Unit | Selection precedence logic| Automated |
583- | 2.10 Mixed include/exclude| Unit | Logical combination test| Automated |
575+ | 2.1 Clone single repository| Integration | Invokes ` git clone ` and filesystem| ✅ Automated |
576+ | 2.2 Clone multiple sequential| Integration | Iterative multi repo interaction| ✅ Automated |
577+ | 2.3 Clone multiple parallel| Integration | Concurrency + multiple git operations| ✅ Automated |
578+ | 2.4 Skip cloning if directory exists| Integration | Relies on FS presence checks| ✅ Automated |
579+ | 2.5 Invalid repo URL| Integration | Captures external command failure| ✅ Automated |
580+ | 2.6 Branch override| Integration | Uses git branch checkout| ❌ Gap - needs implementation |
581+ | 2.7 Tag filtering include-only| Unit | Pure filtering logic| ✅ Automated |
582+ | 2.8 Tag exclusion| Unit | Pure filtering logic| ✅ Automated |
583+ | 2.9 Explicit repos override| Unit | Selection precedence logic| ✅ Automated |
584+ | 2.10 Mixed include/exclude| Unit | Logical combination test| ✅ Automated |
584585
585586### 18.3 Run Command (Command Mode)
586587
587588| Case | Type | Rationale | Status |
588589| ------| ------| -----------| ---------|
589- | 3.1 Single echo| Integration | Executes shell in repo context| Automated |
590- | 3.2 Multiple sequential| Integration | Iterative multi-repo execution| Automated |
591- | 3.3 Multiple parallel| Integration | Concurrency execution path| Automated |
592- | 3.4 Long command name sanitization| Unit | String transformation only| Automated |
593- | 3.5 Special characters command| Integration | Actual shell invocation & metadata capture| Automated |
594- | 3.6 Empty command string| Unit | Validation logic (candidate for stricter behavior) | Partial |
595- | 3.7 No-save mode behavior| Integration | Affects artifact creation side-effects| Automated |
596- | 3.8 Save mode directory creation| Integration | Filesystem structure| Automated |
597- | 3.9 Existing output directory reuse| Integration | FS existence + new path logic| Automated |
598- | 3.10 Exit code recording| Unit | Mapping + extraction (can isolate via fake status) | Automated |
599- | 3.11 Exit code description mapping| Unit | Pure match function| Partial |
600- | 3.12 Metadata.json structure (command)| Integration | Requires file writing & JSON content| Automated |
590+ | 3.1 Single echo| Integration | Executes shell in repo context| ✅ Automated |
591+ | 3.2 Multiple sequential| Integration | Iterative multi-repo execution| ✅ Automated |
592+ | 3.3 Multiple parallel| Integration | Concurrency execution path| ✅ Automated |
593+ | 3.4 Long command name sanitization| Unit | String transformation only| ✅ Automated |
594+ | 3.5 Special characters command| Integration | Actual shell invocation & metadata capture| ✅ Automated |
595+ | 3.6 Empty command string| Unit | Validation logic (candidate for stricter behavior) | ⚠️ Partial - behavior unclear |
596+ | 3.7 No-save mode behavior| Integration | Affects artifact creation side-effects| ✅ Automated |
597+ | 3.8 Save mode directory creation| Integration | Filesystem structure| ✅ Automated |
598+ | 3.9 Existing output directory reuse| Integration | FS existence + new path logic| ✅ Automated |
599+ | 3.10 Exit code recording| Unit | Mapping + extraction (can isolate via fake status) | ✅ Automated |
600+ | 3.11 Exit code description mapping| Unit | Pure match function| ✅ Automated (added unit tests) |
601+ | 3.12 Metadata.json structure (command)| Integration | Requires file writing & JSON content| ✅ Automated |
601602
602603### 18.4 Run Command (Recipe Mode)
603604
604605| Case | Type | Rationale | Status |
605606| ------| ------| -----------| ---------|
606- | 4.1 Single-step recipe| Integration | Script materialization + execution| Automated |
607- | 4.2 Multi-step sequential| Integration | Aggregate execution order| Automated |
608- | 4.3 Multi-repo parallel recipe| Integration | Concurrency + FS per repo| Automated |
609- | 4.4 Script created & removed| Integration | FS artifact lifecycle| Automated |
610- | 4.5 Metadata.json recipe fields| Integration | Generated file content| Automated |
611- | 4.6 Recipe name not found| Unit | Lookup error path| Automated |
612- | 4.7 Zero steps recipe| Unit | Validation / precondition logic| Automated |
613- | 4.8 Implicit shebang| Unit | Script content transformation| Automated |
614- | 4.9 Permissions set| Integration | Actual FS permissions required| Automated |
615- | 4.10 Cleanup on failure| Integration | Execution + post-failure cleanup| Automated |
616- | 4.11 Exit codes propagate| Integration | Real failing script status| Automated |
617- | 4.12 Mixed success/failure halts| Integration | Execution control flow| Partial |
607+ | 4.1 Single-step recipe| Integration | Script materialization + execution| ✅ Automated |
608+ | 4.2 Multi-step sequential| Integration | Aggregate execution order| ✅ Automated |
609+ | 4.3 Multi-repo parallel recipe| Integration | Concurrency + FS per repo| ✅ Automated |
610+ | 4.4 Script created & removed| Integration | FS artifact lifecycle| ✅ Automated |
611+ | 4.5 Metadata.json recipe fields| Integration | Generated file content| ✅ Automated |
612+ | 4.6 Recipe name not found| Unit | Lookup error path| ✅ Automated |
613+ | 4.7 Zero steps recipe| Unit | Validation / precondition logic| ✅ Automated |
614+ | 4.8 Implicit shebang| Unit | Script content transformation| ✅ Automated |
615+ | 4.9 Permissions set| Integration | Actual FS permissions required| ✅ Automated |
616+ | 4.10 Cleanup on failure| Integration | Execution + post-failure cleanup| ✅ Automated |
617+ | 4.11 Exit codes propagate| Integration | Real failing script status| ✅ Automated |
618+ | 4.12 Mixed success/failure halts| Integration | Execution control flow| ⚠️ Partial - needs verification |
619+ | Unicode script name sanitization| Unit | Ensures generated script filename handles Unicode safely| ❌ Gap |
618620
619621### 18.5 Logging & Output
620622
@@ -626,6 +628,7 @@ Classification criteria:
626628| 5.4 Timestamp format| Unit | Formatting function| Gap |
627629| 5.5 Directory naming pattern| Unit | String assembly + sanitization| Partial |
628630| 5.6 Truncation behavior| Unit | String length logic| Automated |
631+ | Simultaneous runs distinct timestamps| Integration | Parallel invocations produce non-colliding directories| ❌ Gap |
629632
630633### 18.6 Parallel vs Sequential Behavior
631634
@@ -645,13 +648,13 @@ All considered Integration (multi-repo orchestration). Stress/performance varian
645648
646649| Case | Type | Rationale | Status |
647650| ------| ------| -----------| ---------|
648- | 8.1 Missing command & recipe| E2E | Full CLI argument validation path| Automated |
649- | 8.2 Nonexistent binary (plugin)| Integration | External process failure under plugin harness| Partial |
650- | 8.3 Mutual exclusivity metadata| Integration | Generated file schema| Automated |
651- | 8.4 Command not found 127| Integration | Real process exit| Automated |
652- | 8.5 Script cannot execute 126| Integration | Permission/exec failure| Gap |
653- | 8.6 Interrupted 130| Integration | Signal handling from process| Gap |
654- | Signal >128 mapping (edge)| Unit | Mapping function correctness| Gap |
651+ | 8.1 Missing command & recipe| E2E | Full CLI argument validation path| ✅ Automated (recently fixed) |
652+ | 8.2 Nonexistent binary (plugin)| Integration | External process failure under plugin harness| ⚠️ Partial |
653+ | 8.3 Mutual exclusivity metadata| Integration | Generated file schema| ✅ Automated |
654+ | 8.4 Command not found 127| Integration | Real process exit| ✅ Automated |
655+ | 8.5 Script cannot execute 126| Integration | Permission/exec failure| ❌ Gap |
656+ | 8.6 Interrupted 130| Integration | Signal handling from process| ❌ Gap |
657+ | Signal >128 mapping (edge)| Unit | Mapping function correctness| ❌ Gap |
655658
656659### 18.9 Plugins
657660
@@ -663,6 +666,7 @@ All considered Integration (multi-repo orchestration). Stress/performance varian
663666| 9.4 Fallback when no plugins present| Integration | Graceful empty state | Automated |
664667| 9.5 Help text still accessible with plugins| E2E | Full CLI parsing with dynamic plugin context | Gap |
665668| 9.6 Plugin does not interfere with core logging| Integration | Compare logs with/without plugins | Partial |
669+ | Multiple plugins simultaneously| Integration | Validates isolation & non-interference with more than one plugin | ❌ Gap |
666670
667671### 18.10 Pull Requests
668672
0 commit comments