# or, from a local checkout:
pi install /absolute/path/to/CodeCartographer
# or, from a git URL:
-pi install git:github.com/your-user/CodeCartographer
+pi install git:github.com/HuginnIndustries/CodeCartographer
@@ -192,10 +193,45 @@
10 tools for any MCP-compatible host.
+
+
+
+
04 · Forward synthesis
+
Turn confirmed software maps into a traceable build plan.
+
+ The synthesis pipeline runs through Pi or MCP. It combines a product vision with reusable,
+ versioned reimplementation specs, pauses for explicit human selection, preserves conflicts,
+ and produces work packages with a decision-level provenance ledger.
+
+
+
+
+
Start
+
/codecarto-init synthesis
+# Fill .codecarto/inputs/vision.md
+/codecarto-next --auto
+
The first run creates a ranked proposal, completes that phase, and then intentionally stops at the confirmation preflight.
Upload the static bundle and point the domain at it.
This site is plain HTML, CSS, and JavaScript. Drop it into public_html on your
@@ -236,7 +272,7 @@
Upload the static bundle and point the domain at it.
-
05 · Token usage and cost
+
06 · Token usage and cost
What to expect on your first run.
CodeCartographer reads your source code multiple times across phases and produces thousands of
diff --git a/features.html b/features.html
index 2a1e59e..4bd1948 100644
--- a/features.html
+++ b/features.html
@@ -45,10 +45,10 @@
Features
01 · Pipeline variants
-
Six pipelines. Pick the depth that matches the job.
+
Seven pipelines. Map existing systems or plan a new one.
- Every pipeline starts with architecture. From there, you choose how far to go. The default is
- a 7-phase full analysis with a split defect scan. Scale back when you only need orientation.
+ Six analysis variants scale from quick orientation to a deep audit. The forward synthesis
+ pipeline combines a vision with confirmed reusable specs to create a traceable project plan.
@@ -59,6 +59,7 @@
Six pipelines. Pick the depth that matches the job.
+
@@ -86,7 +87,7 @@
Full with deep audit
-
Phases form a DAG. Contracts and protocols can run in parallel after architecture. Porting waits for both. Reimplementation spec is last.
+
Two directions: analysis distills source code into reusable specifications; synthesis combines human-confirmed specifications with a product vision and preserves decision-level provenance in the resulting plan.
diff --git a/index.html b/index.html
index 9d02e4a..84929f9 100644
--- a/index.html
+++ b/index.html
@@ -3,11 +3,11 @@
-CodeCartographer | Structured reverse-engineering for unfamiliar codebases
-
+CodeCartographer | Map existing software. Plan what comes next.
+
-
+
@@ -41,24 +41,26 @@
Understand unfamiliar codebases with a process instead of a lucky prompt.
+
Understand existing software. Plan what comes next.
- CodeCartographer turns "explain this repo" into a staged investigation. Architecture, defect
- scan, behavioral contracts, protocol notes, porting synthesis, and a reimplementation spec.
- Each finding is evidence-tagged so confidence stays visible.
+ CodeCartographer turns “explain this repo” into a staged, evidence-backed investigation—then
+ combines explicitly confirmed specifications with a new product vision to create a traceable
+ implementation plan.
Pi extensionMCP serverDrop-in templateMIT licensed
+ Human-gated synthesis
@@ -107,6 +109,11 @@
Confidence stays visible.
Pick up where you left off.
The filesystem—not the conversation—is durable memory. A fresh LLM session reads the status and findings, then resumes without depending on compacted chat history.
+
+ Synthesis
+
Specs become a project plan.
+
Versioned library entries are proposed against a vision, explicitly confirmed by a human, merged with conflicts intact, and transformed into work packages with a decision-level provenance ledger.
+
@@ -142,6 +149,10 @@
Porting bundle
Reimplementation spec
Language-agnostic build plan with modules, acceptance scenarios, and known unknowns.
+
+
Evidence-backed project plan
+
Confirmed specifications become architecture, work packages, acceptance gates, conflict dispositions, and a decision-level provenance ledger.
+
diff --git a/script.js b/script.js
index 6441f8f..45d10ab 100644
--- a/script.js
+++ b/script.js
@@ -64,6 +64,14 @@ const pipelineData = {
phases: ["Architecture"],
note: "Ideal as a low-cost first pass when you only need to orient yourself.",
},
+ synthesis: {
+ kicker: "4 phases · forward flow",
+ title: "Synthesis",
+ description:
+ "Combines a product vision with explicitly confirmed, versioned library specifications to create an implementation-ready plan without losing provenance.",
+ phases: ["Vision capture", "Candidate proposal + human confirmation", "Specification merge", "Project plan"],
+ note: "Pi/MCP only. Runtime preflight refuses to merge or finalize until a human confirms at least one version-pinned input.",
+ },
};
function initPipelineSwitcher() {
diff --git a/tests/upstream-consistency.test.mjs b/tests/upstream-consistency.test.mjs
index da6a031..3a19fdc 100644
--- a/tests/upstream-consistency.test.mjs
+++ b/tests/upstream-consistency.test.mjs
@@ -31,7 +31,7 @@ test("every public version label matches the authoritative package version", asy
assert.match(footer, new RegExp(`v${pkg.version.replaceAll(".", "\\.")}`), `${name} footer must show v${pkg.version}`);
}
const index = await read(join(SITE_ROOT, "index.html"));
- assert.match(index, new RegExp(`Reverse-engineering toolkit · v${pkg.version.replaceAll(".", "\\.")}`));
+ assert.match(index, new RegExp(`Evidence-backed software cartography · v${pkg.version.replaceAll(".", "\\.")}`));
});
test("MCP documentation names every tool registered by the upstream server", async () => {
@@ -53,6 +53,16 @@ test("pipeline selector mirrors the authoritative pipeline variants", async () =
assert.equal((features.match(/class="pipeline-tab/g) ?? []).length, pipelineFiles.length);
});
+test("synthesis documentation preserves the human confirmation and provenance contracts", async () => {
+ const docs = await read(join(SITE_ROOT, "docs.html"));
+ const features = await read(join(SITE_ROOT, "features.html"));
+ assert.match(docs, /explicit human selection/i);
+ assert.match(docs, /version-pinned/i);
+ assert.match(docs, /provenance ledger/i);
+ assert.match(features, /human-confirmed/i);
+ assert.match(features, /decision-level provenance/i);
+});
+
test("continuity copy treats THREAD_LOG as a closeout index, not the durable summary store", async () => {
const features = await read(join(SITE_ROOT, "features.html"));
const card = features.match(/