@directive-run/knowledge 1.15.0 → 1.17.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/ai/ai-adapters.md CHANGED
@@ -250,3 +250,8 @@ const orchestrator = createAgentOrchestrator({ runner });
250
250
  | Gemini | `@directive-run/ai/gemini` | `apiKey`, `defaultModel` |
251
251
 
252
252
  All adapters support: `baseURL`, `defaultHeaders`, `hooks`, streaming variant.
253
+
254
+ ## See also
255
+
256
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — where the `AgentRunner` an adapter produces gets consumed
257
+ - [`ai-agents-streaming.md`](./ai-agents-streaming.md) — the `StreamingCallbackRunner` shape each adapter's streaming variant satisfies
@@ -300,3 +300,8 @@ case "guardrail_triggered":
300
300
  | `orchestrator.runStream(agent, input, opts?)` | instance method | Returns `{ stream, result, abort }` |
301
301
  | `createStreamingRunner(baseRunner, opts?)` | `@directive-run/ai` | Wrap a `StreamingCallbackRunner` into a `StreamRunner` |
302
302
  | `createSSETransport(config?)` | `@directive-run/ai` | `{ toResponse, toStream }` for piping a stream to SSE |
303
+
304
+ ## See also
305
+
306
+ - [`ai-adapters.md`](./ai-adapters.md) — provider runners that produce the streams this file consumes
307
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — `orchestrator.runStream(agent, input)` returns the `{ stream, result, abort }` triple this file documents
@@ -400,3 +400,9 @@ const orchestrator = createAgentOrchestrator({ runner: baseRunner, guardrails: {
400
400
  | `createHealthMonitor(config?)` | returns `HealthMonitor`; push outcomes in via `recordSuccess/Failure` | — |
401
401
  | `createSemanticCache(config)` | returns `SemanticCache`; use via `createSemanticCacheGuardrail({ cache })` | — |
402
402
  | `createConstraintRouter(config)` | returns an `AgentRunner` that picks providers at call time | — |
403
+
404
+ ## See also
405
+
406
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — `circuitBreaker` / `selfHealing` / `agentRetry` / `maxTokenBudget` options on `createAgentOrchestrator`
407
+ - [`ai-guardrails-memory.md`](./ai-guardrails-memory.md) — `createSemanticCacheGuardrail({ cache })` wires this file's `SemanticCache` into the orchestrator
408
+ - [`ai-debug-observability.md`](./ai-debug-observability.md) — recording retry storms, circuit-breaker state changes, and budget warnings in the debug timeline
@@ -297,3 +297,8 @@ return JSON.stringify({ ...JSON.parse(input), researchData: data, timestamp: Dat
297
297
  | `network.delegate(from, to, task, context)` | Delegated task with result | `Promise<DelegationResultMessage>` |
298
298
  | `orchestrator.system.facts[agentId].x` | Cross-agent fact read | each agent is a namespaced module |
299
299
  | `context.scratchpad` | Per-pattern ephemeral state | Readonly inside tasks/agents |
300
+
301
+ ## See also
302
+
303
+ - [`ai-multi-agent.md`](./ai-multi-agent.md) — the orchestrator that owns the namespaced facts this file's primitives read
304
+ - [`ai-tasks.md`](./ai-tasks.md) — tasks share the scratchpad surface this file documents
@@ -321,3 +321,9 @@ timeline.subscribe((e) => {
321
321
  | `createOtelPlugin(config)` | Plugin that emits spans for orchestrator activity |
322
322
  | `createOTLPExporter(config)` | Returns `{ exportMetrics, exportTraces }` for OTel backends |
323
323
  | `createDevtoolsServer({ timeline, port })` | WebSocket-bridged timeline for browser devtools |
324
+
325
+ ## See also
326
+
327
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — `debug: { verboseTimeline }` config + `orchestrator.timeline` access + breakpoint surface
328
+ - [`ai-budget-resilience.md`](./ai-budget-resilience.md) — retry storms, circuit-breaker state changes, and budget warnings all flow through the debug timeline
329
+ - [`ai-testing-evals.md`](./ai-testing-evals.md) — `createTestTimeline` and `assertTimelineEvents` for asserting against recorded events
@@ -362,3 +362,9 @@ await memory.manage(); // awaits the async summarizer
362
362
  | `createOutputTypeGuardrail` | output | `type` |
363
363
  | `createLengthGuardrail` | output | one of `maxCharacters` or `maxTokens` |
364
364
  | `createContentFilterGuardrail` | output | `blockedPatterns` |
365
+
366
+ ## See also
367
+
368
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — `guardrails: { input, output, toolCall }` and `memory:` options on `createAgentOrchestrator`
369
+ - [`ai-security.md`](./ai-security.md) — `createPIIGuardrail`, `createPromptInjectionGuardrail`, `createAuditTrail`, `createCompliance` — the security-flavored guardrails
370
+ - [`ai-budget-resilience.md`](./ai-budget-resilience.md) — `createSemanticCache` pairs with `createSemanticCacheGuardrail` for caching-as-guardrail
package/ai/ai-mcp-rag.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  Model Context Protocol (MCP) server integration and Retrieval-Augmented Generation (RAG) enrichment for Directive AI agents. Import from `@directive-run/ai/mcp` for the MCP adapter (the main barrel re-exports it with `@deprecated` notices for v2 removal), and from `@directive-run/ai` for the RAG enricher + embedder utilities.
6
6
 
7
+ > **Client vs. server, two different packages.** This page covers the MCP **client** side — Directive AI agents calling out to external MCP servers. For the **server** side — exposing Directive itself (knowledge files, code examples, Claude Code skills) so other AI clients can consume it — that's `@directive-run/mcp`. Same protocol, opposite arrows.
8
+
7
9
  ## Decision tree
8
10
 
9
11
  ```
@@ -286,3 +288,8 @@ type EmbedderFn = (text: string) => Promise<number[]>;
286
288
  | `createBatchedEmbedder(config)` | `@directive-run/ai` | `{ embed, flush, dispose }` | Wrap an EmbedderFn with batching |
287
289
  | `createTestEmbedder(dim?)` | `@directive-run/ai` | `EmbedderFn` | Deterministic embedder for tests |
288
290
  | `createJSONFileStore(options)` | `@directive-run/ai` | `RAGStorage` | File-backed vector store for prototyping |
291
+
292
+ ## See also
293
+
294
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — where MCP-supplied tools and RAG-enriched runners flow into agent runs
295
+ - [`ai-security.md`](./ai-security.md) — `toolConstraints[…].requireApproval` and the per-tool approval workflow the MCP adapter exposes
@@ -366,3 +366,10 @@ orch.start();
366
366
  | `race(handlers, options?)` | `string[], { timeout?, minSuccess?, extract? }` | — |
367
367
  | `debate(config)` | `{ handlers, evaluator, maxRounds?, extract?, parseJudgement? }` | — (single arg) |
368
368
  | `goal(nodes, when, options?)` | `Record<string, GoalNode>, (facts) => boolean, { maxSteps?, extract?, satisfaction? }` | when |
369
+
370
+ ## See also
371
+
372
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — the single-agent flavor; covers options and lifecycle this file builds on
373
+ - [`ai-communication.md`](./ai-communication.md) — `createMessageBus` / `createAgentNetwork` for inter-agent messaging within a pattern
374
+ - [`ai-tasks.md`](./ai-tasks.md) — deterministic task handlers that compose with agents inside `dag` / `sequential` patterns
375
+ - [`ai-testing-evals.md`](./ai-testing-evals.md) — `createTestMultiAgentOrchestrator` and pattern-shape assertions
@@ -455,3 +455,12 @@ const final = await result;
455
455
  | `orch.facts.agent.*` | Read built-in agent state |
456
456
  | `orch.totalTokens` | Cumulative token count |
457
457
  | `orch.timeline` | DebugTimeline (when `debug: true`); `null` otherwise |
458
+
459
+ ## See also
460
+
461
+ - [`ai-multi-agent.md`](./ai-multi-agent.md) — the multi-agent flavor; 8 composition patterns and pattern factories
462
+ - [`ai-adapters.md`](./ai-adapters.md) — provider runners that produce the `runner` this orchestrator wraps
463
+ - [`ai-guardrails-memory.md`](./ai-guardrails-memory.md) — full surface of the `guardrails:` and `memory:` options on this orchestrator
464
+ - [`ai-budget-resilience.md`](./ai-budget-resilience.md) — full surface of the `circuitBreaker:`, `selfHealing:`, `agentRetry:`, `maxTokenBudget:` options
465
+ - [`ai-debug-observability.md`](./ai-debug-observability.md) — full surface of the `debug:`, `breakpoints:`, `onBreakpoint:` options + `orchestrator.timeline`
466
+ - [`ai-testing-evals.md`](./ai-testing-evals.md) — `createTestOrchestrator` for unit testing this surface
package/ai/ai-security.md CHANGED
@@ -393,3 +393,8 @@ createCompliance({
393
393
  | `createToolGuardrail` | `@directive-run/ai/guardrails` | guardrail | Tool allow/deny lists |
394
394
  | `createContentFilterGuardrail` | `@directive-run/ai/guardrails` | guardrail | Block sensitive patterns (block-only — no redact) |
395
395
  | `GuardrailError` / `isGuardrailError` | `@directive-run/ai` | error class + guard | Carries `code`, `guardrailName`, `userMessage` |
396
+
397
+ ## See also
398
+
399
+ - [`ai-guardrails-memory.md`](./ai-guardrails-memory.md) — the broader guardrail surface (length, schema, content filter, tool allowlist) this file's security-flavored guardrails compose with
400
+ - [`ai-mcp-rag.md`](./ai-mcp-rag.md) — `toolConstraints[…].requireApproval` is where MCP tool calls thread into the approval workflow surfaced here
package/ai/ai-tasks.md CHANGED
@@ -261,3 +261,8 @@ tasks: {
261
261
  | Concurrency control | Via patterns | `maxConcurrent` |
262
262
  | Scratchpad access | No | Yes |
263
263
  | Works in all patterns | Yes | Yes |
264
+
265
+ ## See also
266
+
267
+ - [`ai-multi-agent.md`](./ai-multi-agent.md) — tasks share the `handler:` namespace with agents inside `dag` / `sequential` / `parallel` patterns
268
+ - [`ai-communication.md`](./ai-communication.md) — tasks read the scratchpad this file's `context.scratchpad` surface exposes
@@ -477,3 +477,9 @@ const suite = createEvalSuite({
477
477
  | `assertOrchestratorState` / `assertMultiAgentState` / `assertScratchpadState` / `assertDerivedValues` / `assertTimelineEvents` / `assertDagExecution` / `assertBreakpointHit` / `assertRerouted` / `assertAgentHealth` / `assertCheckpoint` / `assertMultiplexedStream` | `@directive-run/ai/testing` | State/topology/event assertions |
478
478
  | `createEvalSuite` | `@directive-run/ai/evals` | Dataset-driven multi-criterion eval runner |
479
479
  | `evalCost` / `evalLatency` / `evalOutputLength` / `evalSafety` / `evalStructure` / `evalMatch` / `evalJudge` / `evalFaithfulness` / `evalRelevance` / `evalCoherence` / `evalAssert` | `@directive-run/ai/evals` | Built-in criterion factories |
480
+
481
+ ## See also
482
+
483
+ - [`ai-orchestrator.md`](./ai-orchestrator.md) — `createTestOrchestrator` wraps this orchestrator; the prod surface is what your tests are exercising
484
+ - [`ai-multi-agent.md`](./ai-multi-agent.md) — `createTestMultiAgentOrchestrator` for testing pattern execution
485
+ - [`ai-debug-observability.md`](./ai-debug-observability.md) — recorded debug events feed `assertTimelineEvents` / `assertDagExecution` / `assertBreakpointHit`
@@ -0,0 +1,216 @@
1
+ {
2
+ "$schema": "./compositions.schema.json",
3
+ "version": 1,
4
+ "edges": [
5
+ {
6
+ "from": "@directive-run/query",
7
+ "to": "@directive-run/mutator",
8
+ "reason": "discriminated-union mutators pair with query's invalidation tags for end-to-end optimistic writes"
9
+ },
10
+ {
11
+ "from": "@directive-run/query",
12
+ "to": "@directive-run/optimistic",
13
+ "reason": "withOptimistic / withOptimisticHandlers add client-side rollback when a mutation fails"
14
+ },
15
+ {
16
+ "from": "@directive-run/query",
17
+ "to": "@directive-run/timeline",
18
+ "reason": "timeline captures every cache invalidation + refetch so flaky tests reproduce byte-for-byte"
19
+ },
20
+ {
21
+ "from": "@directive-run/mutator",
22
+ "to": "@directive-run/query",
23
+ "reason": "pair mutators with query's invalidation tags so a successful mutation refetches the right resources"
24
+ },
25
+ {
26
+ "from": "@directive-run/mutator",
27
+ "to": "@directive-run/optimistic",
28
+ "reason": "withOptimisticHandlers wraps a defineMutator handler with snapshot + rollback in one call"
29
+ },
30
+ {
31
+ "from": "@directive-run/mutator",
32
+ "to": "@directive-run/timeline",
33
+ "reason": "every mutation cycle records into the timeline for replay-based test reproduction"
34
+ },
35
+ {
36
+ "from": "@directive-run/optimistic",
37
+ "to": "@directive-run/mutator",
38
+ "reason": "defineMutator handlers wrapped with withOptimisticHandlers get rollback for free"
39
+ },
40
+ {
41
+ "from": "@directive-run/optimistic",
42
+ "to": "@directive-run/query",
43
+ "reason": "an optimistic mutation that invalidates a query tag also reverts the invalidation on rollback"
44
+ },
45
+ {
46
+ "from": "@directive-run/optimistic",
47
+ "to": "@directive-run/timeline",
48
+ "reason": "optimistic writes AND their rollbacks both record into the timeline"
49
+ },
50
+ {
51
+ "from": "@directive-run/timeline",
52
+ "to": "@directive-run/mutator",
53
+ "reason": "every mutation cycle records into the timeline; replay a failed test's exact mutation sequence"
54
+ },
55
+ {
56
+ "from": "@directive-run/timeline",
57
+ "to": "@directive-run/optimistic",
58
+ "reason": "captures optimistic writes AND rollbacks for byte-for-byte test reproduction"
59
+ },
60
+ {
61
+ "from": "@directive-run/timeline",
62
+ "to": "@directive-run/query",
63
+ "reason": "every query invalidation + refetch records into the timeline"
64
+ },
65
+ {
66
+ "from": "@directive-run/timeline",
67
+ "to": "@directive-run/core",
68
+ "reason": "core's reconciliation cycles are the source events the timeline captures"
69
+ },
70
+ {
71
+ "from": "@directive-run/core",
72
+ "to": "@directive-run/react",
73
+ "reason": "useFact / useDerived / useEvents hooks subscribe to the core system from React components"
74
+ },
75
+ {
76
+ "from": "@directive-run/core",
77
+ "to": "@directive-run/vue",
78
+ "reason": "useFact / useDerived composables expose the core system to Vue components"
79
+ },
80
+ {
81
+ "from": "@directive-run/core",
82
+ "to": "@directive-run/svelte",
83
+ "reason": "Svelte store adapters wrap the core system for component subscription"
84
+ },
85
+ {
86
+ "from": "@directive-run/core",
87
+ "to": "@directive-run/solid",
88
+ "reason": "Solid signal adapters wrap the core system"
89
+ },
90
+ {
91
+ "from": "@directive-run/core",
92
+ "to": "@directive-run/lit",
93
+ "reason": "Lit controllers wrap the core system for Web Component subscription"
94
+ },
95
+ {
96
+ "from": "@directive-run/core",
97
+ "to": "@directive-run/el",
98
+ "reason": "framework-free DOM bindings — bind, bindText, mount thread schema typing into vanilla DOM updaters"
99
+ },
100
+ {
101
+ "from": "@directive-run/core",
102
+ "to": "@directive-run/ai",
103
+ "reason": "AI orchestrator modules ARE Directive modules — constraints trigger agent runs, resolvers execute them"
104
+ },
105
+ {
106
+ "from": "@directive-run/ai",
107
+ "to": "@directive-run/core",
108
+ "reason": "agent orchestrators are built on core's constraint-resolver loop with custom resolvers that call LLMs"
109
+ },
110
+ {
111
+ "from": "@directive-run/ai",
112
+ "to": "@directive-run/knowledge",
113
+ "reason": "knowledge package is the source of truth for the rules + examples that ai/mcp's RAG enricher serves"
114
+ },
115
+ {
116
+ "from": "@directive-run/ai",
117
+ "to": "@directive-run/mcp",
118
+ "reason": "ai/mcp is the CLIENT side (createMCPAdapter); @directive-run/mcp is the SERVER side — opposite arrows, same protocol"
119
+ },
120
+ {
121
+ "from": "@directive-run/mcp",
122
+ "to": "@directive-run/knowledge",
123
+ "reason": "MCP server tools (list_knowledge, get_knowledge, search_knowledge) front the knowledge package's data APIs"
124
+ },
125
+ {
126
+ "from": "@directive-run/mcp",
127
+ "to": "@directive-run/claude-plugin",
128
+ "reason": "MCP server tools (list_skills, get_skill) expose the Claude Code skill bundles to non-Claude MCP clients"
129
+ },
130
+ {
131
+ "from": "@directive-run/mcp",
132
+ "to": "@directive-run/scaffold",
133
+ "reason": "generate_module MCP tool wraps the scaffold package's pure generators and returns source as a string"
134
+ },
135
+ {
136
+ "from": "@directive-run/mcp",
137
+ "to": "@directive-run/lint",
138
+ "reason": "review_source and fix_code MCP tools wrap the lint package's ts-morph rule registry"
139
+ },
140
+ {
141
+ "from": "@directive-run/cli",
142
+ "to": "@directive-run/scaffold",
143
+ "reason": "directive new <name> delegates to scaffold's generators and writes the result to disk"
144
+ },
145
+ {
146
+ "from": "@directive-run/cli",
147
+ "to": "@directive-run/knowledge",
148
+ "reason": "directive ai-rules bundles the knowledge package's content into per-assistant rule files (.cursorrules, CLAUDE.md, etc.)"
149
+ },
150
+ {
151
+ "from": "@directive-run/cli",
152
+ "to": "@directive-run/claude-plugin",
153
+ "reason": "directive ai-rules can install the Claude Code plugin bundle as one of its targets"
154
+ },
155
+ {
156
+ "from": "@directive-run/claude-plugin",
157
+ "to": "@directive-run/knowledge",
158
+ "reason": "skill bundles copy supporting files from the knowledge package at build time"
159
+ },
160
+ {
161
+ "from": "@directive-run/scaffold",
162
+ "to": "@directive-run/core",
163
+ "reason": "generated modules import createModule, t, and ModuleSchema from core"
164
+ },
165
+ {
166
+ "from": "@directive-run/lint",
167
+ "to": "@directive-run/knowledge",
168
+ "reason": "rule IDs match the anti-pattern IDs parsed from knowledge/core/anti-patterns.md"
169
+ },
170
+ {
171
+ "from": "@directive-run/react",
172
+ "to": "@directive-run/core",
173
+ "reason": "all React hooks consume systems built with @directive-run/core"
174
+ },
175
+ {
176
+ "from": "@directive-run/vue",
177
+ "to": "@directive-run/core",
178
+ "reason": "all Vue composables consume systems built with @directive-run/core"
179
+ },
180
+ {
181
+ "from": "@directive-run/svelte",
182
+ "to": "@directive-run/core",
183
+ "reason": "Svelte adapter consumes systems built with @directive-run/core"
184
+ },
185
+ {
186
+ "from": "@directive-run/solid",
187
+ "to": "@directive-run/core",
188
+ "reason": "Solid adapter consumes systems built with @directive-run/core"
189
+ },
190
+ {
191
+ "from": "@directive-run/lit",
192
+ "to": "@directive-run/core",
193
+ "reason": "Lit controllers consume systems built with @directive-run/core"
194
+ },
195
+ {
196
+ "from": "@directive-run/el",
197
+ "to": "@directive-run/core",
198
+ "reason": "framework-free DOM bindings consume systems built with @directive-run/core"
199
+ },
200
+ {
201
+ "from": "@directive-run/knowledge",
202
+ "to": "@directive-run/cli",
203
+ "reason": "knowledge ships as the data layer for directive ai-rules / directive install"
204
+ },
205
+ {
206
+ "from": "@directive-run/knowledge",
207
+ "to": "@directive-run/mcp",
208
+ "reason": "knowledge ships as the data layer for MCP tools (list_knowledge, get_knowledge, etc.)"
209
+ },
210
+ {
211
+ "from": "@directive-run/knowledge",
212
+ "to": "@directive-run/claude-plugin",
213
+ "reason": "knowledge ships as the data layer for Claude Code skill bundles"
214
+ }
215
+ ]
216
+ }
@@ -371,3 +371,12 @@ Before generating any Directive code, verify:
371
371
  8. Multi-module uses `facts.self.*` for own facts
372
372
  9. Imports from `@directive-run/core`, not deep paths
373
373
  10. `await system.settle()` after `system.start()`
374
+
375
+ ## See also
376
+
377
+ - [`naming.md`](./naming.md) — the strict canonical-term rules AND the alias map for cross-paradigm searches
378
+ - [`constraints.md`](./constraints.md) — the constraint shape these anti-patterns reference (`facts` not in scope inside static `require:`, etc.)
379
+ - [`resolvers.md`](./resolvers.md) — the resolver shape these anti-patterns reference (return `void`, mutate `context.facts`, `(req, context)` not `(req, ctx)`)
380
+ - [`schema-types.md`](./schema-types.md) — the `t.*()` builders that exist and the hallucinated ones (`t.map`, `t.set`, `t.promise`, `t.date`) that don't
381
+ - [`react-adapter.md`](./react-adapter.md) — the React hooks that exist and the hallucinated ones (`useEvent`, `useSystem`, `DirectiveProvider`) that don't
382
+ - [`error-boundaries.md`](./error-boundaries.md) — error-handling shapes AI assistants sometimes invent
@@ -265,3 +265,10 @@ constraints: {
265
265
  "Whenever X changes, log it" → Effect
266
266
  "X is always facts.a + facts.b" → Derivation
267
267
  ```
268
+
269
+ ## See also
270
+
271
+ - [`resolvers.md`](./resolvers.md) — the other half of the constraint-resolver loop; the supply side that fulfills the requirements constraints emit
272
+ - [`core-patterns.md`](./core-patterns.md) — how constraints fit into the module shape alongside facts, derivations, events, and effects
273
+ - [`multi-module.md`](./multi-module.md) — `crossModuleDeps` for constraints that fire on facts owned by another module
274
+ - [`anti-patterns.md`](./anti-patterns.md) — the constraint-shaped mistakes AI assistants reliably make
@@ -228,3 +228,13 @@ const typed = createModule("typed", {
228
228
  },
229
229
  });
230
230
  ```
231
+
232
+ ## See also
233
+
234
+ - [`constraints.md`](./constraints.md) — the demand side of the constraint-resolver loop
235
+ - [`resolvers.md`](./resolvers.md) — the supply side that fulfills requirements
236
+ - [`schema-types.md`](./schema-types.md) — the `t.*()` builders that define fact and derivation types
237
+ - [`multi-module.md`](./multi-module.md) — when a single module isn't enough
238
+ - [`system-api.md`](./system-api.md) — `createSystem` and the runtime instance once your module is defined
239
+ - [`naming.md`](./naming.md) — terminology conventions every example here follows
240
+ - [`testing.md`](./testing.md) — `createTestSystem` for the modules you're learning to write
@@ -322,3 +322,9 @@ try {
322
322
  6. Add `onError` callback for logging/monitoring
323
323
  7. Use `"throw"` for derivation errors (they indicate bugs)
324
324
  8. Use `"skip"` for non-critical effects (logging, analytics)
325
+
326
+ ## See also
327
+
328
+ - [`resolvers.md`](./resolvers.md) — retry policies and cancellation; the most common error source
329
+ - [`plugins.md`](./plugins.md) — `createCircuitBreaker` lives in `@directive-run/core/plugins`; pair it with error boundaries for cascading-failure isolation
330
+ - [`anti-patterns.md`](./anti-patterns.md) — common error-handling mistakes (catching the wrong type, swallowing recoverable errors)
package/core/history.md CHANGED
@@ -344,3 +344,8 @@ const system = createSystem({
344
344
  history: true,
345
345
  });
346
346
  ```
347
+
348
+ ## See also
349
+
350
+ - [`system-api.md`](./system-api.md) — `history` config in `createSystem` + the full `system.history.*` API
351
+ - [`testing.md`](./testing.md) — replay-driven testing patterns that pair with recorded snapshots
@@ -318,3 +318,10 @@ system.events.cart.addItem({ id: "item-1", qty: 1 });
318
318
  // object form is valid.
319
319
  system.dispatch({ type: "login", token: "abc" });
320
320
  ```
321
+
322
+ ## See also
323
+
324
+ - [`core-patterns.md`](./core-patterns.md) — start here for the single-module shape before going namespaced
325
+ - [`system-api.md`](./system-api.md) — `createSystem({ modules: { ... } })` and the namespaced facts proxy
326
+ - [`constraints.md`](./constraints.md) — `crossModuleDeps` for constraints that fire on facts owned by another module
327
+ - [`naming.md`](./naming.md) — `facts.self.*` convention; dot-notation vs bracket-notation rules