@futdevpro/fsm-dynamo 1.15.20 → 1.15.21
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/__documentations/2026-06-01-dc-rev-fsm-results.json +17445 -0
- package/__documentations/2026-06-01-fr047-fr048-code-review-findings.json +159 -0
- package/__documentations/2026-06-01-fr047-fr048-code-review.md +153 -0
- package/_review_tmp/r.json +17445 -0
- package/build/_enums/error-level.enum.d.ts +14 -1
- package/build/_enums/error-level.enum.d.ts.map +1 -1
- package/build/_enums/error-level.enum.js +13 -0
- package/build/_enums/error-level.enum.js.map +1 -1
- package/build/_models/data-models/errors.data-model.d.ts +8 -0
- package/build/_models/data-models/errors.data-model.d.ts.map +1 -1
- package/build/_models/data-models/errors.data-model.js +9 -0
- package/build/_models/data-models/errors.data-model.js.map +1 -1
- package/package.json +1 -1
- package/src/_enums/error-level.enum.ts +15 -0
- package/src/_models/data-models/errors.data-model.ts +10 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
{
|
|
2
|
+
"review_date": "2026-06-01",
|
|
3
|
+
"scope": {
|
|
4
|
+
"repo": "NPM-packages/dynamo-fsm",
|
|
5
|
+
"branch": "master",
|
|
6
|
+
"range": "HEAD~3..HEAD + uncommitted",
|
|
7
|
+
"commits": [
|
|
8
|
+
"08e8859 feat(ai): FR-047 P1 provider-agnostic function-calling vocabulary + per-model registry; FR-048 settings-schema reservation",
|
|
9
|
+
"de1da9b feat(ai): add adultContent (uncensored/NSFW) per-model capability",
|
|
10
|
+
"6a4ce9c fix(ai): FR-047 P5 — correct ./ai/google + ./ai/local subpath export targets"
|
|
11
|
+
],
|
|
12
|
+
"files_changed_src_only": 30,
|
|
13
|
+
"insertions": 940,
|
|
14
|
+
"deletions": 12
|
|
15
|
+
},
|
|
16
|
+
"tool": {
|
|
17
|
+
"skill": "code-review",
|
|
18
|
+
"effort": "high",
|
|
19
|
+
"finder_angles": 7,
|
|
20
|
+
"verifier_votes_per_candidate": 1,
|
|
21
|
+
"candidate_raw_count": 31,
|
|
22
|
+
"candidate_after_dedup": 17,
|
|
23
|
+
"candidates_confirmed": 12,
|
|
24
|
+
"candidates_plausible": 4,
|
|
25
|
+
"candidates_refuted": 1,
|
|
26
|
+
"output_cap": 10
|
|
27
|
+
},
|
|
28
|
+
"findings": [
|
|
29
|
+
{
|
|
30
|
+
"rank": 1,
|
|
31
|
+
"verdict": "CONFIRMED",
|
|
32
|
+
"severity": "correctness",
|
|
33
|
+
"file": "src/_modules/ai/_modules/open-ai/_enums/oai-model.enum.ts",
|
|
34
|
+
"line": 19,
|
|
35
|
+
"summary": "gptImage_1 = 'gpt-image-1' enum-entry (commented as 'current') has no matching DyFM_OAI_Models registry entry",
|
|
36
|
+
"failure_scenario": "modelSupportsTools(DyFM_OAI_Models, DyFM_OAI_Model.gptImage_1) returns false via the `?? false` default; findModelInfo returns undefined — image generation routed via tools path silently skipped"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"rank": 2,
|
|
40
|
+
"verdict": "CONFIRMED",
|
|
41
|
+
"severity": "correctness",
|
|
42
|
+
"file": "src/_modules/ai/_modules/anthropic/_enums/aai-model.enum.ts",
|
|
43
|
+
"line": 11,
|
|
44
|
+
"summary": "claude_3_5_sonnet_latest in enum but NOT in DyFM_AAI_Models registry (only 3 GA entries registered)",
|
|
45
|
+
"failure_scenario": "Default DyFM_AI_CallSettings using claude_3_5_sonnet_latest → modelSupportsTools returns false → tool-calling silently disabled on a still-live API model"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"rank": 3,
|
|
49
|
+
"verdict": "CONFIRMED",
|
|
50
|
+
"severity": "correctness",
|
|
51
|
+
"file": "src/_modules/ai/_modules/google-ai/_enums/gai-model.enum.ts",
|
|
52
|
+
"line": 11,
|
|
53
|
+
"summary": "gemini_1_5_pro_latest (legacy) in enum but NOT in DyFM_GAI_Models registry",
|
|
54
|
+
"failure_scenario": "findModelInfo(DyFM_GAI_Models, gemini_1_5_pro_latest) returns undefined → callers assuming default model lookup always succeeds break on legacy code paths"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"rank": 4,
|
|
58
|
+
"verdict": "CONFIRMED",
|
|
59
|
+
"severity": "correctness",
|
|
60
|
+
"file": "src/_modules/ai/_collections/ai-model-registry.util.ts",
|
|
61
|
+
"line": 27,
|
|
62
|
+
"summary": "modelSupportsTools silently defaults to false for unknown/typo/deprecated model IDs — no warn or log",
|
|
63
|
+
"failure_scenario": "Consumer passes typo or live-but-unregistered model → returns false → tool routing silently dropped with no diagnostic; bug invisible until runtime tool-flow fails"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"rank": 5,
|
|
67
|
+
"verdict": "CONFIRMED",
|
|
68
|
+
"severity": "correctness",
|
|
69
|
+
"file": "src/_modules/ai/_modules/anthropic/_enums/aai-model.enum.ts",
|
|
70
|
+
"line": 5,
|
|
71
|
+
"summary": "Legacy/retired model IDs mixed with active ones in same enum, distinguished only by code comments (applies to aai/gai/oai enums)",
|
|
72
|
+
"failure_scenario": "Consumer code uses an enum entry that looks valid (it's in the enum public API) but is registry-missing → silent miss; no enum-level segregation between 'active' and 'deprecated' tiers"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"rank": 6,
|
|
76
|
+
"verdict": "CONFIRMED",
|
|
77
|
+
"severity": "correctness",
|
|
78
|
+
"file": "src/_modules/ai/_models/ai-message.interface.ts",
|
|
79
|
+
"line": 6,
|
|
80
|
+
"summary": "DyFM_AI_Message.content is required (non-optional string); when role='assistant' + toolCalls populated, content is semantically empty per OpenAI/Anthropic/Gemini specs",
|
|
81
|
+
"failure_scenario": "Callers must hard-code `content: ''` workaround on every tool-call message; downstream validation may reject valid tool-request messages"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"rank": 7,
|
|
85
|
+
"verdict": "CONFIRMED",
|
|
86
|
+
"severity": "correctness",
|
|
87
|
+
"file": "src/_modules/ai/_models/ai-model-info.interface.ts",
|
|
88
|
+
"line": 37,
|
|
89
|
+
"summary": "settingsSchema?: DyFM_AI_ModelSettingsSchema reserved on every model but populated on ZERO of the 21 registry entries — ghost contract",
|
|
90
|
+
"failure_scenario": "Phase 2 reconciler reading settingsSchema sees undefined → treats as 'no constraints' instead of 'constraints not yet modeled'; silently accepts temperature/topP on Opus 4.7+ which hard-fails HTTP 400"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"rank": 8,
|
|
94
|
+
"verdict": "PLAUSIBLE",
|
|
95
|
+
"severity": "correctness",
|
|
96
|
+
"file": "src/_modules/ai/_models/ai-llm-response.interface.ts",
|
|
97
|
+
"line": 16,
|
|
98
|
+
"summary": "Both legacy finishReason and new stopReason fields present; no doc marks authoritative source",
|
|
99
|
+
"failure_scenario": "Provider translator populates only stopReason; legacy consumer checks finishReason === 'tool_use' → condition fails silently → tool flow not triggered"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"rank": 9,
|
|
103
|
+
"verdict": "PLAUSIBLE",
|
|
104
|
+
"severity": "altitude",
|
|
105
|
+
"file": "src/_modules/ai/_models/ai-tool.interface.ts",
|
|
106
|
+
"line": 1,
|
|
107
|
+
"summary": "New tool-vocab interfaces (DyFM_AI_Tool, ToolCall, ToolResult, ToolHandler) exported but ZERO callers in dynamo-fsm — abstraction unverified for FR-048",
|
|
108
|
+
"failure_scenario": "Shape may not fit all 5 providers (OpenAI type:'function' wrapper, Anthropic input_schema, Gemini functionDeclarations); mismatch discovered in Phase 2 forces API redesign mid-flight"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"rank": 10,
|
|
112
|
+
"verdict": "CONFIRMED",
|
|
113
|
+
"severity": "removed-behavior",
|
|
114
|
+
"file": "pipeline.cicd.config.json",
|
|
115
|
+
"line": 1,
|
|
116
|
+
"summary": "Uncommitted root-level pipeline.cicd.config.json deletion (-128 lines) — .dynamo/pipeline.cicd.config.json must fully cover before commit",
|
|
117
|
+
"failure_scenario": "Any external workflow / GitHub Actions / script with hardcoded './pipeline.cicd.config.json' reference 404s; the dmc migration covers the runner CI path but not stale external references"
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"dropped_below_cap": [
|
|
121
|
+
{
|
|
122
|
+
"file": "src/_modules/ai/index.ts",
|
|
123
|
+
"summary": "No meta-barrel aggregating the 5 provider model-registries → Phase 2 must hardcode 5 imports",
|
|
124
|
+
"severity": "altitude"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"file": "src/_modules/ai/_models/ai-model-capabilities.interface.ts",
|
|
128
|
+
"summary": "Capability matrix (9 fields) copy-pasted across 21 models in 5 const-files → N+1 edits required",
|
|
129
|
+
"severity": "reuse"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"file": "src/_modules/ai/_models/ai-model-capabilities.interface.ts:31",
|
|
133
|
+
"summary": "adultContent is a POLICY flag mixed into the FEATURE capability matrix — future policy flags scatter ad-hoc",
|
|
134
|
+
"severity": "altitude"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"file": "package.json",
|
|
138
|
+
"summary": "Naming inconsistency: anthropic (no hyphen) vs open-ai/google-ai/local-ai/fdp-ai → invites future export-path typos",
|
|
139
|
+
"severity": "altitude"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"file": "src/_modules/ai/_collections/ai-model-registry.util.ts:17",
|
|
143
|
+
"summary": "findModelInfo uses Array.find O(N) on every call; tool-routing + capability check = 2× O(N) per request",
|
|
144
|
+
"severity": "efficiency"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"file": "src/_modules/ai/_modules/{provider}/index.ts (×5)",
|
|
148
|
+
"summary": "Barrel exports *-models.const full registry → consumer wanting only enum bundles all const-tables (~519 lines, ~8-12 kB)",
|
|
149
|
+
"severity": "efficiency"
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
"refuted": [
|
|
153
|
+
{
|
|
154
|
+
"candidate": "oai-models.const.ts:235 gptImage_2 missing maxOutputTokens",
|
|
155
|
+
"reason": "maxOutputTokens? is optional on DyFM_AI_ModelInfo (line 52); no type-level contract violation, no crash guarantee on undefined access"
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
"structural_root_cause": "Top-10 findings #1-5 all symptoms of one structural mismatch: enum-entries and registry-entries are NOT in sync. Mitigation options: (A) move legacy entries to *-legacy.enum.ts, (B) add { strict: true } mode to modelSupportsTools, (C) build-time TS guard test verifying every enum-tag has a registry-entry. Any combination addresses #1-5 + #11 (meta-barrel) in a single follow-up commit."
|
|
159
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# 2026-06-01 — Code Review: FR-047 + FR-048 (provider-agnostic AI vocabulary)
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Code review futott a `dynamo-fsm` master branchen az utolsó 3 commit-ra (FR-047 + FR-048) + 1 uncommitted root pipeline-config deletion-re. Az effort-szint **high**: 7 finder angle × ≤6 candidate → 1-vote verify (recall-biased) → top-10 finding.
|
|
6
|
+
|
|
7
|
+
### Scope
|
|
8
|
+
|
|
9
|
+
- **Range**: `HEAD~3..HEAD` (master, no upstream divergence)
|
|
10
|
+
- **Commits**:
|
|
11
|
+
- `08e8859` feat(ai): FR-047 P1 provider-agnostic function-calling vocabulary + per-model registry; FR-048 settings-schema reservation
|
|
12
|
+
- `de1da9b` feat(ai): add adultContent (uncensored/NSFW) per-model capability
|
|
13
|
+
- `6a4ce9c` fix(ai): FR-047 P5 — correct ./ai/google + ./ai/local subpath export targets
|
|
14
|
+
- **Uncommitted**: `pipeline.cicd.config.json` (root) -128 sor delete (dmc migracio takaritas)
|
|
15
|
+
- **Source-diff stat**: 30 fajl, 940 inserciol / 12 deletes (build/ artifact kizarva)
|
|
16
|
+
|
|
17
|
+
### Tool
|
|
18
|
+
|
|
19
|
+
A `/code-review` skill (high effort), local execution. Phase 1 — 7 párhuzamos finder agent (Explore type):
|
|
20
|
+
- **3 correctness angle**: line-by-line scan, removed-behavior auditor, cross-file tracer
|
|
21
|
+
- **3 cleanup angle**: reuse, simplification, efficiency
|
|
22
|
+
- **1 altitude angle**: depth check
|
|
23
|
+
|
|
24
|
+
Phase 2 — 1-vote verifier batch agent (recall-biased), 17 candidate → 16 survivor (1 REFUTED).
|
|
25
|
+
|
|
26
|
+
## Top-10 Finding (ranked most-severe first)
|
|
27
|
+
|
|
28
|
+
A teljes JSON output `__documentations/2026-06-01-fr047-fr048-code-review-findings.json`-ben. Itt a Hunglish summary:
|
|
29
|
+
|
|
30
|
+
### 1. `gptImage_1` enum-entry registry-mentes (CONFIRMED)
|
|
31
|
+
|
|
32
|
+
**Fajl**: `src/_modules/ai/_modules/open-ai/_enums/oai-model.enum.ts:19`
|
|
33
|
+
|
|
34
|
+
A `DyFM_OAI_Model.gptImage_1 = 'gpt-image-1'` enum-ben szerepel + komment szerint **"current"** (nem deprecated), de a `DyFM_OAI_Models` registry-ben NEM kap entry-t.
|
|
35
|
+
|
|
36
|
+
**Failure scenario**: `modelSupportsTools(DyFM_OAI_Models, DyFM_OAI_Model.gptImage_1)` → false (a util `?? false`-szal default-ol). `findModelInfo` undefined. Az image generation tools-on-keresztul rutalas silent-skip.
|
|
37
|
+
|
|
38
|
+
### 2. `claude_3_5_sonnet_latest` enum + nincs registry (CONFIRMED)
|
|
39
|
+
|
|
40
|
+
**Fajl**: `src/_modules/ai/_modules/anthropic/_enums/aai-model.enum.ts:11`
|
|
41
|
+
|
|
42
|
+
A `DyFM_AAI_Models` registry csak 3 GA entry-t tartalmaz; a deprecated `claude_3_5_sonnet_latest` az enum-ben van, registry-bol kimaradt.
|
|
43
|
+
|
|
44
|
+
**Failure scenario**: Default `DyFM_AI_CallSettings` ami a `claude_3_5_sonnet_latest`-et hasznalja → `modelSupportsTools` false → tool-calling silent-disable egy meg-mindig-elo API modelen.
|
|
45
|
+
|
|
46
|
+
### 3. `gemini_1_5_pro_latest` enum + nincs registry (CONFIRMED)
|
|
47
|
+
|
|
48
|
+
**Fajl**: `src/_modules/ai/_modules/google-ai/_enums/gai-model.enum.ts:11`
|
|
49
|
+
|
|
50
|
+
Ugyanaz a minta mint #2 — google oldalon.
|
|
51
|
+
|
|
52
|
+
### 4. `modelSupportsTools` silent-false unknown-ID-ra (CONFIRMED)
|
|
53
|
+
|
|
54
|
+
**Fajl**: `src/_modules/ai/_collections/ai-model-registry.util.ts:27`
|
|
55
|
+
|
|
56
|
+
`Array.find()` → `?? false` minta. Tipo, deprecated, vagy live-but-unregistered model esten → `false` warn/log nelkul.
|
|
57
|
+
|
|
58
|
+
**Failure scenario**: Diagnozis nelkul lehetetlen kideriteni miert nem hivodik a tool-routing. Egy `{ strict: true }` mode vagy `DyFM_Log.warn` flegging hianyzik.
|
|
59
|
+
|
|
60
|
+
### 5. Legacy + active enum-tagok keveredtek (CONFIRMED)
|
|
61
|
+
|
|
62
|
+
**Fajlok**: `aai/gai/oai-model.enum.ts`
|
|
63
|
+
|
|
64
|
+
Csak komment kulonbozteti meg az active es retired model-ID-kat. Az enum public API-jaban mindketto egyformanak latszik. A #1-3 ennek tuneti megnyilvanulasa.
|
|
65
|
+
|
|
66
|
+
**Tervezet fix**: `*-legacy.enum.ts` kulon fajl, vagy minden retired enum-tag mellé `@deprecated` JSDoc tag.
|
|
67
|
+
|
|
68
|
+
### 6. `DyFM_AI_Message.content` required, de tool-calls esetn ures (CONFIRMED)
|
|
69
|
+
|
|
70
|
+
**Fajl**: `src/_modules/ai/_models/ai-message.interface.ts:6`
|
|
71
|
+
|
|
72
|
+
`content: string` (non-optional). Mikor `role='assistant'` + `toolCalls` populalva → a content semantically ures OpenAI/Anthropic/Gemini API-knal.
|
|
73
|
+
|
|
74
|
+
**Failure scenario**: Caller hard-coded `content: ''` workaround minden tool-call message-en; downstream "content empty" validator visszadobhatja a tool-request message-eket.
|
|
75
|
+
|
|
76
|
+
### 7. `settingsSchema` ghost contract (CONFIRMED)
|
|
77
|
+
|
|
78
|
+
**Fajl**: `src/_modules/ai/_models/ai-model-info.interface.ts:37`
|
|
79
|
+
|
|
80
|
+
`settingsSchema?: DyFM_AI_ModelSettingsSchema` reserved minden modelen, de a 21 registry entry kozul EGYIK SEM populalja.
|
|
81
|
+
|
|
82
|
+
**Failure scenario**: Phase 2 (FR-048) reconciler reading `settingsSchema` undefined → "no constraints" semantikat olvas a "constraints not yet modeled" helyett → silent-accept `temperature` parameter Opus 4.7+ hivason → HTTP 400 hard-fail.
|
|
83
|
+
|
|
84
|
+
### 8. `finishReason` vs `stopReason` dual-field (PLAUSIBLE)
|
|
85
|
+
|
|
86
|
+
**Fajl**: `src/_modules/ai/_models/ai-llm-response.interface.ts:16`
|
|
87
|
+
|
|
88
|
+
Mindketto optional. Legacy `finishReason` + new `stopReason`. Doc-mentes melyik az authoritative.
|
|
89
|
+
|
|
90
|
+
**Failure scenario**: Provider translator csak `stopReason`-t populalja → legacy consumer `finishReason === 'tool_use'`-t check-el → condition false → tool flow miss.
|
|
91
|
+
|
|
92
|
+
### 9. Tool-vocab interfaces 0-caller (PLAUSIBLE)
|
|
93
|
+
|
|
94
|
+
**Fajl**: `src/_modules/ai/_models/ai-tool.interface.ts`
|
|
95
|
+
|
|
96
|
+
Uj `DyFM_AI_Tool`, `DyFM_AI_ToolCall`, `DyFM_AI_ToolResult`, `DyFM_AI_ToolHandler` exportalt **dynamo-fsm-bol**, de **ZERO caller** sajat-projekten belul. Az abstrakcio nem validalt.
|
|
97
|
+
|
|
98
|
+
**Failure scenario**: A shape lehet hogy nem fer ra a 5 provider mind-egyikere (OpenAI `type:'function'` wrapper, Anthropic `input_schema`, Gemini `functionDeclarations`). FR-048 mid-flight API redesign-kenyszer.
|
|
99
|
+
|
|
100
|
+
### 10. Root pipeline.cicd.config.json -128 sor (CONFIRMED, uncommitted)
|
|
101
|
+
|
|
102
|
+
**Fajl**: `pipeline.cicd.config.json` (root, delete)
|
|
103
|
+
|
|
104
|
+
A `.dynamo/pipeline.cicd.config.json` fully fedi, DE barmely external workflow / GitHub Actions / script ami hardcoded `./pipeline.cicd.config.json` ref-fel → 404.
|
|
105
|
+
|
|
106
|
+
## Levágott (cleanup-class — kovetkezo iteracio)
|
|
107
|
+
|
|
108
|
+
A skill rule: "Correctness bugs always outrank cleanup and altitude findings when the output cap forces a cut." Ezert a top-10 keret felett kihagyott 6 valid finding:
|
|
109
|
+
|
|
110
|
+
| # | Fajl | Issue |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| 11 | `src/_modules/ai/index.ts` | No meta-barrel a 5 provider model-registry-re; Phase 2 hardcodes 5 imports |
|
|
113
|
+
| 12 | `ai-model-capabilities.interface.ts` + 5 const-fajl | Capability matrix copy-paste 21 model × 9 mező — N+1 edit kotelezo |
|
|
114
|
+
| 13 | `ai-model-capabilities.interface.ts:31` | `adultContent` policy-flag feature-capabilities matrix-ban; jovobeli policy flags scatterolnek |
|
|
115
|
+
| 14 | `package.json` exports | Naming inconsistency: `anthropic` (no hyphen) vs `open-ai/google-ai/local-ai/fdp-ai` |
|
|
116
|
+
| 15 | `ai-model-registry.util.ts:17` | O(N) `Array.find` registry lookup vs O(1) Map |
|
|
117
|
+
| 16 | Provider `index.ts` (×5) | Tree-shake loss: barrel pulls all 5 const-tables (~519 lines) for single-provider consumer |
|
|
118
|
+
|
|
119
|
+
## REFUTED (1 db)
|
|
120
|
+
|
|
121
|
+
| # | Fajl | Reason |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| - | `oai-models.const.ts:235` gptImage_2 missing maxOutputTokens | Verified: `maxOutputTokens?` optional a `DyFM_AI_ModelInfo` interface-en, no type-level contract violation, no crash |
|
|
124
|
+
|
|
125
|
+
## Strukturalis tanulsag (kozos pattern a #1-5 mogott)
|
|
126
|
+
|
|
127
|
+
A top-10 elso 5 finding mind UGYANARRA a strukturalis hiba-mintara mutat: **az enum-tagok es a registry-entries nincsenek szinkronban**. Tervezet javitas:
|
|
128
|
+
|
|
129
|
+
**Opció A** (defensive): minden enum-entry-nek legyen registry-entry, deprecated-eket `*-legacy.enum.ts`-be kulonitsd el.
|
|
130
|
+
|
|
131
|
+
**Opció B** (strict-mode): `modelSupportsTools(models, id, { strict: true })` — unknown ID-ra throw vagy `DyFM_Log.warn`.
|
|
132
|
+
|
|
133
|
+
**Opció C** (build-time validation): TS guard-test ami compile-time verifikalja hogy minden enum-tag registry-entry-vel jar.
|
|
134
|
+
|
|
135
|
+
Mind a 3 megoldhato — a #1-5 + #11 (meta-barrel) kombo eseten egy follow-up commit lefedi.
|
|
136
|
+
|
|
137
|
+
## Stat
|
|
138
|
+
|
|
139
|
+
| | |
|
|
140
|
+
|---|---|
|
|
141
|
+
| **Specs** | 1302 spec / 0 failure (TypeScript + jasmine) |
|
|
142
|
+
| **TS compile** | ✓ (0 error) |
|
|
143
|
+
| **Diff scope** | 30 src fajl / 940 ins / 12 del (build/ kizarva) |
|
|
144
|
+
| **Finder agents** | 7 (parallel) |
|
|
145
|
+
| **Verifier agents** | 1 (batch over 17 candidates) |
|
|
146
|
+
| **Output cap** | 10 finding (skill default) |
|
|
147
|
+
| **Time** | ~15 min full pipeline |
|
|
148
|
+
|
|
149
|
+
## Reference
|
|
150
|
+
|
|
151
|
+
- Skill: `code-review` (high effort)
|
|
152
|
+
- Skill instrukciok: 3 correctness + 3 cleanup + 1 altitude angle × ≤6 candidates per angle; 1-vote verify per candidate; recall-biased PLAUSIBLE default; REFUTED only constructible from code
|
|
153
|
+
- Workflow: lokal jasmine `npx jasmine --config=spec/support/jasmine.json` → 1302/0
|