From 2ffe96a1505df52debdf96a5e4dd8cec07a75d8d Mon Sep 17 00:00:00 2001 From: iperev Date: Mon, 7 Sep 2026 10:26:34 +0200 Subject: [PATCH 1/2] docs: clarify project adoption and daily workflow --- NON_CLAIMS.md | 16 +- README.md | 296 ++++++++---------- docs/images/workspace.png | Bin 0 -> 149078 bytes internal/tools/packageverify/main.go | 16 +- internal/tools/packageverify/main_test.go | 7 +- .../tools/packageverify/readme_workflow.go | 90 ++++++ .../packageverify/readme_workflow_test.go | 46 +++ .../tools/packageverify/workspace_image.go | 40 +++ .../packageverify/workspace_image_test.go | 209 +++++++++++++ internal/tools/releasechange/record_test.go | 13 +- package-lock.json | 4 +- package.json | 3 +- release/change-record.v2.json | 24 +- 13 files changed, 554 insertions(+), 210 deletions(-) create mode 100644 docs/images/workspace.png create mode 100644 internal/tools/packageverify/readme_workflow.go create mode 100644 internal/tools/packageverify/readme_workflow_test.go create mode 100644 internal/tools/packageverify/workspace_image.go create mode 100644 internal/tools/packageverify/workspace_image_test.go diff --git a/NON_CLAIMS.md b/NON_CLAIMS.md index 29419dc..8db9079 100644 --- a/NON_CLAIMS.md +++ b/NON_CLAIMS.md @@ -36,13 +36,15 @@ This repository state does not claim: Consuming repositories must keep their own specifications, proof bindings, native witnesses, CI gates, rollback policy, and rollout decisions. -Phase5A integration source/check implements only bounded portable generation -and read-only generated-byte freshness. It does not install, update, remove, -repair, activate host instructions, grant tool permissions, or authorize native -execution. Phase5B managed lifecycle remains open; manual shell export does not -close it. `current` neither proves semantic full proof nor guarantees stability -after return. Consumed registered-contract identity is not complete transitive -native-semantic identity, and byte budgets are not token counts. +Integration source/check provides bounded portable generation and read-only +generated-byte freshness. Managed integration plan/apply/recover provides +explicit install, update, removal and recovery through the repository +transaction owner. Neither proves host instruction discovery or activation, +grants tool permissions, or authorizes native execution. Manual shell export +does not prove native-host integration. `current` neither proves semantic full +proof nor guarantees stability after return. Consumed registered-contract +identity is not complete transitive native-semantic identity, and byte budgets +are not token counts. Declared witness routes do not prove execution. Installed npm/Python integration smokes and final frozen-tree closure require actual execution against the named diff --git a/README.md b/README.md index 046c015..0cefadd 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,15 @@ # agentic-proofkit -Reusable CLI and JSON proof infrastructure for spec-to-proof workflows in -software repositories. +Machine-readable specifications, proof bindings, selective verification, +and bounded agent workflows for software repositories. -`agentic-proofkit` helps repositories validate structured requirements, bind -requirements to proof routes, plan selective checks, admit receipt-shaped -evidence, render human views, and give coding agents bounded next-action -packets without copying verifier logic between projects. - -## Current Repository State - -| Surface | State | -|---|---| -| Source repository | Declared in package metadata; provider visibility is a live GitHub fact | -| Current layer | Public-source workflow; release evidence is version-specific | -| Runtime implementation | Go CLI with npm and Python wrapper packaging | -| Package release | Scoped npm release channel configured; exact version and registry identity are owned by npm and GitHub Release artifacts | -| Public-source provenance | Claimed only for a version whose release assets, registry identity, and checksum manifests are artifact-closed | -| License | MIT | +Keep product promises in repo-owned requirements. Connect each requirement to +the checks that can falsify it. Give agents the relevant context and next action; +inspect the same records in a local browser. Your repository retains authority +over requirement meaning, native tests and approval. ## Install -The canonical registry identity is npm: - ```bash npm install --save-dev --save-exact @research-engineering/agentic-proofkit ``` @@ -31,162 +18,106 @@ Pre-1.0 releases may contain owner-declared breaking changes, so npm consumers must retain the exact saved version instead of replacing it with a version range. -The canonical local invocation resolves only the already-installed dependency: +For an existing repository without an admitted specification, start with a +read-only adoption plan: + ```bash -npm exec --offline -- agentic-proofkit help +npm exec --offline -- agentic-proofkit adopt plan --repo-root . --mode audit-from-code --format text ``` + -npm remains the release-authority toolchain because release proof records npm -registry identity, `dist.integrity`, `dist.shasum`, `npm pack`, and root-only -registry install evidence. A bare `agentic-proofkit` command is valid when the -package manager, script runner, or activated environment has already placed the -installed binary on `PATH`; it is not the canonical copy-and-paste route. -Equivalent exact-tarball Bun execution has not been admitted, so this README -does not claim a Bun execution route. - -Python consumers use the Python package as a runner wrapper over the same Go -CLI, not as a Python SDK. Python projects should still treat CLI/JSON records, -exit codes, and package metadata as the public contract. - - -Supported binary targets are macOS 13 or later on arm64 or x64. -Linux manylinux 2.17 or later is supported on arm64 or x64. Windows is unsupported. The Python -runner requires Python 3.9 or later and wraps the same Go CLI; it is not a -Python SDK. +The plan returns authoring tasks and owner questions. It reads only a fixed +root-file catalog; it does not analyze arbitrary source semantics, write a +specification or run tests. An agent must inspect the selected code and design +repo-specific checks with the owner. `--repo-root .` selects the repository; +`--offline` resolves the already-installed dependency. -After an exact Python package version is available from an admitted channel, -use one complete package-manager chain: +Before opening a project in the browser, review the candidate artifacts and +follow the separate [materialization workflow](docs/proofkit-contract-map.md#agent-decision-procedure): +`adopt materialize plan`, then explicit `adopt materialize apply` with both +reviewed transaction and desired-state identities. Planning alone does not +create that project. -```bash -python -m pip install agentic-proofkit== -python -m agentic_proofkit help -``` - -or: +## How It Works -```bash -uv add --dev agentic-proofkit== -uv run agentic-proofkit help +```mermaid +flowchart TB + Observations["Code, tests, docs and maintainer intent"] --> Candidates["Agent: candidate invariants"] + Candidates --> Review["Repository owner: review and admit"] + Review --> Specs["Repo-owned specifications and proof bindings"] + Specs --> Checks["Proofkit: select required checks"] + Checks --> Native["Repository: run native tests and CI"] + Native --> Evidence["Proofkit: admit receipt-shaped evidence"] + Specs --> Views["Proofkit: bounded agent context and browser views"] + Evidence --> Views + Views --> Decision["Repository owner: decide"] ``` -These conditional commands do not claim that any current version is available -on PyPI. - - -## Project Boundary - -`agentic-proofkit` is intended to provide reusable proof-workflow mechanics for -repositories that want explicit requirements, proof bindings, deterministic -reports, and bounded guidance for coding agents. +**Authoring is not proof.** Observed behavior and generated invariants remain +candidates until the repository owner admits them. Binding a test declares a +proof route; only its actual execution can supply execution evidence. Reports +and views do not authenticate receipts or approve a change. -Proofkit does not own a consuming repository's product requirements, native -witness execution, receipt authenticity, proof freshness, merge admission, -rollout, deployment, or production readiness. +### Choose What You Trust -## How It Works - -Proofkit has two related but separate loops: +Select the mode explicitly; Proofkit does not infer that existing code is correct. -- an **authoring loop** for turning observations into candidate invariants and - repo-owned specifications; -- a **proof loop** for admitting those specifications, binding them to evidence, - and producing derived views or bounded next actions. - -The loops are separate because generated observations are not product truth. -Only the consuming repository can promote a candidate invariant into an -admitted requirement. +| `--mode` | Starting assumption | Agent task | +|---|---|---| +| `fresh` | No existing implementation is accepted as product truth | Turn owner intent into candidate behavior statements and falsifiers. | +| `code-baseline` | The owner chooses current behavior as the initial baseline | Record observed behavior and its limits for owner review. | +| `audit-from-code` | Existing behavior may be wrong or incomplete | Separate observations, contradictions and unanswered owner questions. | -### Proof Loop +All modes need repo-specific specifications and native checks. The +[authoring and test-order guide](ADOPTION.md#requirement-contract-and-test-order) +and [agent guidance](ADOPTION.md#agent-guidance) cover candidate promotion, +policy ownership, falsifiers and evidence templates. Proofkit supplies reusable +mechanics and prompts, not product policy or a native test implementation. -```mermaid -flowchart TB - subgraph Repo["Consumer repository authority"] - Requirements["Requirements and invariants"] - Bindings["Proof bindings and witness commands"] - Execution["Native test and CI execution"] - Decision["Owner decision"] - end - - subgraph Proofkit["Proofkit reusable mechanics"] - Admission["Admit and normalize JSON"] - Graph["Build proof graph"] - Planning["Plan selected checks"] - Receipts["Admit receipt-shaped evidence"] - Views["Render derived views"] - Packets["Emit bounded agent packets"] - end - - Requirements --> Admission - Bindings --> Admission - Admission --> Graph - Graph --> Planning - Planning --> Execution - Execution --> Receipts - Receipts --> Decision - Graph --> Views - Graph --> Packets - Views --> Decision - Packets --> Decision -``` +## Inspect The Project -The core invariant is separation of authority. The consuming repository owns -what the product must do and which native checks prove it. Proofkit owns the -reusable mechanics: admitting structured inputs, preserving provenance, -checking proof-binding shape, planning bounded verification, rendering derived -views, and returning agent-readable next-action packets. +![Proofkit workspace showing four synthetic delivery requirements and a source-bound question](docs/images/workspace.png) -The diagram keeps the rendering syntax intentionally simple for GitHub README -compatibility. Requirements, bindings, witness commands, native execution, and -final decisions stay in the consumer repository. Proofkit outputs are admitted -reports, plans, views, receipts, or agent packets; they do not become product -truth unless the consumer explicitly admits them. +An actual `view` session over a materialized synthetic project. The requirements +and proof routes are declarations, not executed evidence. This project input +provides specification navigation, source-bound questions and declared +traceability; coverage and baseline diff are unavailable. The separate +[explicit-input browser](ADOPTION.md#rendering-and-browser-views) can present +admitted coverage and comparison records. -### Invariant Authoring Loop +### Daily Workflow -For a repository with no specification, Proofkit can guide an agent through -three explicit starting modes: + +For an already materialized, current project: -```mermaid -flowchart TB - Start["Code, docs, tests, issues, and maintainer intent"] --> Mode["Choose trust mode"] - Mode --> Fresh["Fresh authoring mode"] - Mode --> Baseline["Code baseline mode"] - Mode --> Audit["Code audit mode"] - Fresh --> Contract["Owner-authored product contract"] - Baseline --> Observations["Caller-owned capability observations"] - Audit --> Observations - Observations --> Seeds["Candidate invariants and requirement seeds"] - Seeds --> Review["Owner review and promotion"] - Review --> Specs["Repo-owned requirements.v1.json"] - Contract --> Specs - Specs --> Obligations["Proof obligations"] - Obligations --> Evidence["Proof bindings and test inventory"] - Evidence --> Admission["Proofkit admission and coverage"] +```bash +npm exec --offline -- agentic-proofkit status --repo-root . --format text +npm exec --offline -- agentic-proofkit next --repo-root . --format text +npm exec --offline -- agentic-proofkit view --repo-root . --serve ``` + -| Mode | Use when | Result | -|---|---|---| -| Fresh authoring | No existing code or specification is accepted as product truth | Owner-authored behavior statements that remain candidates until admitted as repository requirements | -| Code baseline | Current behavior is accepted as the starting contract | Candidate requirements and bindings that preserve current behavior until owners review them | -| Code audit | Current behavior may be wrong or incomplete | Untrusted observations and questions that must be promoted by a repository owner before becoming requirements | +`status` classifies project structure; `next` gives the next bounded action. +Missing, stale or interrupted state must be resolved before `view` can serve. +`verification_required` is not a passing verification result. -In all three modes, generated records remain candidates until the consuming -repository admits them as repo-owned requirements, proof bindings, and witness -plans. Proofkit can structure and validate candidate packets, but it does not -extract complete behavior from arbitrary source code, invent product policy, or -make generated invariants authoritative by itself. +The server prints a loopback URL. Add `--open` only when you want Proofkit to +launch the browser; omit `--serve` to request a read-only browser plan instead. +Browser questions produce handoff packets, not agent execution or spec edits. -## Start Here +JSON is the default machine output. For `adopt plan`, `status` and `next`, +`--format text` selects an uncolored human view; `--color auto` opts into +terminal-aware color. To reduce JSON transport whitespace, place +`--json-layout compact` before the command. This does not change the JSON value +or the persisted specification format. -Use the CLI help route before reading source: +## Find The Next Capability ```bash npm exec --offline -- agentic-proofkit help -npm exec --offline -- agentic-proofkit adopt plan --mode fresh --repo-root . npm exec --offline -- agentic-proofkit help adopt plan npm exec --offline -- agentic-proofkit help repo-profile-admission -npm exec --offline -- agentic-proofkit repo-profile-admission --help ``` Command-specific help is derived from the private command descriptor table and @@ -194,33 +125,54 @@ does not read stdin. The full machine-readable command inventory remains `proofkit/cli-contract.v2.json`; the human route map is `docs/proofkit-contract-map.md`. -`adopt plan` is the read-only front door. It inventories only a fixed catalog -of recognized files at the explicit repository root, validates all arguments -before filesystem access, and returns candidate-authoring tasks. It does not -infer a stack, parse arbitrary source semantics, generate requirements, write -files, or execute evidence. `--stack` is an optional caller-selected hint and -cannot change the selected trust mode. +Use the [route map](docs/proofkit-contract-map.md#agent-decision-procedure) +for selective checks, migration parity, adoption diagnostics and bounded +specification context. Each route names its input and stopping conditions; +a plan, projection or missing receipt is not proof that a check passed. -| Repository state | Minimal first route | Stop condition | -|---|---|---| -| Fresh repository with no specification | `adopt plan --mode fresh --repo-root .` | Stop before writing files or inventing requirement meaning | -| Current code is intentionally accepted as the initial baseline | `adopt plan --mode code-baseline --repo-root .` | The flag is a caller declaration, not evidence that the code is correct; stop before promoting candidate observations | -| Current code must be audited before it becomes a contract | `adopt plan --mode audit-from-code --repo-root .` | Stop at explicit observations, owner questions, and candidate-only records | -| Legacy repository has local proof infrastructure | `migration-parity-admission`, then `migration-plan` | Stop before deleting local proof owners without parity evidence | -| A change set needs bounded checks | `changed-path-set`, optional `impact`, then `selective-gate-plan` and `selective-gate-evidence` | Stop on unknown scope, missing routes, or stale receipts | -| An agent needs only one specification subtree | `requirement-context-compose --repo-root . --input context-catalog.json`, then `requirement-context-slice` | Stop before treating a bounded slice as complete repository truth | -| A human needs semantic navigation, comparison, or traceability | `requirement-browser-server --view workspace --serve` over an admitted workspace input | Browser output, annotations, diff, and graph remain derived and non-authoritative | - -JSON commands default to readable output. Agents can request the same JSON -value with lower transport overhead by placing the process option before the -command: +For reviewed local Claude or Codex instructions, see the +[portable bootstrap and managed file lifecycle](ADOPTION.md#portable-agent-bootstrap). +Creating an instruction file does not prove that an agent application loads it. + +## Runtimes And Installation + +The Go CLI is distributed through npm and a Python runner wrapper. Neither +package exposes the Go internals as an SDK. npm owns the canonical release +toolchain and registry proof; equivalent exact-tarball Bun execution has not +been admitted. A bare `agentic-proofkit` command is valid when an installed +environment already places it on `PATH`; npm examples use explicit offline +resolution. + + +Supported binary targets are macOS 13 or later on arm64 or x64. +Linux manylinux 2.17 or later is supported on arm64 or x64. Windows is unsupported. The Python +runner requires Python 3.9 or later and wraps the same Go CLI; it is not a +Python SDK. + +After an exact Python package version is available from an admitted channel, +use one complete package-manager chain: ```bash -npm exec --offline -- agentic-proofkit --json-layout compact requirement-context-slice --input slice-input.json +python -m pip install agentic-proofkit== +python -m agentic_proofkit help ``` +or: + +```bash +uv add --dev agentic-proofkit== +uv run agentic-proofkit help +``` + +These conditional commands do not claim that any current version is available +on PyPI. + + ### First Valid Input +
+Inspect a complete minimal JSON input + The following marker-bounded record is a complete minimal requirement-source input. Its example IDs, paths, owner, invariant, and non-claims are caller-replaceable examples, not Proofkit-owned product meaning. @@ -271,6 +223,8 @@ npm exec --offline -- agentic-proofkit requirement-source-admission --input - ``` +
+ Use `secret-scan` only when the caller provides an explicit file inventory with content. It is a dedicated secret-like text detector for admitted inventory records; it does not traverse the repository, validate credential liveness, or @@ -287,13 +241,15 @@ The generated adapter remains caller-owned after materialization. It must be reviewed, pinned to the installed package, and kept behind the same CLI/JSON contract; it does not become a separate public SDK or proof authority. +## Documentation And Boundaries + | Need | Owner | |---|---| | Human orientation | This README | -| Adoption and release-channel model | `ADOPTION.md` | -| Vulnerability reporting boundary | `SECURITY.md` | -| Explicit boundary denials | `NON_CLAIMS.md` | -| `LICENSE` | MIT license | +| Adoption and release-channel model | [ADOPTION.md](ADOPTION.md) | +| Vulnerability reporting boundary | [SECURITY.md](SECURITY.md) | +| Explicit boundary denials | [NON_CLAIMS.md](NON_CLAIMS.md) | +| License | [LICENSE](LICENSE) | ## Non-Claims diff --git a/docs/images/workspace.png b/docs/images/workspace.png new file mode 100644 index 0000000000000000000000000000000000000000..8fdb988596d0103cdaaa53cf6ece9b78bcf805b1 GIT binary patch literal 149078 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 literal 0 HcmV?d00001 diff --git a/internal/tools/packageverify/main.go b/internal/tools/packageverify/main.go index 0a31a11..84b20ad 100644 --- a/internal/tools/packageverify/main.go +++ b/internal/tools/packageverify/main.go @@ -286,7 +286,7 @@ func verifyPackedPlatformBinariesMatchSource(artifact rootPackageArtifact) error func sourceOwnedPackageEntry(entry string) bool { switch entry { - case "package/LICENSE", "package/dist/agentic-proofkit", "package/package.json": + case "package/LICENSE", "package/dist/agentic-proofkit", "package/package.json", workspaceImageEntry: return true default: return packageTextEntry(entry) @@ -324,7 +324,11 @@ func verifyRootPackage(record packRecord) (rootPackageArtifact, error) { return rootPackageArtifact{}, fmt.Errorf("root package contains unexpected entry %s", entry) } } - return rootPackageArtifact{Content: content, Entries: entries, Headers: entryHeaders, Record: record}, nil + artifact := rootPackageArtifact{Content: content, Entries: entries, Headers: entryHeaders, Record: record} + if err := verifyPackedWorkspaceImage(artifact); err != nil { + return rootPackageArtifact{}, err + } + return artifact, nil } func verifyPackRecordBytes(record packRecord) error { @@ -357,6 +361,7 @@ func requiredRootEntries() []string { "package/README.md", "package/SECURITY.md", "package/dist/agentic-proofkit", + workspaceImageEntry, "package/docs/proofkit-contract-map.md", "package/docs/release-process.md", "package/package.json", @@ -461,6 +466,9 @@ func verifyTarEntryHeader(entry tarEntry) error { if entry.Size < 0 || entry.Size > maxTarEntryBytes { return fmt.Errorf("root package tar entry %s has invalid size %d", entry.Name, entry.Size) } + if entry.Name == workspaceImageEntry && (entry.Size == 0 || entry.Size > maxWorkspaceImageBytes || entry.Mode != 0o644) { + return fmt.Errorf("root package workspace image requires bounded non-empty bytes and mode 0644") + } if rootBinaryEntry(entry.Name) { if entry.Size == 0 || entry.Size > maxEmbeddedBinaryBytes { return fmt.Errorf("root package binary entry %s has invalid size %d", entry.Name, entry.Size) @@ -570,6 +578,7 @@ func forbiddenRootEntry(path string) bool { func allowedRootEntry(path string) bool { allowedExact := map[string]struct{}{ + workspaceImageEntry: {}, "package/ADOPTION.md": {}, "package/LICENSE": {}, "package/NON_CLAIMS.md": {}, @@ -677,6 +686,7 @@ func verifyRootManifestBoundary(artifact rootPackageArtifact) error { "README.md", "SECURITY.md", "dist/**", + "docs/images/workspace.png", "docs/proofkit-contract-map.md", "docs/release-process.md", "docs/specs/**/*", @@ -2646,7 +2656,7 @@ func verifyInstalledJSONABI(consumer string) error { if err := verifyInstalledNPMWorkflowSmoke(consumer); err != nil { return fmt.Errorf("outside consumer agent-workflow smoke failed: %w", err) } - return nil + return verifyInstalledREADMEWorkflow(consumer) } func verifyInstalledAgentRouteEnvelopeModes(consumer string) error { diff --git a/internal/tools/packageverify/main_test.go b/internal/tools/packageverify/main_test.go index 37e5337..f06e24b 100644 --- a/internal/tools/packageverify/main_test.go +++ b/internal/tools/packageverify/main_test.go @@ -87,6 +87,7 @@ func TestVerifyPackedOwnerRecordsRejectsSourceArtifactContentDrift(t *testing.T) withWorkingDirectory(t, root) entries := []string{ "package/LICENSE", + "package/docs/images/workspace.png", "package/dist/agentic-proofkit", "package/package.json", "package/docs/specs/example/requirements.v1.json", @@ -881,7 +882,10 @@ func TestExactTarballOnboardingTrace(t *testing.T) { if err := snapshot.Verify(consumer); err != nil { return err } - return verifyInstalledOnboardingTraceWithCarrier(consumer, snapshot.Contract, snapshot.Readme, runInstalledWithInput, runInstalledBinaryWithInput) + if err := verifyInstalledOnboardingTraceWithCarrier(consumer, snapshot.Contract, snapshot.Readme, runInstalledWithInput, runInstalledBinaryWithInput); err != nil { + return err + } + return verifyInstalledREADMEWorkflow(consumer) }); err != nil { t.Fatalf("exact tarball onboarding trace failed: %v", err) } @@ -2057,6 +2061,7 @@ func packageManifestFixture(repositoryURL string) string { "README.md", "SECURITY.md", "dist/**", + "docs/images/workspace.png", "docs/proofkit-contract-map.md", "docs/release-process.md", "docs/specs/**/*", diff --git a/internal/tools/packageverify/readme_workflow.go b/internal/tools/packageverify/readme_workflow.go new file mode 100644 index 0000000..46f9554 --- /dev/null +++ b/internal/tools/packageverify/readme_workflow.go @@ -0,0 +1,90 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "os" + "path/filepath" + "strings" +) + +func installedREADMEWorkflowRoutes(content string) ([]string, error) { + blocks := []struct { + name string + premise string + commands []string + }{ + {"first-action", "", []string{"adopt plan --repo-root . --mode audit-from-code --format text"}}, + {"daily-workflow", "For an already materialized, current project:", []string{ + "status --repo-root . --format text", + "next --repo-root . --format text", + "view --repo-root . --serve", + }}, + } + for _, block := range blocks { + startMarker := "" + endMarker := "" + if strings.Count(content, startMarker) != 1 || strings.Count(content, endMarker) != 1 { + return nil, fmt.Errorf("installed README workflow markers must occur exactly once") + } + start := strings.Index(content, startMarker) + len(startMarker) + end := strings.Index(content, endMarker) + if end <= start { + return nil, fmt.Errorf("installed README workflow marker order is invalid") + } + lines := []string{"```bash"} + if block.premise != "" { + lines = append([]string{block.premise, ""}, lines...) + } + for _, command := range block.commands { + lines = append(lines, installedNPMExecCommandPrefix+command) + } + lines = append(lines, "```") + if strings.TrimSpace(content[start:end]) != strings.Join(lines, "\n") { + return nil, fmt.Errorf("installed README workflow must preserve its prerequisite and exact commands") + } + } + return strings.Fields(blocks[0].commands[0]), nil +} + +func verifyInstalledREADMEWorkflow(consumer string) (returnErr error) { + readme, err := os.ReadFile(filepath.Join(consumer, filepath.FromSlash(installedNPMPackageRelativeRoot), installedNPMReadmeRelativePath)) + if err != nil { + return fmt.Errorf("read installed README workflow: %w", err) + } + args, err := installedREADMEWorkflowRoutes(string(readme)) + if err != nil { + return err + } + // The empty child still resolves the installed npm dependency from its parent. + root, err := os.MkdirTemp(consumer, "readme-first-action-") + if err != nil { + return fmt.Errorf("create README first-action repository: %w", err) + } + defer func() { returnErr = errors.Join(returnErr, os.RemoveAll(root)) }() + result, err := runInstalledWithInput(root, nil, args...) + if err != nil { + return fmt.Errorf("execute installed README first action: %w", err) + } + if result.ExitCode != 0 || len(result.Stderr) != 0 || bytes.Contains(result.Stdout, []byte("\x1b")) || len(result.Stdout) > 32<<10 { + return fmt.Errorf("installed README first action must produce bounded successful uncolored text") + } + for _, line := range []string{ + "Adoption plan", "Mode: audit-from-code", "State: authoring_required", + "Inventory: 0 recognized, 0 omitted, 0 opaque", "Authority: candidate-only; consuming repository owner", + "Evidence template: native-evidence-guidance", + } { + if !strings.Contains("\n"+string(result.Stdout), "\n"+line+"\n") { + return fmt.Errorf("installed README first action lost its candidate-only empty-repository outcome") + } + } + entries, err := os.ReadDir(root) + if err != nil { + return fmt.Errorf("inspect README first-action repository: %w", err) + } + if len(entries) != 0 { + return fmt.Errorf("installed README first action must not materialize repository files") + } + return nil +} diff --git a/internal/tools/packageverify/readme_workflow_test.go b/internal/tools/packageverify/readme_workflow_test.go new file mode 100644 index 0000000..dbfd3e5 --- /dev/null +++ b/internal/tools/packageverify/readme_workflow_test.go @@ -0,0 +1,46 @@ +package main + +import ( + "os" + "path/filepath" + "slices" + "strings" + "testing" +) + +func TestREADMEWorkflowRoutes(t *testing.T) { + t.Parallel() + content, err := os.ReadFile(filepath.Join("..", "..", "..", "README.md")) + if err != nil { + t.Fatal(err) + } + readme := string(content) + args, err := installedREADMEWorkflowRoutes(readme) + if err != nil { + t.Fatal(err) + } + if !slices.Equal(args, []string{"adopt", "plan", "--repo-root", ".", "--mode", "audit-from-code", "--format", "text"}) { + t.Fatal("README first action changed its read-only root and trust mode") + } + for _, pair := range [][2]string{ + {"adopt plan --repo-root .", "adopt materialize apply --repo-root ."}, + {"--mode audit-from-code", "--mode code-baseline"}, + {"status --repo-root . --format text", "status --repo-root ."}, + {"next --repo-root . --format text", "status --repo-root . --format text"}, + {"view --repo-root . --serve", "view --repo-root ."}, + {"view --repo-root . --serve", "view --repo-root . --serve --open"}, + {"For an already materialized, current project:", ""}, + {"For an already materialized, current project:", "Immediately after the read-only plan, run:"}, + {"", ""}, + {"", ""}, + {"", "\n"}, + {"npm exec --offline -- agentic-proofkit adopt", "npx agentic-proofkit adopt"}, + } { + if !strings.Contains(readme, pair[0]) { + t.Fatal("README route mutation missed its subject") + } + if _, err := installedREADMEWorkflowRoutes(strings.ReplaceAll(readme, pair[0], pair[1])); err == nil { + t.Fatal("mutated README workflow admitted") + } + } +} diff --git a/internal/tools/packageverify/workspace_image.go b/internal/tools/packageverify/workspace_image.go new file mode 100644 index 0000000..5d90d05 --- /dev/null +++ b/internal/tools/packageverify/workspace_image.go @@ -0,0 +1,40 @@ +package main + +import ( + "bytes" + "fmt" + "image/png" +) + +const ( + workspaceImageEntry = "package/docs/images/workspace.png" + maxWorkspaceImageBytes = 2 << 20 + maxWorkspaceImageWidth = 2048 + maxWorkspaceImageHeight = 1536 +) + +func verifyPackedWorkspaceImage(artifact rootPackageArtifact) error { + content, err := readTarFileFromBytes(artifact.Content, workspaceImageEntry) + if err != nil { + return err + } + return verifyWorkspaceImage(content) +} + +func verifyWorkspaceImage(content []byte) error { + if len(content) == 0 || len(content) > maxWorkspaceImageBytes { + return fmt.Errorf("root package workspace image exceeds its byte bounds") + } + config, err := png.DecodeConfig(bytes.NewReader(content)) + if err != nil { + return fmt.Errorf("root package workspace image has invalid PNG metadata") + } + // Dimensions bound allocation independently of the compressed byte count. + if config.Width < 1 || config.Width > maxWorkspaceImageWidth || config.Height < 1 || config.Height > maxWorkspaceImageHeight { + return fmt.Errorf("root package workspace image exceeds its dimension bounds") + } + if _, err := png.Decode(bytes.NewReader(content)); err != nil { + return fmt.Errorf("root package workspace image is not a complete PNG") + } + return nil +} diff --git a/internal/tools/packageverify/workspace_image_test.go b/internal/tools/packageverify/workspace_image_test.go new file mode 100644 index 0000000..c8e6792 --- /dev/null +++ b/internal/tools/packageverify/workspace_image_test.go @@ -0,0 +1,209 @@ +package main + +import ( + "archive/tar" + "bytes" + "context" + "encoding/binary" + "encoding/json" + "errors" + "hash/crc32" + "image" + "image/png" + "os/exec" + "path/filepath" + "strings" + "testing" + "time" +) + +func TestWorkspaceImageAdmission(t *testing.T) { + t.Parallel() + valid := workspacePNG(t, 8, 5) + for _, content := range [][]byte{valid, workspacePNG(t, 2048, 1536)} { + if err := verifyWorkspaceImage(content); err != nil { + t.Fatalf("valid bounded PNG rejected: %v", err) + } + } + const sentinel = "private-workspace-image-sentinel" + cases := []struct { + name string + content []byte + want string + }{ + {"empty", nil, "byte bounds"}, + {"overflow", make([]byte, (2<<20)+1), "byte bounds"}, + {"invalid", []byte(sentinel), "PNG metadata"}, + {"truncated after metadata", valid[:33], "complete PNG"}, + {"corrupt payload", append(append([]byte{}, valid[:33]...), []byte(sentinel)...), "complete PNG"}, + {"width before decode", workspacePNGHeader(valid, 2049, 1), "dimension bounds"}, + {"height before decode", workspacePNGHeader(valid, 1, 1537), "dimension bounds"}, + } + for _, item := range cases { + t.Run(item.name, func(t *testing.T) { + err := verifyWorkspaceImage(item.content) + if err == nil || !strings.Contains(err.Error(), item.want) { + t.Fatalf("PNG admission did not reject the intended boundary: %v", err) + } + if strings.Contains(err.Error(), sentinel) { + t.Fatal("PNG diagnostic disclosed input bytes") + } + }) + } +} + +func TestWorkspaceImageHeaderAndInventory(t *testing.T) { + t.Parallel() + entry := tarEntry{Name: "package/docs/images/workspace.png", Mode: 0o644, Size: 2 << 20, Typeflag: tar.TypeReg} + if err := verifyTarEntryHeader(entry); err != nil { + t.Fatal(err) + } + for _, mutate := range []func(*tarEntry){ + func(e *tarEntry) { e.Size = 0 }, + func(e *tarEntry) { e.Size++ }, + func(e *tarEntry) { e.Mode = 0o755 }, + func(e *tarEntry) { e.Typeflag = tar.TypeSymlink }, + } { + invalid := entry + mutate(&invalid) + if err := verifyTarEntryHeader(invalid); err == nil { + t.Fatal("invalid image header admitted") + } + } + if !allowedRootEntry(entry.Name) || allowedRootEntry("package/docs/images/other.png") { + t.Fatal("image inventory is not exact") + } + entries := toSet(requiredRootEntries()) + delete(entries, entry.Name) + if err := verifyRequiredRootEntries(entries); err == nil { + t.Fatal("package omitted its required illustration") + } + if err := verifyMarkdownDestinations("package/README.md", "![Workspace](docs/images/workspace.png)", entries); err == nil { + t.Fatal("README image reference resolved without an image") + } +} + +func TestWorkspaceImageExactByteBoundary(t *testing.T) { + t.Parallel() + valid := workspacePNG(t, 1, 1) + // A valid ancillary text chunk fills the payload without changing dimensions. + payload := bytes.Repeat([]byte("x"), 2097152-len(valid)-12) + copy(payload, "fixture\x00") + chunk := binary.BigEndian.AppendUint32(nil, uint32(len(payload))) + chunk = append(chunk, "tEXt"...) + chunk = append(chunk, payload...) + chunk = binary.BigEndian.AppendUint32(chunk, crc32.ChecksumIEEE(chunk[4:])) + content := append(append(append([]byte{}, valid[:len(valid)-12]...), chunk...), valid[len(valid)-12:]...) + if len(content) != 2097152 { + t.Fatal("exact-limit fixture has the wrong byte length") + } + if _, err := png.Decode(bytes.NewReader(content)); err != nil { + t.Fatalf("exact-limit fixture is not a complete PNG: %v", err) + } + if err := verifyWorkspaceImage(content); err != nil { + t.Fatalf("inclusive PNG byte boundary rejected: %v", err) + } + if err := verifyWorkspaceImage(append(content, 0)); err == nil || !strings.Contains(err.Error(), "byte bounds") { + t.Fatal("payload above the exact byte boundary was not rejected") + } +} + +func TestPackageVerifierImageFailureProcess(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithTimeout(t.Context(), 90*time.Second) + defer cancel() + binaryPath := filepath.Join(t.TempDir(), "packageverify") + build := exec.CommandContext(ctx, "go", "build", "-o", binaryPath, "./internal/tools/packageverify") + build.Dir = filepath.Join("..", "..", "..") + if output, err := build.CombinedOutput(); err != nil { + t.Fatalf("build actual package verifier: %v\n%s", err, output) + } + const sentinel = "private-image-process-sentinel" + entries := map[string]string{} + for _, name := range requiredRootEntries() { + entries[name] = "fixture" + } + entries["package/docs/images/workspace.png"] = sentinel + archive := mustReadBytes(t, writePackageTarball(t, entries)) + root := t.TempDir() + const filename = "image-proof.tgz" + writeFileBytes(t, filepath.Join(root, "artifacts/package", filename), archive) + records, err := json.Marshal([]packRecord{{Filename: filename, Name: rootPackageName, Version: "1.2.3", Integrity: testNPMIntegrity(archive), Shasum: testSHA1(archive)}}) + if err != nil { + t.Fatal(err) + } + writeFileBytes(t, filepath.Join(root, "artifacts/package/npm-pack.json"), records) + command := exec.CommandContext(ctx, binaryPath) + command.Dir = root + var stdout, stderr bytes.Buffer + command.Stdout, command.Stderr = &stdout, &stderr + err = command.Run() + var exit *exec.ExitError + if !errors.As(err, &exit) || exit.ExitCode() != 1 || stdout.Len() != 0 || !strings.Contains(stderr.String(), "PNG metadata") { + t.Fatal("actual verifier did not reject at the image boundary with failure exit and stderr only") + } + if bytes.Contains(stdout.Bytes(), []byte(sentinel)) || bytes.Contains(stderr.Bytes(), []byte(sentinel)) { + t.Fatal("actual verifier disclosed image input bytes") + } +} + +func TestRootPackageDecodesImageFromArchive(t *testing.T) { + root := t.TempDir() + withWorkingDirectory(t, root) + good := workspacePNG(t, 4, 3) + // A clean source image must not hide corrupted bytes in the package. + writeFileBytes(t, filepath.Join(root, "docs/images/workspace.png"), good) + for _, content := range [][]byte{good, []byte("invalid archive image")} { + entries := map[string]string{} + for _, name := range requiredRootEntries() { + entries[name] = "fixture" + } + entries["package/docs/images/workspace.png"] = string(content) + archive := mustReadBytes(t, writePackageTarball(t, entries)) + filename := "image-proof.tgz" + writeFileBytes(t, filepath.Join(root, "artifacts/package", filename), archive) + _, err := verifyRootPackage(packRecord{Filename: filename, Name: rootPackageName, Version: "1.2.3", Integrity: testNPMIntegrity(archive), Shasum: testSHA1(archive)}) + if bytes.Equal(content, good) { + if err != nil { + t.Fatalf("valid archive image rejected: %v", err) + } + } else if err == nil || !strings.Contains(err.Error(), "PNG metadata") { + t.Fatalf("bad archive passed beside valid source: %v", err) + } + } +} + +func FuzzWorkspaceImageAdmission(f *testing.F) { + f.Add(workspacePNG(f, 1, 1)) + f.Add([]byte("not a PNG")) + f.Fuzz(func(t *testing.T, content []byte) { + if err := verifyWorkspaceImage(content); err != nil { + return + } + decoded, err := png.Decode(bytes.NewReader(content)) + if err != nil || len(content) > 2<<20 { + t.Fatal("image admitted without complete bounded PNG bytes") + } + bounds := decoded.Bounds() + if bounds.Dx() < 1 || bounds.Dx() > 2048 || bounds.Dy() < 1 || bounds.Dy() > 1536 { + t.Fatal("image admitted outside dimension bounds") + } + }) +} + +func workspacePNG(t testing.TB, width, height int) []byte { + t.Helper() + var output bytes.Buffer + if err := png.Encode(&output, image.NewNRGBA(image.Rect(0, 0, width, height))); err != nil { + t.Fatal(err) + } + return output.Bytes() +} + +func workspacePNGHeader(valid []byte, width, height uint32) []byte { + header := append([]byte{}, valid[:33]...) + binary.BigEndian.PutUint32(header[16:20], width) + binary.BigEndian.PutUint32(header[20:24], height) + binary.BigEndian.PutUint32(header[29:33], crc32.ChecksumIEEE(header[12:29])) + return header +} diff --git a/internal/tools/releasechange/record_test.go b/internal/tools/releasechange/record_test.go index 3f3f116..7848733 100644 --- a/internal/tools/releasechange/record_test.go +++ b/internal/tools/releasechange/record_test.go @@ -197,11 +197,8 @@ func TestCurrentChangeRecordNamesReviewedSemanticChanges(t *testing.T) { var currentBreakingChanges = []Change{} var currentAdditions = []Change{ - {ChangeID: "proofkit.browser.project-entry", Summary: "Use view --repo-root to prepare a read-only workspace from one complete materialized project, or add --serve to inspect it through the existing loopback browser. Explicit --open, one-shot questions, compact JSON plans and bounded diagnostics reuse the existing browser and CLI owners."}, - {ChangeID: "proofkit.browser.reference-closure", Summary: "Resolve question anchors against the exact browser-issued session inventory, preserving admitted long requirement identities without expanding base identifier limits or weakening quote, source and terminal checks."}, - {ChangeID: "proofkit.cli.deterministic-choice-diagnostics", Summary: "Validate flag choices in descriptor order so identical invalid invocations select the same diagnostic. Effect-sensitive tests cover rejection before project preparation and inspection, including errors deliberately discarded by a faulty caller."}, - {ChangeID: "proofkit.context.captured-project-origin", Summary: "Add closed project-origin context schema 3, with owner-replayed source and binding projections, role-preserving physical identities and source-level limitations retained in question handoffs. Existing context v1/v2 identities and low-level browser contracts remain unchanged."}, - {ChangeID: "proofkit.graph.derived-reference-admission", Summary: "Apply one typed identity owner to graph nodes and relation references. Transparent prefixes preserve the full admitted component length; digest-derived identities remain distinct from caller IDs. Invalid components, unresolved references and inconsistent topology remain rejected."}, + {ChangeID: "proofkit.documentation.project-workflow", Summary: "Present read-only adoption, explicit owner-reviewed materialization and daily project navigation as distinct states. One diagram connects invariant authoring to native proof and derived views; current managed integration limits replace obsolete phase status. CLI and machine contract semantics are unchanged."}, + {ChangeID: "proofkit.package.workspace-illustration", Summary: "Ship one real synthetic-project browser image with exact npm path admission, source-byte equality, independent PNG decoding and byte/dimension bounds. Installed README checks retain the read-only first action and state-qualified daily command routes. The image does not represent executed proof or certify future browser rendering."}, } var currentMigrationSteps = []string{} @@ -224,7 +221,7 @@ func validateCurrentChangeRecord(record Record, notes string) error { func currentExpectedReleaseNotes() string { lines := []string{ - "# @research-engineering/agentic-proofkit 0.14.0", + "# @research-engineering/agentic-proofkit 0.14.1", "", "## Breaking Contract Changes", "", @@ -277,7 +274,7 @@ func currentExpectedReleaseNotes() string { "Primary npm channel:", "", "```bash", - "npm install --save-dev --save-exact @research-engineering/agentic-proofkit@0.14.0", + "npm install --save-dev --save-exact @research-engineering/agentic-proofkit@0.14.1", "```", "", "Pre-1.0 npm consumers must keep this dependency exact-pinned.", @@ -289,7 +286,7 @@ func currentExpectedReleaseNotes() string { "## Rollback", "", "- First follow the migration and persistent-state compatibility restrictions above; changing a package pin does not roll back repository state.", - "- Pin npm consumers to the previous admitted version 0.13.0 with `npm install --save-dev --save-exact @research-engineering/agentic-proofkit@0.13.0`.", + "- Pin npm consumers to the previous admitted version 0.14.0 with `npm install --save-dev --save-exact @research-engineering/agentic-proofkit@0.14.0`.", "- Treat local package artifacts as candidates until registry identity is proven.", ) return strings.Join(lines, "\n") + "\n" diff --git a/package-lock.json b/package-lock.json index cdef40a..f0966b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@research-engineering/agentic-proofkit", - "version": "0.14.0", + "version": "0.14.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@research-engineering/agentic-proofkit", - "version": "0.14.0", + "version": "0.14.1", "cpu": [ "arm64", "x64" diff --git a/package.json b/package.json index 0a27267..76b2b84 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@research-engineering/agentic-proofkit", "description": "Reusable proof profile, report, graph, and witness-planning primitives.", - "version": "0.14.0", + "version": "0.14.1", "type": "module", "license": "MIT", "sideEffects": false, @@ -27,6 +27,7 @@ "README.md", "SECURITY.md", "dist/**", + "docs/images/workspace.png", "docs/proofkit-contract-map.md", "docs/release-process.md", "docs/specs/**/*", diff --git a/release/change-record.v2.json b/release/change-record.v2.json index 32bbbac..3de7b0f 100644 --- a/release/change-record.v2.json +++ b/release/change-record.v2.json @@ -1,29 +1,17 @@ { "schemaVersion": 2, - "previousVersion": "0.13.0", - "version": "0.14.0", + "previousVersion": "0.14.0", + "version": "0.14.1", "changeClass": "compatible", "breakingChanges": [], "additions": [ { - "changeId": "proofkit.browser.project-entry", - "summary": "Use view --repo-root to prepare a read-only workspace from one complete materialized project, or add --serve to inspect it through the existing loopback browser. Explicit --open, one-shot questions, compact JSON plans and bounded diagnostics reuse the existing browser and CLI owners." + "changeId": "proofkit.documentation.project-workflow", + "summary": "Present read-only adoption, explicit owner-reviewed materialization and daily project navigation as distinct states. One diagram connects invariant authoring to native proof and derived views; current managed integration limits replace obsolete phase status. CLI and machine contract semantics are unchanged." }, { - "changeId": "proofkit.browser.reference-closure", - "summary": "Resolve question anchors against the exact browser-issued session inventory, preserving admitted long requirement identities without expanding base identifier limits or weakening quote, source and terminal checks." - }, - { - "changeId": "proofkit.cli.deterministic-choice-diagnostics", - "summary": "Validate flag choices in descriptor order so identical invalid invocations select the same diagnostic. Effect-sensitive tests cover rejection before project preparation and inspection, including errors deliberately discarded by a faulty caller." - }, - { - "changeId": "proofkit.context.captured-project-origin", - "summary": "Add closed project-origin context schema 3, with owner-replayed source and binding projections, role-preserving physical identities and source-level limitations retained in question handoffs. Existing context v1/v2 identities and low-level browser contracts remain unchanged." - }, - { - "changeId": "proofkit.graph.derived-reference-admission", - "summary": "Apply one typed identity owner to graph nodes and relation references. Transparent prefixes preserve the full admitted component length; digest-derived identities remain distinct from caller IDs. Invalid components, unresolved references and inconsistent topology remain rejected." + "changeId": "proofkit.package.workspace-illustration", + "summary": "Ship one real synthetic-project browser image with exact npm path admission, source-byte equality, independent PNG decoding and byte/dimension bounds. Installed README checks retain the read-only first action and state-qualified daily command routes. The image does not represent executed proof or certify future browser rendering." } ], "migration": { From 76c0d91498f42996f2f8da902a3a7fdabeac5890 Mon Sep 17 00:00:00 2001 From: iperev Date: Mon, 7 Sep 2026 11:03:47 +0200 Subject: [PATCH 2/2] test: observe complete image decoder failure channels --- .../packageverify/workspace_image_test.go | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/internal/tools/packageverify/workspace_image_test.go b/internal/tools/packageverify/workspace_image_test.go index c8e6792..8f45027 100644 --- a/internal/tools/packageverify/workspace_image_test.go +++ b/internal/tools/packageverify/workspace_image_test.go @@ -119,31 +119,43 @@ func TestPackageVerifierImageFailureProcess(t *testing.T) { t.Fatalf("build actual package verifier: %v\n%s", err, output) } const sentinel = "private-image-process-sentinel" - entries := map[string]string{} - for _, name := range requiredRootEntries() { - entries[name] = "fixture" - } - entries["package/docs/images/workspace.png"] = sentinel - archive := mustReadBytes(t, writePackageTarball(t, entries)) - root := t.TempDir() - const filename = "image-proof.tgz" - writeFileBytes(t, filepath.Join(root, "artifacts/package", filename), archive) - records, err := json.Marshal([]packRecord{{Filename: filename, Name: rootPackageName, Version: "1.2.3", Integrity: testNPMIntegrity(archive), Shasum: testSHA1(archive)}}) - if err != nil { - t.Fatal(err) - } - writeFileBytes(t, filepath.Join(root, "artifacts/package/npm-pack.json"), records) - command := exec.CommandContext(ctx, binaryPath) - command.Dir = root - var stdout, stderr bytes.Buffer - command.Stdout, command.Stderr = &stdout, &stderr - err = command.Run() - var exit *exec.ExitError - if !errors.As(err, &exit) || exit.ExitCode() != 1 || stdout.Len() != 0 || !strings.Contains(stderr.String(), "PNG metadata") { - t.Fatal("actual verifier did not reject at the image boundary with failure exit and stderr only") - } - if bytes.Contains(stdout.Bytes(), []byte(sentinel)) || bytes.Contains(stderr.Bytes(), []byte(sentinel)) { - t.Fatal("actual verifier disclosed image input bytes") + valid := workspacePNG(t, 1, 1) + for _, item := range []struct { + name string + content []byte + want string + }{ + {"metadata", []byte(sentinel), "PNG metadata"}, + {"complete decode", append(append([]byte{}, valid[:33]...), []byte(sentinel)...), "complete PNG"}, + } { + t.Run(item.name, func(t *testing.T) { + entries := map[string]string{} + for _, name := range requiredRootEntries() { + entries[name] = "fixture" + } + entries["package/docs/images/workspace.png"] = string(item.content) + archive := mustReadBytes(t, writePackageTarball(t, entries)) + root := t.TempDir() + const filename = "image-proof.tgz" + writeFileBytes(t, filepath.Join(root, "artifacts/package", filename), archive) + records, err := json.Marshal([]packRecord{{Filename: filename, Name: rootPackageName, Version: "1.2.3", Integrity: testNPMIntegrity(archive), Shasum: testSHA1(archive)}}) + if err != nil { + t.Fatal(err) + } + writeFileBytes(t, filepath.Join(root, "artifacts/package/npm-pack.json"), records) + command := exec.CommandContext(ctx, binaryPath) + command.Dir = root + var stdout, stderr bytes.Buffer + command.Stdout, command.Stderr = &stdout, &stderr + err = command.Run() + var exit *exec.ExitError + if !errors.As(err, &exit) || exit.ExitCode() != 1 || stdout.Len() != 0 || !strings.Contains(stderr.String(), item.want) { + t.Fatal("actual verifier did not reject at the image boundary with failure exit and stderr only") + } + if bytes.Contains(stdout.Bytes(), []byte(sentinel)) || bytes.Contains(stderr.Bytes(), []byte(sentinel)) { + t.Fatal("actual verifier disclosed image input bytes") + } + }) } }