Skip to content

Foundation: CI executes every notebook offline and validates fixtures #69

Closed

Description

@CompleteDotTech

Goal

The gate every recipe pull request has to pass. Once this is merged, recipes can start.

Scope

  • A CI job that discovers every recipes/*/notebook.ipynb, executes it from a fresh environment with no key and JEV_COOKBOOK_LIVE unset, and fails on any error.
  • Fixture validation for every recipe folder.
  • A guard that fails if a notebook attempts a network call to the TypeSafe API during the offline run.
  • A check that committed notebook outputs match a fresh offline execution closely enough to catch stale outputs (define the comparison and document it).
  • A check that a recipe pull request changes only its own recipes/NN-slug/ folder, reported as a clear message.
  • Per-recipe execution in a matrix or with path filtering, so sixty notebooks do not make every run slow.

Acceptance criteria

  • The template recipe passes all jobs
  • A notebook with a failing cell, an invalid fixture, and a stale output each make CI fail, demonstrated in the pull request description
  • Full run time with one recipe is recorded, with a note on how it scales
  • Lint and tests pass in CI, or locally with the output pasted in the pull request if CI does not exist yet

Dependencies

References

Activity

  1. added
    type: foundationShared code, tooling, CI, or docs that recipes depend on
    priority: p0Blocks everything else; do first
    status: blockedWaiting on the issues listed under Dependencies
    on Oct 6, 2026
  2. 55 remaining items

  3. added a commit that references this issue on Oct 6, 2026
  4. CompleteDotTech commented on Oct 6, 2026

    @CompleteDotTech
    ContributorAuthor

    Catalog coordination review handoff from #87 / PR #88: the final exact-head Opus approval is #88 (comment). The reviewer tested 33 crafted commits against the specified exhaustive allowlist/base-README rendering contract.

    For #69 implementation and regression evidence:

    • Inspect raw Git diff modes/types (for example git diff --raw -M -z), not only name-status. Name-status alone lists symlinks and submodules as ordinary additions and hides executable mode changes.
    • Enforce allowed modes for new files as well as rejecting prohibited type/mode changes; new executable files must not evade the ordinary-file contract.
    • Apply the outside-path rejection before parsing a head catalog that is forbidden to change, so malformed unauthorized catalog edits have a useful rejection diagnostic.
    • Test newly published notebook + exact renderer output from the base README as accepted, unauthorized prose/markers/newlines/generated-row edits as rejected, every outside-path class, both sides of renames, deletions, symlinks, submodules, modes and types.

    Do not substitute self-rendering head README comparison: that preserves arbitrary prose edits. This is a handoff to the existing future #69 worker, not a second implementation owner. Both independent Opus reviewers must inspect the actual implemented rejection tests at the final #69 head.

  5. CompleteDotTech commented on Oct 6, 2026

    @CompleteDotTech
    ContributorAuthor

    Orchestrator note. The scope rule in this issue's text ("a recipe pull request changes only its own recipes/NN-slug/ folder") is superseded by the allowlist being settled in #87 / PR #88: a recipe pull request may change its own recipes/<slug>/ folder plus exactly README.md, and README.md must equal the base README rendered with the head catalog and head recipes/ tree, byte for byte (no symlink, submodule, mode, or type changes anywhere in the allowlist). Build the scope check to that rule once #88 is merged, include a way to tell recipe pull requests from foundation ones (branch name recipe/ and the Closes #N with N in 1..60), and fail closed.

  6. CompleteDotTech commented on Oct 6, 2026

    @CompleteDotTech
    ContributorAuthor

    Orchestrator note 2 (after #88 merged). The allowlist is now in CONTRIBUTING.md (evaluated on git diff --raw -M base...head). Two edge cases the #88 reviewer left for this issue to decide, and which the scope check must handle: (S5) a deletion inside the recipe folder shows as :100644 000000 ... D; treat a deletion as having no resulting mode rather than rejecting it under the "every new or resulting mode must be 100644" rule. (S1) a pull request that edits a recipe folder without both recipe markers (branch recipe/<slug> and a closing reference to issue N in 1..60) must not escape the allowlist; require the branch slug to match the catalog slug for N, count every GitHub closing keyword, and fail a pull request that closes more than one recipe issue.

  7. CompleteDotTech commented on Oct 7, 2026

    @CompleteDotTech
    ContributorAuthor

    Orchestrator note 3. Notebook execution must run with the recipe folder as the working directory (nbclient does not default to the notebook's folder; pass the recipe path explicitly). The fixture validator (#65 / PR #94) will report a recipe's mode (replay or scripted): scripted and simulator recipes may have empty replay_keys and no responses.json; the network guard still applies to them.

  8. CompleteDotTech commented on Oct 7, 2026

    @CompleteDotTech
    ContributorAuthor

    Execution-prompt handoff for the future sole #69 Sonnet builder (implementation remains gated on delivered #68):

    PR99's description reports that PNG bytes differ between matplotlib versions and explicitly leaves network guarding and staleness comparison to this issue. Read its final reviewed implementation and both Opus findings before designing the gate.

    • The supplied execution prompt requires clean kernels, API credentials absent, and network access blocked during notebook execution. Installation may happen before that boundary. Demonstrate an actual blocked network attempt inside a notebook; removing TypeSafe keys alone is not that evidence. Preserve explicit recipe-folder cwd, and apply the guard to replay and scripted/simulator modes alike.
    • Define and document output comparison closely enough to catch real stale results, as the issue requires. Renderer variation is a comparison-design constraint: use an appropriate reproducible rendering environment or justified normalization/semantic comparison. A blanket omission of image output would leave changed teaching charts undetected; include a stale-figure probe and report the comparison's actual limits, alongside text/table stale-output probes. This is a handoff for requirement coverage, not a prescription for a particular implementation.
    • Keep the existing exhaustive raw-mode/type/scope allowlist and base-README renderer proof from prior comments. Do not replace them with a head-README self-render check. Every fixture must validate, including scripted no-responses and comparison responses files, and malformed or drift artifacts must fail.
    • Two distinct independent Opus reviewers must assess the final implementation and real rejection demonstrations, including notebook execution failure, invalid fixture, stale output, blocked networking and prohibited paths/modes/types. Discover and require every new workflow check before merge; five old baseline successes will not prove the expanded gate.

    No second #69 implementation owner is being assigned. Original supervisor remains sole dispatch and merge owner. The complete 60-recipe and per-recipe recorded-evidence requirements remain intact.

  9. CompleteDotTech commented on Oct 7, 2026

    @CompleteDotTech
    ContributorAuthor

    Coordination follow-up for #69: the two #99 round-4 receipts demonstrate that PNG bytes vary across Python/platform rendering stacks. That establishes a need for a justified comparison; it does not establish coverage for stale figures when every image/png value is omitted.

    Please preserve the attached execution brief and #69's stale-output acceptance criterion: include a negative probe that changes a committed teaching chart while leaving its cell source, text/plain figure representation, execution counts, and surrounding text intact, and demonstrate that the new CI gate rejects it. Blanket removal of image/png values will pass that probe and must not be reported as complete stale-output coverage. Reproducible rendering or a documented meaningful semantic figure comparison can satisfy the requirement; document actual limits and have both independent final-head Opus seats assess the probe.

    Kernel-process stderr warnings are separate from notebook error outputs: exit status is useful, but error/traceback outputs retained by raises-exception-tagged cells must also be rejected by the notebook CI acceptance gate. No second #69 writer is being started; the original supervisor retains ownership. Earlier complete handoff: #69 (comment)

  10. added
    status: in progressClaimed; a branch or pull request exists
    and removed
    status: blockedWaiting on the issues listed under Dependencies
    on Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: p0Blocks everything else; do firstsize: MAbout a daystatus: in progressClaimed; a branch or pull request existstype: foundationShared code, tooling, CI, or docs that recipes depend on

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions