From adversarial-research
Use when building a research knowledge base on a controversial topic — typically invoked by /research. Builds an argument graph (not just a source pile) by gathering sources, extracting argument nodes, drawing typed edges between them, recursively tracing claims to primary sources, rating argument strength, and surfacing contradictions. Iterative — runs multiple passes until the graph is stable. Optional exploratory mode pulls in fringe/extreme sources with a generous-then-critical-then-realist read.
How this skill is triggered — by the user, by Claude, or both
Slash command
/adversarial-research:knowledge-base-constructionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build a knowledge base for a controversial topic. The KB is an **argument graph grounded in primary sources**, not a flat source dump. Output is self-contained and useful on its own — the adversarial-debate skill is one consumer of this KB, but the KB stands alone as a research artifact.
Build a knowledge base for a controversial topic. The KB is an argument graph grounded in primary sources, not a flat source dump. Output is self-contained and useful on its own — the adversarial-debate skill is one consumer of this KB, but the KB stands alone as a research artifact.
The plugin ships a hook system (scripts/kb-tool.py + PostToolUse / Stop hooks in plugin.json) that takes the rote, mechanical work off your plate. Treat the split as load-bearing:
Hook-managed (mechanical, deterministic — DO NOT do these by hand):
~/.cache/adversarial-research/ (override via ADVERSARIAL_RESEARCH_CACHE). Content-addressable storage of raw fetched data, deduped by DOI then by canonical URL. Same paper across multiple research topics is downloaded once.kb/sources/, the hook automatically updates kb/sources/index.md (or the per-agent index for files under kb/sources/agents/<agent>/). When you write an arg-NNN-*.md under kb/arguments/, the hook updates kb/arguments/index.md. When you write a kb/entities/<slug>.md, the hook updates kb/entities/index.md. You do not write to these index files yourself — anything you write there will be overwritten on the next index rebuild.kb/log.md). Append-only chronological record. The hook auto-appends entries on every source ingest, source update, arg create/update, entity create/update, first-time fetch, and lint run. Format: ## [YYYY-MM-DD HH:MM UTC] <kind> | <title> followed by a one-line summary. Greppable by kind (e.g. grep '^## \[.*\] ingest '). You can append your own narrative entries when something happens that the hook doesn't auto-capture (debate-mutation summaries, gap-finding notes, end-of-pass syntheses).WebFetch / WebSearch / MCP research-tool call (PubMed, bioRxiv, Consensus) is logged to kb/.fetch-log.jsonl and to the global ~/.cache/adversarial-research/fetch-log.jsonl. Cached responses are stashed in the source cache automatically.Stop / SubagentStop the hook runs the validator across the run-dir and emits structured findings (errors, warnings, infos). Read the findings and fix any errors before reporting the phase complete.python3 ${CLAUDE_PLUGIN_ROOT}/scripts/kb-tool.py lint <run-dir> (or invoke /kb-lint <run-dir>) for graph-level mechanical lint: orphan args, dangling-empirical-basis args, unreferenced sources, status-stale candidates. Output goes to kb/.lint-report.json and a summary entry to kb/log.md. Pair with the kb-linting skill for the semantic part of lint (engagement drift, traceback completeness, central-question coverage, contradiction-status drift, entity-page opportunities).You-managed (judgment, semantic):
supports, refutes, addresses, tangential-to, scope-mismatch-with, layer-shift-from, etc.). The hook does not write to edges.md or contradictions.md — those are pure judgment.If the hook ever appears to disagree with you (e.g. flagging a source as missing PDF when you believed it was fine), trust the hook for the mechanical fact (the PDF really isn't downloaded) and fix the underlying issue (find an OA URL or document why it's paywalled). The hook does not make semantic claims.
~/.cache/adversarial-research/ — source cache (raw downloaded data, metadata.json with Unpaywall results)<run-dir>/kb/.fetch-log.jsonl — every fetch this run has donepython3 <plugin-root>/scripts/kb-tool.py validate <run-dir> — invoke the validator manually anytimepython3 <plugin-root>/scripts/kb-tool.py cache-status — cache statspython3 <plugin-root>/scripts/kb-tool.py cache-lookup --doi <doi> — check what the cache has for a given DOIThis is the central discipline of this skill. Read it carefully and apply it everywhere.
No secondhand claims. "The AAP says X" is a claim about the AAP, not about X. To use X you must trace through to the primary source the AAP relied on — the actual study, the actual data, the actual policy text — and cite that. If the AAP statement doesn't cite a study, that absence is itself a finding worth recording.
Recursive tracing. When a source cites another source, follow the chain. Meta-analysis → inclusion criteria + each underlying study. Review article → the primary studies it summarizes. Policy statement → its evidence base. Press release → the underlying paper. Keep going until you hit raw data, an unverifiable assertion, or a dead end. A dead end is a finding. If a widely-repeated claim has no primary source you can locate, that's a critical fact about the claim's strength.
Authority is not evidence. A prestigious organization endorsing a claim is evidence about the organization's stance, not about the claim's truth. The KB never grants strength based on who said something — only on what the traceback reveals.
Author/network tracing. When one author or a tight network of co-authors dominates a position's literature (canonical patterns: a small group of co-authors at one institution generating most of the favorable primary studies; a single high-influence senior author appearing on 5+ supportive papers spanning a decade), explicitly map: who they coauthor with, their institutional/funding ties, what the broader literature and methodological critics have said about them. This goes in the per-source template's Author network section. Network concentration is itself a finding — it doesn't refute the work, but it changes how independently-replicated the body of evidence really is.
Active cross-source criticism. When source X criticizes source Y, write the criticism into Y's Criticism field with a back-pointer to X (and vice versa). The corpus becomes a graph of mutual critique, not a flat list.
This principle applies in every phase below. If at any point you find yourself about to use a claim without a primary-source trace, stop and trace it first.
./research-runs/<topic-slug>/ by convention. The slash command creates kb/ inside it. All paths below are relative to the run directory.standard (default) or exploratory. The exploratory mode is described below.If any of these are missing or unclear, stop and ask the caller.
kb/
sources/ # source files, written-on-access (Phase 1)
peer-reviewed/
media/
media/missing-citation/
retracted/
corrected/
fringe/ # only used in exploratory mode
institutional/ # policy statements, official positions
[other categories as needed]
index.md # source index (HOOK-MANAGED, do not edit)
arguments/ # one file per argument node
arg-001-<slug>.md
arg-002-<slug>.md
...
index.md # argument index (HOOK-MANAGED, do not edit)
entities/ # OPTIONAL: profiles for people, orgs, key studies, named concepts
<slug>.md # one file per entity
index.md # entity index (HOOK-MANAGED, do not edit)
edges.md # typed edges between argument nodes
contradictions.md # surfaced structural / evidentiary / ethical contradictions
quality-summary.md # narrative description of the graph state — your entry point
log.md # narrative chronological log (HOOK-APPENDED)
.fetch-log.jsonl # machine fetch log (HOOK-MANAGED)
.lint-report.json # machine lint report (HOOK/SCRIPT-MANAGED)
.arg-state.json # internal state for arg-update tracking (HOOK-MANAGED)
.entity-state.json # internal state for entity-update tracking (HOOK-MANAGED)
Phase 1 creates kb/sources/ subdirs on-demand. Phases 2+ create kb/arguments/ and the meta files. kb/entities/ is optional; create it (and entity files in it) when consolidating scattered info about a recurring person/org/study/concept is useful — see "Entity pages" below.
The phases below describe one pass through the KB. The skill is iterative: after Phase 7 you may re-enter at Phase 1 with targeted source hunts to fill gaps the graph revealed. Continue until the graph is stable — meaning a full pass produces no new arguments, no rating changes, no new contradictions. Most non-trivial topics need 2–4 passes.
The construction process must be auditable post hoc from kb/log.md alone. That means decisions and phase boundaries are recorded as they happen, not reconstructed afterward from the resulting files. A reader who has access only to the log should be able to follow the construction's reasoning trail.
The hook auto-logs concrete artifacts (every source ingest, arg create/update, entity create/update, first-time fetch, lint run). What the hook cannot capture, you must log explicitly via kb-tool.py subcommands:
phase-mark:
python3 <plugin-root>/scripts/kb-tool.py phase-mark <run-dir> P<N> start --note "<what this phase will do>"
python3 <plugin-root>/scripts/kb-tool.py phase-mark <run-dir> P<N> end --note "<what came out>"
log-decision:
python3 <plugin-root>/scripts/kb-tool.py log-decision <run-dir> --gist "<one-line>" --detail "<rationale>"
log-reject:
python3 <plugin-root>/scripts/kb-tool.py log-reject <run-dir> --kind <source|arg|edge> --target "<ref>" --reason "<why>"
Don't log every passing-glance reject — only ones a careful auditor would want to know were considered.log-pass with stats:
python3 <plugin-root>/scripts/kb-tool.py log-pass <run-dir> --pass <N> \
--summary "<what changed in this pass>" \
--stats '{"sources_added":N,"args_added":M,"edges_added":K,"contradictions_added":J,"ratings_changed":L}'
These four event kinds (phase, decision, reject, pass) are greppable in kb/log.md alongside the auto-logged kinds (ingest, arg-create, fetch, lint, etc.). The combination forms a reconstructable timeline.
Why mandatory: without explicit logging, the construction is a black box — readers see what came out, not how it was built. With the logging discipline in place, the construction is itself a research artifact: the reasoning is preserved, defensible, and reproducible by another researcher who can see what was rejected and why, what was hard, where uncertainty was acknowledged.
WebFetch, WebSearch, or an MCP tool, immediately write the retrieved content to kb/sources/<subdir>/<slug>.md using the per-source template (below). Do not batch source writing for later. Context can compress; sessions can end; only what's on disk survives. (The fetch hook also caches the raw response automatically, but the analytical extraction in the source file is your job.)PostToolUse hook on Write/Edit of kb/sources/**/*.md triggers an Unpaywall → PMC → preprint lookup for any source with a DOI or peer-reviewed source_type, downloads the legal OA PDF if found, and stores it in the cache. You don't WebFetch the PDF yourself; just write the source file with doi: and/or url: populated and the hook handles the rest. If no legal OA exists, the cache flags the entry paywalled and the source stays in the KB.kb/sources/index.md yourself. The hook rebuilds it on every source-file write. Just include key_finding: in your frontmatter — the hook uses it for the index entry.WebSearch summary results (not just link lists), write a combined summary file: kb/sources/<subdir>/search-summary-<topic>.md.Read what's in kb/sources/. For every distinct argument or claim you find that's relevant to the topic, create an argument node file at kb/arguments/arg-NNN-<slug>.md using the argument node template (below). Index it in kb/arguments/index.md.
What counts as "an argument" worth a node:
Granularity: small enough that strength rating is meaningful for the node, large enough that you're not creating a node per sentence. When in doubt, split — refining nodes is easy in later passes.
Each argument can be asserted by a position (pro/con/neutral), be derived (built from other arguments via reasoning), or be factual (a finding most of the literature accepts). Mark this in the node frontmatter.
Layer and scope are mandatory frontmatter fields for every argument:
layer: — what kind of argument this is. One of:
empirical — factual claims about what is the case (study findings, statistics, observed phenomena)methodological — claims about study design, evidence quality, or how to interpret dataethical/metaphysical — claims grounded in ethical principles or philosophical commitments (autonomy, harm, bodily integrity, justice)cultural/religious — claims grounded in cultural or religious significance/practicepolicy/regulatory — claims about what should be done by institutions, laws, medical practicemeta — claims about the literature or discourse itselfscope: — what conditions the argument actually claims to apply to. Free-form but structured: population, geography, time period, study design, etc. Examples: women aged 50–69 in the screening trial's randomized cohort, 1990s–2000s cadence; subjects unable to provide informed consent, all populations; general principle, scope unbounded.These fields are what make relevance, scope-mismatch, and layer-shift detectable. A claim being true within its scope does not mean it applies outside that scope. A claim at one layer may inform another layer but does not refute it without an explicit cross-layer argument doing the bridging.
For each argument node, populate the Supporting, Attacking, Refining/derivative, Depends-on, and Engagement sections by linking to other arg-IDs. Append every edge to kb/edges.md (format below). Edges are typed:
Logical-relationship edges:
supports — A provides evidence for Bcontradicts — A directly opposes B (mutual)refutes — A specifically and successfully attacks B (one-directional, stronger than contradicts)depends-on — A requires B to holdrefines — A is a more nuanced version of Bexaggerates — A overstates B's actual claimconfounds — A conflates separate things, blurring B with something elsederived-from-source — A's evidentiary basis is in a specific source file (treated as an edge for graph purposes)Engagement / relevance edges (these are the ones that catch true-but-irrelevant moves):
addresses — A directly engages B's central question at B's layer and within an applicable scope. Genuine engagement.tangential-to — A is true (or even well-supported) but does not actually engage B's central question. Common pattern: citing a true peripheral claim while leaving B's core question unaddressed.scope-mismatch-with — A is true within A's declared scope:, but A's scope does not cover the domain B speaks to. Canonical example: a screening RCT enrolling women aged 50–69 is cited to recommend screening women in their 40s, when the trial's scope did not sample that age group.layer-shift-from — A is at a different layer: than B and is being used as if it engaged B without an explicit cross-layer bridging argument. Canonical example: a policy/regulatory argument ("agency X recommends Y") being used to dismiss a methodological argument about the underlying trial's design.A layer-shift-from or scope-mismatch-with edge does not lower A's strength rating — A may be entirely true within its scope/layer. The flaw is in the application of A to B. The edge records that misapplication so the debate and the synthesis can see it.
Edges grow over multiple passes — Phase 3 is never "done" until the graph is stable.
For each argument node, do the recursive traceback to its evidentiary basis. Then rate:
Write the rating into the node's frontmatter, and write a paragraph in the node's Strength assessment section explaining why and what would change the rating. The "what would change it" matters — it tells future passes (and the debate phase) what evidence to hunt for.
Important: nothing gets deleted. Refuted and baseless arguments remain in the graph. They are a permanent record that someone, somewhere, asserts this. The debate skill needs them — a side may rest on a baseless claim, and the moderator + opposing side need ready access to why it's baseless.
Walk the graph. Write findings into kb/contradictions.md. Look specifically for:
supports/depends-on edges where two members have a contradicts edge between themEach contradiction is its own entry in contradictions.md with: the involved arg-IDs, the involved source paths, a description of the conflict, and what would resolve it.
The graph just told you what it's missing: dangling evidence, contested arguments where one more strong primary source would tip the rating, baseless arguments worth one more search before final-rating. Do targeted Phase-1 sourcing for those specific gaps. Then re-enter Phase 2–5 for the new sources.
Verify apparent asymmetry before recording it. If the graph appears one-sided in coverage at a layer (e.g., many methodological critiques of one position and none of the other; one side's arguments cluster at weak/contested while the other side's cluster at strong/robust), treat that as a hypothesis to test, not a finding. Do directed search for the strongest-form arguments on the under-represented side: methodological defenses, well-replicated supportive evidence, the most rigorous version of the opposing case, replies to specific named critiques. Look explicitly for what would push the under-represented side's nodes upward — the literature very often contains such arguments and they get missed in a first pass.
Then conclude. If the asymmetry persists after exhaustive directed search, the asymmetry is itself a finding — record it explicitly in the Phase 7 quality summary as asymmetric-after-exhaustive-search rather than leaving it ambiguous between corpus reality and extraction gap. Do not manufacture junk arguments to fake symmetry — that's exactly the false-balance failure mode the plugin is built to escape. A controversial topic where one side really does have stronger methodology is a real-world finding; recording it honestly is the point.
When concluding the asymmetry is corpus-real, log the rationale via log-decision:
python3 <plugin-root>/scripts/kb-tool.py log-decision <run-dir> \
--gist "asymmetry verified — directed search did not reduce" \
--detail "Searched for: <list of strongest-form opposing arguments / sources / methodologies attempted>. Found: <what was imported>. Net effect: <how asymmetry changed, e.g. 'deepened via newly surfaced contradictions C-NNN, C-MMM' or 'reduced via import of <source> demonstrating <X>'>. Conclusion: asymmetric-after-exhaustive-search at <layer>."
This makes the asymmetry-verification reasoning auditable from the log alone.
Once the graph is stable, write kb/quality-summary.md. This is narrative, not just a list. Cover:
addresses edges. This anchors what counts as engagement vs. deflection in the debate.addresses edges) and which it leaves unaddressed or pivots away from via tangential-to / scope-mismatch-with / layer-shift-from edges. A position that has many strong arguments but engages few central questions is a different finding from a position with weaker arguments that directly engages the central questions.weak/contested; one side's methodology mostly under critique; one side has many supporting nodes and the other few), state explicitly that Phase 6 directed search for the strongest-form opposing arguments was performed and what it did or did not surface. Asymmetry-after-exhaustive-search is a legitimate finding; asymmetry-because-extraction-was-incomplete is an incomplete graph. Distinguish them in the summary, and never paper over the first to manufacture symmetry.This summary is the human reader's entry point into the KB. The central-questions section is also what the debate skill loads to anchor cross-examination.
The construction phase is complete when a full pass produces no new arguments, no rating changes, and no new contradictions. Note this terminal state in kb/quality-summary.md so a downstream consumer (the debate skill, a human reader) knows the graph is stable.
If after 4–5 passes the graph is still churning, write that into the quality summary as well — sometimes a topic is genuinely unstable, and that is itself a finding.
Triggered by the caller passing --exploratory (or equivalent). Modifies Phase 1 sourcing and Phase 2 argument extraction.
What it adds:
kb/sources/fringe/ (or appropriate non-fringe subdir if a fringe source happens to be peer-reviewed but methodologically weak).The discipline (this is what makes it not noise):
For each fringe source, write the source file with two reading sections in the Content block:
Then in Phase 7's quality summary: back out to a realist view. Acknowledge the inherent uncertainty in the topic, but explicitly note where the fringe positions did and didn't reveal real flaws in the mainstream view, where mainstream consensus is well-grounded, where contradictions remain unresolved. Never collapse into "both sides have a point" if the traceback says one side is better-grounded — but never dismiss either, since dismissal is what fan-out mode exists to avoid.
Exploratory mode pairs especially well with contradiction-surfacing — fringe positions often expose real contradictions in the mainstream that a standard literature review would smooth over.
kb/entities/)Optional structural layer. Use when consolidating scattered information about a recurring person, organization, key study, or named concept produces real value beyond what fits in the relevant source files' Author network and Criticism fields.
When to create an entity page:
When you create an entity page, the hook auto-rebuilds kb/entities/index.md. The validator checks the schema (required frontmatter fields). You do not write to kb/entities/index.md directly.
---
id: ent-NNN
slug: <kebab-case-slug>
name: <human-readable name>
type: person | organization | study | concept | other
aliases: [list of common alternative names or spellings]
summary: <one-line summary for the index>
---
# <Name>
## Profile
[For person: role, affiliations, training, what they're known for in the broader literature.]
[For organization: what they do, how they're funded, governance.]
[For study: design, sample, year, intervention/observation, key findings as the study reports them, headline statistics.]
[For concept: definition, origin, how the concept is typically used in this topic's discourse.]
## Affiliations / coauthor network / authoring history (people)
## Funding / governance / structure (organizations)
## Methodology / replication status / criticism in subsequent literature (studies)
## Variants / related concepts / common confusions (concepts)
[Pick the section(s) that apply. Cite by source path when you make claims; use the same write-on-access discipline as for source files.]
## Appearances in this corpus
- arg-NNN — how this entity figures in the argument
- arg-MMM — ...
- kb/sources/.../paper.md — ...
## Cross-source criticism
[Bidirectional: when sources X and Y criticize this entity (or each other regarding this entity), summarize and link.]
id — ent-NNN (zero-padded number)slug — kebab-case stem of the filenamename — human-readabletype — one of person | organization | study | concept | othersummary — one-line, used by the indexaliases is recommended for searchability.
---
title: <Article/Page Title>
authors: [if available]
journal_or_source: <journal name or website>
year: <publication year>
doi: [if available]
url: <original URL accessed>
date_accessed: YYYY-MM-DD
source_type: peer-reviewed | media | institutional | reference | fringe | dissident
quality_flags: [methodology, conflict-of-interest, retracted, corrected, etc.]
key_finding: <one-line summary the index will use>
---
# <Title>
- **Authors**: ...
- **Journal/Source**: ...
- **Year**: ...
- **DOI**: ...
- **URL**: ...
- **Date accessed**: ...
- **Source type**: ...
- **Quality notes**: <conflicts of interest, methodology flags, or "none noted">
- **Citations**: <list of citations referenced in the source; copy exactly for academic citations, or construct an APA citation for links and references to title/author>
- **Cites (primary sources this leans on)**: <list of source-file paths in this KB if already imported, or external citations to chase>
- **Cited by (sources in our corpus that lean on this)**: <list of paths — populated as the corpus grows>
- **Author network**: <when the author is part of a tight cluster: coauthors, institutional ties, funding patterns, methodological critiques in the broader literature>
- **Criticism**: <independent criticism — populated when other sources in the corpus criticize this one, with back-pointers>
## Content
[Extracted content: abstract, key findings, methodology, data, conclusions —
whatever was returned by the fetch, exactly as returned. Preserve all specific
statistics, sample sizes, confidence intervals, named findings.]
[In exploratory mode, replace the single Content block with two:]
## Generous read
[Steelman: strongest version of this source's case. What would have to be true. What real considerations it points at.]
## Critical read
[Traceback: evidence-chain analysis, methodological flags, what the broader literature says in response, factual errors, motivated framings.]
Lowercase kebab-case: <first-author-or-org>-<year>-<brief-topic>.md
Examples: <author>-<year>-<study-descriptor>.md, <agency>-<year>-<policy-or-guideline>.md, <author>-<year>-<review-topic>.md, retraction-watch-<year>-<paper-descriptor>.md.
kb/sources/peer-reviewed/kb/sources/media/kb/sources/media/missing-citation/kb/sources/institutional/kb/sources/retracted/kb/sources/corrected/ (preserve both versions; never use the uncorrected version to form conclusions)kb/sources/fringe/legal/, religious/)---
id: arg-NNN
slug: short-kebab-slug
position: pro-X | con-X | neutral | factual | meta
layer: empirical | methodological | ethical/metaphysical | cultural/religious | policy/regulatory | meta
scope: <free-form structured: population, geography, time, study-design, etc.>
basis_type: empirical | reasoning | metaphysical | mixed
status: robust | strong | contested | weak | refuted | baseless
asserter: <who/what put this forward — paper, advocate, derived from arg-IDs ...>
summary: <one-line statement>
---
# Argument: <Statement>
## Statement
Full claim, precisely worded.
## Evidentiary basis
[List of bases. Each entry has a type prefix:]
- **[empirical]** [source: kb/sources/path/to/file.md] specific finding excerpt
- **[reasoning]** chain: arg-XXX + arg-YYY → this argument, brief explanation
- **[metaphysical]** named principle (e.g. "informed consent"): brief articulation
## Supporting arguments
- arg-XXX (edge: supports) — short note on how
- ...
## Attacking arguments
- arg-XXX (edge: contradicts | refutes | exaggerates | confounds) — short note
- ...
## Refining / derivative arguments
- arg-XXX (edge: refines) — short note
## Depends on
- arg-XXX (edge: depends-on) — must hold for this argument to hold
## Engagement (relevance edges)
- arg-XXX (edge: addresses) — directly engages this argument's central question at its layer
- arg-XXX (edge: tangential-to) — true / well-supported but does not engage this argument's central question
- arg-XXX (edge: scope-mismatch-with) — true within own scope but applied outside it
- arg-XXX (edge: layer-shift-from) — at different layer; used as if it engaged this argument without cross-layer bridging
## Traceback notes
- How deep the recursive traceback has gone
- Open questions / dead ends / dangling evidence
- Where the chain currently breaks
## Strength assessment
- Why the current rating (`robust` | `strong` | ... | `baseless`)
- What would change the rating in either direction
- **Note:** strength is about evidentiary basis within scope. An argument can be `robust` and still be irrelevant (`tangential-to`, `scope-mismatch-with`, `layer-shift-from`) when applied outside its scope. Strength rating and relevance edges are independent dimensions.
kb/edges.md)A flat append-only log of every edge in the graph. Format:
arg-001 supports arg-007 "evidence overlap on the methodology question, see arg-001 strength notes"
arg-018 contradicts arg-042 "direct factual disagreement on transmission rates"
arg-031 refutes arg-018 "primary-source traceback shows arg-018 misreads the cited study"
arg-009 depends-on arg-007 ""
arg-014 exaggerates arg-007 "overstates effect size"
arg-022 derived-from-source kb/sources/peer-reviewed/<author>-<year>-<descriptor>.md ""
arg-007 scope-mismatch-with arg-099 "arg-007 scope is the screened cohort 50–69; arg-099 concerns the under-50 population"
arg-051 layer-shift-from arg-099 "arg-051 is policy/regulatory; arg-099 is ethical/metaphysical; no cross-layer bridge"
arg-051 tangential-to arg-099 "arg-051 true but does not address arg-099's central informed-consent question"
arg-101 addresses arg-099 "directly engages the informed-consent question at the ethical layer"
Four whitespace-aligned columns: source-arg-id, edge-type, target (arg-id or source path), optional comment.
kb/contradictions.md)# Contradictions
## C-001: <short title>
- **Type**: structural | dangling-evidence | within-position-incoherence | cross-source-disagreement | authority-evidence-drift
- **Involved arguments**: arg-XXX, arg-YYY, ...
- **Involved sources**: kb/sources/path-1.md, kb/sources/path-2.md, ...
- **Description**: <what conflicts with what, and why this is structurally a contradiction rather than just disagreement>
- **What would resolve it**: <what evidence or reasoning would settle this, if any>
- **Status**: open | resolved-by-arg-NNN | unresolvable-given-current-corpus
layer: and scope: populated. These are mandatory.addresses, tangential-to, scope-mismatch-with, layer-shift-from) are drawn deliberately, not just logical-relationship edges. An argument that "supports" position X by being true-but-tangential to the central question gets both the supports edge and the tangential-to edge.addresses edges.Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub skothr/controversial-topic-research --plugin adversarial-research