Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
4aa40ec
feat(metrics): extract shared deterministic dep-graph sampler
orenlab Jun 18, 2026
f01bd02
feat(report): derive module_map projection in derived report
orenlab Jun 18, 2026
3b60b73
feat(mcp): expose module_map report section in get_report_section
orenlab Jun 18, 2026
cd779be
feat(html): add Module map tab and extract shared dep-graph layout
orenlab Jun 18, 2026
aa8d7dc
docs: document Phase 32 Module map
orenlab Jun 18, 2026
0aba278
fix(html): replace dead Critical card in overloaded Quality stats
orenlab Jun 18, 2026
519a55c
refactor(html): move overloaded-modules profile from Quality into Mod…
orenlab Jun 19, 2026
30c9b65
feat(html): unify module map and dependency graphs on shared block di…
orenlab Jun 19, 2026
329d6cb
feat(html): add shared finding card and use it for suggestion cards
orenlab Jun 20, 2026
aa33f5d
feat(report): add derived review queue projection for guided finding …
orenlab Jun 20, 2026
7ddfb5b
feat(html): add Review hub tab with prioritized finding queue
orenlab Jun 20, 2026
417cace
feat(html): add Overview launchpad linking into the Review hub
orenlab Jun 20, 2026
7a0cfe9
Add analysis phase observability
orenlab Jun 20, 2026
edb8134
refactor(html): render structural findings with the shared finding card
orenlab Jun 21, 2026
37a6cf7
docs: document the Review hub, Overview launchpad, and shared finding…
orenlab Jun 21, 2026
06d04ad
Explain cached analysis phase observability
orenlab Jun 21, 2026
14a5605
feat(report): source the review queue from findings across all families
orenlab Jun 21, 2026
852dc68
feat(html): solid active-tab pill and refined insight banner
orenlab Jun 21, 2026
00ab3f8
Expand benchmark scenarios and summaries
orenlab Jun 21, 2026
40231dd
feat(html): refresh background depth and table styling
orenlab Jun 21, 2026
cf3af76
feat(html): visualize numeric table metrics with magnitude meters
orenlab Jun 21, 2026
9ff8dec
fix(tests): fix extractor test phase ledger stub
orenlab Jun 21, 2026
eefb1a7
feat(html): add metric meters and source-kind badges to more tables
orenlab Jun 21, 2026
5d32b57
feat(html): add card depth/hover-lift and stronger KPI numeric hierarchy
orenlab Jun 21, 2026
236eacb
feat(html): centralize all label badges onto one design-token system
orenlab Jun 21, 2026
8009b1e
feat(html): badge the Clones suppressed table with chips and code chips
orenlab Jun 21, 2026
d4434b3
feat(html): badge the Coverage Join table (CC meter, status chip)
orenlab Jun 21, 2026
009f519
feat(html): fold count badges onto a shared numeric token scale
orenlab Jun 21, 2026
e17f74f
feat(corpus): integrate CodeClone Corpus CI bench
orenlab Jun 21, 2026
1448801
perf(memory): delta experience replace and batch store hydration
orenlab Jun 21, 2026
4034117
feat(docs): refresh CHANGELOG.md
orenlab Jun 21, 2026
b75c15e
feat(html): refine design tokens with hairline borders and softer ele…
orenlab Jun 21, 2026
7e100f5
feat(html): smart button states with focus ring and tactile press
orenlab Jun 21, 2026
6df063d
feat(html): polish form controls with unified hover and focus states
orenlab Jun 21, 2026
a90fa85
fix(html): remove pill shapes, crisp radii, clean light background
orenlab Jun 21, 2026
4b16bd4
fix(html): align dependency hub-chip count to the shared count scale
orenlab Jun 21, 2026
fd2198e
fix(html): restore the faint indigo tint on the light backdrop
orenlab Jun 21, 2026
11ca3e5
feat(html): unify Report Provenance onto the shared badge and count t…
orenlab Jun 21, 2026
9c242e9
fix(html): color the info severity consistently in launchpad and revi…
orenlab Jun 21, 2026
84bc51d
fix(html): meet WCAG AA contrast for severity badges in light theme
orenlab Jun 21, 2026
5961bb2
refactor(html): route the Module Map zoom toggle through the shared s…
orenlab Jun 21, 2026
de9011e
refactor(html): move Review tab filters onto the shared filter system
orenlab Jun 21, 2026
e31e99a
feat(core): extend runtime reachability for FastAPI, Pydantic, and St…
orenlab Jun 21, 2026
cecb09f
feat(html): add inline filter-chip density to the shared filter syste…
orenlab Jun 22, 2026
50f9477
fix(html): add focus rings to links/summaries and dedupe CSS rules
orenlab Jun 22, 2026
3ff6bdf
docs(mcp): audit phase 34 payload compatibility
orenlab Jun 22, 2026
8131216
feat(mcp): add passive context governance envelope
orenlab Jun 22, 2026
54e53e3
feat(mcp): expose receipt identity fields
orenlab Jun 22, 2026
dddc8df
feat(observability): split the platform cockpit into 5 tabs
orenlab Jun 22, 2026
e119f04
feat(observability): sticky tab bar + per-tab guided lead-ins
orenlab Jun 22, 2026
defdc8b
feat(mcp): declare response drill-down reachability
orenlab Jun 22, 2026
5db7c07
fix(observability): de-clutter Operations counters and tighten bars
orenlab Jun 22, 2026
91fa755
feat(mcp): mark finish response governance scope
orenlab Jun 22, 2026
a3a62b3
feat(observability): visualize core micro-phases as ranked share bars
orenlab Jun 22, 2026
a1402ae
feat(observability): restore full span counters in Operations
orenlab Jun 22, 2026
eb80cdc
feat(mcp): replay repeated start requests
orenlab Jun 22, 2026
66dd73d
feat(mcp): expose passive response governance
orenlab Jun 22, 2026
438c1cd
refactor(observability): unify bars + one 'most expensive' highlight
orenlab Jun 22, 2026
308bd8c
feat(observability): staircase the Operations span bars by start offset
orenlab Jun 22, 2026
c8228df
fix(observability): make the phases lead-rail a deterministic border
orenlab Jun 22, 2026
19b9b93
chore(mypy): skip numpy stubs so the hook stops choking on .venv
orenlab Jun 22, 2026
6ff0454
fix(docs): resync drifted plugin skill copies to canonical
orenlab Jun 22, 2026
2d31de2
feat(memory): accept the JetBrains plugin as an IDE governance client
orenlab Jun 22, 2026
969c998
chore: ignore the local jetbrains-codeclone extension scaffold
orenlab Jun 22, 2026
f2b029f
chore: collapse multi-line statements to one line per formatter
orenlab Jun 22, 2026
6cde610
chore(deps): refresh uv.lock
orenlab Jun 22, 2026
b52c001
feat(mcp): expose start response governance
orenlab Jun 22, 2026
afd34e7
feat(mcp): align observability context estimates
orenlab Jun 22, 2026
267bc1f
feat(observability): label context pressure as context units
orenlab Jun 22, 2026
34d7631
perf(memory): stop sourcing every semantic lane twice per rebuild
orenlab Jun 22, 2026
d46f16e
fix(memory): never delete a semantic lane when a source read fails
orenlab Jun 23, 2026
d977aca
feat(memory): incremental semantic sourcing skips unchanged source rows
orenlab Jun 23, 2026
ec7c7bd
refactor: replace duplicate coercion helpers with codeclone.utils.coerce
orenlab Jun 23, 2026
0fbb2be
feat(mcp): durable post-clear review receipt retrieval (get_review_re…
orenlab Jun 23, 2026
81b740a
docs(plugins): refresh engineering-memory and triage/blast-radius skills
orenlab Jun 23, 2026
2d04cfe
feat(mcp): deduplicate finish review receipt
orenlab Jun 24, 2026
77cc282
feat(skills): add architecture-triage skill with defect-model contract
orenlab Jun 24, 2026
9d27cf4
chore(gitignore): added issue folder
orenlab Jun 24, 2026
a5a39a5
feat(mcp): durable patch-trail retrieval (get_patch_trail) + extract …
orenlab Jun 24, 2026
5239216
feat(core): add durable blast artifact retrieval
orenlab Jun 25, 2026
86f1a44
feat(core): add memory retrieval continuation pages
orenlab Jun 25, 2026
dec6d97
feat(core): add implementation context facet pages
orenlab Jun 25, 2026
aaf8c9d
feat(core): update context governance continuation capability
orenlab Jun 25, 2026
ef22727
feat(docs): document idempotent start replay in skills
orenlab Jun 25, 2026
fca707c
feat(docs) document durable finish receipt retrieval
orenlab Jun 25, 2026
ab8fa13
feat(tests): assert idempotent start replay keeps TTL
orenlab Jun 25, 2026
ac9afd1
feat(core): enforce compact memory response budget
orenlab Jun 25, 2026
653adf7
feat(core) enforce implementation context response budget
orenlab Jun 25, 2026
a089a08
feat(mcp): restrict allow_external_artifacts to typed artifacts under…
orenlab Jun 25, 2026
fb32d28
fix(observability): count logical SQL statements, not executemany row…
orenlab Jun 26, 2026
877761f
feat(test): cover MCP/memory fail-closed paths and dedupe test setup
orenlab Jun 26, 2026
af398da
fix(mcp): stabilize start replay registry digest against advisory drift
orenlab Jun 26, 2026
062a685
chore(deps): refresh project deps
orenlab Jun 26, 2026
fa30b27
feat(mcp): enforce finish response budget
orenlab Jun 26, 2026
dc4dc07
feat(mcp): enforce start response governance
orenlab Jun 26, 2026
9611d31
chore(docs): refresh README.md
orenlab Jun 27, 2026
7bc5537
test(mcp): lock context governance truth table
orenlab Jun 27, 2026
503ca4c
docs(mcp): sync context governance guidance
orenlab Jun 27, 2026
31c37b7
docs(mcp): sync help topics with context governance
orenlab Jun 27, 2026
272421d
docs: refresh README positioning
orenlab Jun 27, 2026
214565a
chore(docs): refresh README.md
orenlab Jun 27, 2026
465e51c
fix(analytics): pin numba/llvmlite for 3.10+; bump Zensical to 0.0.46
orenlab Jun 27, 2026
7420309
fix(mcp): paginate get_report_section inventory and findings
orenlab Jun 27, 2026
b62929a
fix(mcp): drop zero-lane omitted_evidence from slim start blast
orenlab Jun 27, 2026
959ee34
chore(docs): refresh README.md
orenlab Jun 27, 2026
4c458a7
fix(memory): compact continuation cursors with request_digest v2
orenlab Jun 27, 2026
c7d46b6
fix(mcp): skip negated keywords in claim guard overclaim checks
orenlab Jun 27, 2026
2af4330
fix(memory): honor trajectory_get compact and sync patch trail digest
orenlab Jun 27, 2026
0f49840
fix(mcp): mark clones_only summary metrics projections unavailable
orenlab Jun 27, 2026
b58389a
fix(mcp): clarify blast include, memory coverage scope, observability…
orenlab Jun 27, 2026
93c75c2
feat(mcp): tighten bounded report surfaces
orenlab Jun 27, 2026
a868e0e
fix(claude-desktop): sync manifest tools with MCP contract snapshot
orenlab Jun 27, 2026
57fb4b0
test: close coverage gaps in MCP workflow and memory retrieval paths
orenlab Jun 27, 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
67 changes: 61 additions & 6 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ jobs:
env:
RUNS: ${{ matrix.runs }}
WARMUPS: ${{ matrix.warmups }}
SCENARIO_PROFILE: ${{ matrix.profile }}
STARTUP_RUNS: "3"
CPUS: ${{ matrix.cpus }}
MEMORY: ${{ matrix.memory }}
run: |
Expand All @@ -125,6 +127,8 @@ jobs:
--target . \
--runs "${{ matrix.runs }}" \
--warmups "${{ matrix.warmups }}" \
--scenario-profile "${{ matrix.profile }}" \
--startup-runs 3 \
--tmp-dir "/tmp/codeclone-bench-${{ matrix.label }}" \
--output "$BENCH_JSON"

Expand All @@ -143,21 +147,39 @@ jobs:
raise SystemExit(1)

payload = json.loads(report_path.read_text(encoding="utf-8"))
startup_probes = payload.get("startup_probes", [])
scenarios = payload.get("scenarios", [])
comparisons = payload.get("comparisons", {})

print("CodeClone benchmark summary")
print(f"label={os.environ.get('RUNNER_OS','unknown').lower()} / {os.environ.get('GITHUB_JOB','benchmark')}")
if startup_probes:
print("startup probes:")
for probe in startup_probes:
name = str(probe.get("name", "unknown"))
stats = probe.get("stats_seconds", {})
cpu_stats = probe.get("child_cpu_stats_seconds", {})
print(
f"- {name:22s} median={float(stats.get('median', 0.0)):.4f}s "
f"first={float(probe.get('first_seconds', 0.0)):.4f}s "
f"cpu={float(cpu_stats.get('median', 0.0)):.4f}s"
)
for scenario in scenarios:
name = str(scenario.get("name", "unknown"))
stats = scenario.get("stats_seconds", {})
cpu_stats = scenario.get("child_cpu_stats_seconds", {})
inventory = scenario.get("inventory_sample", {})
median = float(stats.get("median", 0.0))
p95 = float(stats.get("p95", 0.0))
stdev = float(stats.get("stdev", 0.0))
digest = str(scenario.get("digest", ""))
print(
f"- {name:16s} median={median:.4f}s "
f"p95={p95:.4f}s stdev={stdev:.4f}s digest={digest}"
f"p95={p95:.4f}s stdev={stdev:.4f}s "
f"cpu={float(cpu_stats.get('median', 0.0)):.4f}s "
f"files={inventory.get('analyzed', 0)}/{inventory.get('cached', 0)} "
f"artifacts={float(scenario.get('artifact_total_kib_sample', 0.0)):.1f}KiB "
f"exit={scenario.get('exit_code_counts', {})} digest={digest}"
)

if comparisons:
Expand All @@ -174,24 +196,57 @@ jobs:
"",
f"- Tool: `{payload['tool']['name']} {payload['tool']['version']}`",
f"- Target: `{payload['config']['target']}`",
f"- Scenario profile: `{payload['config'].get('scenario_profile', 'smoke')}`",
f"- Runs: `{payload['config']['runs']}`",
f"- Warmups: `{payload['config']['warmups']}`",
f"- Startup runs: `{payload['config'].get('startup_runs', 0)}`",
f"- Generated: `{payload['generated_at_utc']}`",
"",
"### Scenarios",
"",
"| Scenario | Median (s) | p95 (s) | Stdev (s) | Deterministic | Digest |",
"|---|---:|---:|---:|:---:|---|",
]

