@zosmaai/pi-llm-wiki 0.9.0 → 0.9.2
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 +7 -0
- package/README.de.md +2 -2
- package/README.es.md +2 -2
- package/README.fr.md +2 -2
- package/README.hi.md +2 -2
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +25 -2
- package/README.pt.md +2 -2
- package/README.ru.md +2 -2
- package/README.zh.md +2 -2
- package/docs/api.md +123 -10
- package/docs/architecture.md +38 -1
- package/docs/commands.md +21 -1
- package/extensions/llm-wiki/index.ts +80 -17
- package/extensions/llm-wiki/lib/metadata.ts +34 -1
- package/extensions/llm-wiki/lib/observation.ts +50 -10
- package/extensions/llm-wiki/lib/recall.ts +107 -8
- package/extensions/llm-wiki/lib/runtime.ts +49 -1
- package/extensions/llm-wiki/lib/task-config.ts +107 -13
- package/extensions/llm-wiki/lib/tools.ts +338 -183
- package/extensions/llm-wiki/lib/trajectories-command.ts +67 -0
- package/extensions/llm-wiki/lib/trajectory.ts +613 -0
- package/extensions/llm-wiki/lib/utils.ts +20 -3
- package/extensions/llm-wiki/lib/visible-status.ts +51 -0
- package/package.json +1 -1
- package/prompts/wiki-record.md +36 -0
- package/prompts/wiki-run.md +4 -2
- package/prompts/wiki-skills.md +26 -0
- package/skills/llm-wiki/SKILL.md +70 -4
|
@@ -20,6 +20,7 @@ export interface VaultPaths {
|
|
|
20
20
|
root: string;
|
|
21
21
|
raw: string;
|
|
22
22
|
rawSources: string;
|
|
23
|
+
rawTrajectories: string;
|
|
23
24
|
wiki: string;
|
|
24
25
|
meta: string;
|
|
25
26
|
dotWiki: string;
|
|
@@ -157,6 +158,7 @@ export function getVaultPaths(root: string): VaultPaths {
|
|
|
157
158
|
root,
|
|
158
159
|
raw: join(root, ".llm-wiki", "raw"),
|
|
159
160
|
rawSources: join(root, ".llm-wiki", "raw", "sources"),
|
|
161
|
+
rawTrajectories: join(root, ".llm-wiki", "raw", "trajectories"),
|
|
160
162
|
wiki: join(root, ".llm-wiki", "wiki"),
|
|
161
163
|
meta: join(root, ".llm-wiki", "meta"),
|
|
162
164
|
dotWiki: join(root, ".llm-wiki"),
|
|
@@ -171,6 +173,7 @@ export function getLegacyVaultPaths(root: string): VaultPaths {
|
|
|
171
173
|
root,
|
|
172
174
|
raw: join(root, "raw"),
|
|
173
175
|
rawSources: join(root, "raw", "sources"),
|
|
176
|
+
rawTrajectories: join(root, "raw", "trajectories"),
|
|
174
177
|
wiki: join(root, "wiki"),
|
|
175
178
|
meta: join(root, "meta"),
|
|
176
179
|
dotWiki: join(root, ".wiki"),
|
|
@@ -192,6 +195,10 @@ export function resolveVaultPaths(cwd: string): VaultPaths {
|
|
|
192
195
|
|
|
193
196
|
/** Ensure all vault directories exist. */
|
|
194
197
|
export function ensureVaultStructure(paths: VaultPaths): void {
|
|
198
|
+
// NOTE: the agent-trajectory dirs (raw/trajectories, wiki/skills, wiki/cases)
|
|
199
|
+
// are intentionally NOT created here — they are created lazily on first
|
|
200
|
+
// capture/distill (issue #80), so a vault with the feature off carries no
|
|
201
|
+
// trace of it. All readers of these paths are existsSync-guarded.
|
|
195
202
|
const dirs = [
|
|
196
203
|
paths.rawSources,
|
|
197
204
|
join(paths.raw, "assets"),
|
|
@@ -238,12 +245,22 @@ export function readText(path: string): string {
|
|
|
238
245
|
|
|
239
246
|
/** Generate the next source ID. */
|
|
240
247
|
export function nextSourceId(paths: VaultPaths): string {
|
|
248
|
+
return nextSequentialId(paths.rawSources, "SRC");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Generate the next trajectory ID. */
|
|
252
|
+
export function nextTrajectoryId(paths: VaultPaths): string {
|
|
253
|
+
return nextSequentialId(paths.rawTrajectories, "TRJ");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Generate the next sequential, date-stamped packet ID for a raw subdir. */
|
|
257
|
+
function nextSequentialId(dir: string, kind: string): string {
|
|
241
258
|
const today = new Date().toISOString().split("T")[0];
|
|
242
|
-
const prefix =
|
|
259
|
+
const prefix = `${kind}-${today}`;
|
|
243
260
|
|
|
244
|
-
if (!existsSync(
|
|
261
|
+
if (!existsSync(dir)) return `${prefix}-001`;
|
|
245
262
|
|
|
246
|
-
const dirs = readdirSync(
|
|
263
|
+
const dirs = readdirSync(dir)
|
|
247
264
|
.filter((d) => d.startsWith(prefix))
|
|
248
265
|
.sort();
|
|
249
266
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { MODEL_STATUS_KEY, formatActiveModelLabel } from "./model-command.js";
|
|
2
|
+
import type { Runtime } from "./runtime.js";
|
|
3
|
+
import { noticesEnabled } from "./task-config.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Minimal sink for the two status keys this helper writes. Mirrors the slice
|
|
7
|
+
* of `ctx.ui` the extension uses; kept narrow so tests don't need to fake the
|
|
8
|
+
* whole pi UI surface.
|
|
9
|
+
*/
|
|
10
|
+
export interface StatusSink {
|
|
11
|
+
setStatus(key: string, value: string): void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Apply the two post-session-start visible status lines (issue #77,
|
|
16
|
+
* regression-fixed in #83, comments + tests hardened in #84):
|
|
17
|
+
*
|
|
18
|
+
* 1. `🧠 LLM Wiki (… tools, … active)` — the "wiki is loaded" badge
|
|
19
|
+
* 2. `🧠 wiki model: <label>` — the active background task model
|
|
20
|
+
*
|
|
21
|
+
* Both are user-facing chat noise and are gated by `llm-wiki.notices`
|
|
22
|
+
* (default `true`). When `notices: false`, neither status is set — that's the
|
|
23
|
+
* contract the regression in #83 was about.
|
|
24
|
+
*
|
|
25
|
+
* Extracted from `index.ts` so the gating contract is unit-testable without
|
|
26
|
+
* faking the entire pi extension factory; see `test/visible-activity.test.ts`.
|
|
27
|
+
*
|
|
28
|
+
* Pure modulo `ui.setStatus`. Callers MUST run `runtime.ensureConfig(...)` for
|
|
29
|
+
* the current cwd before invoking this so `noticesEnabled(runtime.config)`
|
|
30
|
+
* sees the loaded project settings.
|
|
31
|
+
*/
|
|
32
|
+
export function applySessionStartStatus(opts: {
|
|
33
|
+
ui: StatusSink;
|
|
34
|
+
runtime: Runtime;
|
|
35
|
+
trajectoriesOn: boolean;
|
|
36
|
+
sessionModelId: string | undefined;
|
|
37
|
+
}): void {
|
|
38
|
+
// Single gate for BOTH status lines (#83 added two adjacent guards; #84
|
|
39
|
+
// collapses them — same condition, same scope).
|
|
40
|
+
if (!noticesEnabled(opts.runtime.config)) return;
|
|
41
|
+
|
|
42
|
+
opts.ui.setStatus(
|
|
43
|
+
"llm-wiki",
|
|
44
|
+
opts.trajectoriesOn
|
|
45
|
+
? "🧠 LLM Wiki (16 tools, trajectory + observe + recall active)"
|
|
46
|
+
: "🧠 LLM Wiki (13 tools, observe + recall active)",
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const modelLabel = formatActiveModelLabel(opts.runtime.config, opts.sessionModelId);
|
|
50
|
+
opts.ui.setStatus(MODEL_STATUS_KEY, `🧠 wiki model: ${modelLabel}`);
|
|
51
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zosmaai/pi-llm-wiki",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "Self-maintaining LLM Wiki for Pi — Karpathy-pattern knowledge base with immutable source capture, automated ingestion, search, linting, and Obsidian-compatible vault. auto-updating personal & company wiki.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Capture the just-completed task's tool-call trajectory into the wiki as agent working-memory, then optionally distill it into a reusable skill.
|
|
3
|
+
argument-hint: "<title> [--outcome success|failure|partial]"
|
|
4
|
+
section: LLM Wiki
|
|
5
|
+
topLevelCli: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /wiki-record
|
|
9
|
+
|
|
10
|
+
Capture the trajectory of the task you just completed — the sequence of tool calls that solved it — into the wiki's working-memory layer.
|
|
11
|
+
|
|
12
|
+
This is the counterpart to source capture: instead of recording what you *read*, it records what you *did*, so the wiki compounds over your own work.
|
|
13
|
+
|
|
14
|
+
## User Arguments
|
|
15
|
+
|
|
16
|
+
$ARGUMENTS
|
|
17
|
+
|
|
18
|
+
Read the LLM Wiki skill at `.pi/skills/llm-wiki/SKILL.md` first to understand the wiki conventions.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
1. Call `wiki_capture_trajectory` with:
|
|
23
|
+
- `title`: short descriptive phrase for the task (≤60 chars, noun phrase)
|
|
24
|
+
- `outcome`: optional — `success` (default), `failure`, or `partial`
|
|
25
|
+
- The extension auto-extracts the tool-call trajectory from the live session, so you usually do **not** pass `steps` manually.
|
|
26
|
+
2. Open the generated skeleton case page in `wiki/cases/` and flesh out:
|
|
27
|
+
- **Task** — what was requested
|
|
28
|
+
- **Approach** — the key steps and decisions (not every tool call, just the meaningful ones)
|
|
29
|
+
- **Outcome** — the result, and anything worth reusing or avoiding next time
|
|
30
|
+
3. If the task taught a reusable pattern, run `wiki_distill_skills` and create a `skill` page via `wiki_ensure_page(type="skill")` that cites `[[trajectories/TRJ-...]]`.
|
|
31
|
+
4. Confirm the case (and any skill) will be surfaced by `wiki_recall` / `wiki_recall_skill` in future sessions.
|
|
32
|
+
|
|
33
|
+
**Rules:**
|
|
34
|
+
- Only record tasks worth learning from — non-trivial debugging, refactors, integrations, multi-step workflows. Skip trivial one-shot answers.
|
|
35
|
+
- The raw trajectory packet under `raw/trajectories/` is immutable. Edit the `case`/`skill` pages, never the packet.
|
|
36
|
+
- One trajectory per `wiki_capture_trajectory` call.
|
package/prompts/wiki-run.md
CHANGED
|
@@ -24,6 +24,8 @@ $ARGUMENTS
|
|
|
24
24
|
|
|
25
25
|
### Scheduling
|
|
26
26
|
|
|
27
|
-
If `--schedule` is provided, call `wiki_watch(interval=<daily|weekly>)
|
|
27
|
+
If `--schedule` is provided, call `wiki_watch(interval=<daily|weekly|hourly>)`.
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
**Important:** `wiki_watch` does NOT install a schedule. It only prints a `crontab` line.
|
|
30
|
+
Report the printed line to the user verbatim and tell them to install it themselves with
|
|
31
|
+
`crontab -e`. Do not claim the schedule is active until they confirm they have done so.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Search the wiki's distilled skills and past cases for patterns relevant to the current task — "have I done something like this before?".
|
|
3
|
+
argument-hint: "[query] [--kind skill|case]"
|
|
4
|
+
section: LLM Wiki
|
|
5
|
+
topLevelCli: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /wiki-skills
|
|
9
|
+
|
|
10
|
+
Search the agent working-memory layer of the wiki: reusable **skills** distilled from past trajectories, and specific past **cases**.
|
|
11
|
+
|
|
12
|
+
## User Arguments
|
|
13
|
+
|
|
14
|
+
$ARGUMENTS
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
1. Call `wiki_recall_skill` with:
|
|
19
|
+
- `query`: the current task description or key terms (defaults to `$ARGUMENTS`)
|
|
20
|
+
- `kind`: optional — `skill`, `case`, or `any` (default)
|
|
21
|
+
- `max_results`: optional (default 5)
|
|
22
|
+
2. Read the most relevant skill/case pages with `read`.
|
|
23
|
+
3. Apply the recalled pattern to the current task, citing the source page with `[[skills/...]]` or `[[cases/...]]` where helpful.
|
|
24
|
+
4. If no relevant skill/case exists, proceed with the task and consider running `/wiki-record` afterward so the next attempt benefits.
|
|
25
|
+
|
|
26
|
+
**Tip:** Skills generalize across many trajectories ("how I do X"); cases are concrete past runs ("the time I did X for project Y"). Search `any` first, then narrow.
|
package/skills/llm-wiki/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: llm-wiki
|
|
3
|
-
description: Build and maintain a persistent, interlinked Obsidian-compatible markdown wiki using Karpathy's LLM Wiki pattern. Extension-backed with auto-generated metadata, guardrails, and
|
|
4
|
-
whenToUse: Call wiki_recall at task start to find relevant wiki pages. Call wiki_retro at task end to save new insights. The extension injects a brief status line, but explicit
|
|
3
|
+
description: Build and maintain a persistent, interlinked Obsidian-compatible markdown wiki using Karpathy's LLM Wiki pattern. Extension-backed with auto-generated metadata, guardrails, and 13 custom tools (+3 opt-in agent-trajectory tools).
|
|
4
|
+
whenToUse: Call wiki_recall at task start to find relevant wiki pages. Call wiki_retro at task end to save new insights. When agent-trajectory working-memory is enabled (opt-in, /wiki-trajectories on), also call wiki_recall_skill at task start to find reusable skills / past cases ("have I done this before?") and wiki_capture_trajectory after non-trivial tasks to record how you solved them. The extension injects a brief status line, but explicit calls with task-specific terms get better results.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# LLM Wiki for Pi
|
|
@@ -20,12 +20,18 @@ WIKI_ROOT/
|
|
|
20
20
|
│ ├── original/
|
|
21
21
|
│ ├── extracted.md
|
|
22
22
|
│ └── attachments/
|
|
23
|
+
├── raw/trajectories/TRJ-*/ # Immutable agent task packets (extension-owned)
|
|
24
|
+
│ ├── manifest.json # Capture metadata (format: trajectory)
|
|
25
|
+
│ ├── packet.json # Full tool-call sequence
|
|
26
|
+
│ └── extracted.md # README summary
|
|
23
27
|
├── wiki/ # Editable knowledge pages (you own this)
|
|
24
28
|
│ ├── sources/ # One summary per source
|
|
25
29
|
│ ├── entities/ # People, orgs, tools, products
|
|
26
30
|
│ ├── concepts/ # Ideas, patterns, frameworks
|
|
27
31
|
│ ├── syntheses/ # Cross-cutting analyses
|
|
28
|
-
│
|
|
32
|
+
│ ├── analyses/ # Durable query answers
|
|
33
|
+
│ ├── cases/ # One specific past task per trajectory
|
|
34
|
+
│ └── skills/ # Reusable patterns distilled from trajectories
|
|
29
35
|
├── meta/ # Auto-generated (extension-owned)
|
|
30
36
|
│ ├── registry.json # Master page catalog
|
|
31
37
|
│ ├── backlinks.json # Inbound link map
|
|
@@ -46,6 +52,49 @@ WIKI_ROOT/
|
|
|
46
52
|
6. **CITE SOURCES.** Every claim links back to its raw source packet.
|
|
47
53
|
7. **FLAG CONTRADICTIONS.** When sources disagree, document both sides.
|
|
48
54
|
|
|
55
|
+
## Agent Working-Memory (Trajectories)
|
|
56
|
+
|
|
57
|
+
The wiki captures not only what you *read* (sources) but what you *do*
|
|
58
|
+
(trajectories). A completed task is just another kind of source, so it flows
|
|
59
|
+
through the same pipeline:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
raw/trajectories/TRJ-* → wiki/skills/* (+ optional wiki/cases/*) → meta/*
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
> **Opt-in, off by default** (issue #80). The three tools below are only registered
|
|
66
|
+
> when `llm-wiki.trajectories` is enabled. Turn it on with `/wiki-trajectories on`
|
|
67
|
+
> (off with `/wiki-trajectories off`); toggling reloads the extension. When off, the
|
|
68
|
+
> tools are absent entirely — no system-prompt cost.
|
|
69
|
+
|
|
70
|
+
- `wiki_capture_trajectory` writes the immutable packet + a **self-contained summary**
|
|
71
|
+
(`extracted.md`), auto-extracting the tool-call sequence from the live session (you
|
|
72
|
+
usually only pass a `title`). It does **not** emit a to-be-fleshed skeleton — capture
|
|
73
|
+
is a single lightweight call.
|
|
74
|
+
- `wiki_distill_skills` returns undistilled trajectories so you can generalize them
|
|
75
|
+
into reusable `skill` pages (and optionally `case` pages) via `wiki_ensure_page`.
|
|
76
|
+
- `wiki_recall_skill` filters layered recall to `skill`/`case` pages —
|
|
77
|
+
"have I done something like this before?". Call it at task start.
|
|
78
|
+
|
|
79
|
+
A **skill** generalizes across many trajectories ("how I do X"); a **case** is one
|
|
80
|
+
concrete past run ("the time I did X for project Y"). Trajectory packets live under
|
|
81
|
+
`raw/**` and are therefore immutable under the same guardrail as source packets —
|
|
82
|
+
edit the `case`/`skill` pages, never the packet.
|
|
83
|
+
|
|
84
|
+
### When to use which memory tool
|
|
85
|
+
|
|
86
|
+
| Tool | Stores | Use for |
|
|
87
|
+
|------|--------|---------|
|
|
88
|
+
| `wiki_capture_trajectory` | A structured, **replayable** tool-call packet (`packet.json`: tool names + arguments + results + errors) | "How did I *mechanically* solve this?" — the exact step sequence, to distill into a repeatable skill |
|
|
89
|
+
| `wiki_retro` | A durable prose **insight** (one markdown file) | "What did I learn?" — a lesson/gotcha worth keeping, not a step list |
|
|
90
|
+
| `wiki_observe` | A timestamped prose **observation** | Lightweight running notes the extension reminds you to jot during a task |
|
|
91
|
+
|
|
92
|
+
Why a separate trajectory store and not pi's built-in observational-memory? pi's
|
|
93
|
+
observational-memory keeps **prose** for context-compaction survival — it does not
|
|
94
|
+
persist the structured tool-call sequence (names, arguments, results). The trajectory
|
|
95
|
+
packet is the only artifact that captures a task as a replayable record, which is what
|
|
96
|
+
makes skill distillation possible.
|
|
97
|
+
|
|
49
98
|
## How the Extension Helps You
|
|
50
99
|
|
|
51
100
|
| Task | Before (skill-only) | Now (extension-backed) |
|
|
@@ -87,6 +136,8 @@ Recall scales with vault size via **two-stage retrieval** (memex-style):
|
|
|
87
136
|
|
|
88
137
|
The gate is the `recallLinksThreshold` setting (namespaced `llm-wiki`, default **50** pages). Page count is read from `meta/registry.json` (O(1), no page-body I/O). Set it to `0` to force links-first always, or a large number to always keep previews inline.
|
|
89
138
|
|
|
139
|
+
**Skills/cases carve-out (recall adherence):** distilled `skill`/`case` pages (from the opt-in trajectories feature) are meant to be **applied immediately**, so recall inlines their short body directly instead of a bare link the agent tends to skip. The `recallSkillInlineMax` setting (namespaced `llm-wiki`, default **1600** chars, clamped to a non-negative integer) caps how much body is inlined; set it to `0` to disable inlining entirely (skills/cases fall back to pure links-first, and no page body is read at format time). Only relevant when `trajectories` is enabled.
|
|
140
|
+
|
|
90
141
|
### At End — Save Insights with wiki_retro
|
|
91
142
|
|
|
92
143
|
After completing any meaningful task, call `wiki_retro` to save key insights:
|
|
@@ -150,6 +201,9 @@ Use these directly — they handle scaffolding, bookkeeping, recall, and capture
|
|
|
150
201
|
- `wiki_rebuild_meta` — Force metadata rebuild
|
|
151
202
|
- `wiki_log_event` — Record a custom event
|
|
152
203
|
- `wiki_watch` — Schedule auto-updates
|
|
204
|
+
- `wiki_capture_trajectory` — Capture the completed task's tool-call trajectory (working-memory)
|
|
205
|
+
- `wiki_distill_skills` — Batch undistilled trajectories for skill synthesis
|
|
206
|
+
- `wiki_recall_skill` — Recall distilled skills + similar past cases
|
|
153
207
|
|
|
154
208
|
## Workflows
|
|
155
209
|
|
|
@@ -180,6 +234,15 @@ Use these directly — they handle scaffolding, bookkeeping, recall, and capture
|
|
|
180
234
|
4. Extension auto-updates metadata
|
|
181
235
|
5. Next time, layered recall surfaces your saved insight
|
|
182
236
|
|
|
237
|
+
### Task → Record → Distill (agent working-memory)
|
|
238
|
+
|
|
239
|
+
1. Finish a non-trivial task (debug, refactor, integration)
|
|
240
|
+
2. `wiki_capture_trajectory(title="...")` — auto-extracts the tool-call trajectory into `raw/trajectories/TRJ-*` with a self-contained summary (no skeleton)
|
|
241
|
+
3. Flesh out the `wiki/cases/` page (Task → Approach → Outcome)
|
|
242
|
+
4. `wiki_distill_skills()` — get undistilled trajectories
|
|
243
|
+
5. `wiki_ensure_page(type="skill", title="...")` — generalize into a reusable skill citing `[[trajectories/TRJ-...]]`
|
|
244
|
+
6. Next time, `wiki_recall_skill(query="...")` surfaces the skill/case before you start
|
|
245
|
+
|
|
183
246
|
## Page Conventions
|
|
184
247
|
|
|
185
248
|
### Naming
|
|
@@ -191,7 +254,7 @@ Use these directly — they handle scaffolding, bookkeeping, recall, and capture
|
|
|
191
254
|
|
|
192
255
|
```yaml
|
|
193
256
|
---
|
|
194
|
-
type: entity | concept | source | synthesis | analysis
|
|
257
|
+
type: entity | concept | source | synthesis | analysis | skill | case | trajectory
|
|
195
258
|
created: YYYY-MM-DD
|
|
196
259
|
updated: YYYY-MM-DD
|
|
197
260
|
sources: [sources/SRC-YYYY-MM-DD-NNN]
|
|
@@ -200,10 +263,13 @@ sources: [sources/SRC-YYYY-MM-DD-NNN]
|
|
|
200
263
|
|
|
201
264
|
Entity: add `category: person | organization | tool | project | product`
|
|
202
265
|
Concept: add `domain: ai | engineering | business | product | design | personal`
|
|
266
|
+
Skill: add `trajectories: [trajectories/TRJ-YYYY-MM-DD-NNN]`
|
|
267
|
+
Case: add `trajectory_id: TRJ-YYYY-MM-DD-NNN` and `outcome: success | failure | partial`
|
|
203
268
|
|
|
204
269
|
### Citations
|
|
205
270
|
|
|
206
271
|
Use stable source IDs: `[[sources/SRC-2026-04-28-001]]`
|
|
272
|
+
Cite trajectories with their stable IDs: `[[trajectories/TRJ-2026-04-28-001]]`
|
|
207
273
|
|
|
208
274
|
### Contradictions
|
|
209
275
|
|