gcf-aif-ext 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/commands/gcf.js +173 -0
- package/extension.json +24 -0
- package/hooks/pre-commit.js +91 -0
- package/injections/commit-status.md +6 -0
- package/injections/plan-context.md +8 -0
- package/injections/review-pillars.md +7 -0
- package/lib/anchors.js +109 -0
- package/lib/audit-core.js +102 -0
- package/lib/context.js +77 -0
- package/lib/frontmatter.js +26 -0
- package/lib/gcf-paths.js +60 -0
- package/lib/git.js +19 -0
- package/lib/id.js +42 -0
- package/lib/index-gen.js +51 -0
- package/lib/linter.js +61 -0
- package/lib/playtest-list.js +13 -0
- package/lib/safe-path.js +71 -0
- package/lib/transitions.js +30 -0
- package/lib/validate-card.js +48 -0
- package/lib/verdict-fs.js +126 -0
- package/node_modules/cnlp-kit/CHANGELOG.md +625 -0
- package/node_modules/cnlp-kit/LICENSE +21 -0
- package/node_modules/cnlp-kit/README.md +242 -0
- package/node_modules/cnlp-kit/bin/cnlp.js +334 -0
- package/node_modules/cnlp-kit/cnlp-format.md +470 -0
- package/node_modules/cnlp-kit/package.json +40 -0
- package/node_modules/cnlp-kit/profiles/adr.md +129 -0
- package/node_modules/cnlp-kit/profiles/api.md +87 -0
- package/node_modules/cnlp-kit/profiles/concept.md +70 -0
- package/node_modules/cnlp-kit/profiles/docset.md +103 -0
- package/node_modules/cnlp-kit/profiles/guide.md +51 -0
- package/node_modules/cnlp-kit/profiles/profile.md +69 -0
- package/node_modules/cnlp-kit/profiles/reference.md +61 -0
- package/node_modules/cnlp-kit/profiles/skill.md +75 -0
- package/node_modules/cnlp-kit/profiles/task.md +65 -0
- package/node_modules/cnlp-kit/quality-rules.md +69 -0
- package/node_modules/cnlp-kit/skills/cnlp-docset/SKILL.md +73 -0
- package/node_modules/cnlp-kit/skills/cnlp-migrate/SKILL.md +64 -0
- package/node_modules/cnlp-kit/src/cnlp.js +534 -0
- package/node_modules/cnlp-kit/src/config.js +352 -0
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +172 -0
- package/node_modules/yaml/bin.mjs +11 -0
- package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +226 -0
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/node_modules/yaml/browser/dist/errors.js +57 -0
- package/node_modules/yaml/browser/dist/index.js +17 -0
- package/node_modules/yaml/browser/dist/log.js +11 -0
- package/node_modules/yaml/browser/dist/nodes/Alias.js +118 -0
- package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/node_modules/yaml/browser/dist/util.js +11 -0
- package/node_modules/yaml/browser/dist/visit.js +233 -0
- package/node_modules/yaml/browser/index.js +5 -0
- package/node_modules/yaml/browser/package.json +3 -0
- package/node_modules/yaml/dist/cli.d.ts +8 -0
- package/node_modules/yaml/dist/cli.mjs +201 -0
- package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/node_modules/yaml/dist/compose/composer.js +224 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +228 -0
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/node_modules/yaml/dist/doc/Document.js +337 -0
- package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/node_modules/yaml/dist/doc/directives.js +178 -0
- package/node_modules/yaml/dist/errors.d.ts +21 -0
- package/node_modules/yaml/dist/errors.js +62 -0
- package/node_modules/yaml/dist/index.d.ts +25 -0
- package/node_modules/yaml/dist/index.js +50 -0
- package/node_modules/yaml/dist/log.d.ts +3 -0
- package/node_modules/yaml/dist/log.js +19 -0
- package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/Alias.js +120 -0
- package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/node_modules/yaml/dist/options.d.ts +350 -0
- package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/node_modules/yaml/dist/parse/cst.js +112 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/node_modules/yaml/dist/parse/parser.js +980 -0
- package/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/node_modules/yaml/dist/public-api.js +107 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/node_modules/yaml/dist/schema/tags.js +99 -0
- package/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/node_modules/yaml/dist/test-events.js +134 -0
- package/node_modules/yaml/dist/util.d.ts +16 -0
- package/node_modules/yaml/dist/util.js +28 -0
- package/node_modules/yaml/dist/visit.d.ts +102 -0
- package/node_modules/yaml/dist/visit.js +236 -0
- package/node_modules/yaml/package.json +97 -0
- package/node_modules/yaml/util.js +2 -0
- package/package.json +54 -0
- package/profiles/card.md +65 -0
- package/profiles/pillars.md +31 -0
- package/profiles/system.md +56 -0
- package/schemas/card.schema.json +30 -0
- package/skills/gcf-adopt/SKILL.md +41 -0
- package/skills/gcf-audit/SKILL.md +27 -0
- package/skills/gcf-card/SKILL.md +35 -0
- package/skills/gcf-debate/SKILL.md +33 -0
- package/skills/gcf-ingest/SKILL.md +38 -0
- package/skills/gcf-init/SKILL.md +32 -0
- package/skills/gcf-verdict/SKILL.md +32 -0
- package/skills/gcf-vision/SKILL.md +33 -0
- package/templates/PILLARS.md +8 -0
- package/templates/backlog.md +4 -0
- package/templates/card.md +34 -0
- package/templates/cnlp.config.json +8 -0
- package/templates/config.yml +8 -0
- package/templates/system.md +22 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api
|
|
3
|
+
description: The CNL-P profile of an API page — one capability of a library, the symbols that spell it, its contract, and 1 example.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: an API page is one flat run of blocks, and the file name carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: an API page is reached through the index, which already carries its name
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: an API page has no frontmatter, so nothing is exempt
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: purpose
|
|
21
|
+
form: bullet-list
|
|
22
|
+
required: yes
|
|
23
|
+
note: what the capability is for, and the question a reader arrives with
|
|
24
|
+
|
|
25
|
+
- key: symbols
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: yes
|
|
28
|
+
note: the exact symbols covered; a group of overloads is 1 page, because a reader picks between them once and then stops reading
|
|
29
|
+
|
|
30
|
+
- key: signature
|
|
31
|
+
form: keyed-block
|
|
32
|
+
required: yes
|
|
33
|
+
note: the declarations verbatim in a fenced block, in the language of the library
|
|
34
|
+
|
|
35
|
+
- key: parameters
|
|
36
|
+
form: record-list
|
|
37
|
+
required: no
|
|
38
|
+
record_keys: name, means
|
|
39
|
+
optional_record_keys: type, default
|
|
40
|
+
note: only what a reader cannot read off the signature; a parameter whose name states its meaning costs a line and adds nothing
|
|
41
|
+
|
|
42
|
+
- key: returns
|
|
43
|
+
form: bullet-list
|
|
44
|
+
required: no
|
|
45
|
+
note: what comes back, and what a caller does with it
|
|
46
|
+
|
|
47
|
+
- key: errors
|
|
48
|
+
form: bullet-list
|
|
49
|
+
required: no
|
|
50
|
+
note: what fails, and the condition that causes it
|
|
51
|
+
|
|
52
|
+
- key: constraints
|
|
53
|
+
form: bullet-list
|
|
54
|
+
required: no
|
|
55
|
+
note: what a caller cannot violate, each as a limit or as a state that holds before the call
|
|
56
|
+
|
|
57
|
+
- key: choose
|
|
58
|
+
form: record-list
|
|
59
|
+
required: no
|
|
60
|
+
record_keys: when, use
|
|
61
|
+
note: the rule for picking between the symbols above; a page covering 1 symbol deletes this block
|
|
62
|
+
|
|
63
|
+
- key: example
|
|
64
|
+
form: keyed-block
|
|
65
|
+
required: yes
|
|
66
|
+
record_keys: shows
|
|
67
|
+
note: 1 canonical use, with shows stating what it demonstrates, written in the names the set's running example uses; a compositional example is a task page, not a second example here
|
|
68
|
+
|
|
69
|
+
- key: pitfalls
|
|
70
|
+
form: bullet-list
|
|
71
|
+
required: no
|
|
72
|
+
note: what a reader writes wrong, each with what to write instead
|
|
73
|
+
|
|
74
|
+
- key: see_also
|
|
75
|
+
form: record-list
|
|
76
|
+
required: yes
|
|
77
|
+
record_keys: page, relation, reason
|
|
78
|
+
record_values: relation = needs, next, alternative, detail, supersedes
|
|
79
|
+
note: relation is needs, next, alternative, detail or supersedes; reason lets a reader decide without opening the page, and supersedes names a page of another docset that replaces this one
|
|
80
|
+
|
|
81
|
+
custom_sections:
|
|
82
|
+
- none: a project fills this from the vocabulary its own API pages already use
|
|
83
|
+
|
|
84
|
+
enforcement:
|
|
85
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
86
|
+
- any issue is an error: an API page is read as the contract of a call a reader is about to write
|
|
87
|
+
- `npx cnlp check` resolves every `page:` value, and reports a page no other page reaches, once the project declares `docsets:`
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concept
|
|
3
|
+
description: The CNL-P profile of a concept page — one model a reader holds before the API pages that rest on it read correctly.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: a concept page is one flat run of blocks, and the file name carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: a concept page is reached through the index, which already carries its name
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: a concept page has no frontmatter, so nothing is exempt
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: purpose
|
|
21
|
+
form: bullet-list
|
|
22
|
+
required: yes
|
|
23
|
+
note: what the model explains, and which pages stop reading correctly without it
|
|
24
|
+
|
|
25
|
+
- key: model
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: yes
|
|
28
|
+
note: what the thing is, 1 statement per line, in the reader's terms rather than in the library's internals
|
|
29
|
+
|
|
30
|
+
- key: terms
|
|
31
|
+
form: record-list
|
|
32
|
+
required: no
|
|
33
|
+
record_keys: term, means
|
|
34
|
+
note: a word the library uses in its own sense; a word that means what it usually means costs a line and adds nothing
|
|
35
|
+
|
|
36
|
+
- key: invariants
|
|
37
|
+
form: bullet-list
|
|
38
|
+
required: yes
|
|
39
|
+
note: what a caller cannot violate, and what breaks when it does; this is the block an API page points back to instead of restating
|
|
40
|
+
|
|
41
|
+
- key: lifecycle
|
|
42
|
+
form: numbered-list
|
|
43
|
+
required: no
|
|
44
|
+
note: the order of states, for a thing a caller creates, drives and releases
|
|
45
|
+
|
|
46
|
+
- key: example
|
|
47
|
+
form: keyed-block
|
|
48
|
+
required: yes
|
|
49
|
+
record_keys: shows
|
|
50
|
+
note: 1 canonical use, with shows stating what it demonstrates, written in the names the set's running example uses so the 2 compose
|
|
51
|
+
|
|
52
|
+
- key: pitfalls
|
|
53
|
+
form: bullet-list
|
|
54
|
+
required: no
|
|
55
|
+
note: what a reader gets wrong about the model, each with what holds instead
|
|
56
|
+
|
|
57
|
+
- key: see_also
|
|
58
|
+
form: record-list
|
|
59
|
+
required: yes
|
|
60
|
+
record_keys: page, relation, reason
|
|
61
|
+
record_values: relation = needs, next, alternative, detail, supersedes
|
|
62
|
+
note: relation is needs, next, alternative, detail or supersedes; reason lets a reader decide without opening the page, and supersedes names a page of another docset that replaces this one
|
|
63
|
+
|
|
64
|
+
custom_sections:
|
|
65
|
+
- none: a project fills this from the vocabulary its own concept pages already use
|
|
66
|
+
|
|
67
|
+
enforcement:
|
|
68
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
69
|
+
- any issue is an error: a concept page is what every API page resting on it points to
|
|
70
|
+
- `npx cnlp check` resolves every `page:` value, and reports a page no other page reaches, once the project declares `docsets:`
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docset
|
|
3
|
+
description: The CNL-P profile of a docset index — the entry page of a library's agent documentation, and the closed list of what that library offers.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: imperative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: an index is one flat run of blocks, and the file name carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: an index is read by path, so it carries no routing contract to restate
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: an index has no frontmatter, so nothing is exempt
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: identity
|
|
21
|
+
form: keyed-block
|
|
22
|
+
required: yes
|
|
23
|
+
record_keys: library, version, source
|
|
24
|
+
optional_record_keys: derived_from
|
|
25
|
+
note: the library covered and the revision it was read at; derived_from names what the pages were written from, because a page written from prose carries less weight than one written from a signature
|
|
26
|
+
|
|
27
|
+
- key: purpose
|
|
28
|
+
form: bullet-list
|
|
29
|
+
required: yes
|
|
30
|
+
note: what the library does, and the kind of task a reader reaches for it with
|
|
31
|
+
|
|
32
|
+
- key: read_protocol
|
|
33
|
+
form: numbered-list
|
|
34
|
+
required: yes
|
|
35
|
+
note: how to walk this docset: the common case is written from `canonical_use:`, a page opens for any call whose contract the reader lacks, and a step telling the reader to stop reading is the defect
|
|
36
|
+
|
|
37
|
+
- key: install
|
|
38
|
+
form: bullet-list
|
|
39
|
+
required: no
|
|
40
|
+
note: how a project takes the dependency; delete the block when the docset covers a dependency the project already carries
|
|
41
|
+
|
|
42
|
+
- key: canonical_use
|
|
43
|
+
form: keyed-block
|
|
44
|
+
required: yes
|
|
45
|
+
record_keys: shows
|
|
46
|
+
note: 1 complete working use of the library, carrying every load-bearing element; a reader holding only the index writes the common case from this block, and an index without one is a table of contents, which is enough for nothing
|
|
47
|
+
|
|
48
|
+
- key: walkthrough
|
|
49
|
+
form: record-list
|
|
50
|
+
required: yes
|
|
51
|
+
record_keys: part, page
|
|
52
|
+
note: each part of `canonical_use:` and the page owning its detail; a record and not a comment inside the fence, because a fence is opaque and a link inside one reaches no reader and no check
|
|
53
|
+
|
|
54
|
+
- key: concepts
|
|
55
|
+
form: record-list
|
|
56
|
+
required: yes
|
|
57
|
+
record_keys: page, does
|
|
58
|
+
note: the models a reader holds before any page reads correctly; a record and not a line, so every link in a docset is a `page:` value and a resolver guesses at none of them
|
|
59
|
+
|
|
60
|
+
- key: tasks
|
|
61
|
+
form: record-list
|
|
62
|
+
required: yes
|
|
63
|
+
record_keys: page, does
|
|
64
|
+
note: the goals a reader arrives with; a catalog keyed on capability routes a reader holding a symbol and leaves one holding a goal to guess
|
|
65
|
+
|
|
66
|
+
- key: catalog
|
|
67
|
+
form: record-list
|
|
68
|
+
required: yes
|
|
69
|
+
record_keys: capability, does, status
|
|
70
|
+
optional_record_keys: page, read, instead, fingerprint
|
|
71
|
+
record_values: status = covered, source, avoid
|
|
72
|
+
note: "every capability the library offers, in 1 record each; status is covered, source or avoid, and a symbol absent here is a symbol the library lacks; fingerprint changes when the source does, so a record without one cannot report drift"
|
|
73
|
+
|
|
74
|
+
- key: excluded
|
|
75
|
+
form: bullet-list
|
|
76
|
+
required: yes
|
|
77
|
+
note: a whole region the docset leaves out, with the reason; a region named in neither this block nor the catalog reads as an omission nobody decided
|
|
78
|
+
|
|
79
|
+
- key: companions
|
|
80
|
+
form: record-list
|
|
81
|
+
required: yes
|
|
82
|
+
record_keys: docset, when, owns
|
|
83
|
+
note: another docset covering what this library does not; `when:` is "always" once its index carries `overrides:`, since a reader loading it on demand misses the correction; "- none" when the library stands alone
|
|
84
|
+
|
|
85
|
+
- key: overrides
|
|
86
|
+
form: record-list
|
|
87
|
+
required: no
|
|
88
|
+
record_keys: page, by, reason
|
|
89
|
+
note: "a page of another docset that stops holding once this package is present, and the page here that replaces it; `page:` names the foreign page and carries its docset prefix, `by:` names the local one and carries none"
|
|
90
|
+
|
|
91
|
+
- key: version_notes
|
|
92
|
+
form: bullet-list
|
|
93
|
+
required: no
|
|
94
|
+
note: what changed in the covered version, for a reader arriving from an older one
|
|
95
|
+
|
|
96
|
+
custom_sections:
|
|
97
|
+
- none: a project fills this from the vocabulary its own docsets already use
|
|
98
|
+
|
|
99
|
+
enforcement:
|
|
100
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
101
|
+
- any issue is an error: an index routes every other page, so a wrong index misroutes the whole docset
|
|
102
|
+
- `npx cnlp check` resolves every `page:`, `by:` and `docset:` value once the project declares `docsets:`
|
|
103
|
+
- `npx cnlp check` holds `status` to covered, source and avoid; what a status implies — a `read:` on source, an `instead:` on avoid — is caught by review
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: guide
|
|
3
|
+
description: The CNL-P profile of a repository guide — the sections AGENTS.md uses to tell an agent how to edit this repository, in order.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: imperative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: a guide is one flat run of sections, and the file name carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: a guide is read by path, so it carries no routing contract to restate
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: a guide has no frontmatter, so nothing is exempt
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: purpose
|
|
21
|
+
form: bullet-list
|
|
22
|
+
required: yes
|
|
23
|
+
note: what the file governs, and when to read it
|
|
24
|
+
|
|
25
|
+
- key: read_first
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: no
|
|
28
|
+
note: what an editor has to understand before the first edit, such as which file is the authority on what
|
|
29
|
+
|
|
30
|
+
- key: workflow
|
|
31
|
+
form: numbered-list
|
|
32
|
+
required: no
|
|
33
|
+
note: the order of work for the edit this guide governs
|
|
34
|
+
|
|
35
|
+
- key: forbidden_behaviors
|
|
36
|
+
form: bullet-list
|
|
37
|
+
required: no
|
|
38
|
+
note: what an edit never does, each with the reason it breaks something
|
|
39
|
+
|
|
40
|
+
- key: verification
|
|
41
|
+
form: bullet-list
|
|
42
|
+
required: no
|
|
43
|
+
note: the command that proves the edit conforms, and how its output is read
|
|
44
|
+
|
|
45
|
+
custom_sections:
|
|
46
|
+
- none: a project fills this from the vocabulary its own guide already uses
|
|
47
|
+
|
|
48
|
+
enforcement:
|
|
49
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
50
|
+
- any issue is an error: a guide is read before an agent edits the corpus, so a wrong guide corrupts every file that follows
|
|
51
|
+
- a repository without Node holds this profile by review against the standard instead
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: profile
|
|
3
|
+
description: The CNL-P profile of a profile — the blocks profiles/<name>.md declares, in order.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: declarative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: a profile is one flat run of blocks
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- name
|
|
15
|
+
- description
|
|
16
|
+
|
|
17
|
+
lexicon_exempt:
|
|
18
|
+
- none: a profile is read by whoever writes a document of the kind it describes
|
|
19
|
+
|
|
20
|
+
sections:
|
|
21
|
+
- key: format
|
|
22
|
+
form: scalar
|
|
23
|
+
required: yes
|
|
24
|
+
note: the standard this profile's documents obey, by path
|
|
25
|
+
|
|
26
|
+
- key: mood
|
|
27
|
+
form: scalar
|
|
28
|
+
required: yes
|
|
29
|
+
note: imperative or declarative; the register the body is written in, and the value that gates the active-voice rule
|
|
30
|
+
|
|
31
|
+
- key: headings
|
|
32
|
+
form: bullet-list
|
|
33
|
+
required: yes
|
|
34
|
+
note: the ## headings in order, or "- none" for a flat body
|
|
35
|
+
|
|
36
|
+
- key: frontmatter_fields
|
|
37
|
+
form: bullet-list
|
|
38
|
+
required: yes
|
|
39
|
+
note: the fields the body may not restate
|
|
40
|
+
|
|
41
|
+
- key: lexicon_exempt
|
|
42
|
+
form: bullet-list
|
|
43
|
+
required: yes
|
|
44
|
+
note: frontmatter fields the lexicon does not police; frontmatter is not checked, so this is for the reader
|
|
45
|
+
|
|
46
|
+
- key: sections
|
|
47
|
+
form: record-list
|
|
48
|
+
required: yes
|
|
49
|
+
record_keys: key, form, required
|
|
50
|
+
optional_record_keys: heading, record_keys, optional_record_keys, record_values, note
|
|
51
|
+
note: the blocks in order, held to §7 of the format; form is one of the 5 in the format, required is yes or no, and record_values closes a record key to a vocabulary
|
|
52
|
+
|
|
53
|
+
- key: custom_sections
|
|
54
|
+
form: bullet-list
|
|
55
|
+
required: yes
|
|
56
|
+
note: names a document of this kind may add, or "- none"
|
|
57
|
+
|
|
58
|
+
- key: enforcement
|
|
59
|
+
form: bullet-list
|
|
60
|
+
required: yes
|
|
61
|
+
note: the command or test that checks this profile, and its severity
|
|
62
|
+
|
|
63
|
+
custom_sections:
|
|
64
|
+
- none: a profile declares values, so a block outside this list is a rule that escaped the format
|
|
65
|
+
|
|
66
|
+
enforcement:
|
|
67
|
+
- `npm test` (`test/profile.test.js`), over every file in `profiles/`
|
|
68
|
+
- any issue is an error: a profile that is wrong makes every document of its kind wrong
|
|
69
|
+
- this file is checked against itself; nothing checks that, and the recursion stops here
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reference
|
|
3
|
+
description: The CNL-P profile of a reference file — the sections a checklist or a protocol under references/ uses, in order.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: imperative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: a reference file is one flat run of sections, and the file name carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: a reference file is read by path, so it carries no routing contract to restate
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: a reference file has no frontmatter, so nothing is exempt
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: purpose
|
|
21
|
+
form: bullet-list
|
|
22
|
+
required: yes
|
|
23
|
+
note: what the file is loaded for, and when
|
|
24
|
+
|
|
25
|
+
- key: scope
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: no
|
|
28
|
+
note: what this file owns, and which file owns a neighbouring topic
|
|
29
|
+
|
|
30
|
+
- key: read_first
|
|
31
|
+
form: bullet-list
|
|
32
|
+
required: no
|
|
33
|
+
note: the terms and gates a `checks:` item depends on, when reading an item alone would misfire
|
|
34
|
+
|
|
35
|
+
- key: workflow
|
|
36
|
+
form: numbered-list
|
|
37
|
+
required: no
|
|
38
|
+
note: how to find the patterns, before the block that names them; a checklist with nothing to run deletes this block
|
|
39
|
+
|
|
40
|
+
- key: checks
|
|
41
|
+
form: bullet-list
|
|
42
|
+
required: no
|
|
43
|
+
note: "a project states the line form a `checks:` item takes, and holds it by a test of its own until the format can declare it"
|
|
44
|
+
|
|
45
|
+
- key: non_findings
|
|
46
|
+
form: bullet-list
|
|
47
|
+
required: no
|
|
48
|
+
note: patterns the reader would otherwise flag, each with the reason it is not a finding
|
|
49
|
+
|
|
50
|
+
- key: forbidden_behaviors
|
|
51
|
+
form: bullet-list
|
|
52
|
+
required: no
|
|
53
|
+
note: when the file drives a change rather than a review
|
|
54
|
+
|
|
55
|
+
custom_sections:
|
|
56
|
+
- none: a project fills this from the vocabulary its own reference files already use
|
|
57
|
+
|
|
58
|
+
enforcement:
|
|
59
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
60
|
+
- any issue is an error: a reference file is read as executable instructions, so there is no draft state to warn about
|
|
61
|
+
- a repository without Node holds this profile by review against the standard instead
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill
|
|
3
|
+
description: The CNL-P profile of an agent skill — the sections a SKILL.md body uses, in order.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: imperative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: a skill body is one flat run of sections, and frontmatter `name` carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- name
|
|
15
|
+
- description
|
|
16
|
+
|
|
17
|
+
lexicon_exempt:
|
|
18
|
+
- description: it feeds skill routing and needs the phrasing an operator would actually use
|
|
19
|
+
|
|
20
|
+
sections:
|
|
21
|
+
- key: mode
|
|
22
|
+
form: scalar
|
|
23
|
+
required: yes
|
|
24
|
+
note: a human label; no machine consumer reads it
|
|
25
|
+
|
|
26
|
+
- key: purpose
|
|
27
|
+
form: bullet-list
|
|
28
|
+
required: yes
|
|
29
|
+
|
|
30
|
+
- key: inputs
|
|
31
|
+
form: bullet-list
|
|
32
|
+
required: yes
|
|
33
|
+
note: "- none with the reason when the skill discovers its own"
|
|
34
|
+
|
|
35
|
+
- key: preconditions
|
|
36
|
+
form: bullet-list
|
|
37
|
+
required: no
|
|
38
|
+
note: when state must hold before step 1
|
|
39
|
+
|
|
40
|
+
- key: scope
|
|
41
|
+
form: bullet-list
|
|
42
|
+
required: no
|
|
43
|
+
note: only when workflow does not already bound it
|
|
44
|
+
|
|
45
|
+
- key: forbidden_behaviors
|
|
46
|
+
form: bullet-list
|
|
47
|
+
required: no
|
|
48
|
+
note: when the skill has prohibitions
|
|
49
|
+
|
|
50
|
+
- key: outputs
|
|
51
|
+
form: bullet-list
|
|
52
|
+
required: no
|
|
53
|
+
note: only when nothing else states what the run produces
|
|
54
|
+
|
|
55
|
+
- key: quality_rules
|
|
56
|
+
form: bullet-list
|
|
57
|
+
required: no
|
|
58
|
+
note: the shared rubric, copied verbatim into every skill that carries it
|
|
59
|
+
|
|
60
|
+
- key: workflow
|
|
61
|
+
form: numbered-list
|
|
62
|
+
required: yes
|
|
63
|
+
note: reference material states "- none" with the reason instead of carrying steps
|
|
64
|
+
|
|
65
|
+
- key: invocation
|
|
66
|
+
form: bullet-list
|
|
67
|
+
required: yes
|
|
68
|
+
|
|
69
|
+
custom_sections:
|
|
70
|
+
- none: a project fills this from the inventory step of cnlp-migrate, before rewriting any skill
|
|
71
|
+
|
|
72
|
+
enforcement:
|
|
73
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
74
|
+
- any issue is an error: a skill ships as executable instructions, so there is no draft state to warn about
|
|
75
|
+
- a repository without Node holds this profile by review against the standard instead
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task
|
|
3
|
+
description: The CNL-P profile of a task page — how to reach one outcome with the library, in steps, with the compositional example the API pages leave out.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
format: cnlp-format.md
|
|
7
|
+
|
|
8
|
+
mood: imperative
|
|
9
|
+
|
|
10
|
+
headings:
|
|
11
|
+
- none: a task page is one flat run of blocks, and the file name carries the title
|
|
12
|
+
|
|
13
|
+
frontmatter_fields:
|
|
14
|
+
- none: a task page is reached through the index, which already carries its name
|
|
15
|
+
|
|
16
|
+
lexicon_exempt:
|
|
17
|
+
- none: a task page has no frontmatter, so nothing is exempt
|
|
18
|
+
|
|
19
|
+
sections:
|
|
20
|
+
- key: goal
|
|
21
|
+
form: scalar
|
|
22
|
+
required: yes
|
|
23
|
+
note: the outcome, in the words a reader arrives with rather than in the library's terms
|
|
24
|
+
|
|
25
|
+
- key: preconditions
|
|
26
|
+
form: bullet-list
|
|
27
|
+
required: no
|
|
28
|
+
note: what holds before step 1; delete the block when the steps start from nothing
|
|
29
|
+
|
|
30
|
+
- key: workflow
|
|
31
|
+
form: numbered-list
|
|
32
|
+
required: yes
|
|
33
|
+
note: the steps, each naming the call it makes and sending the reader to the API page for the contract
|
|
34
|
+
|
|
35
|
+
- key: example
|
|
36
|
+
form: keyed-block
|
|
37
|
+
required: yes
|
|
38
|
+
record_keys: shows
|
|
39
|
+
note: the composition the steps produce, whole and runnable, in the names the set's running example uses; this is where a multi-call example lives, so an API page stays small
|
|
40
|
+
|
|
41
|
+
- key: verification
|
|
42
|
+
form: bullet-list
|
|
43
|
+
required: no
|
|
44
|
+
note: how a reader proves the result works, by a command or by an observable state
|
|
45
|
+
|
|
46
|
+
- key: failure_modes
|
|
47
|
+
form: record-list
|
|
48
|
+
required: no
|
|
49
|
+
record_keys: symptom, cause, fix
|
|
50
|
+
note: what a reader sees when a step went wrong, keyed on the symptom because that is what the reader has in hand
|
|
51
|
+
|
|
52
|
+
- key: see_also
|
|
53
|
+
form: record-list
|
|
54
|
+
required: yes
|
|
55
|
+
record_keys: page, relation, reason
|
|
56
|
+
record_values: relation = needs, next, alternative, detail, supersedes
|
|
57
|
+
note: relation is needs, next, alternative, detail or supersedes; reason lets a reader decide without opening the page, and supersedes names a page of another docset that replaces this one
|
|
58
|
+
|
|
59
|
+
custom_sections:
|
|
60
|
+
- none: a project fills this from the vocabulary its own task pages already use
|
|
61
|
+
|
|
62
|
+
enforcement:
|
|
63
|
+
- `npx cnlp check`, over the files a `cnlp.config.json` corpus entry maps to this profile
|
|
64
|
+
- any issue is an error: a task page ships as executable instructions, so there is no draft state to warn about
|
|
65
|
+
- `npx cnlp check` resolves every `page:` value, and reports a page no other page reaches, once the project declares `docsets:`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# The shared rubric — a seed, not a standard
|
|
2
|
+
|
|
3
|
+
`quality_rules:` is the one block a repository copies **verbatim** into every skill that
|
|
4
|
+
carries it. There is no include mechanism in the skill runtime, so the duplication is
|
|
5
|
+
deliberate, and a byte-identity test you write in your own repository — the last section
|
|
6
|
+
says how — is what keeps the copies from drifting until 2 skills judge the same work by
|
|
7
|
+
different rules.
|
|
8
|
+
|
|
9
|
+
This file is a starting point. Prune it before use: a rule that names an artifact your skills
|
|
10
|
+
do not have teaches the agent to look for nothing. Nothing here is part of the standard, and
|
|
11
|
+
no check reads it.
|
|
12
|
+
|
|
13
|
+
## The long variant
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
quality_rules:
|
|
17
|
+
- measure every option by what serves the project best over its lifetime
|
|
18
|
+
- state delivery cost, risk, and timeline explicitly for the operator
|
|
19
|
+
- do not let your own convenience in this session stand in for them
|
|
20
|
+
- name the project invariants the change touches: module boundaries, public APIs, data schemas, and the decision records in force
|
|
21
|
+
- cite the concrete rule, decision record, architecture document, or code location each judgment rests on
|
|
22
|
+
- no ground named, no recommendation: research until you can name it, never fill the gap with a guess
|
|
23
|
+
- present at least 2 viable approaches when the change touches a module boundary, public API, data schema, or architectural invariant
|
|
24
|
+
- if only 1 approach is viable, say so and why the others are not
|
|
25
|
+
- give per approach: consequences over the next 6–12 months of project evolution, effect on coupling, hidden risks
|
|
26
|
+
- reject each alternative in its strongest version, and name the reason
|
|
27
|
+
- do not accept "faster to write", "easier", or "smaller diff for me now" as justification for violating an invariant or an established convention of the codebase
|
|
28
|
+
- justify any divergent local pattern explicitly: two ways of doing one thing is a real cost
|
|
29
|
+
- name a large blast radius — many call sites, data migrations, compatibility breaks — as the genuine risk and cost it is
|
|
30
|
+
- prefer the smaller change at equal architectural correctness, and add no abstractions for hypothetical needs
|
|
31
|
+
- an obligation costs what it takes to satisfy: name the failure each one prevents, and drop the obligation whose cost is above that failure
|
|
32
|
+
- count effort already sunk into existing code as nothing by itself; the compatibility and migration cost of replacing it does count
|
|
33
|
+
- when the correct option costs more, present it alongside the cheap one, each with its cost, risk, and reversibility
|
|
34
|
+
- demand stronger grounds for hard-to-reverse choices such as data schemas and public APIs
|
|
35
|
+
- end with exactly 1 explicit recommendation; the operator decides, never silently downgrade to the cheap option
|
|
36
|
+
- revise a recommendation only on a new fact, a new constraint, a found reasoning error, a clarified goal, or an explicit operator decision, and name what changed
|
|
37
|
+
- disagreement alone is not new information: a flip with no new grounds means the original was ungrounded
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Carried by the skills that choose between options and recommend one.
|
|
41
|
+
|
|
42
|
+
## The short variant
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
quality_rules:
|
|
46
|
+
- the decision is already made: do not re-litigate it
|
|
47
|
+
- ground every verdict in a concrete rule, a decision record, a plan step, or a code location
|
|
48
|
+
- no ground named, no verdict: research until you can name it, never guess
|
|
49
|
+
- report code diverging from the decision as a deviation, with evidence
|
|
50
|
+
- do not resolve a deviation by reshaping the judgment to fit it
|
|
51
|
+
- do not excuse a deviation because fixing it would be laborious
|
|
52
|
+
- follow the project's existing conventions and invariants for tactical choices
|
|
53
|
+
- do not accept agent convenience — "faster", "easier" for this session — as an argument
|
|
54
|
+
- revise a verdict only on a new fact, a found reasoning error, or an explicit operator decision, and name what changed
|
|
55
|
+
- disagreement alone is not new information
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Carried by the skills that check work against a decision already taken.
|
|
59
|
+
|
|
60
|
+
## Keeping the copies identical
|
|
61
|
+
|
|
62
|
+
The rubric only stays shared if something asserts it. Write a test in your own repository that
|
|
63
|
+
lists which skills carry which variant and asserts the block is byte-identical within each
|
|
64
|
+
group. Without it, the first hand-edit to one copy goes unnoticed and the rubric stops being
|
|
65
|
+
shared — which is exactly what happened to the first project that adopted this file and never
|
|
66
|
+
ported the test.
|
|
67
|
+
|
|
68
|
+
`cnlp check` does not do this for you: the checker reads the profile, and the profile declares
|
|
69
|
+
that `quality_rules:` is a bullet-list, not what the bullets say.
|