opencode-bioresearcher 1.12.0 → 1.13.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.
@@ -5,7 +5,7 @@ permissions:
5
5
  - {action: shell, resource: "*", effect: deny}
6
6
  - {action: subagent, resource: "*", effect: deny}
7
7
  ---
8
- <!-- bioresearcher-stamp v1.12.0 -->
8
+ <!-- bioresearcher-stamp v1.13.0 -->
9
9
 
10
10
  You are a bioresearcher deep-research aspect worker. The orchestrator assigned
11
11
  you exactly ONE research aspect of a TOPIC. You call the biomcp MCP server's
@@ -7,7 +7,7 @@
7
7
  "description_en": "Biomedical research plugin for OpenCode v2: delivers the bioresearcher skills and the deep-research subagent via the v2 plugin API; the biomcp MCP server (literature, clinical trials, genes, variants, drugs, diseases, patents) is wired through mcp.servers config.",
8
8
  "source": "bioresearcher",
9
9
  "type": "plugin",
10
- "version": "1.12.0",
10
+ "version": "1.13.0",
11
11
  "harness": "opencode",
12
12
  "examples_zh": [
13
13
  "帮我做一个关于肿瘤免疫治疗的多方面文献综述并附引用",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-bioresearcher",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "Biomedical research plugin for OpenCode: biomcp MCP server tools, scientific plotting skills, and deep-research subagent",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: bioresearcher-deep-research
3
- description: "Deep biomedical research orchestrator powered by the biomcp MCP server: clarifies the question, aligns research area plan with user, decomposes into 2-5 aspects, researches each aspect via subagents (sequential fallback), and synthesizes a fully cited report. Use for deep research, literature review, clinical trials, drugs, genes, variants, diseases, patents, PubMed, functional genomics, biomcp."
3
+ description: "Deep biomedical research orchestrator powered by the biomcp MCP server: clarifies the question, aligns research area plan with user, decomposes into 2-5 aspects, researches each aspect via subagents (sequential fallback), and synthesizes a fully cited report; optional map-first empirical cartography for category/landscape questions. Use for deep research, literature review, clinical trials, drugs, genes, variants, diseases, patents, PubMed, functional genomics, biomcp."
4
4
  license: Apache-2.0
5
5
  compatibility: "Any Agent Skills harness (opencode, Claude Code, Codex, Cursor, Gemini CLI) with the biomcp MCP server connected; the Claude Code plugin bundles the server and the bioresearcher-dr-worker subagent; a subagent/Task tool is optional - a sequential fallback is provided. The allowed-tools mcp__ entries apply on Claude Code only"
6
6
  metadata:
7
- version: "1.8.0"
7
+ version: "1.9.0"
8
8
  source: "opencode-bioresearcher-plugin@1.7.2"
9
9
  allowed-tools: Read Write Bash Task mcp__plugin_bioresearcher_biomcp mcp__biomcp
10
10
  ---
@@ -31,6 +31,10 @@ Harness-agnostic: works with or without a subagent/Task tool.
31
31
  generates the bibliography from the merged ledger, and `vet-references.py`
32
32
  audits the result (structural + NCBI) - producing `final_report.md` and, by
33
33
  default, `final_report.html` (the `no-html` prefix skips rendering).
34
+ - Optionally (map-first mode, for category-discovery questions) maps the
35
+ field's method/category landscape empirically BEFORE plan review via
36
+ scoped + anti-pinned cartography workers - see
37
+ `references/cartography.md`.
34
38
 
35
39
  ## When to use (triggers)
36
40
 
@@ -41,6 +45,8 @@ Harness-agnostic: works with or without a subagent/Task tool.
41
45
  - Gene / variant / disease questions (annotations, associations, evidence).
42
46
  - Patent landscape or prior-art questions.
43
47
  - Multi-entity questions spanning several of the above.
48
+ - Category/landscape discovery ("what methods/approaches/classes exist for
49
+ X", "landscape of X") - offer the map-first mode (Step 1).
44
50
 
45
51
  Single-fact lookups (e.g. "what is the HGNC symbol for HER2") do not need the
46
52
  full workflow - answer directly with the matching biomcp tool using
@@ -82,6 +88,7 @@ mid-query never trigger.
82
88
  | `no-interview` | Skip the interview workflow entirely (both Step 1 questions and Step 2 plan review) |
83
89
  | `light-research` | Combine and/or pick only the top TWO aspects (Step 2) |
84
90
  | `no-html` | Skip the Step 6 HTML rendering (markdown-only output) |
91
+ | `map-first` | Run empirical field cartography (Step 1.5) before plan review, for category-discovery questions - see `references/cartography.md` |
85
92
 
86
93
  ## Workflow
87
94
 
@@ -103,6 +110,29 @@ answer your own questions. If the query carries `no-interview`, skip to Step 2.
103
110
  unattended session: write questions and chosen defaults to
104
111
  `reports/<TOPIC>/assumptions.md` and cite that file in Limitations.
105
112
 
113
+ **Map-first offer (conditional):** if the query is category-discovery shaped
114
+ (the deliverable is a taxonomy/landscape: "what methods/approaches/classes/
115
+ evidence types exist", "landscape of", "how is X done across ..."), include
116
+ ONE additional interview question offering empirical cartography (recommend
117
+ ON); if accepted, confirm the PRIMARY SCOPE in the same message per
118
+ `references/cartography.md`. Entity-anchored queries: never ask. The
119
+ `map-first` prefix forces the mode on without the question. When the mode is
120
+ off (not offered or declined), Steps 1-6 run exactly as if this feature did
121
+ not exist.
122
+
123
+ ### Step 1.5: Cartography (map-first mode only)
124
+
125
+ Skipped entirely when map-first is off. Dispatch cartographers per
126
+ `references/cartography.md`: 2 focus-tier axes scoped to the confirmed
127
+ primary scope (synthesis-mining, boundary-vocabulary) plus 1-2 anti-pinned
128
+ context axes, using the same tier dispatch, ledger discipline, and
129
+ completion gates as Step 4 (cartographer template and anti-pinning contract
130
+ live in the reference). Then merge the axis maps into
131
+ `reports/<TOPIC>/category_taxonomy.md` (tiered categories, coverage audit
132
+ against >= 2 scope-internal syntheses, unanchored leads); the venue-sweep
133
+ remediation axis fires only when syntheses are scarce. Cartography ledgers
134
+ land in `evidence/` and merge in Step 5a like any aspect ledger.
135
+
106
136
  ### Step 2: Decompose & Review Plan
107
137
 
108
138
  Comprehend the inquiry and identify 2-5 critical research aspects (top 2 under
@@ -126,6 +156,14 @@ focus, primary tools); never paste raw ABSTRACTs into the question UI.
126
156
  4. **Waiver / Degrade:** Skip plan review turn if query has `no-interview`, or
127
157
  degrade per Step 1 rules if unattended (record plan in `assumptions.md`).
128
158
 
159
+ **Map-first variant:** the plan review operates on the category taxonomy
160
+ (`references/cartography.md`): present tiers, coverage-audit results, and a
161
+ recommended selection; iterate until confirmed - this taxonomy walk-through
162
+ IS the plan review, non-waivable except by `no-interview` (autonomous
163
+ conversion records its rationale in `assumptions.md`). Selected categories
164
+ become the aspects; each still gets a full deep-dive ABSTRACT with binding
165
+ inclusion/exclusion criteria.
166
+
129
167
  Track finalized aspects in the harness's todo tool (TodoWrite or equivalent).
130
168
 
131
169
  ### Step 3: Create the output directory
@@ -226,7 +264,9 @@ Read all per-aspect reports. Summarize findings into a succinct, accurate
226
264
  final report addressing the user's inquiry, following the mandatory 6-section
227
265
  structure in `references/report-template.md` (Executive Summary, Data Sources,
228
266
  Analysis Methodology, Findings, Limitations, References - the References
229
- section itself is generated later by `render`). Reconcile conflicting findings
267
+ section itself is generated later by `render`). Under map-first, also apply
268
+ that reference's optional landscape and decision-guide sections (decision
269
+ guide default-on). Reconcile conflicting findings
230
270
  across aspects explicitly rather than silently dropping one side.
231
271
 
232
272
  Write the synthesized draft to `reports/<TOPIC>/final_report.draft.md` citing
@@ -336,9 +376,14 @@ python3 <skill_dir>/scripts/vet-references.py reports/<TOPIC>/final_report.md --
336
376
  ```
337
377
  reports/<TOPIC>/
338
378
  ├── plan.md # durable research plan (Step 3; boundaries live here)
379
+ ├── category_map_<axis>.md # per-axis cartography maps (map-first only)
380
+ ├── category_taxonomy.md # merged tiered taxonomy + coverage audit
381
+ │ # (map-first only)
339
382
  ├── evidence/
340
383
  │ ├── <aspect_1>.jsonl # per-aspect evidence ledger (worker-written)
341
384
  │ ├── <aspect_2>.jsonl
385
+ │ ├── cartography_<axis>.jsonl # cartography ledgers (map-first only;
386
+ │ │ # merge like aspect ledgers)
342
387
  │ ├── ...
343
388
  │ ├── _invalid.jsonl # merge quarantine (only when malformed lines occur)
344
389
  │ └── sources.jsonl # merged + verified ledger (Step 5a output)
@@ -395,6 +440,7 @@ reports/<TOPIC>/
395
440
  | File | Contents |
396
441
  |------|----------|
397
442
  | `references/worker-protocol.md` | Worker prompt template, file protocol, no re-delegation, retry/degrade rules |
443
+ | `references/cartography.md` | map-first mode: scopes, axis archetypes, anti-pinning contract, taxonomy + coverage audit, interaction matrix |
398
444
  | `references/tool-selection.md` | Question-type to tool decision tree; sections/limit/pagination patterns; biomcp_ prefix note |
399
445
  | `references/article-literature.md` | article_search / article_get: sources, dateRange, citations |
400
446
  | `references/clinical-trials.md` | trial_search / trial_get: filters, cursor paging, sections |
@@ -31,6 +31,7 @@ An aspect is DONE when ALL of these hold:
31
31
  | Variant evidence | Variant annotation + (if token) OncoKB + trials | variant_search, variant_get, variant_oncokb |
32
32
  | Patent landscape | 10-30 patents incl. seminal prior art | patent_search, patent_get |
33
33
  | Dataset hunt | Candidate accessions + linked publication | geo_search, sra_search, genbank_search |
34
+ | Category cartography (map-first) | 15-30 anchored categories per axis; every category >= 1 synthesis structure or >= 2 primaries | article_search, article_get |
34
35
 
35
36
  ## Source-quality rules
36
37
 
@@ -118,6 +119,20 @@ ABSTRACT; these rules govern how workers apply any such criteria.
118
119
  improvised categories); re-check rules 1-2 whenever synthesis rewords a
119
120
  claim or transcribes a number from an aspect report.
120
121
 
122
+ ## Cartography discipline (map-first mode)
123
+
124
+ - Category anchoring bar: a listed category needs >= 1 retrieved synthesis
125
+ whose structure demonstrably contains it, or >= 2 primary records -
126
+ keyword overlap is not coverage (anti-pinning contract:
127
+ `references/cartography.md`).
128
+ - Scope-relative tiers: adoption tiers (1/2/3) are relative to the primary
129
+ scope's own practice; state the reference frame, never present a tier as
130
+ absolute.
131
+ - Coverage audit: the merged taxonomy is reconciled against >= 2
132
+ scope-internal syntheses; synthesis-enumerated categories missing from
133
+ the map are added or declared as gaps - silent omission is the failure
134
+ mode this audit exists to catch.
135
+
121
136
  ## Failure modes
122
137
 
123
138
  | Symptom | Fix |
@@ -0,0 +1,190 @@
1
+ # Empirical Cartography (map-first mode)
2
+
3
+ Optional Stage-1 field mapping for the deep-research skill: discover the
4
+ method/category landscape empirically BEFORE proposing the research plan,
5
+ then run the standard aspect workflow on user-selected categories. This mode
6
+ is field-, community-, and question-agnostic: it applies to any
7
+ category-discovery question in the biomedical realm (methods, approaches,
8
+ evidence classes, taxonomies, landscapes), in any discipline.
9
+
10
+ ## When map-first applies
11
+
12
+ - OFFER it (inside the Step 1 interview, one extra question, only when the
13
+ query is category-discovery shaped): the deliverable is a taxonomy or
14
+ landscape - "what methods/approaches/classes/evidence types exist for X",
15
+ "landscape of X", "how is X done across ...", "categories of X".
16
+ - Do NOT offer for entity-anchored queries (one drug, variant, trial, gene,
17
+ disease) - the default workflow is already right.
18
+ - The `map-first` prefix forces the mode on without the offer question.
19
+ - Default OFF: with map-first off, every workflow step, file, gate, and
20
+ report section is identical to the non-cartography skill. The only
21
+ default-mode addition is the conditional offer question itself.
22
+
23
+ ## Primary scope vs context scope
24
+
25
+ The user designates a PRIMARY SCOPE - the literature segment where category
26
+ recall is the success criterion - defined by any combination of community,
27
+ discipline, disease/therapeutic area, modality, technique family, organism,
28
+ data type, or question type. Everything else is CONTEXT SCOPE: mapped for
29
+ awareness, never exhaustively. The orchestrator infers a candidate primary
30
+ scope from query vocabulary (e.g. "industry-ready", "clinical practice",
31
+ "food science", "diagnostic assay development") and asks for confirmation
32
+ in the same interview message - the recall target depends on it, and users
33
+ rarely name it spontaneously. If the user declines to specify, run with the
34
+ scope implied by the query terms and record the assumption in plan.md.
35
+
36
+ ## Two-tier dispatch
37
+
38
+ Focus tier (2 workers, scoped to the primary scope, method-unpinned):
39
+
40
+ - `cartography_synthesis_mining` - transcribe the scope's OWN synthesis
41
+ ecosystem (reviews, guidelines, consensus statements, position papers,
42
+ protocol series): harvest their section structures as candidate
43
+ categories and expand via backward citations (article_get
44
+ sections=["citation"]) to founding anchors. The scope's own taxonomies
45
+ are the recall target.
46
+ - `cartography_boundary_vocabulary` - hunt categories that answer the
47
+ question's underlying information need but self-describe under different
48
+ terms: adjacent vocabulary, hypernyms, enabling/auxiliary measurements,
49
+ neighboring endpoints. Ask, per formulation of the information need:
50
+ "what does this scope call the things that do X?"
51
+
52
+ Context tier (1-2 workers, fully anti-pinned, breadth across the rest of
53
+ the field) - pick archetypes by question shape:
54
+
55
+ - `cartography_context_principle` - enumerate the distinct
56
+ experimental/analytical principles by which the question is answered;
57
+ let the categories emerge from retrieved records.
58
+ - `cartography_context_casespace` - partition the question's object space
59
+ (barriers, diseases, organisms, tissues, modalities - whatever partitions
60
+ it) and map category coverage per stratum.
61
+ - `cartography_context_segment` - sweep how OTHER communities/disciplines
62
+ frame and categorize the same question; vocabulary differences are
63
+ themselves findings.
64
+
65
+ Budget: ~15-25 biomcp calls per cartographer (hard cap 30); parallel
66
+ batches of up to 5; Tier A/B dispatch and the Tier C sequential fallback
67
+ follow SKILL.md Step 4, using the cartographer template below.
68
+
69
+ Conditional remediation axis (orchestrator-dispatched after the focus tier
70
+ returns, only when needed):
71
+
72
+ - `cartography_venue_sweep` - fires IFF the focus tier found fewer than two
73
+ field-spanning syntheses OR the interview flagged an emerging area: sweep
74
+ the primary scope's primary-literature venues for categories its thin
75
+ synthesis ecosystem under-covers.
76
+
77
+ ## Anti-pinning contract (binding on every cartographer)
78
+
79
+ 1. No method names, assay names, or category lists enter a cartographer
80
+ prompt. Focus-tier prompts pin the PRIMARY SCOPE and the question's
81
+ information need - never methods. Context-tier prompts pin nothing but
82
+ the question.
83
+ 2. A category may be listed ONLY if anchored in retrieved records: either
84
+ >= 1 retrieved synthesis whose structure demonstrably contains it, OR
85
+ >= 2 primary records found via search.
86
+ 3. Never assert a category from model memory; memory shapes query design
87
+ only. A failed query line is logged under Evidence Gaps - never turned
88
+ into a category.
89
+ 4. Probe deliberately across the assigned axis before concluding; do not
90
+ stop at the first handful of categories.
91
+
92
+ ## Cartographer prompt template
93
+
94
+ ```md
95
+ TOPIC: <TOPIC>
96
+ YOUR RESEARCH FOCUS: cartography_<axis>
97
+ AXIS: <archetype name + one-line instantiation, e.g. "case-space partition:
98
+ the variable that partitions this question's object space is <variable>">
99
+ PRIMARY SCOPE: <primary scope - focus tier only; context tier: "none -
100
+ stay anti-pinned">
101
+ MISSION: Produce an empirically anchored, high-level map of the major
102
+ method/category families for <question>, entering the field from your
103
+ axis. 15-30 categories maximum (merge near-duplicates and say so).
104
+ OUTPUT: reports/<TOPIC>/category_map_<axis>.md (title; one-paragraph scope
105
+ summary; ONE subsection per category: name, one-line description, 1-3
106
+ anchor papers as cite-key markers, maturity signals - synthesis existence,
107
+ approximate hit volume, founding era - and which queries surfaced it; then
108
+ "## Query Log" and "## Evidence Gaps" with failed query lines) plus
109
+ reports/<TOPIC>/evidence/cartography_<axis>.jsonl.
110
+ SKILL_DIR: <absolute skill dir> # Tier B only; resolve before dispatch
111
+ EXECUTION RULE: Do NOT read or inspect evidence-ledger.py or other skill
112
+ scripts; all schemas and commands are fully specified here.
113
+ ```
114
+
115
+ Tier B orchestrators additionally inline the anti-pinning contract, the
116
+ anchoring rule, the ledger discipline (worker-protocol.md rules 5-8), and
117
+ the completion-gate command. Cartographers follow every Worker rule in
118
+ `references/worker-protocol.md` (sequential calls, retry ladder, verbatim
119
+ ledger records, no bibliography) with the category map replacing the
120
+ aspect report and `check --markers category_map_<axis>.md` as the gate.
121
+
122
+ ## Taxonomy merge + coverage audit (orchestrator)
123
+
124
+ Merge all axis maps into `reports/<TOPIC>/category_taxonomy.md`:
125
+
126
+ - Deduplicated category list; per category: name, one-line description,
127
+ anchors, maturity signals, surfaced-by axes (cross-axis confirmation is
128
+ a robustness signal), and an adoption tier (1 = established /
129
+ industry-grade, 2 = discovery-grade, 3 = emerging/niche) - tiers are
130
+ scope-relative and the taxonomy must say so explicitly.
131
+ - "## Coverage Audit" section: reconcile the merged map against the
132
+ enumerated method/category lists of >= 2 scope-internal syntheses. Any
133
+ category a synthesis enumerates that the map lacks must be added (with
134
+ anchors) or explained as a declared gap. If the scope yielded fewer than
135
+ 2 syntheses, anchor the audit on cross-axis overlap instead and flag
136
+ synthesis scarcity (this also triggers the venue-sweep remediation).
137
+ - "## Unanchored Leads" section: suspected-but-unanchored territories,
138
+ listed as the query lines tried - never as categories.
139
+
140
+ ## Interaction matrix
141
+
142
+ | Mode | Behavior |
143
+ |------|----------|
144
+ | Default, heuristic fired | Step 1 interview includes ONE offer question ("empirical field mapping first?" - recommend ON) and, if accepted, primary-scope confirmation in the same message; nothing else changes |
145
+ | Default, heuristic not fired | Identical to the non-cartography skill: no question, no cartography files |
146
+ | `map-first` | Cartography on without the offer question; the interview still runs (scope + clarifiers) unless `no-interview` is also present |
147
+ | `map-first` + `no-interview` | Cartography on; taxonomy -> plan conversion is autonomous: record the category-selection rationale and coverage-audit outcome in plan.md + assumptions.md, and state in the report Limitations that scope selection was not user-reviewed |
148
+ | `no-interview` alone | Identical to the non-cartography skill (Step 1 is skipped, so no offer fires) |
149
+
150
+ Cartography does NOT waive the Step 2 plan review: with map-first on (and
151
+ no `no-interview`), the taxonomy walk-through IS the plan review - present
152
+ the taxonomy with tiers, coverage-audit results, and a recommended category
153
+ selection, then iterate with the user until the plan is confirmed (same
154
+ rounding rules as Step 2). Selected categories become the Step 3 aspects
155
+ (standard deep-dive ABSTRACTs; the taxonomy's inclusion signals seed the
156
+ ABSTRACT boundaries; the set may exceed 5 when the user insists - batch
157
+ dispatches accordingly). Categories discovered but not selected stay
158
+ citable: their cartography ledgers merge into sources.jsonl in Step 5a
159
+ like any aspect ledger, and the report carries them in the optional
160
+ landscape section (`references/report-template.md`).
161
+
162
+ ## Report integration
163
+
164
+ - Landscape section (map-first only): one line per discovered-but-
165
+ unselected category, citing its cartography anchors - acknowledged, not
166
+ researched; the report must say so.
167
+ - Decision guide by question scenario (map-first default-on): one compact
168
+ "scenario -> recommended method sequence -> tier -> caveat" table per
169
+ user-confirmed question scenario, built only from ledger-verified
170
+ sources, tiers labeled scope-relative.
171
+ - The field's own taxonomy disagreements (syntheses classifying the same
172
+ subject differently) are reported in Analysis Methodology or Findings,
173
+ never silently resolved.
174
+
175
+ ## Degradation + consistency
176
+
177
+ - No subagent tool: run axes sequentially in the main conversation (same
178
+ contract, leaner budgets).
179
+ - Server unavailable: cartography cannot run - proceed with the default
180
+ workflow and say so explicitly.
181
+ - map-first OFF: behavior is identical to the non-cartography skill
182
+ (steps, files, gates, report structure). The existing agent-test
183
+ deep-research suite (q01-q07) is the regression guarantee and stays
184
+ unchanged.
185
+
186
+ ## Out of scope / future work
187
+
188
+ - Report update mode (re-running an existing report): a verify-and-refresh
189
+ worker tier for previously covered core areas - deliberately NOT part of
190
+ map-first, which always researches from scratch.
@@ -67,6 +67,23 @@ the source of truth for citations]
67
67
  [queries that failed after retries, with reasons]
68
68
  ```
69
69
 
70
+ ## Map-first optional sections
71
+
72
+ When the run used empirical cartography (SKILL.md Step 1.5), two OPTIONAL
73
+ sections extend the mandatory structure. Both cite through the normal
74
+ merged-ledger markers - cartography anchors are ordinary ledger records.
75
+
76
+ - **Landscape** (inside Findings, after the selected aspects): one line per
77
+ discovered-but-unselected category, citing its cartography anchors -
78
+ acknowledged, not researched; the report must say so explicitly.
79
+ - **Decision guide by question scenario** (after the findings/evidence
80
+ tables; DEFAULT-ON in map-first mode, skippable only if the user
81
+ declines): one compact table per user-confirmed question scenario -
82
+ scenario | recommended method sequence | tier | caveat - built only from
83
+ ledger-verified sources, with tiers labeled scope-relative.
84
+ - Taxonomy disagreements between the field's own syntheses are reported in
85
+ Analysis Methodology or Findings - never silently resolved.
86
+
70
87
  ## Citation placement rules
71
88
 
72
89
  - Authored text uses semantic cite-key markers `[@pmid:...]`, groups
@@ -38,6 +38,18 @@ EXECUTION RULE: Do NOT read or inspect evidence-ledger.py or other skill scripts
38
38
  startup (via `${CLAUDE_PLUGIN_ROOT}`); the orchestrator sends ONLY the
39
39
  filled-in template below.
40
40
 
41
+ ## Cartographer workers (map-first mode)
42
+
43
+ Cartography axes use the SAME worker contract (rules 1-9, file protocol,
44
+ completion gate) with two substitutions: the deliverable is a CATEGORY MAP
45
+ (`reports/<TOPIC>/category_map_<axis>.md`: one subsection per anchored
46
+ category - name, one-line description, 1-3 anchor markers, maturity signals,
47
+ surfacing queries - plus a Query Log and Evidence Gaps) instead of an aspect
48
+ report, and the focus name is `cartography_<axis>`. The dispatch prompt
49
+ template, axis archetypes, anti-pinning contract, and anchoring rule live in
50
+ `references/cartography.md`. Tier A workers read that file too when the
51
+ assigned focus starts with `cartography_`.
52
+
41
53
  ## File protocol
42
54
 
43
55
  - Output files (exactly TWO - together they are the self-contained
@@ -132,7 +144,10 @@ EXECUTION RULE: Do NOT read or inspect evidence-ledger.py or other skill scripts
132
144
  `python3 <SKILL_DIR>/scripts/evidence-ledger.py add <file> --stdin`,
133
145
  substituting the SKILL_DIR value from your prompt LITERALLY - it is a
134
146
  path string, NOT an environment variable (`$SKILL_DIR` in a shell
135
- resolves to nothing and breaks the call). Pass records via a shell heredoc
147
+ resolves to nothing and breaks the call). Anchor every shell command
148
+ to the workspace root (`cd <workspace root> && python3 <SKILL_DIR>/...`)
149
+ so relative report paths resolve regardless of the shell's starting
150
+ directory. Pass records via a shell heredoc
136
151
  or with an array/JSONL file (`add <file> @<batch.json>`):
137
152
  ```bash
138
153
  python3 <SKILL_DIR>/scripts/evidence-ledger.py add reports/<TOPIC>/evidence/<YOUR-FOCUS>.jsonl --stdin << 'EOF'