Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
0efc5e0
feat: add NodeKit launch factory
HomenShum Jul 19, 2026
f23a3a3
feat: freeze NodeKit application contracts
HomenShum Jul 20, 2026
3b3e501
fix: certify the no-key local proof path
HomenShum Jul 20, 2026
d137bae
fix: discover pack-root skills
HomenShum Jul 20, 2026
0476197
feat: add evidence-bound presentation lane
HomenShum Jul 20, 2026
82d6b9a
feat: project NodeKit skills into generated apps
HomenShum Jul 20, 2026
8c59b68
feat: support measured npm and pnpm setup
HomenShum Jul 20, 2026
b79535f
feat: add one-command local proof
HomenShum Jul 20, 2026
05b4e0e
feat: bind brownfield agents and rollout evidence
HomenShum Jul 20, 2026
f4ac7c6
fix: classify adapter-authored subagents
HomenShum Jul 20, 2026
c2e47f9
feat: complete NodeKit P1 ecosystem seams
HomenShum Jul 20, 2026
ec1d8bf
test: bind ecosystem evidence graph
HomenShum Jul 20, 2026
2ac7bad
docs: bind final P1 rollout receipt
HomenShum Jul 20, 2026
550722e
feat: bind full shipped application identity
HomenShum Jul 20, 2026
54ad30e
feat: import Understand Anything code graphs
HomenShum Jul 20, 2026
3ef5242
feat: bind generated proof receipts to application identity
HomenShum Jul 20, 2026
7279bce
docs: define Understand Anything graph boundary
HomenShum Jul 20, 2026
b4b7500
feat: generate local-only Casca FDE conformance labs
HomenShum Jul 20, 2026
eac9393
feat: add offline agentic RL research preset
HomenShum Jul 20, 2026
ce803ac
docs: add ultra workflow handoff and review gates
HomenShum Jul 20, 2026
f5fbb99
feat: enforce generated lending pack registries
HomenShum Jul 20, 2026
894642f
docs: add adversarial morning review brief
HomenShum Jul 20, 2026
be76cc6
fix: harden application identity and RL proof templates
HomenShum Jul 21, 2026
2c76790
feat: prove portable empty-directory factory
HomenShum Jul 21, 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
14 changes: 14 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# NodeKit coding-agent entrypoint

When a user supplies a business pain point, purpose, use case, hackathon brief, judging rubric, or sponsor tools, read `plugins/nodekit/skills/nodekit-launch/SKILL.md` and follow it as the launch workflow.

The default outcome is not a plan. It is the smallest credible application that is researched, scaffolded, compiled, evaluated, live-provider tested, browser tested, deployable, and accompanied by sanitized proof and a phase-by-phase timeline.

Safety boundaries:

- Prefer official, current sponsor documentation and record sources and versions.
- Never copy a secret into files, YAML, browser code, logs, or receipts. Pass it only to the process that needs it.
- Ask before paid activation, production data migration, destructive writes, public posting, or production deployment unless the user already authorized that exact action.
- Never weaken evaluators or substitute a different implementation in benchmark mode.
- `nodekit create` is empty-directory only. Use `nodekit adopt` for an existing repository.
- Keep the launch clock honest. Reused research or fixtures must be labeled as reused rather than timed as new work.
7 changes: 7 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# NodeKit launch routing

If the user describes an idea, business problem, use case, hackathon, or required sponsor stack, immediately load and follow:

`plugins/nodekit/skills/nodekit-launch/SKILL.md`

Treat the user's prose as the intake brief. Research only the high-impact unknowns, choose one demonstrable vertical slice, and use NodeKit to produce a working application and proof. Preserve the approval and secret-handling rules in `AGENTS.md`.
128 changes: 120 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,67 @@
# Node Platform
# NodeKit / Node Platform

Node Platform is the machine-readable ownership and repository-contract layer for the Node ecosystem. It prevents new contract forks while the existing applications continue to ship independently.
NodeKit is the portable setup and conformance layer for proof-carrying agent applications. It turns an empty directory or an existing repository into a filesystem-authored agent harness with a compiled definition, capability packs, deterministic fixtures, live-provider gates, browser proof, and phase-by-phase receipts.

