gcf-aif-ext 0.2.7 → 0.4.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.
- package/README.md +54 -10
- package/commands/gcf.js +452 -30
- package/extension.json +22 -5
- package/hooks/pre-commit.js +69 -41
- package/injections/commit-status.md +7 -4
- package/injections/plan-context.md +8 -4
- package/injections/review-pillars.md +4 -3
- package/lib/anchors.js +60 -35
- package/lib/audit-core.js +172 -55
- package/lib/bundle.js +278 -0
- package/lib/context.js +25 -23
- package/lib/design-check.js +631 -0
- package/lib/design.js +179 -0
- package/lib/gcf-paths.js +13 -2
- package/lib/git.js +63 -0
- package/lib/id.js +7 -15
- package/lib/inbox.js +54 -0
- package/lib/index-gen.js +62 -13
- package/lib/ledger.js +94 -0
- package/lib/linter.js +17 -5
- package/lib/live.js +179 -0
- package/lib/migrate.js +345 -0
- package/lib/plan-check.js +31 -0
- package/lib/playtest-list.js +9 -5
- package/lib/systems-doc.js +85 -0
- package/lib/transitions.js +36 -21
- package/lib/unit-ops.js +297 -0
- package/lib/validate-item.js +244 -0
- package/lib/verdict-fs.js +112 -165
- package/lib/work-ops.js +727 -0
- package/package.json +1 -1
- package/profiles/game.md +68 -0
- package/profiles/glossary.md +37 -0
- package/profiles/pillars.md +3 -2
- package/profiles/system.md +1 -1
- package/profiles/unit-constraint.md +52 -0
- package/profiles/unit-entity.md +48 -0
- package/profiles/unit-mechanic.md +111 -0
- package/profiles/unit-resource.md +91 -0
- package/profiles/unit-rule.md +52 -0
- package/schemas/item.schema.json +105 -0
- package/skills/gcf-adopt/SKILL.md +3 -3
- package/skills/gcf-audit/SKILL.md +7 -6
- package/skills/gcf-card/SKILL.md +31 -17
- package/skills/gcf-debate/SKILL.md +17 -14
- package/skills/gcf-ingest/SKILL.md +39 -23
- package/skills/gcf-init/SKILL.md +5 -5
- package/skills/gcf-triage/SKILL.md +35 -0
- package/skills/gcf-verdict/SKILL.md +19 -15
- package/skills/gcf-vision/SKILL.md +17 -11
- package/templates/PILLARS.md +2 -0
- package/templates/backlog.md +2 -5
- package/templates/cnlp.config.json +0 -1
- package/templates/config.yml +7 -0
- package/templates/design.md +59 -0
- package/templates/game.md +24 -0
- package/templates/glossary.md +11 -0
- package/templates/item.md +58 -0
- package/templates/system.md +1 -1
- package/lib/validate-card.js +0 -82
- package/profiles/card.md +0 -65
- package/schemas/card.schema.json +0 -30
- package/templates/card.md +0 -34
package/package.json
CHANGED
package/profiles/game.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: game
|
|
3
|
+
description: The CNL-P profile of gcf/game.md — the vision, the scope and the milestones the design units are planned against.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat and the document is named by its fixed path
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: the file is a singleton at a fixed path and carries no machine fields
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: nothing is exempt in the document that bounds the scope
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: logline
|
|
21
|
+
form: scalar
|
|
22
|
+
required: yes
|
|
23
|
+
note: the game in one line
|
|
24
|
+
|
|
25
|
+
- key: platforms
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: yes
|
|
28
|
+
note: platform and input, one per line
|
|
29
|
+
|
|
30
|
+
- key: audience
|
|
31
|
+
form: bullet-list
|
|
32
|
+
required: yes
|
|
33
|
+
note: who plays, one group per line
|
|
34
|
+
|
|
35
|
+
- key: references
|
|
36
|
+
form: bullet-list
|
|
37
|
+
required: no
|
|
38
|
+
note: "like X, not like Y", one reference per line
|
|
39
|
+
|
|
40
|
+
- key: scope_in
|
|
41
|
+
form: bullet-list
|
|
42
|
+
required: yes
|
|
43
|
+
note: what the game holds
|
|
44
|
+
|
|
45
|
+
- key: scope_out
|
|
46
|
+
form: bullet-list
|
|
47
|
+
required: yes
|
|
48
|
+
note: what the game does not hold, or not in this version
|
|
49
|
+
|
|
50
|
+
- key: milestones
|
|
51
|
+
form: record-list
|
|
52
|
+
required: yes
|
|
53
|
+
record_keys: name, goal
|
|
54
|
+
optional_record_keys: content
|
|
55
|
+
note: the closed vocabulary of a unit's milestone field; content is a volume written as a comparison
|
|
56
|
+
|
|
57
|
+
- key: provenance
|
|
58
|
+
form: record-list
|
|
59
|
+
required: no
|
|
60
|
+
record_keys: slot
|
|
61
|
+
optional_record_keys: src, quote, answer, assumed
|
|
62
|
+
note: per slot, a verbatim quote with its anchor when the file came from a GDD
|
|
63
|
+
|
|
64
|
+
custom_sections:
|
|
65
|
+
- none: a block that is not listed above belongs to a unit or to PILLARS.md
|
|
66
|
+
|
|
67
|
+
enforcement:
|
|
68
|
+
- `ai-factory gcf design check` resolves every unit's milestone against this file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: glossary
|
|
3
|
+
description: The CNL-P profile of gcf/glossary.md — one word per concept, the synonyms it forbids, and the project's own units of measure.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat and the document is named by its fixed path
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: the file is a singleton at a fixed path and carries no machine fields
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: the glossary is the lexicon of the project
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: terms
|
|
21
|
+
form: record-list
|
|
22
|
+
required: yes
|
|
23
|
+
record_keys: term, means
|
|
24
|
+
optional_record_keys: not
|
|
25
|
+
note: a term the human confirmed, what it means, and the words that may not name it
|
|
26
|
+
|
|
27
|
+
- key: units
|
|
28
|
+
form: bullet-list
|
|
29
|
+
required: no
|
|
30
|
+
note: units of measure the project adds to the closed list, one per line as "<unit>: <what it measures>"
|
|
31
|
+
|
|
32
|
+
custom_sections:
|
|
33
|
+
- none: a block that is not listed above belongs to a unit
|
|
34
|
+
|
|
35
|
+
enforcement:
|
|
36
|
+
- `ai-factory gcf design check` refuses a forbidden synonym in gcf/design/ and in a card (M4)
|
|
37
|
+
- quoted text is data: a GDD quote keeps the designer's own word
|
package/profiles/pillars.md
CHANGED
|
@@ -21,11 +21,12 @@ sections:
|
|
|
21
21
|
form: record-list
|
|
22
22
|
required: yes
|
|
23
23
|
record_keys: statement, invariant, review_question
|
|
24
|
-
|
|
24
|
+
optional_record_keys: id
|
|
25
|
+
note: pillar count <= 7 and the token budget are enforced by the gcf audit core; id is the slug a design unit cites in pillars:
|
|
25
26
|
|
|
26
27
|
custom_sections:
|
|
27
28
|
- none: a pillar that needs more than its three keys is not a pillar yet
|
|
28
29
|
|
|
29
30
|
enforcement:
|
|
30
|
-
- `npx cnlp check`, over the file a `cnlp.config.json` corpus entry maps to this profile
|
|
31
|
+
- `npx --yes cnlp-kit check`, over the file a `cnlp.config.json` corpus entry maps to this profile
|
|
31
32
|
- `ai-factory gcf audit` checks the count and token budget
|
package/profiles/system.md
CHANGED
|
@@ -52,5 +52,5 @@ custom_sections:
|
|
|
52
52
|
- none: a fact that fits no block above belongs to code or to a card, not here
|
|
53
53
|
|
|
54
54
|
enforcement:
|
|
55
|
-
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
55
|
+
- `npx --yes cnlp-kit check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
56
56
|
- the gcf P2 linter adds its own forbidden-content patterns on top in the pre-commit hook
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-constraint
|
|
3
|
+
description: The CNL-P profile of a GCF design unit of type constraint — a platform, performance or size threshold, accepted by a measurement.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat; the `## <id>` line and the header fields above the blocks name the unit
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: a constraint never becomes a card, so its header lives above the blocks in design/
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: every block is read when the constraint is planned and measured
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: threshold
|
|
21
|
+
form: bullet-list
|
|
22
|
+
required: yes
|
|
23
|
+
note: one comparison per line, "<subject> <op> <value> <unit>"
|
|
24
|
+
|
|
25
|
+
- key: measure
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: yes
|
|
28
|
+
note: how the threshold is measured and on what - device, build, scene
|
|
29
|
+
|
|
30
|
+
- key: tuning
|
|
31
|
+
form: bullet-list
|
|
32
|
+
required: no
|
|
33
|
+
note: work stage only - one verdict remark per tune, read before the rebuild
|
|
34
|
+
|
|
35
|
+
- key: notes
|
|
36
|
+
form: bullet-list
|
|
37
|
+
required: no
|
|
38
|
+
note: work stage only - the operator's answers and delivered files, one per unblock
|
|
39
|
+
|
|
40
|
+
- key: provenance
|
|
41
|
+
form: record-list
|
|
42
|
+
required: no
|
|
43
|
+
record_keys: slot
|
|
44
|
+
optional_record_keys: src, quote, answer, assumed
|
|
45
|
+
note: per slot, a verbatim quote with its anchor, a human answer, or a D2 assumption
|
|
46
|
+
|
|
47
|
+
custom_sections:
|
|
48
|
+
- none: a block that is not listed above is prose looking for a home
|
|
49
|
+
|
|
50
|
+
enforcement:
|
|
51
|
+
- `ai-factory gcf design check`, over the units in gcf/design/
|
|
52
|
+
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-entity
|
|
3
|
+
description: The CNL-P profile of a GCF design unit of type entity — the shape of a data noun before code holds it.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat; the `## <id>` line and the header fields above the blocks name the unit
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: an entity never becomes a card, so its header lives above the blocks in design/
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: every block is read when the entity is planned and coded
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: fields
|
|
21
|
+
form: record-list
|
|
22
|
+
required: yes
|
|
23
|
+
record_keys: name, holds
|
|
24
|
+
note: one record per field - what it holds, never its allowed values, which belong to a rule
|
|
25
|
+
|
|
26
|
+
- key: tuning
|
|
27
|
+
form: bullet-list
|
|
28
|
+
required: no
|
|
29
|
+
note: work stage only - one verdict remark per tune, read before the rebuild
|
|
30
|
+
|
|
31
|
+
- key: notes
|
|
32
|
+
form: bullet-list
|
|
33
|
+
required: no
|
|
34
|
+
note: work stage only - the operator's answers and delivered files, one per unblock
|
|
35
|
+
|
|
36
|
+
- key: provenance
|
|
37
|
+
form: record-list
|
|
38
|
+
required: no
|
|
39
|
+
record_keys: slot
|
|
40
|
+
optional_record_keys: src, quote, answer, assumed
|
|
41
|
+
note: per slot, a verbatim quote with its anchor, a human answer, or a D2 assumption
|
|
42
|
+
|
|
43
|
+
custom_sections:
|
|
44
|
+
- none: a block that is not listed above is prose looking for a home
|
|
45
|
+
|
|
46
|
+
enforcement:
|
|
47
|
+
- `ai-factory gcf design check`, over the units in gcf/design/
|
|
48
|
+
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-mechanic
|
|
3
|
+
description: The CNL-P profile of a GCF design unit of type mechanic — one body for its section in design/<system>.md and for its card in cards/<id>.md.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in cards/ the frontmatter does
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- schema
|
|
15
|
+
- id
|
|
16
|
+
- type
|
|
17
|
+
- title
|
|
18
|
+
- status
|
|
19
|
+
- system
|
|
20
|
+
- depends
|
|
21
|
+
- pillars
|
|
22
|
+
- source
|
|
23
|
+
- reopens
|
|
24
|
+
- tune_count
|
|
25
|
+
- built_at
|
|
26
|
+
- created
|
|
27
|
+
|
|
28
|
+
lexicon_exempt:
|
|
29
|
+
- none: every block is read when the unit is planned, built or played
|
|
30
|
+
|
|
31
|
+
sections:
|
|
32
|
+
- key: intent
|
|
33
|
+
form: bullet-list
|
|
34
|
+
required: yes
|
|
35
|
+
note: why the mechanic exists, in the designer's words
|
|
36
|
+
|
|
37
|
+
- key: behavior
|
|
38
|
+
form: record-list
|
|
39
|
+
required: yes
|
|
40
|
+
record_keys: input, state, feedback
|
|
41
|
+
note: one record per chain - player input, the state it changes, the feedback the player sees
|
|
42
|
+
|
|
43
|
+
- key: refusal
|
|
44
|
+
form: bullet-list
|
|
45
|
+
required: yes
|
|
46
|
+
note: what happens when the action is not allowed - no resource, invalid target, already active
|
|
47
|
+
|
|
48
|
+
- key: boundaries
|
|
49
|
+
form: bullet-list
|
|
50
|
+
required: yes
|
|
51
|
+
note: zero, maximum, overflow, simultaneity; an exact limit is a comparison at the end of its line
|
|
52
|
+
|
|
53
|
+
- key: persistence
|
|
54
|
+
form: scalar
|
|
55
|
+
required: yes
|
|
56
|
+
note: what survives a reload, a session or a match
|
|
57
|
+
|
|
58
|
+
- key: feel_like
|
|
59
|
+
form: scalar
|
|
60
|
+
required: yes
|
|
61
|
+
note: the comparison "like X, not like Y"
|
|
62
|
+
|
|
63
|
+
- key: feel
|
|
64
|
+
form: record-list
|
|
65
|
+
required: yes
|
|
66
|
+
record_keys: name, envelope
|
|
67
|
+
note: one record per tunable value; an envelope "a..b <unit>" is the only legal range of intent
|
|
68
|
+
|
|
69
|
+
- key: contract
|
|
70
|
+
form: bullet-list
|
|
71
|
+
required: yes
|
|
72
|
+
note: card stage, absent in design/ - paths and entry points, never member lists or values; an architecture rule is a constraint
|
|
73
|
+
|
|
74
|
+
- key: interactions
|
|
75
|
+
form: bullet-list
|
|
76
|
+
required: yes
|
|
77
|
+
note: card stage, absent in design/ - "<other id>: how the two cross", one line per crossing
|
|
78
|
+
|
|
79
|
+
- key: constraints
|
|
80
|
+
form: bullet-list
|
|
81
|
+
required: yes
|
|
82
|
+
note: negative constraints, one prohibition per line, checkable by an analyzer or a reviewer
|
|
83
|
+
|
|
84
|
+
- key: miss_criterion
|
|
85
|
+
form: scalar
|
|
86
|
+
required: yes
|
|
87
|
+
note: the one question the game in hand answers; the human answers it at the verdict
|
|
88
|
+
|
|
89
|
+
- key: tuning
|
|
90
|
+
form: bullet-list
|
|
91
|
+
required: no
|
|
92
|
+
note: work stage only - one verdict remark per tune, read before the rebuild
|
|
93
|
+
|
|
94
|
+
- key: notes
|
|
95
|
+
form: bullet-list
|
|
96
|
+
required: no
|
|
97
|
+
note: work stage only - the operator's answers and delivered files, one per unblock
|
|
98
|
+
|
|
99
|
+
- key: provenance
|
|
100
|
+
form: record-list
|
|
101
|
+
required: no
|
|
102
|
+
record_keys: slot
|
|
103
|
+
optional_record_keys: src, quote, answer, assumed
|
|
104
|
+
note: per slot, a verbatim quote with its anchor, a human answer, or a D2 assumption
|
|
105
|
+
|
|
106
|
+
custom_sections:
|
|
107
|
+
- none: a block that is not listed above is prose looking for a home
|
|
108
|
+
|
|
109
|
+
enforcement:
|
|
110
|
+
- `ai-factory gcf design check`, over the units in gcf/design/ and the cards in gcf/cards/
|
|
111
|
+
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-resource
|
|
3
|
+
description: The CNL-P profile of a GCF design unit of type resource — an economy resource with its sources and sinks, in design/<system>.md and as a card.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in cards/ the frontmatter does
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- schema
|
|
15
|
+
- id
|
|
16
|
+
- type
|
|
17
|
+
- title
|
|
18
|
+
- status
|
|
19
|
+
- system
|
|
20
|
+
- depends
|
|
21
|
+
- pillars
|
|
22
|
+
- source
|
|
23
|
+
- reopens
|
|
24
|
+
- tune_count
|
|
25
|
+
- built_at
|
|
26
|
+
- created
|
|
27
|
+
|
|
28
|
+
lexicon_exempt:
|
|
29
|
+
- none: every block is read when the unit is planned, built or played
|
|
30
|
+
|
|
31
|
+
sections:
|
|
32
|
+
- key: intent
|
|
33
|
+
form: bullet-list
|
|
34
|
+
required: yes
|
|
35
|
+
note: why the resource exists, in the designer's words
|
|
36
|
+
|
|
37
|
+
- key: sources
|
|
38
|
+
form: record-list
|
|
39
|
+
required: yes
|
|
40
|
+
record_keys: name, rate
|
|
41
|
+
note: where the player gets the resource; a rate is an envelope "a..b <unit>" or a comparison
|
|
42
|
+
|
|
43
|
+
- key: sinks
|
|
44
|
+
form: record-list
|
|
45
|
+
required: yes
|
|
46
|
+
record_keys: name, rate
|
|
47
|
+
note: where the player spends the resource; a rate is an envelope "a..b <unit>" or a comparison
|
|
48
|
+
|
|
49
|
+
- key: contract
|
|
50
|
+
form: bullet-list
|
|
51
|
+
required: yes
|
|
52
|
+
note: card stage, absent in design/ - paths and entry points, never member lists or values
|
|
53
|
+
|
|
54
|
+
- key: interactions
|
|
55
|
+
form: bullet-list
|
|
56
|
+
required: yes
|
|
57
|
+
note: card stage, absent in design/ - "<other id>: how the two cross", one line per crossing
|
|
58
|
+
|
|
59
|
+
- key: constraints
|
|
60
|
+
form: bullet-list
|
|
61
|
+
required: yes
|
|
62
|
+
note: negative constraints on the economy, one prohibition per line
|
|
63
|
+
|
|
64
|
+
- key: miss_criterion
|
|
65
|
+
form: scalar
|
|
66
|
+
required: yes
|
|
67
|
+
note: the one question the game in hand answers about the economy
|
|
68
|
+
|
|
69
|
+
- key: tuning
|
|
70
|
+
form: bullet-list
|
|
71
|
+
required: no
|
|
72
|
+
note: work stage only - one verdict remark per tune, read before the rebuild
|
|
73
|
+
|
|
74
|
+
- key: notes
|
|
75
|
+
form: bullet-list
|
|
76
|
+
required: no
|
|
77
|
+
note: work stage only - the operator's answers and delivered files, one per unblock
|
|
78
|
+
|
|
79
|
+
- key: provenance
|
|
80
|
+
form: record-list
|
|
81
|
+
required: no
|
|
82
|
+
record_keys: slot
|
|
83
|
+
optional_record_keys: src, quote, answer, assumed
|
|
84
|
+
note: per slot, a verbatim quote with its anchor, a human answer, or a D2 assumption
|
|
85
|
+
|
|
86
|
+
custom_sections:
|
|
87
|
+
- none: a block that is not listed above is prose looking for a home
|
|
88
|
+
|
|
89
|
+
enforcement:
|
|
90
|
+
- `ai-factory gcf design check`, over the units in gcf/design/ and the cards in gcf/cards/
|
|
91
|
+
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unit-rule
|
|
3
|
+
description: The CNL-P profile of a GCF design unit of type rule — an invariant of the rules or the structure, accepted by a test.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: the body is flat; the `## <id>` line and the header fields above the blocks name the unit
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: a rule never becomes a card, so its header lives above the blocks in design/
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: every block is read when the rule is planned and tested
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: statement
|
|
21
|
+
form: bullet-list
|
|
22
|
+
required: yes
|
|
23
|
+
note: the invariant, one per line; an exact value is a comparison at the end of its line
|
|
24
|
+
|
|
25
|
+
- key: check
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: yes
|
|
28
|
+
note: what accepts the rule without a human playing - a test, an analyzer, a device run
|
|
29
|
+
|
|
30
|
+
- key: tuning
|
|
31
|
+
form: bullet-list
|
|
32
|
+
required: no
|
|
33
|
+
note: work stage only - one verdict remark per tune, read before the rebuild
|
|
34
|
+
|
|
35
|
+
- key: notes
|
|
36
|
+
form: bullet-list
|
|
37
|
+
required: no
|
|
38
|
+
note: work stage only - the operator's answers and delivered files, one per unblock
|
|
39
|
+
|
|
40
|
+
- key: provenance
|
|
41
|
+
form: record-list
|
|
42
|
+
required: no
|
|
43
|
+
record_keys: slot
|
|
44
|
+
optional_record_keys: src, quote, answer, assumed
|
|
45
|
+
note: per slot, a verbatim quote with its anchor, a human answer, or a D2 assumption
|
|
46
|
+
|
|
47
|
+
custom_sections:
|
|
48
|
+
- none: a block that is not listed above is prose looking for a home
|
|
49
|
+
|
|
50
|
+
enforcement:
|
|
51
|
+
- `ai-factory gcf design check`, over the units in gcf/design/
|
|
52
|
+
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/VirtualMaestro/GCF/schemas/item.schema.json",
|
|
4
|
+
"title": "GCF work item frontmatter (schema 3)",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema", "id", "type", "gate", "status", "created"],
|
|
8
|
+
"definitions": {
|
|
9
|
+
"slug": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
|
|
10
|
+
"slugOrNull": {
|
|
11
|
+
"anyOf": [{ "type": "null" }, { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" }]
|
|
12
|
+
},
|
|
13
|
+
"textOrNull": {
|
|
14
|
+
"anyOf": [{ "type": "null" }, { "type": "string", "pattern": "\\S" }]
|
|
15
|
+
},
|
|
16
|
+
"slugList": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"items": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" }
|
|
19
|
+
},
|
|
20
|
+
"summary": { "type": "string", "pattern": "\\S", "maxLength": 250 }
|
|
21
|
+
},
|
|
22
|
+
"properties": {
|
|
23
|
+
"schema": { "const": 3 },
|
|
24
|
+
"id": { "$ref": "#/definitions/slug" },
|
|
25
|
+
"type": {
|
|
26
|
+
"enum": [
|
|
27
|
+
"feature",
|
|
28
|
+
"mechanic",
|
|
29
|
+
"resource",
|
|
30
|
+
"rule",
|
|
31
|
+
"constraint",
|
|
32
|
+
"entity",
|
|
33
|
+
"tech",
|
|
34
|
+
"bug",
|
|
35
|
+
"spike",
|
|
36
|
+
"asset",
|
|
37
|
+
"content",
|
|
38
|
+
"perf",
|
|
39
|
+
"release"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"gate": { "enum": ["verdict", "auto", "decision"] },
|
|
43
|
+
"title": { "type": "string", "pattern": "\\S" },
|
|
44
|
+
"status": {
|
|
45
|
+
"enum": ["ready", "awaiting-verdict", "awaiting-decision", "blocked", "parked", "unplayed"]
|
|
46
|
+
},
|
|
47
|
+
"parent": { "$ref": "#/definitions/slugOrNull" },
|
|
48
|
+
"children": { "$ref": "#/definitions/slugList" },
|
|
49
|
+
"system": { "$ref": "#/definitions/slugList" },
|
|
50
|
+
"depends": { "$ref": "#/definitions/slugList" },
|
|
51
|
+
"pillars": { "$ref": "#/definitions/slugList" },
|
|
52
|
+
"source": { "type": "string", "pattern": "^(GDD#[A-Za-z0-9_-]+|manual)$" },
|
|
53
|
+
"reopens": { "$ref": "#/definitions/slugOrNull" },
|
|
54
|
+
"milestone": { "$ref": "#/definitions/slugOrNull" },
|
|
55
|
+
"parallel": { "enum": ["ok", "serial"] },
|
|
56
|
+
"plan": { "$ref": "#/definitions/textOrNull" },
|
|
57
|
+
"tune_count": { "type": "integer", "minimum": 0 },
|
|
58
|
+
"severity": {
|
|
59
|
+
"anyOf": [{ "type": "null" }, { "enum": ["critical", "high", "medium", "low"] }]
|
|
60
|
+
},
|
|
61
|
+
"blocked": { "$ref": "#/definitions/textOrNull" },
|
|
62
|
+
"since": {
|
|
63
|
+
"anyOf": [{ "type": "null" }, { "type": "string", "pattern": "^[0-9a-f]{7,64}$" }]
|
|
64
|
+
},
|
|
65
|
+
"frozen": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
|
|
66
|
+
"live": {
|
|
67
|
+
"anyOf": [
|
|
68
|
+
{ "type": "null" },
|
|
69
|
+
{
|
|
70
|
+
"type": "object",
|
|
71
|
+
"additionalProperties": false,
|
|
72
|
+
"required": ["none"],
|
|
73
|
+
"properties": { "none": { "type": "string", "pattern": "\\S" } }
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "object",
|
|
77
|
+
"additionalProperties": false,
|
|
78
|
+
"required": ["changes"],
|
|
79
|
+
"properties": {
|
|
80
|
+
"changes": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"minItems": 1,
|
|
83
|
+
"items": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"additionalProperties": false,
|
|
86
|
+
"required": ["id", "change"],
|
|
87
|
+
"properties": {
|
|
88
|
+
"id": { "$ref": "#/definitions/slug" },
|
|
89
|
+
"change": { "enum": ["added", "modified", "removed"] },
|
|
90
|
+
"summary": { "$ref": "#/definitions/summary" },
|
|
91
|
+
"refs": { "type": "string", "pattern": "\\S" }
|
|
92
|
+
},
|
|
93
|
+
"if": { "properties": { "change": { "enum": ["added", "modified"] } } },
|
|
94
|
+
"then": { "required": ["summary"] }
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"model": { "$ref": "#/definitions/textOrNull" },
|
|
102
|
+
"effort": { "$ref": "#/definitions/textOrNull" },
|
|
103
|
+
"created": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -18,7 +18,7 @@ preconditions:
|
|
|
18
18
|
|
|
19
19
|
forbidden_behaviors:
|
|
20
20
|
- do not write `behavior`, `feel` or `constraints` out of reading code: a line derivable from code stays in code (П2)
|
|
21
|
-
- do not open
|
|
21
|
+
- do not open work items or backlog lines for what is already implemented: adoption puts nobody into work
|
|
22
22
|
- do not schedule a retro playtest for a mechanic that already ships
|
|
23
23
|
- do not write a pillar or a subsystem name the human did not confirm: both are human authorship
|
|
24
24
|
- do not read code files whole: names, paths and entry points are the whole input
|
|
@@ -33,9 +33,9 @@ workflow:
|
|
|
33
33
|
7. fill `behavior:` and `constraints:` with 1 placeholder each, annotated `[until: manual(first verdict touching <name>)]`: the profile requires both blocks, and a `manual(...)` trigger is not an audit finding
|
|
34
34
|
8. write a constraint the human states out loud into `constraints:`, and do not interview subsystem by subsystem for more: unanswered questions on adoption day are the staleness this framework exists to remove
|
|
35
35
|
9. draft `PILLARS.md` by the interview in the `gcf-init` skill, steps 4..6, and do not restate that interview here
|
|
36
|
-
10. run `npx cnlp check`, then `ai-factory gcf lint` over each new systems doc, then `ai-factory gcf index`
|
|
36
|
+
10. run `npx --yes cnlp-kit check`, then `ai-factory gcf lint` over each new systems doc, then `ai-factory gcf index`
|
|
37
37
|
11. ask the human to run `ai-factory gcf hooks-install`; when it refuses over a foreign pre-commit, hand them the chain line it prints
|
|
38
|
-
12. state the next step: an old design document goes through `/gcf-ingest
|
|
38
|
+
12. state the next step: an old design document goes through `/gcf-ingest` into `gcf/design/`, new work starts at `/gcf-card`
|
|
39
39
|
|
|
40
40
|
invocation:
|
|
41
41
|
- run once, when a project that already has code adopts GCF
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcf-audit
|
|
3
|
-
description: Run the GCF consistency audit - stale until records,
|
|
3
|
+
description: Run the GCF consistency audit - stale until records, items waiting on the human too long, tune limits, unplayed items, P2 linter findings, plus a semantic contradiction pass. Use at session start or when the user says "аудит gcf".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
mode: inspection
|
|
@@ -17,11 +17,12 @@ forbidden_behaviors:
|
|
|
17
17
|
|
|
18
18
|
workflow:
|
|
19
19
|
1. run `ai-factory gcf audit --json` and read the report
|
|
20
|
-
2. state the first line verbatim:
|
|
21
|
-
3. for each stale until record: name the file, the trigger that fired and the line to re-check
|
|
22
|
-
4.
|
|
23
|
-
5.
|
|
24
|
-
6.
|
|
20
|
+
2. state the first line verbatim: items waiting too long block dependent work, so they lead
|
|
21
|
+
3. for each stale until record: name the file, the trigger that fired and the line to re-check; for each entry of `stale_questions`: name the question id and ask the human for the answer
|
|
22
|
+
4. read the `design` summary: blocking findings first (run `ai-factory gcf design check` for the list), then the count of ready units
|
|
23
|
+
5. semantic pass, only when the mechanical report is clean or the human asks: read the systems docs of ONE subsystem the human names and report pairs of lines that contradict each other as D1 questions
|
|
24
|
+
6. list the pragmas: each `gcf:allow` is a standing exception, and a growing list is the linter rotting
|
|
25
|
+
7. propose the next actions, ranked, proposed actions <= 3: playtest, answer a D1, take a ready unit, or collapse a stale record
|
|
25
26
|
|
|
26
27
|
invocation:
|
|
27
28
|
- run at session start, after a long break, or on demand
|