gcf-aif-ext 0.2.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 (294) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/commands/gcf.js +173 -0
  4. package/extension.json +24 -0
  5. package/hooks/pre-commit.js +91 -0
  6. package/injections/commit-status.md +6 -0
  7. package/injections/plan-context.md +8 -0
  8. package/injections/review-pillars.md +7 -0
  9. package/lib/anchors.js +109 -0
  10. package/lib/audit-core.js +102 -0
  11. package/lib/context.js +77 -0
  12. package/lib/frontmatter.js +26 -0
  13. package/lib/gcf-paths.js +60 -0
  14. package/lib/git.js +19 -0
  15. package/lib/id.js +42 -0
  16. package/lib/index-gen.js +51 -0
  17. package/lib/linter.js +61 -0
  18. package/lib/playtest-list.js +13 -0
  19. package/lib/safe-path.js +71 -0
  20. package/lib/transitions.js +30 -0
  21. package/lib/validate-card.js +48 -0
  22. package/lib/verdict-fs.js +126 -0
  23. package/node_modules/cnlp-kit/CHANGELOG.md +625 -0
  24. package/node_modules/cnlp-kit/LICENSE +21 -0
  25. package/node_modules/cnlp-kit/README.md +242 -0
  26. package/node_modules/cnlp-kit/bin/cnlp.js +334 -0
  27. package/node_modules/cnlp-kit/cnlp-format.md +470 -0
  28. package/node_modules/cnlp-kit/package.json +40 -0
  29. package/node_modules/cnlp-kit/profiles/adr.md +129 -0
  30. package/node_modules/cnlp-kit/profiles/api.md +87 -0
  31. package/node_modules/cnlp-kit/profiles/concept.md +70 -0
  32. package/node_modules/cnlp-kit/profiles/docset.md +103 -0
  33. package/node_modules/cnlp-kit/profiles/guide.md +51 -0
  34. package/node_modules/cnlp-kit/profiles/profile.md +69 -0
  35. package/node_modules/cnlp-kit/profiles/reference.md +61 -0
  36. package/node_modules/cnlp-kit/profiles/skill.md +75 -0
  37. package/node_modules/cnlp-kit/profiles/task.md +65 -0
  38. package/node_modules/cnlp-kit/quality-rules.md +69 -0
  39. package/node_modules/cnlp-kit/skills/cnlp-docset/SKILL.md +73 -0
  40. package/node_modules/cnlp-kit/skills/cnlp-migrate/SKILL.md +64 -0
  41. package/node_modules/cnlp-kit/src/cnlp.js +534 -0
  42. package/node_modules/cnlp-kit/src/config.js +352 -0
  43. package/node_modules/yaml/LICENSE +13 -0
  44. package/node_modules/yaml/README.md +172 -0
  45. package/node_modules/yaml/bin.mjs +11 -0
  46. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  47. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  48. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  49. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  50. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  51. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  52. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  53. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  54. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  55. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  56. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +226 -0
  57. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  58. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  59. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  60. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  61. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  62. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  63. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  64. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  65. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  66. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  67. package/node_modules/yaml/browser/dist/errors.js +57 -0
  68. package/node_modules/yaml/browser/dist/index.js +17 -0
  69. package/node_modules/yaml/browser/dist/log.js +11 -0
  70. package/node_modules/yaml/browser/dist/nodes/Alias.js +118 -0
  71. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  72. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  73. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  74. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  75. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  76. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  77. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  78. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  79. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  80. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  81. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  82. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  83. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  84. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  85. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  86. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  87. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  88. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  89. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  90. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  91. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  92. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  93. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  94. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  95. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  96. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  97. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  98. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  99. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  100. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  101. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  102. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  103. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  104. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  105. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  106. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  107. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  108. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  109. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  110. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  111. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  112. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  113. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  114. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  115. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  116. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  117. package/node_modules/yaml/browser/dist/util.js +11 -0
  118. package/node_modules/yaml/browser/dist/visit.js +233 -0
  119. package/node_modules/yaml/browser/index.js +5 -0
  120. package/node_modules/yaml/browser/package.json +3 -0
  121. package/node_modules/yaml/dist/cli.d.ts +8 -0
  122. package/node_modules/yaml/dist/cli.mjs +201 -0
  123. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  124. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  125. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  126. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  127. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  128. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  129. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  130. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  131. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  132. package/node_modules/yaml/dist/compose/composer.js +224 -0
  133. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  134. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  135. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  136. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  137. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  138. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  139. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  140. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  141. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  142. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  143. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  144. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +228 -0
  145. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  146. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  147. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  148. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  149. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  150. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  151. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  152. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  153. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  154. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  155. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  156. package/node_modules/yaml/dist/doc/Document.js +337 -0
  157. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  158. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  159. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  160. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  161. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  162. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  163. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  164. package/node_modules/yaml/dist/doc/directives.js +178 -0
  165. package/node_modules/yaml/dist/errors.d.ts +21 -0
  166. package/node_modules/yaml/dist/errors.js +62 -0
  167. package/node_modules/yaml/dist/index.d.ts +25 -0
  168. package/node_modules/yaml/dist/index.js +50 -0
  169. package/node_modules/yaml/dist/log.d.ts +3 -0
  170. package/node_modules/yaml/dist/log.js +19 -0
  171. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  172. package/node_modules/yaml/dist/nodes/Alias.js +120 -0
  173. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  174. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  175. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  176. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  177. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  178. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  179. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  180. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  181. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  182. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  183. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  184. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  185. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  186. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  187. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  188. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  189. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  190. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  191. package/node_modules/yaml/dist/options.d.ts +350 -0
  192. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  193. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  194. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  195. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  196. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  197. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  198. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  199. package/node_modules/yaml/dist/parse/cst.js +112 -0
  200. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  201. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  202. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  203. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  204. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  205. package/node_modules/yaml/dist/parse/parser.js +980 -0
  206. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  207. package/node_modules/yaml/dist/public-api.js +107 -0
  208. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  209. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  210. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  211. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  212. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  213. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  214. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  215. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  216. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  217. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  218. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  219. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  220. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  221. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  222. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  223. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  224. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  225. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  226. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  227. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  228. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  229. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  230. package/node_modules/yaml/dist/schema/tags.js +99 -0
  231. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  232. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  233. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  234. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  235. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  236. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  237. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  238. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  239. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  240. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  241. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  242. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  243. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  244. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  245. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  246. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  247. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  248. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  249. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  250. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  251. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  252. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  253. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  254. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  255. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  256. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  257. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  258. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  259. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  260. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  261. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  262. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  263. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  264. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  265. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  266. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  267. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  268. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  269. package/node_modules/yaml/dist/test-events.js +134 -0
  270. package/node_modules/yaml/dist/util.d.ts +16 -0
  271. package/node_modules/yaml/dist/util.js +28 -0
  272. package/node_modules/yaml/dist/visit.d.ts +102 -0
  273. package/node_modules/yaml/dist/visit.js +236 -0
  274. package/node_modules/yaml/package.json +97 -0
  275. package/node_modules/yaml/util.js +2 -0
  276. package/package.json +54 -0
  277. package/profiles/card.md +65 -0
  278. package/profiles/pillars.md +31 -0
  279. package/profiles/system.md +56 -0
  280. package/schemas/card.schema.json +30 -0
  281. package/skills/gcf-adopt/SKILL.md +41 -0
  282. package/skills/gcf-audit/SKILL.md +27 -0
  283. package/skills/gcf-card/SKILL.md +35 -0
  284. package/skills/gcf-debate/SKILL.md +33 -0
  285. package/skills/gcf-ingest/SKILL.md +38 -0
  286. package/skills/gcf-init/SKILL.md +32 -0
  287. package/skills/gcf-verdict/SKILL.md +32 -0
  288. package/skills/gcf-vision/SKILL.md +33 -0
  289. package/templates/PILLARS.md +8 -0
  290. package/templates/backlog.md +4 -0
  291. package/templates/card.md +34 -0
  292. package/templates/cnlp.config.json +8 -0
  293. package/templates/config.yml +8 -0
  294. package/templates/system.md +22 -0
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: gcf-card
3
+ description: Materialize a GCF card from a backlog candidate or a fresh idea - slots, hard/soft routing, depends. Use when work starts on a feature or the user says "заведи карточку".
4
+ ---
5
+
6
+ mode: authoring
7
+
8
+ purpose:
9
+ - turn a backlog candidate or a fresh idea into a card file with the six slots filled
10
+
11
+ inputs:
12
+ - a cand-NNN id from `gcf/backlog.md`, or a free-text feature idea
13
+
14
+ preconditions:
15
+ - `gcf/` exists; `gcf/INDEX.md` lists the current subsystems
16
+
17
+ forbidden_behaviors:
18
+ - do not invent a new subsystem name when INDEX carries a synonym: reuse or ask (GCF-PRD §5.4)
19
+ - do not write numbers outside the feel slot envelopes
20
+ - do not put `until:` in the frontmatter: it is a line annotation inside slots
21
+ - do not fill a slot with a guess: an unknown goes to `gcf/open-questions.md`, marked D1 or D2
22
+
23
+ workflow:
24
+ 1. read `gcf/INDEX.md`; for a cand-NNN input read its backlog line, otherwise ask "into work now, or park in the backlog?" and on "park" append a candidate line and stop
25
+ 2. route the requirement: ask "can an autotest accept this without a human playing?"; yes = hard, no or mixed = soft; state the route in one line and let the human veto
26
+ 3. for a pure hard route: send the requirement to the normal AIF cycle, add any lasting prohibition to the subsystem's constraints, and stop - no card (GCF-PRD §6.3)
27
+ 4. copy `templates/card.md` to `gcf/cards/<card-id>-<slug>.md`: the id keeps the candidate number, or takes the next free number for a fresh idea
28
+ 5. fill the frontmatter: status proposed, route, system list from the INDEX vocabulary, depends from cards this feature builds on, source, created
29
+ 6. fill the six slots with the human: behavior, contract, feel (comparison + envelopes), interactions, constraints, miss_criterion
30
+ 7. when the card came from a candidate, delete that candidate line from `gcf/backlog.md`
31
+ 8. run `ai-factory gcf index`, then `npx cnlp check`, and fix what they report
32
+ 9. report the card path and the one question the playtest will answer
33
+
34
+ invocation:
35
+ - run when work starts on a feature or the user names a candidate to materialize
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: gcf-debate
3
+ description: The debate table - expert lenses stress a GDD for gaps, contradictions and unbuildable specs before import. Use when the user asks to review a GDD, check design coherence, or says "стол дебатов".
4
+ ---
5
+
6
+ mode: review board
7
+
8
+ purpose:
9
+ - stress a GDD through the GCF lenses and report the gaps the designer did not write down
10
+
11
+ inputs:
12
+ - a path to the GDD (markdown); optionally the names of lenses to run, default is all
13
+
14
+ preconditions:
15
+ - the file exists and is readable markdown
16
+
17
+ forbidden_behaviors:
18
+ - do not edit the document without the human's explicit go-ahead per edit
19
+ - do not resolve a principal fork yourself: a fork goes to the human as a D1 question with a proposed default
20
+ - do not review style or prose quality: the table checks buildability and coherence only
21
+
22
+ workflow:
23
+ 1. run `ai-factory gcf anchor <file>` and use the printed anchors in every finding
24
+ 2. play each completeness lens as its own expert over each mechanic: state, input, feedback, refusal, boundaries, persistence (GCF-PRD §11.4)
25
+ 3. play the coherence lenses over the whole document: interaction matrix (which mechanics write the same state), loop closure, progression pressure, economy balance, one-word-per-concept dictionary
26
+ 4. cross-examine: for each pair of findings that touch one anchor, check whether they contradict each other and merge or escalate
27
+ 5. classify each finding: D2 gets a proposed default the human can skim; D1 is a principal fork and carries the question, the anchors and a proposed answer
28
+ 6. report by lens, ordered by damage: contradictions first, then holes, then dictionary drift; cite anchors, quote lines <= 15 words
29
+ 7. when `gcf/` exists, append D1 and D2 records to `gcf/open-questions.md`; otherwise put them into the report only
30
+ 8. offer the fixes: apply agreed edits to the document one by one, each on its own go-ahead
31
+
32
+ invocation:
33
+ - run on a fresh GDD before ingest, after a big GDD revision, or on demand
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: gcf-ingest
3
+ description: Import a GDD into GCF - anchors, candidate backlog, pillar candidates, gap questions; re-import classifies the delta. Use when the user brings a GDD or says "импортируй GDD".
4
+ ---
5
+
6
+ mode: import
7
+
8
+ purpose:
9
+ - cut a GDD into inert backlog candidates and a short list of questions, without putting anyone "into work"
10
+
11
+ inputs:
12
+ - a path to the GDD (markdown)
13
+
14
+ preconditions:
15
+ - `gcf/` exists (run gcf-init first)
16
+ - the sequential pass below is the correctness reference; the parallel fan-out belongs to the harness
17
+
18
+ forbidden_behaviors:
19
+ - do not create card files: candidates are backlog lines, a card materializes only at pull (GCF-PRD §5.2)
20
+ - do not write a pillar into PILLARS.md: pillar candidates go to open-questions as D1
21
+ - do not put an extracted unit into the backlog without a verbatim quote from its section: no quote means source inferred, and inferred goes to open-questions
22
+ - do not read `gcf/source/` files whole after anchoring: address sections by anchor
23
+
24
+ workflow:
25
+ 1. run `ai-factory gcf anchor <file>`; on a re-import read the printed delta and jump to step 9
26
+ 2. extract per aspect, one pass each, citing a quote and an anchor per unit: pillar candidates; subsystems (nouns); feature candidates (player verbs); numbers and progressions; platform and audience constraints
27
+ 3. verify provenance: a unit whose quote is not found verbatim in its section becomes `inferred` and moves to the question list
28
+ 4. turn each exact number into an envelope: value ± the `envelope_default_spread` from `gcf/config.yml`, marked assumed, listed for the human's skim
29
+ 5. run the completeness lenses per candidate and write gaps into the candidate line as `gaps:` notes - questions at import time go only to document-level findings
30
+ 6. run the coherence lenses over the whole set; build the interaction matrix and record `deps:` between candidates from it
31
+ 7. write the outputs: candidate lines into `gcf/backlog.md` (route guessed per GCF-PRD §6, human vetoes later); D1 and D2 records into `gcf/open-questions.md`; then run `ai-factory gcf index`
32
+ 8. mark a candidate whose nouns match the `purpose` or the `code` paths of an existing systems doc with `impl?` in its backlog line: on an adopted codebase the mechanic may already ship, and the human is the one who deletes the line
33
+ 9. on a re-import, apply the delta classes (GCF-PRD §11.6): added -> new candidates; changed -> mark `src-changed`, and D1 when an open card or a collapsed system cites the anchor; removed -> orphan marks; renamed -> update anchors in place
34
+ 10. report the package, ordered: D1 questions (the main product), pillar candidates, dictionary conflicts, backlog summary with the top crossing candidates, D2 assumptions
35
+ 11. state the next step: answer D1s, confirm pillars, then pull the first candidate with `/gcf-card`
36
+
37
+ invocation:
38
+ - run when a GDD arrives or changes
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: gcf-init
3
+ description: Bootstrap the gcf/ documentary layer - skeleton, pillars interview, hooks reminder. Use when a game project adopts GCF or when the user says "set up gcf".
4
+ ---
5
+
6
+ mode: bootstrap
7
+
8
+ purpose:
9
+ - create the gcf/ documentary layer and draft PILLARS.md from a short interview with the human
10
+
11
+ inputs:
12
+ - none: the skill discovers project state from the working directory and asks the human for the rest
13
+
14
+ preconditions:
15
+ - the project is a git repository with AI Factory initialized
16
+
17
+ forbidden_behaviors:
18
+ - do not overwrite an existing gcf/ tree: re-running repairs missing files only
19
+ - do not write pillars the human did not confirm: pillar authorship is human (GCF-PRD §5.3)
20
+ - pillar count <= 7, and do not pad the list to reach 7
21
+
22
+ workflow:
23
+ 1. run `ai-factory gcf init` and report which files it created
24
+ 2. read `gcf/PILLARS.md`; when it still holds template content, start the interview
25
+ 3. ask the human for the game's core promise, then for 2..7 pillars: each needs a statement, a negative invariant and a review question
26
+ 4. rewrite `gcf/PILLARS.md` with the confirmed pillars in the pillars record-list form
27
+ 5. run `npx cnlp check` and fix form issues it reports
28
+ 6. ask the human to run `ai-factory gcf hooks-install`: the commit gate is theirs to arm
29
+ 7. state the next step: fill `gcf/backlog.md` with candidates by hand or import a GDD
30
+
31
+ invocation:
32
+ - run when the user asks to set up gcf in a project
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: gcf-verdict
3
+ description: Record the human playtest verdict on a built card - keep, tune or kill - and run the collapse. Use after a playtest or when the user says "вердикт".
4
+ ---
5
+
6
+ mode: human gate
7
+
8
+ purpose:
9
+ - record the human verdict and run the one operation that collapses a card into subsystem state
10
+
11
+ inputs:
12
+ - a card-NNN id and a verdict word: keep, tune or kill; or nothing, which means "print the playtest list"
13
+
14
+ preconditions:
15
+ - the card sits in status `built`; the human has played the build
16
+
17
+ forbidden_behaviors:
18
+ - do not decide the verdict: the human with hands on the controls decides, this skill records
19
+ - do not run `keep` when the human has not answered the card's miss_criterion question
20
+ - do not edit systems docs by hand: `ai-factory gcf verdict` owns the collapse
21
+
22
+ workflow:
23
+ 1. with no arguments: run `ai-factory gcf playtest` and stop - that list is the session's playtest sheet
24
+ 2. read the card; ask the human the miss_criterion question and record the answer in one line
25
+ 3. for `tune` at tune_count 3: refuse and present the fork - kill, or redesign the envelope and reset the counter with a note (GCF-PRD §7.2)
26
+ 4. for `keep`: rewrite the behavior slot into 1 line per observable behavior and strip contract lines down to paths and entry points - the collapse copies lines verbatim, so compress them in the card first
27
+ 5. run `ai-factory gcf verdict <card-id> <verdict> --note "<answer or reason>"`
28
+ 6. for `keep` on a card touching 2 or more subsystems: read each updated systems doc and report a contradiction between constraints as a D1 question instead of finishing silently
29
+ 7. report the verdict commit hash: `git revert <hash>` is the undo
30
+
31
+ invocation:
32
+ - run after a playtest, or with no arguments to print the playtest sheet
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: gcf-vision
3
+ description: Project-start wizard - guided questions that turn a raw game idea into a first GDD draft ready for gcf-ingest. Use when there is no project yet or the user says "начнем игру" / "start a game".
4
+ ---
5
+
6
+ mode: wizard
7
+
8
+ purpose:
9
+ - turn a raw idea into a first GDD draft through a guided interview, so the standard ingest flow has an input
10
+
11
+ inputs:
12
+ - none: the skill discovers everything by asking the human
13
+
14
+ preconditions:
15
+ - no GDD exists yet; when one exists, route to gcf-debate or gcf-ingest instead
16
+
17
+ forbidden_behaviors:
18
+ - do not write into `gcf/`: the draft is the designer's document, ingest brings it into gcf later
19
+ - do not fill an answer the human skipped: write the gap into the draft as an open question
20
+ - questions per message <= 2: a wall of questions kills the interview
21
+
22
+ workflow:
23
+ 1. ask about the core: genre, the one-sentence fantasy, and the reference games with "like X, not like Y"
24
+ 2. ask about the loop: what the player does each 30 seconds, each session, each week
25
+ 3. ask about scope: platform, session length, solo or multiplayer, art constraints, team size
26
+ 4. ask what the game is NOT: negative answers seed the pillars and cost the least
27
+ 5. draft the GDD as plain markdown with one `##` heading per topic: vision, pillars-candidates, core loop, mechanics, progression, scope, open questions
28
+ 6. write every unanswered or invented point into the `## open questions` section, marked as a guess
29
+ 7. present the draft, iterate on the human's corrections, and save where the human names
30
+ 8. state the next step: `/gcf-debate <file>` to stress the draft, or `/gcf-ingest <file>` to import it
31
+
32
+ invocation:
33
+ - run at project start, before any gcf structure exists
@@ -0,0 +1,8 @@
1
+ pillars:
2
+ - statement: every encounter is readable at a glance
3
+ invariant: no effect ever hides the player character
4
+ review_question: does this change add visual noise over the player
5
+
6
+ - statement: death is the player's fault, never the camera's
7
+ invariant: no off-screen damage sources
8
+ review_question: can this change hurt the player from outside the view
@@ -0,0 +1,4 @@
1
+ # Backlog — candidates, one line each. Order = priority, owned by the human.
2
+ # Format: - <cand-id> | <name> | route: soft|hard | sys: <system> | deps: <ids or -> | src: <GDD#id|manual> | <one-line description>
3
+
4
+ - cand-001 | example move | route: soft | sys: example-system | deps: - | src: manual | the move this template illustrates
@@ -0,0 +1,34 @@
1
+ ---
2
+ schema: 1
3
+ id: card-000
4
+ slug: example
5
+ status: proposed
6
+ route: soft
7
+ system: [example-system]
8
+ depends: []
9
+ source: manual
10
+ tune_count: 0
11
+ built_at: null
12
+ created: "2026-01-01"
13
+ ---
14
+
15
+ behavior:
16
+ - player presses X -> the character does Y -> the screen shows Z
17
+
18
+ contract:
19
+ - new components and systems live under Assets/Scripts/Example/
20
+ - data flows from input to simulation, never backwards
21
+
22
+ feel:
23
+ - like Hades, not like Celeste
24
+ - duration 0.15..0.25 s
25
+ - cooldown 0.4..0.8 s
26
+
27
+ interactions:
28
+ - none: this example crosses no existing mechanic
29
+
30
+ constraints:
31
+ - do not add a new input binding
32
+ - no per-frame allocations
33
+
34
+ miss_criterion: does the move feel responsive on the first try
@@ -0,0 +1,8 @@
1
+ {
2
+ "profiles": ".ai-factory/extensions/gcf-aif-ext/profiles",
3
+ "corpus": [
4
+ { "profile": "card", "glob": "gcf/cards/*.md" },
5
+ { "profile": "system", "glob": "gcf/systems/*.md" },
6
+ { "profile": "pillars", "glob": "gcf/PILLARS.md" }
7
+ ]
8
+ }
@@ -0,0 +1,8 @@
1
+ schema: 1
2
+ built_stale_after_commits: 5
3
+ tune_limit: 3
4
+ question_stale_after_commits: 20
5
+ wip_built_limit: 5
6
+ context_budget: 30000
7
+ pillars_budget: 1500
8
+ envelope_default_spread: 0.3
@@ -0,0 +1,22 @@
1
+ ---
2
+ system: example-system
3
+ updated_by: card-000
4
+ ---
5
+
6
+ purpose:
7
+ - holds the example mechanic and its simulation rules
8
+
9
+ code:
10
+ - Assets/Scripts/Example/, entry point ExampleFeature.cs
11
+
12
+ behavior:
13
+ - pressing X performs Y with feedback Z
14
+
15
+ feel:
16
+ - duration 0.15..0.25 s, kept as the retune envelope
17
+
18
+ constraints:
19
+ - do not stop the simulation from this subsystem
20
+
21
+ open:
22
+ - tempo assumption pending combat retune [until: retune(combat)]