@antoneeo/kb-agentic-skill 1.19.0 → 1.20.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/CHANGELOG.md +5 -0
- package/README.md +177 -176
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/scripts/init.js +6 -6
- package/skills/kb-agentic-skill/ENFORCEMENT.md +3 -3
- package/skills/kb-agentic-skill/SKILL.md +303 -303
- package/skills/kb-agentic-skill/elicitation.md +192 -192
- package/skills/kb-agentic-skill/memory.md +88 -88
- package/skills/kb-agentic-skill/portability.md +125 -125
- package/skills/kb-agentic-skill/routing.md +28 -16
- package/skills/kb-agentic-skill/scripts/knowledge.py +2089 -2089
- package/skills/kb-agentic-skill/scripts/sdlc_check.py +62 -62
- package/skills/kb-agentic-skill/scripts/sdlc_core.py +6 -1
- package/skills/kb-agentic-skill/templates.md +2 -0
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
# Portability — carrying knowledge between projects
|
|
2
|
-
|
|
3
|
-
**For whom**: the agent moving a subgraph out of one project or into another.
|
|
4
|
-
**Answers**: "what travels, what refuses to travel, and what an import may decide".
|
|
5
|
-
**Does not answer**: where a claim's concept belongs (`taxonomy.md` — import *uses* that
|
|
6
|
-
pass, it does not replace it) or how a disagreement is settled (`reconciliation.md`).
|
|
7
|
-
|
|
8
|
-
## 0. The two commands, and what to tell the user
|
|
9
|
-
|
|
10
|
-
A bundle is a **folder**, not an archive. Nothing here compresses or unpacks anything:
|
|
11
|
-
the user moves the folder however they already move folders.
|
|
12
|
-
|
|
13
|
-
**Sending side** — run from the project that owns the knowledge:
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
sdlc_check.py export --out ../kb-bundle # the whole KB
|
|
17
|
-
sdlc_check.py export --out ../kb-bundle --topics pricing,licensing
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Write it **outside the docs root**. A bundle sitting inside `ai_docs/` is a second copy
|
|
21
|
-
of topics and corpus files in the tree the validator walks, and that confusion is free
|
|
22
|
-
to avoid.
|
|
23
|
-
|
|
24
|
-
**Receiving side** — run from the project that is to gain it:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
sdlc_check.py import ../kb-bundle --dry-run # see what would land
|
|
28
|
-
sdlc_check.py import ../kb-bundle
|
|
29
|
-
sdlc_check.py check # always, right after
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
**What to say to the user, in their words.** Say these four things and stop:
|
|
33
|
-
|
|
34
|
-
1. *"I've written the bundle to `<path>`. It's a folder — move it to the other project
|
|
35
|
-
however you like."*
|
|
36
|
-
2. *"It carries the source documents too, not just the notes, so it is not small. That is
|
|
37
|
-
the point: over there the claims can still be traced back to the page they came from."*
|
|
38
|
-
3. After importing: *"Nothing was overwritten. Anything already there stayed as it was"* —
|
|
39
|
-
and, if a topic was skipped, *"a topic with the same name already exists; I have not
|
|
40
|
-
merged them, because they may not be the same subject. Do you want me to look?"*
|
|
41
|
-
4. If an imported ruling arrived: *"one decision came from the other project. I have kept
|
|
42
|
-
it, marked as theirs, and it cannot settle anything here until you confirm it."*
|
|
43
|
-
|
|
44
|
-
Do not explain the closure, the id hashing or the provenance model unless asked. The
|
|
45
|
-
user asked to move their knowledge, not to learn how it is stored.
|
|
46
|
-
|
|
47
|
-
## 1. What a bundle is
|
|
48
|
-
|
|
49
|
-
A directory mirroring the docs-root layout:
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
<bundle>/
|
|
53
|
-
MANIFEST.md kb_bundle: 1, source_project, topics, per-artifact sha256
|
|
54
|
-
topics/<slug>.md
|
|
55
|
-
corpus/given/<name> + <name>.meta.md (+ the .txt extraction, when there is one)
|
|
56
|
-
corpus/notes/<name>.md
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
The layout is mirrored **on purpose**. Claim `source` cells are docs-root-relative, so
|
|
60
|
-
nothing is rewritten on import — and because `kb_claim_id` hashes
|
|
61
|
-
`path#locator#qty` with the text excluded, the same artifact cited at the same span
|
|
62
|
-
mints **the same id in every project**. De-duplication is therefore mechanical, not a
|
|
63
|
-
judgement call, and importing the same bundle twice is a provable no-op.
|
|
64
|
-
|
|
65
|
-
## 2. Export is a closure, not a selection
|
|
66
|
-
|
|
67
|
-
You choose topics; the export decides what must travel with them.
|
|
68
|
-
|
|
69
|
-
- **Every artifact a selected claim cites**, plus its sidecar and its stored extraction.
|
|
70
|
-
A claim whose source cannot be reopened is model knowledge arriving by another route —
|
|
71
|
-
the validator would reject it in the target, and correctly.
|
|
72
|
-
- **Every row a `CONTESTED` row points at.** The symmetry check refuses a set that lost
|
|
73
|
-
half its members, so a partial export ships a tree that cannot pass its own checks.
|
|
74
|
-
When a partner row lives in an unselected topic, that topic is **added and reported** —
|
|
75
|
-
never dropped, never silently.
|
|
76
|
-
|
|
77
|
-
If a conflict partner resolves to no row at all, the export **refuses**: exporting a
|
|
78
|
-
broken set is worse than exporting nothing.
|
|
79
|
-
|
|
80
|
-
## 3. Import is additive, and decides nothing
|
|
81
|
-
|
|
82
|
-
`import` writes files. It does not place concepts, merge bodies, or settle disagreements.
|
|
83
|
-
|
|
84
|
-
- **Never overwrites a topic.** A slug that already exists is reported and skipped: two
|
|
85
|
-
projects using the word `pricing` may mean two different things, and that judgement is
|
|
86
|
-
the placement pass's (`taxonomy.md`, five verdicts, `owns:` against double placement).
|
|
87
|
-
- **Never deletes.** The doctrine is tombstones over deletion; an additive import has no
|
|
88
|
-
business removing anything.
|
|
89
|
-
- **All or nothing.** The whole plan is computed before a byte is written. An import that
|
|
90
|
-
half-applies leaves a tree whose checks fail and whose owner cannot tell what landed.
|
|
91
|
-
|
|
92
|
-
It refuses on: a missing or unmarked `MANIFEST.md`; a path that escapes the docs root; an
|
|
93
|
-
artifact whose name matches an existing one **with different bytes** (content-addressed
|
|
94
|
-
names must mean equal content — a mismatch means one of the two is lying about its
|
|
95
|
-
origin); an incomplete conflict set; a dangling `supersedes:`.
|
|
96
|
-
|
|
97
|
-
After importing, run `check`. The import is deliberately not a validator.
|
|
98
|
-
|
|
99
|
-
## 4. Knowledge crosses; authority does not
|
|
100
|
-
|
|
101
|
-
`RULING` means *the fact you know and the corpus does not*, with a `basis:` you gave. It
|
|
102
|
-
is the only thing that settles a `CONTESTED` set. A ruling from another project carries
|
|
103
|
-
another owner's decision, and importing it unchanged would make that decision binding
|
|
104
|
-
here without anyone here granting it — the machine deciding, which reconciliation
|
|
105
|
-
refuses everywhere else.
|
|
106
|
-
|
|
107
|
-
So an imported ruling arrives as **`prov: IMPORTED`** (owner ruling, 2026-08-03):
|
|
108
|
-
|
|
109
|
-
- its text, span and original `basis:` travel **verbatim** — the knowledge is not lost,
|
|
110
|
-
and pretending it is a `DERIVED` synthesis would make the row lie about where it came
|
|
111
|
-
from;
|
|
112
|
-
- its note carries `imported_from:`, and the validator refuses an `IMPORTED` row without
|
|
113
|
-
it: unnamed, the class says nothing and the row is a `RULING` with the label filed off;
|
|
114
|
-
- **it cannot supersede a local row.** The validator errors on `SUPERSEDED <id>` when
|
|
115
|
-
that id is `IMPORTED`.
|
|
116
|
-
|
|
117
|
-
**Re-ratification** is one act: read it, write your own note with your own `basis:`, and
|
|
118
|
-
set the row's `prov` to `RULING`. That is you deciding, which is the only thing that ever
|
|
119
|
-
settles anything here.
|
|
120
|
-
|
|
121
|
-
## 5. Triage
|
|
122
|
-
|
|
123
|
-
Exporting is L1 — it writes nothing into the corpus and changes no knowledge. Importing
|
|
124
|
-
is **L3**: a source enters the corpus and nodes are created, which is the L3 definition
|
|
125
|
-
in Rule Zero, and the bundle is external input, which is never L1 whatever its size.
|
|
1
|
+
# Portability — carrying knowledge between projects
|
|
2
|
+
|
|
3
|
+
**For whom**: the agent moving a subgraph out of one project or into another.
|
|
4
|
+
**Answers**: "what travels, what refuses to travel, and what an import may decide".
|
|
5
|
+
**Does not answer**: where a claim's concept belongs (`taxonomy.md` — import *uses* that
|
|
6
|
+
pass, it does not replace it) or how a disagreement is settled (`reconciliation.md`).
|
|
7
|
+
|
|
8
|
+
## 0. The two commands, and what to tell the user
|
|
9
|
+
|
|
10
|
+
A bundle is a **folder**, not an archive. Nothing here compresses or unpacks anything:
|
|
11
|
+
the user moves the folder however they already move folders.
|
|
12
|
+
|
|
13
|
+
**Sending side** — run from the project that owns the knowledge:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
sdlc_check.py export --out ../kb-bundle # the whole KB
|
|
17
|
+
sdlc_check.py export --out ../kb-bundle --topics pricing,licensing
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Write it **outside the docs root**. A bundle sitting inside `ai_docs/` is a second copy
|
|
21
|
+
of topics and corpus files in the tree the validator walks, and that confusion is free
|
|
22
|
+
to avoid.
|
|
23
|
+
|
|
24
|
+
**Receiving side** — run from the project that is to gain it:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
sdlc_check.py import ../kb-bundle --dry-run # see what would land
|
|
28
|
+
sdlc_check.py import ../kb-bundle
|
|
29
|
+
sdlc_check.py check # always, right after
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**What to say to the user, in their words.** Say these four things and stop:
|
|
33
|
+
|
|
34
|
+
1. *"I've written the bundle to `<path>`. It's a folder — move it to the other project
|
|
35
|
+
however you like."*
|
|
36
|
+
2. *"It carries the source documents too, not just the notes, so it is not small. That is
|
|
37
|
+
the point: over there the claims can still be traced back to the page they came from."*
|
|
38
|
+
3. After importing: *"Nothing was overwritten. Anything already there stayed as it was"* —
|
|
39
|
+
and, if a topic was skipped, *"a topic with the same name already exists; I have not
|
|
40
|
+
merged them, because they may not be the same subject. Do you want me to look?"*
|
|
41
|
+
4. If an imported ruling arrived: *"one decision came from the other project. I have kept
|
|
42
|
+
it, marked as theirs, and it cannot settle anything here until you confirm it."*
|
|
43
|
+
|
|
44
|
+
Do not explain the closure, the id hashing or the provenance model unless asked. The
|
|
45
|
+
user asked to move their knowledge, not to learn how it is stored.
|
|
46
|
+
|
|
47
|
+
## 1. What a bundle is
|
|
48
|
+
|
|
49
|
+
A directory mirroring the docs-root layout:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
<bundle>/
|
|
53
|
+
MANIFEST.md kb_bundle: 1, source_project, topics, per-artifact sha256
|
|
54
|
+
topics/<slug>.md
|
|
55
|
+
corpus/given/<name> + <name>.meta.md (+ the .txt extraction, when there is one)
|
|
56
|
+
corpus/notes/<name>.md
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The layout is mirrored **on purpose**. Claim `source` cells are docs-root-relative, so
|
|
60
|
+
nothing is rewritten on import — and because `kb_claim_id` hashes
|
|
61
|
+
`path#locator#qty` with the text excluded, the same artifact cited at the same span
|
|
62
|
+
mints **the same id in every project**. De-duplication is therefore mechanical, not a
|
|
63
|
+
judgement call, and importing the same bundle twice is a provable no-op.
|
|
64
|
+
|
|
65
|
+
## 2. Export is a closure, not a selection
|
|
66
|
+
|
|
67
|
+
You choose topics; the export decides what must travel with them.
|
|
68
|
+
|
|
69
|
+
- **Every artifact a selected claim cites**, plus its sidecar and its stored extraction.
|
|
70
|
+
A claim whose source cannot be reopened is model knowledge arriving by another route —
|
|
71
|
+
the validator would reject it in the target, and correctly.
|
|
72
|
+
- **Every row a `CONTESTED` row points at.** The symmetry check refuses a set that lost
|
|
73
|
+
half its members, so a partial export ships a tree that cannot pass its own checks.
|
|
74
|
+
When a partner row lives in an unselected topic, that topic is **added and reported** —
|
|
75
|
+
never dropped, never silently.
|
|
76
|
+
|
|
77
|
+
If a conflict partner resolves to no row at all, the export **refuses**: exporting a
|
|
78
|
+
broken set is worse than exporting nothing.
|
|
79
|
+
|
|
80
|
+
## 3. Import is additive, and decides nothing
|
|
81
|
+
|
|
82
|
+
`import` writes files. It does not place concepts, merge bodies, or settle disagreements.
|
|
83
|
+
|
|
84
|
+
- **Never overwrites a topic.** A slug that already exists is reported and skipped: two
|
|
85
|
+
projects using the word `pricing` may mean two different things, and that judgement is
|
|
86
|
+
the placement pass's (`taxonomy.md`, five verdicts, `owns:` against double placement).
|
|
87
|
+
- **Never deletes.** The doctrine is tombstones over deletion; an additive import has no
|
|
88
|
+
business removing anything.
|
|
89
|
+
- **All or nothing.** The whole plan is computed before a byte is written. An import that
|
|
90
|
+
half-applies leaves a tree whose checks fail and whose owner cannot tell what landed.
|
|
91
|
+
|
|
92
|
+
It refuses on: a missing or unmarked `MANIFEST.md`; a path that escapes the docs root; an
|
|
93
|
+
artifact whose name matches an existing one **with different bytes** (content-addressed
|
|
94
|
+
names must mean equal content — a mismatch means one of the two is lying about its
|
|
95
|
+
origin); an incomplete conflict set; a dangling `supersedes:`.
|
|
96
|
+
|
|
97
|
+
After importing, run `check`. The import is deliberately not a validator.
|
|
98
|
+
|
|
99
|
+
## 4. Knowledge crosses; authority does not
|
|
100
|
+
|
|
101
|
+
`RULING` means *the fact you know and the corpus does not*, with a `basis:` you gave. It
|
|
102
|
+
is the only thing that settles a `CONTESTED` set. A ruling from another project carries
|
|
103
|
+
another owner's decision, and importing it unchanged would make that decision binding
|
|
104
|
+
here without anyone here granting it — the machine deciding, which reconciliation
|
|
105
|
+
refuses everywhere else.
|
|
106
|
+
|
|
107
|
+
So an imported ruling arrives as **`prov: IMPORTED`** (owner ruling, 2026-08-03):
|
|
108
|
+
|
|
109
|
+
- its text, span and original `basis:` travel **verbatim** — the knowledge is not lost,
|
|
110
|
+
and pretending it is a `DERIVED` synthesis would make the row lie about where it came
|
|
111
|
+
from;
|
|
112
|
+
- its note carries `imported_from:`, and the validator refuses an `IMPORTED` row without
|
|
113
|
+
it: unnamed, the class says nothing and the row is a `RULING` with the label filed off;
|
|
114
|
+
- **it cannot supersede a local row.** The validator errors on `SUPERSEDED <id>` when
|
|
115
|
+
that id is `IMPORTED`.
|
|
116
|
+
|
|
117
|
+
**Re-ratification** is one act: read it, write your own note with your own `basis:`, and
|
|
118
|
+
set the row's `prov` to `RULING`. That is you deciding, which is the only thing that ever
|
|
119
|
+
settles anything here.
|
|
120
|
+
|
|
121
|
+
## 5. Triage
|
|
122
|
+
|
|
123
|
+
Exporting is L1 — it writes nothing into the corpus and changes no knowledge. Importing
|
|
124
|
+
is **L3**: a source enters the corpus and nodes are created, which is the L3 definition
|
|
125
|
+
in Rule Zero, and the bundle is external input, which is never L1 whatever its size.
|
|
@@ -17,6 +17,7 @@ family, identified by the `name:` in their `SKILL.md`:
|
|
|
17
17
|
| code | `agentic-sdlc` | this repository's code |
|
|
18
18
|
| knowledge | `kb-agentic` | documents the user supplied |
|
|
19
19
|
| marketing | `mkt-agentic-sdlc` | market evidence |
|
|
20
|
+
| course | `course-creator` | a defined learner's progressive understanding |
|
|
20
21
|
|
|
21
22
|
- **No sibling installed, or the directory cannot be read** → the router does NOT run.
|
|
22
23
|
Work under the loaded lens; read no further. This is the normal single-lens case and
|
|
@@ -36,6 +37,11 @@ Run the steps in order. Stop at the first one that decides.
|
|
|
36
37
|
- *This repository's code* → provisional **code**; continue to step 2.
|
|
37
38
|
- *Documents the user supplied* → **knowledge**. Decided.
|
|
38
39
|
- *Market evidence* → **marketing**. Decided.
|
|
40
|
+
- *A deliverable whose purpose is to teach a defined audience through progressive
|
|
41
|
+
explanations and modules* → **course**. Decided, regardless of whether its
|
|
42
|
+
sources came from a supplied corpus, web research or this repository's code.
|
|
43
|
+
Acquiring and checking that corpus is a separate knowledge unit. Course
|
|
44
|
+
content is not routed through the provisional code branch below.
|
|
39
45
|
- *A deliverable whose purpose is market-facing persuasion* (copy, positioning,
|
|
40
46
|
campaign material) → **marketing regardless of source**. Decided. Without this
|
|
41
47
|
branch the marketing lens is reachable only when the *source* is market evidence,
|
|
@@ -52,14 +58,15 @@ Run the steps in order. Stop at the first one that decides.
|
|
|
52
58
|
**knowledge**. Decided; step 3 is not reached.
|
|
53
59
|
|
|
54
60
|
3. **Build-consumed override** — only on the provisional `code` branch, never
|
|
55
|
-
overriding a *marketing* or *supplied-documents* verdict. *Is the deliverable a
|
|
61
|
+
overriding a *marketing*, *course* or *supplied-documents* verdict. *Is the deliverable a
|
|
56
62
|
file the project's build or test toolchain consumes?* Executable or imported
|
|
57
63
|
source: yes. Committed Markdown: no. A yes confirms **code**.
|
|
58
64
|
|
|
59
|
-
4. **Split rule.** A request
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
4. **Split rule.** A request with distinct deliverables is split before routing:
|
|
66
|
+
corpus ingestion (knowledge) and a course based on it (course), or campaign
|
|
67
|
+
material (marketing) and training (course), are separate units. The same applies
|
|
68
|
+
to distillation (knowledge) and a technical design that cites it (code). The
|
|
69
|
+
router returns one lens per unit; it never returns two lenses for one unit.
|
|
63
70
|
|
|
64
71
|
5. **Owning tree.** A straddling artifact keeps its lens for *method* and takes this
|
|
65
72
|
repository's tree and validator for *storage*. Lens and location are separate
|
|
@@ -81,14 +88,18 @@ Run the steps in order. Stop at the first one that decides.
|
|
|
81
88
|
| "turn these vendor specs into a technical design" | split (step 4): spec = supplied docs; design = this repo | — | — | **knowledge** for the distillation; **code** for the design, citing it |
|
|
82
89
|
| "write the pricing page copy from our market research" | **purpose: market-facing → marketing** | never reached | never reached | **marketing**; stored in this repo's tree (step 5) |
|
|
83
90
|
| "write the launch blog post from the release notes" | purpose: market-facing → marketing | never reached | never reached | **marketing** |
|
|
91
|
+
| "create a beginner course from these API docs" | purpose: teaching → course | never reached | never reached | **course** |
|
|
92
|
+
| "research sources and teach a newcomer a topic" | purpose: teaching → course | never reached | never reached | **course** |
|
|
93
|
+
| "ingest these manuals, then create a course" | split: corpus = supplied docs; training = teaching | never reached | never reached | **knowledge** for ingestion; **course** for training |
|
|
94
|
+
| "write sales copy and an onboarding course" | split: persuasion and teaching | never reached | never reached | **marketing** for copy; **course** for training |
|
|
84
95
|
|
|
85
|
-
## 3. Acting on the verdict
|
|
86
|
-
|
|
87
|
-
Memory is not a competing verdict. Every lens ships `memory.md` and the shared
|
|
88
|
-
knowledge machinery: consult across domains without switching the work's owner or
|
|
89
|
-
running a second workflow. Resolve an ambiguous owner before applying its definitive
|
|
90
|
-
risk scale; a provisional level is not a second mandatory triage. Split only distinct
|
|
91
|
-
deliverables, not the act of reading another domain's evidence.
|
|
96
|
+
## 3. Acting on the verdict
|
|
97
|
+
|
|
98
|
+
Memory is not a competing verdict. Every lens ships `memory.md` and the shared
|
|
99
|
+
knowledge machinery: consult across domains without switching the work's owner or
|
|
100
|
+
running a second workflow. Resolve an ambiguous owner before applying its definitive
|
|
101
|
+
risk scale; a provisional level is not a second mandatory triage. Split only distinct
|
|
102
|
+
deliverables, not the act of reading another domain's evidence.
|
|
92
103
|
|
|
93
104
|
The verdict binds the **method and the validation rules**, not the storage:
|
|
94
105
|
|
|
@@ -96,11 +107,12 @@ The verdict binds the **method and the validation rules**, not the storage:
|
|
|
96
107
|
- **Verdict = a sibling lens** → say so, and work that unit under the sibling's method
|
|
97
108
|
and its rule set (its templates, its mandatory risk section — code
|
|
98
109
|
`## Security and Threat Model`, knowledge `## Sources and Verification`, marketing
|
|
99
|
-
`## Threat Map / Plan Risks`). The artifact is written with an explicit
|
|
110
|
+
`## Threat Map / Plan Risks`, course `## Learning and Content Risks`). The artifact is written with an explicit
|
|
100
111
|
`domain:` field so the answer survives the session, and it stays in this project's
|
|
101
112
|
`ai_docs/` tree (step 5).
|
|
102
113
|
- **The unit was split** (step 4) → route and declare each half separately.
|
|
103
114
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
115
|
+
The project vision, principles and roadmap under `vision/` sit **above** the domain
|
|
116
|
+
split and receive the core's structural rules. A feature Vision under
|
|
117
|
+
`vision/features/` belongs to its explicit domain; a course Vision declares
|
|
118
|
+
`domain: course`. The router is not consulted for project-wide vision files.
|