Changelog
All notable changes to irp-capture are documented here.
[0.6.1] — 2026-04-29
Added — irp export graph · Interactive 3D decision graph
New command: render the full decision ledger as a self-contained interactive 3D HTML file.
irp export graph # writes GRAPH.html in project root
irp export graph --output viz.html # custom path
irp export graph --force # overwrite existing
What it generates
A single GRAPH.html — no server, no install, open in any browser. Built on 3d-force-graph (Three.js/WebGL). Decisions rendered as a 3D force globe with:
- Globe layout — nodes distribute into a sphere under 3D force simulation; clusters form naturally as cross-referenced decisions grow
- Colour coding — green (high confidence), amber (medium), red (low), grey (unknown)
- Node size — scales with confidence level
- Animated particles — travel along provenance edges (IRP id cross-references found in
whyfields) - Directional arrows — show which decision references which
- Click to inspect — detail panel shows full decision: id, what, why, tags, confidence, source, and clickable cross-reference links
- Camera fly — clicking a node animates the camera toward it
- Inertia — dragging the globe has smooth deceleration (OrbitControls damping)
- Auto-rotation — slow clockwise idle rotation; pauses on interaction, resumes after 2 s
Design invariants
- No new schema. Reads
.irp/ledger.jsonlonly. - No LLM calls. No inference. Deterministic mapping only.
- Edges derived from IRP id cross-references in
whyfields (regex only — no inference). - Single self-contained HTML via CDN — no build step, no dependencies to install.
GRAPH.htmlis gitignored by default (always regenerable; treat as a build artefact).
Obsidian graph view (same session)
irp/integrations/obsidian.py now converts bare IRP ids in why fields to [[wikilinks]] on write. Obsidian’s built-in graph view draws provenance edges automatically — no extra configuration.
[0.6.0] — 2026-04-29
Added — irp export context
New command: export decision lineage as portable working-context files.
irp export context --target agents.md
- Derives single-line agent rules under Working constraints — each rule cites its source IRP id
- Lists every decision with full provenance under Relevant decisions
- Conservative rule derivation: decisions that are multi-sentence, long-form, or contain em-dash summaries are listed in full rather than forced into a misleading rule
- Fills the empty layer beneath AGENTS.md / CLAUDE.md / DESIGN.md: those files tell agents what to do, IRP tells them why those rules exist
irp export context --target decisions.md
- Human-readable decision log, newest-first
- One section per decision: IRP id · timestamp heading, bold
what, italicwhy - Confidence badges (🟢 high / 🟡 medium / 🔴 low), tag list, source label (slack channel, demo scenario, stdin, etc.)
- Readable by any collaborator who doesn’t run IRP
Flags (both targets)
--output PATH— override default output path (AGENTS.md or DECISIONS.md in project root)--force— overwrite existing output file--writable— leave file-rw-r--r--; default ischmod 444read-only--json— machine-readable output
Design invariants
- No new schema. Reads
.irp/ledger.jsonlonly. - No LLM calls. No inference. Deterministic text transformation only.
- Provenance on every output line. Always regenerable.
- Read-only by default — editors surface “file is locked” before any save.
[platform-2026-04-28] — 2026-04-28 [internal]
Added — irp export context --target decisions.md
Export target: decisions.md
- New
--target decisions.mdchoice alongside existingagents.md - Generates
DECISIONS.mdin project root (or--output PATH) — a human-readable decision log ordered newest-first (changelog style) - One section per decision:
## IRP-ID · timestampas heading, boldwhat, italicwhy, confidence badge (🟢/🟡/🔴), tag list, source label - Slack entries show channel ID; demo entries show scenario; all others show source field
- Clearly marked as generated with regeneration command in header
- No rules derived, no inference — every decision shown in full
--forceguard and--outputpath override work identically toagents.md--jsonreturns{ status, target, output_path, decision_count }(norule_count— not applicable)irp.py--targetchoices updated; help text distinguishes:agents.md(agent constraints) vsdecisions.md(human log)- Captured as IRP-2026-04-28-004
Design principle (IRP-2026-04-28-002 + IRP-2026-04-28-004)
- AGENTS.md: machine-readable, rule-derived, agent-facing
- DECISIONS.md: human-readable, full-fidelity, stakeholder-facing
- Both generated from
.irp/ledger.jsonl— same substrate, different projections - “Own the substrate. Export the standard-looking files.”
Read-only by default (IRP-2026-04-28-005)
- Both
AGENTS.mdandDECISIONS.mdshipchmod 444after every export - Editors (TextEdit, VS Code, Cursor) surface a “file is locked” prompt before any save
- Override per-export: pass
--writableto leave the file-rw-r--r-- - Override post-export:
chmod +w AGENTS.md(one-time, restored on next export) - Regen handles locked files transparently — chmod 644 → write → chmod 444
[0.5.0] — 2026-04-26
Added — traction stack: doctor, VS Code extension, Cursor guide, Discussion template
irp doctor
- New CLI command: checks Python version, irp-capture install,
.irp/directory,ledger.jsonlintegrity,current.json, Claude Code skill presence, and optional integrations (Obsidian, MemPalace, MCP, REST API) - Core vs optional distinction: integration ✗ is informational, not a failure
- Supports
--jsonflag - Registered in
build_parser()and dispatch table
VS Code extension (irp/vscode_extension/)
- Three commands:
IRP: Capture Decision(⌘⇧I),IRP: Show Recent Decisions,IRP: Doctor - Two-step input box (what → why), pipes JSON to
irp capture --stdin— no shell escaping - Status bar item (
⬡ IRP · N decisions) — live count, click to open why panel - Dedicated IRP output channel for
whyanddoctoroutput - Configurable
irp.executableandirp.projectRootsettings - Packaged as
irp-capture-0.5.0.vsix(8.12 KB) - Source field set to
vscodefor ledger provenance
Cursor guide (CURSOR-GUIDE.md)
- MCP server setup:
pip install 'irp-capture[mcp]',mcp.jsonconfig,IRP_PROJECT_ROOTenv override - Available tools table:
irp_capture,irp_why,irp_inherit,irp_check - Zero-install
.cursorrulesfallback for teams not running the MCP server - README sensors table links to guide
GitHub traction
- PyPI
installs/month+ version badges added to README top (shields.io, signal-blue) - GitHub Discussions badge added
- Discussion link + CTA added to Contributing section
- “Show your install” structured Discussion template (
.github/DISCUSSION_TEMPLATE/show-your-install.yml) - VS Code sensor row updated in README status table
PyPI
- v0.5.0 published to https://pypi.org/project/irp-capture/0.5.0/
[book-2026-04-20b] — 2026-04-20
Book site — ch10 GPAI provider blind spot section
Added
- ch10: “The GPAI Blind Spot” — new major section addressing the misconception that AI model service providers (sovereign cloud, API-first, open-source hosters) are outside the Act’s scope
- Explains GPAI model definition (Articles 51–55), obligations already live since Aug 2, 2025
- Covers the four GPAI provider obligations: technical documentation, copyright policy, training data summary, EU database registration
- Addresses the open-source exemption precisely: partial, narrow, collapses on fine-tuning or service wrapping
- Explains the systemic risk threshold (10²⁵ FLOPs) and what additional obligations it triggers
- Mermaid decision tree: “Are you a GPAI provider?”
- Essentials updated with #6 on model service providers
- Synthesised from Claude + GPT collaborative review (GPT-4o via collab.py)
[book-2026-04-20] — 2026-04-20
Book site (irp-book.vercel.app) — Part 4 launch + editorial pass
Added
- Part 4: A Plain-Language Guide to EU AI Act Compliance — 9 new chapters (ch9–ch17) added to the IRP Book
ch9-why-this-law-exists.md— origin of the Act (Dutch SyRI + childcare cases), the governance gap, GDPR vs AI Act distinction, phase-in timelinech10-who-it-applies-to.md— Provider / Deployer / Importer role taxonomy, the modification threshold that creates new Providersch11-the-risk-ladder.md— four tiers, Annex III high-risk categories, self-assessment decision treech12-article-12-logging.md— why system logs ≠ decision records, compliant audit trail anatomy, tamper-evidence, retentionch13-article-13-ifu.md— Instructions for Use as a legal artefact, Provider/Deployer responsibility split, IFU as living documentch14-article-14-oversight.md— genuine vs nominal oversight, override rate diagnostic, high-volume deployment patternsch15-article-27-fria.md— who must conduct a FRIA, minimum content, DPIA vs FRIA distinction, FRIA as early warningch16-article-72-monitoring.md— post-market monitoring as permanent function, distribution shifts, monitoring without consequencech17-the-path-forward.md— compliance stack by org size, three failure modes, IRP Compliance Assessment as starting point
book.config.ts— Part 4 added with 9 chapter entries (numbers 9–17)
Strengthened (editorial pass — GPT review integration)
- Decision accountability spine added across all Part 4 chapters: “The AI Act is not about AI. It is about decisions.”
- IRP positioning upgraded: all “How IRP Compliance helps” sections rewritten from “helpful tool” to “structurally required layer” — showing why existing systems fail and why manual processes break at scale
- Impossibility gap introduced in ch12, ch14, ch16: concrete statements that most organisations currently cannot produce the required evidence
- Reconstruction → capture framing added to ch12: Article 12 assumes logs are enough; IRP shifts from reconstruction after the fact to capture at decision time
- “Integrity-verified” clarified → “append-only record, each entry linked to previous, so gaps and modifications are detectable”
- “Extends, not replaces” Article 12 framing added — IRP extends Article 12 from system logs to decision-level traceability
- “The ledger is the audit trail. The audit trail is the compliance evidence.” restored as the category-defining line in ch12
- Assessment links made live (clickable markdown) in every chapter that references the IRP Compliance Assessment (ch12–ch17)
- Soft phrases removed: “in practice”, “worth making explicit”, “design tension”, “A Note on…”
- Language tightened ~10% across all edited chapters
[0.4.0] — 2026-04-17
Milestone
- MCP server — IRP is now an MCP (Model Context Protocol) tool server. Any MCP-compatible client (Claude Code, Cursor, Windsurf, Understanding Graph, custom agents) can capture decisions, query reasoning, and check for conflicts via protocol.
Added
irp/mcp/server.py— MCP server exposing four tools:irp_capture,irp_why,irp_inherit,irp_checkirp-mcpconsole entry point — run the server viairp-mcp(stdio transport)pyproject.toml— new optional extra:[mcp](installsmcp>=1.0)- Configurable project root via
IRP_PROJECT_ROOTenv var
Configuration
{
"mcpServers": {
"irp": {
"command": "irp-mcp"
}
}
}
[0.3.0] — 2026-04-15
Milestone
- Sovereign stack integrations — IRP now writes decisions natively to Obsidian vaults and MemPalace palaces. No bundling, no licensing issues. IRP writes to the filesystem and ChromaDB directly. The decision layer completes the Karpathy stack: Obsidian (knowledge) + MemPalace (agent memory) + IRP (decisions).
Added
irp/integrations/obsidian.py— writes each captured decision as a.mdfile to your Obsidian vault ({vault}/decisions/{id}.md). No extra dependencies. SetIRP_OBSIDIAN_VAULT=/path/to/vaultin env.irp/integrations/mempalace.py— writes each captured decision into the MemPalacemempalace_drawersChromaDB collection. Agents can semantically query past IRP decisions. SetIRP_MEMPALACE_PATH(defaults to~/.mempalace/palace). Optional dependency:pip install 'irp-capture[mempalace]'.irp/integrations/dispatch.py— post-capture dispatcher. Fires enabled integrations silently — integration errors never break the capture flow.irp captureoutput now includes integration confirmation lines:✓ obsidian: /vault/decisions/IRP-xxx.mdpyproject.toml— new optional extras:[mempalace]and[sovereign](both installchromadb>=0.5)
Book site (irp-book.vercel.app)
- Ch6 — Sovereign Stack Integrations section — new material covering integration dispatch, Obsidian integration, MemPalace integration, and two Mermaid architecture diagrams (REST API endpoints flow, three-destinations-one-capture architecture)
- Ch7 — Epilogue updated — pattern-to-problem matching expanded with sovereign stack reference
- Mermaid diagrams now render across all chapters — removed the broken
remark-mermaid-rawplugin (Astro 5’s content layer stripped its raw HTML output). Shiki handlesmermaidas a native language; client-sidemermaid.jsreplaces code blocks with interactive SVG diagrams. - Changelog page —
CHANGELOG.mdfrom the repo root is now accessible at/changelog/on the book site - Sidebar + header — added Changelog navigation link to both desktop and mobile nav
[0.2.0] — 2026-04-14
Milestone
- Discord sensor v0 deployed in production by Opensverige community — first zero-friction external deployment using only GitHub documentation. Community is actively capturing governance decisions.
Added
irp/discord_sensor/— Discord bot sensor with right-click context menu (“Capture decision”), structured modal (what / why / tags), and direct write to.irp/ledger.jsonl- Sensor-local
.envconfiguration (per sensor pattern) DISCORD-SENSOR-SETUP.md— complete step-by-step setup guide for external communities
Fixed
- Discord sensor thread attribute error (
'Message' object has no attribute 'thread') — usehasattr()safety check - MacPorts Python SSL certificate verification —
SSL_CERT_FILEworkaround via certifi documented in.env.example
Book site (irp-book.vercel.app)
- Dark mode fully working — Tailwind v4 requires
@variant dark (&:where(.dark, .dark *))in CSS;darkMode: 'class'intailwind.config.jsis Tailwind v3 and ignored in v4 - Header background corrected in dark mode
- Bootstrapping chapter updated:
irp bootstrapcommand is live, not future - Slack sensor marked as live (was incorrectly marked “future”)
- Citation dates updated (Amol Avasare interview — April 2026)
[0.1.1] — 2026-04-12
Added
collab.py— multi-engine collaboration tool (Claude + GPT with IRP context injection)- Discord sensor v0 committed (
irp/discord_sensor/) - IRP book website deployed to
irp-book.vercel.app(Astro 5.7 + Tailwind v4 + D3.js architecture diagram)
Fixed
.irp/current.jsonmarkdown code fence wrapping removed.irp/ledger.jsonlempty file initialised correctly
[0.1.0] — 2026-04-10
Added
- REST API v0 (
pip install irp-capture[api]) —/inherit,/why,/checkendpoints - GitHub PR Bot — warn-only conflict detection on PR open
- Figma plugin v0 with auto-populate from resolved comments
[0.0.1] — 2026-03-22
Added
- IRP core v1.5 — single dispatcher (
irp/core/irp.py) - Append-only ledger (
.irp/ledger.jsonl) - Derived state (
.irp/current.json) - Commands:
capture,inherit,why,check,bootstrap - Slack Capture v0 — human-confirmed decisions from threads
- Git commit-msg hook — warn-only conflict surfacing
- Claude SKILL (
irp-capture-v1-5)