Bridge: Cross-Project Connection Capture
Capture a cross-project connection the moment it surfaces, such as a shared pattern, a person carrying context between projects, a story that lends another project credibility, a feedback loop. Use when one project feeds, reuses, reinforces another: 'connects to', 'feeds into', 'same pattern as'. Writes one YAML file per bridge to a bridges directory, with list, map and stats subcommands.
npx skills add github:pantheon-org/tekhne --skill software-engineering--bridgeCapture a bridge while you are still in context. Keep it in the bridges directory, never in project artifacts.
Principles
- Capture fast, then step aside: answer in one line and resume the conversation that produced the link.
- Store the user’s words, not yours, because a paraphrase erases the mental model that triggered the link.
- Choose an honest default over a confident guess; a wrong rare archetype hides in the stats, while a visible
knowledgedefault gets corrected. - Write to the bridges directory only.
When to Use
- Use it when the user says “this connects to” or “same pattern as” another project.
- Use it when a person who works across two projects carries context between them.
- Use it when a session produces a story or proof point that strengthens another project.
- Capture a stated link even without
/bridge, provided both projects resolve from config.
When Not to Use
- Avoid capturing administrative links (shared calendar, same channel) that move no knowledge.
- Avoid capturing when both names point at one project; fix the alias in config instead.
- Stop and wait when the user is mid-decision, until a natural pause or an explicit
/bridge. - Check for an existing bridge first, and never recapture a link that is already stored.
- Avoid capturing during a weekly review, because bridges are for in-the-moment capture.
Commands
Run /bridge <src> → <tgt>: <desc> to capture, adding [type] after the target to force an archetype. Read list, map and stats output, then run /bridge list [project], /bridge map or /bridge stats to read bridges back.
Capture Procedure
- Read the project config at
$PRAXIS_DIR. It holds aliases, names, tiers, flywheel roles and stakeholders withalso_in. If it is missing, stop with⚠️ No project config found. Create it with your project definitions. - Split the input on
→or↔for the source, then on:for the target, any[type]and the description. - Resolve both aliases against config keys, case-insensitively, then fuzzy-match against
name. If either fails, write nothing. Warn and suggest adding the project to config. - Pick the archetype. Use
[type]when given, otherwise apply archetype detection. When the signal is weak, useknowledgeand say so. - Set the direction. Use
bidirectionalfor↔, “bidirectional” or “both ways”, otherwiseone-way. - Set the strength. Check hedges first (“maybe”, “in theory” give
theoretical), then present tense (“already”, “carries” giveactive), then “not yet”, “should”, “if it works” forpotential. Default topotential. - Check for a duplicate, then write the file following storage and schema.
- Answer with one line, then resume the prior conversation. Use
↔for bidirectional bridges and add, defaultedin the brackets after a defaulted archetype:
🔗 Bridge #N: {emoji} {source} → {target} ({archetype}) — {short desc}
When three or more bridges this week share one project pair, append 📊 {N} bridges this week involving {pair}. Update strategic bridges during review.
Take the highest number used today, add one, then confirm the file parses:
last="$(ls "$dir" | sed -n "s/^$(date +%F)-\([0-9]*\)-.*/\1/p" | sort -n | tail -1)"; seq=$(( ${last:-0} + 1 ))
yq '.' ./thinking/bridges/"$file" > /dev/null
Anti-Patterns
- NEVER reformulate the user’s description. WHY: a paraphrase adds your interpretation and erases the original mental model.
- NEVER comment on the bridge content. Keep the response to one line, because commentary derails the conversation.
- NEVER write to GTD files or project artifacts; mixing captures into task lists pollutes both.
- NEVER invent an alias that is not in config; invented aliases break list, map and stats.
- NEVER count files to get the sequence number, because after a deletion the count collides and overwrites a capture. Always use the highest number plus one.
- NEVER guess a rare archetype (
local,mirror,complexity) on one keyword; the pitfall is a mislabel that skews the stats unseen. - NEVER hardcode
one-wayandpotential; run steps 5 and 6 so the stats do not repeat a wrong relationship.
# BAD: "Matthieu carries context both ways" stored with the defaults
direction: one-way
strength: potential
# GOOD: "both ways" is bidirectional, "carries" is present tense
direction: bidirectional
strength: active
References
- Archetype Detection: the 10 archetypes and the signals for picking one
- Storage and Schema: filename, sequence number, YAML schema, write guards, duplicate check
- List, Map and Stats: output formats for the read-only subcommands
- Worked Examples: three captures showing how the signals combine
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
No eval scenarios available.
Archetype Reference and Auto-Detection
The 10 bridge archetypes, their meaning, and the heuristics used to pick one when the user gives no explicit [type].
The 10 Archetypes
| Code | Emoji | Archetype | One-liner |
|---|---|---|---|
flywheel |
🔄 | Flywheel loop | Output of A feeds B feeds C, then back to A |
knowledge |
🧠 | Knowledge cascade | Framework or learning from one domain reusable in another |
people |
👤 | People-bridge | Same person carries context across projects |
terrain |
🌱 | Terrain d’essai | One project is the live lab for methods used in another |
narrative |
📖 | Narrative amplifier | One project generates stories that make another credible |
identity |
🎭 | Identity coherence | Projects collectively tell a story about who you are |
complexity |
🔬 | Complexity lab | Managing complexity in one domain trains patterns for another |
local |
🤝 | Local network overlay | Geographic proximity creates compound serendipity |
option |
⚡ | Option value | One project creates future optionality for another |
mirror |
🪞 | Mirror project | Introspective insights reshape how other projects are framed |
Auto-Detection Signals
Apply the signals in order. Collect every archetype that matches before choosing.
Signal 1: keywords in the description
- “pattern”, “framework”, “method”, “learned”, “reusable” point to
knowledge. - A person’s name (check config stakeholders), “carries context” or “cross-pollinates” point to
people. - “story”, “credibility”, “proof”, “case study” point to
narrative. - “test ground”, “lab”, “experiment”, “tried in” point to
terrain. - “loop”, “feeds back”, “cycle” point to
flywheel. - “brand”, “who I am”, “positioning”, “identity” point to
identity. - “complexity”, “admin”, “bureaucra” (matches bureaucracy and bureaucratic), “same skill”, “transfers” point to
complexity. - “local”, “geographic” point to
local. - “future”, “optionality”, “if it works”, “unlocks” point to
option. - “introspect”, “philosopher”, “reframe”, “reshape” point to
mirror.
Signal 2: config context
- Source or target with
flywheel_role: terrainleans towardsterrain. - Source or target with
flywheel_role: mirrorleans towardsmirror. - A stakeholder named in the description whose entry has
also_insettles onpeople.
Choosing Between Matches
- One archetype matched: use it, unless it is
local,mirrororcomplexityon a single keyword. Those three need two distinct signals. - Several matched: prefer the specific archetype over
knowledge. “Pattern” and “framework” are generic words, so they should not outvote a specific signal such as “optionality”. - Several specific archetypes matched: pick the one with the most distinct signals. On a tie, use
knowledge. - Nothing matched, or a rare archetype has only one signal: use
knowledgeand say so in the response line.
Why Archetype Accuracy Matters
/bridge stats and /bridge map aggregate by archetype. A bridge tagged narrative when it was really knowledge mislabels more than one row: stats groups by archetype first and by project pair second, so the weekly nudge (three bridges on the same pair) can be suppressed for the right pair or fired for the wrong one. A visible knowledge default is cheap for the user to correct. A confident wrong rare archetype is not.
List, Map and Stats Output
Detail for the read-only subcommands. None of them creates or edits a file.
List (/bridge list [project])
- Glob every YAML file in the bridges directory.
- Read each file and parse the YAML.
- With a project filter, match against config aliases and
namefields, case-insensitively, on either side of the bridge. - Sort by
datedescending, using filename sequence to break ties, and keep the last 10. - Print one line each. Use
→for one-way and↔for bidirectional, and always show the strength:
🔗 Bridges (last 10)
1. 2026-04-08 📖 HP → BR: philosopher encounters reframe positioning (potential)
2. 2026-04-08 🧠 BNP → HP: observability patterns = atelier content (active)
3. 2026-04-07 👤 HP ↔ SL: Matthieu carries context both ways (active)
Empty or missing directory: 🔗 No bridges captured yet. Use /bridge <source> → <target>: <description>. Do not return nothing.
Map (/bridge map)
- Read the config for project names, which become the node labels.
- Read every bridge file.
- Colour nodes by strength: active green, potential orange, theoretical pink.
- Print the mermaid block and nothing else:
graph LR
classDef active fill:#90EE90,stroke:#333,color:#000
classDef potential fill:#FFE4B5,stroke:#333,color:#000
classDef theoretical fill:#FFB6C1,stroke:#333,color:#000
HP["Homo Promptus"] -->|"📖 narrative"| BR["Personal Brand"]:::active
DS["Digital Stoic"] -->|"🧠 patterns"| HP:::potential
HP <-->|"👤 Matthieu"| SL["Slasheo"]:::active
Stats (/bridge stats)
- Read every bridge file and the config tier information.
- Count by project (as source and as target), archetype, strength and tier, for this week and all time.
- Print:
📊 Bridge Stats
This week: 5 bridges
All time: 23 bridges
By project (top 5):
HP: 12 (6→, 6←) [tier 1]
BR: 8 (2→, 6←) [tier 1]
By archetype:
🧠 knowledge: 8
📖 narrative: 6
By strength:
🟢 active: 9
🟡 potential: 11
🔴 theoretical: 3
Report counts exactly as read. Do not interpret them or recommend actions.
Storage, Schema and Write Guards
Detail for step 7 of the capture procedure. Read this before writing a bridge file.
Location and filename
Bridges directory: thinking/bridges/ under the configured workspace root ($PRAXIS_DIR or equivalent). Create it if it does not exist.
Filename: {date}-{seq}-{source}-to-{target}.yaml, with the aliases lower-cased. Example: 2026-04-08-1-hp-to-brand.yaml. A bidirectional bridge is still one file, named source first.
Choosing the sequence number
Take the highest sequence already used today and add one. Do not count the files.
Counting breaks as soon as a file has been deleted. With files 1, 2 and 3 and file 2 removed, the count is 2, so the next bridge becomes number 3 and overwrites an existing capture without any warning.
dir="${PRAXIS_DIR}/thinking/bridges"
today="$(date +%F)"
last="$(ls "$dir" 2>/dev/null | sed -n "s/^${today}-\([0-9]*\)-.*/\1/p" | sort -n | tail -1)"
seq=$(( ${last:-0} + 1 ))
Take the date from the system clock, not from the conversation. A date mentioned in the discussion is usually the date of the event, not of the capture.
Schema
source: HP
target: BR
archetype: narrative
emoji: 📖
description: "Philosopher council on construct AI → reframes human-centric positioning from marketing to philosophy"
direction: one-way # one-way | bidirectional
strength: potential # active | potential | theoretical
context: "During introspect session, realized philosopher encounters are unique differentiator"
date: 2026-04-08
| Field | Rule |
|---|---|
source, target |
Project alias, upper case, exactly as the config key |
archetype |
One of the 10 codes |
emoji |
The archetype’s emoji from the table in the archetype reference |
description |
The user’s words, unchanged. It is what flows from source to target |
direction |
one-way (A to B only) or bidirectional (A and B, one file) |
strength |
active (happening now), potential (could happen, not yet activated), theoretical (speculative) |
context |
Optional. What triggered the discovery: a session, a meeting, a realisation |
date |
ISO date of capture |
Write guards
- Confirm the workspace root is set. If not, stop with
⚠️ Workspace root not set. Configure via environment variable (e.g. export PRAXIS_DIR="$HOME/dev/praxis"). - Confirm the target filename does not exist before writing. Never overwrite.
- Quote
descriptionandcontextin double quotes. A description containing a colon, a hash or an arrow breaks an unquoted YAML scalar. Escape any double quote inside it. - Use a block scalar (
|) when the description spans several lines. The characters are still kept verbatim. - Read the file back after writing and confirm it parses. A bridge that fails to parse is invisible to
/bridge listand/bridge map.
Duplicate check
Before writing, glob the directory and compare source, target and archetype with existing bridges. If a bridge on the same pair already carries the same idea, do not write a second file. Answer in one line: 🔗 Already captured: {filename}. A weaker or stronger version of the same idea is a different bridge, so write it.
Worked Examples
Three captures showing how the signals combine. Each response is a single line.
Knowledge bridge, defaults
/bridge PROJ-A → PROJ-B: observability patterns from service mesh apply directly to the atelier content structure
- “patterns” matches
knowledge. Nothing more specific matches. - No
↔and no hedge or present-tense word, soone-wayandpotential. - Response:
🔗 Bridge #1: 🧠 PROJ-A → PROJ-B (knowledge) — observability patterns from service mesh apply directly to the atelier content structure
People bridge, bidirectional and active
/bridge PROJ-A ↔ PROJ-C [people]: Matthieu carries positioning context both ways and cross-pollinates priorities
↔and “both ways” givebidirectional.- “carries” is present tense, so
active. - Response:
🔗 Bridge #2: 👤 PROJ-A ↔ PROJ-C (people) — Matthieu carries positioning context both ways and cross-pollinates priorities
Ambiguous archetype, hedged strength
/bridge PROJ-A → PROJ-D: maybe the way we run planning here could inform how that team works
- No archetype keyword matches, so default to
knowledgeand flag it. - “maybe” is a hedge, so
theoretical, even though “could” also appears. Hedges are checked first. - Response:
🔗 Bridge #3: 🧠 PROJ-A → PROJ-D (knowledge, defaulted) — maybe the way we run planning here could inform how that team works
Direction and strength signals
| Signal in the text | Result |
|---|---|
↔, “bidirectional”, “both ways” |
direction: bidirectional |
| “maybe”, “speculative”, “in theory” | strength: theoretical |
| “already”, “happening”, “doing this”, “carries” | strength: active |
| “could”, “should”, “would”, “not yet”, “if it works”, “unlocks” | strength: potential |
| none of the above | one-way and potential |
Check in the order theoretical, active, potential. The first match decides.