Case packet
Neutral case identifier: case-1220e2f6e7f005
The possible directed relationship from Artifact A to Artifact B is under review.
Artifact A
Pointer design tradeoffs in progressive disclosure
A pointer is any lower-resolution representation that helps decide whether to load a knowledge item — a description, an abstract, a search result snippet, a re-ranker score, even a title. The concept is substrate-independent: a link (markdown reference with context phrase) is a pointer in our substrate; OpenViking's .abstract.md is a pointer in their virtual filesystem; a re-ranker output is a pointer in a retrieval pipeline.
Progressive disclosure works by giving agents pointers at increasing resolution — scan cheap ones first, load expensive content only when needed. But not all pointers are alike. They vary on three axes: context-specificity, cost, and reliability.
Context-specificity: when does the pointer learn about the consumer?
The most obvious axis. A pointer can know nothing about why the consumer is looking (a fixed description), something about the query (a re-ranker score), or everything about the surrounding argument (a crafted link phrase).
Fixed at write time. Descriptions, OpenViking's L0 abstracts. One precomputed summary per note, amortized over all reads. The same summary regardless of who's reading or why — context-free. This is enough for global operations (search, comparative reading, index building) where there's no surrounding argument to leverage.
Produced at query time. Search result snippets, retrieval scores, re-rankers, query-specific summaries. Some are cheap retrieval artifacts; some require inference. The common property is that they are produced for this query rather than stored ahead of time. That makes them more query-specific than fixed abstracts: "how does this system handle memory dedup?" can produce a ranking or snippet that fixed abstracts cannot. Cost and reliability vary by mechanism.
Crafted at link-authoring time. Link phrases in our system. The same note gets a different characterization at every link site:
- From a compression note:
[constraining] — orthogonal to compression; narrows interpretation rather than shortening - From a codification note:
[constraining] — codification is the far end of constraining - From an architecture note:
[constraining] — narrows the set of valid interpretations an agent can make
Each phrase leverages the surrounding argument the agent already has loaded — not just "what is this item" but "why does it matter here." This is the densest pointer type, but it requires human judgment and only exists where someone authored a link.
Reliability: the axis you forget until it breaks
If context-specificity were the only axis, the answer would be simple: compute the most specific pointer you can afford. As inference gets cheaper, query-time computation replaces fixed pointers. Problem solved.
But [agent statelessness] complicates this. Agents start cold every session. Routing is permanent architecture, not scaffolding they outgrow. And the [degradation cliff] is unforgiving: when routing fails, the agent doesn't slow down — it falls into generic LLM behavior, confidently executing without the KB's methodology.
Fixed pointers are reliable. They're there every time, same content, no query-time dependency. A query-time pipeline introduces new failure modes: poor retrieval, poor reranking, or poor inference can send the agent off the cliff. Crafted link phrases introduce another: if the author skipped the context phrase, the pointer is simply absent.
This means the three axes pull in different directions:
| Pointer type | Specificity | Cost | Reliability |
|---|---|---|---|
| Fixed (write-time) | Low — context-free | Cheapest per read | Highest — always present, deterministic |
| Query-time | Medium — query-specific | Per-query retrieval/inference cost | Medium — depends on retrieval/inference quality |
| Crafted (authoring-time) | Highest — argument-specific | Human judgment | Variable — depends on discipline |
No single type wins all three. A system needs a mix.
What this looks like in practice
Comparing OpenViking's tiers with ours makes the tradeoffs concrete:
| Role | OpenViking | Commonplace |
|---|---|---|
| Identity pointer | URI/name (~5-10 tok) | Title-as-claim (~10 tok) |
| Fixed filter | L0 abstract (~100 tok) | Description (~50 tok) |
| Intermediate overview | L1 overview (~2000 tok) | No equivalent |
| Relation-specific pointer | .relations.json reason string (weaker, relation-level) |
Link phrase (~20 tok), varies per link site |
| Full content | L2 original files | Note body |
Each system has a tier the other emphasizes. OpenViking invests in L1 — a 2000-token overview between the fixed filter and full content, useful for scoping before committing to a full read. We invest in crafted link phrases — 20-token characterizations that tell the agent why a target matters in the current argument. OpenViking does have relation annotations via .relations.json reason strings, but its main retrieval path still centers fixed pointers (uri + abstract) rather than per-link argumentative characterizations. Neither system uses query-time computation for navigation pointers yet.
Design implications
| Property | Fixed | Query-time | Crafted |
|---|---|---|---|
| Guaranteed to exist | Yes | Per-query | Authoring discipline |
| Quality ceiling | Generic | Query-specific | Argument-specific |
| Scales to global ops | Yes | Yes (at cost) | No |
| Failure mode | Stale if source changes | Bad retrieval/rerank/inference → cliff | Absent or weak |
The practical path: invest in crafted link phrases for local navigation (the common agent case), and use /validate to pressure notes toward reliable fixed descriptions for global operations. Watch query-time computation as inference costs drop — but treat it as supplementary to architectural routing, not a replacement.
Relevant Notes:
Artifact B
Agents navigate by deciding what to read next
An agent has a task and needs information she doesn't yet have. She can't read everything, so at every step she encounters pointers — links, index entries, search results, skill descriptions — and decides which to follow. That decision is the fundamental unit of navigation.
What makes the decision tractable
Every pointer asks the same question: should I follow this? The agent can never be sure before following — the content might not deliver. So the decision is always probabilistic: how likely is this pointer to lead somewhere relevant, and what does it cost to find out?
What makes it tractable is context — information surrounding the pointer that hints at what the target contains. A bare filename forces the agent to load the target just to judge relevance. A pointer embedded in explanatory prose lets her judge without paying that cost. The more context a pointer carries, the cheaper the navigation decision.
Context varies by navigation mode
Different pointer types carry different amounts of context. Inline links carry the most — the surrounding prose explains both what the target contains and why it matters. Search results carry the least — the agent has only titles and descriptions. Since [link-following and search impose different metadata requirements], the knowledge system must invest in different metadata for each mode: surrounding prose for link-following, titles and descriptions for search, and both for indexes that bridge the two.
Design implication
If navigation is deciding what to read, the knowledge system should make that decision as cheap as possible. [Title as claim] is the shortcut that works across all pointer types. When the title carries the argument, the pointer itself becomes the hint — every link text, every search result, every index entry does navigation work for free.
Relevant Notes:
- [Agentic Note-Taking 23: Notes Without Reasons] — validates (negative case): first-person testimony of what breaks when pointers lack context — embedding-generated links carry no reasons, making relevance estimation impossible before following
Under-review context phrase
the navigation decision is what pointers optimize for; link phrases are the most context-specific pointer type for that decision