simt-dev 0.2.0__py3-none-any.whl

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 (138) hide show
  1. python/simt_dev/__init__.py +32 -0
  2. python/simt_dev/cli.py +225 -0
  3. simt_dev/__init__.py +32 -0
  4. simt_dev/cli.py +225 -0
  5. simt_dev/vendored/CHANGELOG.md +166 -0
  6. simt_dev/vendored/bin/simt-dev.mjs +28 -0
  7. simt_dev/vendored/docs/decisions/ADR-001-push-requires-approval.md +42 -0
  8. simt_dev/vendored/docs/decisions/ADR-002-refactor-blast-radius.md +45 -0
  9. simt_dev/vendored/docs/decisions/ADR-003-test-breadth.md +46 -0
  10. simt_dev/vendored/docs/decisions/ADR-004-hook-owns-format.md +45 -0
  11. simt_dev/vendored/docs/decisions/ADR-005-file-length.md +42 -0
  12. simt_dev/vendored/docs/decisions/ADR-006-coverage-bar.md +59 -0
  13. simt_dev/vendored/docs/decisions/ADR-007-section-skeleton.md +54 -0
  14. simt_dev/vendored/docs/decisions/ADR-008-verdict-vocabulary.md +59 -0
  15. simt_dev/vendored/docs/decisions/ADR-009-skill-layout.md +48 -0
  16. simt_dev/vendored/docs/decisions/ADR-010-runner-invocation.md +56 -0
  17. simt_dev/vendored/docs/decisions/ADR-011-windows-support.md +52 -0
  18. simt_dev/vendored/docs/decisions/ADR-012-drop-windows-support.md +59 -0
  19. simt_dev/vendored/docs/decisions/ADR-013-genericity-by-facts-and-local-profiles.md +114 -0
  20. simt_dev/vendored/docs/decisions/ADR-014-workspace-is-configuration.md +211 -0
  21. simt_dev/vendored/docs/decisions/ADR-015-a-source-is-content-not-a-location.md +117 -0
  22. simt_dev/vendored/docs/decisions/ADR-016-a-divergent-rule-is-retired-not-merged.md +180 -0
  23. simt_dev/vendored/docs/decisions/ADR-017-a-declared-gate-must-be-runnable.md +89 -0
  24. simt_dev/vendored/docs/decisions/ADR-018-an-unset-hooks-path-is-not-an-absent-hook.md +183 -0
  25. simt_dev/vendored/docs/decisions/ADR-019-a-declared-command-is-the-runner.md +110 -0
  26. simt_dev/vendored/docs/decisions/ADR-020-a-rule-is-written-per-surface-and-pointed-not-copied.md +100 -0
  27. simt_dev/vendored/docs/decisions/ADR-021-one-surface-per-repo.md +94 -0
  28. simt_dev/vendored/docs/decisions/ADR-022-a-key-simt-dev-reads-is-prefixed.md +98 -0
  29. simt_dev/vendored/docs/decisions/ADR-023-the-gate-ships-as-a-file-the-repo-owns.md +106 -0
  30. simt_dev/vendored/docs/decisions/ADR-024-simt-dev-overwrites-its-own-gate-file.md +111 -0
  31. simt_dev/vendored/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +153 -0
  32. simt_dev/vendored/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +117 -0
  33. simt_dev/vendored/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +130 -0
  34. simt_dev/vendored/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +131 -0
  35. simt_dev/vendored/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +120 -0
  36. simt_dev/vendored/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +114 -0
  37. simt_dev/vendored/docs/decisions/ADR-031-the-suite-stages-the-environment-it-needs.md +129 -0
  38. simt_dev/vendored/docs/decisions/ADR-032-provenance-is-a-content-digest-not-a-commit.md +141 -0
  39. simt_dev/vendored/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +82 -0
  40. simt_dev/vendored/docs/decisions/ADR-034-a-staged-tool-refuses-a-partially-staged-file.md +91 -0
  41. simt_dev/vendored/docs/decisions/ADR-035-one-write-decision-and-one-json-document.md +119 -0
  42. simt_dev/vendored/docs/decisions/ADR-036-a-writer-that-writes-says-so-and-the-instructions-naming-it-move-with-it.md +103 -0
  43. simt_dev/vendored/docs/decisions/ADR-037-unchanged-means-writing-would-not-change-a-byte.md +100 -0
  44. simt_dev/vendored/docs/decisions/ADR-038-the-gate-filter-belongs-to-every-manifest-writer.md +95 -0
  45. simt_dev/vendored/docs/decisions/ADR-039-a-ci-step-runs-a-form-that-can-fail.md +101 -0
  46. simt_dev/vendored/docs/decisions/ADR-040-the-last-writer-that-wrote-by-default-was-not-the-one-named.md +158 -0
  47. simt_dev/vendored/docs/decisions/ADR-041-the-suite-installs-the-package-in-order-to-test-it.md +92 -0
  48. simt_dev/vendored/docs/decisions/ADR-042-a-declared-glob-must-match-a-path-built-from-it.md +94 -0
  49. simt_dev/vendored/docs/decisions/ADR-043-a-keyword-is-a-phrase-and-two-letters-is-a-word.md +90 -0
  50. simt_dev/vendored/docs/decisions/ADR-044-compatibility-is-not-evidence.md +116 -0
  51. simt_dev/vendored/docs/decisions/ADR-045-a-dashboard-that-counts-a-defect.md +119 -0
  52. simt_dev/vendored/docs/decisions/ADR-046-one-rule-one-copy.md +140 -0
  53. simt_dev/vendored/docs/decisions/ADR-047-a-profile-selects-on-what-a-repository-runs-on.md +141 -0
  54. simt_dev/vendored/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +150 -0
  55. simt_dev/vendored/docs/decisions/ADR-049-a-ruling-that-a-later-record-moved-says-so-where-it-is-printed.md +153 -0
  56. simt_dev/vendored/docs/decisions/ADR-050-a-byte-count-is-not-a-region-and-updated-is-not-a-change-of-rules.md +102 -0
  57. simt_dev/vendored/docs/decisions/ADR-051-a-pointer-is-the-readers-only-route-so-it-is-not-a-convenience.md +134 -0
  58. simt_dev/vendored/docs/decisions/ADR-052-a-dependency-is-counted-against-the-budget-and-there-is-one-budget.md +101 -0
  59. simt_dev/vendored/docs/decisions/ADR-053-the-node-floor-is-22-20-0.md +49 -0
  60. simt_dev/vendored/docs/decisions/ADR-054-the-digest-covers-every-byte-that-leaves-the-package.md +100 -0
  61. simt_dev/vendored/docs/decisions/ADR-055-a-status-line-travels-so-it-may-not-name-a-location.md +98 -0
  62. simt_dev/vendored/docs/decisions/ADR-056-three-names-one-of-which-is-cheap-to-move.md +160 -0
  63. simt_dev/vendored/docs/decisions/ADR-057-an-identity-is-per-developer-and-a-repository-does-not-own-it.md +115 -0
  64. simt_dev/vendored/docs/decisions/ADR-058-one-tool-three-channels-and-the-order-is-forced.md +148 -0
  65. simt_dev/vendored/docs/decisions/README.md +530 -0
  66. simt_dev/vendored/graph/skills.graph.json +1622 -0
  67. simt_dev/vendored/package.json +43 -0
  68. simt_dev/vendored/rules/core.md +76 -0
  69. simt_dev/vendored/rules/mdc/intake-questions.mdc +50 -0
  70. simt_dev/vendored/rules/mdc/preview-postflight.mdc +61 -0
  71. simt_dev/vendored/rules/mdc/slice-commit.mdc +52 -0
  72. simt_dev/vendored/rules/mdc/test-gate.mdc +54 -0
  73. simt_dev/vendored/rules/stacks/android.md +63 -0
  74. simt_dev/vendored/rules/stacks/cloudflare-workers.md +65 -0
  75. simt_dev/vendored/rules/stacks/connectiq.md +62 -0
  76. simt_dev/vendored/rules/stacks/container.md +31 -0
  77. simt_dev/vendored/rules/stacks/jvm.md +54 -0
  78. simt_dev/vendored/rules/stacks/node.md +45 -0
  79. simt_dev/vendored/rules/stacks/python.md +48 -0
  80. simt_dev/vendored/rules/stacks/react-native.md +58 -0
  81. simt_dev/vendored/rules/stacks/react-web.md +61 -0
  82. simt_dev/vendored/rules/stacks/typescript.md +21 -0
  83. simt_dev/vendored/rules/stacks/uv.md +32 -0
  84. simt_dev/vendored/src/argv.mjs +116 -0
  85. simt_dev/vendored/src/ci/dependabot.mjs +268 -0
  86. simt_dev/vendored/src/ci/workflow.mjs +360 -0
  87. simt_dev/vendored/src/commands/ci.mjs +285 -0
  88. simt_dev/vendored/src/commands/compare.mjs +195 -0
  89. simt_dev/vendored/src/commands/graph.mjs +73 -0
  90. simt_dev/vendored/src/commands/help.mjs +108 -0
  91. simt_dev/vendored/src/commands/hooks.mjs +471 -0
  92. simt_dev/vendored/src/commands/index.mjs +241 -0
  93. simt_dev/vendored/src/commands/init.mjs +632 -0
  94. simt_dev/vendored/src/commands/mcp.mjs +63 -0
  95. simt_dev/vendored/src/commands/rules.mjs +374 -0
  96. simt_dev/vendored/src/commands/skills.mjs +647 -0
  97. simt_dev/vendored/src/commands/skillsinstall.mjs +515 -0
  98. simt_dev/vendored/src/commands/sync.mjs +331 -0
  99. simt_dev/vendored/src/commands/upgrade.mjs +202 -0
  100. simt_dev/vendored/src/compare/discover.mjs +212 -0
  101. simt_dev/vendored/src/compare/hooksstate.mjs +159 -0
  102. simt_dev/vendored/src/compare/row.mjs +299 -0
  103. simt_dev/vendored/src/decisions/index.mjs +536 -0
  104. simt_dev/vendored/src/graph/load.mjs +541 -0
  105. simt_dev/vendored/src/hooks/capability.mjs +129 -0
  106. simt_dev/vendored/src/hooks/dispatcher.mjs +268 -0
  107. simt_dev/vendored/src/hooks/gates.mjs +144 -0
  108. simt_dev/vendored/src/hooks/resolve.mjs +194 -0
  109. simt_dev/vendored/src/hooks/shim.mjs +140 -0
  110. simt_dev/vendored/src/hooks/where.mjs +118 -0
  111. simt_dev/vendored/src/identity.mjs +218 -0
  112. simt_dev/vendored/src/locate.mjs +75 -0
  113. simt_dev/vendored/src/mcp/server.mjs +167 -0
  114. simt_dev/vendored/src/mcp/tools.mjs +410 -0
  115. simt_dev/vendored/src/name.mjs +95 -0
  116. simt_dev/vendored/src/output/index.mjs +96 -0
  117. simt_dev/vendored/src/projection/baselines.mjs +209 -0
  118. simt_dev/vendored/src/projection/conflicts.mjs +205 -0
  119. simt_dev/vendored/src/projection/manifest.mjs +478 -0
  120. simt_dev/vendored/src/projection/markers.mjs +349 -0
  121. simt_dev/vendored/src/projection/mdc.mjs +327 -0
  122. simt_dev/vendored/src/projection/project.mjs +504 -0
  123. simt_dev/vendored/src/projection/rules.mjs +640 -0
  124. simt_dev/vendored/src/projection/surfaces.mjs +398 -0
  125. simt_dev/vendored/src/projection/targets.mjs +221 -0
  126. simt_dev/vendored/src/resolve/fingerprint.mjs +553 -0
  127. simt_dev/vendored/src/resolve/near.mjs +61 -0
  128. simt_dev/vendored/src/resolve/resolve.mjs +457 -0
  129. simt_dev/vendored/src/resolve/source.mjs +105 -0
  130. simt_dev/vendored/src/toolchain.mjs +202 -0
  131. simt_dev/vendored/src/tsconfig.mjs +314 -0
  132. simt_dev/vendored/src/upgrade/plan.mjs +203 -0
  133. simt_dev/vendored/src/workspace.mjs +289 -0
  134. simt_dev-0.2.0.dist-info/METADATA +150 -0
  135. simt_dev-0.2.0.dist-info/RECORD +138 -0
  136. simt_dev-0.2.0.dist-info/WHEEL +4 -0
  137. simt_dev-0.2.0.dist-info/entry_points.txt +2 -0
  138. simt_dev-0.2.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,1622 @@
