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/skills/gcf-card/SKILL.md
CHANGED
|
@@ -1,36 +1,50 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcf-card
|
|
3
|
-
description:
|
|
3
|
+
description: Put work into gcf/work/ - take a design unit with every TBD answered, group units under a feature, or create a tech, bug, spike, asset, content, perf or release item. Also parks a fresh idea as a unit. Use when work starts or the user says "заведи карточку" / "берём в работу" / "заведи задачу".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
mode: authoring
|
|
7
7
|
|
|
8
8
|
purpose:
|
|
9
|
-
-
|
|
9
|
+
- every piece of work in the project is one work item `gcf/work/<id>.md` with a type and a gate: who closes it - the human after play (`verdict`), a check (`auto`), the human without a build (`decision`)
|
|
10
|
+
- a design unit enters work with every slot answered and its section moved, not copied
|
|
10
11
|
|
|
11
12
|
inputs:
|
|
12
|
-
-
|
|
13
|
+
- an id from `gcf/backlog.md`, several ids to group under a feature, a free-text idea, or a request for non-design work
|
|
13
14
|
|
|
14
15
|
preconditions:
|
|
15
|
-
- `gcf/` exists; `gcf/INDEX.md` lists the current subsystems
|
|
16
|
+
- `gcf/` exists; `gcf/INDEX.md` lists the current subsystems and items
|
|
16
17
|
|
|
17
18
|
forbidden_behaviors:
|
|
18
19
|
- do not invent a new subsystem name when INDEX carries a synonym: reuse or ask
|
|
19
|
-
- do not
|
|
20
|
+
- do not answer a `TBD` yourself: ask the human, and offer your draft as the proposed answer
|
|
21
|
+
- do not take a unit an open D1 blocks: `ai-factory gcf design check` names the blocking question, and the human answers it first
|
|
22
|
+
- do not write a digit in prose: a number is an envelope `a..b <unit>` in `feel` or a closing comparison
|
|
20
23
|
- do not put `until:` in the frontmatter: it is a line annotation inside slots
|
|
21
|
-
- do not
|
|
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
|
+
- do not reuse an id: an ended id stays ended; rework gets a new id with `reopens: <old id>`
|
|
26
|
+
|
|
27
|
+
outputs:
|
|
28
|
+
- 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 plus `contract:` (paths and entry points) and `interactions:` (`<other id>: how the two cross`, or `- none: <why>`)
|
|
30
|
+
- every item carries a `live:` delta before it ends: what it adds, modifies or removes in `gcf/LIVE.md`, or `none: <why>`
|
|
22
31
|
|
|
23
32
|
workflow:
|
|
24
|
-
1.
|
|
25
|
-
2. for
|
|
26
|
-
3.
|
|
27
|
-
4.
|
|
28
|
-
5.
|
|
29
|
-
6.
|
|
30
|
-
7.
|
|
31
|
-
8.
|
|
32
|
-
9.
|
|
33
|
-
10.
|
|
33
|
+
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
|
|
36
|
+
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
|
+
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
|
+
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
|
|
39
|
+
7. for a unit with `flags: src-changed` re-read each changed anchor with `ai-factory gcf section`, rebuild the slots whose quote moved, and remove the flag
|
|
40
|
+
8. confirm the route: ask "can an autotest accept this without a human playing?"; yes = hard, no or mixed = soft; a mixed unit splits into a soft mechanic and a hard rule before work
|
|
41
|
+
9. ask the human one question per `TBD` slot, each with your proposed answer, questions per message <= 2
|
|
42
|
+
10. write each answer into the unit in place, with its `answer:` provenance record
|
|
43
|
+
11. run `ai-factory gcf design check --json` until the unit's entry in `units` reads `ready: true`, then commit the answered unit
|
|
44
|
+
12. 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
|
|
45
|
+
13. in each design-unit 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
|
|
46
|
+
14. 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
|
|
47
|
+
15. report the item paths, each item's gate, and for a verdict item the one question the playtest will answer
|
|
34
48
|
|
|
35
49
|
invocation:
|
|
36
|
-
- run when work starts on a
|
|
50
|
+
- run when work starts on a unit or a group of units, when non-design work needs an item, or when a fresh idea needs a home
|
|
@@ -1,33 +1,36 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcf-debate
|
|
3
|
-
description: The debate table - expert lenses stress
|
|
3
|
+
description: The debate table - expert lenses stress the design for gaps, contradictions and unbuildable specs, over the Design Model or a GDD file. Use when the user asks to review the design, check design coherence, or says "стол дебатов".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
mode: review board
|
|
7
7
|
|
|
8
8
|
purpose:
|
|
9
|
-
- stress
|
|
9
|
+
- stress the design through the GCF lenses after the mechanical check, and report the gaps the designer did not write down
|
|
10
10
|
|
|
11
11
|
inputs:
|
|
12
|
-
- a
|
|
12
|
+
- a unit id, `--milestone <name>`, or nothing for all of `gcf/design/`
|
|
13
|
+
- or a path to a GDD (markdown) that gcf-ingest has not imported yet
|
|
14
|
+
- optionally the names of lenses to run, default is all
|
|
13
15
|
|
|
14
16
|
preconditions:
|
|
15
|
-
- the file exists and is readable markdown
|
|
17
|
+
- for the Design Model: `gcf/design/` holds units; for a GDD file: the file exists and is readable markdown
|
|
16
18
|
|
|
17
19
|
forbidden_behaviors:
|
|
18
|
-
- do not edit the document without the human's explicit go-ahead per edit
|
|
20
|
+
- do not edit a unit or the document without the human's explicit go-ahead per edit
|
|
19
21
|
- do not resolve a principal fork yourself: a fork goes to the human as a D1 question with a proposed default
|
|
20
22
|
- do not review style or prose quality: the table checks buildability and coherence only
|
|
23
|
+
- do not repeat what the mechanical check already reports: the lenses start where `ai-factory gcf design check` stops
|
|
21
24
|
|
|
22
25
|
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
|
|
25
|
-
3. play the coherence lenses over the whole
|
|
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
|
|
28
|
-
6. report by lens, ordered by damage: contradictions first, then holes, then dictionary drift; cite anchors, quote lines <= 15 words
|
|
29
|
-
7.
|
|
30
|
-
8. offer the fixes: apply agreed
|
|
26
|
+
1. over the Design Model: run `ai-factory gcf design check --json` and read the blocking findings and the `TBD` counts first; over a GDD file: run `ai-factory gcf anchor <file>` and use the printed anchors in every finding
|
|
27
|
+
2. play each completeness lens as its own expert over each mechanic: state, input, feedback, refusal, boundaries, persistence; over units, judge only the slots that hold a value
|
|
28
|
+
3. play the coherence lenses over the whole set: interaction matrix (which units write the same state), loop closure (each resource has a source and a sink that fit), progression pressure, economy balance, one word per concept, pillar fit
|
|
29
|
+
4. cross-examine: for each pair of findings that touch one unit or anchor, check whether they contradict each other and merge or escalate
|
|
30
|
+
5. classify each finding: D2 gets a proposed default the human can skim; D1 is a principal fork and carries the question, the units in `blocks:` and a proposed answer
|
|
31
|
+
6. report by lens, ordered by damage: contradictions first, then holes, then dictionary drift; cite unit ids or anchors, quote lines <= 15 words
|
|
32
|
+
7. append D1 and D2 records to `gcf/open-questions.md` when `gcf/` exists; otherwise put them into the report only
|
|
33
|
+
8. offer the fixes: apply each agreed edit to its unit in place, with `answer: manual` in its provenance, one go-ahead per edit, then run `ai-factory gcf design check`
|
|
31
34
|
|
|
32
35
|
invocation:
|
|
33
|
-
- run on a fresh GDD before ingest, after a big
|
|
36
|
+
- run on a fresh GDD before ingest, on the Design Model after an import or a big revision, or on demand
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcf-ingest
|
|
3
|
-
description: Import a GDD into GCF - anchors,
|
|
3
|
+
description: Import a GDD into the GCF Design Model - anchors, design units with slots, game and glossary proposals, gap questions; re-import marks only the units whose quotes moved. Use when the user brings a GDD or says "импортируй GDD".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
mode: import
|
|
7
7
|
|
|
8
8
|
purpose:
|
|
9
|
-
- cut a GDD into
|
|
9
|
+
- cut a GDD into design units in `gcf/design/<system>.md` and a short list of questions, without putting anyone "into work"
|
|
10
|
+
- write into a slot only what the GDD says: a verbatim quote backs the value, and every other slot reads `TBD`
|
|
10
11
|
|
|
11
12
|
inputs:
|
|
12
13
|
- a path to the GDD (markdown)
|
|
@@ -16,34 +17,49 @@ preconditions:
|
|
|
16
17
|
- the sequential pass below is the correctness reference; the parallel fan-out belongs to the harness
|
|
17
18
|
|
|
18
19
|
forbidden_behaviors:
|
|
19
|
-
- do not create
|
|
20
|
+
- do not create work items: a unit stays in `gcf/design/` until `/gcf-card` takes it into work
|
|
20
21
|
- do not write a pillar into PILLARS.md: pillar candidates go to open-questions as D1
|
|
21
|
-
- do not
|
|
22
|
+
- do not fill a slot from your own reasoning: a value without a verbatim quote is `TBD`, and your draft answer goes into the `proposed:` field of a question
|
|
22
23
|
- do not read `gcf/source/` files whole after anchoring: read a section with `ai-factory gcf section <file> <anchor>`
|
|
23
|
-
- do not turn a count, a hard limit or a performance threshold into an envelope: only a tunable value gets a
|
|
24
|
+
- do not turn a count, a hard limit or a performance threshold into an envelope: only a tunable value gets a range
|
|
25
|
+
- do not write a digit in prose: a number is an envelope `a..b <unit>` in `feel` or a rate, or a closing comparison `<subject> <op> <value> [unit]`
|
|
26
|
+
- do not overwrite a slot whose provenance record reads `answer:`: the human wrote it, and a conflict with the GDD is a D1 question
|
|
27
|
+
- do not reuse an id the ledger reports as done, collapsed or killed: `ai-factory gcf where <id>` says, and a revival is the human's D1
|
|
24
28
|
|
|
25
29
|
outputs:
|
|
26
|
-
- a
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
- a
|
|
30
|
+
- a unit: a `## <id>` section in `gcf/design/<system>.md`, the id a lowercase hyphen slug from the unit's name, frozen once written
|
|
31
|
+
- the unit header: `type`, `title`, `route: soft|hard (<why>)`, `system: [<file system>, ...]`, `milestone`, `pillars`, `depends`, `source`, and `flags` only when one applies
|
|
32
|
+
- the unit body: the blocks of `templates/design.md` for its type - mechanic, resource, rule, constraint or entity - with `TBD` for every unknown
|
|
33
|
+
- a `provenance:` block per unit: one record per slot, `slot` plus `src: GDD#<anchor>` and `quote: "<verbatim>"`, or `assumed: q-NNN` for a D2 decision
|
|
34
|
+
- `gcf/design/<system>.md` opens with `# <system>` and a `purpose:` block, `TBD` when the GDD names no purpose
|
|
35
|
+
- `gcf/backlog.md`: one `- <id>` line per new unit, appended at the end
|
|
36
|
+
- a question record in `gcf/open-questions.md`: `- id: q-NNN`, then `lens:`, `sections:`, `sys:`, `class: D1|D2`, `question:`, `proposed:`, and `blocks: <ids>` when the answer gates units
|
|
37
|
+
- a D2 record adds `assumed:` (what the agent took as given) and `until:` (when it expires, in the `verdict(<id>)`, `retune(system)` or `manual(text)` form)
|
|
38
|
+
- `gcf/game.md` and `gcf/glossary.md` proposals in the forms of `templates/game.md` and `templates/glossary.md`, written only after the human confirms them
|
|
30
39
|
|
|
31
40
|
workflow:
|
|
32
41
|
1. when `gcf/systems/` is empty and the repository already holds game code, tell the human `impl?` marks are blind without `/gcf-adopt`, and offer to run it first
|
|
33
|
-
2. run `ai-factory gcf anchor <file>`: it prints each anchor with its line range; on a re-import read the printed delta and jump to step
|
|
34
|
-
3. extract per aspect, one pass each,
|
|
35
|
-
4.
|
|
36
|
-
5.
|
|
37
|
-
6.
|
|
38
|
-
7.
|
|
39
|
-
8.
|
|
40
|
-
9.
|
|
41
|
-
10.
|
|
42
|
-
11.
|
|
43
|
-
12.
|
|
44
|
-
13.
|
|
45
|
-
14.
|
|
46
|
-
15.
|
|
42
|
+
2. run `ai-factory gcf anchor <file>`: it prints each anchor with its line range; on a re-import read the printed delta and jump to step 17
|
|
43
|
+
3. extract per aspect, one pass each, with a quote and an anchor per value: pillar candidates; subsystems (nouns); player verbs (mechanic); economy resources (resource)
|
|
44
|
+
4. extract the hard aspects the same way: invariants (rule); platform and performance thresholds (constraint); data nouns (entity)
|
|
45
|
+
5. type each unit: a mechanic or a resource is soft and waits for a verdict once in work; a rule, a constraint or an entity is hard and leaves through tests
|
|
46
|
+
6. split a candidate that mixes a tunable feel with a testable rule into 2 units: a soft mechanic and a hard rule
|
|
47
|
+
7. treat the GDD's own open-questions section, and any TBD or TODO, as D1 records with lens `gdd-open` and the anchor in `sections:`, and name the units each one gates in `blocks:`
|
|
48
|
+
8. copy each quote verbatim from the section `ai-factory gcf section` prints; a unit with no quote at all becomes a D1 record with lens `provenance`, not a unit
|
|
49
|
+
9. classify each number before an envelope: a tunable value (duration, speed, damage, cost, rate) gets value ± `envelope_default_spread` from `gcf/config.yml`, rounded outward for an integer
|
|
50
|
+
10. write that envelope into the slot and a D2 record for it, and cite the record as `assumed: q-NNN` beside the quote
|
|
51
|
+
11. keep counts, hard limits and performance thresholds exact as comparisons
|
|
52
|
+
12. ask about a unit of measure outside the closed list (bare `px`, a currency): it becomes a question, or a `units:` entry of the glossary the human confirms
|
|
53
|
+
13. run the completeness lenses per unit - input, state, feedback, refusal, boundaries, persistence - and leave each unanswered lens as `TBD` in its slot: the questions come when `/gcf-card` takes the unit
|
|
54
|
+
14. run the coherence lenses over the set and send their findings to questions now: interaction matrix, loop closure, economy, progression, dictionary
|
|
55
|
+
15. record `depends:` between units from the interaction matrix: units that write the same state
|
|
56
|
+
16. propose the glossary from the dictionary lens: one term per concept and its forbidden synonyms; keep the GDD's own words in unit text until the human confirms a term
|
|
57
|
+
17. on a re-import run `ai-factory gcf design check`: a unit whose quote is no longer verbatim gets `flags: src-changed`, a unit whose anchor the GDD removed gets `flags: orphan`; `gcf anchor` already rewrote renamed anchors
|
|
58
|
+
18. on a re-import, raise a D1 for a work item or a collapsed system that cites a changed anchor, and run steps 3..16 over the text no quote covers any more
|
|
59
|
+
19. mark a unit whose nouns match the `purpose` or the `code` paths of an existing systems doc with `flags: impl?`: the mechanic may already ship, and the human drops it with `ai-factory gcf drop`
|
|
60
|
+
20. append the new ids to `gcf/backlog.md`, run `ai-factory gcf design check`, and fix every blocking finding before you report
|
|
61
|
+
21. report the package, ordered: D1 questions (the main product), pillar candidates, glossary conflicts, the design summary per subsystem, D2 assumptions; say when `impl?` was blind
|
|
62
|
+
22. state the next step: answer the D1s, confirm pillars and glossary, then take the first unit with `/gcf-card <id>`
|
|
47
63
|
|
|
48
64
|
invocation:
|
|
49
65
|
- run when a GDD arrives or changes
|
package/skills/gcf-init/SKILL.md
CHANGED
|
@@ -20,14 +20,14 @@ forbidden_behaviors:
|
|
|
20
20
|
- pillar count <= 7, and do not pad the list to reach 7
|
|
21
21
|
|
|
22
22
|
workflow:
|
|
23
|
-
1. when `.ai-factory/DESCRIPTION.md` is absent, tell the human to run `/aif` first: `aif-plan` reads it, and a
|
|
24
|
-
2. run `ai-factory gcf init` and report which files it created; it writes no `PILLARS.md`, so no example ever reads as the game's truth
|
|
23
|
+
1. when `.ai-factory/DESCRIPTION.md` is absent, tell the human to run `/aif` first: `aif-plan` reads it, and a work item cannot reach a plan without it
|
|
24
|
+
2. run `ai-factory gcf init` and report which files it created, `gcf/design/` among them; it writes no `PILLARS.md`, so no example ever reads as the game's truth
|
|
25
25
|
3. when the human is about to import a GDD, leave `PILLARS.md` absent: the import proposes pillar candidates, and the interview runs after it
|
|
26
|
-
4. otherwise 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. otherwise ask the human for the game's core promise, then for 2..7 pillars: each needs an id (a lowercase hyphen slug the design units cite), a statement, a negative invariant and a review question
|
|
27
27
|
5. write `gcf/PILLARS.md` with the confirmed pillars in the record-list form of `.ai-factory/extensions/gcf-aif-ext/templates/PILLARS.md`
|
|
28
|
-
6. run `npx cnlp check` and fix form issues it reports
|
|
28
|
+
6. run `npx --yes cnlp-kit check` and fix form issues it reports
|
|
29
29
|
7. ask the human to run `ai-factory gcf hooks-install`: the commit gate is theirs to arm
|
|
30
|
-
8. state the next step:
|
|
30
|
+
8. state the next step: import a GDD with `/gcf-ingest`, or start the design with `/gcf-vision` when there is none
|
|
31
31
|
|
|
32
32
|
invocation:
|
|
33
33
|
- run when the user asks to set up gcf in a project
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gcf-triage
|
|
3
|
+
description: Triage gcf/inbox.md - playtest notes, CI failures, the agent's ideas and requests - into work items, tunes, ideas for the design, or noise, with the human approving each call. Use after a playtest session or when the user says "разбери инбокс".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
mode: human gate
|
|
7
|
+
|
|
8
|
+
purpose:
|
|
9
|
+
- turn raw input into decided work: each inbox entry becomes a work item, a tune note, a design unit, a graveyard line, or nothing - and leaves the inbox
|
|
10
|
+
|
|
11
|
+
inputs:
|
|
12
|
+
- `gcf/inbox.md`, read through `ai-factory gcf inbox --json`
|
|
13
|
+
|
|
14
|
+
preconditions:
|
|
15
|
+
- `gcf/` exists and the inbox holds entries
|
|
16
|
+
|
|
17
|
+
forbidden_behaviors:
|
|
18
|
+
- do not create an item or erase an entry without the human's yes: the agent proposes, the human approves
|
|
19
|
+
- do not turn a feel complaint into a bug: "jump feels floaty" is a tune of the item that owns the jump, a bug is behaviour that breaks a rule or a test
|
|
20
|
+
- do not open a second item for something `gcf/graveyard.md` already buried: name the line and ask whether the reason still holds
|
|
21
|
+
- do not edit `gcf/inbox.md` by hand: `ai-factory gcf item new --from` and `ai-factory gcf inbox drop` own its lines
|
|
22
|
+
|
|
23
|
+
workflow:
|
|
24
|
+
1. run `ai-factory gcf inbox --json`; read `gcf/LIVE.md` and `gcf/INDEX.md` to know what exists and what is in work
|
|
25
|
+
2. classify each entry: bug, tune of a live or unplayed item, idea for the design, request (an asset file, a question), duplicate, or noise; search `gcf/graveyard.md` for each idea and bug
|
|
26
|
+
3. for each entry propose one call with its fields: a bug gets type `bug`, severity and a repro; a tune names the item and the note; an idea names the subsystem; a duplicate names the item it repeats
|
|
27
|
+
4. present the calls to the human, calls per message <= 5, and apply only the approved ones
|
|
28
|
+
5. a bug or other work: run `ai-factory gcf item new <id> --type <type> [--severity <level>] --from <in-id>`, then write its `intent:` and `repro:`
|
|
29
|
+
6. a tune of an item waiting for its verdict: keep the note for the verdict session and run `ai-factory gcf inbox drop <in-id>`; the note goes in through `/gcf-verdict … tune --note`
|
|
30
|
+
7. an idea for the design: write a unit with `TBD` slots in `gcf/design/<system>.md` and its backlog line, then run `ai-factory gcf inbox drop <in-id>`
|
|
31
|
+
8. a duplicate or noise: run `ai-factory gcf inbox drop <in-id>`
|
|
32
|
+
9. report what each entry became and how many entries remain
|
|
33
|
+
|
|
34
|
+
invocation:
|
|
35
|
+
- run after a playtest session, after a CI run that added entries, or when the user asks to triage
|
|
@@ -1,32 +1,36 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcf-verdict
|
|
3
|
-
description: Record the human
|
|
3
|
+
description: Record the human's verdict on an item waiting for play or unplayed - keep, tune or kill - or the human's decision on a decision item, a bug or a feature. Use after a playtest session or when the user says "вердикт" / "решение".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
mode: human gate
|
|
7
7
|
|
|
8
8
|
purpose:
|
|
9
|
-
- record the human
|
|
9
|
+
- record what the human decided and run the one command that ends or returns the item
|
|
10
10
|
|
|
11
11
|
inputs:
|
|
12
|
-
-
|
|
12
|
+
- an item id and a verdict word (keep, tune, kill) or a decision word (go, no, wontfix, known, close, continue, kill); or nothing, which means "print the playtest list"
|
|
13
13
|
|
|
14
14
|
preconditions:
|
|
15
|
-
- the
|
|
15
|
+
- a verdict: the item is `awaiting-verdict` or `unplayed`, and the human has played the build
|
|
16
|
+
- a decision: the item is `awaiting-decision`, or a bug in `ready`, `blocked` or `parked`, or a feature paused after a child died
|
|
16
17
|
|
|
17
18
|
forbidden_behaviors:
|
|
18
|
-
- do not decide the verdict
|
|
19
|
-
- do not run `keep` when the human has not answered the
|
|
20
|
-
- do not edit systems docs by hand:
|
|
19
|
+
- do not decide the verdict or the decision: the human decides, this skill records
|
|
20
|
+
- do not run `keep` when the human has not answered the item's miss_criterion question
|
|
21
|
+
- do not edit systems docs, `LIVE.md`, history or graveyard by hand: the commands own them
|
|
21
22
|
|
|
22
23
|
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
|
|
25
|
-
3. for `tune` at
|
|
26
|
-
4. for `keep
|
|
27
|
-
5.
|
|
28
|
-
6.
|
|
29
|
-
7.
|
|
24
|
+
1. with no arguments: run `ai-factory gcf playtest` and stop - that list, awaiting-verdict and unplayed items, is the session's playtest sheet
|
|
25
|
+
2. read the item; for a verdict ask the human the miss_criterion question and record the answer in one line
|
|
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
|
+
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
|
|
28
|
+
5. for that keep: strip `contract:` down to paths and entry points and cut `intent:` to the line the subsystem's purpose still lacks; leave an unplayed item as it is - its close froze the body
|
|
29
|
+
6. run `ai-factory gcf verdict <id> <verdict> --note "<answer or reason>"`; a kill creates the removal item for code already in main unless the human says `--no-remove`
|
|
30
|
+
7. for a decision run `ai-factory gcf decide <id> <choice> --reason "<why>"`; `known` parks a bug and lists it in `gcf/LIVE.md` known issues
|
|
31
|
+
8. for a feature whose child died, the human picks: `close` without the child, `continue` with a replacement, or `kill` with its live children
|
|
32
|
+
9. for `keep` on an item touching 2 or more subsystems: read each updated systems doc and report a contradiction between constraints as a D1 question instead of finishing silently
|
|
33
|
+
10. report the commit hash, `git revert <hash>` is the undo, and the id of any removal item the command made
|
|
30
34
|
|
|
31
35
|
invocation:
|
|
32
|
-
- run after a playtest, or with no arguments to print the playtest sheet
|
|
36
|
+
- run after a playtest session, on a human decision, or with no arguments to print the playtest sheet
|
|
@@ -1,33 +1,39 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gcf-vision
|
|
3
|
-
description: Project-start wizard - guided questions that turn a raw game idea into
|
|
3
|
+
description: Project-start wizard - guided questions that turn a raw game idea into gcf/game.md and the first design units with TBD slots. Use when there is no design yet or the user says "начнем игру" / "start a game".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
mode: wizard
|
|
7
7
|
|
|
8
8
|
purpose:
|
|
9
|
-
- turn a raw idea into
|
|
9
|
+
- turn a raw idea into `gcf/game.md` and skeleton units in `gcf/design/` through a guided interview, so the design has a structure from the first day
|
|
10
10
|
|
|
11
11
|
inputs:
|
|
12
12
|
- none: the skill discovers everything by asking the human
|
|
13
13
|
|
|
14
14
|
preconditions:
|
|
15
15
|
- no GDD exists yet; when one exists, route to gcf-debate or gcf-ingest instead
|
|
16
|
+
- `gcf/` exists: run `ai-factory gcf init` first when it does not
|
|
16
17
|
|
|
17
18
|
forbidden_behaviors:
|
|
18
|
-
- do not
|
|
19
|
-
- do not fill an answer the human skipped: write the gap into the draft as an open question
|
|
19
|
+
- do not fill an answer the human skipped: the slot reads `TBD`, and an open fork becomes a D1 question
|
|
20
20
|
- questions per message <= 2: a wall of questions kills the interview
|
|
21
|
+
- do not write a pillar into PILLARS.md: pillar candidates go to the human, and `/gcf-init` writes the file
|
|
22
|
+
|
|
23
|
+
outputs:
|
|
24
|
+
- `gcf/game.md` in the form of `templates/game.md`: logline, platforms, audience, references, scope in and out, milestones
|
|
25
|
+
- one `gcf/design/<system>.md` per subsystem, opening with `# <system>` and `purpose:`, with one `## <id>` unit per mechanic, resource or rule the human named, `source: manual`, every unknown slot `TBD`
|
|
26
|
+
- `gcf/backlog.md` with one `- <id>` line per unit, in the order the human ranks them
|
|
21
27
|
|
|
22
28
|
workflow:
|
|
23
29
|
1. ask about the core: genre, the one-sentence fantasy, and the reference games with "like X, not like Y"
|
|
24
30
|
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.
|
|
28
|
-
6.
|
|
29
|
-
7.
|
|
30
|
-
8. state the next step: `/gcf-debate
|
|
31
|
+
3. ask about scope: platform, session length, solo or multiplayer, art constraints, team size, and the milestones - what the first version must prove
|
|
32
|
+
4. ask what the game is NOT: negative answers seed the pillars and the scope_out list, and cost the least
|
|
33
|
+
5. write `gcf/game.md` from the answers, and read it back to the human for corrections
|
|
34
|
+
6. name the subsystems and the units with the human: each player verb a mechanic, each currency a resource, each invariant a rule; write each unit with the blocks of `templates/design.md` for its type
|
|
35
|
+
7. write `gcf/backlog.md` in the human's ranking, then run `ai-factory gcf design check` and fix every blocking finding
|
|
36
|
+
8. state the next step: `/gcf-init` for the pillars interview, `/gcf-debate` to stress the design, then `/gcf-card <id>` for the first unit
|
|
31
37
|
|
|
32
38
|
invocation:
|
|
33
|
-
- run at project start, before any
|
|
39
|
+
- run at project start, before any design exists
|
package/templates/PILLARS.md
CHANGED
|
@@ -2,7 +2,9 @@ pillars:
|
|
|
2
2
|
- statement: every encounter is readable at a glance
|
|
3
3
|
invariant: no effect ever hides the player character
|
|
4
4
|
review_question: does this change add visual noise over the player
|
|
5
|
+
id: readable-encounters
|
|
5
6
|
|
|
6
7
|
- statement: death is the player's fault, never the camera's
|
|
7
8
|
invariant: no off-screen damage sources
|
|
8
9
|
review_question: can this change hurt the player from outside the view
|
|
10
|
+
id: fair-camera
|
package/templates/backlog.md
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
# Backlog —
|
|
2
|
-
#
|
|
3
|
-
# q: is required with a GDD# src (`ai-factory gcf quotes` checks it); bracketed fields appear only when they apply.
|
|
4
|
-
# Example (a comment, not a candidate):
|
|
5
|
-
# - cand-001 | dash | route: soft (acceptance is the feel of the move) | sys: movement | deps: - | src: GDD#3f2a9c1e | q: "a short dash through enemies" | gaps: refusal, boundaries | a short invulnerable dash
|
|
1
|
+
# Backlog — the order of the units in gcf/design/, one `- <id>` per line, top first. Owned by the human.
|
|
2
|
+
# Every unit of gcf/design/ appears here exactly once: import appends, /gcf-card, gcf done and gcf drop remove.
|
package/templates/config.yml
CHANGED
|
@@ -6,3 +6,10 @@ wip_built_limit: 5
|
|
|
6
6
|
context_budget: 30000
|
|
7
7
|
pillars_budget: 1500
|
|
8
8
|
envelope_default_spread: 0.3
|
|
9
|
+
unplayed_warn_after: 5
|
|
10
|
+
plan_passes: 5
|
|
11
|
+
dod_attempts: 2
|
|
12
|
+
# The project's own commands for the auto DoD (Methodology §6); the engine does not matter.
|
|
13
|
+
dod:
|
|
14
|
+
test:
|
|
15
|
+
build:
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# example-system
|
|
2
|
+
|
|
3
|
+
purpose:
|
|
4
|
+
- holds the example mechanic and the rule it rests on
|
|
5
|
+
|
|
6
|
+
## example-dash
|
|
7
|
+
|
|
8
|
+
type: mechanic
|
|
9
|
+
title: dash
|
|
10
|
+
route: soft (acceptance is the feel of the move)
|
|
11
|
+
system: [example-system]
|
|
12
|
+
milestone: TBD
|
|
13
|
+
pillars: TBD
|
|
14
|
+
depends: [example-grid]
|
|
15
|
+
source: manual
|
|
16
|
+
|
|
17
|
+
intent:
|
|
18
|
+
- the player crosses short gaps without breaking the pace of a fight
|
|
19
|
+
|
|
20
|
+
behavior:
|
|
21
|
+
- input: the player presses X
|
|
22
|
+
state: the character moves a short distance forward
|
|
23
|
+
feedback: TBD
|
|
24
|
+
|
|
25
|
+
refusal:
|
|
26
|
+
- pressing X during the cooldown does nothing
|
|
27
|
+
|
|
28
|
+
boundaries: TBD
|
|
29
|
+
|
|
30
|
+
persistence: none: a dash leaves no state behind
|
|
31
|
+
|
|
32
|
+
feel_like: like Hades, not like Celeste
|
|
33
|
+
|
|
34
|
+
feel:
|
|
35
|
+
- name: duration
|
|
36
|
+
envelope: 0.15..0.25 s
|
|
37
|
+
|
|
38
|
+
constraints:
|
|
39
|
+
- do not add a new input binding
|
|
40
|
+
|
|
41
|
+
miss_criterion: TBD
|
|
42
|
+
|
|
43
|
+
## example-grid
|
|
44
|
+
|
|
45
|
+
type: rule
|
|
46
|
+
title: example grid
|
|
47
|
+
route: hard (a structural invariant, unit-testable)
|
|
48
|
+
system: [example-system]
|
|
49
|
+
milestone: TBD
|
|
50
|
+
pillars: TBD
|
|
51
|
+
depends: none
|
|
52
|
+
source: manual
|
|
53
|
+
|
|
54
|
+
statement:
|
|
55
|
+
- grid cells per side in {4, 6, 8}
|
|
56
|
+
- the grid never scrolls
|
|
57
|
+
|
|
58
|
+
check:
|
|
59
|
+
- a unit test over the level data
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
logline: a short-session puzzle about placing tiles on a small board
|
|
2
|
+
|
|
3
|
+
platforms:
|
|
4
|
+
- web portals and mobile browsers, touch and mouse
|
|
5
|
+
|
|
6
|
+
audience:
|
|
7
|
+
- TBD
|
|
8
|
+
|
|
9
|
+
references:
|
|
10
|
+
- like a tabletop logic puzzle, not like a match-three game
|
|
11
|
+
|
|
12
|
+
scope_in:
|
|
13
|
+
- the core puzzle with one short win animation
|
|
14
|
+
|
|
15
|
+
scope_out:
|
|
16
|
+
- story, cutscenes and dialogue
|
|
17
|
+
|
|
18
|
+
milestones:
|
|
19
|
+
- name: web
|
|
20
|
+
goal: validate the core puzzle on a live audience
|
|
21
|
+
content: campaign levels = 50
|
|
22
|
+
|
|
23
|
+
- name: steam
|
|
24
|
+
goal: a long campaign once the web version proves the puzzle keeps players
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: 3
|
|
3
|
+
id: example
|
|
4
|
+
type: mechanic
|
|
5
|
+
gate: verdict
|
|
6
|
+
status: ready
|
|
7
|
+
system: [example-system]
|
|
8
|
+
depends: []
|
|
9
|
+
pillars: []
|
|
10
|
+
source: manual
|
|
11
|
+
tune_count: 0
|
|
12
|
+
since: null
|
|
13
|
+
live:
|
|
14
|
+
changes:
|
|
15
|
+
- id: example
|
|
16
|
+
change: added
|
|
17
|
+
summary: A short dash forward between fights.
|
|
18
|
+
refs: gcf/systems/example-system.md
|
|
19
|
+
created: "2026-01-01"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
intent:
|
|
23
|
+
- the player crosses short gaps without breaking the pace of a fight
|
|
24
|
+
|
|
25
|
+
behavior:
|
|
26
|
+
- input: the player presses X
|
|
27
|
+
state: the character moves a short distance forward
|
|
28
|
+
feedback: the screen shows a short trail behind the character
|
|
29
|
+
|
|
30
|
+
refusal:
|
|
31
|
+
- pressing X during the cooldown does nothing and plays no sound
|
|
32
|
+
|
|
33
|
+
boundaries:
|
|
34
|
+
- a dash into a wall stops at the wall
|
|
35
|
+
|
|
36
|
+
persistence: none: a dash leaves no state behind
|
|
37
|
+
|
|
38
|
+
feel_like: like Hades, not like Celeste
|
|
39
|
+
|
|
40
|
+
feel:
|
|
41
|
+
- name: duration
|
|
42
|
+
envelope: 0.15..0.25 s
|
|
43
|
+
|
|
44
|
+
- name: cooldown
|
|
45
|
+
envelope: 0.4..0.8 s
|
|
46
|
+
|
|
47
|
+
contract:
|
|
48
|
+
- new components and systems live under Assets/Scripts/Example/
|
|
49
|
+
- data flows from input to simulation, never backwards
|
|
50
|
+
|
|
51
|
+
interactions:
|
|
52
|
+
- none: this example crosses no existing mechanic
|
|
53
|
+
|
|
54
|
+
constraints:
|
|
55
|
+
- do not add a new input binding
|
|
56
|
+
- no per-frame allocations
|
|
57
|
+
|
|
58
|
+
miss_criterion: does the move feel responsive on the first try
|