P0 deliberately does not move working product code between repositories. It records who owns each concept, classifies current adapters and migration sources, standardizes lifecycle commands, and fails CI when a new canonical-signature copy or clear layer violation appears.
Node Platform remains its ownership layer: it records which repository owns each shared contract and fails CI when a new fork or clear layer violation appears.

## From a brief to a running app

Clone this repository, open it in Codex or Claude Code, and describe the pain point, user, outcome, sponsor tools, and deadline. Root `AGENTS.md` and `CLAUDE.md` route that brief into the bundled NodeKit launch skill.

Or use the CLI directly:

```bash
node src/cli.mjs create ../my-agent-app \
--name my-agent-app \
--brief "A persistent research agent that users can steer mid-run" \
--sponsors pi-ai,convex \
--package-manager pnpm \
--local-proof

cd ../my-agent-app
npm run demo
npm run eval
npm run dev
```

The first certified preset is `research-loop`: a small reference runtime with an objective held-out metric, deterministic keep/revert decisions, versioned human intervention, interrupted-run recovery, a strict Pi smoke, and sanitized reproduction receipts. It is a reference adapter to the NodeAgent application contract; it is not presented as the still-unfinished extraction of NodeRoom's deeper production runtime.

`smb-lending-fde` is the first clean-room, domain-specific preset. It generates an independent synthetic forward-deployment lab with a primary restaurant working-capital case and a second medical-practice equipment case. Its agent can only propose a request for an explicitly missing document; a human approval is required before a request is applied, and the starter never makes or simulates a lending decision. Its two-case deterministic conformance harness is not a claim about Casca, a bank, a human operator, an external model, sealed held-out performance, or graph-agent superiority.

```bash
node src/cli.mjs create ../casca-fde-deployment-lab \
--name casca-fde-deployment-lab \
--preset smb-lending-fde \
--brief "Map a synthetic SMB lending file without making a lending decision" \
--local-proof
```

`agentic-rl-research` generates a separate **replay-only** FounderQuest research
lab. It has synthetic train, validation, and held-out task files plus a protected
reward that rejects external/public/financial actions. It is a reproducible
environment and baseline, not an RL-training result or proof of real-world
generalization.

```bash
node src/cli.mjs create ../founderquest-rl \
--name founderquest-rl \
--preset agentic-rl-research \
--brief "Evaluate safe next-action selection in synthetic founder journeys" \
--local-proof
```

`npm run proof` works before credentials exist: it emits a passing `local-ready` receipt after the deterministic demo and evaluation. If live Pi, browser, or deployment receipts are present, every attempted gate must pass; the receipt becomes `release-ready` only when all three are present and green.

Every created or adopted repository receives the same three coding-agent skills
under both `.claude/skills/` and `.codex/skills/`:

- `nodekit-launch` turns the brief into the smallest proof-carrying vertical slice;
- `nodekit-qa` verifies the rendered journey, runtime, durable artifact, and receipt;
- `nodekit-present` turns the same revision-bound evidence into an editable change,
judge, or release presentation through an available NodeSlide transport.

Adoption never overwrites a user-owned skill with the same path; the collision is
preserved in `proof/adoption-receipt.json` for explicit review.

## Commands

