diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..8fe2ea3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,37 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Environment (please complete the following information):** + - OS: [e.g. Windows, Linux, macOS] + - Node.js version: [e.g. 18.x, 20.x] + - Version: [e.g. 0.2.0] + +**Additional context** +Add any other context about the problem here. + +**Constitutional Context** +If this bug relates to constitutional governance or invariants, please describe: +- Which constitutional layer is affected (Law, Execution, Oversight, Judicial) +- Which invariant is violated +- Expected vs actual governance behavior diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..1fd4087 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,25 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. + +**Constitutional Impact** +If this feature affects constitutional governance: +- Which constitutional layers will be impacted +- New invariants that need to be enforced +- Changes to oversight or judicial mechanisms diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..37785fd --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,54 @@ +--- +name: Pull Request +about: Contribute changes to the project +title: '' +labels: '' +assignees: '' +--- + +## Description +Please include a summary of the changes and the related issue. Please also include relevant motivation and context. + +Fixes # (issue) + +## Type of change +Please delete options that are not relevant. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Documentation update +- [ ] Performance improvement +- [ ] Code refactoring + +## Constitutional Impact +If this change affects constitutional governance: + +- [ ] No constitutional impact +- [ ] Affects Law layer +- [ ] Affects Execution layer +- [ ] Affects Oversight layer +- [ ] Affects Judicial layer + +If constitutional impact, describe: +- Which invariants are affected +- New invariants introduced (if any) +- Oversight mechanisms updated (if any) + +## Testing +Describe the tests you ran to verify your changes: + +- [ ] Unit tests pass +- [ ] Integration tests pass +- [ ] Manual testing completed +- [ ] Added/updated tests for new functionality + +## Checklist +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] Any dependent changes have been merged and published in downstream modules diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0f42b03 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,51 @@ +name: CI + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main, develop ] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x, 20.x] + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Test + run: npm test + + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint TypeScript + run: npx tsc --noEmit diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..654db88 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,35 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added +- Initial constitutional agentic coding system +- CRK-2 components (Law, Execution, Oversight, Judicial layers) +- Agentic SDK for mission development +- GitHub Actions CI workflow +- CODE_OF_CONDUCT.md +- CONTRIBUTING.md +- SECURITY.md +- Issue and PR templates + +### Changed +- Updated forge platform gate documentation + +## [0.2.0-mission-002] - 2026-07-02 + +### Added +- Mission #002 for founder-independent reproduction +- Nova constitutional platform integration +- Meta Architect governance layer + +## [0.1.0] - Initial Release + +### Added +- Nova: The Constitutional Agentic Coding System +- Core constitutional layers +- Basic agent framework diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..d48e245 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,86 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +conduct@example.com. + +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][homepage]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][mozilla_coc]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][faq]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[mozilla_coc]: https://github.com/mozilla/diversity +[faq]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..aa427fb --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,65 @@ +# Contributing to Nova + +Thank you for your interest in contributing to Nova, the Constitutional Agentic Coding System! + +## Development Setup + +1. **Fork and clone the repository** + ```bash + git clone https://github.com/your-username/agentic-coding-agent.git + cd agentic-coding-agent + ``` + +2. **Install dependencies** + ```bash + npm install + ``` + +3. **Build the project** + ```bash + npm run build + ``` + +4. **Run tests** + ```bash + npm test + ``` + +## Code Style + +- Follow existing TypeScript patterns and naming conventions +- Use the constitutional governance patterns defined in CRK-2 +- Ensure all actions are lawful and produce receipts +- Add tests for new features and governance primitives + +## Submitting Changes + +1. Create a feature branch + ```bash + git checkout -b feature/your-feature-name + ``` + +2. Make your changes and commit them + ```bash + git commit -m "feat: add your feature description" + ``` + +3. Push to your fork and create a pull request + +## Constitutional Governance + +All contributions must respect the constitutional runtime principles: +- **Lawfulness**: Every action must be lawful under CRK-2 +- **Accountability**: Every change must produce verifiable receipts +- **Continuity**: Changes must preserve system continuity + +## Mission #002 Verification + +For changes affecting Mission #002 verification: +1. Update the observer bundle if necessary +2. Verify bundle hash matches expected value +3. Run reproduction protocol + +## Questions? + +Open an issue or reach out to the maintainers. diff --git a/OPS-RUNBOOK.md b/OPS-RUNBOOK.md new file mode 100644 index 0000000..0a96920 --- /dev/null +++ b/OPS-RUNBOOK.md @@ -0,0 +1,127 @@ +# CRK-1 Operational Piping Runbook (Local Governed Inference) + +## Objective + +Establish a fully governed, end-to-end local inference path using CRK-1: + +- All governed calls flow through a single adapter. +- Invariants (K0–K12) are enforced pre/post. +- CE-1 / CRR-1 / CLG-1 are invoked as designed. +- Receipts + lineage are emitted for every run. +- No side-door / raw model calls from the operator path. + +--- + +## Target Artifacts + +| Role | Path | +|------|------| +| Core adapter | `src/runtime/governedPredict.ts` | +| Local model client | `src/model/localClient.ts` | +| Invariants | `src/governance/invariants.ts` | +| Receipts | `src/governance/receipts.ts` | +| Lineage | `src/governance/lineage.ts` | +| CLI entrypoint | `bin/run_local_governed.ts` | +| Config | `config/local-governed.yaml` | +| Smoke test | `tests/local_governed_smoke.test.ts` | + +--- + +## A. Operator Kernel Health + +### A1. Operator identity + +**Requirement:** every governed call carries a stable operator id. + +- Field: `operator_id: string` +- Source: config (`config/local-governed.yaml`) or env (`OPERATOR_ID`). +- Must appear in: `GovernedContext`, receipts, lineage root. + +### A2. Receipts + +**Requirement:** every governed call emits a receipt. + +Minimum fields: + +- `call_id` +- `operator_id` +- `timestamp` +- `invariant_set_version` +- `mode` (predict / observe / correct) +- `invariants_passed: boolean` + +Implementation: `src/governance/receipts.ts` + +--- + +## B. AAIS Local Inference Path + +### B1. Local-only model client + +File: `src/model/localClient.ts` + +```ts +export async function localPredict(input: string, opts: LocalModelOptions): Promise; +``` + +Uses local weights only (no remote calls). `localPredict` must only be called from `governedPredict`. + +### B2. Governed adapter + +File: `src/runtime/governedPredict.ts` + +```ts +export async function governedPredict( + input: string, + context: GovernedContext +): Promise; +``` + +Responsibilities: + +1. Load invariants (K0–K12) and `invariant_set_version`. +2. Run pre-call admissibility checks. +3. Call `localPredict(...)`. +4. Run CE-1 / CRR-1 / CLG-1 post-call hooks. +5. Emit receipt + lineage entry. + +--- + +## C. End-to-End Governed Pipeline + +### C1. CLI — `bin/run_local_governed.ts` + +1. Load `config/local-governed.yaml`. +2. Construct `GovernedContext`. +3. Call `governedPredict(prompt, context)`. +4. Print model output, receipt summary, lineage root id. + +### C2. Config — `config/local-governed.yaml` + +```yaml +model_path: "./models/local-llm" +operator_id: "local-operator-001" +invariant_set_version: "K0-K12-v1" +log_receipts: true +log_lineage: true +``` + +--- + +## D. Tests + +### D1. Smoke test — `tests/local_governed_smoke.test.ts` + +Happy path: `governedPredict` returns output, receipt with `invariants_passed: true`, lineage `root_id`. + +Refusal path (optional v0.2): prompt that triggers invariant failure. + +--- + +## E. Success Criteria + +- [ ] `bin/run_local_governed.ts` runs using local weights only +- [ ] All calls go through `governedPredict` +- [ ] Receipts + lineage are emitted +- [ ] `tests/local_governed_smoke.test.ts` passes +- [ ] No direct/raw model calls from operator-facing code diff --git a/README.md b/README.md index 7025537..35922e4 100644 --- a/README.md +++ b/README.md @@ -1,191 +1,245 @@ -# Agentic Coding Agent — Nova Mission #002 +# Nova: The Constitutional Agentic Coding System **Repository:** [warheart1984-ctrl/agentic-coding-agent](https://github.com/warheart1984-ctrl/agentic-coding-agent) -Founder-independent reproduction bundle for **Nova × CRK-2** constitutional agentic coding. Mission #002 proves that an external observer can build, run, and verify a governed coding agent — with receipts, invariant enforcement, continuity snapshots, multi-agent orchestration, and a live cockpit — using only this repository. - [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +[![Mission](https://img.shields.io/badge/Mission-%23002-blue.svg)](MISSION-002.md) +[![CRK-2](https://img.shields.io/badge/Kernel-CRK--2-8B4513.svg)](docs/CRK-2-SPEC.md) ---- +Nova is a **governed agentic coding system** built on the **Constitutional Runtime Kernel (CRK-2)** — a lawful substrate for autonomous reasoning, execution, and verification. -## What Mission #002 Proves - -| Component | Role | -|-----------|------| -| **CRK-2** | Constitutional Runtime Kernel v2 — dLAP constraints, PIT engine, MACC clustering, hash-chained ledger | -| **Agent SDK** (`agent/`) | `AgentRuntime` — validate → execute → receipt → `ledger.append` for every action | -| **Control Tower** | Multi-agent orchestration, consensus, drift detection, cluster replay | -| **Backend** | Unified service layer + WebSocket events gateway for the cockpit | -| **Cockpit** | React flight deck — plans, receipts, invariants, continuity matrix, drift map | -| **Observer bundle** | Frozen reproduction artifact with independent verification protocol | - -An observer clones this repo, runs `npm install && npm run build`, executes the reproduction protocol, and signs off — no founder guidance required. +Every action is lawful. +Every change is accountable. +Every outcome serves the Constitution. --- -## Repository Layout - -``` -agentic-coding-agent/ -├── README.md # This file -├── MISSION-002.md # Mission brief + reproduction protocol -├── RELEASE.md # Release notes + observer bundle attestation -├── observer-bundle-mission-002.zip -│ -├── agent/ # Nova Agent SDK (AgentRuntime + governance) -│ ├── runtime/agent-runtime.ts # Primary API entry point -│ ├── governance/ # validate, receipt, ledger, invariants -│ ├── core/ # Planner, executor, code generation -│ ├── continuity/ # Snapshots, substrate, replay -│ └── cli.ts # `nova` CLI -│ -├── crk2/ # CRK-2 constitutional kernel -│ ├── kernel/ # dLAP, PIT, panic handler -│ ├── invariants/ # Invariant engine -│ ├── continuity/ # CRP, substrate, replay -│ ├── ledger/ # Ledger v2 -│ └── cluster/ # MACC multi-agent continuity -│ -├── control-tower/ # Orchestration layer -│ ├── orchestrator/ # Cluster manager, consensus, drift detector -│ ├── replay/ # Cluster replay -│ └── drift/ # Drift simulation -│ -├── backend/ # Service adapters -│ ├── crk2-service.ts -│ ├── control-tower-service.ts -│ ├── nova-adapter.ts -│ └── events-gateway.ts -│ -├── cockpit/ # React UI (NovaShell + Flight Deck) -│ -├── observer/ # Independent verification -│ ├── REPRO_PROTOCOL.md -│ ├── CHECKLIST.md -│ └── EXPECTED_OUTPUT.md -│ -├── config/ # Mission invariants (nova.config.ts) -├── docs/ # Specs, operator certification, integrity suites -├── examples/ # Governed project templates -├── tools/fuzz/ # Kernel fuzz harness -├── web/ # Marketing site -│ -└── shell/ # Lawful Nova dev shell (bootstrap, separate concern) - ├── setup/ # bootstrap.sh / bootstrap.ps1 - ├── config/ # .zshrc, profile.ps1, novarc templates - ├── skills/ - └── AGENTS.md +## Overview + +Nova wraps agentic coding in a constitutional loop: plans and executions pass through **dLAP** legality checks, **invariant** enforcement, **continuity** preservation, and an immutable **ledger** before they touch your codebase. + +| Layer | What it does | +|-------|----------------| +| **CRK-2** | Kernel — legality, invariants, continuity, ledger | +| **Nova SDK** (`agent/`) | `AgentRuntime` — plan, validate, execute, receipt | +| **Control Tower** | Multi-agent orchestration, consensus, drift detection | +| **Cockpit** | Operator flight deck — receipts, invariants, continuity matrix | + +Mission **#002** ships a founder-independent reproduction bundle so any observer can rebuild, run, and verify the runtime without privileged access. + +### Constitutional layers + +Nova separates **law**, **execution**, **oversight**, and **verification** so governance cannot be bypassed by accident or convenience. + +| Layer | Path | Role | +|-------|------|------| +| **Law** | `crk2/` | Invariants, constraints, receipts, continuity substrate, ledger — defines what is lawful | +| **Execution** | `agent/` | `AgentRuntime` — plans and executes under CRK-2; applies governance, never defines it | +| **Oversight** | `control-tower/` | Multi-agent orchestration, consensus, drift detection | +| **Judicial** | `observer/` | Founder-independent reproduction and drift-free verification | + +This mirrors the constitutional stack: **Reality → Evidence → Judgment → Stewardship → Continuity**. See [`docs/WHAT-MY-AGENTIC-CODING-AGENT-DOES.md`](docs/WHAT-MY-AGENTIC-CODING-AGENT-DOES.md) for the full layered diagram. + +```mermaid +flowchart TB + subgraph law [LawLayer] + crk2[crk2_dLAP_Invariants_Ledger] + end + subgraph exec [ExecutionLayer] + sdk[agent_AgentRuntime] + end + subgraph oversight [OversightLayer] + tower[control_tower] + cockpit[cockpit_UI] + end + subgraph judicial [JudicialLayer] + observer[observer_Mission002] + end + crk2 --> sdk + sdk --> tower + tower --> cockpit + observer --> crk2 + observer --> sdk ``` -> **Note:** `shell/` is the self-bootstrapping Nova dev environment (macOS/Linux/Windows). It is intentionally separate from Mission #002 runtime code. See [`shell/README.md`](shell/README.md). +> **Roadmap:** `packages/` (crk2, nova-sdk, control-tower, types), `apps/` (cockpit, shell, backend), and `missions/mission-002/` will formalize this layout as the monorepo grows. Today, paths above are at repository root for Mission #002. --- -## Quick Start +## The Constitutional Runtime (CRK-2) -### Prerequisites +CRK-2 is the **lawful substrate** that governs all agentic behavior in this repository. -- Node.js 18+ -- Git +| Component | Role | +|-----------|------| +| **Lawful Action Predicate (dLAP)** | Determines legality of actions before execution | +| **Invariant Engine** | Maintains constitutional invariants at runtime | +| **Constraint Engine** | Enforces boundaries on plans and tool use | +| **Continuity Substrate v2** | Preserves identity, state, and replayable snapshots | +| **Ledger v2** | Hash-chained immutable audit trail | +| **Constitutional Amendments v2 (CA-2)** | Lawful evolution of the rule set | -### Install & Build +CRK-2 is the kernel of **truth**, **continuity**, and **accountability**. -```bash -git clone https://github.com/warheart1984-ctrl/agentic-coding-agent.git -cd agentic-coding-agent -npm install -npm run build -``` +→ Full spec: [`docs/CRK-2-SPEC.md`](docs/CRK-2-SPEC.md) + +--- + +## The Agentic SDK -### 30-Second Agent Example +The **Nova SDK** (`agent/`) exposes constitutional primitives for building governed agents. ```typescript import { AgentRuntime, governance } from "./agent"; import { invariants } from "./config/nova.config"; -// Register constitutional invariants for (const inv of invariants) { await governance.requireInvariant(inv); } const runtime = new AgentRuntime(); -// Governed code generation — validate → receipt → ledger.append +// Governed execution — validate → receipt → ledger.append const result = await runtime.generateCode({ - prompt: "Write a TypeScript function to compute Fibonacci numbers.", + prompt: "Add pagination to the API", }); console.log(result.code); console.log(result.receipts[0].ledgerHash); ``` -### CLI +Agents operate under CRK-2 governance — every plan, execution, and output is **verifiable**. ```bash -npx nova generate "Write a factorial function in TypeScript." npx nova plan "Refactor the data access layer" -npx nova continuity +npx nova generate "Write a factorial function in TypeScript." npx nova receipts +npx nova continuity ``` -### Cockpit (Flight Deck UI) +--- -```bash -npm run cockpit -``` +## Mission #002: Founder-Independent Reproduction -Opens the React cockpit at `http://localhost:5173` with kernel status, receipts, continuity matrix, and drift visualization. +Mission #002 proves that Nova's governed runtime can be **reproduced and verified independently**. ---- +| Goal | Rebuild the system from the observer bundle and confirm drift-free behavior | +|------|-------------------------------------------------------------------------------| + +**Includes** + +| Path | Contents | +|------|----------| +| [`observer/`](observer/) | Verification tools, checklist, expected output | +| [`docs/`](docs/) | Architecture, CRK-2 spec, operator certification | +| [`observer-bundle-mission-002.zip`](observer-bundle-mission-002.zip) | Immutable reference bundle | -## Observer Bundle +**Verification steps** -Mission #002 ships a frozen observer bundle for independent verification: +1. Prepare a clean machine (Node.js 18+, Git) +2. Clone, `npm install`, `npm run build` +3. Rebuild CRK-2 and Nova SDK artifacts +4. Run the agent (`npx nova …` or `AgentRuntime`) +5. Verify receipts, ledger entries, and PIT transitions +6. Sign off via [`observer/CHECKLIST.md`](observer/CHECKLIST.md) + +→ Protocol: [`observer/REPRO_PROTOCOL.md`](observer/REPRO_PROTOCOL.md) · Brief: [`MISSION-002.md`](MISSION-002.md) + +**Bundle attestation** | Property | Value | |----------|-------| -| File | [`observer-bundle-mission-002.zip`](observer-bundle-mission-002.zip) | +| File | `observer-bundle-mission-002.zip` | | SHA-256 | `5FFDF5B95095E9FA2C4331EE71739850C335D3F0FF7EBBC3F0E3C1BAB020BD82` | -| Size | 151,078 bytes | -Verify: +--- + +## Quick Start ```bash -# macOS / Linux -shasum -a 256 observer-bundle-mission-002.zip +git clone https://github.com/warheart1984-ctrl/agentic-coding-agent.git +cd agentic-coding-agent +npm install +npm run build +``` + +**Cockpit (operator UI)** -# Windows PowerShell -Get-FileHash -Algorithm SHA256 observer-bundle-mission-002.zip +```bash +npm run cockpit ``` -Follow [`observer/REPRO_PROTOCOL.md`](observer/REPRO_PROTOCOL.md) and sign off with [`observer/CHECKLIST.md`](observer/CHECKLIST.md). +Opens the React flight deck at `http://localhost:5173`. --- -## SDK API Surface +## Project Structure + +``` +agentic-coding-agent/ +├── agent/ # Nova Agent SDK (AgentRuntime + governance) +├── crk2/ # Constitutional Runtime Kernel v2 +├── control-tower/ # Multi-agent orchestration +├── backend/ # Service layer + WebSocket events gateway +├── cockpit/ # Operator UI (NovaShell + Flight Deck) +├── observer/ # Mission #002 verification protocol +├── config/ # Mission invariants (nova.config.ts) +├── docs/ # Architecture & specs +├── examples/ # Governed project templates +├── tools/fuzz/ # Kernel fuzz harness +└── shell/ # Lawful Nova dev shell (bootstrap; separate concern) +``` -**Primary:** `AgentRuntime` +> `shell/` is the self-bootstrapping Nova dev environment (macOS / Linux / Windows). It is intentionally separate from Mission #002 runtime code. See [`shell/README.md`](shell/README.md). + +--- + +## For Developers + +Build governed agents using the Nova SDK and CRK-2 kernel primitives. + +| Resource | Link | +|----------|------| +| Architecture | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | +| CRK-2 spec | [`docs/CRK-2-SPEC.md`](docs/CRK-2-SPEC.md) | +| Control Tower | [`docs/NOVA-CONTROL-TOWER.md`](docs/NOVA-CONTROL-TOWER.md) | +| SDK entry | [`agent/runtime/agent-runtime.ts`](agent/runtime/agent-runtime.ts) | + +**Primary API** ```typescript const runtime = new AgentRuntime(); -await runtime.validate(action); // Pre-flight invariant check -await runtime.receipt(action, invIds); // Record + hash-chain -runtime.ledger.append(receipt); // Direct ledger access -runtime.ledger.tailHash(); // Chain tip +await runtime.validate(action); +await runtime.receipt(action, invIds); +runtime.ledger.append(receipt); +runtime.ledger.tailHash(); ``` -**Governance namespace:** +--- -```typescript -import { governance } from "./agent"; +## For Verifiers -await governance.validate(action); -await governance.receipt(action, ["no-dangerous-shell"]); -governance.ledger.append(receipt); -``` +Use Mission #002 to independently reproduce and validate the runtime. + +1. Verify bundle hash (see table above) +2. Follow [`observer/REPRO_PROTOCOL.md`](observer/REPRO_PROTOCOL.md) +3. Compare output to [`observer/EXPECTED_OUTPUT.md`](observer/EXPECTED_OUTPUT.md) +4. Complete [`observer/CHECKLIST.md`](observer/CHECKLIST.md) + +Release notes and attestation: [`RELEASE.md`](RELEASE.md) + +--- + +## Architecture overview -Legacy `nova.*` and `runtime.*` namespaces remain exported for backward compatibility but are deprecated. +| Concern | Document | +|---------|----------| +| System layers and data flow | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | +| CRK-2 dual-stack (CRK-1 → CRK-2) | [`docs/CRK-2-SPEC.md`](docs/CRK-2-SPEC.md) · [`docs/CRK-1-TO-CRK-2-MIGRATION-PLAN.md`](docs/CRK-1-TO-CRK-2-MIGRATION-PLAN.md) | +| Figma-ready layer diagram | [`docs/WHAT-MY-AGENTIC-CODING-AGENT-DOES.md`](docs/WHAT-MY-AGENTIC-CODING-AGENT-DOES.md) | +| SDK and governance API | [`docs/api/governance.md`](docs/api/governance.md) · [`docs/api/nova.md`](docs/api/nova.md) | +| Mission #002 reproduction | [`MISSION-002.md`](MISSION-002.md) · [`observer/REPRO_PROTOCOL.md`](observer/REPRO_PROTOCOL.md) | --- @@ -194,14 +248,161 @@ Legacy `nova.*` and `runtime.*` namespaces remain exported for backward compatib | Doc | Purpose | |-----|---------| | [MISSION-002.md](MISSION-002.md) | Mission brief + reproduction protocol | -| [RELEASE.md](RELEASE.md) | Release notes + bundle attestation | -| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | System architecture | -| [docs/CRK-2-SPEC.md](docs/CRK-2-SPEC.md) | CRK-2 constitutional kernel spec | -| [docs/NOVA-CONTROL-TOWER.md](docs/NOVA-CONTROL-TOWER.md) | Control Tower orchestration | -| [observer/REPRO_PROTOCOL.md](observer/REPRO_PROTOCOL.md) | Observer reproduction steps | +| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Constitutional runtime architecture | +| [docs/CRK-2-SPEC.md](docs/CRK-2-SPEC.md) | CRK-2 kernel specification | +| [docs/NOVA-CONTROL-TOWER.md](docs/NOVA-CONTROL-TOWER.md) | Multi-agent orchestration | +| [docs/index.md](docs/index.md) | Documentation hub | + +--- + +## Core Principle + +**Lawfulness. Accountability. Continuity.** + +Nova transforms ideas into infrastructure — one invariant at a time. --- ## License MIT © 2026 + +## Canonical Scorecard Addendum + +### Repository Purpose + +Governed agentic coding system built on CRK-2, with control tower, cockpit, and observer surfaces. + +### Current Maturity + +Prototype + +### Build Status + +Observed: fresh `npm run build` passed in this pass. Hypothesized: the full stack is stable. Unknown: replay verification and broader operator-path hardening are still incomplete. + +### Test Status + +Observed: fresh `npm test` passed in this pass. Hypothesized: the current suites cover the runtime slice. Unknown: replay verification and broader operator-path hardening are still incomplete. + +### Smoke Test Status + +Observed: fresh `npm run cockpit` served HTTP 200 on `http://localhost:5173` in this pass. Hypothesized: cockpit and observer remain aligned. Unknown: replay verification and broader operator-path hardening are still incomplete. + +### Documentation Status + +Observed: architecture, Mission #002, operator, and scorecard docs exist. Hypothesized: the docs are sufficient for a new reviewer. Unknown: whether all links are current across all future revisions. + +### Evidence Status Taxonomy + +- Observed - verified by implementation, testing, or operational evidence +- Hypothesized - expected based on architecture but not yet verified +- Unknown - not yet evaluated + +### Proof Surface + +- Identity: `agentic-coding-agent` governed agentic coding proof surface +- Purpose: expose the evidence layer for CRK-2, control tower, cockpit, and observer claims +- Claim: the repo proves governed agentic coding with a reproduction bundle +- Evidence: observer bundle, receipts, ledger entries, docs, and build/test output where available +- Verification: build, test, cockpit smoke, observer reproduction, and docs review +- Replay: observer bundle, receipts, ledger, and control tower traces +- Operational Status: Prototype; build, test, and cockpit smoke are now verified in this pass +- Truth Boundary: proves the governed runtime and reproduction bundle, not universal production readiness +- Constitutional Profile: authority, evidence, verification, compliance, scope, and limits are documented above +- Blindspots: replay verification, complete packaging, and broader production hardening +- Adversarial Claims: the breadth of docs and bundle attestation can be mistaken for current runtime health +- Battle Scars: some surfaces have been documented before they were uniformly verified +- Color-Team Readiness: Red/Blue/Purple/Green/Yellow/White readiness is partially established +- Commercial Readiness: Builder to Professional transition path with governed agentic tooling +- Next Evidence Required: fresh replay verification and broader operator-path hardening +- Constitutional Proof Level: P1-P2 mix; build/test/cockpit smoke are verified, replay remains pending +- Evidence Ladder: P0 Concept, P1 Implemented, P2 Verified, P3 Operational, P4 Independently Verified, P5 Mission-Critical +- Commercial State Tags: Implemented, Verified, Operational, Commercially Available + +### Constitutional Profile + +- Purpose: governed agentic coding and verification +- Authority: CRK-2 law kernel, observer bundle, and control tower governance +- Evidence Model: receipts, ledger entries, observer bundle, and docs +- Verification Process: build, test, cockpit smoke, observer reproduction, and docs review +- Compliance Requirements: lawful actions, accountable execution, and traceable output +- Truth Boundary: proves the governed runtime and reproduction bundle, not a universal production guarantee +- Replay/Audit Path: observer bundle, receipts, ledger, and control tower traces +- Failure / Degradation Path: unlawful actions are blocked and reproduction claims are held back +- Current Constitutional Maturity: Prototype +- Constitutional Scope: lawful agentic coding, control tower coordination, cockpit visibility, and observer verification +- Constitutional Limits: does not guarantee every possible production deployment or enterprise workflow +- Dependencies: CRK-2 packages, observer bundle, cockpit UI, and control tower orchestration +- Stewardship / Maintainers: Mission #002 maintainers and constitutional runtime stewards + +### Evidence Hierarchy + +- Constitutional Governance: CRK-2, dLAP, invariants, continuity, ledger +- Software Architecture: agent, control tower, cockpit, observer, docs +- Implementation: runtime, UI, orchestration, and verification code +- Verification Evidence: observer bundle, checklist, build output, and receipts +- Operational Evidence: cockpit launch paths and local runtime output +- Adoption Evidence: README docs, mission brief, and observer protocol + +### Maturity Progression + +Scaffold -> Prototype -> Verified Prototype -> Reference Implementation -> Production Candidate -> Production + +### Community and Commercialization + +- Who benefits from this? Developers, startup teams, and governance-conscious operators +- Who should contribute? People improving agent governance, reproducibility, or cockpit usability +- What customer problem does it solve? It makes agentic coding auditable and reproducible +- What free capability does it provide? A governed agentic coding system with observer verification +- What commercial capability could eventually be built on top of it? Productized agentic coding, operator tooling, and advisory services + +### Blindspots + +- Known architectural blindspots: the repo is large and some paths are still evolving +- Known governance blindspots: some claims are stronger than the fresh evidence in this pass +- Known replay/audit blindspots: fresh verification still needs to be repeated across the full surface +- Known operational blindspots: not every launcher path has been refreshed in this pass +- Known adoption blindspots: the repo can overwhelm a new contributor without a scorecard + +### Adversarial Claims + +- Could claim every surface is already verified +- Could exploit the size of the repo to hide stale paths +- Could misinterpret the observer bundle as proof of all current behavior +- Could falsify readiness by skipping the fresh build or smoke path +- Could bypass governance by treating one UI surface as the full system + +### Battle Scars + +- Past failures: Mission #002 and the repo have repeatedly needed explicit verification boundaries +- Past regressions: docs can outrun fresh runtime evidence +- Past outages: not recorded here +- Past misconfigurations: path confusion between runtime and docs surfaces +- Past governance violations: overclaiming readiness without fresh proof +- Past replay failures: replay fidelity remains central +- Past test failures: broad suites need careful selection +- Past architectural mistakes: too many surfaces can blur the canonical path + +### Color-Team Readiness + +| Team | Readiness | +|------|-----------| +| Red Team | Partial: there are many possible attack surfaces because the repo is large | +| Blue Team | Partial: receipts and traces exist, but not every route is fresh | +| Purple Team | Emerging: attack/defense reconciliation is possible through observer checks | +| Green Team | Partial: build and tests exist, but the canonical smoke path still needs proof | +| Yellow Team | Partial: operator clarity is improving, but the repo is still complex | +| White Team | Strongest layer: CRK-2 authority and reproduction framing | + +### Future Validation + +- Open research questions +- Planned verification work +- Planned red-team exercises +- Planned interoperability tests +- Planned performance benchmarks + +### Governing Claim Rule + +No repository should claim more than its evidence supports. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..92d3686 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,44 @@ +# Security Policy + +## Reporting Vulnerabilities + +If you discover a security vulnerability in Nova, please report it responsibly. + +**Do NOT** open a public issue for security vulnerabilities. + +Instead, please send an email to: security@example.com + +Include: +- A description of the vulnerability +- Steps to reproduce the issue +- Any potential impact or exploit scenarios + +## Supported Versions + +| Version | Supported | +|---------|-----------| +| 0.2.0-mission-002 | ✅ | +| < 0.2.0 | ❌ | + +## Security Principles + +Nova is designed with constitutional governance at its core: + +1. **Lawful Execution**: All actions pass through CRK-2 legality checks +2. **Immutable Ledger**: All actions are recorded in an append-only ledger +3. **Invariant Enforcement**: System invariants are checked before and after operations +4. **Continuity Preservation**: System state and identity are preserved across operations + +## Known Security Considerations + +- **Observer Bundle**: The Mission #002 observer bundle has a verified SHA-256 hash. Always verify bundle integrity before use. +- **API Keys**: Never commit API keys or secrets. Use environment variables. +- **Runtime Access**: The governed runtime should be deployed with appropriate access controls. + +## Dependency Security + +We regularly update dependencies to address known vulnerabilities. CI includes automated dependency scanning where available. + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..acaa326 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,72 @@ +# Support + +## How to Get Help + +If you need help with Nova: The Constitutional Agentic Coding System, here are the best ways to get support: + +## Documentation + +- **README.md** - Overview, quick start, and project structure +- **CONTRIBUTING.md** - Development setup and contribution guidelines +- **SECURITY.md** - Security policy and vulnerability reporting +- **CODE_OF_CONDUCT.md** - Community guidelines + +## Getting Help + +### Questions and Discussions + +For questions about: +- How to use Nova +- Constitutional governance principles +- Development setup +- Mission development + +Please open a [GitHub Discussion](https://github.com/your-org/agentic-coding-agent/discussions) with the appropriate category. + +### Bug Reports + +If you encounter a bug, please: +1. Check existing [GitHub Issues](https://github.com/your-org/agentic-coding-agent/issues) +2. If not already reported, open a new issue using the bug report template +3. Include environment details, reproduction steps, and expected behavior + +### Feature Requests + +We welcome feature requests! Please: +1. Check existing [GitHub Issues](https://github.com/your-org/agentic-coding-agent/issues) +2. Open a new issue using the feature request template +3. Describe the problem, proposed solution, and alternatives considered + +## Constitutional Support + +For questions about constitutional governance: +- Review the constitutional layer documentation in README.md +- Check the CRK-2 components documentation +- Open a discussion with the "constitutional" label + +## Security Issues + +**Do NOT** report security vulnerabilities via public issues. + +Please report security vulnerabilities to: security@example.com + +See [SECURITY.md](SECURITY.md) for more details. + +## Community + +Join our community to connect with other users and contributors: +- GitHub Discussions +- GitHub Issues +- Pull Requests + +## Response Time + +We aim to respond to: +- Security vulnerabilities: Within 24 hours +- Bug reports: Within 3-5 business days +- Feature requests: Within 1 week +- General questions: As time permits + +## Contributing + +If you'd like to contribute, please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to get started. diff --git a/bin/run_local_governed.ts b/bin/run_local_governed.ts new file mode 100644 index 0000000..782dce5 --- /dev/null +++ b/bin/run_local_governed.ts @@ -0,0 +1,80 @@ +#!/usr/bin/env node +import { readFileSync } from "fs"; +import { resolve } from "path"; +import { governedPredict } from "../src/runtime/governedPredict"; +import type { GovernedContext } from "../src/runtime/types"; + +interface LocalGovernedConfig { + model_path: string; + operator_id: string; + invariant_set_version: string; + log_receipts: boolean; + log_lineage: boolean; +} + +function loadYamlConfig(filePath: string): LocalGovernedConfig { + const text = readFileSync(filePath, "utf8"); + const raw: Record = {}; + for (const line of text.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const idx = trimmed.indexOf(":"); + if (idx === -1) continue; + const key = trimmed.slice(0, idx).trim(); + let value = trimmed.slice(idx + 1).trim(); + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + value = value.slice(1, -1); + } + raw[key] = value; + } + return { + model_path: raw.model_path ?? "./models/local-llm", + operator_id: process.env.OPERATOR_ID ?? raw.operator_id ?? "local-operator-001", + invariant_set_version: raw.invariant_set_version ?? "K0-K12-v1", + log_receipts: raw.log_receipts !== "false", + log_lineage: raw.log_lineage !== "false", + }; +} + +async function main(): Promise { + const configPath = resolve(process.cwd(), "config/local-governed.yaml"); + const config = loadYamlConfig(configPath); + const prompt = process.argv.slice(2).join(" ") || "Say hello, but do not violate any invariants."; + + const context: GovernedContext = { + operator_id: config.operator_id, + mode: "predict", + invariant_set_version: config.invariant_set_version, + model_path: config.model_path, + }; + + const result = await governedPredict(prompt, context); + + console.log("--- Model output ---"); + console.log(result.output); + console.log("\n--- Receipt ---"); + console.log( + JSON.stringify( + { + call_id: result.receipt.call_id, + operator_id: result.receipt.operator_id, + invariants_passed: result.receipt.invariants_passed, + mode: result.receipt.mode, + invariant_set_version: result.receipt.invariant_set_version, + }, + null, + 2 + ) + ); + console.log("\n--- Lineage ---"); + console.log(`root_id: ${result.lineage.root_id}`); + console.log(`entry_id: ${result.lineage.entry_id}`); +} + +main().catch((err: unknown) => { + console.error(err instanceof Error ? err.message : err); + process.exit(1); +}); diff --git a/cockpit/src/bridge/nova-sdk-browser.ts b/cockpit/src/bridge/nova-sdk-browser.ts new file mode 100644 index 0000000..a1ad7bc --- /dev/null +++ b/cockpit/src/bridge/nova-sdk-browser.ts @@ -0,0 +1,235 @@ +export type AgentAction = { + type: string; + payload?: unknown; +}; + +export interface PlanStep { + id: string; + description: string; + action: AgentAction; +} + +export interface Plan { + id: string; + steps: PlanStep[]; + justification: string; + receipts: GovernanceReceipt[]; +} + +export type InvariantSeverity = "error" | "warn"; + +export interface InvariantState { + action?: AgentAction; + diff?: string; + code?: string; + prompt?: string; + runTests?: () => Promise<{ failures: number }>; +} + +export interface Invariant { + id: string; + description: string; + severity: InvariantSeverity; + check: (state: InvariantState) => boolean | Promise; +} + +export interface InvariantViolation { + id: string; + invariantId: string; + description: string; + message: string; + severity: InvariantSeverity; + action: AgentAction; +} + +export interface GovernanceReceipt { + id: string; + timestamp: number; + action: AgentAction; + invariantsChecked: string[]; + continuityHash: string; + ledgerHash: string; + blocked?: boolean; + blockReason?: string; +} + +export interface KernelStatus { + invariantEngine: "ok" | "warn" | "error"; + ledger: "ok" | "warn" | "error"; + continuity: "ok" | "warn" | "error"; + violationsLastMinute: number; + receiptCount: number; + snapshotCount: number; + activeInvariants: number; +} + +export type KernelHeartbeat = KernelStatus & { + kernelId: string; + ts: number; +}; + +export interface Snapshot { + id: string; + timestamp: number; + stateHash: string; +} + +type Listener = (value: T) => void; + +const invariants: Invariant[] = []; +const receipts: GovernanceReceipt[] = []; +const snapshots: Snapshot[] = []; +const listeners = { + plan: [] as Listener[], + action: [] as Listener[], + receipt: [] as Listener[], + violation: [] as Listener[], + kernelHeartbeat: [] as Listener[], +}; + +const workspaceContext = { + root: "/workspace", + files: ["agent/index.ts", "package.json", "config/nova.config.ts"], +}; + +function browserHash(input: string): string { + let hash = 2166136261; + for (let i = 0; i < input.length; i += 1) { + hash ^= input.charCodeAt(i); + hash = Math.imul(hash, 16777619); + } + return `browser-${(hash >>> 0).toString(16).padStart(8, "0")}`; +} + +function emitReceipt(action: AgentAction, blocked = false): GovernanceReceipt { + const receipt: GovernanceReceipt = { + id: crypto.randomUUID(), + timestamp: Date.now(), + action, + invariantsChecked: invariants.map((invariant) => invariant.id), + continuityHash: browserHash(`continuity:${Date.now()}:${receipts.length}`), + ledgerHash: browserHash(`ledger:${Date.now()}:${receipts.length}`), + blocked, + }; + receipts.unshift(receipt); + listeners.receipt.forEach((listener) => listener(receipt)); + return receipt; +} + +async function kernelStatus(): Promise { + return { + invariantEngine: invariants.length > 0 ? "ok" : "warn", + ledger: "ok", + continuity: "ok", + violationsLastMinute: 0, + receiptCount: receipts.length, + snapshotCount: snapshots.length, + activeInvariants: invariants.length, + }; +} + +async function emitKernelHeartbeat(): Promise { + const heartbeat: KernelHeartbeat = { + ...(await kernelStatus()), + kernelId: "cockpit-browser", + ts: Date.now(), + }; + listeners.kernelHeartbeat.forEach((listener) => listener(heartbeat)); + return heartbeat; +} + +export const events = { + onPlan(listener: Listener): void { + listeners.plan.push(listener); + }, + onAction(listener: Listener): void { + listeners.action.push(listener); + }, + onReceipt(listener: Listener): void { + listeners.receipt.push(listener); + }, + onViolation(listener: Listener): void { + listeners.violation.push(listener); + }, + onKernelHeartbeat(listener: Listener): void { + listeners.kernelHeartbeat.push(listener); + }, +}; + +export const governance = { + async requireInvariant(invariant: Invariant): Promise { + if (!invariants.some((existing) => existing.id === invariant.id)) { + invariants.push(invariant); + } + }, + getInvariants(): Invariant[] { + return [...invariants]; + }, + async kernelStatus(): Promise { + return kernelStatus(); + }, + async emitKernelHeartbeat(): Promise { + return emitKernelHeartbeat(); + }, +}; + +export const continuity = { + async snapshot(): Promise { + const snapshot = { + id: crypto.randomUUID(), + timestamp: Date.now(), + stateHash: browserHash(`${Date.now()}:${receipts.length}:${snapshots.length}`), + }; + snapshots.push(snapshot); + return snapshot; + }, + getSnapshots(): readonly Snapshot[] { + return snapshots; + }, + async replay(id: string): Promise<{ snapshot: Snapshot | null; receipts: GovernanceReceipt[] }> { + return { + snapshot: snapshots.find((snapshot) => snapshot.id === id) ?? null, + receipts: [...receipts], + }; + }, +}; + +export const runtime = { + async getContext(): Promise { + return workspaceContext; + }, +}; + +export const nova = { + async plan(input: { goal: string; context?: unknown }): Promise { + const plan: Plan = { + id: crypto.randomUUID(), + justification: "Browser cockpit plan preview", + receipts: [], + steps: [ + { + id: "step-1", + description: `Analyze goal: ${input.goal}`, + action: { type: "plan", payload: input }, + }, + { + id: "step-2", + description: "Route through governed runtime before execution", + action: { type: "plan", payload: { phase: "governance" } }, + }, + ], + }; + listeners.plan.forEach((listener) => listener(plan)); + return plan; + }, + async generateCode(input: { prompt: string }): Promise<{ code: string; receipts: GovernanceReceipt[] }> { + const action = { type: "generate", payload: input }; + const code = `// Generated cockpit preview\n// ${input.prompt}\n`; + const receipt = emitReceipt(action); + listeners.action.forEach((listener) => listener(action)); + return { code, receipts: [receipt] }; + }, + async applyPatch(input: { diff: string; reason: string }): Promise<{ receipt: GovernanceReceipt }> { + return { receipt: emitReceipt({ type: "apply_patch", payload: input }) }; + }, +}; diff --git a/cockpit/src/panels/DiffInspector.tsx b/cockpit/src/panels/DiffInspector.tsx index 18348e0..b80efd4 100644 --- a/cockpit/src/panels/DiffInspector.tsx +++ b/cockpit/src/panels/DiffInspector.tsx @@ -18,7 +18,7 @@ export function DiffInspector() { if (!diff) { return ( -
No diff selected — generate code or refactor to inspect.
+
No diff selected - generate code or refactor to inspect.
); } @@ -26,14 +26,14 @@ export function DiffInspector() { return (
-
— before —
+
- before -
{diff.text}
Action: {diff.metadata.action}
Invariants: [{diff.metadata.invariantsChecked.join(", ")}]
Continuity Hash: {diff.metadata.continuityHash}
-
Receipt: {diff.metadata.receiptId ?? "—"}
+
Receipt: {diff.metadata.receiptId ?? "-"}