if startup_probes:
lines.extend(
[
"### Startup / Import Probes",
"",
"| Probe | Median (s) | First (s) | CPU Median (s) |",
"|---|---:|---:|---:|",
]
)
for probe in startup_probes:
stats = probe.get("stats_seconds", {})
cpu_stats = probe.get("child_cpu_stats_seconds", {})
lines.append(
"| "
f"{probe.get('name', '')} | "
f"{float(stats.get('median', 0.0)):.4f} | "
f"{float(probe.get('first_seconds', 0.0)):.4f} | "
f"{float(cpu_stats.get('median', 0.0)):.4f} |"
)
lines.append("")

lines.extend(
[
"### Scenarios",
"",
"| Scenario | Median (s) | p95 (s) | CPU Median (s) | Files A/C | Artifacts KiB | Exit | Deterministic | Digest |",
"|---|---:|---:|---:|---:|---:|---|:---:|---|",
]
)

for scenario in scenarios:
stats = scenario.get("stats_seconds", {})
cpu_stats = scenario.get("child_cpu_stats_seconds", {})
inventory = scenario.get("inventory_sample", {})
lines.append(
"| "
f"{scenario.get('name', '')} | "
f"{float(stats.get('median', 0.0)):.4f} | "
f"{float(stats.get('p95', 0.0)):.4f} | "
f"{float(stats.get('stdev', 0.0)):.4f} | "
f"{float(cpu_stats.get('median', 0.0)):.4f} | "
f"{inventory.get('analyzed', 0)}/{inventory.get('cached', 0)} | "
f"{float(scenario.get('artifact_total_kib_sample', 0.0)):.1f} | "
f"{scenario.get('exit_code_counts', {})} | "
f"{'yes' if bool(scenario.get('deterministic')) else 'no'} | "
f"{scenario.get('digest', '')} |"
)
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
uses: actions/configure-pages@v5