Expand All @@ -16,6 +75,38 @@ npm run ecosystem:check
npm run dashboard
```

By default, `nodekit create` vendors the exact compile/check runtime that generated
the project under `vendor/nodekit` and records `file:vendor/nodekit` in
`package.json`. This keeps a fresh clone installable and prevents a later
GitHub branch change from silently changing compile or proof semantics. Pass
`--nodekit-specifier <exact-specifier>` only when an externally versioned
package or immutable Git commit should replace the vendored runtime. The
bundle is deliberately runtime-only; use the source repository or a future
published package to scaffold additional projects.

The two production-oriented presets have an executable empty-directory gate:

```bash
npm run acceptance:factory
```

It creates clean temporary projects for `agentic-rl-research` and
`smb-lending-fde`, installs their dependencies, compiles them, runs tests,
deterministic demos, evaluations, benchmarks, and proof, then writes a
hash-bound summary to `proof/factory-acceptance.json`.

Factory commands (a `--local-proof` run creates an initial local Git commit so
receipts have an immutable candidate to bind to):

```bash
nodekit create <empty-directory> --name <slug> --brief <text> [--preset research-loop|smb-lending-fde|agentic-rl-research]
nodekit adopt <existing-directory> --name <slug> --brief <text>
nodekit compile --repo-root <directory>
nodekit inspect --repo-root <directory>
nodekit graph import --repo-root <directory> --commit <sha>
nodekit graph query <terms> --repo-root <directory>
```

From any repository with `nodekit.yaml`:

```bash
Expand All @@ -25,21 +116,42 @@ npx --yes @homenshum/nodekit check
npx --yes @homenshum/nodekit proof
```

For a source-pinned fallback, replace `@homenshum/nodekit` with `github:HomenShum/node-platform#v0.1.0`. The unscoped `nodekit` npm name belongs to an unrelated project; this project uses the `@homenshum/nodekit` package and exposes the `nodekit` binary.
`@homenshum/nodekit` 0.2.0 is not yet published. Generated projects remain
portable because they carry the exact runtime under `vendor/nodekit`. External
consumers that do not use `nodekit create` should use an immutable Git or
packed-tarball reference until the package is released. The unscoped `nodekit`
npm name belongs to an unrelated project.

## P0 Contract
## Contracts

- [`ownership.yaml`](ownership.yaml) names one owner, current package, target package, status, version, and consumers for every governed concept.
- [`repositories.yaml`](repositories.yaml) records lifecycle, support state, role, successor, and command profile.
- [`architecture.yaml`](architecture.yaml) defines universal commands, allowed reuse modes, and source-layer rules.
- [`schemas/nodekit.schema.json`](schemas/nodekit.schema.json) documents each consumer repository's `nodekit.yaml`.
- [`schemas/nodekit.schema.json`](schemas/nodekit.schema.json) enforces `nodekit.repo/v1` for each consumer repository's `nodekit.yaml`.
- [`schemas/nodeagent.application.v1.schema.json`](schemas/nodeagent.application.v1.schema.json) and [`schemas/nodeagent.pack.v1.schema.json`](schemas/nodeagent.pack.v1.schema.json) enforce the application and capability-pack contracts during compilation.
- [`schemas/nodeagent.event.v1.schema.json`](schemas/nodeagent.event.v1.schema.json) defines the canonical portable event envelope. Applications resolve `nodeagent.event/v1` and `nodeagent.trace/v1` contract references even when an older v1 manifest omits the optional `contracts` block.
- `nodekit compile` discovers authored files, validates pack references, rejects literal secrets, and emits a full application identity in `.nodeagent/`. The identity binds the agent, packs, integrations, backend, UI/app surface, scripts, workflow definitions, evaluations, fixtures, dependency locks, and recognized deployment configuration.
- `nodekit graph import` imports a pinned Understand Anything `knowledge-graph.json` as a namespaced, commit-bound code graph snapshot. `nodekit graph query` performs local graph retrieval; it never turns the code graph into a write authority.
- [`docs/UNDERSTAND_ANYTHING_CODE_GRAPH.md`](docs/UNDERSTAND_ANYTHING_CODE_GRAPH.md) defines the graph authority, privacy, freshness, and NodeGraph/NodeRoom projection boundary.
- `nodekit create` refuses non-empty targets. `nodekit adopt` writes missing files only, preserves host scripts, and emits a collision receipt.
- `nodekit repo check` validates ownership declarations, command aliases, migration origins, signature classification, and source rules.
- `nodekit ecosystem check` checks all active local clones together.
- `nodekit dashboard` generates the cross-repository status table.

## Honest Boundary
## Frozen v1 manifest dialect

The three public v1 manifests use one flat, fail-closed shape:

```yaml
schemaVersion: nodekit.repo/v1 # or nodeagent.application/v1 / nodeagent.pack/v1
```

The earlier planning-only `apiVersion` / `kind` / `metadata` / `spec` envelope is not another accepted v1 dialect. Repository checks and application compilation reject that shape with a migration-oriented error. Existing `nodeagent.application/v1` manifests that predate the optional `contracts` block remain compatible; the compiler resolves their event and trace references to the canonical v1 values.

