Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
00f2ea5
docs: rewrite README — problem statement, architecture, roadmap links
DeepCodeWork Jul 12, 2026
d026850
feat(core): schema v2 — instance nodes, evidence, confidence, query e…
DeepCodeWork Jul 12, 2026
25e035d
Merge pull request #2 from officialCodeWork/build/phase-0/step-0.1-sc…
officialCodeWork Jul 12, 2026
39814b1
feat(eval): eval harness + first failure-mode fixtures
DeepCodeWork Jul 12, 2026
9a075fc
Merge pull request #3 from officialCodeWork/build/phase-0/step-0.2-ev…
officialCodeWork Jul 12, 2026
4676f5c
feat(core): graph storage, schema versioning, scan provenance
DeepCodeWork Jul 13, 2026
6a0387c
Merge pull request #4 from officialCodeWork/build/phase-0/step-0.3-gr…
officialCodeWork Jul 13, 2026
2fb4292
ci: Gate 0 pipeline — build, typecheck, tests, eval gate, scorecard a…
DeepCodeWork Jul 13, 2026
d59ef32
Merge pull request #5 from officialCodeWork/build/phase-0/step-0.4-ci
officialCodeWork Jul 13, 2026
d17f894
feat(parser-react): endpoint resolution — constant folding, route pat…
DeepCodeWork Jul 13, 2026
13241fc
Merge pull request #7 from officialCodeWork/build/phase-1/step-1.1-en…
officialCodeWork Jul 13, 2026
44e4398
feat(parser-react): API-client wrapper adapter — heuristic detection …
DeepCodeWork Jul 13, 2026
fb780e7
Merge pull request #8 from officialCodeWork/build/phase-1/step-1.2-ap…
officialCodeWork Jul 13, 2026
40b2505
feat(parser-react): follow react-query/SWR queryFn references to thei…
DeepCodeWork Jul 13, 2026
67411c5
Merge pull request #9 from officialCodeWork/build/phase-1/step-1.3-qu…
officialCodeWork Jul 13, 2026
cbf28f9
feat(parser-react): i18n adapter — locale-file resolution for t()/Tra…
DeepCodeWork Jul 13, 2026
4b4fd9e
Merge pull request #10 from officialCodeWork/build/phase-1/step-1.4-i…
officialCodeWork Jul 13, 2026
005a8c9
feat: rendered-text hardening — template wildcards, branch tagging, s…
DeepCodeWork Jul 13, 2026
d13b90d
Merge pull request #11 from officialCodeWork/build/phase-1/step-1.5-t…
officialCodeWork Jul 13, 2026
5bc6e00
feat(parser-react): class components, HOC unwrapping, graceful degrad…
DeepCodeWork Jul 13, 2026
b628c81
Merge pull request #12 from officialCodeWork/build/phase-1/step-1.6-l…
officialCodeWork Jul 13, 2026
d2b2da4
feat(parser-react): instance tree — import-resolved definitions, nest…
DeepCodeWork Jul 13, 2026
ce7a3bc
Merge pull request #13 from officialCodeWork/build/phase-2/step-2.1-i…
officialCodeWork Jul 13, 2026
2582283
feat: prop-flow — per-instance data attribution (C1, the headline case)
DeepCodeWork Jul 13, 2026
cec11f7
Merge pull request #14 from officialCodeWork/build/phase-2/step-2.2-p…
officialCodeWork Jul 13, 2026
0ec94b9
feat(parser-react): handler resolution through props — 4-level chains…
DeepCodeWork Jul 13, 2026
4c01687
Merge pull request #15 from officialCodeWork/build/phase-2/step-2.3-h…
officialCodeWork Jul 13, 2026
55aa975
feat: store adapter — redux/zustand writers ↔ readers (C6)
DeepCodeWork Jul 14, 2026
acbf574
Merge pull request #16 from officialCodeWork/build/phase-2/step-2.4-s…
officialCodeWork Jul 14, 2026
eee44d0
feat(parser-react): portals & toasts (A9) — Gate 2 complete, Phase 2 …
DeepCodeWork Jul 14, 2026
3776287
Merge pull request #17 from officialCodeWork/build/phase-2/step-2.5-p…
officialCodeWork Jul 14, 2026
0f41699
feat: router adapters — React Router + Next.js routes → page componen…
DeepCodeWork Jul 14, 2026
9aab3f6
Merge pull request #18 from officialCodeWork/build/phase-3/step-3.1-r…
officialCodeWork Jul 14, 2026
68d1966
feat: action effects — handler bodies → navigate/fetch/dispatch/setSt…
DeepCodeWork Jul 14, 2026
fea78dd
Merge pull request #19 from officialCodeWork/build/phase-3/step-3.2-a…
officialCodeWork Jul 14, 2026
18b970b
feat: journey query — lazy page→event→effect expansion, cyclic-safe (…
DeepCodeWork Jul 14, 2026
9b0d9e6
Merge pull request #20 from officialCodeWork/build/phase-3/step-3.3-j…
officialCodeWork Jul 14, 2026
fcff3b5
feat(trace): render per-instance attribution for shared components
DeepCodeWork Jul 14, 2026
ffd7d66
Merge remote-tracking branch 'origin/development' into claude/vigorou…
DeepCodeWork Jul 14, 2026
3e443ab
chore(cli): repackage as single publishable `ui-lineage` bundle
DeepCodeWork Jul 14, 2026
a639643
Merge pull request #22 from officialCodeWork/chore/publish-ui-lineage
officialCodeWork Jul 14, 2026
29a344c
Merge pull request #21 from officialCodeWork/claude/vigorous-williams…
officialCodeWork Jul 14, 2026
9a9879e
feat(events): form-library & non-JSX event adapters (B7/B8)
DeepCodeWork Jul 14, 2026
aa848ab
Merge pull request #23 from officialCodeWork/build/phase-3/step-3.4-f…
officialCodeWork Jul 14, 2026
c03d209
feat(conditions): flag/role guards on renders & handles edges (G5) — …
DeepCodeWork Jul 14, 2026
2ee3a54
Merge pull request #24 from officialCodeWork/build/phase-3/step-3.5-f…
officialCodeWork Jul 14, 2026
7e04c70
feat(match): rarity-weighted, fuzzy, combination-aware term scorer (A…
DeepCodeWork Jul 14, 2026
5d5bb58
Merge pull request #25 from officialCodeWork/build/phase-4/step-4.1-t…
officialCodeWork Jul 14, 2026
0e78404
feat(match): structural signatures + structure-aware matching (A1/A3/…
DeepCodeWork Jul 14, 2026
ac665db
Merge pull request #26 from officialCodeWork/build/phase-4/step-4.2-s…
officialCodeWork Jul 14, 2026
4d52712
feat(match): most-specific-subtree resolution with ancestor context (A6)
DeepCodeWork Jul 14, 2026
69fd357
Merge pull request #27 from officialCodeWork/build/phase-4/step-4.3-s…
officialCodeWork Jul 14, 2026
68d26c6
feat(vision): @coderadar/vision screenshot adapter, ephemeral (A10/E3…
DeepCodeWork Jul 14, 2026
bd8b557
Merge pull request #28 from officialCodeWork/build/phase-4/step-4.4-v…
officialCodeWork Jul 14, 2026
368d59a
feat(match): alias glossary & corrections store as authority evidence…
DeepCodeWork Jul 14, 2026
c501824
Merge pull request #29 from officialCodeWork/build/phase-4/step-4.6-a…
officialCodeWork Jul 14, 2026
5b8bb81
feat(match): confidence calibration, honesty metrics, sharp disambigu…
DeepCodeWork Jul 14, 2026
1298cb0
Merge pull request #30 from officialCodeWork/build/phase-4/step-4.5-c…
officialCodeWork Jul 14, 2026
5f5d16b
chore(release): ui-lineage 0.2.0
DeepCodeWork Jul 14, 2026
e8e12d7
Merge pull request #31 from officialCodeWork/chore/release-0.2.0
officialCodeWork Jul 14, 2026
cc97ed0
feat(match): honest structural fallback + A3/A12 fixtures
DeepCodeWork Jul 14, 2026
20babbb
Merge pull request #32 from officialCodeWork/build/phase-4/gap-a3-a12
officialCodeWork Jul 14, 2026
5b1d568
feat(journeys): cross-app hops — exits-app / enters-at edges (B9)
DeepCodeWork Jul 14, 2026
0b97b22
Merge pull request #33 from officialCodeWork/build/phase-3/step-b9-cr…
officialCodeWork Jul 14, 2026
c1dc672
feat(agent-sdk): resolveContext orchestrator + ticket classification …
DeepCodeWork Jul 15, 2026
fa0a369
Merge pull request #34 from officialCodeWork/build/phase-5/step-5.1-r…
officialCodeWork Jul 15, 2026
0540d3a
feat(agent-sdk): context-bundle contract + token budgeter (F1)
DeepCodeWork Jul 15, 2026
c104d41
Merge pull request #35 from officialCodeWork/build/phase-5/step-5.2-c…
officialCodeWork Jul 15, 2026
7c692cc
feat(impact): blast radius — reverse-dependency traversal (5.3)
DeepCodeWork Jul 15, 2026
ad35a1c
Merge pull request #36 from officialCodeWork/build/phase-5/step-5.3-b…
officialCodeWork Jul 15, 2026
6a6af81
feat(coverage): test-coverage mapping — TestNode + covered-by (5.4)
DeepCodeWork Jul 15, 2026
dc8ae22
Merge pull request #37 from officialCodeWork/build/phase-5/step-5.4-t…
officialCodeWork Jul 15, 2026
b4825f0
feat(response): response-schema linking — generic/annotation/OpenAPI …
DeepCodeWork Jul 15, 2026
aea7ed7
Merge pull request #38 from officialCodeWork/build/phase-5/step-5.5-r…
officialCodeWork Jul 15, 2026
2324c59
feat(history): git-history context in the bundle (5.6)
DeepCodeWork Jul 15, 2026
bae972b
Merge pull request #39 from officialCodeWork/build/phase-5/step-5.6-g…
officialCodeWork Jul 15, 2026
9e08430
feat(mcp): MCP server — Gate 5, M5 reached (5.7)
DeepCodeWork Jul 15, 2026
8458c53
Merge pull request #40 from officialCodeWork/build/phase-5/step-5.7-m…
officialCodeWork Jul 15, 2026
50f22e3
chore: CodeSandbox devbox config + .nvmrc
DeepCodeWork Jul 15, 2026
e9e0492
Merge pull request #41 from officialCodeWork/chore/codesandbox-config
officialCodeWork Jul 15, 2026
e4cb692
chore(release): 0.3.0
DeepCodeWork Jul 15, 2026
90dde37
Merge pull request #42 from officialCodeWork/chore/release-0.3.0
officialCodeWork Jul 15, 2026
9be119d
fix(core): punctuation-only rendered text no longer acts as a univers…
DeepCodeWork Jul 15, 2026
8737a1d
Merge pull request #43 from officialCodeWork/build/phase-6f/step-6f.1…
officialCodeWork Jul 15, 2026
d45494a
test(eval): field-pattern regression fixture with xfail-tracked cover…
DeepCodeWork Jul 15, 2026
2f6973a
Merge pull request #44 from officialCodeWork/build/phase-6f/step-6f.2…
officialCodeWork Jul 15, 2026
525ccfc
feat(parser): resolve tsconfig-path aliases and Loadable/lazy wrapper…
DeepCodeWork Jul 15, 2026
21d8150
Merge pull request #45 from officialCodeWork/build/phase-6f/step-6f.3…
officialCodeWork Jul 15, 2026
430c1ad
feat(parser): RTK Query extractor — createApi/injectEndpoints endpoin…
DeepCodeWork Jul 15, 2026
3efa3a1
Merge pull request #46 from officialCodeWork/build/phase-6f/step-6f.4…
officialCodeWork Jul 15, 2026
4dd767f
feat(parser): object-config React Router recognition — identifiers, s…
DeepCodeWork Jul 15, 2026
3667e7f
Merge pull request #47 from officialCodeWork/build/phase-6f/step-6f.5…
officialCodeWork Jul 15, 2026
91486d1
feat(core): identifier-affinity ranking + top-line candidate score (6…
DeepCodeWork Jul 15, 2026
ccfd234
Merge pull request #48 from officialCodeWork/build/phase-6f/step-6f.7…
officialCodeWork Jul 15, 2026
024acc8
feat(cli): galaxy visualizer — self-contained interactive HTML graph …
DeepCodeWork Jul 15, 2026
359317e
Merge pull request #49 from officialCodeWork/build/phase-6f/step-6f.8…
officialCodeWork Jul 15, 2026
28bf1dd
chore(release): 0.4.0
DeepCodeWork Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .codesandbox/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"$schema": "https://codesandbox.io/schemas/tasks.json",
"setupTasks": [
{ "name": "Install dependencies", "command": "corepack enable && pnpm install" },
{ "name": "Build all packages", "command": "pnpm -r build" }
],
"tasks": {
"test": {
"name": "Unit tests",
"command": "pnpm test"
},
"eval": {
"name": "Eval gate",
"command": "pnpm eval"
},
"typecheck": {
"name": "Typecheck",
"command": "pnpm typecheck"
},
"scan-demo": {
"name": "Scan the demo fixture",
"command": "node packages/cli/dist/index.js scan eval/fixtures/c1-shared-datatable/app -o app.graph.json"
}
}
}
57 changes: 57 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# CodeRadar CI — the Gate 0 pipeline.
#
# Every PR must pass: build (strict TS), typecheck, unit tests, and the eval
# gate (eval/thresholds.json). The scorecard is uploaded as an artifact on
# every run, pass or fail, so regressions are inspectable.
#
# Threshold ratchet rule (docs/testing-strategy.md): eval/thresholds.json
# values may be RAISED in any PR; LOWERING one requires a written
# justification in the PR body. Thresholds never loosen silently.

name: CI

on:
push:
branches: [main, development]
pull_request:

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
ci:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4

- uses: pnpm/action-setup@v4 # reads the packageManager field

- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm

- name: Install
run: pnpm install --frozen-lockfile

- name: Build (strict TS)
run: pnpm build

- name: Typecheck
run: pnpm typecheck

- name: Unit tests
run: pnpm test

- name: Eval gate
run: node eval/dist/run.js

- name: Upload scorecard
if: always()
uses: actions/upload-artifact@v4
with:
name: eval-scorecard
path: eval/scorecard.json
if-no-files-found: ignore
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,9 @@ dist
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.vite/

# Eval outputs (scorecard is regenerated every run; history is recorded deliberately)
eval/scorecard.json

# ui-lineage scanned graphs
*.graph.json
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22
154 changes: 114 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,74 +1,148 @@
# CodeRadar
# 📡 CodeRadar

Static analysis toolkit that maps UI components to their data sources (APIs, state, events) — enabling AI agents to trace any screenshot back to the code and data behind it.
> **Screenshot in. Full data lineage out.**
> Static analysis that maps every UI component to the APIs, state, and events behind it — built for AI agents doing real development work.

**The problem:** a Jira ticket has a screenshot of a broken screen. Which component is that? Where does its data come from? Today an engineer greps for the visible text, follows imports by hand, and reads hook bodies to find the API call. CodeRadar does that walk statically, once, and hands the result to an agent as a queryable graph.
**Status:** pre-release · v0.1 proof of concept · [build plan](TRACKER.md)

---

## The problem

A Jira ticket lands with a screenshot: *"the numbers on this table are wrong."*

Before any fix can start, someone has to answer:

1. **Which component is that?** — grep for visible text, hope it isn't behind an i18n key
2. **Where does its data come from?** — follow imports, unwrap hooks, find the API call
3. **What happens if I change it?** — who else renders this component? who else calls this API?

An engineer does this walk by hand, every ticket. An AI dev agent can't do it reliably at all — it sees files, not the *lineage* connecting a pixel on screen to the endpoint that produced it.

## What CodeRadar does

CodeRadar scans a React codebase **once, statically** — no running app required — and produces a queryable **lineage graph**:

```
Screenshot text ──find──▶ Component ──trace──▶ APIs · state · events
find trace impact
Screenshot ──▶ Component instance ──▶ APIs · state · events ──▶ Blast radius
text │
└─ per call site: the same <DataTable> on the Users page
is fed by /api/users; on the Invoices page by /api/invoices
```

It's designed as a **context-provider node for multi-agent development pipelines**: a ticket goes in, and a budgeted context bundle comes out — matched components with evidence, their data sources, the relevant user journeys, blast radius, tests, and git history. Every answer carries confidence and evidence; when the graph isn't sure, it says `ambiguous` and tells you what would disambiguate — it never hands your pipeline a confident guess.

## Quick start

```bash
pnpm install && pnpm build
git clone https://github.com/officialCodeWork/CodeRadar.git
cd CodeRadar && pnpm install && pnpm build
```

# 1. Scan a React codebase into a lineage graph
**1 — Scan a React codebase into a lineage graph**

```bash
node packages/cli/dist/index.js scan ./my-app/src -o graph.json
```

**2 — Find the component behind a screenshot** (use any text visible in the image)

# 2. Find the component behind a screenshot (use text visible in the image)
```bash
node packages/cli/dist/index.js find "Team Members" -g graph.json
# UserList (components/UserList.tsx:4) score=1
```
```
UserList (components/UserList.tsx:4) score=1
matched: team members
```

**3 — Trace everything that feeds it**

# 3. Trace everything that feeds it
```bash
node packages/cli/dist/index.js trace UserList -g graph.json
# UserList (components/UserList.tsx:4)
# data sources:
# [fetch] GET /api/users (hooks/useUsers.ts:14)
# [fetch] DELETE /api/users/${user.id} (components/UserCard.tsx:5)
# state:
# [useState] users (hooks/useUsers.ts:10)
# events:
# onClick → handleDelete (components/UserCard.tsx:12)
# via: useUsers, UserCard
```
```
UserList (components/UserList.tsx:4)
data sources:
[fetch] GET /api/users (hooks/useUsers.ts:14)
[fetch] DELETE /api/users/${user.id} (components/UserCard.tsx:5)
state:
[useState] users (hooks/useUsers.ts:10)
[useState] loading (hooks/useUsers.ts:11)
events:
onClick → handleDelete (components/UserCard.tsx:12)
via: useUsers, UserCard
```

Try it on the bundled example: `node packages/cli/dist/index.js scan examples/demo-app/src`.
Note the transitivity: `UserList` itself contains no fetch — the lineage flows through the `useUsers` hook and the `UserCard` child automatically.

Try it immediately on the bundled example: `node packages/cli/dist/index.js scan examples/demo-app/src`

## How it works

```
┌────────────────────────────────────────────────────────────────┐
│ CodeRadar │
│ │
│ Parsers (language-specific) Graph (language-agnostic) │
│ ┌───────────────┐ │
│ │ parser-react │──┐ ┌─────────────────────────────────┐ │
│ │ (ts-morph) │ │ │ LineageGraph (JSON) │ │
│ └───────────────┘ ├──▶│ │ │
│ ┌───────────────┐ │ │ Component ──renders──▶ Component│ │
│ │ parser-python │ │ │ │ │ │
│ │ (planned) │──┤ │ fetches-from ──▶ DataSource │ │
│ └───────────────┘ │ │ reads-state ──▶ State │ │
│ ┌───────────────┐ │ │ handles ──▶ Event │ │
│ │ parser-go │──┘ └─────────────────────────────────┘ │
│ │ (planned) │ │ │
│ └───────────────┘ ▼ │
│ Query layer: find · trace · impact │
│ (CLI · SDK · MCP server, planned) │
└────────────────────────────────────────────────────────────────┘
```

**Parsers are language-specific; the graph is not.** Every parser emits the same `LineageGraph` JSON, and any agent — Python, Go, TypeScript — consumes it without touching a parser. The planned backend parsers make endpoints a *join key*: `fetches-from: /api/users` in your React repo links to `serves: /api/users` in your FastAPI repo, closing the loop from pixel to handler.

## Packages

| Package | Purpose |
|---------|---------|
| [`@coderadar/core`](packages/core) | The `LineageGraph` schema (plain JSON, language-agnostic) + query helpers (`matchComponentsByText`, `traceLineage`) |
| [`@coderadar/parser-react`](packages/parser-react) | ts-morph–based parser: components, hooks, fetch/axios/react-query/swr calls, useState/useSelector/useContext, JSX event handlers, rendered text |
| [`@coderadar/cli`](packages/cli) | `coderadar scan` / `find` / `trace` |

## What the graph captures
| [`@coderadar/core`](packages/core) | The `LineageGraph` schema + query primitives (`matchComponents`, `traceLineage`, `journeys`, `blastRadius`) |
| [`@coderadar/parser-react`](packages/parser-react) | ts-morph static parsercomponents (incl. `memo`/`forwardRef`), hooks, `fetch`/`axios`/react-query/SWR endpoints, `useState`/`useSelector`/`useContext`, JSX event handlers, rendered-text extraction, test coverage, response types |
| [`@coderadar/agent-sdk`](packages/agent-sdk) | `resolveContext` / `buildBundle` — classifies a ticket and assembles a budgeted context bundle (deterministic, no LLM) |
| [`@coderadar/mcp`](packages/mcp) | MCP server exposing `resolve_context` · `find_component` · `trace_lineage` · `journeys` · `blast_radius` over stdio |
| [`ui-lineage`](packages/cli) | Published CLI + library bundle: `scan` · `find` · `trace` · `journeys` · `impact` · `resolve` · `bundle`, plus the `ui-lineage-mcp` server bin |

- **ComponentNode** — file, export, props, *rendered text* (JSX text + placeholder/label/title/alt/aria-label — the screenshot-matching signal), child components
- **DataSourceNode** — endpoint as written in source (template placeholders preserved), HTTP method, client kind (fetch / axios / react-query / swr)
- **StateNode** — useState / useReducer / useContext / redux useSelector / zustand useStore
- **EventNode** — `on*` JSX handlers and the functions they call
- **Edges** — `renders`, `uses-hook`, `fetches-from`, `reads-state`, `handles`, `triggers`
### What the graph captures

Lineage is transitive: `trace UserList` follows `UserList → useUsers → fetch("/api/users")` and `UserList → UserCard → DELETE` in one query.
- **Components** — file, exports, props, child components, and *rendered text* (JSX text + `placeholder`/`label`/`title`/`alt`/`aria-label`) — the screenshot-matching signal
- **Data sources** — endpoint as written in source (template placeholders preserved), HTTP method, client kind (fetch / axios / react-query / SWR)
- **State** — `useState` / `useReducer` / `useContext` / redux `useSelector` / zustand `useStore`
- **Events** — `on*` handlers and the functions they invoke
- **Edges** — `renders` · `uses-hook` · `fetches-from` · `reads-state` · `handles` · `triggers`

## Architecture
## Where this is going

Parsers are language-specific; the graph is not. Any parser emits the same `LineageGraph` JSON, and any agent (Python, Go, TS) consumes it without touching the parsers.
The v0.1 PoC proves the chain on clean code. Real codebases fight back — endpoints behind wrapper clients, text behind i18n keys, handlers drilled through four layers of props, one shared component fed different APIs per page. We catalogued **53 ways this can fail** before writing the plan, and every phase of the build is gated by evals that measure exactly those failure modes.

Planned parsers: Python (FastAPI/Django routes) and Go (handlers) so backend endpoints join the same graph as the frontend components that call them — closing the loop from pixel to database.
| Document | What's in it |
|----------|--------------|
| **[TRACKER.md](TRACKER.md)** | The build plan: 8 phases, 40 steps, acceptance criteria per step — read this first |
| **[docs/failure-modes.md](docs/failure-modes.md)** | The failure catalog (IDs `A1`–`G8`) every step and eval fixture maps to |
| **[docs/testing-strategy.md](docs/testing-strategy.md)** | Eval harness, golden fixtures, metrics (incl. *poison rate* — confidently-wrong answers), phase gates |

## Roadmap & planning
Milestones at a glance:

CodeRadar is built as a context-provider node for a multi-agent development pipeline:
Jira ticket in → context bundle (matched components, data lineage, journeys, blast radius) out.
- **M2** — per-instance attribution: shared components correctly attributed per call site
- **M3** — n-level user journeys, lazily expanded (cycles welcome)
- **M4** — screenshot/text → ranked, calibrated, *honest* matches
- **M5** — pluggable pipeline node: ticket in → budgeted context bundle out, over MCP
- **M7** — full-stack lineage: pixel → backend handler (Python/Go parsers)

- **[TRACKER.md](TRACKER.md)** — the phased build plan (8 phases, one step = one PR). Read this first.
- **[docs/failure-modes.md](docs/failure-modes.md)** — the catalog of everything that can go wrong (IDs A1–G8); every plan step maps to the failure modes it addresses.
- **[docs/testing-strategy.md](docs/testing-strategy.md)** — eval harness, per-failure-mode fixtures, metrics, and the per-phase gates that tell us whether we're on track.
## Contributing

Current state: v0.1 proof of concept (this repo). Next: Phase 0 — schema v2 (instance nodes), eval harness, CI.
The project follows a strict step discipline: one TRACKER step = one branch = one PR, and a step is done only when its acceptance criteria and eval gate pass. Found a new way for this to fail? That's a contribution — add it to [failure-modes.md](docs/failure-modes.md) with a fixture.

## License

Expand Down
Loading
Loading