@mrciphersmith/keryx 0.3.0 → 0.3.2

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 (93) hide show
  1. package/README.md +4 -1
  2. package/dist/cli.js +13362 -7078
  3. package/dist/core.js +11706 -11330
  4. package/package.json +1 -1
  5. package/src/gdskills/bundled/agents/go-code-auditor.md +1 -1
  6. package/src/gdskills/bundled/agents/python-code-auditor.md +1 -1
  7. package/src/gdskills/bundled/install-manifest.json +271 -4
  8. package/src/gdskills/bundled/rules/core/model-selection.mdc +51 -0
  9. package/src/gdskills/bundled/skills/review/review-jev-comments/SKILL.md +184 -0
  10. package/src/gdskills/bundled/skills/review/review-jev-docs/SKILL.md +189 -0
  11. package/src/gdskills/bundled/skills/review/review-jev-risk/SKILL.md +190 -0
  12. package/src/gdskills/bundled/skills/review/review-jev-rules/SKILL.md +267 -0
  13. package/src/gdskills/bundled/skills/review/review-jev-scenarios/SKILL.md +187 -0
  14. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.detail.md +39 -0
  15. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +1 -1
  16. package/src/gdskills/bundled/stacks/angular/agent-refs.json +4 -0
  17. package/src/gdskills/bundled/stacks/angular/governance/eval.json +1751 -0
  18. package/src/gdskills/bundled/stacks/angular/governance/scout.json +32 -0
  19. package/src/gdskills/bundled/stacks/angular/pack.json +55 -0
  20. package/src/gdskills/bundled/stacks/angular/rules/coding-style.mdc +82 -0
  21. package/src/gdskills/bundled/stacks/angular/rules/patterns.mdc +84 -0
  22. package/src/gdskills/bundled/stacks/angular/rules/security.mdc +70 -0
  23. package/src/gdskills/bundled/stacks/angular/rules/testing.mdc +73 -0
  24. package/src/gdskills/bundled/stacks/angular/skills/angular-build-fix/SKILL.md +127 -0
  25. package/src/gdskills/bundled/stacks/angular/skills/angular-build-fix/evals.json +72 -0
  26. package/src/gdskills/bundled/stacks/angular/skills/angular-code-review/SKILL.md +98 -0
  27. package/src/gdskills/bundled/stacks/angular/skills/angular-code-review/evals.json +73 -0
  28. package/src/gdskills/bundled/stacks/angular/skills/angular-implementation/SKILL.md +112 -0
  29. package/src/gdskills/bundled/stacks/angular/skills/angular-implementation/evals.json +74 -0
  30. package/src/gdskills/bundled/stacks/angular/skills/angular-testing/SKILL.md +102 -0
  31. package/src/gdskills/bundled/stacks/angular/skills/angular-testing/evals.json +71 -0
  32. package/src/gdskills/bundled/stacks/mobx/agent-refs.json +4 -0
  33. package/src/gdskills/bundled/stacks/mobx/governance/eval.json +904 -0
  34. package/src/gdskills/bundled/stacks/mobx/governance/scout.json +18 -0
  35. package/src/gdskills/bundled/stacks/mobx/pack.json +28 -0
  36. package/src/gdskills/bundled/stacks/mobx/rules/coding-style.mdc +91 -0
  37. package/src/gdskills/bundled/stacks/mobx/rules/patterns.mdc +122 -0
  38. package/src/gdskills/bundled/stacks/mobx/rules/security.mdc +56 -0
  39. package/src/gdskills/bundled/stacks/mobx/rules/testing.mdc +63 -0
  40. package/src/gdskills/bundled/stacks/mobx/skills/mobx-observable-testing/SKILL.md +124 -0
  41. package/src/gdskills/bundled/stacks/mobx/skills/mobx-observable-testing/evals.json +73 -0
  42. package/src/gdskills/bundled/stacks/mobx/skills/mobx-store-implementation/SKILL.md +149 -0
  43. package/src/gdskills/bundled/stacks/mobx/skills/mobx-store-implementation/evals.json +74 -0
  44. package/src/gdskills/bundled/stacks/nestjs/agent-refs.json +4 -0
  45. package/src/gdskills/bundled/stacks/nestjs/governance/eval.json +1308 -0
  46. package/src/gdskills/bundled/stacks/nestjs/governance/scout.json +34 -0
  47. package/src/gdskills/bundled/stacks/nestjs/pack.json +53 -0
  48. package/src/gdskills/bundled/stacks/nestjs/rules/coding-style.mdc +70 -0
  49. package/src/gdskills/bundled/stacks/nestjs/rules/patterns.mdc +83 -0
  50. package/src/gdskills/bundled/stacks/nestjs/rules/security.mdc +73 -0
  51. package/src/gdskills/bundled/stacks/nestjs/rules/testing.mdc +69 -0
  52. package/src/gdskills/bundled/stacks/nestjs/skills/nestjs-build-fix/SKILL.md +157 -0
  53. package/src/gdskills/bundled/stacks/nestjs/skills/nestjs-build-fix/evals.json +70 -0
  54. package/src/gdskills/bundled/stacks/nestjs/skills/nestjs-implementation/SKILL.md +129 -0
  55. package/src/gdskills/bundled/stacks/nestjs/skills/nestjs-implementation/evals.json +71 -0
  56. package/src/gdskills/bundled/stacks/nestjs/skills/nestjs-testing/SKILL.md +143 -0
  57. package/src/gdskills/bundled/stacks/nestjs/skills/nestjs-testing/evals.json +69 -0
  58. package/src/gdskills/bundled/stacks/nextjs-nuxt/agent-refs.json +4 -0
  59. package/src/gdskills/bundled/stacks/nextjs-nuxt/governance/eval.json +2413 -0
  60. package/src/gdskills/bundled/stacks/nextjs-nuxt/governance/scout.json +42 -0
  61. package/src/gdskills/bundled/stacks/nextjs-nuxt/pack.json +42 -0
  62. package/src/gdskills/bundled/stacks/nextjs-nuxt/rules/coding-style.mdc +69 -0
  63. package/src/gdskills/bundled/stacks/nextjs-nuxt/rules/patterns.mdc +88 -0
  64. package/src/gdskills/bundled/stacks/nextjs-nuxt/rules/security.mdc +72 -0
  65. package/src/gdskills/bundled/stacks/nextjs-nuxt/rules/testing.mdc +64 -0
  66. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-build-fix/SKILL.md +147 -0
  67. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-build-fix/evals.json +75 -0
  68. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-code-review/SKILL.md +118 -0
  69. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-code-review/evals.json +76 -0
  70. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-implementation/SKILL.md +135 -0
  71. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-implementation/evals.json +78 -0
  72. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-testing/SKILL.md +116 -0
  73. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-testing/evals.json +75 -0
  74. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-upgrade-migration/SKILL.md +134 -0
  75. package/src/gdskills/bundled/stacks/nextjs-nuxt/skills/nextjs-nuxt-upgrade-migration/evals.json +76 -0
  76. package/src/gdskills/bundled/stacks/vue/agent-refs.json +4 -0
  77. package/src/gdskills/bundled/stacks/vue/governance/eval.json +2215 -0
  78. package/src/gdskills/bundled/stacks/vue/governance/scout.json +42 -0
  79. package/src/gdskills/bundled/stacks/vue/pack.json +42 -0
  80. package/src/gdskills/bundled/stacks/vue/rules/coding-style.mdc +73 -0
  81. package/src/gdskills/bundled/stacks/vue/rules/patterns.mdc +84 -0
  82. package/src/gdskills/bundled/stacks/vue/rules/security.mdc +60 -0
  83. package/src/gdskills/bundled/stacks/vue/rules/testing.mdc +69 -0
  84. package/src/gdskills/bundled/stacks/vue/skills/vue-build-fix/SKILL.md +137 -0
  85. package/src/gdskills/bundled/stacks/vue/skills/vue-build-fix/evals.json +72 -0
  86. package/src/gdskills/bundled/stacks/vue/skills/vue-code-review/SKILL.md +120 -0
  87. package/src/gdskills/bundled/stacks/vue/skills/vue-code-review/evals.json +71 -0
  88. package/src/gdskills/bundled/stacks/vue/skills/vue-implementation/SKILL.md +122 -0
  89. package/src/gdskills/bundled/stacks/vue/skills/vue-implementation/evals.json +72 -0
  90. package/src/gdskills/bundled/stacks/vue/skills/vue-testing/SKILL.md +115 -0
  91. package/src/gdskills/bundled/stacks/vue/skills/vue-testing/evals.json +72 -0
  92. package/src/gdskills/bundled/stacks/vue/skills/vue2-to-vue3-migration/SKILL.md +135 -0
  93. package/src/gdskills/bundled/stacks/vue/skills/vue2-to-vue3-migration/evals.json +71 -0
