Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,23 @@ npm run render:example # -> out/example.mp4
ffmpeg -y -i out/example.mp4 -vf "fps=15,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128:stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3:diff_mode=rectangle" -loop 0 example.gif
```

## NodeKit Present evidence

FeatureClipStudio can project selected, content-addressed clips and screenshots into a
`nodekit.evidence-index/v1` Change Story input without pretending that a checked-in
media file is fresh production-browser proof.

```bash
npm run evidence:check
npm run proof
```

The verifier checks repository containment, Git tracking, media signatures,
dimensions, byte sizes, digests, duplicate IDs/paths, and explicit captured-versus-
generated provenance. The committed P1 assets project as `observed`, not `verified`,
because this repository does not currently commit per-clip judge or browser receipts.
See [`docs/NODEKIT_PRESENT_EVIDENCE.md`](docs/NODEKIT_PRESENT_EVIDENCE.md).

The bundled example is a [solo-founder 3D proof-run app](https://github.com/HomenShum/solo-founder-agent-builder)
(builder console → generate a scroll-driven 3D product story → customer-facing landing
page → internal proof report with gates) — the captured frames +
Expand Down
67 changes: 67 additions & 0 deletions docs/NODEKIT_PRESENT_EVIDENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# NodeKit Present evidence bridge

FeatureClipStudio is a presentation-evidence tool, not a product-agent runtime. Its
NodeKit integration exposes checked-in clips and screenshots to a Change Story or
NodeSlide deck without upgrading a media file into a stronger proof claim than the
repository can support.

## Contract

`evidence/nodekit-present.manifest.json` is the authored manifest. Every entry must
declare:

- an existing Git-tracked GIF or PNG;
- its SHA-256 digest, byte size, MIME signature, and dimensions;
- whether it is captured UI, rendered capture, or generated illustration;
- whether the capture came from a deployed application, local fixture, or is unknown;
- whether a separate judge/browser receipt is committed; and
- content-addressed source files and limitations that explain the provenance boundary.

The verifier fails closed on missing or untracked files, absolute/traversing paths,
symlink escapes, duplicate IDs or paths, media-signature mismatch, digest/size/dimension
drift, provenance-basis drift, stale receipt references, and
generated-versus-captured ambiguity.

## Commands

```bash
npm run doctor
npm run evidence:check
npm run evidence:project
npm run proof
npm run check
```

`evidence:project` writes two deterministic artifacts:

- `proof/nodekit-present.evidence-index.json`, consumable by the
`nodekit.evidence-index/v1` Change Story lane; and
- `proof/featureclip-evidence.receipt.json`, which records the exact content and the
claim boundary used for projection. Text-basis digests normalize line endings and
JSON contract digests use canonical key ordering, so the same committed source
verifies on Windows, macOS, and Linux.

`proof` does not write. It recomputes both outputs and fails if the committed files are
missing or stale.

## Status semantics

Repository byte verification is not workflow verification.

- A checked-in file with matching digest, size, signature, dimensions, and provenance
projects as `observed` when no independent workflow receipt is committed.
- It can project as `verified` only when the manifest references a matching committed
judge or browser receipt with an explicit schema version.
- Generated illustrations can never certify a product workflow.

The initial P1 manifest deliberately contains zero independent workflow receipts.
FeatureClipStudio documents a runnable Gemini judge, but its existing per-clip judge
JSON is written to ignored `out/` paths and is not committed. The receipt therefore
sets `releaseReady: false` and `productWorkflowProof: not-certified`.

## Safe consumption

NodeKit Present or NodeSlide may use the projected assets as supplemental presentation
material. Consumers must retain `status`, the content-addressed location, and the
summary boundary. They must not relabel an `observed` asset as fresh production-browser
proof or claim that its depicted workflow passed the judge.
129 changes: 129 additions & 0 deletions evidence/nodekit-present.manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
{
"schemaVersion": "featureclip.evidence-manifest/v1",
"repository": "HomenShum/FeatureClipStudio",
"collectionId": "featureclip-nodekit-present-p1",
"nodekitChangeId": "nodekit-factory-p1",
"requireGitTracked": true,
"artifacts": [
{
"id": "noderoom-hero-walkthrough",
"title": "NodeRoom agent workflow walkthrough",
"artifactKind": "clip",
"path": "assets/feature-noderoom-hero.gif",
"mediaType": "image/gif",
"sha256": "b443e36ac89a215027104576eb29c8bc4b258660872a43775390b6ab0f6a1673",
"bytes": 2843694,
"dimensions": {
"width": 720,
"height": 405
},
"sourceTruth": {
"representation": "rendered-from-captured-product-ui",
"captureEnvironment": "deployed-application",
"artifactVerification": "repository-bytes",
"workflowVerification": "unverified",
"verificationReceipt": null
},
"basis": [
{
"path": "README.md",
"digestMode": "normalized-text-sha256",
"sha256": "b2b9f0f4b1389ea9578c53040bec8941cad574aa2042510d58011ec6ea25f423"
},
{
"path": "NODE-LOOPS.md",
"digestMode": "normalized-text-sha256",
"sha256": "e7b926d35dea7be0cdeb1592dd2f56b920b2d30ae8a170eda1e81c30375f03e9"
},
{
"path": "walkthrough.noderoom.specs.mjs",
"digestMode": "normalized-text-sha256",
"sha256": "23a6068b0f83dcd090ad08a4779fcf6278aa78a5182d863b05a4e7b5a56d9426"
}
],
"limitations": [
"The repository does not commit a per-clip judge or browser receipt, so this record verifies the media bytes and declared provenance but not the depicted workflow independently."
]
},
{
"id": "room-os-v1-state-screenshot",
"title": "Room OS V1 state evidence crop",
"artifactKind": "screenshot",
"path": "assets/room-os-v1-state-json.png",
"mediaType": "image/png",
"sha256": "44cef10aa164fb5491033bc596495b38d8a34ad63c2b53f466dfa18184bc48a8",
"bytes": 178021,
"dimensions": {
"width": 1280,
"height": 897
},
"sourceTruth": {
"representation": "rendered-from-captured-product-ui",
"captureEnvironment": "deployed-application",
"artifactVerification": "repository-bytes",
"workflowVerification": "unverified",
"verificationReceipt": null
},
"basis": [
{
"path": "README.md",
"digestMode": "normalized-text-sha256",
"sha256": "b2b9f0f4b1389ea9578c53040bec8941cad574aa2042510d58011ec6ea25f423"
},
{
"path": "assets/room-os-v1-state.json",
"digestMode": "normalized-text-sha256",
"sha256": "9c23f7a0bd5593fec06fa5595c567812f4929f39946eed97bd1e99223a013fdd"
},
{
"path": "walkthrough.roomos.mjs",
"digestMode": "normalized-text-sha256",
"sha256": "3f2b0e16daa2ce309e1e11d38e0a33ac90ee7a333a0b06c1831f8eec5663cbad"
}
],
"limitations": [
"The crop is presentation evidence derived from captured state. It is not a fresh-browser receipt and must not be presented as one."
]
},
{
"id": "solo-founder-baseline-frame",
"title": "Bundled SoloFounder captured baseline frame",
"artifactKind": "screenshot",
"path": "public/wt/SoloFounder/00.png",
"mediaType": "image/png",
"sha256": "382f000ab4fbc430138fde58b34f7905bbde99aaada1e06bfb5c7b1af2208e9f",
"bytes": 675621,
"dimensions": {
"width": 2560,
"height": 1600
},
"sourceTruth": {
"representation": "captured-product-ui",
"captureEnvironment": "local-fixture",
"artifactVerification": "repository-bytes",
"workflowVerification": "unverified",
"verificationReceipt": null
},
"basis": [
{
"path": "README.md",
"digestMode": "normalized-text-sha256",
"sha256": "b2b9f0f4b1389ea9578c53040bec8941cad574aa2042510d58011ec6ea25f423"
},
{
"path": "NODE-LOOPS.md",
"digestMode": "normalized-text-sha256",
"sha256": "e7b926d35dea7be0cdeb1592dd2f56b920b2d30ae8a170eda1e81c30375f03e9"
},
{
"path": "walkthrough.solo-founder.specs.mjs",
"digestMode": "normalized-text-sha256",
"sha256": "3725d99e55838e04803af7674e3365f1bd99f62ab168a55e95362f06ea1d8a85"
}
],
"limitations": [
"This is a checked-in worked-example frame from a local fixture, not evidence of a current production deployment."
]
}
]
}
36 changes: 36 additions & 0 deletions nodekit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
schemaVersion: nodekit.repo/v1
repository: HomenShum/FeatureClipStudio
lifecycle: preview
support: active
role: presentation-evidence-tool
commandProfile: protocol

canonicalFor:
- featureclip.evidence-manifest
- featureclip.evidence-receipt

consumes:
- nodeplatform.repo-contract
- nodeplatform.change-story

commands:
doctor: { script: doctor, mode: finite }
check: { script: check, mode: finite }
proof: { script: proof, mode: finite }

noKey:
status: certified
command: npm run proof
externalAccountsRequired: 0
disclosure: Evidence verification and NodeKit projection are deterministic local-file operations. Capture, rendering, judging, and deployment are separate opt-in workflows.

environment:
contractVersion: nodeplatform.env/v1
status: not-applicable

proof:
command: npm run proof
receiptSchema: featureclip.evidence-receipt/v1

contractDeclarations: []
architectureExceptions: []
8 changes: 7 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,13 @@
"render": "remotion render src/index.js",
"render:example": "remotion render src/index.js WT-SoloFounder out/example.mp4 --concurrency=2",
"render:roomos": "remotion render src/roomos-index.js WTG-RoomOSV0123 out/room-os-v0-v1-v2-v3.mp4 --concurrency=2",
"judge": "node judge-video.mjs"
"judge": "node judge-video.mjs",
"doctor": "node scripts/featureclip-evidence.mjs doctor",
"test:evidence": "node --test test/featureclip-evidence.test.mjs",
"evidence:check": "node scripts/featureclip-evidence.mjs check",
"evidence:project": "node scripts/featureclip-evidence.mjs project --write",
"proof": "node scripts/featureclip-evidence.mjs proof",
"check": "npm run doctor && npm run test:evidence && npm run proof"
},
"dependencies": {
"@remotion/cli": "^4.0.474",
Expand Down
Loading