Compare commits

...

3 commits

8 changed files with 75 additions and 25 deletions

View file

@ -1020,14 +1020,9 @@ and keep the wiki atomically navigable.
### Linking conventions ### Linking conventions
| Type | Format | - **Intra-genome:** `[[folder/file]]` — Obsidian wikilinks only.
| ---------------------- | ------------------------------------------- | - **Cross-genome:** NOT supported via wikilink. Submodule pointers make relative paths brittle. When a concept belongs to another genome, use the navigation skill to emit a raw stub into that genome's `raw/articles/` directory so its local ingest pipeline can process it.
| Internal (same genome) | `[[folder/slug]]` — Obsidian wikilinks only | - **External:** `[text](https://...)` — standard Markdown.
| Cross-genome | `[[../genome-target/wiki/folder/slug]]` |
| External | `[text](https://url)` — standard Markdown |
Never use `[text](relative/path)` for internal references. Obsidian wikilinks are
bidirectional and appear in the graph view.
### Log format ### Log format

View file

@ -27,6 +27,10 @@ check_deps() {
if ! command -v bw &>/dev/null; then if ! command -v bw &>/dev/null; then
warn "Optional tool 'bw' (Bitwarden CLI) not found. Vaultwarden integration will be manual." warn "Optional tool 'bw' (Bitwarden CLI) not found. Vaultwarden integration will be manual."
fi fi
if ! command -v python3 &>/dev/null; then
warn "Optional tool 'python3' not found. Needed for 'make test' and the ingest skill (index-append.py), not for setup."
fi
} }
check_git_identity() { check_git_identity() {

View file

@ -55,7 +55,7 @@ gcrypt_verify() {
# #
# USAGE: # USAGE:
# source lib/git-crypt.sh # source lib/git-crypt.sh
# cd ~/knowledge-genome-setup/genome-dev # cd ~/knowledge-genome-orchestrator/genome-dev
# gcrypt_rotate_key "genome-dev" # gcrypt_rotate_key "genome-dev"
# #
# REQUIRES: # REQUIRES:

View file

@ -12,7 +12,7 @@ _REGISTRY_LOADED=1
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Dynamic paths # Dynamic paths
WORK_DIR="${HOME}/knowledge-genome-setup" WORK_DIR="${HOME}/knowledge-genome-orchestrator"
KEYS_DIR="${WORK_DIR}/keys" KEYS_DIR="${WORK_DIR}/keys"
TEMPLATES_DIR="${PROJECT_ROOT}/templates" TEMPLATES_DIR="${PROJECT_ROOT}/templates"
LIB_DIR="${PROJECT_ROOT}/lib" LIB_DIR="${PROJECT_ROOT}/lib"

View file

@ -4,7 +4,7 @@
# Run the framework's validation on ONLY the files touched this session. # Run the framework's validation on ONLY the files touched this session.
# Reuses lib/lint.sh + lib/output.sh — same checks as `make lint`, scoped. # Reuses lib/lint.sh + lib/output.sh — same checks as `make lint`, scoped.
# #
# KG_LIB_DIR=/opt/knowledge-genome-setup/lib \ # KG_LIB_DIR=/opt/knowledge-genome-orchestrator/lib \
# scoped-lint.sh <genome_name> wiki/sources/x.md wiki/entities/y.md # scoped-lint.sh <genome_name> wiki/sources/x.md wiki/entities/y.md
# #
# Exits non-zero if any hard error is found, so the agent notices. # Exits non-zero if any hard error is found, so the agent notices.

View file

@ -179,7 +179,7 @@ Append at bottom of relevant section in `wiki/index.md`:
- [[folder/slug]] — One-line summary. `maturity: draft` - [[folder/slug]] — One-line summary. `maturity: draft`
``` ```
Never reorder. Alphabetical sort is handled by the pre-commit hook. Never reorder. Alphabetical sorting is handled by the post-processor (index-append.py); the pre-commit hook only enforces the security policy.
### Log entries ### Log entries

View file

@ -9,7 +9,7 @@
| Remote | `{{FORGEJO_URL}}/{{FORGEJO_USER}}/{{MASTER_REPO}}` | | Remote | `{{FORGEJO_URL}}/{{FORGEJO_USER}}/{{MASTER_REPO}}` |
**Role:** Cross-genome coordinator for the Knowledge Genome network. **Role:** Cross-genome coordinator for the Knowledge Genome network.
**Metrics:** no cross-genome boundary violations · submodule pointers current · cross-genome wikilinks valid · no private data outside local network. **Metrics:** no cross-genome boundary violations · submodule pointers current · cross-genome discoveries routed to target raw/ · zero stale submodule-relative wikilinks.
--- ---
@ -50,7 +50,7 @@ Genome-level operations are governed by the genome's `AGENTS.md`, not this file.
1. Operate within ONE genome at a time. No atomic commits across multiple genomes. 1. Operate within ONE genome at a time. No atomic commits across multiple genomes.
2. `core-karpathy` is read-only. Never commit to it. 2. `core-karpathy` is read-only. Never commit to it.
3. Cross-genome references use relative wikilinks only: `[[../genome-target/wiki/folder/page]]`. 3. Cross-genome references are NEVER expressed as wikilinks. When a concept belongs to another genome, use the navigation skill to emit a raw stub into that genome's `raw/articles/` and let its own ingest pipeline handle it asynchronously.
4. Never commit to `main` in any genome. PRs required; no self-merge. 4. Never commit to `main` in any genome. PRs required; no self-merge.
5. Per-genome `AGENTS.md` governs all wiki operations within that genome. This file governs boundaries only. 5. Per-genome `AGENTS.md` governs all wiki operations within that genome. This file governs boundaries only.
@ -59,6 +59,7 @@ Genome-level operations are governed by the genome's `AGENTS.md`, not this file.
- Load multiple `wiki/index.md` files simultaneously for cross-genome comparison — use qmd. - Load multiple `wiki/index.md` files simultaneously for cross-genome comparison — use qmd.
- Run `git-crypt`, `bw`, or Vaultwarden commands — host responsibility. - Run `git-crypt`, `bw`, or Vaultwarden commands — host responsibility.
- Modify files in more than one genome in the same operation. - Modify files in more than one genome in the same operation.
- Create cross-genome wikilinks (e.g., `[[../genome-*/wiki/...]]`). All cross-domain connections must be routed via the navigation skill as raw stubs.
- Modify `core-karpathy` in any way. - Modify `core-karpathy` in any way.
### ASK FIRST ### ASK FIRST
@ -79,14 +80,64 @@ Genome-level operations are governed by the genome's `AGENTS.md`, not this file.
--- ---
## Cross-Genome Lint ## Cross-Genome Pull (Navigation Skill)
_Manual, monthly — requires operator initiation. Not automated._ Cross-genome knowledge moves by **pull, never push**: the genome you are working in draws material *in*; nothing is ever written into another genome. The cross-genome reading is performed by a deterministic collector **outside any agent's context**, so the agent still operates within ONE genome (Immutable Rule 1 holds). The `cross_source` registry flag decides which genomes may be read as sources.
1. Use `qmd search "<concept>"` to find pages covering the same concept across genomes. ### How it works
2. Identify:
- Concepts defined in 2+ genomes with potentially conflicting definitions. Three actors, mirroring the ingest two-phase split:
- Entities referenced across genomes without a canonical cross-genome wikilink.
- Concepts in genome-X that should link to genome-Y but don't. 1. **Collector** (`collect-crossgen.sh`, deterministic, agent-free). Clones each genome flagged `cross_source: yes` **read-only at its remote HEAD** — a disposable checkout, for freshness; never the pinned submodule state. Reads each `wiki/index.md` plus the relevant pages and assembles a **dossier of excerpts with provenance** (source genome, page, date/commit). Writes nothing to any source genome.
3. Report findings. Do not modify any files. 2. **Synthesis** (agent, navigation skill, `read`/`edit` only). Reads **only the dossier** — a single artifact inside the working genome's context — then the skill deposits **one** abstract, non-private raw into the working genome at `raw/articles/crossgen-&lt;topic&gt;-&lt;&lt;YYYY-MM-DD&gt;.md`, and STOPS.
4. For each finding: create a conflict note in the genome where resolution belongs, following that genome's §Conflict procedure. 3. **Target ingest.** The working genome's own standard pipeline processes that raw → PR → human gate. Same gate as any other source.
### When to pull
Pull is initiated deliberately (operator- or context-driven, never on a timer). Produce a crossgen raw ONLY when all three hold:
1. **Ownership elsewhere.** The concept, entity, or pattern is defined and maintained in another genome, and you need it framed for the working domain.
2. **Structural relevance.** It influences decisions, patterns, or entities here — not a casual mention.
3. **No fresh local coverage.** `qmd search "&lt;concept&gt;"` in the working genome returns nothing, or only a stub that needs enrichment.
If in doubt, do NOT pull. A missed cross-reference is cheaper than crossgen spam.
### Boundaries (enforced by the master)
- **Sources are restricted to `cross_source: yes` genomes.** A genome flagged `no` (e.g., a client / confidential file) is NEVER read as a source — the collector skips it physically. The wall decides what may flow; it does not rely on the agent's discipline.
- **Sources are read-only, at HEAD.** No write, commit, branch, or PR in any genome other than the one being worked on.
- **NEVER `git submodule update --remote`.** Read other genomes via disposable read-only clones — never by moving this master's submodule pointers (that is ASK FIRST).
- **NEVER read `*/private/*`.** The skill runs `PRIVATE_CONTEXT: disabled` and `private/` is an encrypted blob; even on an unlocked host, private paths are off-limits.
- Confidential / client genomes are normally isolated from cross-genome pulls entirely (operator policy). Whatever genome a pull runs into, the output raw must be abstract and non-private.
### Output raw (the only artifact written)
**Path (in the working genome):** `raw/articles/crossgen-&lt;topic&gt;-&lt;&lt;YYYY-MM-DD&gt;.md`
Plain text. No YAML frontmatter (raw is immutable input). **No wikilinks of any kind** — never a `[[../genome-*/...]]` path.
```markdown
&gt; Cross-genome pull | Into: genome-&lt;working&gt; | Sources: genome-&lt;a&gt; (wiki/concepts/x.md), genome-&lt;b&gt; (wiki/entities/y.md) | HEAD: &lt;short-sha…&gt; | Date: YYYY-MM-DD
```
# &lt;Topic&gt; (synthesized from other genomes)
## What the source genomes say
[Abstract, faithful synthesis of the relevant material. Plain text, no private data, no wikilinks.]
## Relevance to this genome
[Why it matters in the working domain; textual references to existing local entities, if any.]
## Suggested local action
[Semantic hint for this genome's ingest: e.g., create/update wiki/concepts/&lt;concept&gt;.md, map local relationships.]
---
- Each pull writes a **new, dated** crossgen file — never overwrite or edit an existing raw (raw is immutable). Deduplication happens later, at the **wiki** level: the working genome's normal ingest reconciles against existing pages via its §Conflict procedure.
- The raw is processed by the working genome's standard ingest as an ordinary `raw/articles/` source — no special path.
- The collector and the raw deposit are the **deterministic** side of the skill; the agent only synthesizes content. Agents never create, modify, or delete files in any `raw/` directly.
---
That closes the remaining audit items for `agents-master.md`. The file is now fully pull-oriented and consistent with the dossier.

View file

@ -12,9 +12,9 @@ private: false
**[AGENT INSTRUCTION]** **[AGENT INSTRUCTION]**
This is the primary navigation file. Read it first on every session before accessing individual pages. This is the primary navigation file. Read it first on every session before accessing individual pages.
Append new entries at the bottom of the relevant section — do not reorder or rewrite sections. Append new entries at the bottom of the relevant section — do not reorder or rewrite sections.
Alphabetical sorting is handled automatically by the pre-commit hook. Alphabetical sorting is handled by the post-processor (index-append.py); the pre-commit hook only enforces the security policy.
Update `last_updated` in the YAML frontmatter on every edit. Update `last_updated` in the YAML frontmatter on every edit.
Entry format: `- [[folder/slug]] — One-line summary. \`maturity: <value>\`` Entry format: `- [[folder/slug]] — One-line summary. \`maturity: &lt;value&gt;\``
--- ---