gcf-aif-ext 0.2.4 → 0.2.7
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 +4 -2
- package/commands/gcf.js +267 -58
- package/extension.json +1 -1
- package/hooks/pre-commit.js +28 -14
- package/injections/review-pillars.md +1 -1
- package/lib/anchors.js +108 -10
- package/lib/audit-core.js +136 -41
- package/lib/context.js +54 -36
- package/lib/frontmatter.js +2 -1
- package/lib/gcf-paths.js +14 -3
- package/lib/git.js +22 -4
- package/lib/id.js +2 -0
- package/lib/index-gen.js +33 -15
- package/lib/linter.js +79 -41
- package/lib/safe-path.js +23 -4
- package/lib/transitions.js +1 -3
- package/lib/validate-card.js +42 -8
- package/lib/verdict-fs.js +124 -61
- package/package.json +1 -1
- package/skills/gcf-adopt/SKILL.md +2 -2
- package/skills/gcf-card/SKILL.md +11 -10
- package/skills/gcf-debate/SKILL.md +1 -1
- package/skills/gcf-ingest/SKILL.md +24 -13
- package/skills/gcf-init/SKILL.md +9 -8
- package/skills/gcf-verdict/SKILL.md +1 -1
- package/templates/backlog.md +4 -3
package/skills/gcf-card/SKILL.md
CHANGED
|
@@ -15,21 +15,22 @@ preconditions:
|
|
|
15
15
|
- `gcf/` exists; `gcf/INDEX.md` lists the current subsystems
|
|
16
16
|
|
|
17
17
|
forbidden_behaviors:
|
|
18
|
-
- do not invent a new subsystem name when INDEX carries a synonym: reuse or ask
|
|
18
|
+
- do not invent a new subsystem name when INDEX carries a synonym: reuse or ask
|
|
19
19
|
- do not write numbers outside the feel slot envelopes
|
|
20
20
|
- do not put `until:` in the frontmatter: it is a line annotation inside slots
|
|
21
21
|
- do not fill a slot with a guess: an unknown goes to `gcf/open-questions.md`, marked D1 or D2
|
|
22
22
|
|
|
23
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
|
|
25
|
-
2.
|
|
26
|
-
3.
|
|
27
|
-
4.
|
|
28
|
-
5.
|
|
29
|
-
6. fill the
|
|
30
|
-
7.
|
|
31
|
-
8.
|
|
32
|
-
9.
|
|
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 line in the backlog header format and stop
|
|
25
|
+
2. for an `impl?` line ask the human first whether the mechanic already ships; for a `src-changed` line rebuild the candidate from `ai-factory gcf section` over its `src:` anchor
|
|
26
|
+
3. 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, start from the line's `route:` reason, and let the human veto
|
|
27
|
+
4. 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
|
|
28
|
+
5. 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
|
|
29
|
+
6. fill the frontmatter: status proposed, route, system list from the INDEX vocabulary, depends from cards this feature builds on, source, created
|
|
30
|
+
7. fill the six slots with the human: behavior, contract, feel (comparison + envelopes), interactions, constraints, miss_criterion; ask each `gaps:` lens of the line here
|
|
31
|
+
8. when the card came from a candidate, delete that candidate line from `gcf/backlog.md`
|
|
32
|
+
9. run `ai-factory gcf index`, then `npx cnlp check`, and fix what they report
|
|
33
|
+
10. report the card path and the one question the playtest will answer
|
|
33
34
|
|
|
34
35
|
invocation:
|
|
35
36
|
- run when work starts on a feature or the user names a candidate to materialize
|
|
@@ -21,7 +21,7 @@ forbidden_behaviors:
|
|
|
21
21
|
|
|
22
22
|
workflow:
|
|
23
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
|
|
24
|
+
2. play each completeness lens as its own expert over each mechanic: state, input, feedback, refusal, boundaries, persistence
|
|
25
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
26
|
4. cross-examine: for each pair of findings that touch one anchor, check whether they contradict each other and merge or escalate
|
|
27
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
|
|
@@ -16,23 +16,34 @@ preconditions:
|
|
|
16
16
|
- the sequential pass below is the correctness reference; the parallel fan-out belongs to the harness
|
|
17
17
|
|
|
18
18
|
forbidden_behaviors:
|
|
19
|
-
- do not create card files: candidates are backlog lines, a card materializes only
|
|
19
|
+
- do not create card files: candidates are backlog lines, and a card file materializes only when `/gcf-card` pulls a candidate into work
|
|
20
20
|
- do not write a pillar into PILLARS.md: pillar candidates go to open-questions as D1
|
|
21
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:
|
|
22
|
+
- 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 spread
|
|
24
|
+
|
|
25
|
+
outputs:
|
|
26
|
+
- a backlog line: `- <cand-id> | <name> | route: soft|hard (<why>) | sys: <system> | deps: <ids or -> | src: GDD#<anchor> | q: "<verbatim quote>" | <description>`
|
|
27
|
+
- optional backlog fields go before the description, only when they apply: `gaps: <lenses>`, `impl?`, `src-changed`, `orphan`
|
|
28
|
+
- a question record in `gcf/open-questions.md`: `- id: q-NNN`, then `lens:`, `sections:`, `sys:`, `class: D1|D2`, `question:`, `proposed:`, each on its own indented line
|
|
29
|
+
- a D2 record adds `assumed:` (what the agent took as given) and `until:` (when it expires, in the `verdict(card-id)`, `retune(system)` or `manual(text)` form)
|
|
23
30
|
|
|
24
31
|
workflow:
|
|
25
|
-
1.
|
|
26
|
-
2.
|
|
27
|
-
3.
|
|
28
|
-
4.
|
|
29
|
-
5.
|
|
30
|
-
6.
|
|
31
|
-
7.
|
|
32
|
-
8.
|
|
33
|
-
9.
|
|
34
|
-
10.
|
|
35
|
-
11.
|
|
32
|
+
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 11
|
|
34
|
+
3. 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
|
|
35
|
+
4. 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:`, not as candidates
|
|
36
|
+
5. copy each quote verbatim from the section `ai-factory gcf section` prints; write a unit with no such quote as a D1 record with lens `provenance`, not a candidate
|
|
37
|
+
6. classify each number before an envelope: a tunable value (duration, speed, damage, cost, rate) gets value ± `envelope_default_spread` from `gcf/config.yml`
|
|
38
|
+
7. round both envelope bounds of an integer to integers, at least 1 apart from the value; leave counts (50 levels), hard limits and performance thresholds exact
|
|
39
|
+
8. write each envelope as a D2 record with `assumed:` and `until: manual(materialization of <cand-id>)`; an exact limit or threshold goes into the candidate description and leans the route to hard
|
|
40
|
+
9. route each candidate: hard when the agent can verify acceptance alone (data format, protocol, structural invariant, numeric performance threshold), soft when acceptance is a playtest; doubt -> soft
|
|
41
|
+
10. run the completeness lenses per candidate into `gaps:`, then the coherence lenses over the set; build the interaction matrix and record `deps:` between candidates from it
|
|
42
|
+
11. on a re-import apply the delta: added -> new candidates; changed -> `src-changed`, D1 when an open card or collapsed system cites the anchor; removed -> `orphan`; renamed -> rewrite the anchor in place
|
|
43
|
+
12. mark a candidate whose nouns match the `purpose` or the `code` paths of an existing systems doc with `impl?`: the mechanic may already ship, and the human deletes the line
|
|
44
|
+
13. write candidate lines into `gcf/backlog.md` and records into `gcf/open-questions.md`; run `ai-factory gcf quotes`, move each flagged line to a D1 with lens `provenance`, then run `ai-factory gcf index`
|
|
45
|
+
14. report the package, ordered: D1 questions (the main product), pillar candidates, dictionary conflicts, backlog summary with the top crossing candidates, D2 assumptions; say when `impl?` was blind
|
|
46
|
+
15. state the next step: answer D1s, confirm pillars, then pull the first candidate with `/gcf-card`
|
|
36
47
|
|
|
37
48
|
invocation:
|
|
38
49
|
- run when a GDD arrives or changes
|
package/skills/gcf-init/SKILL.md
CHANGED
|
@@ -16,17 +16,18 @@ preconditions:
|
|
|
16
16
|
|
|
17
17
|
forbidden_behaviors:
|
|
18
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
|
|
19
|
+
- do not write pillars the human did not confirm: pillar authorship is human
|
|
20
20
|
- pillar count <= 7, and do not pad the list to reach 7
|
|
21
21
|
|
|
22
22
|
workflow:
|
|
23
|
-
1.
|
|
24
|
-
2.
|
|
25
|
-
3.
|
|
26
|
-
4.
|
|
27
|
-
5.
|
|
28
|
-
6.
|
|
29
|
-
7.
|
|
23
|
+
1. when `.ai-factory/DESCRIPTION.md` is absent, tell the human to run `/aif` first: `aif-plan` reads it, and a card cannot reach a plan without it
|
|
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
|
|
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
|
|
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
|
|
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: fill `gcf/backlog.md` with candidates by hand or import a GDD with `/gcf-ingest`
|
|
30
31
|
|
|
31
32
|
invocation:
|
|
32
33
|
- run when the user asks to set up gcf in a project
|
|
@@ -22,7 +22,7 @@ forbidden_behaviors:
|
|
|
22
22
|
workflow:
|
|
23
23
|
1. with no arguments: run `ai-factory gcf playtest` and stop - that list is the session's playtest sheet
|
|
24
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
|
|
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
|
|
26
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
27
|
5. run `ai-factory gcf verdict <card-id> <verdict> --note "<answer or reason>"`
|
|
28
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
|
package/templates/backlog.md
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
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#
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
# Format: - <cand-id> | <name> | route: soft|hard (<why, one line>) | sys: <system> | deps: <ids or -> | src: <GDD#anchor|manual> | q: "<verbatim quote>" | [gaps: <lenses>] | [impl?] | [src-changed] | [orphan] | <one-line description>
|
|
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
|