1
+ {
2
+ "$schema": "./skills.graph.schema.json",
3
+ "version": 1,
4
+ "description": "The SIMT skill registry. Hand-authored and reviewable; structure is declared, never inferred (docs/plans/0002-simt-dev-cli.md section 3.1). Resolution is deterministic: same repo + same task = same answer.",
5
+ "deferredThreshold": 20000,
6
+ "stackVocabularySource": "src/resolve/fingerprint.mjs",
7
+ "conventions": {
8
+ "variants": "One node, several bodies, discriminated by stack. Used when the SAME skill name exists in several repos with genuinely different content (the 8 duplicated Social names).",
9
+ "variant-stack": "A variant stack must name the tag that DIFFERS between the bodies, not a tag both repos share. cloudflare-workers is emitted by simt-social as well as simt-social-api (both ship a wrangler.jsonc), so an api variant listing it matches the web repo too and stops discriminating; hono is the tag that actually separates them. Lint can check that variant stacks are pairwise disjoint, but not that they are discriminative in practice - the goldens test resolves every variant-bearing skill against both real repos and requires exactly one match.",
10
+ "variant-of": "Several nodes that are siblings, discriminated by stack. Used when siblings have DIFFERENT names (web-security-review / api-security-review). Both mechanisms resolve identically: one body per stack.",
11
+ "sources.role": "canonical = the body that becomes the single home. variant = a real distinct body. stub = a thin pointer to another node. duplicate = byte-identical to the canonical body. deprecated = retired name, see alias-of.",
12
+ "deferred": "Derived, not chosen: deferred is true exactly when totalBytes exceeds deferredThreshold. Hand-editing it is a lint error."
13
+ },
14
+ "capabilities": [
15
+ {
16
+ "id": "scaffold",
17
+ "summary": "Create a new module, screen, overlay, route or destination"
18
+ },
19
+ {
20
+ "id": "persistence",
21
+ "summary": "Database schema, migrations, Room, D1, DataStore"
22
+ },
23
+ {
24
+ "id": "build",
25
+ "summary": "Compile, format, verify, CI"
26
+ },
27
+ {
28
+ "id": "testing",
29
+ "summary": "Write, run or audit tests; coverage"
30
+ },
31
+ {
32
+ "id": "commit",
33
+ "summary": "Commit or ship a completed slice or bugfix"
34
+ },
35
+ {
36
+ "id": "security",
37
+ "summary": "Threat, privacy and trust-boundary review"
38
+ },
39
+ {
40
+ "id": "release",
41
+ "summary": "Deploy, release gate, preview postflight"
42
+ },
43
+ {
44
+ "id": "observability",
45
+ "summary": "Structured logs, metrics, traces, SLOs"
46
+ },
47
+ {
48
+ "id": "contract",
49
+ "summary": "Cross-repo API contract and generated types"
50
+ },
51
+ {
52
+ "id": "maps",
53
+ "summary": "MapLibre, PMTiles, gazetteers, launch galaxies"
54
+ },
55
+ {
56
+ "id": "accessibility",
57
+ "summary": "Localisation, RTL, WCAG, keyboard, reduced motion"
58
+ },
59
+ {
60
+ "id": "ui-design",
61
+ "summary": "Prototype fidelity and design-system tokens"
62
+ },
63
+ {
64
+ "id": "quality",
65
+ "summary": "Production readiness, performance budgets"
66
+ },
67
+ {
68
+ "id": "platform",
69
+ "summary": "Cloudflare platform configuration and reference"
70
+ },
71
+ {
72
+ "id": "auth",
73
+ "summary": "Firebase setup, authentication, security rules"
74
+ },
75
+ {
76
+ "id": "knowledge",
77
+ "summary": "Codebase architecture and file relationships"
78
+ },
79
+ {
80
+ "id": "feature-slice",
81
+ "summary": "Implement a product slice in web or API"
82
+ },
83
+ {
84
+ "id": "seeding",
85
+ "summary": "QA accounts and demo data"
86
+ },
87
+ {
88
+ "id": "orchestration",
89
+ "summary": "Coordinate multiple specialist agents"
90
+ },
91
+ {
92
+ "id": "documentation",
93
+ "summary": "Feature plans and in-repo documentation"
94
+ },
95
+ {
96
+ "id": "content",
97
+ "summary": "Published editorial content and press assets"
98
+ },
99
+ {
100
+ "id": "positioning",
101
+ "summary": "GNSS, RTK, PPP, satellite positioning"
102
+ },
103
+ {
104
+ "id": "wear",
105
+ "summary": "Wear OS app and phone-watch Data Layer"
106
+ }
107
+ ],
108
+ "skills": [
109
+ {
110
+ "name": "add-country-galaxy",
111
+ "summary": "Onboard a launch galaxy across simt-api map assets, simt-social-api registry/D1 and the web consumer",
112
+ "capabilities": [
113
+ "maps",
114
+ "contract",
115
+ "scaffold"
116
+ ],
117
+ "stack": [
118
+ "node",
119
+ "node-web",
120
+ "react",
121
+ "react-router",
122
+ "typescript",
123
+ "cloudflare-workers",
124
+ "hono"
125
+ ],
126
+ "paths": [
127
+ "scripts/maps/**",
128
+ "migrations/**",
129
+ "app/features/country/**"
130
+ ],
131
+ "keywords": [
132
+ "country",
133
+ "galaxy",
134
+ "gazetteer",
135
+ "pmtiles",
136
+ "launch",
137
+ "iso",
138
+ "registry"
139
+ ],
140
+ "bytes": 15604,
141
+ "variants": [
142
+ {
143
+ "id": "api",
144
+ "stack": [
145
+ "hono"
146
+ ],
147
+ "bytes": 15604
148
+ },
149
+ {
150
+ "id": "web",
151
+ "stack": [
152
+ "react",
153
+ "node-web"
154
+ ],
155
+ "bytes": 1852
156
+ }
157
+ ],
158
+ "sources": [
159
+ {
160
+ "repo": "simt-social-api",
161
+ "path": ".agents/skills/add-country-galaxy",
162
+ "bytes": 15604,
163
+ "role": "canonical"
164
+ },
165
+ {
166
+ "repo": "simt-social",
167
+ "path": ".agents/skills/add-country-galaxy",
168
+ "bytes": 1852,
169
+ "role": "stub",
170
+ "note": "44-line Phase-3 pointer to the canonical copy; the cleanest alias pattern already in the estate"
171
+ }
172
+ ],
173
+ "note": "Spans three repos and deliberately excludes simt-social-media."
174
+ },
175
+ {
176
+ "name": "add-feature-module",
177
+ "summary": "Scaffold a brand-new Gradle module (feature, core or data) in the SIMT Android app",
178
+ "capabilities": [
179
+ "scaffold",
180
+ "build"
181
+ ],
182
+ "stack": [
183
+ "gradle",
184
+ "kotlin"
185
+ ],
186
+ "paths": [
187
+ "**/build.gradle.kts",
188
+ "settings.gradle.kts"
189
+ ],
190
+ "keywords": [
191
+ "module",
192
+ "gradle",
193
+ "scaffold",
194
+ "convention plugin",
195
+ "hilt",
196
+ "feature"
197
+ ],
198
+ "bytes": 4864,
199
+ "sources": [
200
+ {
201
+ "repo": "simt-app",
202
+ "path": ".cursor/skills/add-feature-module",
203
+ "bytes": 4864,
204
+ "role": "canonical"
205
+ }
206
+ ]
207
+ },
208
+ {
209
+ "name": "add-screen-or-overlay",
210
+ "summary": "Add a screen, dialog, bottom sheet or modal, including the build-enforced overlay policy",
211
+ "capabilities": [
212
+ "scaffold",
213
+ "accessibility",
214
+ "ui-design"
215
+ ],
216
+ "stack": [
217
+ "gradle",
218
+ "kotlin"
219
+ ],
220
+ "paths": [
221
+ "**/*.kt"
222
+ ],
223
+ "keywords": [
224
+ "screen",
225
+ "dialog",
226
+ "sheet",
227
+ "modal",
228
+ "overlay",
229
+ "navigation",
230
+ "route"
231
+ ],
232
+ "bytes": 6731,
233
+ "sources": [
234
+ {
235
+ "repo": "simt-app",
236
+ "path": ".cursor/skills/add-screen-or-overlay",
237
+ "bytes": 6731,
238
+ "role": "canonical"
239
+ }
240
+ ],
241
+ "note": "Carries a hard rule enforced by the build: features must not import androidx.compose.ui.window.Dialog; checkOverlayModalPolicy fails ./gradlew check."
242
+ },
243
+ {
244
+ "name": "api-feature-slice",
245
+ "summary": "Implement or review a Social API feature slice in Hono and TypeScript",
246
+ "capabilities": [
247
+ "feature-slice",
248
+ "security",
249
+ "observability"
250
+ ],
251
+ "stack": [
252
+ "node",
253
+ "cloudflare-workers",
254
+ "hono",
255
+ "typescript"
256
+ ],
257
+ "paths": [
258
+ "src/routes/**",
259
+ "src/services/**",
260
+ "src/contracts/**"
261
+ ],
262
+ "keywords": [
263
+ "route",
264
+ "hono",
265
+ "zod",
266
+ "openapi",
267
+ "endpoint",
268
+ "operation",
269
+ "d1"
270
+ ],
271
+ "bytes": 4493,
272
+ "variantOf": "feature-slice",
273
+ "sources": [
274
+ {
275
+ "repo": "simt-social-api",
276
+ "path": ".agents/skills/api-feature-slice",
277
+ "bytes": 4493,
278
+ "role": "canonical"
279
+ }
280
+ ]
281
+ },
282
+ {
283
+ "name": "api-contract-sync",
284
+ "summary": "Synchronise web code with the generated simt-social-api OpenAPI contract",
285
+ "capabilities": [
286
+ "contract"
287
+ ],
288
+ "stack": [
289
+ "node",
290
+ "node-web",
291
+ "react",
292
+ "react-router",
293
+ "typescript"
294
+ ],
295
+ "paths": [
296
+ "app/contracts/**",
297
+ "simt-social-openapi-contract.json"
298
+ ],
299
+ "keywords": [
300
+ "openapi",
301
+ "contract",
302
+ "schema",
303
+ "etag",
304
+ "cursor",
305
+ "generated",
306
+ "consumer"
307
+ ],
308
+ "bytes": 2973,
309
+ "sources": [
310
+ {
311
+ "repo": "simt-social",
312
+ "path": ".agents/skills/api-contract-sync",
313
+ "bytes": 2973,
314
+ "role": "canonical"
315
+ }
316
+ ]
317
+ },
318
+ {
319
+ "name": "api-security-review",
320
+ "summary": "Review Social API security: auth, IDOR, private data, D1 invariants, Queues, Durable Objects",
321
+ "capabilities": [
322
+ "security"
323
+ ],
324
+ "stack": [
325
+ "node",
326
+ "cloudflare-workers",
327
+ "hono",
328
+ "typescript"
329
+ ],
330
+ "paths": [
331
+ "src/**"
332
+ ],
333
+ "keywords": [
334
+ "idor",
335
+ "auth",
336
+ "firebase",
337
+ "d1",
338
+ "queue",
339
+ "durable object",
340
+ "r2",
341
+ "capability",
342
+ "audit"
343
+ ],
344
+ "bytes": 4380,
345
+ "variantOf": "security-review",
346
+ "sources": [
347
+ {
348
+ "repo": "simt-social-api",
349
+ "path": ".agents/skills/api-security-review",
350
+ "bytes": 4380,
351
+ "role": "canonical"
352
+ }
353
+ ]
354
+ },
355
+ {
356
+ "name": "bug-commit",
357
+ "summary": "Validate and commit a completed bugfix with a mandatory regression test and a root-cause fix",
358
+ "capabilities": [
359
+ "commit",
360
+ "testing"
361
+ ],
362
+ "stack": [
363
+ "node",
364
+ "node-web",
365
+ "react",
366
+ "react-router",
367
+ "typescript",
368
+ "cloudflare-workers",
369
+ "hono"
370
+ ],
371
+ "paths": [],
372
+ "keywords": [
373
+ "bugfix",
374
+ "regression test",
375
+ "root cause",
376
+ "commit",
377
+ "sha",
378
+ "revert"
379
+ ],
380
+ "bytes": 5135,
381
+ "variants": [
382
+ {
383
+ "id": "web",
384
+ "stack": [
385
+ "react",
386
+ "node-web"
387
+ ],
388
+ "bytes": 5000
389
+ },
390
+ {
391
+ "id": "api",
392
+ "stack": [
393
+ "hono"
394
+ ],
395
+ "bytes": 5135
396
+ }
397
+ ],
398
+ "sources": [
399
+ {
400
+ "repo": "simt-social-api",
401
+ "path": ".agents/skills/bug-commit",
402
+ "bytes": 5135,
403
+ "role": "canonical"
404
+ },
405
+ {
406
+ "repo": "simt-social",
407
+ "path": ".agents/skills/bug-commit",
408
+ "bytes": 5000,
409
+ "role": "variant",
410
+ "note": "34 drifted lines against the canonical copy"
411
+ }
412
+ ]
413
+ },
414
+ {
415
+ "name": "build-test-verify",
416
+ "summary": "Gradle commands, definition of done and CI behaviour for the SIMT Android app",
417
+ "capabilities": [
418
+ "build",
419
+ "testing"
420
+ ],
421
+ "stack": [
422
+ "gradle",
423
+ "kotlin"
424
+ ],
425
+ "paths": [
426
+ "**/*.gradle.kts",
427
+ "**/build/**"
428
+ ],
429
+ "keywords": [
430
+ "gradle",
431
+ "build",
432
+ "test",
433
+ "spotless",
434
+ "apk",
435
+ "aab",
436
+ "verify",
437
+ "ci"
438
+ ],
439
+ "bytes": 4123,
440
+ "sources": [
441
+ {
442
+ "repo": "simt-app",
443
+ "path": ".cursor/skills/build-test-verify",
444
+ "bytes": 4123,
445
+ "role": "canonical"
446
+ }
447
+ ]
448
+ },
449
+ {
450
+ "name": "cloudflare",
451
+ "summary": "Cloudflare platform reference: Workers, D1, R2, KV, Queues, Durable Objects, observability",
452
+ "capabilities": [
453
+ "platform"
454
+ ],
455
+ "stack": [
456
+ "cloudflare-workers"
457
+ ],
458
+ "paths": [
459
+ "wrangler.jsonc",
460
+ "wrangler.toml"
461
+ ],
462
+ "keywords": [
463
+ "cloudflare",
464
+ "workers",
465
+ "d1",
466
+ "r2",
467
+ "kv",
468
+ "queue",
469
+ "durable object",
470
+ "wrangler",
471
+ "workers ai"
472
+ ],
473
+ "bytes": 384869,
474
+ "deferred": true,
475
+ "vendored": true,
476
+ "sources": [
477
+ {
478
+ "repo": "simt-social-api",
479
+ "path": ".agents/skills/cloudflare",
480
+ "bytes": 384869,
481
+ "role": "canonical",
482
+ "note": "81 reference files across 16 directories; the product index names 67 Cloudflare products and the 47 with no directory written are marked 'not written' rather than linked"
483
+ }
484
+ ],
485
+ "note": "Largest body in the estate at 384 KB. Always deferred; never inlined by skills brief."
486
+ },
487
+ {
488
+ "name": "cloudflare-release",
489
+ "summary": "Implement, validate or release Cloudflare Worker integrations, bindings and preview resources",
490
+ "capabilities": [
491
+ "release",
492
+ "platform"
493
+ ],
494
+ "stack": [
495
+ "cloudflare-workers",
496
+ "hono",
497
+ "typescript"
498
+ ],
499
+ "paths": [
500
+ "wrangler.jsonc",
501
+ "package.json"
502
+ ],
503
+ "keywords": [
504
+ "deploy",
505
+ "release",
506
+ "binding",
507
+ "wrangler",
508
+ "preview",
509
+ "rollback",
510
+ "secret",
511
+ "rate limiter"
512
+ ],
513
+ "bytes": 4538,
514
+ "sources": [
515
+ {
516
+ "repo": "simt-social-api",
517
+ "path": ".agents/skills/cloudflare-release",
518
+ "bytes": 4538,
519
+ "role": "canonical"
520
+ }
521
+ ]
522
+ },
523
+ {
524
+ "name": "complete-testing",
525
+ "summary": "Risk-proportionate test design, implementation and audit for an executable behavior slice",
526
+ "capabilities": [
527
+ "testing"
528
+ ],
529
+ "stack": [
530
+ "node",
531
+ "node-web",
532
+ "react",
533
+ "react-router",
534
+ "typescript",
535
+ "cloudflare-workers",
536
+ "hono"
537
+ ],
538
+ "paths": [
539
+ "test/**",
540
+ "e2e/**",
541
+ "**/*.test.ts",
542
+ "**/*.spec.ts"
543
+ ],
544
+ "keywords": [
545
+ "test",
546
+ "vitest",
547
+ "playwright",
548
+ "e2e",
549
+ "unit",
550
+ "browser matrix",
551
+ "flake",
552
+ "sentinel"
553
+ ],
554
+ "bytes": 7324,
555
+ "variants": [
556
+ {
557
+ "id": "web",
558
+ "stack": [
559
+ "react",
560
+ "node-web"
561
+ ],
562
+ "bytes": 7324
563
+ },
564
+ {
565
+ "id": "api",
566
+ "stack": [
567
+ "hono"
568
+ ],
569
+ "bytes": 6309
570
+ }
571
+ ],
572
+ "sources": [
573
+ {
574
+ "repo": "simt-social",
575
+ "path": ".agents/skills/complete-testing",
576
+ "bytes": 7324,
577
+ "role": "canonical"
578
+ },
579
+ {
580
+ "repo": "simt-social-api",
581
+ "path": ".agents/skills/complete-testing",
582
+ "bytes": 6309,
583
+ "role": "variant",
584
+ "note": "143 drifted lines; the only duplicated skill pair where over half the body differs"
585
+ }
586
+ ]
587
+ },
588
+ {
589
+ "name": "create-blog-guide",
590
+ "summary": "Author, validate and publish a SIMT Blog guide from structured JSON",
591
+ "capabilities": [
592
+ "content",
593
+ "documentation"
594
+ ],
595
+ "stack": [
596
+ "node",
597
+ "node-web",
598
+ "less"
599
+ ],
600
+ "paths": [
601
+ "content/posts/**",
602
+ "scripts/blog-*.js"
603
+ ],
604
+ "keywords": [
605
+ "blog",
606
+ "post",
607
+ "guide",
608
+ "article",
609
+ "seo",
610
+ "frontmatter",
611
+ "i18n",
612
+ "publish"
613
+ ],
614
+ "bytes": 16559,
615
+ "sources": [
616
+ {
617
+ "repo": "simt-blog",
618
+ "path": ".agents/skills/create-blog-guide",
619
+ "bytes": 16559,
620
+ "role": "canonical"
621
+ }
622
+ ]
623
+ },
624
+ {
625
+ "name": "create-blog-visuals",
626
+ "summary": "Create, source and validate visuals for SIMT Blog guides: hero art, inline SVG figures and photographs",
627
+ "capabilities": [
628
+ "content",
629
+ "ui-design"
630
+ ],
631
+ "stack": [
632
+ "node",
633
+ "node-web",
634
+ "less"
635
+ ],
636
+ "paths": [
637
+ "content/posts/**",
638
+ "scripts/art/**",
639
+ "scripts/figures.js"
640
+ ],
641
+ "keywords": [
642
+ "hero",
643
+ "illustration",
644
+ "figure",
645
+ "svg",
646
+ "photograph",
647
+ "visual",
648
+ "celestial"
649
+ ],
650
+ "bytes": 14773,
651
+ "sources": [
652
+ {
653
+ "repo": "simt-blog",
654
+ "path": ".agents/skills/create-blog-visuals",
655
+ "bytes": 14773,
656
+ "role": "canonical"
657
+ }
658
+ ],
659
+ "note": "Target of the blog-figures.mdc and blog-illustrations.mdc shims, which delegate rather than duplicate."
660
+ },
661
+ {
662
+ "name": "data-layer",
663
+ "summary": "Add or modify persistence and platform services: Room, DataStore, repositories, sensors",
664
+ "capabilities": [
665
+ "persistence"
666
+ ],
667
+ "stack": [
668
+ "gradle",
669
+ "kotlin"
670
+ ],
671
+ "paths": [
672
+ "**/data/**",
673
+ "**/*.kt"
674
+ ],
675
+ "keywords": [
676
+ "room",
677
+ "datastore",
678
+ "migration",
679
+ "repository",
680
+ "dao",
681
+ "entity",
682
+ "sensor",
683
+ "location"
684
+ ],
685
+ "bytes": 6461,
686
+ "sources": [
687
+ {
688
+ "repo": "simt-app",
689
+ "path": ".cursor/skills/data-layer",
690
+ "bytes": 6461,
691
+ "role": "canonical"
692
+ }
693
+ ],
694
+ "note": "Room database version 16 at the time of writing."
695
+ },
696
+ {
697
+ "name": "data-seeding",
698
+ "summary": "Seed preview or production D1 with demo activities and onboarded QA accounts",
699
+ "capabilities": [
700
+ "seeding",
701
+ "testing"
702
+ ],
703
+ "stack": [
704
+ "cloudflare-workers",
705
+ "hono",
706
+ "typescript"
707
+ ],
708
+ "paths": [
709
+ "scripts/**",
710
+ "migrations/**"
711
+ ],
712
+ "keywords": [
713
+ "seed",
714
+ "demo data",
715
+ "qa account",
716
+ "manual qa",
717
+ "preview",
718
+ "open data"
719
+ ],
720
+ "bytes": 9365,
721
+ "sources": [
722
+ {
723
+ "repo": "simt-social-api",
724
+ "path": ".agents/skills/data-seeding",
725
+ "bytes": 9365,
726
+ "role": "canonical"
727
+ }
728
+ ]
729
+ },
730
+ {
731
+ "name": "d1-safe-change",
732
+ "summary": "Create, review, test or deploy a D1 schema change safely and forward-only",
733
+ "capabilities": [
734
+ "persistence"
735
+ ],
736
+ "stack": [
737
+ "cloudflare-workers",
738
+ "hono",
739
+ "typescript"
740
+ ],
741
+ "paths": [
742
+ "migrations/**",
743
+ "wrangler.jsonc"
744
+ ],
745
+ "keywords": [
746
+ "migration",
747
+ "schema",
748
+ "index",
749
+ "trigger",
750
+ "constraint",
751
+ "idempotency",
752
+ "outbox",
753
+ "coexistence"
754
+ ],
755
+ "bytes": 3534,
756
+ "sources": [
757
+ {
758
+ "repo": "simt-social-api",
759
+ "path": ".agents/skills/d1-safe-change",
760
+ "bytes": 3534,
761
+ "role": "canonical"
762
+ }
763
+ ]
764
+ },
765
+ {
766
+ "name": "documenting-features",
767
+ "summary": "Author or update feature plans and code reviews under docs/feature-plans",
768
+ "capabilities": [
769
+ "documentation"
770
+ ],
771
+ "stack": [
772
+ "gradle",
773
+ "kotlin"
774
+ ],
775
+ "paths": [
776
+ "docs/**"
777
+ ],
778
+ "keywords": [
779
+ "docs",
780
+ "feature plan",
781
+ "code review",
782
+ "migration note",
783
+ "performance note"
784
+ ],
785
+ "bytes": 4957,
786
+ "sources": [
787
+ {
788
+ "repo": "simt-app",
789
+ "path": ".cursor/skills/documenting-features",
790
+ "bytes": 4957,
791
+ "role": "canonical"
792
+ }
793
+ ],
794
+ "note": "Carries the dual-write rule: a behaviour-changing fix updates both the plan and the review record."
795
+ },
796
+ {
797
+ "name": "durable-objects",
798
+ "summary": "Create and review Cloudflare Durable Objects: state, RPC, alarms, WebSockets",
799
+ "capabilities": [
800
+ "platform"
801
+ ],
802
+ "stack": [
803
+ "cloudflare-workers"
804
+ ],
805
+ "paths": [
806
+ "src/**"
807
+ ],
808
+ "keywords": [
809
+ "durable object",
810
+ "rpc",
811
+ "alarm",
812
+ "websocket",
813
+ "sqlite",
814
+ "sharding",
815
+ "concurrency"
816
+ ],
817
+ "bytes": 28434,
818
+ "deferred": true,
819
+ "vendored": true,
820
+ "sources": [
821
+ {
822
+ "repo": "simt-social-api",
823
+ "path": ".agents/skills/durable-objects",
824
+ "bytes": 28434,
825
+ "role": "canonical"
826
+ }
827
+ ]
828
+ },
829
+ {
830
+ "name": "firebase-auth-basics",
831
+ "summary": "Firebase Authentication setup, providers, tokens and security rules",
832
+ "capabilities": [
833
+ "auth"
834
+ ],
835
+ "stack": [
836
+ "firebase",
837
+ "node",
838
+ "node-web",
839
+ "react"
840
+ ],
841
+ "paths": [
842
+ "firebase.json",
843
+ "**/auth/**"
844
+ ],
845
+ "keywords": [
846
+ "firebase",
847
+ "auth",
848
+ "provider",
849
+ "token",
850
+ "sign in",
851
+ "security rules",
852
+ "oidc"
853
+ ],
854
+ "bytes": 13147,
855
+ "vendored": true,
856
+ "sources": [
857
+ {
858
+ "repo": "simt-social",
859
+ "path": ".agents/skills/firebase-auth-basics",
860
+ "bytes": 13147,
861
+ "role": "canonical",
862
+ "note": "Cites references/flutter_setup.md and references/client_sdk_android.md, which do not exist; its security_rules.md recommends two skills that do not exist"
863
+ }
864
+ ]
865
+ },
866
+ {
867
+ "name": "firebase-basics",
868
+ "summary": "Firebase CLI bootstrap, project selection, config files and per-agent environment setup",
869
+ "capabilities": [
870
+ "auth"
871
+ ],
872
+ "stack": [
873
+ "firebase",
874
+ "node",
875
+ "node-web",
876
+ "react"
877
+ ],
878
+ "paths": [
879
+ "firebase.json",
880
+ ".firebaserc"
881
+ ],
882
+ "keywords": [
883
+ "firebase",
884
+ "cli",
885
+ "project",
886
+ "google-services.json",
887
+ "emulator",
888
+ "init"
889
+ ],
890
+ "bytes": 35088,
891
+ "deferred": true,
892
+ "vendored": true,
893
+ "sources": [
894
+ {
895
+ "repo": "simt-social",
896
+ "path": ".agents/skills/firebase-basics",
897
+ "bytes": 35088,
898
+ "role": "canonical",
899
+ "note": "Cites references/android_setup.md, references/ios_setup.md and references/refresh/android_studio.md, none of which exist"
900
+ }
901
+ ]
902
+ },
903
+ {
904
+ "name": "gnss-engine",
905
+ "summary": "Navigate and extend the GNSS raw-measurement engine: RTCM, NTRIP, WLS, Kalman, Hatch filtering",
906
+ "capabilities": [
907
+ "positioning"
908
+ ],
909
+ "stack": [
910
+ "gradle",
911
+ "kotlin"
912
+ ],
913
+ "paths": [
914
+ "feature/gnss/**",
915
+ "**/gnss/**"
916
+ ],
917
+ "keywords": [
918
+ "gnss",
919
+ "rtk",
920
+ "ppp",
921
+ "rtcm",
922
+ "sbas",
923
+ "ntrip",
924
+ "ephemeris",
925
+ "pseudorange",
926
+ "ionosphere",
927
+ "kalman"
928
+ ],
929
+ "bytes": 7196,
930
+ "sources": [
931
+ {
932
+ "repo": "simt-app",
933
+ "path": ".cursor/skills/gnss-engine",
934
+ "bytes": 7196,
935
+ "role": "canonical"
936
+ }
937
+ ],
938
+ "note": "Physics-heavy and review-hardened; do not simplify formulas, constants or gating logic."
939
+ },
940
+ {
941
+ "name": "graphify",
942
+ "summary": "Turn any input into a queryable knowledge graph with query, path and explain tools",
943
+ "capabilities": [
944
+ "knowledge"
945
+ ],
946
+ "stack": [
947
+ "node",
948
+ "node-web",
949
+ "react",
950
+ "typescript",
951
+ "cloudflare-workers",
952
+ "hono"
953
+ ],
954
+ "paths": [
955
+ "graphify-out/**"
956
+ ],
957
+ "keywords": [
958
+ "graph",
959
+ "architecture",
960
+ "relationship",
961
+ "query",
962
+ "explain",
963
+ "god node",
964
+ "knowledge graph"
965
+ ],
966
+ "bytes": 84534,
967
+ "deferred": true,
968
+ "vendored": true,
969
+ "sources": [
970
+ {
971
+ "repo": "simt-social-api",
972
+ "path": ".agents/skills/graphify",
973
+ "bytes": 84534,
974
+ "role": "canonical",
975
+ "note": "byte-identical to the simt-social copy, version-pinned 0.9.32"
976
+ },
977
+ {
978
+ "repo": "simt-social",
979
+ "path": ".agents/skills/graphify",
980
+ "bytes": 84534,
981
+ "role": "duplicate"
982
+ }
983
+ ]
984
+ },
985
+ {
986
+ "name": "localization-accessibility",
987
+ "summary": "Implement or audit localisation, Arabic RTL, WCAG 2.2 AA, keyboard and reduced motion",
988
+ "capabilities": [
989
+ "accessibility"
990
+ ],
991
+ "stack": [
992
+ "node",
993
+ "node-web",
994
+ "react",
995
+ "react-router",
996
+ "typescript",
997
+ "less"
998
+ ],
999
+ "paths": [
1000
+ "app/i18n/**",
1001
+ "**/*.css",
1002
+ "**/*.less"
1003
+ ],
1004
+ "keywords": [
1005
+ "i18n",
1006
+ "rtl",
1007
+ "arabic",
1008
+ "wcag",
1009
+ "accessibility",
1010
+ "keyboard",
1011
+ "reduced motion",
1012
+ "locale",
1013
+ "reflow"
1014
+ ],
1015
+ "bytes": 3362,
1016
+ "sources": [
1017
+ {
1018
+ "repo": "simt-social",
1019
+ "path": ".agents/skills/localization-accessibility",
1020
+ "bytes": 3362,
1021
+ "role": "canonical"
1022
+ }
1023
+ ]
1024
+ },
1025
+ {
1026
+ "name": "maplibre-ui",
1027
+ "summary": "Build, debug and visually validate MapLibre GL JS and PMTiles behaviour",
1028
+ "capabilities": [
1029
+ "maps"
1030
+ ],
1031
+ "stack": [
1032
+ "node",
1033
+ "node-web",
1034
+ "react",
1035
+ "react-router",
1036
+ "typescript",
1037
+ "maplibre"
1038
+ ],
1039
+ "paths": [
1040
+ "app/features/map/**",
1041
+ "**/*.pmtiles"
1042
+ ],
1043
+ "keywords": [
1044
+ "maplibre",
1045
+ "pmtiles",
1046
+ "cluster",
1047
+ "viewport",
1048
+ "camera",
1049
+ "atlas",
1050
+ "map",
1051
+ "layer"
1052
+ ],
1053
+ "bytes": 3504,
1054
+ "sources": [
1055
+ {
1056
+ "repo": "simt-social",
1057
+ "path": ".agents/skills/maplibre-ui",
1058
+ "bytes": 3504,
1059
+ "role": "canonical"
1060
+ }
1061
+ ]
1062
+ },
1063
+ {
1064
+ "name": "milestone-commit",
1065
+ "summary": "Deprecated alias for slice-commit, retained so existing invocations still resolve",
1066
+ "capabilities": [
1067
+ "commit"
1068
+ ],
1069
+ "stack": [
1070
+ "node",
1071
+ "node-web",
1072
+ "react",
1073
+ "cloudflare-workers",
1074
+ "hono"
1075
+ ],
1076
+ "paths": [],
1077
+ "keywords": [
1078
+ "milestone",
1079
+ "commit",
1080
+ "deprecated",
1081
+ "alias"
1082
+ ],
1083
+ "bytes": 609,
1084
+ "aliasOf": "slice-commit",
1085
+ "sources": [
1086
+ {
1087
+ "repo": "simt-social-api",
1088
+ "path": ".agents/skills/milestone-commit",
1089
+ "bytes": 609,
1090
+ "role": "deprecated"
1091
+ },
1092
+ {
1093
+ "repo": "simt-social",
1094
+ "path": ".agents/skills/milestone-commit",
1095
+ "bytes": 603,
1096
+ "role": "deprecated"
1097
+ }
1098
+ ]
1099
+ },
1100
+ {
1101
+ "name": "observability-review",
1102
+ "summary": "Typed structured logs, metrics, traces, SLOs, alerts and privacy redaction",
1103
+ "capabilities": [
1104
+ "observability",
1105
+ "release"
1106
+ ],
1107
+ "stack": [
1108
+ "cloudflare-workers",
1109
+ "hono",
1110
+ "typescript"
1111
+ ],
1112
+ "paths": [
1113
+ "src/**"
1114
+ ],
1115
+ "keywords": [
1116
+ "log",
1117
+ "metric",
1118
+ "trace",
1119
+ "slo",
1120
+ "alert",
1121
+ "dashboard",
1122
+ "runbook",
1123
+ "correlation",
1124
+ "cardinality",
1125
+ "redaction"
1126
+ ],
1127
+ "bytes": 4909,
1128
+ "sources": [
1129
+ {
1130
+ "repo": "simt-social-api",
1131
+ "path": ".agents/skills/observability-review",
1132
+ "bytes": 4909,
1133
+ "role": "canonical"
1134
+ }
1135
+ ]
1136
+ },
1137
+ {
1138
+ "name": "parallel-feature-team",
1139
+ "summary": "Coordinate product, frontend, backend, test, security, compliance, design and docs agents for one requirement",
1140
+ "capabilities": [
1141
+ "orchestration"
1142
+ ],
1143
+ "stack": [
1144
+ "node",
1145
+ "node-web",
1146
+ "react",
1147
+ "typescript",
1148
+ "cloudflare-workers",
1149
+ "hono"
1150
+ ],
1151
+ "paths": [
1152
+ ".github/prompts/**"
1153
+ ],
1154
+ "keywords": [
1155
+ "parallel",
1156
+ "subagent",
1157
+ "coordinate",
1158
+ "team",
1159
+ "one writer per file",
1160
+ "minimum viable team"
1161
+ ],
1162
+ "bytes": 1131,
1163
+ "requires": [
1164
+ "slice-commit"
1165
+ ],
1166
+ "sources": [
1167
+ {
1168
+ "repo": "simt-social",
1169
+ "path": ".agents/skills/parallel-feature-team",
1170
+ "bytes": 1131,
1171
+ "role": "canonical",
1172
+ "note": "4-line drift from the API copy; the API copy hardcodes a cross-repo path to this one"
1173
+ },
1174
+ {
1175
+ "repo": "simt-social-api",
1176
+ "path": ".agents/skills/parallel-feature-team",
1177
+ "bytes": 1127,
1178
+ "role": "duplicate"
1179
+ }
1180
+ ]
1181
+ },
1182
+ {
1183
+ "name": "postflight-preview-check",
1184
+ "summary": "Run preview-only authenticated postflight after a slice commit and close release evidence",
1185
+ "capabilities": [
1186
+ "release",
1187
+ "testing"
1188
+ ],
1189
+ "stack": [
1190
+ "node",
1191
+ "node-web",
1192
+ "react",
1193
+ "typescript",
1194
+ "cloudflare-workers",
1195
+ "hono"
1196
+ ],
1197
+ "paths": [
1198
+ "wrangler.jsonc",
1199
+ "docs/runbooks/**"
1200
+ ],
1201
+ "keywords": [
1202
+ "postflight",
1203
+ "preview",
1204
+ "authenticated",
1205
+ "evidence",
1206
+ "workers builds",
1207
+ "api shield",
1208
+ "migration proof"
1209
+ ],
1210
+ "bytes": 12984,
1211
+ "variants": [
1212
+ {
1213
+ "id": "api",
1214
+ "stack": [
1215
+ "hono"
1216
+ ],
1217
+ "bytes": 12984
1218
+ },
1219
+ {
1220
+ "id": "web",
1221
+ "stack": [
1222
+ "react",
1223
+ "node-web"
1224
+ ],
1225
+ "bytes": 6606
1226
+ }
1227
+ ],
1228
+ "sources": [
1229
+ {
1230
+ "repo": "simt-social-api",
1231
+ "path": ".agents/skills/postflight-preview-check",
1232
+ "bytes": 12984,
1233
+ "role": "canonical",
1234
+ "note": "262 drifted lines; adds API Shield publishing and a production-domain denylist covering media.simt.social and goto.simt.app that the web copy lacks"
1235
+ },
1236
+ {
1237
+ "repo": "simt-social",
1238
+ "path": ".agents/skills/postflight-preview-check",
1239
+ "bytes": 6606,
1240
+ "role": "variant"
1241
+ }
1242
+ ]
1243
+ },
1244
+ {
1245
+ "name": "production-quality-review",
1246
+ "summary": "Cross-discipline release gate for browser-sensitive, visual and performance slices",
1247
+ "capabilities": [
1248
+ "quality",
1249
+ "accessibility",
1250
+ "observability"
1251
+ ],
1252
+ "stack": [
1253
+ "node",
1254
+ "node-web",
1255
+ "react",
1256
+ "react-router",
1257
+ "typescript"
1258
+ ],
1259
+ "paths": [
1260
+ "app/**"
1261
+ ],
1262
+ "keywords": [
1263
+ "core web vitals",
1264
+ "budget",
1265
+ "cross-engine",
1266
+ "release readiness",
1267
+ "blocker",
1268
+ "lighthouse"
1269
+ ],
1270
+ "bytes": 5904,
1271
+ "sources": [
1272
+ {
1273
+ "repo": "simt-social",
1274
+ "path": ".agents/skills/production-quality-review",
1275
+ "bytes": 5904,
1276
+ "role": "canonical",
1277
+ "note": "Holds the browser matrix and the performance budget itself, so there is no separate performance skill for another to defer to"
1278
+ }
1279
+ ]
1280
+ },
1281
+ {
1282
+ "name": "prototype-ui-fidelity",
1283
+ "summary": "Implement or review every UI change against the interactive prototype and Cosmos tokens",
1284
+ "capabilities": [
1285
+ "ui-design",
1286
+ "accessibility"
1287
+ ],
1288
+ "stack": [
1289
+ "node",
1290
+ "node-web",
1291
+ "react",
1292
+ "react-router",
1293
+ "typescript",
1294
+ "less"
1295
+ ],
1296
+ "paths": [
1297
+ "app/**",
1298
+ "mockups/**"
1299
+ ],
1300
+ "keywords": [
1301
+ "mockup",
1302
+ "prototype",
1303
+ "cosmos",
1304
+ "design token",
1305
+ "fidelity",
1306
+ "visual",
1307
+ "composition"
1308
+ ],
1309
+ "bytes": 20581,
1310
+ "deferred": true,
1311
+ "sources": [
1312
+ {
1313
+ "repo": "simt-social",
1314
+ "path": ".agents/skills/prototype-ui-fidelity",
1315
+ "bytes": 20581,
1316
+ "role": "canonical",
1317
+ "note": "carries a 14 KB references/cosmos-design-system.md"
1318
+ }
1319
+ ]
1320
+ },
1321
+ {
1322
+ "name": "slice-commit",
1323
+ "summary": "Validate and commit a completed implementation slice, updating the active feature plan tracker",
1324
+ "capabilities": [
1325
+ "commit"
1326
+ ],
1327
+ "stack": [
1328
+ "node",
1329
+ "node-web",
1330
+ "react",
1331
+ "react-router",
1332
+ "typescript",
1333
+ "cloudflare-workers",
1334
+ "hono"
1335
+ ],
1336
+ "paths": [],
1337
+ "keywords": [
1338
+ "slice",
1339
+ "commit",
1340
+ "conventional commit",
1341
+ "tracker",
1342
+ "sha",
1343
+ "do not push"
1344
+ ],
1345
+ "bytes": 5048,
1346
+ "variants": [
1347
+ {
1348
+ "id": "web",
1349
+ "stack": [
1350
+ "react",
1351
+ "node-web"
1352
+ ],
1353
+ "bytes": 5048
1354
+ },
1355
+ {
1356
+ "id": "api",
1357
+ "stack": [
1358
+ "hono"
1359
+ ],
1360
+ "bytes": 4866
1361
+ }
1362
+ ],
1363
+ "requires": [
1364
+ "complete-testing"
1365
+ ],
1366
+ "sources": [
1367
+ {
1368
+ "repo": "simt-social",
1369
+ "path": ".agents/skills/slice-commit",
1370
+ "bytes": 5048,
1371
+ "role": "canonical"
1372
+ },
1373
+ {
1374
+ "repo": "simt-social-api",
1375
+ "path": ".agents/skills/slice-commit",
1376
+ "bytes": 4866,
1377
+ "role": "variant",
1378
+ "note": "87 drifted lines; adds the rule that an executable slice is never pushed without a passing build in the slice packet"
1379
+ }
1380
+ ]
1381
+ },
1382
+ {
1383
+ "name": "update-press-kit",
1384
+ "summary": "Update, validate and package the SIMT press kit and media assets",
1385
+ "capabilities": [
1386
+ "content"
1387
+ ],
1388
+ "stack": [
1389
+ "node",
1390
+ "node-web",
1391
+ "less"
1392
+ ],
1393
+ "paths": [
1394
+ "public/**",
1395
+ "content/**"
1396
+ ],
1397
+ "keywords": [
1398
+ "press",
1399
+ "press kit",
1400
+ "boilerplate",
1401
+ "media asset",
1402
+ "logo",
1403
+ "fact sheet"
1404
+ ],
1405
+ "bytes": 20555,
1406
+ "deferred": true,
1407
+ "sources": [
1408
+ {
1409
+ "repo": "simt-landing",
1410
+ "path": ".agents/skills/update-press-kit",
1411
+ "bytes": 20555,
1412
+ "role": "canonical"
1413
+ }
1414
+ ]
1415
+ },
1416
+ {
1417
+ "name": "wear-data-sync",
1418
+ "summary": "Work on the Wear OS app and phone-watch Data Layer communication",
1419
+ "capabilities": [
1420
+ "wear",
1421
+ "persistence"
1422
+ ],
1423
+ "stack": [
1424
+ "gradle",
1425
+ "kotlin",
1426
+ "wear-os"
1427
+ ],
1428
+ "paths": [
1429
+ "wear/**",
1430
+ "data/wear/**"
1431
+ ],
1432
+ "keywords": [
1433
+ "wear",
1434
+ "watch",
1435
+ "data layer",
1436
+ "horologist",
1437
+ "target sync",
1438
+ "applicationid"
1439
+ ],
1440
+ "bytes": 3538,
1441
+ "sources": [
1442
+ {
1443
+ "repo": "simt-app",
1444
+ "path": ".cursor/skills/wear-data-sync",
1445
+ "bytes": 3538,
1446
+ "role": "canonical"
1447
+ }
1448
+ ],
1449
+ "note": "applicationId must stay \"app.simt\" or the Data Layer silently stops delivering; wear targets SDK 36 while the phone targets 37."
1450
+ },
1451
+ {
1452
+ "name": "web-feature-slice",
1453
+ "summary": "Implement or review a Social web route or screen slice consuming the generated contract",
1454
+ "capabilities": [
1455
+ "feature-slice",
1456
+ "accessibility",
1457
+ "contract"
1458
+ ],
1459
+ "stack": [
1460
+ "node",
1461
+ "node-web",
1462
+ "react",
1463
+ "react-router",
1464
+ "typescript"
1465
+ ],
1466
+ "paths": [
1467
+ "app/features/**",
1468
+ "app/routes/**"
1469
+ ],
1470
+ "keywords": [
1471
+ "route",
1472
+ "react",
1473
+ "tanstack",
1474
+ "rsvp",
1475
+ "profile",
1476
+ "form",
1477
+ "screen",
1478
+ "locale"
1479
+ ],
1480
+ "bytes": 4844,
1481
+ "variantOf": "feature-slice",
1482
+ "sources": [
1483
+ {
1484
+ "repo": "simt-social",
1485
+ "path": ".agents/skills/web-feature-slice",
1486
+ "bytes": 4844,
1487
+ "role": "canonical"
1488
+ }
1489
+ ]
1490
+ },
1491
+ {
1492
+ "name": "web-security-review",
1493
+ "summary": "Review browser security: session, onboarding privacy, CSP, storage, media blobs, admin UI",
1494
+ "capabilities": [
1495
+ "security"
1496
+ ],
1497
+ "stack": [
1498
+ "node",
1499
+ "node-web",
1500
+ "react",
1501
+ "react-router",
1502
+ "typescript"
1503
+ ],
1504
+ "paths": [
1505
+ "app/**"
1506
+ ],
1507
+ "keywords": [
1508
+ "csp",
1509
+ "xss",
1510
+ "storage",
1511
+ "cache",
1512
+ "logout",
1513
+ "blob url",
1514
+ "rtl spoofing",
1515
+ "analytics",
1516
+ "admin"
1517
+ ],
1518
+ "bytes": 4622,
1519
+ "variantOf": "security-review",
1520
+ "sources": [
1521
+ {
1522
+ "repo": "simt-social",
1523
+ "path": ".agents/skills/web-security-review",
1524
+ "bytes": 4622,
1525
+ "role": "canonical"
1526
+ }
1527
+ ]
1528
+ },
1529
+ {
1530
+ "name": "workers-best-practices",
1531
+ "summary": "Review and author Cloudflare Workers code against production best practices",
1532
+ "capabilities": [
1533
+ "platform",
1534
+ "quality"
1535
+ ],
1536
+ "stack": [
1537
+ "cloudflare-workers"
1538
+ ],
1539
+ "paths": [
1540
+ "src/**",
1541
+ "wrangler.jsonc"
1542
+ ],
1543
+ "keywords": [
1544
+ "worker",
1545
+ "anti-pattern",
1546
+ "floating promise",
1547
+ "global state",
1548
+ "secret",
1549
+ "binding",
1550
+ "stream"
1551
+ ],
1552
+ "bytes": 31720,
1553
+ "deferred": true,
1554
+ "vendored": true,
1555
+ "sources": [
1556
+ {
1557
+ "repo": "simt-social-api",
1558
+ "path": ".agents/skills/workers-best-practices",
1559
+ "bytes": 31720,
1560
+ "role": "canonical"
1561
+ }
1562
+ ]
1563
+ },
1564
+ {
1565
+ "name": "wrangler",
1566
+ "summary": "Wrangler CLI reference for Workers, KV, R2, D1, Queues, Durable Objects and secrets",
1567
+ "capabilities": [
1568
+ "platform",
1569
+ "release"
1570
+ ],
1571
+ "stack": [
1572
+ "cloudflare-workers"
1573
+ ],
1574
+ "paths": [
1575
+ "wrangler.jsonc",
1576
+ "package.json"
1577
+ ],
1578
+ "keywords": [
1579
+ "wrangler",
1580
+ "cli",
1581
+ "deploy",
1582
+ "d1 migrations apply",
1583
+ "secret",
1584
+ "kv",
1585
+ "r2",
1586
+ "queue"
1587
+ ],
1588
+ "bytes": 18359,
1589
+ "vendored": true,
1590
+ "sources": [
1591
+ {
1592
+ "repo": "simt-social-api",
1593
+ "path": ".agents/skills/wrangler",
1594
+ "bytes": 18359,
1595
+ "role": "canonical"
1596
+ }
1597
+ ]
1598
+ }
1599
+ ],
1600
+ "siblingGroups": [
1601
+ {
1602
+ "name": "feature-slice",
1603
+ "capability": "feature-slice",
1604
+ "discriminator": "stack",
1605
+ "members": [
1606
+ "api-feature-slice",
1607
+ "web-feature-slice"
1608
+ ],
1609
+ "note": "Phase 6 may collapse both nodes into one security-review-style node named feature-slice with two variants. Kept as two named nodes until that content migration happens."
1610
+ },
1611
+ {
1612
+ "name": "security-review",
1613
+ "capability": "security",
1614
+ "discriminator": "stack",
1615
+ "members": [
1616
+ "api-security-review",
1617
+ "web-security-review"
1618
+ ],
1619
+ "note": "Owned across both repos by the principal-cyber-security-engineer agent."
1620
+ }
1621
+ ]
1622
+ }