- name: Build docs site
run: uv run --with zensical==0.0.43 zensical build --clean --strict
run: uv run --with zensical==0.0.46 zensical build --clean --strict

- name: Generate sample report artifacts
run: uv run python scripts/build_docs_example_report.py --output-dir site/examples/report/live
Expand Down
92 changes: 92 additions & 0 deletions .github/workflows/validation-corpus.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: validation-corpus
run-name: validation corpus • ${{ github.event_name }} • ${{ github.ref_name }}

on:
push:
branches: [ "**" ]
pull_request:
workflow_dispatch:
inputs:
tier:
description: Corpus tier
required: true
default: all
type: choice
options:
- smoke
- gates
- full
- all
corpus-ref:
description: codeclone-validation-corpus ref
required: true
default: main

permissions:
contents: read

concurrency:
group: validation-corpus-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
validation-corpus:
name: corpus
runs-on: ubuntu-latest
timeout-minutes: 20

steps:
- name: Checkout CodeClone
uses: actions/checkout@v6.0.2

- name: Checkout validation corpus
uses: actions/checkout@v6.0.2
with:
repository: orenlab/codeclone-validation-corpus
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.corpus-ref || 'main' }}
path: validation-corpus

- name: Set up Python
uses: actions/setup-python@v6.2.0
with:
python-version: "3.14"
allow-prereleases: true

