Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
054a74c
Build domain-blank figured-out NodeKit foundation
HomenShum Jul 21, 2026
6304bf3
feat: add fail-closed NodeKit EaseProof
HomenShum Jul 21, 2026
8f166d4
ci: run EaseProof on draft pull requests
HomenShum Jul 21, 2026
cd92d10
test: expand NodeKit ease certification coverage
HomenShum Jul 21, 2026
f4e9e40
fix: certify complete browser state coverage
HomenShum Jul 21, 2026
4bdc60d
fix: make visual proof state-honest and accessible
HomenShum Jul 21, 2026
aa70862
proof: bind complete NodeKit browser certification
HomenShum Jul 21, 2026
c9dd9f2
proof: independently verify expanded EaseProof
HomenShum Jul 21, 2026
d4f3dff
docs: lock NodeKit submission readiness gates
HomenShum Jul 21, 2026
1036650
test: record replayable NodeKit browser proof
HomenShum Jul 21, 2026
b196cb1
proof: capture replayable NodeKit browser journey
HomenShum Jul 21, 2026
9566dba
test: fail closed on missing ease participants and timing runs
HomenShum Jul 21, 2026
8d4f7e6
fix: make the blank figured-out factory canonical
HomenShum Jul 21, 2026
1e7acd0
docs: consolidate NodeKit master plan
HomenShum Jul 22, 2026
149bcdc
feat: add NodeKit model intelligence foundation
HomenShum Jul 22, 2026
2ca53f8
feat: close NodeKit proof and harness gaps
HomenShum Jul 22, 2026
9521076
feat: add fresh-agent evidence verdict
HomenShum Jul 22, 2026
3671ab7
fix: deduplicate identical timing receipts
HomenShum Jul 22, 2026
ebb43b6
fix: pin fresh-agent source identity at trial start
HomenShum Jul 22, 2026
8e72750
fix: keep first action visible on arrival
HomenShum Jul 22, 2026
0cc282c
fix: distinguish domain blockers from write failures
HomenShum Jul 22, 2026
e398398
fix: bind browser proof to fresh server
HomenShum Jul 22, 2026
c701819
feat: add governed knowledge evolution plane
HomenShum Jul 22, 2026
678f2e0
feat: add frontend specialist and evolution ledger
HomenShum Jul 22, 2026
5b9c4d7
docs: record frontend topology evolution
HomenShum Jul 22, 2026
1df1553
feat: harden exact-candidate certification
HomenShum Jul 22, 2026
1ad34f3
docs: record exact-candidate certification invariant
HomenShum Jul 22, 2026
f3471c7
feat: enforce idempotent caseflow retries
HomenShum Jul 22, 2026
1c74b9e
docs: record caseflow retry invariant
HomenShum Jul 22, 2026
5adf869
proof: certify frozen package installation
HomenShum Jul 22, 2026
d0d9bb5
fix: accept named submission gate options
HomenShum Jul 22, 2026
03689f7
docs: record submission CLI usability invariant
HomenShum Jul 22, 2026
5cc6157
feat: add executable Postgres Caseflow adapter
HomenShum Jul 22, 2026
eca77c0
proof: verify Postgres Caseflow portability
HomenShum Jul 22, 2026
7a9ec77
proof: certify typed postgres package install
HomenShum Jul 22, 2026
4407b70
proof: certify exact packed browser experience
HomenShum Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
47 changes: 47 additions & 0 deletions .github/workflows/ease-proof.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: NodeKit EaseProof

on:
pull_request:
workflow_dispatch:
inputs:
cache_class:
description: Evidence label; use cold only on a genuinely clean runner.
required: true
default: cold
type: choice
options: [cold, warm]

