# Auto Link In the current implementation, `auto_link` is not a separately registered Job. It is a capability of the Integrate stage in `auto_dream`: when `dream_integrate_step` writes a memory unit to `digest/`, it also recalls digest nodes, makes a deduplication decision, links sources, and weaves wikilinks to related nodes into the result. For the complete dream flow, see [Auto Dream](./auto_dream.md). For general wikilink, frontmatter, and workspace-relative path semantics, see [Memory as File](./memory_as_file.md). For question-answering retrieval, see [Memory Search](./memory_search.md). ## Where It Runs The default `auto_dream` flow is: ```yaml auto_dream: steps: - dream_extract_step - dream_integrate_step # where auto_link actually happens - dream_topics_step - dream_finish_step ``` The Integrate stage processes each unit independently. A unit is written to exactly one target digest node, but that node may link to multiple sources and multiple related digest nodes. ## Goals `auto_link` addresses graph quality at write time: | Problem | Handling | |------------------------------------------------|----------------------------------------------------------------------| | The same memory already exists | Recall and update the existing node instead of creating a duplicate. | | New and existing material are related | Write workspace-relative wikilinks into the body. | | A digest node is disconnected from its sources | Add daily/resource links under a `## Sources` section. | | A node contains only isolated prose | Add links to related digest nodes on both CREATE and UPDATE. | ## Toolchain `dream_integrate_step` exposes these tools to the agent: ```text node_search read frontmatter_read write edit frontmatter_update ``` `node_search` is digest-only node retrieval designed for dream integration. It returns node-level signals such as the digest node's `path` and the `name` and `description` from frontmatter. It does not expand the body and does not perform the link expansion used by ordinary search. `read` and `frontmatter_read` are used only for candidates that may be relevant, avoiding expansion of every recalled result into a large context. ## Linking Flow ### 1. Recall candidate nodes The agent first calls `node_search` with the unit's triggers, verbs, nouns, synonyms, and possible failure modes. Broad recall, for example `limit=20-30`, is recommended by default because this step serves both deduplication and link discovery. Recalled results are internally classified into three groups: | Classification | Meaning | Next action | |--------------------|---------------------------------------------------------------------------------------------------------|---------------------------| | `same_abstraction` | The trigger or underlying abstraction is the same, with substantial content overlap. | Use as the UPDATE target. | | `related` | An adjacent process, prerequisite, failure mode, concept, preference, or upstream/downstream knowledge. | Write a body wikilink. | | `unrelated` | Only superficially similar or unrelated. | Ignore. | ### 2. Choose a write action Every unit must select one action: | Action | Linking semantics | |---------------|-------------------------------------------------------------------------------------------------------------------------------| | `CREATE` | Write a new `digest//.md` and add source and related-node links to its body. | | `CORROBORATE` | The same abstraction appeared again; append its source link and strengthen the description when needed. | | `REFINE` | New material extends the existing node; insert the additional content in the appropriate section and preserve existing links. | | `CORRECT` | New material corrects the existing node; use source links to identify the basis for the correction. | An UPDATE should be additive whenever possible: do not delete existing wikilinks or source entries. This prevents later graph indexing and retrieval from losing edges. ### 3. Write source edges Source edges are ordinary wikilinks grouped under a Markdown heading: ```markdown ## Sources The decision was recorded in [[daily/2026-06-20/session.md]], while the supporting technical evidence comes from [[resource/2026-06-20/paper.md]]. ``` These edges represent the evidence behind a digest node. Plain-text descriptions do not count as source edges because only wikilinks can be parsed reliably by the file graph. The surrounding sentence must explain what each source supports; a bare wikilink line is not valid Integrate output. For the complete parsing rules, see [Memory as File](./memory_as_file.md#wikilink). ### 4. Write relationships between digest nodes Relationships between digest nodes use complete workspace-relative paths woven into natural prose: ```markdown This design extends [[digest/wiki/hybrid-search.md]] and uses [[digest/procedure/rebuild-index.md]]. Follow [[digest/personal/team-review-preference.md]] during review. ``` ## Bucket Differences `auto_link` adjusts the shape of its output according to the unit bucket: | Bucket | Writing focus | |-------------|-----------------------------------------------------------------------------------------------------------------------------| | `procedure` | Write a runbook with triggers, steps, inputs, and failure modes. Link prerequisites, substeps, and related preferences. | | `personal` | Write user-, team-, or project-specific facts and preferences. Link related projects, habits, and decision context. | | `wiki` | Write general knowledge, principles, observations, and decision precedents. Link concepts, methods, and adjacent knowledge. | Regardless of bucket, preserve source edges and weave recalled related digest nodes into the body whenever possible. ## Relationship to Search `auto_link` uses `node_search`, not the question-answering `search`. | Capability | Purpose | |---------------|-----------------------------------------------------------------------------------------------------------| | `search` | External question answering; returns chunks and can expand upstream/downstream link context. | | `node_search` | Dream integration; recalls only digest node-level summaries for deduplication and related-link decisions. | This boundary matters. The Integrate stage needs to decide whether the same abstraction already exists and which nodes should be linked; it should not load large numbers of body chunks into context. [Memory Search](./memory_search.md) handles question-oriented chunk retrieval, RRF fusion, and link expansion. ## Failure and Retry If integration of a unit fails, `dream_integrate_step` records `failed_units` and `failed_paths`. `dream_finish_step` does not checkpoint those source paths, so the next `auto_dream` run processes them again. This makes auto_link writes retryable: a failure does not mark the input as complete or silently discard digest edges that should have been created.