## Honest boundary

`planned`, `migration-planned`, and `canonical-unpackaged` are intentionally distinct from a released shared package. P0 freezes new duplication; it does not claim the P1 package extraction, environment loader, templates, codemods, or release automation are complete.
`planned`, `migration-planned`, and `canonical-unpackaged` remain intentionally distinct from released shared packages. NodeKit now has one end-to-end reference preset; it does not claim that every runtime adapter, backend, template, codemod, or production deployment target is complete. In particular, NodeRoom still contains the deepest live runtime and its extraction into a published NodeAgent package remains separate work.

See [`docs/DECISIONS.md`](docs/DECISIONS.md) for the ownership split and migration rules.
The coordinated consumer commits, pull requests, hosted checks, and known limits are recorded in [`docs/P0_ROLLOUT.md`](docs/P0_ROLLOUT.md) and [`proof/p0-rollout.json`](proof/p0-rollout.json).
The overnight Casca/Agentic-RL delivery and morning adversarial-review sequence is in [`docs/NODEKIT_ULTRA_V1_HANDOFF.md`](docs/NODEKIT_ULTRA_V1_HANDOFF.md).
77 changes: 77 additions & 0 deletions changes/nodekit-factory-p1/change.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
schemaVersion: nodekit.change-story/v1
id: nodekit-factory-p1
title: Portable agent-app factory and injectable presentation system
changeType: architecture
audience:
- technical-reviewer
- hackathon-builder
- open-source-developer
presentationTier: 3
problem:
previousState: Agent applications, runtime adapters, proof formats, repository conventions, and presentation tooling were implemented independently across repositories.
painOrRisk: A coding agent had to rediscover setup, runtime, evaluation, deployment, and storytelling paths for every project; benchmark and production behavior could diverge.
affectedUsers:
- hackathon participants
- founders using Codex or Claude Code
- maintainers of Node ecosystem applications
decision:
selectedApproach: Freeze flat NodeKit and NodeAgent contracts, generate or additively adopt the harness, keep runtimes replaceable through adapters, make proof portable, and extract NodeSlide into governed packages and transports.
alternatives:
- build another monolithic agent framework
- force every repository into one physical tree immediately
- keep NodeSlide as a standalone-only application
tradeoffs:
- more explicit contracts and migration ledgers
- stacked pull requests must land in dependency order
- production deployment and package publication remain separate approval gates
implementation:
affectedSystems:
- NodeKit / node-platform
- NodeAgent
- NodeSlide
- NodeProof
- NodeTrace
- NodeMem
- NodeRoom
- NodeBenchAI
- NodeVideo
- NodeVoice
- NodeTasks
- BetterPRHandoff
- FeatureClipStudio
importantContracts:
- nodekit.repo/v1
- nodeagent.application/v1
- nodeagent.pack/v1
- nodeagent.event/v1
- nodeagent.trace/v1
- proofloop.receipt/v1
- nodetasks.corpus-receipt/v1
- betterprhandoff.handoff/v1
- featureclip.evidence-manifest/v1
- featureclip.evidence-receipt/v1
- NodeSlide repository and patch contracts
proofRequirements:
- generated empty-directory local-ready application
- additive brownfield adoption with collision receipt
- NodeAgent Pi adapter package proof
- NodeSlide package and second-consumer proof
- NodeSlide CLI/MCP external-agent proof
- NodeTasks corpus integrity proof
- BetterPRHandoff to Change Story compilation proof
- FeatureClipStudio media-to-Evidence-Index projection proof
- canonical proof envelope validation
- cross-repository registry validation
approvalBoundaries:
- merge to default branches
- npm publication
- production deployment
- paid resource activation
- destructive migration
limitations:
- under-30 setup has a fast observed pass but is not repeatably certified
- NodeSlide core, controlled React surfaces, and the NodeRoom consumer proof are merged; the remaining implementation branches are reviews
- no package was published and no production deployment was performed
- NodeSlide editable canvas and PPTX export/reopen certification remain open
- NodeBench native-runtime parity and honest no-key profile remain open
nextMilestone: Forward-test and review the dependency-ordered PR set, mount the NodeSlide React UI and production adapter in NodeRoom, then certify one live hackathon application without changing the benchmark execution path.
104 changes: 104 additions & 0 deletions changes/nodekit-factory-p1/presentation/change-card.application.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
{
"schemaVersion": "nodeslide.file-application/v1",
"snapshot": {
"deck": {
"schemaVersion": "nodeslide.slidelang/v1",
"toolchainVersion": "local-slidelang-adapter/1.1.0",
"id": "deck:nodekit-factory-p1",
"projectId": "project:nodekit",
"title": "NodeKit Factory P1",
"brief": {
"prompt": "Explain the NodeKit factory P1 rollout without upgrading draft evidence into release claims.",
"audience": "technical reviewers and hackathon builders",
"purpose": "Change review",
"successCriteria": [
"The system boundary is understandable.",
"Verified evidence and open release gates remain distinct."
]
},
"theme": {
"id": "nodekit-review",
"name": "NodeKit review",
"mode": "light",
"colors": {
"canvas": "#f8f7f2",
"ink": "#17201b",
"muted": "#617068",
"accent": "#216e4e",
"accentSoft": "#dcefe5",
"insight": "#e9e3cf",
"insightInk": "#443d24",
"trace": "#132b24",
"border": "#c9cec9"
},
"typography": {
"display": "Aptos Display",
"body": "Aptos",
"data": "Aptos Mono"
},
"defaultRadius": 8,
"spacingUnit": 8
},
"slideOrder": ["deck:nodekit-factory-p1:slide:1"],
"version": 2,
"status": "ready",
"createdAt": 1784515200000,
"updatedAt": 1784515200001
},
"slides": [
{
"id": "deck:nodekit-factory-p1:slide:1",
"deckId": "deck:nodekit-factory-p1",
"title": "Problem, contract, proof",
"background": "#f8f7f2",
"elementOrder": ["deck:nodekit-factory-p1:slide:1:title"],
"version": 2
}
],
"elements": [
{
"id": "deck:nodekit-factory-p1:slide:1:title",
"slideId": "deck:nodekit-factory-p1:slide:1",
"name": "Title",
"kind": "text",
"role": "title",
"bbox": { "x": 0.08, "y": 0.12, "width": 0.82, "height": 0.24 },
"rotation": 0,
"content": "P1 factory | Draft contracts, verified local seams",
"style": { "color": "#17201b", "fontSize": 38, "fontWeight": 700 },
"sourceIds": ["source:nodekit-factory-p1:evidence-index"],
"locked": false,
"exportCapabilities": ["web_native", "pptx_editable"],
"version": 2
}
],
"sources": [
{
"id": "source:nodekit-factory-p1:evidence-index",
"deckId": "deck:nodekit-factory-p1",
"title": "NodeKit Factory P1 evidence index",
"sourceType": "document",
"retrievedAt": 1784515200000,
"citation": "../story/evidence-index.json",
"format": "json",
"provider": "nodekit-change-story",
"retention": "until_deleted",
"status": "ready"
}
]
},
"receipt": {
"id": "application:039db09490de59dce3d36d60b922b101",
"proposalId": "proposal:6a06b6872de43772d0db038fda160e5a",
"deckId": "deck:nodekit-factory-p1",
"baseDeckVersion": 1,
"resultingDeckVersion": 2,
"baseSnapshotDigest": "sha256:464cd9d5021cf2c1dcf556822ae58828ab8b3f6f54ec0ca09d293fca31b74031",
"resultingSnapshotDigest": "sha256:b742c7321effa324e0a99f6942ef49596d6eaecfb21666d5d49db7ae7e36abaf",
"patchDigest": "sha256:c1be9d504068abd4360a4eb37d2fafed75c640bb0e4ba661a37163154343695c",
"approval": "exact_proposal_id",
"appliedAt": "2026-07-20T04:41:43.531Z",
"affectedSlideIds": ["deck:nodekit-factory-p1:slide:1"],
"affectedElementIds": ["deck:nodekit-factory-p1:slide:1:title"]
}
}
Loading
Loading