- name: Set up uv
uses: astral-sh/setup-uv@v5
with:
enable-cache: true

- name: Install CodeClone from this checkout
run: uv sync --all-extras

- name: Install validation corpus dependencies
run: uv sync --project validation-corpus

- name: Resolve corpus tier
shell: bash
run: |
tier="all"
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
tier="${{ inputs.tier }}"
fi
echo "CORPUS_TIER=$tier" >> "$GITHUB_ENV"

- name: Run validation corpus
run: |
uv run --project validation-corpus python -m corpus_tools.cli \
--tier "$CORPUS_TIER" \
--codeclone-command "$GITHUB_WORKSPACE/.venv/bin/python -m codeclone.main" \
--work-root "$RUNNER_TEMP/codeclone-validation-corpus-work"

- name: Write summary
if: always()
shell: bash
run: |
{
echo "## CodeClone validation corpus"
echo
echo "- Tier: \`${CORPUS_TIER:-unknown}\`"
echo "- Corpus: \`orenlab/codeclone-validation-corpus\`"
echo "- CodeClone source: current checkout"
} >> "$GITHUB_STEP_SUMMARY"
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,5 @@ extensions/vscode-codeclone/node_modules
/coverage.json
/benchmarks/memory_semantic_eval.md
/scripts/commit_memory_phases.sh
/extensions/jetbrains-codeclone/
/issues/
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ If you touched baseline/cache/report contracts or CLI/MCP audit surfaces, also e
If you touched `docs/`, `zensical.toml`, docs publishing workflow, or sample-report generation, also run:

```bash
uv run --with zensical==0.0.43 zensical build --clean --strict
uv run --with zensical==0.0.46 zensical build --clean --strict
```

If you touched the MCP surface, also run:
Expand Down
Loading
Loading