@hellraisercenobit/ai-engineering-gate 0.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 (100) hide show
  1. package/README.md +82 -0
  2. package/agents/design-pattern-reviewer.md +40 -0
  3. package/agents/modern-typescript-reviewer.md +24 -0
  4. package/agents/testing-pattern-reviewer.md +23 -0
  5. package/bin/ai-engineering-gate.mjs +6 -0
  6. package/contracts/axi/axi-standard.md +273 -0
  7. package/contracts/axi/pin.json +36 -0
  8. package/contracts/members.json +58 -0
  9. package/contracts/schemas/arbitration.schema.json +45 -0
  10. package/contracts/schemas/decision-envelope.schema.json +215 -0
  11. package/contracts/schemas/declaration.schema.json +190 -0
  12. package/contracts/schemas/dispute.schema.json +67 -0
  13. package/contracts/schemas/evidence-append.schema.json +72 -0
  14. package/contracts/schemas/gate-output.schema.json +296 -0
  15. package/contracts/schemas/marker.schema.json +75 -0
  16. package/contracts/schemas/review-envelope.schema.json +378 -0
  17. package/contracts/schemas/verdict-record.schema.json +191 -0
  18. package/contracts/suite-contract.md +270 -0
  19. package/dist/ai-engineering-gate.mjs +2762 -0
  20. package/package.json +47 -0
  21. package/skills/engineering/review-design-patterns/LICENSE +6 -0
  22. package/skills/engineering/review-design-patterns/SKILL.md +196 -0
  23. package/skills/engineering/review-design-patterns/agents/openai.yaml +3 -0
  24. package/skills/engineering/review-design-patterns/references/smell-signatures.md +117 -0
  25. package/skills/engineering/review-design-patterns/review-design-patterns.yaml +25 -0
  26. package/skills/engineering/review-modern-typescript/LICENSE +21 -0
  27. package/skills/engineering/review-modern-typescript/SKILL.md +88 -0
  28. package/skills/engineering/review-modern-typescript/agents/openai.yaml +3 -0
  29. package/skills/engineering/review-modern-typescript/references/smell-signatures.md +36 -0
  30. package/skills/engineering/review-modern-typescript/review-modern-typescript.yaml +22 -0
  31. package/skills/engineering/review-testing-patterns/SKILL.md +108 -0
  32. package/skills/engineering/review-testing-patterns/agents/openai.yaml +4 -0
  33. package/skills/engineering/review-testing-patterns/references/compiler-profile.mjs +103 -0
  34. package/skills/engineering/review-testing-patterns/references/smell-signatures.md +30 -0
  35. package/skills/engineering/review-testing-patterns/review-testing-patterns.yaml +23 -0
  36. package/skills/engineering/transpose-design-patterns/LICENSE +6 -0
  37. package/skills/engineering/transpose-design-patterns/SKILL.md +231 -0
  38. package/skills/engineering/transpose-design-patterns/agents/openai.yaml +3 -0
  39. package/skills/engineering/transpose-design-patterns/references/arbitration.schema.json +45 -0
  40. package/skills/engineering/transpose-design-patterns/references/decision-envelope.schema.json +215 -0
  41. package/skills/engineering/transpose-design-patterns/references/declaration.schema.json +190 -0
  42. package/skills/engineering/transpose-design-patterns/references/design-decision-record.schema.json +731 -0
  43. package/skills/engineering/transpose-design-patterns/references/dispute.schema.json +67 -0
  44. package/skills/engineering/transpose-design-patterns/references/evidence-append.schema.json +72 -0
  45. package/skills/engineering/transpose-design-patterns/references/marker.schema.json +75 -0
  46. package/skills/engineering/transpose-design-patterns/references/pattern-catalog.md +305 -0
  47. package/skills/engineering/transpose-design-patterns/references/record.example.json +120 -0
  48. package/skills/engineering/transpose-design-patterns/references/review-envelope.schema.json +378 -0
  49. package/skills/engineering/transpose-design-patterns/references/suite-contract.md +270 -0
  50. package/skills/engineering/transpose-design-patterns/references/transpose-angular.md +224 -0
  51. package/skills/engineering/transpose-design-patterns/references/transpose-php.md +561 -0
  52. package/skills/engineering/transpose-design-patterns/references/transpose-quarkus.md +283 -0
  53. package/skills/engineering/transpose-design-patterns/references/transpose-react.md +256 -0
  54. package/skills/engineering/transpose-design-patterns/references/transpose-vanilla.md +204 -0
  55. package/skills/engineering/transpose-design-patterns/references/transpose-vue.md +234 -0
  56. package/skills/engineering/transpose-design-patterns/transpose-design-patterns.yaml +24 -0
  57. package/skills/engineering/transpose-modern-typescript/LICENSE +21 -0
  58. package/skills/engineering/transpose-modern-typescript/SKILL.md +90 -0
  59. package/skills/engineering/transpose-modern-typescript/agents/openai.yaml +3 -0
  60. package/skills/engineering/transpose-modern-typescript/references/arbitration.schema.json +45 -0
  61. package/skills/engineering/transpose-modern-typescript/references/catalog.md +38 -0
  62. package/skills/engineering/transpose-modern-typescript/references/collections.md +50 -0
  63. package/skills/engineering/transpose-modern-typescript/references/compatibility.md +61 -0
  64. package/skills/engineering/transpose-modern-typescript/references/decision-envelope.schema.json +215 -0
  65. package/skills/engineering/transpose-modern-typescript/references/decision-record.schema.json +830 -0
  66. package/skills/engineering/transpose-modern-typescript/references/declaration.schema.json +190 -0
  67. package/skills/engineering/transpose-modern-typescript/references/dispute.schema.json +67 -0
  68. package/skills/engineering/transpose-modern-typescript/references/evidence-append.schema.json +72 -0
  69. package/skills/engineering/transpose-modern-typescript/references/idioms.md +74 -0
  70. package/skills/engineering/transpose-modern-typescript/references/marker.schema.json +75 -0
  71. package/skills/engineering/transpose-modern-typescript/references/platform.md +147 -0
  72. package/skills/engineering/transpose-modern-typescript/references/record.example.json +172 -0
  73. package/skills/engineering/transpose-modern-typescript/references/record.md +37 -0
  74. package/skills/engineering/transpose-modern-typescript/references/review-envelope.schema.json +378 -0
  75. package/skills/engineering/transpose-modern-typescript/references/suite-contract.md +270 -0
  76. package/skills/engineering/transpose-modern-typescript/references/types.md +97 -0
  77. package/skills/engineering/transpose-modern-typescript/transpose-modern-typescript.yaml +22 -0
  78. package/skills/engineering/transpose-testing-patterns/SKILL.md +96 -0
  79. package/skills/engineering/transpose-testing-patterns/agents/openai.yaml +4 -0
  80. package/skills/engineering/transpose-testing-patterns/references/arbitration.schema.json +45 -0
  81. package/skills/engineering/transpose-testing-patterns/references/catalog.md +218 -0
  82. package/skills/engineering/transpose-testing-patterns/references/decision-envelope.schema.json +215 -0
  83. package/skills/engineering/transpose-testing-patterns/references/decision-record.schema.json +857 -0
  84. package/skills/engineering/transpose-testing-patterns/references/declaration.schema.json +190 -0
  85. package/skills/engineering/transpose-testing-patterns/references/detect-adapter.mjs +98 -0
  86. package/skills/engineering/transpose-testing-patterns/references/dispute.schema.json +67 -0
  87. package/skills/engineering/transpose-testing-patterns/references/doubles-data.md +45 -0
  88. package/skills/engineering/transpose-testing-patterns/references/evidence-append.schema.json +72 -0
  89. package/skills/engineering/transpose-testing-patterns/references/journal-event.schema.json +115 -0
  90. package/skills/engineering/transpose-testing-patterns/references/marker.schema.json +75 -0
  91. package/skills/engineering/transpose-testing-patterns/references/record.example.json +230 -0
  92. package/skills/engineering/transpose-testing-patterns/references/record.md +25 -0
  93. package/skills/engineering/transpose-testing-patterns/references/review-envelope.schema.json +378 -0
  94. package/skills/engineering/transpose-testing-patterns/references/suite-contract.md +270 -0
  95. package/skills/engineering/transpose-testing-patterns/references/tdd.md +62 -0
  96. package/skills/engineering/transpose-testing-patterns/references/transpose-codeception.md +84 -0
  97. package/skills/engineering/transpose-testing-patterns/references/transpose-karma-jasmine-angular.md +73 -0
  98. package/skills/engineering/transpose-testing-patterns/references/transpose-vitest.md +111 -0
  99. package/skills/engineering/transpose-testing-patterns/references/typescript.md +42 -0
  100. package/skills/engineering/transpose-testing-patterns/transpose-testing-patterns.yaml +23 -0
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@hellraisercenobit/ai-engineering-gate",
3
+ "version": "0.8.0",
4
+ "description": "Generic enforcement for the transpose/review engineering suite - registry, evidence, fingerprints, verdicts",
5
+ "keywords": [
6
+ "agent",
7
+ "skills",
8
+ "code-review",
9
+ "tdd",
10
+ "design-patterns"
11
+ ],
12
+ "author": {
13
+ "name": "Guillaume Mongin",
14
+ "url": "https://github.com/hellraisercenobit"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/hellraisercenobit/skills",
19
+ "directory": "packages/ai-engineering-gate"
20
+ },
21
+ "license": "MIT",
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "type": "module",
26
+ "engines": {
27
+ "node": ">=24"
28
+ },
29
+ "bin": {
30
+ "ai-engineering-gate": "bin/ai-engineering-gate.mjs"
31
+ },
32
+ "exports": {
33
+ ".": "./dist/ai-engineering-gate.mjs"
34
+ },
35
+ "files": [
36
+ "bin",
37
+ "dist",
38
+ "contracts",
39
+ "skills",
40
+ "agents",
41
+ "README.md"
42
+ ],
43
+ "scripts": {
44
+ "prepack": "node ../../scripts/stage-gate-package.mjs",
45
+ "postpack": "node ../../scripts/stage-gate-package.mjs --clean"
46
+ }
47
+ }
@@ -0,0 +1,6 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Guillaume Mongin (@hellraisercenobit)
4
+
5
+ This skill (`review-design-patterns`) is an original work by Guillaume Mongin.
6
+ See the repository root `LICENSE` and `NOTICE` for full terms.
@@ -0,0 +1,196 @@
1
+ ---
2
+ name: review-design-patterns
3
+ description: Independently audit design-pattern decisions against the shared pattern catalog - re-derive each site blind and freeze the expected design, then compare it with the recorded decision and the actual code, and put every finding through a steelman gate - so each pattern is confirmed sound or flagged with evidence. USE WHEN reviewing existing code, a diff, or a PR for pattern soundness and anti-patterns (switch-on-type-tag, DTO leaking to UI, Command folded into a store, missing Strategy/Registry, a lazy none), when a transpose-design-patterns task hands its code to a fresh reviewer, or when challenging a not-yet-built design proposal. Companion to transpose-design-patterns. EXAMPLES - "review the design patterns in this lib", "is this Strategy correct?", "audit this PR's architecture", "did I apply Registry right?".
4
+ license: MIT
5
+ author: Guillaume Mongin (@hellraisercenobit)
6
+ ---
7
+
8
+ # Review Design Patterns
9
+
10
+ An **independent**, adversarial audit of the design-pattern decisions in any codebase. It is the mirror of
11
+ `transpose-design-patterns`: that skill decides a pattern (or `none`) and records it; this one judges whether
12
+ the code that exists realizes the right design - and is willing to say it does not.
13
+
14
+ The review is worthless if it is not **independent**. Two failures kill it equally: rubber-stamping the
15
+ author's choice, and manufacturing findings to look thorough. The protocol below defends against both - you
16
+ re-derive every decision **blind** and **freeze** it, then make each finding survive a **steelman** before
17
+ it ships.
18
+
19
+ ## What "independent" means here
20
+
21
+ - **The catalog is the standard, not the author's intent.** A comment, commit message, PR description or
22
+ design decision record saying "this is the Strategy pattern" is never evidence the design is right. The
23
+ code carries the burden of proof.
24
+ - **Re-derive blind, then freeze.** For each site, write down what the catalog says the design *should* be
25
+ **before** you read the author's rationale, the design decision record, comments or commit messages.
26
+ Once written, the expected design does not move: you compare against it, you do not revise it to fit
27
+ what you find.
28
+ - **If you wrote it, you are not independent.** When auditing code you authored earlier in this session,
29
+ dispatch the audit to a fresh reviewer - the `design-pattern-reviewer` agent when the harness defines
30
+ one, else a fresh subagent (the `Agent` tool) - with the brief `transpose-design-patterns` prescribes. The
31
+ fresh reviewer never authored anything in scope, so it runs this skill itself and does not dispatch
32
+ again. This is the strongest realization of independence; the blind re-derivation below is the floor.
33
+
34
+ ## Shared standard - read, do not duplicate
35
+
36
+ This skill owns no catalog. It judges against the bundled sources of its companion, `transpose-design-patterns`:
37
+
38
+ - **Shared procedure:** resolve `/transpose-design-patterns` and read its `references/suite-contract.md` (contract 1.1.0). Apply its dependency, read-only, neutral-context, composition and state-expiry guarantees alongside this domain protocol. Missing required references mean incomplete execution, never `SOUND`.
39
+ - **Catalog (the rules):** [`../transpose-design-patterns/references/pattern-catalog.md`](../transpose-design-patterns/references/pattern-catalog.md)
40
+ - the _Structural forces_ table (with the _Extension-cost test_) and each entry's _Invariants_ are the
41
+ **positive** checklist (what must be observable when the design is right); each entry's **Avoid** clause
42
+ is the **negative** one (your violation checklist); the _Core Principles_ and the table's _Decision_ column
43
+ settle which pattern a force points at, `None` included.
44
+ - **Record shape:** [`../transpose-design-patterns/references/design-decision-record.schema.json`](../transpose-design-patterns/references/design-decision-record.schema.json)
45
+ - what a design decision record contains, so you know what to compare against in step 4.
46
+ - **Transposition (per framework):** the `transpose-<framework>.md` guide for the project's framework - its
47
+ _Decision Matrix_ and _Anti-Patterns to Avoid_ tell you what *correct* wiring looks like. Resolve the
48
+ framework and pick the guide from the table in
49
+ [`../transpose-design-patterns/SKILL.md`](../transpose-design-patterns/SKILL.md). No guide for the stack:
50
+ judge on the catalog alone.
51
+ - **Detection layer (this skill):** [`references/smell-signatures.md`](references/smell-signatures.md) - per
52
+ pattern, how a violation *looks in code*, the steelman that might excuse it, and what confirms it as real.
53
+
54
+ ## Audit procedure
55
+
56
+ Run every step. The discipline is in steps 3 and 5 - do not skip from "I spotted something" to "here are my
57
+ findings".
58
+
59
+ 1. **Frame the audit.** Open your window first: `ai-engineering-gate begin --dimension design-patterns` freezes
60
+ the state your verdict will bind to, captures who you are and refuses you outright if you are the builder of
61
+ this task. State that the standard is the catalog, not author intent. Fix the **scope** - a diff, a lib, the
62
+ whole codebase - and establish a diff with `git diff --stat <base>...HEAD` plus the working tree, **never
63
+ with `git log`**: commit subjects carry the author's intent. Resolve the **framework**. Note whether a
64
+ **design decision record** exists - its path comes from the brief; checking that the path exists is fine,
65
+ reading its content is not. If you authored the code in scope this session, dispatch to a fresh reviewer
66
+ now. _Done when:_ the window is open and scope, framework, record presence and independence stance are
67
+ explicit.
68
+
69
+ 2. **Inventory the pattern-shaped sites.** Find every site with a pattern-shaped decision - interchangeable
70
+ behavior, plugin/extensibility, object-creation logic, a DTO/domain boundary, shared state, a composable
71
+ action, a cross-cutting concern. Locate them by search, never by eyeballing: a small scope is read file by
72
+ file, in full; a large one starts from the repo's dependency graph when it has one (Nx graph, graphify,
73
+ Deptrac layers in PHP) and greps the signature shapes - a `switch`/`if` on a tag, `constructor.name`,
74
+ `instanceof`, `extends`/`abstract`, module-level `let`, `*Dto` or snake_case fields in UI code,
75
+ `as SomeDto` casts, `Map`/`Record`/`satisfies` tables - then reads each hit in context. For a not-yet-built
76
+ design proposal, sites come from the design doc instead of code, and "location" in the report below
77
+ becomes the doc section. _Done when:_ every site in scope is listed - exhaustive, not a sample.
78
+
79
+ 3. **Re-derive blind and freeze the matrix.** For each site write one row in your report, under _Frozen
80
+ matrix_: the site, the structural forces present (catalog _Structural forces_, extension-cost test
81
+ applied), the expected pattern or `none`, the expected transposition (the guide section; for `none`, the
82
+ catalog's `None` _Best practices_), and the expected invariants (the catalog entry's _Invariants_, made
83
+ concrete). Derive from the code, the catalog and the guide only - **before** reading the record, comments,
84
+ commit messages or rationale. Then freeze it: the matrix is the reference for every later step and is
85
+ never edited. _Done when:_ every site has its row and the record is still unopened.
86
+
87
+ 4. **Open the record and confront three ways.** Now read the design decision record when there is one. For
88
+ each site compare **expected** (your row) against **recorded** (the author's decision, or `not covered`
89
+ when the record does not address the site) against **actual** (the code), and label it `match` or
90
+ `candidate finding`. A candidate is: a wrong pattern; a missing pattern (a pattern-shaped need solved ad
91
+ hoc); a wrong `none` (a force present, or the extension-cost test failing); an **Avoid**-clause
92
+ anti-pattern; a mis-transposition (right pattern, wrong framework wiring); a misplaced artifact (a Command
93
+ folded into a store, a DTO leaking into a template); a recorded invariant not observable in the code; a
94
+ recorded `extensionCost` your own count contradicts. Two shapes matter equally: a bad decision
95
+ implemented faithfully, and a good decision implemented wrong. Without a record, expected against actual
96
+ suffices. _Done when:_ every site is labeled.
97
+
98
+ 5. **Steelman gate.** This is what makes the review challenging instead of noisy. For each candidate, build
99
+ the **strongest** defense of the current code - YAGNI over ceremony, deliberate simplicity, a sanctioned
100
+ framework idiom, a closed set that never grows. Then test it: does a catalog rule still get violated, and
101
+ does it still matter? _Done when:_ every candidate is either **dropped** (the steelman held → move it to
102
+ the "Challenged, survived" list) or **confirmed** with a written refutation of its steelman.
103
+
104
+ 6. **Verdict.** Emit the report (format below). _Done when:_ every confirmed finding carries location,
105
+ quoted rule, steelman + refutation, severity, and a fix; catalog gaps are listed apart; and the audit
106
+ ends on one overall verdict.
107
+
108
+ ## Severity
109
+
110
+ The [contract](../transpose-design-patterns/references/suite-contract.md) owns Blocker, Major and Minor.
111
+ Apply that clause. Tie the chosen tier to impact, not to how clever the finding is. A catalog gap has
112
+ no severity: it is not a finding (see _Catalog gaps_).
113
+
114
+ Each finding is also typed. A **judgment** finding says a recorded decision is wrong against the catalog and
115
+ carries the `correction` to make. An **evidence** finding says an artifact the record planned is not on file
116
+ and carries a `remedy` the builder can execute - `produce` the artifact, or `rerun` the check that proves it.
117
+ A finding a builder believes wrong is disputed, never argued in prose: the builder files
118
+ `dispute --dimension design-patterns` with counter-evidence, and only the user arbitrates it.
119
+
120
+ ## Verdict
121
+
122
+ - **SOUND** - zero confirmed findings. The only verdict that completes a `transpose-design-patterns` task.
123
+ - **SMELLS** - confirmed findings, none of them a blocker.
124
+ - **VIOLATIONS** - at least one blocker.
125
+
126
+ Open the window before the audit and file through it afterwards, so the verdict binds to the state you read:
127
+
128
+ ```bash
129
+ ai-engineering-gate begin --dimension design-patterns # prints the three fingerprints you bind to
130
+ ai-engineering-gate attest --dimension design-patterns --stdin # SOUND only
131
+ ai-engineering-gate report --dimension design-patterns --stdin # SMELLS and VIOLATIONS
132
+ ```
133
+
134
+ Both read a [review envelope](../transpose-design-patterns/references/review-envelope.schema.json) on stdin:
135
+ the verdict, the records examined, the checks you saw executed, your independence claim and every finding with
136
+ its type, severity and remedy or correction. Never put a fingerprint in it - the gate computes all three and
137
+ accepts none - and never file for a dimension you were not dispatched for. If the state moved while you were
138
+ reading, `attest` refuses with `state-moved` and the review is void: say so and stop rather than filing on
139
+ code you did not read. `SMELLS` and `VIOLATIONS` are reported, never attested: the builder corrects, then a
140
+ fresh reviewer reassesses. An implementer never attests its own code, and the gate refuses it by identity.
141
+
142
+ ## Catalog gaps
143
+
144
+ "No rule, no finding" stays. But a credible structural smell the catalog does not cover is not discarded
145
+ silently: list it under **Catalog gaps** with the location, the smell, why the current catalog does not cover
146
+ it, and the candidate rule or pattern family for a human to consider. A catalog gap never changes the
147
+ verdict and never carries a severity - it feeds the catalog, it does not let the reviewer invent a rule.
148
+
149
+ ## Report format
150
+
151
+ ```
152
+ ## Design-pattern audit - <scope>
153
+
154
+ **Verdict:** <SOUND | SMELLS | VIOLATIONS> - <n> findings (<x> blocker, <y> major, <z> minor)
155
+ **Compared against record:** <path> | none
156
+
157
+ ### Frozen matrix
158
+ | Site | Forces | Expected | Expected transposition | Expected invariants |
159
+ | --- | --- | --- | --- | --- |
160
+ | `path:line` <what it does> | ... | <pattern | none> | <guide section> | ... |
161
+
162
+ ### Findings
163
+ #### [SEVERITY] <title> - `path/to/file.ts:line`
164
+ - **Site:** what the code does (the evidence)
165
+ - **Expected / recorded / actual:** <your frozen row> / <the author's decision | not covered> / <what the code does>
166
+ - **Rule:** <catalog Avoid clause, Invariant, Core Principle, or guide anti-pattern, quoted verbatim>
167
+ - **Steelman:** the strongest case for the current code
168
+ - **Why it fails:** why that defense does not hold here
169
+ - **Fix:** need → pattern → <framework guide section to follow>
170
+
171
+ ### Challenged, survived
172
+ - `path:line` - considered <pattern>; current choice stands because <the steelman that held>
173
+
174
+ ### Catalog gaps
175
+ - `path:line` - <smell>; not covered because <reason>; candidate: <rule or pattern family>
176
+ ```
177
+
178
+ The "Frozen matrix" section is the proof of the blind pass: it is written before the record is opened and is
179
+ not edited afterwards. The "Challenged, survived" section is not optional padding - it is the proof the audit
180
+ was independent and balanced rather than a hit job. An audit that finds nothing is a valid outcome **only**
181
+ when both sections show you re-derived and steelmanned each site.
182
+
183
+ ## Hard rules
184
+
185
+ - **Independence is non-negotiable.** Never cite the author's stated intent as evidence the design is right.
186
+ - **Freeze before you compare.** The expected design is written before the record is opened, and never
187
+ revised afterwards.
188
+ - **No rule, no finding.** Every finding quotes a specific catalog **Avoid** clause, **Invariant** or
189
+ **Core Principle**, or a guide anti-pattern. A preference with no rule behind it is taste - drop it; a
190
+ credible smell with no rule goes to _Catalog gaps_, not to _Findings_.
191
+ - **No steelman survived, no finding.** If the strongest defense of the code holds, it is not a finding.
192
+ - **Never invent rules** absent from the catalog or the framework guide.
193
+ - **Findings are framework-checked.** Judge the transposition against the project's `transpose-<framework>.md`,
194
+ not against another framework's idioms.
195
+ - **Never modify code in scope.** The review's output is judgment; the fix belongs to the author, and a fresh
196
+ review follows it.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Review Design Patterns"
3
+ short_description: "Independent audit of design-pattern decisions"
@@ -0,0 +1,117 @@
1
+ # Smell Signatures - design-pattern violations, with their steelman
2
+
3
+ The detection layer for `review-design-patterns`. For each catalog pattern: **how a violation looks in code**,
4
+ the **steelman** that might legitimately excuse it, and what **confirms** it as a real finding once the
5
+ steelman fails. The *rules* live in the shared catalog and the per-framework guide - this file does not restate
6
+ them, it tells you how to spot and pressure-test a breach.
7
+
8
+ - Rule source: [`../../transpose-design-patterns/references/pattern-catalog.md`](../../transpose-design-patterns/references/pattern-catalog.md) (_Avoid_ clauses, _Core Principles_).
9
+ - Correct wiring: the project's `transpose-<framework>.md` (_Decision Matrix_, _Anti-Patterns to Avoid_).
10
+
11
+ A finding is only real when the **signature** is present **and** the **steelman** does not hold. Default to
12
+ *not a finding* when in doubt - an over-eager audit is as useless as a blind one.
13
+
14
+ This file is the **negative** checklist. The **positive** one is the catalog's _Invariants_ line per pattern:
15
+ an invariant the recorded pattern promises and the code does not show is a candidate finding even when no
16
+ signature below matches.
17
+
18
+ ---
19
+
20
+ ## Strategy
21
+
22
+ - **Catalog → Strategy → Avoid:** `switch`/`case` on a type tag; `constructor.name` lookups; string magic; giant strategy classes.
23
+ - **Signature:** a `switch (type)` or `if (kind === '…')` chain that selects *behavior*; one class with a method per variant; a behavior chosen by reading `constructor.name` or a magic string.
24
+ - **Steelman:** exactly two variants that demonstrably never grow, no external/plugin variants → a small inline branch can beat Strategy ceremony (YAGNI). A `{ … } as const satisfies Record<K, Strategy>` lookup table is the *correct* idiom - not a smell.
25
+ - **Confirm when:** adding a variant means editing the switch; the switch is duplicated at more than one call site; variants come from plugins/config/runtime; the branch decides domain behavior, not a trivial display string.
26
+ - **Framework:** Vanilla TS expects an `as const satisfies Record<K, Strategy>` lookup map (transpose-vanilla → Strategy); a `switch` on a tag as the extension mechanism is a **blocker**. Angular expects `InjectionToken` + `multi` providers resolved by key (transpose-angular → Strategy). A behavior-selecting `switch` inside a component is a **blocker**. For React, Vue and Quarkus, the guide's _Anti-Patterns to Avoid_ names the tag-dispatch smell: cite it. PHP expects `#[AutoconfigureTag]` on the interface + `#[AutowireIterator]` + `supports()`, or a backed enum + exhaustive `match` for a closed set (transpose-php → Strategy): a `switch` on a string tag in a service or controller is a **blocker**; a `match` over an enum with no `default` is the correct idiom, not a smell.
27
+
28
+ ## Registry
29
+
30
+ - **Catalog → Registry → Avoid:** hand-maintained enums for external plugins; the service-locator anti-pattern.
31
+ - **Signature:** a central `switch`/object literal edited by hand every time a plugin is added; an enum of plugin keys kept in sync manually; a global "get me anything by string" locator.
32
+ - **Steelman:** the set of entries is compile-time-known and closed (e.g. two app-owned exporters) → a typed `satisfies Record<K, T>` table is fine and is *not* the service-locator smell; when that table is the whole realization, the catalog names it Strategy, not Registry (catalog _Strategy or Registry_). Registration centralized in one composition-root module is acceptable.
33
+ - **Confirm when:** entries are external/dynamic yet enumerated by hand; adding a plugin forces edits in unrelated modules; lookups are untyped string fetches scattered across the code (service locator).
34
+ - **Framework:** Angular = DI lookup over `multi` providers *is* the registry (transpose-angular → Registry). PHP = `#[AutowireLocator]` / indexed `#[AutowireIterator]` over one tag (transpose-php → Registry); a locator scoped to one tag is *not* the service-locator smell. Broad application-container or static-facade access is a candidate finding; steelman a confined legacy bridge using the guide's interface binding, visibility and caller-level substitution test.
35
+
36
+ ## Factory
37
+
38
+ - **Catalog → Factory → Avoid:** factories with no creation logic; giant conditional factories.
39
+ - **Signature:** a `createX()` that only calls `new X()` with no decisions (ceremony); a factory with a sprawling conditional building many unrelated types.
40
+ - **Steelman:** the factory isolates *real* creation complexity (env-dependent wiring, async setup, returning an abstraction) → keep it. A `useFactory` that picks an implementation by environment is correct, not a giant-conditional smell.
41
+ - **Confirm when:** the factory adds an indirection layer over a plain constructor with zero logic (delete it), or it has become a god-factory branching over many product types (split it).
42
+
43
+ ## Command
44
+
45
+ - **Catalog → Command → Avoid:** burying a reusable command inside a store/facade method; mixing the action with UI-state, persistence, or presentation. **"A store action is _not automatically_ the Command."**
46
+ - **Signature:** a store/facade method (`withMethods`, Zustand/Pinia action, closure-store method) that performs a side-effecting action which is - or should be - reused, composed, or unit-tested in isolation, yet lives only inside the store and drags state flags + IO + mapping together.
47
+ - **Steelman:** a genuine one-off with no reuse or isolated-test pressure → inlining it in the store is correct (YAGNI); extracting a use-case would be premature. The store legitimately owns the *surrounding* state (status flags, journal, reset) and may **delegate** to a use-case - delegation is the right shape, not a smell.
48
+ - **Confirm when:** the action is called from (or clearly needs) more than one place; it can't be unit-tested without standing up the whole store; domain logic is fused with persistence/presentation inside the method. Fix: extract a distinct injectable use-case / exported function the store delegates to (catalog → Command for the layering).
49
+ - **Framework:** PHP: the action lives in a controller action, a repository method or an ORM model method (transpose-php → Command); the fix is a `readonly` command + invokable handler the caller delegates to.
50
+
51
+ ## Adapter / DTO Mapping
52
+
53
+ - **Catalog → Adapter → Avoid:** DTOs leaking into the UI; framework-dependent mappers.
54
+ - **Signature:** snake_case / raw API fields, `created_at`, untyped JSON, or `*Dto` types referenced inside components/templates; mapping logic that depends on the framework; mapping done in the component instead of at the data-access boundary.
55
+ - **Steelman:** DTO and domain shapes are genuinely identical for this resource → a pass-through with no mapper is acceptable (don't manufacture a `fromDto` that copies fields 1:1). A typed response used only inside the service is fine.
56
+ - **Confirm when:** raw DTO shapes reach a template or view-model; mapping lives in a component; the mapper imports framework symbols. Fix: pure `from`/`to` functions at the service boundary (catalog → Adapter; framework guide → Adapter).
57
+ - **Framework:** PHP: an entity or ORM model serialized directly (`$this->json($entity)`, `$model->toArray()`) or reaching a Twig template (transpose-php → Adapter); the fix is a `final readonly` DTO with a static `from*` constructor.
58
+
59
+ ## Composition
60
+
61
+ - **Catalog → Composition → Avoid:** inheritance chains; tightly coupled modules.
62
+ - **Signature:** an `abstract` base class extended for behavior reuse; deep `extends` hierarchies; modules reaching into each other's internals instead of depending on an injected abstraction.
63
+ - **Steelman:** a shallow framework-mandated base class (e.g. a required lifecycle superclass) is not the inheritance smell. A short, stable, single-purpose base may be simpler than composition - judge by change pressure.
64
+ - **Confirm when:** behavior is shared via inheritance that composition (DI, functions, host directives) would model with less coupling; the hierarchy is more than one level deep; subclasses override to specialize behavior that should be injected.
65
+
66
+ ## Singleton / shared state
67
+
68
+ - **Catalog → Singleton → Avoid:** global mutable state; hidden shared state.
69
+ - **Signature:** module-level `let` mutated across the app; a service exposing a writable signal / the whole store object; shared state mutated through paths the type system doesn't guard. PHP: `static` properties, `$GLOBALS`, a stateful service without `ResetInterface` (invisible under PHP-FPM, a cross-request leak under a worker runtime).
70
+ - **Steelman:** a root-provided service with private state and a **readonly/computed** public surface is the *correct* shape, not a smell. Minimal, explicitly-shared app state is fine. In PHP, stateless services are fine; a memo requires evidence that its lifetime matches the unit of work. `ResetInterface` alone does not prove reset between iterations of a multi-tenant loop. A cache owned per iteration or an explicit reset on every boundary can satisfy the guide.
71
+ - **Confirm when:** state is module-global and mutable; writable signals or the raw store are exposed; consumers mutate shared state directly. Fix: keep state private, expose readonly/computed (framework guide → Singleton / shared state).
72
+
73
+ ## None - no named pattern
74
+
75
+ - **Catalog → None → Avoid:** `none` chosen while a force is present; an "exhaustive" branch duplicated at several call sites; a closed set fed from config, plugins or runtime.
76
+ - **Signature:** a recorded `none` (or an inline branch with no record) over a variant set that has grown since, is duplicated at more than one call site, or receives variants from outside the code. An inline branch whose record names a pattern is the other shape - a pattern decided and not realized - and is judged under that pattern's _Avoid_ and _Invariants_, not here.
77
+ - **Steelman:** the set is closed by declaration (sealed type, discriminated union, backed enum), the compiler or analyzer enforces exhaustiveness, one call site, no external variants → `none` is correct and the branch is the idiom, not a smell.
78
+ - **Confirm when:** the extension-cost test fails (one more variant edits orchestration code, or edits it in more than one place), or variants come from plugins/config/runtime. Fix: the pattern the forces point at - usually Strategy or Registry.
79
+
80
+ ---
81
+
82
+ ## Cross-cutting (catalog Core Principles + guide anti-patterns)
83
+
84
+ These are not single patterns but principles the catalog enforces everywhere. Same gate: signature present **and** steelman fails.
85
+
86
+ - **Domain purity** - presentation (view-models, design tokens, display labels, locale formatting) or
87
+ infrastructure (URLs, HTTP, runtime config) living in the domain layer. *Steelman:* a type that merely
88
+ *looks* domain-ish but is correctly placed in its own layer is fine. *Confirm when:* the domain layer
89
+ imports framework/HTTP/CSS or holds display strings.
90
+ - **ISP - split ports by concern** - one interface bundling a domain rule + an IO/output port + UI-copy
91
+ strings. *Steelman:* a cohesive interface whose members are one concern is fine. *Confirm when:* a single
92
+ port forces implementers to satisfy unrelated concerns.
93
+ - **Immutability** - object mutation / hidden side effects where `readonly` + immutable updates belong.
94
+ *Steelman:* a local mutable accumulator inside a pure function is fine. *Confirm when:* shared/returned
95
+ state is mutated in place.
96
+ - **Explicitness over magic** - magic strings, implicit effects, dynamic behavior without a contract.
97
+ *Confirm when:* behavior keys are untyped strings, or effects fire from hidden global state.
98
+ - **Derived-value ownership** - a read-only derived field persists through an alternate write path,
99
+ or a memo key omits a fallback dependency. *Steelman:* materialized values have an explicit refresh
100
+ contract; intentional negative caches define scope and invalidation. *Confirm when:* changing the
101
+ omitted input returns stale data, or a raw stored record contains a field the read model alone owns.
102
+ - **Replacement-set ownership** - callers duplicate builders for the same replace-all context and
103
+ supply different keys. *Steelman:* the callers represent distinct contexts with different contracts.
104
+ *Confirm when:* an alternate caller silently drops a required attribute or header.
105
+ - **PHP scoped reads** - a fallback hides a row filtered out by the active tenant, or an opt-out lacks
106
+ target authorization or scope restoration. *Steelman:* the read is intentionally scoped, or an
107
+ authorized cross-scope operation restores the prior filter state. *Confirm when:* an out-of-scope
108
+ fixture or a subsequent scoped read demonstrates the wrong result. Use the PHP guide's boundary tests.
109
+ - **PHP test and docblock integrity** - a declaration separates a method from its docblock, or a test
110
+ repeats the production derivation. *Steelman:* input-field assertions can test a real mapping;
111
+ container/persistence integration tests need their runtime. *Confirm when:* the docblock attaches to
112
+ the wrong element or a targeted behavioral mutation survives the test.
113
+ - **Framework-specific anti-patterns** - business logic in components/templates/effects, `BehaviorSubject`
114
+ stores for UI state, `@HostListener`/`@HostBinding` in new Angular code, calling `HttpClient` from a
115
+ component; in PHP, business logic in controllers / ORM models / Twig, `new \DateTime()` inside a service, a
116
+ file without `declare(strict_types=1)`. These are owned by the project's `transpose-<framework>.md` _Anti-Patterns to Avoid_ - cite that
117
+ list verbatim; do not re-derive it here.
@@ -0,0 +1,25 @@
1
+ name: review-design-patterns
2
+ type: skill
3
+ tools:
4
+ - claude-code
5
+ - cursor
6
+ - github-copilot
7
+ description: "Independently audit design-pattern decisions against a shared catalog - re-derive each site blind and freeze the expected design, compare it with the recorded decision and the code, then put every finding through a steelman gate - so it ships confirmed or flagged with evidence, with catalog gaps reported apart. Use when reviewing code, a diff, or a PR for pattern soundness and anti-patterns, or when challenging a not-yet-built design. Companion to transpose-design-patterns."
8
+ label: "Review Design Patterns"
9
+ author: "Guillaume Mongin (@hellraisercenobit)"
10
+ license: "MIT"
11
+ copyright: "Copyright (c) 2026 Guillaume Mongin (@hellraisercenobit)"
12
+ homepage: "https://github.com/hellraisercenobit/skills/tree/main/skills/engineering/review-design-patterns"
13
+ version: "1.2.0"
14
+ icon: "https://img.icons8.com/color/48/code-review.png"
15
+ tags:
16
+ - software-engineering
17
+ - code-review
18
+ - audit
19
+ - architecture
20
+ - quality-gate
21
+ content: SKILL.md
22
+ installPaths:
23
+ claude-code: .claude/skills/review-design-patterns/SKILL.md
24
+ cursor: .cursor/skills/review-design-patterns/SKILL.md
25
+ github-copilot: .github/instructions/review-design-patterns.instructions.md
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Guillaume Mongin (@hellraisercenobit)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: review-modern-typescript
3
+ description: "Independently audit TS/JS idioms, types, collections, generators, lifetime and native platform choices. Detect verbose legacy idioms, redundant helpers, missed native capabilities, unsafe type claims and incompatible modernization; freeze expectations blind, compare decisions and code, then steelman findings. Use for a diff, existing module, proposal or fresh transpose-modern-typescript handoff. Read-only companion to transpose-modern-typescript. Excludes prose-only and formatting-only edits."
4
+ license: MIT
5
+ metadata:
6
+ author: Guillaume Mongin (@hellraisercenobit)
7
+ ---
8
+
9
+ # Review modern TypeScript
10
+
11
+ Run the audit yourself. Edit no files and delegate no review. The transpose companion owns
12
+ all normative rules. These [smell signatures](references/smell-signatures.md) are detection
13
+ leads, never standalone rules or findings.
14
+
15
+ ## Prerequisites
16
+
17
+ Resolve the installed /transpose-modern-typescript through the harness skill locations.
18
+ Read its `references/suite-contract.md`, `catalog.md`, `compatibility.md` and
19
+ `decision-record.schema.json`, then applicable families only. This reviewer requires
20
+ contract 1.1.0, catalog 1.1.0 and record schema 2.0.0. Missing or conflicting references
21
+ mean incomplete execution, without verdict. Do not download substitutes, reconstruct rules
22
+ from memory or depend on the maintainer's checkout.
23
+
24
+ For transposition, require a fresh context, neutral brief and accessible records. Check
25
+ paths exist without opening contents. A contaminated brief requires a new neutral dispatch
26
+ before completion. A standalone audit needs no historical record.
27
+
28
+ Open the window before step 1: `ai-engineering-gate begin --dimension modern-typescript` freezes
29
+ the state the verdict binds to, captures who you are and refuses the builder of the task.
30
+
31
+ ## Blind audit, then comparison
32
+
33
+ 1. **Facts.** Establish scope with git diff against the stated base, staged/unstaged changes
34
+ and relevant untracked files. Never git log, PR rationale or author analysis. State
35
+ standalone/proposal mode when applicable. Derive compiler/types/build/runtime/browser
36
+ profile independently. A missing required compiler profile is incomplete execution, not
37
+ SOUND. Identify dirty and untracked contents as well as HEAD. Report significant author
38
+ justification encountered in source; do not use it to choose outcomes.
39
+ 2. **Inventory.** Walk catalog axes at every site, including retained choices. Use signatures
40
+ to locate repeated guards, helpers, lookups, retention, eager work and manual platform
41
+ mechanisms. Read context; a search hit is not evidence.
42
+ 3. **Freeze.** Emit the immutable expected matrix in your response **before opening any
43
+ record**: site, constraints, rule IDs, acceptable alternatives, support prerequisites
44
+ and invariants. Support prerequisites name the four MT-23 layers: parser/compiler
45
+ syntax (installed TypeScript version + target), lib/types, emit/bundler, actual runtime.
46
+ A missing required layer is incomplete execution. Include sites needing no specialized
47
+ choice. Freeze acceptable outcomes, not exact syntax. Changed verified premises require
48
+ reframing and a fresh reviewer, retaining the old matrix.
49
+ 4. **Compare.** Now open records and check evidence. Check schema, catalog membership,
50
+ profiles, alternatives, revisions and invariants. Compare expected / recorded / actual
51
+ at every site. Independently verify support claims. A recorded or actual idiom that fails
52
+ any MT-23 layer is a finding even if the builder omitted MT-23 from the record. Steelman
53
+ still allows retaining compatible code. A reassuring record is not proof. A proposal
54
+ review judges intended artifacts, not a runtime implementation.
55
+ 5. **Steelman.** Defend each candidate using concrete compatibility, public contract, domain
56
+ behavior, framework effects, workload or simplicity. Drop it if the defense holds.
57
+ Otherwise cite exact rule and evidence, refute the defense and propose a scoped fix.
58
+ Demonstrated simplification can be Minor; age, missing fashionable syntax or taste
59
+ cannot. No applicable rule means a catalog gap without severity or verdict impact.
60
+ Apply the contract's severity clause for Blocker, Major and Minor; do not restate it.
61
+ 6. **Report.** File through the window you opened, never beside it. Pipe a
62
+ [review envelope](../transpose-modern-typescript/references/review-envelope.schema.json) to
63
+ `ai-engineering-gate attest --dimension modern-typescript --stdin` for SOUND, and to
64
+ `ai-engineering-gate report --dimension modern-typescript --stdin` otherwise. Type each finding:
65
+ `judgment` carries the correction, `evidence` carries a remedy the builder can execute.
66
+ Put no fingerprint in the envelope - the gate computes all three and accepts none. A refusal
67
+ of `state-moved` means the code moved while you read it: the review is void, say so and stop.
68
+ Edit neither code, records, fixtures nor catalogs; filing the envelope is the only exception.
69
+ The builder corrects or disputes; a fresh reviewer reassesses.
70
+
71
+ ## Report
72
+
73
+ - Scope/base/examined state, profile and reference versions/hashes.
74
+ - Coverage and the previously emitted frozen matrix, unchanged.
75
+ - Every site's expected / recorded (or absent in standalone mode) / actual comparison.
76
+ - Confirmed findings: severity, location, rule, evidence, comparison, impact, strongest
77
+ defense, refutation and correction.
78
+ - Defended choices, rejected candidates, separate catalog gaps, check evidence and limits.
79
+ - One verdict: SOUND (complete, zero findings), SMELLS (findings, no Blocker), or VIOLATIONS
80
+ (a Blocker). Missing prerequisites or a missing compiler profile are incomplete execution,
81
+ not a fourth quality verdict. Skipped MT-23 still yields a finding when actual exceeds the
82
+ profile.
83
+
84
+ SOUND expires on audited file or pinned reference changes: the gate recomputes the source,
85
+ reference and decision fingerprints and reports `stale-source`, `stale-reference` or
86
+ `stale-decision` rather than keeping a verdict alive. Portable evidence is not an automatic
87
+ gate lock. Completion needs every applicable dimension on the same final state, passing checks
88
+ and resolved disputes; `ai-engineering-gate can-stop` is what answers that question.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Review Modern TypeScript"
3
+ short_description: "Independently audit TS/JS idioms and native APIs"
@@ -0,0 +1,36 @@
1
+ # Detection leads
2
+
3
+ Resolve each rule in the transpose companion and steelman the choice. This table is not a
4
+ second catalog. Search results require contextual inspection.
5
+
6
+ | Lead | Rules | Defense to try |
7
+ | --- | --- | --- |
8
+ | Repeated extractions, verbose object reconstruction | MT-01 | Getters, read timing, reactive tracking, receiver binding, provenance |
9
+ | Null-only ternary, falsy default, repeated initialization | MT-02, MT-03 | Intentional falsy semantics, mutation forbidden, setter effects |
10
+ | Nested optional arrays, indices, items and calls | MT-04 | Required values must fail; callable/type checks still needed |
11
+ | Manual grouping/search, transparent helper | MT-05, MT-19 | Domain meaning, public contract, prototype/order/hole differences |
12
+ | Repeated scans, string-coerced dictionary keys | MT-06 | Small one-shot data, index cost, duplicate policy, serialization |
13
+ | Object metadata retained globally, unbounded cache | MT-07 | Enumeration, deterministic cleanup, other strong references |
14
+ | Eager sequence only partly consumed | MT-08 | Replay/random access, small data, error timing |
15
+ | Manual resolvers, races without cancellation | MT-09 | Structured async, bounded concurrency, cancellation propagation |
16
+ | Full fetch buffering, polling streams | MT-10 | Atomic payload, replay/retry contract, support |
17
+ | Manual URL/locale parsing or formatting | MT-11 | Domain grammar, security allowlist, locale differences |
18
+ | JSON clone, binary copies, repeated message data | MT-12 | Custom serialization, noncloneable types, transfer ownership |
19
+ | DOM polling, global listeners, repeated layout work | MT-13 | Framework ownership, notifications, timing, accessibility |
20
+ | Sync yield claimed to give UI time | MT-14 | Worker startup/transfer exceeds work; supported task slicing |
21
+ | Ad hoc persistence/coordination/random IDs | MT-15, MT-16 | Consistency, quotas, threat model, secure context |
22
+ | Identity helper or annotation erasing inference | MT-17 | Stable API, intentional widening, understandable diagnostics |
23
+ | Flags creating impossible states | MT-18 | Independent facts, public representation, exhaustive branches |
24
+ | External cast or dishonest predicate | MT-20 | Independently validated boundary with localized proof |
25
+ | readonly claimed to freeze, type puzzles | MT-21 | Runtime freeze, useful derived contract, editor/compiler cost |
26
+ | API or import justified only by TS lib | MT-22, MT-23 | Actual transpiler, loader, runtime and consumers |
27
+ | Widened signature, dropped `readonly`, collapsed union or tuple, new caller-side casts | MT-24 | Simpler public type, boundary accepting unvalidated input, looser native declarations |
28
+ | Single forwarding call, project alias for a global, wrapper added with the transposition it hides | MT-25 | Domain semantics, one-place compatibility policy, instrumentation, lifecycle the caller must not manage, migration boundary |
29
+
30
+ Read data flow and lifetime too, not only old syntax. Useful loops, helpers, classes, enums
31
+ and explicit branches can be SOUND.
32
+
33
+ Two leads are not searchable and are read from the diff instead. MT-24 is found by comparing what
34
+ the compiler knew at each touched signature before and after the change, so hover the symbol or
35
+ compile a consumer rather than grepping. MT-25 is found by reading a helper's body: one forwarding
36
+ call with the arguments unchanged is the shape, and the record must name the reason it survives.
@@ -0,0 +1,22 @@
1
+ name: review-modern-typescript
2
+ type: skill
3
+ tools:
4
+ - claude-code
5
+ - cursor
6
+ - github-copilot
7
+ description: "Audit modern TS/JS decisions with a blind matrix and steelman gate."
8
+ label: "Review Modern TypeScript"
9
+ author: "Guillaume Mongin (@hellraisercenobit)"
10
+ license: "MIT"
11
+ copyright: "Copyright (c) 2026 Guillaume Mongin (@hellraisercenobit)"
12
+ homepage: "https://github.com/hellraisercenobit/skills/tree/main/skills/engineering/review-modern-typescript"
13
+ version: "1.0.0"
14
+ tags:
15
+ - software-engineering
16
+ - typescript
17
+ - javascript
18
+ content: SKILL.md
19
+ installPaths:
20
+ claude-code: .claude/skills/review-modern-typescript/SKILL.md
21
+ cursor: .cursor/skills/review-modern-typescript/SKILL.md
22
+ github-copilot: .github/instructions/review-modern-typescript.instructions.md