Surfacing Tacit Knowledge¶
Most of what makes a team effective in a complex domain is not written down. It lives in heads — the senior engineer who knows why the flight-plan validator refuses certain route revisions, the ops lead who remembers the 2023 incident that banned local timestamps in the scheduling service, the architect who can tell at a glance that a new module violates the dependency rule nobody ever formalised. This is tacit knowledge: pattern recognition built from years of reviews, production incidents, and architectural arguments.
Tacit knowledge transfers slowly. In a domain like Air Traffic Management (ATM), a new engineer can spend months shadowing before they start producing useful output. AI amplifies the problem: without explicit conventions, AI-generated code can look plausible and be quietly wrong — using the wrong time zone, violating an unwritten dependency rule, re-introducing a pattern that caused a past incident. Same codebase, same AI, completely different quality depending on who is prompting.
This tutorial walks you through turning that tacit knowledge into versioned, enforceable artefacts, and then using those artefacts to onboard new engineers (and new AI agents) in days rather than months. The approach has five phases, each with a clear purpose and a specific command or practice:
- Scaffold the habitat — create the files that will hold the extracted knowledge, so it lands in predictable places.
- Run a guided extraction session — surface what lives in people's heads through pointed questions.
- Mine the artefacts you already have — use AI to extract knowledge from code, PRs, wikis, and chat history.
- Capture decisions as they happen — introduce a lightweight Architecture Decision Record (ADR) practice that prevents the same archaeology next quarter.
- Generate team-specific onboarding — bridge the gap between a general onboarding programme and the deep domain knowledge new hires actually need.
Plan for about two hours the first time. Most of that is the extraction conversation in Phase 2 — which is the point. The conversation is where tacit knowledge becomes explicit.
Throughout the tutorial, examples are drawn from an ATM scheduling service, but the pattern applies equally to any complex domain — claims processing, medical devices, payment infrastructure, or industrial control systems. Substitute your own domain when running the commands; the shape of the output is the same.
Prerequisites¶
You need:
- Claude Code installed with the ai-literacy-superpowers plugin (see Getting Started)
- A project repository the team works in — existing code, not a greenfield empty directory. Extraction depends on having artefacts to mine and a codebase to validate conventions against.
- Access to supporting artefacts: the team wiki, past pull requests, incident post-mortems, chat history on architecture channels. You do not need to collect these up front — Phase 3 explains how to bring them in as you need them.
- Ideally, one or two senior engineers available for about an hour. The extraction session works either as a mob (preferred) or as structured one-on-ones.
Phase 1: Scaffold the Habitat¶
Why this first¶
Extraction produces artefacts. Without a place to put them, the output scatters — notes in one document, constraints in another, conventions in a README that nobody reads. Scaffolding first means every piece of extracted knowledge lands in a predictable, discoverable location that AI agents will read on every future session.
/superpowers-init¶
The plugin ships a single command that bootstraps the full coordination habitat in eight steps:
- Discover the stack — scan the project and identify primary language, build system, test framework, CI, and container strategy.
- Generate
CLAUDE.md— the top-level context file. Records the stack and leaves sections for conventions, style, and domain guidance that the next phases will fill. - Generate
HARNESS.md— the source of truth for constraints, garbage-collection rules, and enforcement status. Starts with whatever deterministic checks the discoverer found in the repo (Prettier, ESLint, gitleaks, test runners). - Generate
AGENTS.md— declares the agent team for the project and their responsibilities. The team then edits this directly to encode roles, style preferences, and architectural decisions. - Generate
MODEL_ROUTING.md— records which model tier to use for which kind of task, and the cost data that justifies the choice. Starts with plug-in defaults that you refine over time. - Generate
REFLECTION_LOG.md— the append-only journal of what was learned per session. Seeded with an initial entry that notes the habitat has been scaffolded. - Scaffold CI templates — add a GitHub Actions workflow that enforces the deterministic constraints the discoverer found, so the harness starts enforcing on day one.
- Produce an initial health snapshot — write the first entry
to
observability/snapshots/so later runs have a baseline to compare against.
How to run it¶
From the project root:
Accept all defaults the first time. The command is safe to re-run — it detects existing files and only adds what is missing, never overwrites what you have.
What you have at the end of Phase 1¶
Five coordination documents at the project root — CLAUDE.md,
HARNESS.md, AGENTS.md, MODEL_ROUTING.md,
REFLECTION_LOG.md — plus a CI workflow and a first health
snapshot. Most of these documents are mostly empty. That is
correct; the next phases fill them.
Phase 2: Run a Guided Extraction Session¶
Why this second¶
The habitat now exists but has very little real content. The fastest way to fill it with high-signal conventions and constraints is a structured conversation with the people who hold the tacit knowledge. The conversation is where disagreements surface — disagreements are not a failure mode, they are the point. If two seniors have different answers to "what counts as a clean refactor here," you have just discovered a convention that was never explicit.
/extract-conventions¶
The command runs a guided five-question session, informed by how AI-assisted teams actually break in practice. Each question surfaces a different kind of tacit knowledge:
-
What architectural decisions should never be left to individual judgment? Surfaces non-negotiable patterns — module boundaries, dependency direction, API design rules. These become constraints in
HARNESS.md. -
Which conventions are corrected most often in AI-generated code? Surfaces the gap between what AI produces by default and what the team expects. Highest-value convention category because the corrections happen every day. These become conventions in
CLAUDE.md. -
Which security checks are applied instinctively? Surfaces embodied security knowledge — input validation, auth patterns, secrets handling — that seniors apply without thinking. These become constraints in
HARNESS.mdor entries in a project-specific security skill. -
What triggers an immediate rejection in review? Surfaces hard boundaries — things that are never acceptable regardless of context. These become critical checks attached to the code-reviewer agent's instructions, or harness constraints with
prscope. -
What separates a clean refactoring from an over-engineered one? Surfaces judgment about abstraction thresholds, YAGNI boundaries, when to stop. These usually become style preferences in
CLAUDE.mdrather than hard constraints — they depend on context.
The command does not just record answers. It maps each answer to
a specific artefact based on priority tier (must-follow,
should-follow, nice-to-have) and writes the edits into
HARNESS.md or CLAUDE.md in the right sections with the right
structure.
How to run it¶
Gather the team (or, for one-on-ones, start with the most senior engineer) and run:
The command walks through the five questions one at a time. Answer concretely. Examples for an ATM scheduling service:
Question 1: What architectural decisions should never be left to
individual judgment?
→ All timestamps in persisted data must be UTC. We had an incident
in 2023 where local-timezone timestamps in the flight-plan store
caused phantom conflicts across timezone boundaries. Non-negotiable.
→ The scheduling service must not call the flight-plan validator
synchronously. The validator can take up to 8 seconds on
complex routes and must not block the scheduling pipeline.
Question 2: Which conventions are corrected most often in
AI-generated code?
→ AI reaches for datetime.now() in local time. We catch it every
week in review. Must always be datetime.now(timezone.utc) or
our FlightClock abstraction.
→ AI invents new sector identifiers rather than looking them up
in the sector registry. We have a fixed set from EUROCONTROL
that should never be extended by the service itself.
The command maps Answer 1 to a HARNESS.md constraint with a
deterministic check (lint rule forbidding local timestamps in the
persistence layer), and Answer 2 to both a CLAUDE.md convention
entry and — because it is corrected weekly — a proposal to add a
linter constraint to HARNESS.md. You confirm or refine the
proposal; the edit is made.
The "it depends" signal¶
If the answer to a question is always "it depends on context," the convention needs decomposition before it can be encoded. Decompose "it depends" into specific, observable cases. "It depends on whether the flight plan is in filed or active state" is a usable distinction; "it depends on the situation" is not. Carry undecomposed items to the next extraction session rather than forcing them into the habitat half-formed.
What you have at the end of Phase 2¶
CLAUDE.md and HARNESS.md now contain real content — a handful
of strong conventions and two or three enforced constraints — all
grounded in actual team experience. The extraction session also
surfaces where the team disagrees; record those disagreements as
explicit ADRs in Phase 4 rather than letting them stay tacit.
Phase 3: Mine the Artefacts You Already Have¶
Why this third¶
The extraction session only surfaces knowledge participants
consciously recall under the pressure of the question. A huge
amount of domain knowledge lives in artefacts nobody reviews: old
pull requests, wiki pages, Slack threads in #architecture and
#incidents, code comments, runbooks, post-mortems. These
artefacts remember things people forget. This phase uses Claude
Code as a research partner to extract that knowledge
systematically.
This is not a plugin command. It is a workflow pattern that
combines Claude Code's general file-reading and research
capabilities with the /harness-constrain command for promoting
discoveries into enforced rules.
Sources worth mining¶
| Source | What you will find |
|---|---|
| Review comments on merged PRs | Tacit rules reviewers apply — especially comments that repeat across PRs |
| Post-mortem documents | Constraints grounded in real incidents — the strongest kind |
| Wiki pages on architecture | Decisions made years ago that the team no longer articulates |
Slack threads in #architecture, #incidents |
Live disagreements and their resolutions |
| Runbooks | Operational knowledge — startup sequences, recovery procedures, dependency orderings |
Code comments marked // HACK, // FIXME, // TODO |
Known-bad patterns the team has not yet encoded as constraints |
The extraction workflow¶
For each source, the pattern is the same:
-
Bring the artefact into the session. Export a wiki page to Markdown and place it in
docs/legacy/. Download a Slack thread as plain text. Rungh pr list --state merged --limit 50and have Claude read the PR bodies. -
Ask for candidate conventions and constraints, not prose. The useful prompt shape is:
Read docs/legacy/flight-plan-validation-architecture.md and
propose:
- Candidate conventions for CLAUDE.md (things engineers should
do by default)
- Candidate constraints for HARNESS.md (rules that should fail
CI if violated)
For each, quote the specific passage that motivates it.
Requiring a quote grounds the output in the artefact and makes it easy to verify. If the AI cannot find a quote, the proposal is probably a hallucination.
-
Review the output with a senior engineer present. Hallucinations do happen, especially when reading long documents. The senior catches "we never actually did that" and "that was true in 2022, not now."
-
Commit the surviving proposals. For conventions, edit
CLAUDE.mddirectly — the proposed text usually needs light trimming. For constraints, run:
Paste the proposed rule, choose deterministic if a tool
exists or agent if it needs judgement, configure the scope
(commit or pr), and let the command write the constraint
into HARNESS.md with enforcement wired up.
What "AI-assisted archaeology" looks like in practice¶
For an ATM team, one hour of mining a wiki export might surface:
- A convention about using nautical miles rather than kilometres in all horizontal distance calculations (originally a 2019 decision, never written into any README).
- A constraint about the maximum allowed call depth between the scheduling service and the conflict detector (originally to prevent cascading timeouts, encoded once in a Grafana alert and nowhere else).
- A rejected pattern — "do not poll the sector-assignment service from the flight-plan validator" — grounded in a 2024 incident.
Each of these was known to at most two people. After Phase 3, all
three live in HARNESS.md or CLAUDE.md where any engineer or
agent can see them.
What you have at the end of Phase 3¶
CLAUDE.md and HARNESS.md now contain conventions and
constraints that were previously locked in artefacts nobody read.
Every entry is traceable to its source — the wiki page, the
incident, the review comment. When someone asks "why does this
rule exist," the answer is one link away.
Phase 4: Capture Decisions as They Happen¶
Why this fourth¶
Conventions record what the team does. They do not record why. Without the why, decisions get re-litigated every quarter — new engineers question rules whose original motivation has been forgotten, and the arguments have to be rediscovered. Retroactive documentation of decisions (writing the ADR six months after the decision) is archaeology: expensive, lossy, usually skipped. The only approach that works is capturing decisions in flight, when the reasoning is fresh.
Lightweight ADRs are a cheap practice. One short Markdown file per decision, written at the time the decision is made, referenced from any constraint or convention it justifies.
The two-tier practice¶
Not every decision warrants an ADR. Use two tiers:
Tier 1 — micro-decisions. Small judgement calls that happened in a session ("we chose to retry on 503 with exponential backoff rather than circuit-breaking because the downstream SLA is 99.5%"). Capture these with:
/reflect asks three questions — what was worked on, what was
surprising, what future agents should know — and appends a
structured entry to REFLECTION_LOG.md. Micro-decisions live in
the log's Surprise and Improvement fields. They are searchable,
dated, and classified by signal type, so later curation can
promote recurring patterns.
Tier 2 — design decisions. Larger architectural choices that will shape months of work ("we picked an event-sourced store for flight plans rather than a relational store"). These deserve a dedicated ADR file.
A minimal ADR template¶
Create docs/adr/ and use a four-section template:
# ADR-NNNN — Short Title
## Status
Proposed | Accepted | Superseded by ADR-XXXX | Deprecated
## Context
Two to five sentences. What forces are acting? What problem are
we solving? What are the relevant constraints from HARNESS.md?
## Decision
One to three sentences, stated as an active choice.
"We will ..."
## Consequences
Three to five bullet points. What becomes easier, what becomes
harder, what new constraints this introduces, what we are giving
up.
Name files as docs/adr/NNNN-short-title.md with a
monotonically-increasing number. Reference the ADR from any
HARNESS.md constraint grounded in it:
### Flight-plan persistence in UTC only
- **Rule**: All timestamps in the flight-plan store must be UTC.
- **Enforcement**: deterministic
- **Tool**: custom lint rule `atm-utc-only`
- **Scope**: commit
- **Rationale**: See ADR-0014 — timezone handling after the 2023
phantom-conflict incident
How this prevents archaeology¶
A new engineer asking "why is everything UTC" in six months' time gets answered by a file, not a meeting. An AI agent generating code that imports a local-timezone helper sees the constraint, sees the ADR reference, and understands both the rule and its rationale. The cost of capturing the ADR at decision time is around ten minutes. The cost of reconstructing it six months later from memory, commits, and chat history can be hours.
The discipline¶
Add an ADR whenever a decision meets any of these tests:
- You find yourself explaining the reasoning more than twice
- The decision overrides a convention elsewhere
- Reversing the decision would require a migration
- You expect new engineers to question the decision
Skip ADRs for decisions that are reversible within a single PR.
Those belong in the PR description or a /reflect entry.
What you have at the end of Phase 4¶
A docs/adr/ directory with the first few ADRs — one per
significant decision you have made recently or can remember
making in the last quarter. HARNESS.md constraints link to the
ADRs that justify them. REFLECTION_LOG.md is receiving
micro-decisions as they happen. The team now has a living
decision record that grows by minutes per week rather than hours
per retrospective.
Phase 5: Generate Team-Specific Onboarding¶
Why this fifth¶
New engineers joining an ATM team typically go through a general onboarding programme — accounts, access, development environment, corporate policies. None of that covers the domain knowledge they actually need to ship a useful pull request. The gap between "my laptop works" and "I understand why we never poll the sector-assignment service from the validator" is where the team loses weeks.
After Phases 1–4, all of that domain knowledge now lives in
CLAUDE.md, HARNESS.md, AGENTS.md, REFLECTION_LOG.md, and
docs/adr/. The habitat is the onboarding material — what is
missing is a friendly, prose-organised surface that a new
engineer can read on their first day. Writing that surface by
hand is the familiar trap: the document ages the moment it is
written and drifts from the source within weeks. The plugin
avoids this by generating the onboarding document from the
habitat, so it stays current by construction.
/harness-onboarding (or /harness-sync for the multi-surface entry)¶
/harness-onboarding is one of the underlying primitives that
/harness-sync
composes. When the team-composition change you are absorbing also
warrants refreshing the convention files (Cursor, Copilot, Windsurf),
use /harness-sync — it runs /harness-onboarding and
/convention-sync together in one interactive pass, with a verification
scan at the end. Use /harness-onboarding directly only when you want
to refresh ONBOARDING.md alone.
The command reads three authoritative sources — HARNESS.md,
AGENTS.md, REFLECTION_LOG.md — and produces ONBOARDING.md
with ten sections organised around what a new contributor
actually needs:
- Welcome and scope — what the project does, in plain terms.
- Tech stack — languages, frameworks, tools, with versions.
- Conventions — the
CLAUDE.mdcontent rendered as prose, grouped by topic. - What's enforced and when — constraints from
HARNESS.md, with their scope (commit, pr, or scheduled) and the tool that enforces them. - Common pitfalls — synthesised from
REFLECTION_LOG.mdentries classified asfailure— real mistakes the team has made and encoded. - Architecture decisions — a readable summary of
docs/adr/, with links to the full ADRs. - Testing approach — how tests are structured, what the coverage target is, what fixtures exist.
- How the harness works — a short explanation of the three enforcement loops (commit, PR, scheduled) so the new engineer understands why their pre-commit hook is running Prettier.
- Agent team — which agents the project uses and what each
one is responsible for, drawn from
AGENTS.md. - Your first PR checklist — a concrete set of steps the new engineer can follow end to end to merge their first change without blocking a reviewer.
A validation checkpoint inside the command verifies all ten
sections are present and fixes any missing content before
committing the file. A garbage-collection rule checks monthly
whether ONBOARDING.md has drifted from its sources.
How to run it¶
The command runs in under a minute on a mid-size habitat. Review the output with a senior engineer before committing — the synthesis step is the one place AI creativity can drift, and a quick read catches any misrepresentation. Typical edits are small: adjusting a tone, clarifying a pitfall, adding a link.
The feedback loop¶
The onboarding document is not just an output — it is an input
back into the habitat. When a new engineer reads it and gets
confused, that confusion is a signal: either the habitat is
missing something, or it says something that does not match
reality. Encourage new hires to run /reflect after their first
week with a single question: "What did ONBOARDING.md not
prepare me for?" The answers surface gaps that regulars cannot
see because they stopped noticing.
What you have at the end of Phase 5¶
ONBOARDING.md at the project root — a ten-section document
grounded in the habitat, with links back to the source files.
New engineers land on this as their first-day read. Because the
document regenerates from source, it does not drift — every
habitat edit over the next quarter is reflected the next time you
run /harness-onboarding.
The Flywheel¶
Five phases look like a one-time exercise, but the practice is cyclic. Each turn of the wheel makes the next turn cheaper:
extract ──► encode ──► onboard ──► new hires
▲ │
│ ▼
└────── /reflect ◄── questions, gaps, surprises
- Extract (Phase 2) surfaces tacit knowledge.
- Encode (Phases 1, 3, 4) turns it into artefacts.
- Onboard (Phase 5) uses the artefacts to bring new engineers up.
- New hires surface gaps regulars cannot see.
/reflectcaptures those gaps; the habitat updates.- Re-run
/harness-onboarding; the next cohort benefits.
The first turn costs about two hours and feels like a lot.
Subsequent turns take minutes — a reflection captured after a
confusing session, a /harness-constrain promoting an unverified
rule, a regenerated ONBOARDING.md before the next hire starts.
What You Have Now¶
After completing this tutorial you have:
- A full habitat:
CLAUDE.md,HARNESS.md,AGENTS.md,MODEL_ROUTING.md,REFLECTION_LOG.md, all populated with real team knowledge rather than boilerplate - A
docs/adr/directory with the first ADRs, each linked from theHARNESS.mdconstraints they justify - An
ONBOARDING.mdthat regenerates from the habitat rather than aging into inaccuracy - A lightweight capture discipline —
/reflectfor micro-decisions, ADRs for design decisions — that prevents the team from ever again relying on memory for what was decided
More importantly, the team has a vocabulary and a mechanism for making tacit knowledge explicit. Extraction is no longer a one-off project; it is a habit, triggered by reviews, incidents, onboarding confusion, and scheduled quarterly revisits.
Next Steps¶
- The Improvement Cycle — run
/assessto measure where the habitat has moved you on the AI Literacy framework, and generate an improvement plan for the next level - Governance for Your Harness — for conventions that are important enough to audit quarterly, promote them to governance constraints with falsifiability checks and three-frame alignment
- How-to: Extract Conventions —
a shorter, task-oriented reference for running
/extract-conventionswithout the full tutorial context - How-to: Generate Onboarding — a
shorter reference for
/harness-onboarding - Reference: Commands — full specification for every command used in this tutorial