jobs:
developer-ease:
name: ${{ matrix.os }} / ${{ matrix.package_manager }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
package_manager: [npm, pnpm]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: pnpm/action-setup@v4
if: matrix.package_manager == 'pnpm'
with:
version: 10
- run: npm ci
- run: npx playwright install chromium
- name: Run fresh generated-candidate journey
run: npm run acceptance:factory
env:
NODEKIT_CACHE_CLASS: ${{ inputs.cache_class || 'warm-or-unknown' }}
NODEKIT_PACKAGE_MANAGER: ${{ matrix.package_manager }}
- uses: actions/upload-artifact@v4
if: always()
with:
name: ease-proof-${{ matrix.os }}-${{ matrix.package_manager }}
if-no-files-found: error
path: |
proof/factory-acceptance.json
proof/ease/developer-timing-run.json
proof/ease/latest/**
26 changes: 26 additions & 0 deletions .github/workflows/evolution.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Evolution Ledger

on:
pull_request:
push:
branches: [main]

jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run evolution:verify
- name: Material change coverage
if: github.event_name == 'pull_request'
run: node src/cli.mjs evolution materiality --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }}
- run: npm run evolution:docs
- name: Projection drift
run: git diff --exit-code -- evolution/projections
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ coverage/
.nodekit/
npm-debug.log*
changes/nodekit-proof-campaign-2026-07-20/video/output/
proof/ease/agents/
46 changes: 46 additions & 0 deletions .qa/evidence/nodekit-base-20260721-1949/REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# NodeKit base agentic UI QA

Mode: SANDBOX DOGFOOD

Target: a fresh domain-blank application generated from the current NodeKit source.

## Journey results

| Journey | Result | Evidence |
|---|---|---|
| A0 smoke | PASS | Six light/dark desktop/tablet/mobile PNGs; UTF-8, zero console errors, zero horizontal overflow |
| A1 private core creation | PASS | `proposal-desktop.png`; canonical artifact remains v1 while proposal is pending |
| A2 live AI | SKIPPED | The neutral base deliberately has no live provider or egress claim |
| A3 provenance | PASS | Pending proposal shows base version; completion shows artifact v2 and receipt digest |
| A4 output/share | PARTIAL | Content-addressed receipt exists; export/deployment are intentionally not implemented |
| A5 themes/access | PASS | Six viewport/theme artifacts, semantic landmarks, skip link, focus-visible rules, reduced-motion rule |
| A6 adversarial | PASS | Second proposal while one is pending returns HTTP 400; one approval advances v1 to v2 exactly once |

## Finding

FINDING 1 · P2 · dark-theme contrast

Symptom: the initial dark render made the hero description too faint. Root cause: `.lede` used a hard-coded light-theme gray instead of the shared muted token. Evidence: first `desktop-dark.png` visual inspection. Fix: bind `.lede` to `var(--muted)`. Re-verify: current `desktop-dark.png` and `mobile-dark.png`.

## Agentic UI Bar

| B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8 | B9 | B10 | B11 |
|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 1 | 2 | 2 | 1 | 2 | 1 | 2 | 2 | 1 | 2 |

The base is intentionally not a live AI product, so model/cost/token attribution is not fabricated. The next product-level targets are visible exception recovery, explicit restore/undo, richer receipt inspection, and domain-specific content quality after specialization.

## Gate artifacts

- `desktop-light.png`
- `desktop-dark.png`
- `tablet-light.png`
- `tablet-dark.png`
- `mobile-light.png`
- `mobile-dark.png`
- `proposal-desktop.png`
- `completed-desktop.png`
- `completed-mobile-dark.png`
- `pixels.json`

The structural factory receipt is `proof/factory-acceptance.json`; its candidate is separate from this rendered sandbox and is bound to its own compiled application hash.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 17 additions & 0 deletions .qa/evidence/nodekit-base-20260721-1949/pixels.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"repo": "D:/VSCode Projects/cafecorner_nodebench/nodebench_ai4/nodebench-ai",
"url": "http://127.0.0.1:4173/",
"outDir": "D:/VSCode Projects/cafecorner_nodebench/nodebench_ai4/node-platform/.qa/evidence/nodekit-base-20260721-1949",
"assert": ["One clear job.", "Primary artifact", "Review proposal", "Blank in domain. Figured out in behavior."],
"shots": [
{ "name": "desktop-light", "scheme": "light", "viewport": { "width": 1440, "height": 900 }, "fullPage": true },
{ "name": "desktop-dark", "scheme": "dark", "viewport": { "width": 1440, "height": 900 }, "fullPage": true },
{ "name": "tablet-light", "scheme": "light", "viewport": { "width": 1024, "height": 768 }, "fullPage": true },
{ "name": "tablet-dark", "scheme": "dark", "viewport": { "width": 1024, "height": 768 }, "fullPage": true },
{ "name": "mobile-light", "scheme": "light", "viewport": { "width": 390, "height": 844 }, "fullPage": true },
{ "name": "mobile-dark", "scheme": "dark", "viewport": { "width": 390, "height": 844 }, "fullPage": true, "reducedMotion": true },
{ "name": "proposal-desktop", "scheme": "light", "viewport": { "width": 1440, "height": 900 }, "clicks": ["#reset", "#propose", "#artifact"], "assert": ["Proposed change", "Based on artifact v1"], "fullPage": false },
{ "name": "completed-desktop", "scheme": "light", "viewport": { "width": 1440, "height": 900 }, "clicks": ["#reset", "#propose", "#approve", "#artifact"], "assert": ["Completion verified", "Receipt"], "fullPage": false },
{ "name": "completed-mobile-dark", "scheme": "dark", "viewport": { "width": 390, "height": 844 }, "clicks": ["#reset", "#propose", "#approve", "#artifact"], "assert": ["Completion verified", "Receipt"], "fullPage": false }
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions .qa/memory/findings.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{"id":"nodekit-ui-001","rootCause":"The lede used a hard-coded light-theme gray instead of the shared muted token","sev":"P2","symptom":"Hero description was too faint in dark mode","status":"fixed","area":"dark-theme contrast","evidence":".qa/evidence/nodekit-base-20260721-1949/desktop-dark.png","fix":"Bind .lede color to var(--muted)","ts":"2026-07-21T19:54:08.694Z","fp":"1a956063993b"}
{"sev":"P0","area":"browser-proof-language","symptom":"Structural HTTP and source-DOM checks were labeled browser certified.","rootCause":"Release proof collapsed a non-rendered contract result into browser certification.","evidence":"proof/ease/latest/browser/screenshot-manifest.json","fix":"Separated structural and rendered-browser fields.","status":"fixed","ts":"2026-07-21T21:12:34.138Z","fp":"3d0a99ae9bbf"}
{"sev":"P1","area":"browser-state-coverage","symptom":"The real browser matrix covers only first arrival proposal and completion while required exception and recovery states remain absent.","rootCause":"The neutral base currently exposes only the happy-path controls.","evidence":"proof/ease/latest/browser/screenshot-manifest.json missingStates","fix":"Implement and capture remaining states before certification.","status":"open","ts":"2026-07-21T21:13:05.646Z","fp":"cce1cabe0304"}
{"sev":"P1","area":"fresh-agent-harness","symptom":"Two fresh coding-agent pilot attempts failed at the recorder boundary before a domain change was captured.","rootCause":"Windows quoting failed first then the wrapper discarded process fields.","evidence":"proof/ease/agents pilot directories","fix":"Recorder fixed and regression-tested no third attempt in this pass.","status":"open","ts":"2026-07-21T21:13:05.676Z","fp":"dd3549d104c6"}
{"sev":"P2","area":"generated-ui-charset","symptom":"The generated browser title rendered a mojibake separator.","rootCause":"A corrupted middle-dot byte sequence existed in the base HTML title.","evidence":"screenshot sidecars report mojibakeDetected false","fix":"Replaced the separator and added rendered-text checks.","status":"fixed","ts":"2026-07-21T21:13:05.675Z","fp":"3121d92760e7"}
{"sev":"P2","area":"mobile-landscape-first-action","symptom":"At 844 by 390 the primary workflow action was below the first viewport.","rootCause":"Hero spacing was width-responsive but not short-viewport responsive.","evidence":"proof/ease/latest/browser/screenshots/first_arrival--mobile-landscape--dark.png","fix":"Added a short-viewport media rule; regenerated pixels show the action and progress above the fold.","status":"fixed","ts":"2026-07-21T21:13:05.690Z","fp":"338d99b241e4"}
{"sev":"P0","area":"fresh-agent-semantic-gate","symptom":"A blocked no-change coding-agent run was initially labeled as a passing pilot because the untouched starter passed generic gates.","rootCause":"The harness checked process exit and starter health but did not require substantive candidate changes or reject a blocked final report.","evidence":"local proof/ease/agents/agent_volunteer-onboarding_b169f08e2cae/adjudication.json","fix":"Fail closed unless non-proof files changed and the final report is non-blocked; preserve an adjudication receipt for the false positive.","status":"fixed","ts":"2026-07-21T21:23:00.000Z","fp":"fresh-agent-semantic-gate"}
{"sev":"P1","area":"browser-state-coverage","symptom":"The real browser matrix covers only first arrival proposal and completion while required exception and recovery states remain absent.","rootCause":"The neutral base exposed only the happy path.","evidence":"proof/ease/latest/browser/screenshot-manifest.json: 180 screenshots, 15 states, zero missing","fix":"Added deterministic caseflow-backed state scenarios, responsive capture, and Axe checks.","status":"fixed","ts":"2026-07-21T22:13:00.000Z","fp":"cce1cabe0304"}
{"sev":"P1","area":"fresh-agent-harness","symptom":"Two fresh coding-agent pilot attempts failed at the recorder boundary before a domain change was captured.","rootCause":"Codex bubblewrap cannot create an unprivileged user namespace inside Docker Desktop; native execution remains read-only.","evidence":"proof/ease/agents/agent_volunteer-onboarding_165fb8466787/agent/session.jsonl","fix":"Container runner and semantic fail-close are implemented; nested sandbox configuration remains blocked and no third retry was attempted.","status":"open","ts":"2026-07-21T22:13:00.000Z","fp":"dd3549d104c6"}
{"sev":"P1","area":"dark-failure-contrast","symptom":"Failure banner text was unreadable in dark mode despite machine journey success.","rootCause":"The light failure background inherited dark-theme light text.","evidence":"proof/ease/latest/browser/screenshots/recoverable_failure--tablet-landscape--dark.png","fix":"Added state-specific dark-theme foregrounds and Axe serious/critical gating.","status":"fixed","ts":"2026-07-21T22:13:00.000Z","fp":"nodekit-dark-failure-contrast"}
{"sev":"P1","area":"mobile-receipt-framing","symptom":"Mobile landscape export evidence showed the page hero instead of the proof object.","rootCause":"Viewport capture did not move the state-defining receipt into view.","evidence":"proof/ease/latest/browser/screenshots/export_share--mobile-landscape--dark.png","fix":"Scroll the receipt detail into view for mobile receipt and export states.","status":"fixed","ts":"2026-07-21T22:13:00.000Z","fp":"nodekit-mobile-receipt-framing"}
4 changes: 4 additions & 0 deletions .qa/memory/runs.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{"evidenceDir":".qa/evidence/nodekit-base-20260721-1949","executor":"Codex","gates":{"factory":"PASS","tests":"PASS","pixels":"PASS"},"bar":{"B2":1,"B1":2,"B10":1,"B3":2,"B8":2,"B7":1,"B11":2,"B9":2,"B4":2,"B6":2,"B5":1},"journeys":{"A1":"PASS","A2":"SKIPPED(no live AI in neutral base)","A6":"PASS","A0":"PASS","A3":"PASS","A5":"PASS","A4":"PARTIAL(receipt only)"},"ts":"2026-07-21T19:54:23.812Z"}
{"executor":"Codex","mode":"SANDBOX DOGFOOD","commit":"054a74cf5a1cc072b783223aadd8384773e21e8b","result":"EASE_NOT_CERTIFIED","journeys":{"factory":"passed","renderedBrowser":"passed-coverage-incomplete","freshAgent":"blocked-read-only","nodeProofIntegrity":"passed"},"evidence":"proof/ease/latest/manifest.json","openP0":0,"openP1":2,"notes":"A fresh-agent false positive was caught and repaired. Human usability, repeatable agents, full state coverage, three Convex consumers, preview deployment, and cross-platform proof remain open.","ts":"2026-07-21T21:25:40.000Z"}
{"executor":"Codex","mode":"SANDBOX DOGFOOD","commit":"4bdc60d0b0e224f7d4884d7857b6f968bb3a901d","result":"EASE_NOT_CERTIFIED","journeys":{"A0":"PASS","A1":"PASS","A2":"SKIPPED(no live AI in neutral base)","A3":"PASS","A4":"PASS(receipt inspection and export state)","A5":"PASS","A6":"PASS","freshAgent":"BLOCKED(nested bwrap namespace)"},"bar":{"B1":2,"B2":1,"B3":2,"B4":2,"B5":2,"B6":2,"B7":1,"B8":2,"B9":2,"B10":2,"B11":2},"gates":{"tests":"PASS(68)","factory":"PASS(138751ms)","browser":"PASS(180/180)","axe":"PASS(0 serious/critical)","console":"PASS(0)","network":"PASS(0)","freshAgent":"BLOCKED"},"evidenceDir":"proof/ease/latest","notes":"Browser state coverage closed after pixel repair. Submission remains blocked by fresh agents, five-user human study, three Convex consumers, preview deployment, and independent ProofLoop verification.","ts":"2026-07-21T22:13:00.000Z"}
{"executor":"Codex","mode":"SANDBOX DOGFOOD","commit":"1036650717c1b8cff76939cf6e2a5bef3c965da9","result":"EASE_NOT_CERTIFIED","runId":"ease_e320fe62fdc746a0a286","journeys":{"proposalApprovalReceiptReload":"PASS","stateMatrix":"PASS(180/180)","freshAgent":"BLOCKED(nested bwrap namespace)","nodeProofIntegrity":"PASS(180 screenshots, 2 replay artifacts)"},"gates":{"factory":"PASS(157768ms)","firstMeaningfulPaint":"PASS(1348ms)","trace":"PASS(13376187 bytes)","video":"PASS(2288708 bytes)","axe":"PASS(0 serious/critical)","console":"PASS(0)","network":"PASS(0)","overflow":"PASS(0)","mojibake":"PASS(0)"},"evidenceDir":"proof/ease/latest","notes":"Replayable browser proof is clean and independently hashed. Ease certification remains honestly false pending the repeated developer timing matrix, held-out fresh-agent success, five-person usability study, three real Convex consumers, and shareable preview proof.","ts":"2026-07-21T22:29:06.074Z"}
21 changes: 21 additions & 0 deletions .understand-anything/.understandignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# .understandignore — paths excluded from architecture analysis
# Syntax follows .gitignore.

# Generated evidence and temporary work are not source architecture.
proof/
outputs/
.tmp/
.qa/

# Generated or vendored dependencies are covered by built-in exclusions.
# node_modules/
# dist/
# coverage/
# vendor/

# Optional scopes; leave included for the first NodeKit architecture graph.
# test/
# docs/
# scripts/
# templates/
# plugins/
Loading
Loading