@@ -0,0 +1,149 @@
1
+ ---
2
+ name: mobx-store-implementation
3
+ description: "Use when writing or extending a MobX store: adding observable state, actions, computed getters, or reactions (autorun/reaction/when), wiring a store into React via observer and a context hook, or fixing a component that stops re-rendering after a store change. Applies the makeObservable/action/runInAction/observer shape and the store's dispose lifecycle. Not for reviewing an already-written store's structure (use code-mobx-store-review) and not for plain React state/props work with no MobX involved (use react-implementation)."
4
+ triggers:
5
+ - "add a new observable field to this MobX store"
6
+ - "write a MobX action for this store"
7
+ - "wire this store up with observer and a context hook"
8
+ - "this component doesn't re-render when the store changes"
9
+ - "add a computed getter to this store"
10
+ - "set up a reaction that disposes when the store unmounts"
11
+ - "create a new MobX store for this feature"
12
+ - "make this async store method update state correctly"
13
+ metadata:
14
+ origin: authored
15
+ category: implement
16
+ version: "1.0.0"
17
+ compatible_harnesses: "claude,codex,cursor,zed,opencode"
18
+ license: "MIT"
19
+ ---
20
+
21
+ # MobX store implementation
22
+
23
+ Write or extend a MobX store: observable state, actions, computed
24
+ getters, reactions, and the React wiring (`observer` + context hook) that
25
+ connects it to components. See `rules/coding-style.mdc` for the store
26
+ shape and `rules/patterns.mdc` for the async-action and reaction-disposal
27
+ patterns this skill applies.
28
+
29
+ ## Scope
30
+
31
+ This skill is for **authoring** store code — a new store, a new
32
+ observable/action/computed on an existing store, a new reaction, or the
33
+ `observer`/context wiring that exposes a store to components. It is not
34
+ for auditing an already-written store's structure or accessibility
35
+ modifiers (`code-mobx-store-review` does that), and it does not cover
36
+ plain React component work that touches no MobX API.
37
+
38
+ ## Workflow
39
+
40
+ ### Step 1: Find the project's own store conventions
41
+
42
+ Before writing anything, look at 1-2 existing stores in the project (or
43
+ `rules/coding-style.mdc`'s minimal template if none exist yet) for:
44
+
45
+ - whether the project uses `makeObservable` with explicit annotations or
46
+ `makeAutoObservable`,
47
+ - the store's file/class naming (`xyz.store.ts` / `XyzStore`),
48
+ - whether stores are exposed via React context + hook, a DI container, or
49
+ a module singleton,
50
+ - the project's `enforceActions` setting (check the `configure(...)` call,
51
+ usually in an app-entry or test-setup file) — it determines whether a
52
+ mutation outside an action throws or only warns.
53
+
54
+ Match the existing convention; do not introduce a second store-wiring
55
+ style into a codebase that already has one.
56
+
57
+ ### Step 2: Model the state
58
+
59
+ - Put state that the UI reads and that can change over time on
60
+ `@observable` (or the appropriate variant — `.ref`/`.shallow`/`.struct`,
61
+ see `rules/coding-style.mdc`) fields, not in a component's `useState`.
62
+ - Put anything derivable purely from other observable fields on a
63
+ `@computed get` accessor instead of storing it separately and keeping
64
+ it in sync by hand.
65
+ - Keep injected dependencies (services, sibling stores) as
66
+ `private readonly` constructor parameters, not observable.
67
+
68
+ ### Step 3: Write the actions
69
+
70
+ - Every method that mutates state gets `@action` (private orchestration)
71
+ or `@action.bound` (public, UI-invoked). A public async action stays
72
+ thin: guard check, then delegate to a `private async` method that does
73
+ the real work (see `rules/patterns.mdc`'s async-action shape).
74
+ - Wrap every state mutation that happens after an `await` in
75
+ `runInAction(() => { ... })`. Reach for `flow` instead only when a
76
+ store has many sequential-await actions and the repeated
77
+ `runInAction` blocks are genuinely the dominant noise in the file.
78
+ - Add an equality guard (`if (value !== current)`) before any mutation
79
+ that could re-trigger a reaction feeding back into the same store from
80
+ another store, per `rules/patterns.mdc`.
81
+
82
+ ### Step 4: Wire reactions, if the store needs one
83
+
84
+ - Create `autorun`/`reaction`/`when` in the constructor or an `init()`,
85
+ push the returned disposer into the store's `disposers` array, and call
86
+ every disposer in `dispose()`.
87
+ - Prefer `reaction(() => selector, handler)` over `autorun` when the
88
+ effect should respond to one specific value, not everything the
89
+ handler body happens to read.
90
+ - Never start a raw `autorun`/`reaction` inside a component's render
91
+ body; start it in `useEffect` (with cleanup) if it must live in the
92
+ component rather than the store.
93
+
94
+ ### Step 5: Wire the store into React
95
+
96
+ - Expose the store through a typed `createContext<XyzStore | null>(null)`
97
+ and a `useXyzStore()` hook that throws if the context is unset — do not
98
+ export a bare module-level store instance for components to import
99
+ directly unless that already is the project's convention.
100
+ - Wrap every component that reads store state in `observer` from
101
+ `mobx-react-lite`. If a component "doesn't re-render", check this
102
+ first: a missing `observer` wrapper is the most common cause, followed
103
+ by reading the observable value too early (destructured far from where
104
+ it's rendered) breaking fine-grained tracking.
105
+
106
+ ### Step 6: Verify
107
+
108
+ Run the project's type-check, lint, and store/component tests; see
109
+ Verification below for the exact bar.
110
+
111
+ ## Rules
112
+
113
+ - Follow `rules/coding-style.mdc` for store shape, decorators, and
114
+ observable-collection typing.
115
+ - Follow `rules/patterns.mdc` for the async-action shape, `flow`,
116
+ reaction disposal, and the View↔Store boundary.
117
+ - ALWAYS wrap a post-`await` state mutation in `runInAction`; NEVER leave
118
+ it as a bare assignment relying on `enforceActions` being off.
119
+ - ALWAYS wrap a component that reads observable state in `observer`;
120
+ NEVER assume a plain function component will re-render on a store
121
+ change just because it received the store as a prop.
122
+ - NEVER mutate observable state from inside a `@computed` getter.
123
+ - NEVER create a reaction (`autorun`/`reaction`/`when`) without storing
124
+ and later calling its disposer.
125
+
126
+ ## Red Flags
127
+
128
+ | Rationalization | Why it is wrong |
129
+ |---|---|
130
+ | "I'll just mutate `this.items` right after the `await`, it's simpler than wrapping it" | Outside an action, that mutation either throws under `enforceActions` or silently fails to notify observers depending on config — wrap it in `runInAction` |
131
+ | "This component isn't re-rendering, I'll add a `key` prop / force a remount" | A forced remount papers over the real cause; check for a missing `observer` wrapper or a value read too early first |
132
+ | "I'll skip the disposer, the store lives for the app's whole lifetime anyway" | Even a long-lived store's undisposed reactions keep running against stale data on route/user change; store and call the disposer |
133
+ | "I'll compute this inline in the component instead of a `@computed`, it's just one line" | A component-side recomputation runs on every render and drifts from the store's own reactivity graph the moment two components need the same derived value |
134
+
135
+ ## Verification
136
+
137
+ Do not report the store/wiring done until all of the following hold:
138
+
139
+ - The project's type-check (e.g. `tsc --noEmit`) exits 0.
140
+ - Every action that mutates state after an `await` does so inside
141
+ `runInAction` (or is a `flow` generator).
142
+ - Every component reading the new/changed observable state is wrapped in
143
+ `observer`.
144
+ - Every `autorun`/`reaction`/`when` created has its disposer stored and
145
+ called in `dispose()`.
146
+ - The project's lint (including `@typescript-eslint/explicit-member-accessibility`
147
+ if configured) passes with no new suppressions.
148
+ - Existing store/component tests still pass; a new observable/action has
149
+ at least one test exercising it (see `rules/testing.mdc`).
@@ -0,0 +1,74 @@
1
+ {
2
+ "triggers": {
3
+ "positive": [
4
+ "Whichever item the user clicks should stay highlighted everywhere it's shown on the page, even after they navigate away and back -- what's the cleanest way to track that in MobX?",
5
+ "I have an async method on this MobX store that hits an API and then updates a few fields -- what's the right way to write that so the state updates correctly?",
6
+ "I've got a new MobX store -- what's the right way to make it available to my React components so they can read from it and re-render when it changes?",
7
+ "This component isn't re-rendering when the store's items array changes, help me fix the wiring",
8
+ "The order total should be derived from the line items in this MobX store rather than kept in sync by hand",
9
+ "This store needs to log something every time a value on it changes, but only while the component using it is actually mounted -- how do I set that up in MobX?",
10
+ "Our settings panel needs its own MobX store that tracks loading and error while it saves",
11
+ "Convert this async store method so the post-await mutations are wrapped correctly"
12
+ ],
13
+ "negative": [
14
+ "Review this MobX store for accessibility-modifier and method-ordering issues",
15
+ "Write a test that waits for this store's async fetchItems action to resolve before asserting",
16
+ "Add client-side form validation and inline error messages to this plain React form, no state library involved",
17
+ "Fix this tsc error: Property 'total' does not exist on type 'OrderDraft'",
18
+ "Add a new Pinia store action for saving user preferences",
19
+ "Run the project's lint and type-check scripts and report every failure"
20
+ ]
21
+ },
22
+ "scenarios": [
23
+ {
24
+ "id": "wrap-post-await-mutation",
25
+ "prompt": "I have this MobX action:\n\n```ts\nasync fetchItems() {\n this.loading = true;\n const items = await this.service.getAll();\n this.items = items;\n this.loading = false;\n}\n```\n\nWhat needs to change so it works correctly under MobX's enforceActions?",
26
+ "strictness": "high",
27
+ "expected_behavior": [
28
+ {
29
+ "grader": "judge",
30
+ "rubric": "A correct answer explains that code after an await runs outside the original action's transaction, and fixes it by wrapping every state mutation that happens after the await (this.items = items and this.loading = false) inside runInAction, showing the corrected code rather than only describing the change.",
31
+ "pass_criteria": [
32
+ "Shows the corrected code wrapping the post-await assignments (this.items = items and this.loading = false) inside runInAction(() => { ... }), or restructures the method as a flow generator that achieves the same effect",
33
+ "States that code after an await runs outside the original action's own transaction, which is why the bare assignments need to re-enter via runInAction (or flow)"
34
+ ],
35
+ "fail_criteria": [
36
+ "Recommends disabling or loosening enforceActions (e.g. configuring it to 'never' or 'never' equivalent) instead of wrapping the post-await mutations in runInAction -- mentioning that only to warn against it is not a failure",
37
+ "Leaves this.items = items or this.loading = false as bare, unwrapped assignments after the await with no runInAction or flow restructuring"
38
+ ]
39
+ }
40
+ ],
41
+ "calibration": {
42
+ "known_right": "The problem is that everything after the `await` runs outside the action's original transaction, so MobX no longer treats those assignments as happening inside an action -- under enforceActions that throws, and even without it the reaction system can miss the update. Wrap the post-await mutations in runInAction:\n\n```ts\nasync fetchItems() {\n runInAction(() => {\n this.loading = true;\n });\n const items = await this.service.getAll();\n runInAction(() => {\n this.items = items;\n this.loading = false;\n });\n}\n```\n\nAlternatively, rewrite it as a `flow` generator, which keeps the whole body inside one action and needs no runInAction at all:\n\n```ts\nfetchItems = flow(function* (this: ItemStore) {\n this.loading = true;\n this.items = yield this.service.getAll();\n this.loading = false;\n});\n```\n\nEither way, re-run the type-check and confirm no enforceActions warning/throw fires when this action runs.",
43
+ "known_wrong": "Easiest fix: just set `configure({ enforceActions: 'never' })` in your app setup so MobX stops complaining about mutations outside actions. Then you can leave fetchItems exactly as it is -- the assignments after the await will still update the observable fields and trigger reactions, MobX just won't enforce the action-boundary rule anymore, which saves you from having to wrap anything in runInAction.",
44
+ "vague": "You should make sure the state updates after the await happen inside an action so MobX can properly track them, otherwise you might run into issues with enforceActions.",
45
+ "subtle_wrong": "The important part is that `this.items` gets set correctly, so I wrapped just that one in runInAction: `runInAction(() => { this.items = items; })`. I left `this.loading = false` as a plain assignment right after since it's just a boolean flag and not the actual data -- that keeps the change minimal and the loading indicator still clears in practice even without wrapping it."
46
+ }
47
+ },
48
+ {
49
+ "id": "component-not-rerendering",
50
+ "prompt": "This component reads `store.items.length` in its JSX but never updates when items change:\n\n```tsx\nfunction ItemList({ store }: { store: ItemStore }) {\n return <div>{store.items.length} items</div>;\n}\n```\n\nWhat's wrong and how do I fix it?",
51
+ "strictness": "high",
52
+ "expected_behavior": [
53
+ {
54
+ "grader": "judge",
55
+ "rubric": "A correct answer identifies that ItemList itself is not wrapped in observer from mobx-react-lite, which is why it renders once and never reacts to store.items changing, and fixes it by wrapping this specific component in observer.",
56
+ "pass_criteria": [
57
+ "States that ItemList is missing the observer wrapper (mobx-react-lite) around the component that actually reads store.items, and that this is why it stops updating after the first render",
58
+ "Shows the corrected code with ItemList itself wrapped in observer (e.g. `const ItemList = observer(({ store }: { store: ItemStore }) => <div>{store.items.length} items</div>);`)"
59
+ ],
60
+ "fail_criteria": [
61
+ "Recommends forcing a re-render through a changing key prop, forceUpdate, or mirroring store.items.length into a useState/useEffect pair instead of wrapping ItemList in observer -- mentioning that only to warn against it is not a failure",
62
+ "Wraps only a parent/ancestor component in observer while leaving ItemList itself unwrapped, and claims that is sufficient for ItemList's own re-render"
63
+ ]
64
+ }
65
+ ],
66
+ "calibration": {
67
+ "known_right": "ItemList reads `store.items.length` directly, but it's a plain function component -- nothing tells MobX to track its render and re-run it when items changes. Wrap ItemList itself in observer from mobx-react-lite:\n\n```tsx\nimport { observer } from \"mobx-react-lite\";\n\nconst ItemList = observer(({ store }: { store: ItemStore }) => (\n <div>{store.items.length} items</div>\n));\n```\n\nobserver makes MobX track every observable read during that component's render and re-render it specifically when one of those observables changes. Since ItemList is the component doing the read, it has to be the one wrapped -- wrapping some ancestor further up the tree would not make ItemList itself re-render on its own.",
68
+ "known_wrong": "Simplest fix: pass a changing key prop from the parent, like `<ItemList key={store.items.length} store={store} />`, so React remounts ItemList whenever the length changes. That forces a fresh render with the current value without having to touch MobX wiring at all.",
69
+ "vague": "Something about how the component is hooked up to the store isn't quite right -- you probably need to set up the MobX integration for this component so it responds to changes.",
70
+ "subtle_wrong": "The fix is to wrap the parent component that renders ItemList in observer, since that's where store gets passed down from -- once the parent is observed, MobX should propagate the re-render down to ItemList whenever store.items changes, so I left ItemList itself as a plain function component."
71
+ }
72
+ }
73
+ ]
74
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "agents": [],
3
+ "note": "Demoted from stable (R1 review, PR #719, final honest gate re-run after fixing review findings): nestjs-implementation's trigger-positive-5 (the exception-filter prompt) no longer routes correctly (TP 6/7) once its positive was reworded away from naming the internal APP_FILTER token to describe the goal/symptom only -- an honest, accepted regression per the review's own instruction not to re-stuff the prompt to force a pass. nestjs-testing and nestjs-build-fix both still pass cleanly; nestjs-implementation alone fails the pack. No generated agent pair; the earlier nestjs-build-fixer.md is removed."
4
+ }