gcf-aif-ext 0.4.1 → 0.5.1
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 +22 -1
- package/commands/gcf.js +172 -4
- package/extension.json +1 -1
- package/hooks/pre-commit.js +5 -66
- package/lib/board.js +113 -0
- package/lib/design-check.js +24 -6
- package/lib/gate.js +106 -0
- package/lib/integrate.js +322 -0
- package/lib/live.js +82 -23
- package/lib/main-lock.js +112 -0
- package/lib/phase.js +228 -0
- package/lib/playtest-list.js +60 -1
- package/lib/unit-ops.js +26 -1
- package/lib/validate-item.js +10 -0
- package/lib/verdict-fs.js +2 -1
- package/lib/verify.js +72 -0
- package/lib/work-ops.js +61 -7
- package/package.json +1 -1
- package/profiles/glossary.md +1 -1
- package/profiles/system.md +2 -2
- package/profiles/unit-constraint.md +3 -3
- package/profiles/unit-entity.md +3 -3
- package/profiles/unit-mechanic.md +6 -18
- package/profiles/unit-resource.md +6 -18
- package/profiles/unit-rule.md +3 -3
- package/schemas/item.schema.json +4 -0
- package/skills/gcf-card/SKILL.md +5 -4
- package/skills/gcf-verdict/SKILL.md +1 -1
- package/templates/agents-block.md +11 -4
- package/templates/config.yml +2 -0
package/profiles/unit-entity.md
CHANGED
|
@@ -8,10 +8,10 @@ format: cnlp-format.md
|
|
|
8
8
|
mood: declarative
|
|
9
9
|
|
|
10
10
|
headings:
|
|
11
|
-
- none: the body is flat; the `## <id>` line and the header fields above the blocks name the unit
|
|
11
|
+
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in work/ the frontmatter does
|
|
12
12
|
|
|
13
13
|
frontmatter_fields:
|
|
14
|
-
- none:
|
|
14
|
+
- none: in design/ the header lives above the blocks; in work/ the work item schema holds the frontmatter
|
|
15
15
|
|
|
16
16
|
lexicon_exempt:
|
|
17
17
|
- none: every block is read when the entity is planned and coded
|
|
@@ -44,5 +44,5 @@ custom_sections:
|
|
|
44
44
|
- none: a block that is not listed above is prose looking for a home
|
|
45
45
|
|
|
46
46
|
enforcement:
|
|
47
|
-
- `ai-factory gcf design check`, over the units in gcf/design/
|
|
47
|
+
- `ai-factory gcf design check`, over the units in gcf/design/ and the items in gcf/work/
|
|
48
48
|
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
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
|
|
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 work item in work/<id>.md.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
format: cnlp-format.md
|
|
@@ -8,22 +8,10 @@ format: cnlp-format.md
|
|
|
8
8
|
mood: declarative
|
|
9
9
|
|
|
10
10
|
headings:
|
|
11
|
-
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in
|
|
11
|
+
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in work/ the frontmatter does
|
|
12
12
|
|
|
13
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
|
|
14
|
+
- none: in design/ the header lives above the blocks; in work/ the work item schema holds the frontmatter
|
|
27
15
|
|
|
28
16
|
lexicon_exempt:
|
|
29
17
|
- none: every block is read when the unit is planned, built or played
|
|
@@ -69,12 +57,12 @@ sections:
|
|
|
69
57
|
- key: contract
|
|
70
58
|
form: bullet-list
|
|
71
59
|
required: yes
|
|
72
|
-
note:
|
|
60
|
+
note: work stage, absent in design/ - paths and entry points, never member lists or values; an architecture rule is a constraint
|
|
73
61
|
|
|
74
62
|
- key: interactions
|
|
75
63
|
form: bullet-list
|
|
76
64
|
required: yes
|
|
77
|
-
note:
|
|
65
|
+
note: work stage, absent in design/ - "<other id>: how the two cross", one line per crossing
|
|
78
66
|
|
|
79
67
|
- key: constraints
|
|
80
68
|
form: bullet-list
|
|
@@ -107,5 +95,5 @@ custom_sections:
|
|
|
107
95
|
- none: a block that is not listed above is prose looking for a home
|
|
108
96
|
|
|
109
97
|
enforcement:
|
|
110
|
-
- `ai-factory gcf design check`, over the units in gcf/design/ and the
|
|
98
|
+
- `ai-factory gcf design check`, over the units in gcf/design/ and the items in gcf/work/
|
|
111
99
|
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
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
|
|
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 work item.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
format: cnlp-format.md
|
|
@@ -8,22 +8,10 @@ format: cnlp-format.md
|
|
|
8
8
|
mood: declarative
|
|
9
9
|
|
|
10
10
|
headings:
|
|
11
|
-
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in
|
|
11
|
+
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in work/ the frontmatter does
|
|
12
12
|
|
|
13
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
|
|
14
|
+
- none: in design/ the header lives above the blocks; in work/ the work item schema holds the frontmatter
|
|
27
15
|
|
|
28
16
|
lexicon_exempt:
|
|
29
17
|
- none: every block is read when the unit is planned, built or played
|
|
@@ -49,12 +37,12 @@ sections:
|
|
|
49
37
|
- key: contract
|
|
50
38
|
form: bullet-list
|
|
51
39
|
required: yes
|
|
52
|
-
note:
|
|
40
|
+
note: work stage, absent in design/ - paths and entry points, never member lists or values
|
|
53
41
|
|
|
54
42
|
- key: interactions
|
|
55
43
|
form: bullet-list
|
|
56
44
|
required: yes
|
|
57
|
-
note:
|
|
45
|
+
note: work stage, absent in design/ - "<other id>: how the two cross", one line per crossing
|
|
58
46
|
|
|
59
47
|
- key: constraints
|
|
60
48
|
form: bullet-list
|
|
@@ -87,5 +75,5 @@ custom_sections:
|
|
|
87
75
|
- none: a block that is not listed above is prose looking for a home
|
|
88
76
|
|
|
89
77
|
enforcement:
|
|
90
|
-
- `ai-factory gcf design check`, over the units in gcf/design/ and the
|
|
78
|
+
- `ai-factory gcf design check`, over the units in gcf/design/ and the items in gcf/work/
|
|
91
79
|
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
package/profiles/unit-rule.md
CHANGED
|
@@ -8,10 +8,10 @@ format: cnlp-format.md
|
|
|
8
8
|
mood: declarative
|
|
9
9
|
|
|
10
10
|
headings:
|
|
11
|
-
- none: the body is flat; the `## <id>` line and the header fields above the blocks name the unit
|
|
11
|
+
- none: the body is flat; in design/ the `## <id>` line and the header fields above the blocks name the unit, in work/ the frontmatter does
|
|
12
12
|
|
|
13
13
|
frontmatter_fields:
|
|
14
|
-
- none:
|
|
14
|
+
- none: in design/ the header lives above the blocks; in work/ the work item schema holds the frontmatter
|
|
15
15
|
|
|
16
16
|
lexicon_exempt:
|
|
17
17
|
- none: every block is read when the rule is planned and tested
|
|
@@ -48,5 +48,5 @@ custom_sections:
|
|
|
48
48
|
- none: a block that is not listed above is prose looking for a home
|
|
49
49
|
|
|
50
50
|
enforcement:
|
|
51
|
-
- `ai-factory gcf design check`, over the units in gcf/design/
|
|
51
|
+
- `ai-factory gcf design check`, over the units in gcf/design/ and the items in gcf/work/
|
|
52
52
|
- the gcf pre-commit hook runs the same check and refuses a commit with a blocking finding
|
package/schemas/item.schema.json
CHANGED
|
@@ -100,6 +100,10 @@
|
|
|
100
100
|
},
|
|
101
101
|
"model": { "$ref": "#/definitions/textOrNull" },
|
|
102
102
|
"effort": { "$ref": "#/definitions/textOrNull" },
|
|
103
|
+
"version": {
|
|
104
|
+
"anyOf": [{ "type": "null" }, { "type": "string", "pattern": "^\\S+$" }]
|
|
105
|
+
},
|
|
106
|
+
"channel": { "$ref": "#/definitions/slugOrNull" },
|
|
103
107
|
"created": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }
|
|
104
108
|
}
|
|
105
109
|
}
|
package/skills/gcf-card/SKILL.md
CHANGED
|
@@ -23,16 +23,17 @@ forbidden_behaviors:
|
|
|
23
23
|
- do not put `until:` in the frontmatter: it is a line annotation inside slots
|
|
24
24
|
- do not move a section, edit the backlog or write `status:` by hand: `ai-factory gcf take`, `item new`, `done`, `drop` and the item moves own those
|
|
25
25
|
- do not reuse an id: an ended id stays ended; rework gets a new id with `reopens: <old id>`
|
|
26
|
+
- do not remove a D2 record cited as `assumed: q-NNN`: it stays in `gcf/open-questions.md` until its `until:` fires; when the human confirms the value earlier, rewrite each citation to `answer: q-NNN` first
|
|
26
27
|
|
|
27
28
|
outputs:
|
|
28
29
|
- each answered slot gets a provenance record `- slot: <block>` with `answer: manual`, or `answer: q-NNN` when it closes a question
|
|
29
|
-
- a design-unit item body carries every block of its type
|
|
30
|
+
- a design-unit item body carries every block of its type; a mechanic or resource item adds `contract:` (paths and entry points) and `interactions:` (`<other id>: how the two cross`, or `- none: <why>`)
|
|
30
31
|
- every item carries a `live:` delta before it ends: what it adds, modifies or removes in `gcf/LIVE.md`, or `none: <why>`
|
|
31
32
|
|
|
32
33
|
workflow:
|
|
33
34
|
1. for a free-text design idea: ask "into work now, or park it?"; write a unit in the matching `gcf/design/<system>.md` with `source: manual` and `TBD` slots, append `- <id>` to `gcf/backlog.md`, and on "park" stop here
|
|
34
|
-
2. for non-design work: pick the type - tech, bug, spike, asset, content, perf, release - and propose the gate its type gives; the human may flip it (`--gate auto` is "no playtest")
|
|
35
|
-
3. a bug needs `--severity` and a `repro:` the human confirms
|
|
35
|
+
2. for non-design work: pick the type - tech, bug, spike, asset, content, perf, release - among those `ai-factory gcf phase` says the phase takes, and propose the gate its type gives; the human may flip it (`--gate auto` is "no playtest")
|
|
36
|
+
3. a bug needs `--severity` and a `repro:` the human confirms; a release needs `--release <version> --channel <name>` from the human
|
|
36
37
|
4. run `ai-factory gcf item new <id> --type <type> [--gate <gate>] [--parent <feature>] [--title "<line>"]`, add `--from <in-id>` when it comes from the inbox, `--blocked "file needed"` for a final asset; then write `intent:` and `live:` and stop
|
|
37
38
|
5. for a design unit: run `ai-factory gcf where <id>`; the id must be a single unit of `gcf/design/`; read its section from the file the command names
|
|
38
39
|
6. for a unit with `flags: impl?` ask the human first whether the mechanic already ships; on "yes" run `ai-factory gcf drop <id> --reason "already ships"` and stop
|
|
@@ -44,7 +45,7 @@ workflow:
|
|
|
44
45
|
12. write each answer into the unit in place, with its `answer:` provenance record
|
|
45
46
|
13. run `ai-factory gcf design check --json` until the unit's entry in `units` reads `ready: true`, then commit the answered unit
|
|
46
47
|
14. run `ai-factory gcf take <id>` for one unit, or `ai-factory gcf take <id> <id> --feature <feature-id>` to group several under a feature; it writes `gcf/work/<id>.md` and removes the sections and backlog lines in one step
|
|
47
|
-
15. in each
|
|
48
|
+
15. in each mechanic or resource item write `contract:` from the code tree and `interactions:` from the units and items that write the same state; a soft unit whose human wants no playtest gets `gate: auto` - it will close as unplayed
|
|
48
49
|
16. write the item's `live:` delta (a feature's children keep `none: parent`; the feature writes the capability), run `ai-factory gcf design check`, and commit
|
|
49
50
|
17. report the item paths, each item's gate, and for a verdict item the one question the playtest will answer
|
|
50
51
|
|
|
@@ -21,7 +21,7 @@ forbidden_behaviors:
|
|
|
21
21
|
- do not edit systems docs, `LIVE.md`, history or graveyard by hand: the commands own them
|
|
22
22
|
|
|
23
23
|
workflow:
|
|
24
|
-
1. with no arguments: run `ai-factory gcf playtest` and stop -
|
|
24
|
+
1. with no arguments: run `ai-factory gcf playtest session` and stop - its build line and checklist of awaiting-verdict and unplayed items are the session's playtest sheet
|
|
25
25
|
2. read the item; for a verdict ask the human the miss_criterion question and record the answer in one line
|
|
26
26
|
3. for `tune` at the tune limit (`tune_limit` in `gcf/config.yml`, 3 by default): the command refuses; the way out is a kill, and a redesigned envelope becomes a new item with `reopens: <id>`
|
|
27
27
|
4. for `keep` of a design-unit item still awaiting its verdict: compress it first - the collapse copies lines verbatim, 1 line per behavior record, refusal and boundary
|
|
@@ -1,23 +1,30 @@
|
|
|
1
|
-
## Game Context Framework (from gcf-aif-ext)
|
|
2
|
-
|
|
3
1
|
gcf_context:
|
|
4
2
|
- the game's design and its work live in `gcf/`, and the `ai-factory gcf` commands and the gcf skills change them
|
|
5
3
|
- read `gcf/INDEX.md` before anything else under `gcf/`: it lists every subsystem, design unit and work item
|
|
6
4
|
- `gcf/LIVE.md` says what the game does now, and `gcf/PILLARS.md` says what it must stay
|
|
5
|
+
- `ai-factory gcf board --json` gives the whole state in one read: the phase, the items by status with plan progress, the inbox and the open questions
|
|
7
6
|
|
|
8
7
|
gcf_work:
|
|
9
8
|
- every piece of work is one work item `gcf/work/<id>.md`: find the item before writing code for a feature, a bug or a tech task, or create it with the gcf-card skill
|
|
10
9
|
- a raw idea, a playtest note or a CI finding that is not work yet goes to `ai-factory gcf inbox add "<text>"`, and the gcf-triage skill sorts it later
|
|
11
10
|
- before planning an item, run `ai-factory gcf context <id>` and read only the files it lists under `gcf/`
|
|
12
|
-
- drive a ready item with the gcf-run skill when the project has gcf-harness-aif-ext, otherwise with aif-plan and aif-implement
|
|
13
|
-
-
|
|
11
|
+
- drive a ready item with the gcf-run skill when the project has gcf-harness-aif-ext (a batch at once: `ai-factory gcf-harness run <ids...>`), otherwise with aif-plan and aif-implement
|
|
12
|
+
- after the code, write the item's `live:` delta and run `ai-factory gcf verify <id>`: fix what it reports and run it again until every check is green
|
|
13
|
+
- then end the work on the item with its command: `ai-factory gcf submit <id>` for gate verdict or decision, `ai-factory gcf close <id>` for gate auto
|
|
14
14
|
- work that cannot go on: run `ai-factory gcf block <id> --reason "<why or the question>"`
|
|
15
|
+
- in a worktree on branch `work/<id>` change no `gcf/` file but the item's `live:`, commit all, then run `ai-factory gcf verify <id> --mark`: `ai-factory gcf integrate` in the main checkout merges it and records the move
|
|
15
16
|
- a design question only the human can answer becomes a D1 record in `gcf/open-questions.md`
|
|
17
|
+
- a word added to a `not:` of `gcf/glossary.md` leaves `gcf/design/` and every item but an unplayed one in the same commit: `ai-factory gcf design check` names each hit as M4
|
|
18
|
+
- the human plays from `ai-factory gcf playtest session`; each free note from that play goes to `ai-factory gcf inbox add --source playtest "<note>"`
|
|
19
|
+
- a release item carries `version:` and `channel:` (`item new <id> --type release --release <v> --channel <c>`): its end writes the `release:` block of `gcf/LIVE.md`
|
|
20
|
+
- `item new` and `take` refuse a type the current phase does not take: run `ai-factory gcf phase` and bring the refusal to the human
|
|
21
|
+
- a pillar changes only on the human's word: `ai-factory gcf pillar rename <from> <to>`, or `ai-factory gcf pillar retire <id> --reason "<why>"`
|
|
16
22
|
|
|
17
23
|
gcf_forbidden:
|
|
18
24
|
- do not edit `status:`, `frozen:`, `gcf/LIVE.md`, `gcf/history.md`, `gcf/graveyard.md` or `gcf/INDEX.md` by hand: the commands own them
|
|
19
25
|
- do not give a verdict or a decision: `verdict` and `decide` belong to the human, through the gcf-verdict skill
|
|
20
26
|
- do not answer a `TBD` of a design unit yourself: ask the human and offer your draft as the proposed answer
|
|
27
|
+
- do not run `ai-factory gcf phase next`: the phase moves on the human's word only
|
|
21
28
|
- do not reuse an ended id: rework gets a new id with `reopens: <old id>`
|
|
22
29
|
- do not commit past the gate with `--no-verify`: a refused commit names what to fix
|
|
23
30
|
|
package/templates/config.yml
CHANGED
|
@@ -10,6 +10,8 @@ unplayed_warn_after: 5
|
|
|
10
10
|
plan_passes: 5
|
|
11
11
|
dod_attempts: 2
|
|
12
12
|
# The project's own commands for the auto DoD (Methodology §6); the engine does not matter.
|
|
13
|
+
# gcf verify fails on an empty one; `none` says the project has no such step.
|
|
14
|
+
# Phases (Methodology §10) come from code; a `phases:` list here replaces the whole set.
|
|
13
15
|
dod:
|
|
14
16
|
test:
|
|
15
17
|
build:
|