Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
143 changes: 143 additions & 0 deletions STATUS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# Project status

> Generated from [project/status.json](project/status.json) on 2026-07-19. Do not edit this file directly.

**Stage:** pre-alpha<br>
**Current milestone:** M2 — GitHub collaboration adapter<br>
**Roadmap:** 15/28 actionable items complete; 0 blocked; 3 deferred.

| Milestone | Status | Complete | Blocked | Deferred |
|---|---:|---:|---:|---:|
| M0 — Protocol kernel | complete | 3/3 | 0 | 0 |
| M1 — Local vertical slice | complete | 6/6 | 0 | 0 |
| M2 — GitHub collaboration adapter | planned | 2/6 | 0 | 0 |
| M3 — Research and assessment profiles | planned | 1/6 | 0 | 1 |
| M4 — Public console and integrations | planned | 3/7 | 0 | 0 |
| M5 — Optional managed service | deferred | 0/0 | 0 | 2 |

## M0 — Protocol kernel

**Status:** complete

Exit criteria:
- The provider-neutral protocol kernel, local read-only MCP surface, fixtures, and public boundary are implemented.

- [x] **M0-PROTOCOL: Canonical schemas, hashes, and event-chain verification** — done
- Evidence: [Foundation commit](https://github.com/brendohxd/Project-Relay/commit/99f8c9c)
- [x] **M0-MCP: Read-only local MCP server** — done
- Evidence: [M0 implementation](https://github.com/brendohxd/Project-Relay/commit/99f8c9c)
- [x] **M0-PUBLIC: Public-boundary scanner and repository checks** — done
- Evidence: [M0 implementation](https://github.com/brendohxd/Project-Relay/commit/99f8c9c)

## M1 — Local vertical slice

**Status:** complete

Exit criteria:
- The complete local remediation loop passes Windows and Linux verification and receives human review.

- [x] **M1-LIFECYCLE: Policy transition engine and remediation fixture** — done
- Evidence: [M1 implementation commit](https://github.com/brendohxd/Project-Relay/commit/d899218)
- [x] **M1-EVIDENCE: Evidence CLI, independent review, reproduction, and human gates** — done
- Evidence: [M1 review fixes](https://github.com/brendohxd/Project-Relay/commit/786648e)
- [x] **M1-LOCAL-VERIFY: Windows local verification with 18 tests** — done
- Evidence: [Draft PR verification record](https://github.com/brendohxd/Project-Relay/pull/1#issuecomment-5014591903)
- [x] **M1-HUMAN-REVIEW: Human review of draft PR #1** — done
- Evidence: [Approved and merged M1 pull request](https://github.com/brendohxd/Project-Relay/pull/1)
- [x] **M1-LINUX-VERIFY: Linux conformance verification** — done
- Evidence: [Passing Windows and Linux M1 matrix](https://github.com/brendohxd/Project-Relay/actions/runs/29680192255)
- [x] **M1-MERGE: Merge the reviewed M1 candidate** — done
- Evidence: [M1 merge commit](https://github.com/brendohxd/Project-Relay/commit/65a7d36ea2d9d29271b970ba883baa9c5a5a2b34)

## M2 — GitHub collaboration adapter

**Status:** planned

Exit criteria:
- An approved Relay proposal can be translated into an idempotent, least-privilege GitHub change with conflict and failure records.

- [x] **M2-CAPABILITIES: Declared actor capabilities** — done
- Evidence: [Capability foundation](https://github.com/brendohxd/Project-Relay/commit/11dc90a)
- [x] **M2-CAUSAL-LINKS: Typed causal provenance links** — done
- Evidence: [Causal-link foundation](https://github.com/brendohxd/Project-Relay/commit/11dc90a)
- [ ] **M2-PROPOSAL: Deterministic network-free GitHub mutation proposal** — planned
- Next: Define proposal input and output contracts before authentication or writes.
- [ ] **M2-CONTRACT: Fake-GitHub contract, conflict, retry, and idempotency tests** — planned
- Next: Test the adapter without live repository mutations.
- [ ] **M2-AUTH: Repository-scoped least-privilege authentication** — planned
- Next: Add dedicated fine-grained credentials only after proposal behavior is reviewed.
- [ ] **M2-WRITE-PILOT: Explicitly approved live write pilot** — planned
- Next: Require fresh user approval and a clean threat-model review.

## M3 — Research and assessment profiles

**Status:** planned

Exit criteria:
- Synthetic high-risk profiles prove blind reproduction, independence, disagreement, supersession, and human authority before real domain use.

- [x] **M3-REPRODUCTION: Independent high-risk reproduction core** — done
- Evidence: [Independent reproduction gates](https://github.com/brendohxd/Project-Relay/commit/786648e)
- [ ] **M3-BLIND-PACKET: Blind reproduction packet contract** — planned
- Next: Design and test against synthetic claims before any ITSM packet.
- [ ] **M3-DISAGREEMENT: Adversarial review and disagreement ledger** — planned
- Next: Preserve incompatible findings without forced consensus.
- [ ] **M3-SUPERSESSION: Remediation and supersession graph** — planned
- Next: Build on typed causal links and immutable prior records.
- [ ] **M3-ITSM-PROFILE: ITSM operational policy profile** — planned
- Next: Implement only after the synthetic research profile passes.
- [ ] **M3-EDUCATION-PROFILE: Synthetic education marking and moderation profile** — planned
- Next: Model rubric assessment, moderation, appeals, and named human authority without real student data.
- [ ] **M3-HIRING-PROFILE: Synthetic hiring-assistance profile** — deferred
- Rationale: Hiring requires dedicated privacy, fairness, discrimination, explainability, and legal threat models; Relay must remain decision support with human authority.

## M4 — Public console and integrations

**Status:** planned

Exit criteria:
- Users can inspect project and task status through credential-free projections and supported client guides.

- [x] **M4-STATUS: Canonical project status and generated GitHub view** — done
- Evidence: [Canonical project status](project/status.json), [Generated GitHub status](STATUS.md)
- [x] **M4-CONSOLE: Visual milestone, blocker, and pilot dashboard** — done
- Evidence: [Read-only console](apps/console/index.html)
- [x] **M4-PAGES-READY: GitHub Pages-ready static bundle** — done
- Evidence: [Pages entry point](docs/index.html)
- [ ] **M4-PAGES-PUBLISH: Publish the visual console on GitHub Pages** — planned
- Next: After merge, configure Pages from main /docs and record the resulting public URL or blocker.
- [ ] **M4-CLIENT-GUIDES: Codex, Claude, Gemini, and compatible MCP guides** — planned
- Next: Document read-only status and task access before any write integrations.
- [ ] **M4-MANUAL-BRIDGE: Manual packet bridge** — planned
- Next: Support clients without GitHub or MCP while preserving the same evidence contract.
- [ ] **M4-NOTIFICATIONS: Notifications and human approval inbox** — planned
- Next: Begin only after authenticated M2 write boundaries are proven.

## M5 — Optional managed service

**Status:** deferred

Exit criteria:
- Security, funding, licensing, product demand, and service responsibilities are explicitly approved before hosted development.

- [ ] **M5-HOSTED: Hosted authentication, secrets, tenancy, and audit service** — deferred
- Rationale: No hosted service is authorised before security, funding, licensing, and demand gates are resolved.
- [ ] **M5-BILLING: Usage controls, billing, support, and service objectives** — deferred
- Rationale: No paid infrastructure or billing work is required for the current local-first roadmap.

# Proving grounds

## ITSM proving ground

**Visibility:** operational-summary-only<br>
**Boundary:** Relay may show workflow readiness and gate progress only. ITSM equations, claims, datasets, results, manuscripts, and scientific acceptance remain in the separate ITSM repository and knowledge base.

- [x] **Relay and ITSM separation rule documented** — done
- Evidence: [ITSM pilot operating model](https://app.notion.com/p/3a236fb4bd1d810fb409f87153bc3e84)
- [x] **Operational owner, review, reproduction, audit, and authority roles documented** — done
- Evidence: [ITSM pilot operating model](https://app.notion.com/p/3a236fb4bd1d810fb409f87153bc3e84)
- [ ] **Synthetic research profile passes before ITSM use** — planned
- Next: Complete the M3 synthetic research-gate fixture.
- [ ] **First real ITSM Relay packet** — blocked
- Blocker (dependency): A real ITSM packet must wait for the synthetic M3 profile and explicit selection of a boundary-safe pilot task.
- Next: Select the pilot only after the synthetic profile passes.
88 changes: 75 additions & 13 deletions apps/console/app.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
const elements = {
projectStage: document.querySelector("#project-stage"),
currentMilestone: document.querySelector("#current-milestone"),
roadmapComplete: document.querySelector("#roadmap-complete"),
roadmapBlocked: document.querySelector("#roadmap-blocked"),
roadmapDeferred: document.querySelector("#roadmap-deferred"),
milestoneRows: document.querySelector("#milestone-rows"),
pilotRows: document.querySelector("#pilot-rows"),
projectUpdated: document.querySelector("#project-updated"),
tasks: document.querySelector("#metric-tasks"),
active: document.querySelector("#metric-active"),
evidence: document.querySelector("#metric-evidence"),
Expand All @@ -17,39 +25,83 @@ function cell(className, text) {
return node;
}

function stateLabel(state) {
return state.replaceAll("_", " ");
}

function renderMilestone(milestone) {
const card = document.createElement("article");
card.className = `milestone-card milestone-${milestone.summary.state}`;
const heading = document.createElement("div");
heading.className = "milestone-heading";
const name = document.createElement("div");
const id = cell("milestone-id", milestone.id);
const title = document.createElement("h3");
title.textContent = milestone.title;
name.append(id, title);
heading.append(name, cell(`badge badge-${milestone.summary.state}`, stateLabel(milestone.summary.state)));
const progress = document.createElement("p");
progress.className = "milestone-progress";
progress.textContent = `${milestone.summary.completed}/${milestone.summary.actionable} actionable items complete`;
const list = document.createElement("ul");
list.className = "roadmap-items";
for (const item of milestone.items) {
const row = document.createElement("li");
row.className = `roadmap-item item-${item.state}`;
row.append(cell("item-marker", item.state === "done" ? "✓" : item.state === "blocked" ? "!" : "·"));
const detail = document.createElement("span");
const itemTitle = document.createElement("strong");
itemTitle.textContent = item.title;
detail.append(itemTitle, cell("item-state", stateLabel(item.state)));
if (item.blocker) detail.append(cell("item-note", item.blocker.summary));
else if (item.next_action && item.state !== "done") detail.append(cell("item-note", item.next_action));
row.append(detail);
list.append(row);
}
card.append(heading, progress, list);
return card;
}

function renderPilot(pilot) {
const card = document.createElement("article");
card.className = "pilot-card";
const heading = document.createElement("div");
heading.className = "pilot-heading";
const title = document.createElement("h3");
title.textContent = pilot.name;
heading.append(title, cell("badge badge-boundary", pilot.visibility));
const boundary = document.createElement("p");
boundary.className = "pilot-boundary";
boundary.textContent = pilot.boundary;
const progress = document.createElement("p");
progress.className = "pilot-progress";
progress.textContent = `${pilot.summary.completed}/${pilot.summary.actionable} operational gates complete · ${pilot.summary.counts.blocked} blocked`;
card.append(heading, boundary, progress);
return card;
}

function renderTask(task) {
const row = document.createElement("article");
row.className = "task-row";
row.setAttribute("role", "row");

const title = document.createElement("span");
title.className = "task-title";
const strong = document.createElement("strong");
strong.textContent = task.title;
const small = document.createElement("small");
small.textContent = `${task.id} · ${task.history.length} transitions · policy ${task.policy_valid ? "valid" : "failed"}`;
title.append(strong, small);

row.append(
title,
cell(
`badge badge-state ${task.policy_valid ? "" : "badge-policy-failed"}`,
task.derived_state.replaceAll("_", " ")
),
cell(`badge badge-state ${task.policy_valid ? "" : "badge-policy-failed"}`, stateLabel(task.derived_state)),
cell(`badge badge-risk-${task.risk}`, task.risk),
cell("", String(task.evidence_count)),
cell("", String(task.review_count))
);

const gates = document.createElement("div");
gates.className = "task-gates";
for (const [name, satisfied] of Object.entries(task.gates)) {
gates.append(
cell(
`gate ${satisfied ? "gate-pass" : "gate-fail"}`,
`${satisfied ? "✓" : "×"} ${name.replaceAll("_", " ")}`
)
);
gates.append(cell(`gate ${satisfied ? "gate-pass" : "gate-fail"}`, `${satisfied ? "✓" : "×"} ${stateLabel(name)}`));
}
row.append(gates);
return row;
Expand All @@ -59,6 +111,16 @@ try {
const response = await fetch("./state/index.json", { cache: "no-store" });
if (!response.ok) throw new Error(`State request failed with ${response.status}`);
const state = await response.json();
const project = state.project;

elements.projectStage.textContent = project.project.stage;
elements.currentMilestone.textContent = project.summary.current_milestone ?? "complete";
elements.roadmapComplete.textContent = `${project.summary.completed}/${project.summary.actionable}`;
elements.roadmapBlocked.textContent = project.summary.counts.blocked;
elements.roadmapDeferred.textContent = project.summary.counts.deferred;
elements.projectUpdated.textContent = `updated · ${project.updated_at}`;
elements.milestoneRows.replaceChildren(...project.milestones.map(renderMilestone));
elements.pilotRows.replaceChildren(...project.pilots.map(renderPilot));

elements.tasks.textContent = state.summary.tasks;
elements.active.textContent = state.summary.active;
Expand Down
31 changes: 29 additions & 2 deletions apps/console/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,42 @@ <h1>One record for work<br />across many minds.</h1>
reproducible evidence, explicit disagreements, and accountable decisions.
</p>
<div class="hero-actions">
<a class="primary-action" href="#workspace">Inspect workspace</a>
<a class="secondary-action" href="../../docs/ARCHITECTURE.md">Read architecture</a>
<a class="primary-action" href="#roadmap">Inspect roadmap</a>
<a class="secondary-action" href="https://github.com/brendohxd/Project-Relay/blob/main/docs/ARCHITECTURE.md">Read architecture</a>
</div>
</section>

<section class="metrics" aria-label="Workspace summary">
<article><span>Tasks</span><strong id="metric-tasks">—</strong></article>
<article><span>Active</span><strong id="metric-active">—</strong></article>
<article><span>Evidence</span><strong id="metric-evidence">—</strong></article>
<section class="project-status" id="roadmap">
<div class="section-heading">
<div>
<div class="eyebrow">Project control plane</div>
<h2>Roadmap and blockers</h2>
</div>
<div class="source-note" id="project-updated">Loading status?</div>
</div>
<div class="project-metrics" aria-label="Project summary">
<article><span>Stage</span><strong id="project-stage">?</strong></article>
<article><span>Current</span><strong id="current-milestone">?</strong></article>
<article><span>Complete</span><strong id="roadmap-complete">?</strong></article>
<article><span>Blocked</span><strong id="roadmap-blocked">?</strong></article>
<article><span>Deferred</span><strong id="roadmap-deferred">?</strong></article>
</div>
<div id="milestone-rows" class="milestone-grid"></div>
</section>

<section class="pilot-section">
<div class="section-heading">
<div>
<div class="eyebrow">Boundary-safe proving grounds</div>
<h2>Pilot readiness</h2>
</div>
</div>
<div id="pilot-rows" class="pilot-grid"></div>
</section>
<article><span>Reviews</span><strong id="metric-reviews">—</strong></article>
<article><span>Decisions</span><strong id="metric-decisions">—</strong></article>
</section>
Expand Down
Loading