Skip to content

Design Jazz repository productization - #123

Merged
Un3qual merged 5 commits into
mainfrom
codex/repository-productization-design
Aug 3, 2026
Merged

Design Jazz repository productization#123
Un3qual merged 5 commits into
mainfrom
codex/repository-productization-design

Conversation

@Un3qual

@Un3qual Un3qual commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Summary

Defines the approved productization program for the Jazz repository before any structural migration lands.

  • records the repository productization design
  • provides implementation plans for root canonicalization, the documentation reset, the Docusaurus website, and project operations
  • establishes the archive, documentation-authority, and tiered-CI strategy

Why

Jazz currently mixes the active compiler with legacy implementations and internal planning material. This design makes the intended end state and migration sequence independently reviewable before the canonicalization changes are merged.

Scope

This PR contains design and planning documentation only. It does not change compiler behavior or repository layout.

The implementation is published as a stacked draft PR from codex/repository-canonicalization, based on this branch.

Validation

  • plan structure and documentation checks passed during preparation
  • proposed Jazz examples were executed against the current compiler with expected results

Summary by cubic

Documents the approved plan to productize the Jazz repository. Adds implementation plans for canonicalizing the repo, resetting docs, launching a Docusaurus site, adopting tiered CI, and codifying governance, release processes, validation audits, and safeguards.

  • Migration

    • Move active jazz-next/ to root as the single jazz compiler; set Haskell namespace to Jazz.*; unify Cabal/Nix/CLI/flake identities as jazz; archive legacy trees with an annotated tag; keep behavior unchanged.
    • Make docs/ the only public docs; put durable decisions in rfcs/; keep execution plans and ops in .codex/; enforce boundaries in checks and execute the README example.
    • Build a website/ Docusaurus app that reads docs/ via path: "../docs"; ship accessible, branded UI; deploy immutable static output via a GitHub Pages workflow.
  • Operations

    • Adopt tiered CI with path-aware fast PR checks; docs-only PRs skip Haskell; full suites on main; weekly exhaustive parser/corpus/profiling/bench runs; release candidates reuse all tiers and package artifacts.
    • Establish governance and releases with execution contracts, migration audits, validation requirements, and safeguards to prevent private content from entering published docs or packages.

Written for commit 241df80. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Documentation
    • Added implementation plans for documentation ownership, website development, repository operations, and repository canonicalization.
    • Added an accepted productization design covering documentation boundaries, project structure, CI, verification, and delivery milestones.
    • Documented a Docusaurus website with accessibility, branding, executable examples, and GitHub Pages deployment.
    • Defined repository governance, release processes, migration audits, validation requirements, and safeguards for non-publication.

@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The PR adds five planning documents for Jazz repository canonicalization, documentation ownership, a Docusaurus website, project operations, and the accepted productization design.

Changes

Repository productization

Layer / File(s) Summary
Productization architecture and migration baseline
.codex/plans/2026-07-31-jazz-repository-canonicalization.md, docs/superpowers/specs/...productization-design.md
Defines the target repository structure, productization scope, migration constraints, archival procedure, and baseline verification.
Repository layout and identity canonicalization
.codex/plans/2026-07-31-jazz-repository-canonicalization.md
Plans legacy-tree removal, root promotion, JazzNext/jazz-next renaming, infrastructure updates, and repository audits.
Documentation ownership and public content
.codex/plans/2026-07-31-jazz-documentation-reset.md
Defines public-content boundaries, .codex/ execution state, accepted RFCs, curated documentation, and the replacement README.
Examples and documentation completion checks
.codex/plans/2026-07-31-jazz-documentation-reset.md
Defines executable examples, CLI validation, ownership audits, legacy-content checks, and documentation verification.
Docusaurus website and publication
.codex/plans/2026-07-31-jazz-docusaurus-website.md
Defines the Docusaurus scaffold, branding, homepage, accessibility work, generated examples, theme, and GitHub Pages deployment.
CI, governance, and release operations
.codex/plans/2026-07-31-jazz-project-operations.md
Defines CI policy scripts, workflows, governance files, package metadata, Nix packaging, and alpha-release artifacts.
Canonicalization verification and publication
.codex/plans/2026-07-31-jazz-repository-canonicalization.md
Defines ordinary and extended verification, generated-output checks, archive-tag validation, diff review, and publication requirements.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • Un3qual/jazz#4: Overlaps with the README restructuring and documentation validation plans.
  • Un3qual/jazz#77: Relates to reorganizing Jazz documentation and execution-state artifacts.
  • Un3qual/jazz#108: Relates to documentation migration, execution-command updates, and repository audit work.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the pull request's main change: defining the Jazz repository productization design and plan.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/repository-productization-design

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codacy-production

Copy link
Copy Markdown
Contributor

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 5 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md
Comment thread .codex/plans/2026-07-31-jazz-docusaurus-website.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-project-operations.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md Outdated
@Un3qual
Un3qual marked this pull request as ready for review August 1, 2026 19:02

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 21

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.codex/plans/2026-07-31-jazz-documentation-reset.md:
- Line 13: Update the documentation plan to use jazz-next/ for every
active-compiler path and command, including the references near lines 184-185,
243-245, 252, 378, and 430-435; remove jazz-next/ from the banned-reference
rules near lines 39-40 and 425. Ensure all documentation file references use
jazz-next/ rather than root-level jazz, src/, test/, or jazz.cabal paths.
- Line 132: Update the RFC template and its audit commands in the plan so all
required fields—Status, Date, Decision, Context, Consequences, and
Supersedes—are validated consistently. Define one field format in the template
and reuse that exact format in every checker, including the existing checks
around the RFC audit commands.
- Around line 161-164: Update the negative validation commands in the
documentation reset plan to succeed when the clean state is present: replace
directory-search checks for deleted trees with test ! -e, and invert or
explicitly handle the no-match status from rg so fail-fast execution does not
treat expected absence as failure. Apply the same change to the corresponding
checks referenced near the additional lines.
- Around line 35-43: Extend the documentation checker requirements to enforce
`sidebar_position` on every public Markdown page, matching the requirement
stated in Task 5. Update the temporary fixture-tree unit tests with both valid
front matter containing `sidebar_position` and an invalid page missing it, then
enforce the validation in `scripts/check-public-docs.py` alongside the existing
`title` and `description` checks.
- Line 31: Update the planned test module name from
scripts/test-check-public-docs.py to an importable underscore-based name, and
revise both unittest invocations to reference that dotted module name so python3
-m unittest can discover and run it.

In @.codex/plans/2026-07-31-jazz-docusaurus-website.md:
- Line 236: Update the plan references around the factorial synchronization task
and its related entry at line 322 to use
jazz-next/examples/functions/factorial.jz as the source. Ensure the Pages
workflow path filters include that source file plus the root generator and
boundary-check scripts that affect the website build, so changes trigger
publication and cannot leave generated content stale.
- Line 72: Update the planned website validation commands in
scripts/check-website.sh and the Pages job so every npm invocation explicitly
targets the website directory, using npm --prefix website or an equivalent
working-directory setting. Apply this to typecheck, build, and any other package
commands while leaving the boundary checks unchanged.
- Line 344: Update the forbidden-pattern check in the workflow validation
command to invert ripgrep’s result: matching any forbidden pattern must fail the
check, while no matches must succeed. Preserve the existing patterns being
searched and adjust the command’s exit-status handling accordingly.
- Around line 324-331: Update the “Configure least-privilege permissions”
section so the build job declares only contents: read, while pages: write and
id-token: write are declared exclusively within the deploy job. Ensure
deployment permissions are not inherited by the build job.
- Line 102: Update the Docusaurus scaffolding command in the plan to invoke a
specific resolved create-docusaurus 3.x.y version instead of latest, and
document that exact generator version alongside the generated
website/package-lock.json.
- Line 335: Update the build-job requirement in the plan to use the latest
supported actions/upload-pages-artifact version, preferably `@v5` or another
explicitly supported stable version, while preserving the website/build artifact
path and the rest of the workflow requirements.
- Line 140: Update the generated-page checks to match the configured
trailingSlash: false behavior: expect flat .html files such as overview.html
rather than nested overview/index.html paths. Preserve the existing validation
coverage for all affected documentation pages.

In @.codex/plans/2026-07-31-jazz-project-operations.md:
- Around line 122-142: Update the CI workflow plan to require every GitHub
Action, including dorny/paths-filter, actions/cache, and
actions/upload-artifact, to use full immutable commit-SHA pins instead of
mutable tags. Add Dependabot configuration or requirements to keep those pinned
revisions updated, and apply this consistently to the referenced workflow
sections.
- Around line 84-92: The plan must define a single artifact-manifest contract
before implementing producers, verifier, or fixture tests: specify the schema,
authoritative manifest location, shared artifact root, path normalization,
whether archives or their members are hashed, and whether the manifest excludes
itself. Update extended-tier manifest generation, release verification, and
build-alpha.sh’s SHA256SUMS handling to use this same contract.
- Around line 384-391: Update the release, artifact, and repository-presentation
instructions to define the build result lifecycle: make build-alpha.sh use an
explicit output path or a cleanup trap for the nix build result, and archive or
remove that result explicitly. Change release-completion checks to assert that
git status --porcelain is empty and fail otherwise, rather than only printing
the status.
- Around line 57-60: Update the fast compiler and main warning-clean build/test
operations to enable Cabal’s manual development flag via -fdevelopment, or use
equivalent checked project presets. Ensure both build and test commands activate
the flag so the tiers enforce -Werror.
- Around line 13-14: The plan must explicitly establish repository
canonicalization before referencing root-level paths or targets. Update the
affected prerequisite, Task 2, Task 6, and Release sections to either use
jazz-next paths and manifest before canonicalization or clearly mark jazz.cabal,
.#jazz, and other root paths as post-canonicalization targets.
- Around line 42-43: Update the test-tier policy around main-functional.sh so
program-corpus-spec is not included in the main cabal test all invocation while
remaining covered by the extended-only workload gate. Prefer an explicit
ordinary test-component list for the main tier, or consistently move
program-corpus-spec to the extended script, and preserve the existing exclusions
for benchmark, profiling, and full-scale components.

In @.codex/plans/2026-07-31-jazz-repository-canonicalization.md:
- Around line 108-125: Reorder the repository-audit plan so Task 2 keeps the
jazz-next.cabal marker and existing findJazzNextPackageRoot discovery while the
package remains in its current location. Move the findJazzPackageRoot rename,
jazz.cabal marker, ancestor-only candidateRoots behavior, and removal of
jazz-next fallback logic until after Tasks 3 and 4 complete the root move and
identity canonicalization.
- Around line 293-297: Keep the existing markdown documentation guideline
requiring jazz-next/ paths until the canonical root-path migration is complete,
or revise it in the same migration to clearly define the post-rename paths.
Apply this consistently in
.codex/plans/2026-07-31-jazz-repository-canonicalization.md lines 293-297,
docs/superpowers/specs/2026-07-31-jazz-repository-productization-design.md lines
45-46, and
docs/superpowers/specs/2026-07-31-jazz-repository-productization-design.md lines
414-415; all three sites require aligned scope.
- Around line 60-86: Update the archive-tag workflow around the archive tag name
and final verification to be idempotent and fail closed: inspect local and
remote tags, allow an existing tag only when its peeled commit equals
$archive_commit, then skip creation and pushing when already valid. Abort on any
conflicting local or remote tag, and apply the same commit-match validation
during final verification.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b59de469-b521-4a2a-adaf-d4be84bad13a

📥 Commits

Reviewing files that changed from the base of the PR and between 1babe26 and 1df2c5b.

📒 Files selected for processing (5)
  • .codex/plans/2026-07-31-jazz-documentation-reset.md
  • .codex/plans/2026-07-31-jazz-docusaurus-website.md
  • .codex/plans/2026-07-31-jazz-project-operations.md
  • .codex/plans/2026-07-31-jazz-repository-canonicalization.md
  • docs/superpowers/specs/2026-07-31-jazz-repository-productization-design.md

Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-project-operations.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-project-operations.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1df2c5bd25

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +131 to +133
- Delete: `jazz-hs/**`
- Delete: `jazz2/**`
- Move: `jazz-next/app/**` -> `app/**`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve the guarded compiler workspaces

Task 3 explicitly deletes both legacy trees and moves the active compiler out of jazz-next/, even though the repository policy marks jazz-hs/ and jazz2/ read-only and makes jazz-next/ the compiler implementation workspace. Task 5 only rewrites that policy after these destructive operations, so an agent cannot execute the plan as ordered without violating the active guardrail; revise the migration or obtain an explicit policy override before scheduling these steps.

AGENTS.md reference: AGENTS.md:L5-L7

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. The migration cannot enter the destructive task until a maintainer explicitly authorizes the one-time exception to the active AGENTS.md legacy read-only and jazz-next workspace rules. Design approval alone is explicitly not treated as deletion authority.

Comment on lines +122 to +124
- [ ] Configure `ci-pr.yml` for `pull_request` with least-privilege `contents: read`, concurrency keyed by workflow and pull-request number, and `cancel-in-progress: true`.

- [ ] Add a `changes` job using `dorny/paths-filter@v3` to emit `compiler` when any compiler, standard-library, program, example, Cabal, Nix, editor, or CI-script path changes. Treat unclassified repository infrastructure changes as compiler-relevant. Documentation-only paths are:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Grant paths-filter pull-request read access

If ci-pr.yml declares only the specified contents: read permission, the changes job will fail on every pull_request: dorny/paths-filter uses the pull-request files REST API in this event context and its supported-workflows documentation requires pull-requests: read. Because explicitly declaring any permissions sets unspecified scopes to none, the plan must also grant pull-requests: read to this job or workflow before relying on its outputs for compiler-fast and pr-gate.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. The pull-request workflow contract now grants contents: read and pull-requests: read, with the latter documented as required for paths-filter to list changed PR files.

Comment on lines +158 to +160
rg -L '^Status: Accepted$' rfcs/accepted/*.md
rg -L '^## Decision$' rfcs/accepted/*.md
rg -L '^## Consequences$' rfcs/accepted/*.md

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Replace -L with --files-without-match

When the RFC audit runs, these commands neither detect missing fields nor produce the documented empty output for valid RFCs. The installed rg --help defines -L as --follow, while --files-without-match is the option that “Print[s] the paths that contain zero matches”; consequently valid RFCs print their matching lines and files missing the field remain silent. Use rg --files-without-match for all three checks.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. RFC audits now use rg --files-without-match for all six required forms and explicitly accept only status 1 for the clean no-output state, preserving status 2 as a real failure.

}
```

Run it with `--entry-module Example::Main --module-root examples/modules/src`; expected output is `"Hello from a Jazz module"` followed by a newline.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include --run in the module example command

The documented command selects an entry module but never enables execution. The current CLI defaults to compile mode, which explicitly prints no stdout, and JazzNext.CLI.Main dispatches an entry module to runCompileModuleGraph unless cliRunMode was set by --run; therefore this command cannot produce the expected greeting and a checker that copies it will fail its exact-stdout assertion. Add --run to the module invocation.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. The module example command now includes --run before the entry-module and module-root arguments, matching the exact downstream example case.

- Modify: `README.md`
- Modify: `docs/getting-started/overview.md`

- [ ] Add a Pages workflow triggered by pushes to `main` affecting `docs/**`, `website/**`, `README.md`, or the workflow itself, plus `workflow_dispatch`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Rebuild Pages when the synchronized example changes

The homepage build reads examples/functions/factorial.jz through sync-factorial.mjs, but the Pages workflow is only triggered for docs, website, README, or workflow changes. A compiler/example-only change to that tracked program can therefore merge without deploying the newly synchronized homepage, leaving the published proof example stale until an unrelated website change occurs. Include examples/functions/factorial.jz in the push path filter.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. The Pages path filter now includes examples/functions/factorial.jz and the website generator validation scripts, so synchronized homepage content cannot remain stale after an input change.

Comment on lines +299 to +301
test -f website/build/docs/getting-started/overview/index.html
test -f website/build/docs/language/types-and-signatures/index.html
test -f website/build/docs/project/status/index.html

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Check the file layout emitted without trailing slashes

Task 2 fixes trailingSlash: false, for which Docusaurus emits a route such as docs/getting-started/overview.html, not docs/getting-started/overview/index.html as asserted here; the Docusaurus configuration documentation describes this option as affecting both URLs and emitted file names. Consequently the representative-page validation fails after an otherwise successful production build. Check the corresponding .html files or change the site to trailing-slash output.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. All representative docs assertions now target the flat .html output emitted by trailingSlash: false.


- [ ] Rewrite `docs/compiler/architecture.md` from the active compiler README and accepted RFCs. Describe major stages and ownership without embedding implementation task history.

- [ ] Build `docs/project/status.md` from live tests and source. Give it an `Updated: 2026-07-31` field and a current commit field populated with the implementation commit that finalizes this workstream. Use only `Implemented`, `Partial`, and `Planned` labels with concise evidence links to public pages.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Record a non-self-referential status revision

A tracked page cannot be populated with the hash of the same commit that finalizes it: the commit ID depends on the page contents, and replacing a placeholder after committing creates a different commit ID. Following this instruction therefore leaves the status revision stale after every attempted update. Record the reviewed predecessor/baseline commit instead, or inject the final revision at build time outside the committed content.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. Project status now records the reviewed canonicalization baseline as Implementation snapshot and explicitly forbids embedding the hash of the self-containing documentation commit. PR 125 already uses baseline b0ff077.

Comment on lines +41 to +42
- each marker `<!-- jazz-example: executable path=examples/... -->` names a tracked `.jz` file below root `examples/`;
- every tracked `examples/**/*.jz` is referenced by at least one public page or the root README; and

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Verify displayed examples against their tracked sources

The proposed rule verifies only that an executable marker names a tracked .jz file; it never checks that the adjacent displayed Jazz block is the contents of that file, nor requires every runnable-looking fence to carry a marker or fragment label. As a result, public docs can show invalid or stale code while check-examples.sh executes a different valid file and all checks pass. Make the checker associate each marker with its fenced block and compare it byte-for-byte to the referenced source, while rejecting unclassified runnable fences.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. The public-doc contract now requires every executable marker to classify the adjacent Jazz fence and compare it byte-for-byte with its tracked source. Every other Jazz fence must be explicitly marked as a fragment.


Use a Bash array for test component names and `--test-show-details=direct`. Do not add the complete program corpus or any benchmark/profiling component when tuning this list.

- [ ] Implement `scripts/ci/main-functional.sh` to run warning-clean `cabal build all`, `cabal test all --test-show-details=direct`, `cabal check`, repository/docs/queue/example validators, `nix flake check`, and `git diff --check`. Do not enable `full-parser-scale`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the complete corpus out of the main tier

This main-tier command contradicts the plan's requirement that only extended and release workflows run the complete corpus. program-corpus-spec is a default test component whose ProgramCorpusSpec includes testEveryCheckedInCase, so both cabal test all and the package check reached through nix flake check execute the full checked-in corpus on every main push. Exclude that component from the main script/Nix check or make it explicitly opt-in, leaving its required executions in extended.sh.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 1af37a2. The complete program corpus is now opt-in behind full-program-corpus, disabled in main, and enabled only for the two extended runs. This addresses the shared Cubic, CodeRabbit, and Codex finding at the tier boundary.

@codeant-ai

codeant-ai Bot commented Aug 3, 2026

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Reviewed your PR 1af37a2 Aug 03, 2026 · 15:40 15:40

@codeant-ai

codeant-ai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai Bot added the size:XXL This PR changes 1000+ lines, ignoring generated files label Aug 3, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.codex/plans/2026-07-31-jazz-project-operations.md (1)

100-100: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Define the artifact-root contract for release-candidate runs.

extended.sh writes evidence under JAZZ_ARTIFACT_ROOT, and ci-extended.yml sets that variable. The release-candidate requirement does not set or return the same root before invoking extended.sh. build-alpha.sh therefore has no defined path for the extended evidence it must archive.

Pass one release artifact root through release-candidate.sh and build-alpha.sh. State its cleanup and handoff behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.codex/plans/2026-07-31-jazz-project-operations.md at line 100, Update the
release-candidate flow centered on scripts/ci/release-candidate.sh and
scripts/release/build-alpha.sh to accept or establish one shared
JAZZ_ARTIFACT_ROOT, pass it unchanged through both scripts, and ensure
extended.sh writes evidence there. Define that the root is cleaned up at the
appropriate lifecycle boundary and remains available until build-alpha.sh
archives it, with build-alpha.sh receiving the same path rather than deriving a
separate location.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.codex/plans/2026-07-31-jazz-documentation-reset.md:
- Line 40: Update the relative-link validation rule in the documentation plan to
resolve each link against its source page and reject every resolved target
outside docs/, not only .codex/ and rfcs/. Explicitly preserve fragment-only
links and handle external links separately according to the existing policy,
keeping the behavior aligned with Line 319.
- Around line 39-40: Update the plan’s validation steps around
scripts/check-docs.sh, including the references near lines 441-445 and 458-459,
to remove assertions requiring jazz-next/ and docs/execution/. Define checks
matching the new ownership model for docs/, rfcs/, and .codex/, including the
prohibited path references and cross-directory Markdown link rules.
- Around line 159-174: Replace the text-presence checks in
require_all_rfc_files_match with RFC grammar validation that recognizes only
scalar top-level headers and unique top-level sections, excluding code fences
and quoted/template content. Validate required fields and section
ordering/structure through the checker fixtures, and reject any Supersedes entry
that references a deleted planning path so no live links remain.

In @.codex/plans/2026-07-31-jazz-docusaurus-website.md:
- Line 330: Update the Pages workflow trigger path list in the plan to replace
examples/functions/factorial.jz with the active compiler path jazz-next/. Keep
the existing docs, website, validation scripts, README, workflow, push-to-main,
and workflow_dispatch coverage unchanged.
- Around line 204-213: Update the asset validation checks in the plan so the
jazz_logo.png scan uses rg --hidden while excluding .git, thereby covering
hidden repository files. Add an explicit assertion that social-card.png has
dimensions exactly 1200×630, using a check that fails when the dimensions differ
rather than merely reporting file metadata.
- Line 341: Update the workflow requirement to make the deploy job explicitly
depend on the build job by adding needs: build before its
actions/deploy-pages@v4 step. Keep the existing build-job requirements and Pages
artifact flow unchanged.
- Around line 350-354: Update the verification block in the docs workflow
validation to run actionlint against .github/workflows/docs-pages.yml before the
existing forbidden-text rg check, while preserving the current search and
failure behavior.

In @.codex/plans/2026-07-31-jazz-project-operations.md:
- Around line 62-65: Update the fast-tier test command in the plan to use the
Bash test-components array defined later, invoking "${test_components[@]}" on
the same cabal test command and adding --test-show-details=direct so the
component names are not interpreted as separate shell commands.
- Around line 88-96: Update the planned extended workflow finalization around
scripts/ci/extended.sh so JAZZ_ARTIFACT_ROOT and its manifest are created
unconditionally, even when any workload fails. Use a finalizer or exit trap that
preserves the original failure status, hashes all available regular evidence
files while excluding the manifest, and still produces usable artifacts for the
always-run upload step.
- Around line 41-45: The standard-library fixture plan must explicitly disable
full-parser-scale in both fast and main Cabal test commands. Update the relevant
command assertions to include -f-full-parser-scale alongside the existing
full-program-corpus disablement, and adjust policy checks to reject only
positive full-parser-scale forms while preserving the intended fast/main
exclusions.
- Around line 393-399: Update scripts/release/build-alpha.sh to dereference or
copy the nix build output into the temporary release directory before creating
the archive, rather than archiving the --out-link symlink. Update
scripts/release/verify-artifacts.py to inspect and validate archive members and
expected contents instead of only checking that archives are nonempty.

In @.codex/plans/2026-07-31-jazz-repository-canonicalization.md:
- Around line 465-468: Update the verification steps around archive_commit so
the expected Task 1 commit is recorded independently in the task or pull-request
record, rather than derived from the tag under test. Compare that recorded
commit against both the local peeled archive tag and remote peeled archive tag,
enforcing the invariant recorded_task_1_commit == local_peeled_archive_tag ==
remote_peeled_archive_tag.
- Around line 335-339: Update the obsolete-identity audit command to search
every tracked path, including hidden files and ignored paths, by using git grep
or an input list from git ls-files. Preserve the existing exclusions for
historical plan directories and retain the failure behavior when any obsolete
identity is found.
- Around line 61-98: Update the archive-tag validation sequence around the tag
lookup and verification commands to fail closed: enable strict shell handling
with set -euo pipefail, ensuring git ls-remote, pipeline, and test failures stop
execution before tag creation, fetch, or push. Preserve the existing absent-tag
and matching-peeled-commit behavior while preventing lookup errors from being
interpreted as missing tags.

---

Outside diff comments:
In @.codex/plans/2026-07-31-jazz-project-operations.md:
- Line 100: Update the release-candidate flow centered on
scripts/ci/release-candidate.sh and scripts/release/build-alpha.sh to accept or
establish one shared JAZZ_ARTIFACT_ROOT, pass it unchanged through both scripts,
and ensure extended.sh writes evidence there. Define that the root is cleaned up
at the appropriate lifecycle boundary and remains available until build-alpha.sh
archives it, with build-alpha.sh receiving the same path rather than deriving a
separate location.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4f2e5dd0-34e1-48d5-a343-ed2e348a87a7

📥 Commits

Reviewing files that changed from the base of the PR and between 1df2c5b and 1af37a2.

📒 Files selected for processing (4)
  • .codex/plans/2026-07-31-jazz-documentation-reset.md
  • .codex/plans/2026-07-31-jazz-docusaurus-website.md
  • .codex/plans/2026-07-31-jazz-project-operations.md
  • .codex/plans/2026-07-31-jazz-repository-canonicalization.md

Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-docusaurus-website.md Outdated
- Modify: `README.md`
- Modify: `docs/getting-started/overview.md`

- [ ] Add a Pages workflow triggered by pushes to `main` affecting `docs/**`, `website/**`, `examples/functions/factorial.jz`, `scripts/check-website.sh`, `scripts/check-website-boundary.py`, `README.md`, or the workflow itself, plus `workflow_dispatch`. These paths are the complete direct input and validation boundary for the generated site.

@coderabbitai coderabbitai Bot Aug 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major

Use the active compiler path in the Pages trigger.

The plan still lists examples/functions/factorial.jz, but README.md identifies jazz-next/ as the active compiler path. A source change can therefore leave the generated factorial content stale. This repeats the earlier finding, which remains unresolved.

Proposed path change
- examples/functions/factorial.jz
+ jazz-next/examples/functions/factorial.jz
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.codex/plans/2026-07-31-jazz-docusaurus-website.md at line 330, Update the
Pages workflow trigger path list in the plan to replace
examples/functions/factorial.jz with the active compiler path jazz-next/. Keep
the existing docs, website, validation scripts, README, workflow, push-to-main,
and workflow_dispatch coverage unchanged.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No change: this suggestion conflicts with the verified stack order. The website workstream is based on documentation reset, which is based on merged repository canonicalization (PR 124); canonicalization moves the active compiler and examples to the repository root and deletes jazz-next/. Therefore examples/functions/factorial.jz is the correct PR 126 input, while jazz-next/examples/... would be a deleted path.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rate Limit Exceeded

@Un3qual have exceeded the limit for the number of chat messages per hour. Please wait 31 minutes and 5 seconds before sending another message.

Comment thread .codex/plans/2026-07-31-jazz-project-operations.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-project-operations.md
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md Outdated
Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1af37a21db

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


- [ ] Before moving files, extract any still-open work from `docs/execution/done-archive.md` into the live queue. Do not retain completed-row verification narratives.

- [ ] Move the five active execution files with `git mv`, delete `done-archive.md`, and remove the empty `docs/execution/` tree.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Migrate queue link targets with the execution files

After this git mv, the existing blocked rows in docs/execution/queue.md still link through ../superpowers/... and ../plans/...; from .codex/execution/ those paths resolve under .codex/, where their targets have not been migrated. scripts/check-execution-queue.py validates that every blocked plan link resolves to a file, so Task 2's required validation cannot pass, and Task 3 later deletes the original targets. Rewrite these links and preserve or curate their still-active targets as part of the move.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 90305e0. Task 2 now requires resolving every moved Markdown link from both its old and new parent, rewriting links whose meaning changes, and preserving or curating still-active targets before deletion. Queue plan links must resolve below .codex/plans/ and cannot silently retarget through ../superpowers/.

```bash
python3 -m unittest scripts/release/test-verify-artifacts.py
python3 scripts/check-ci-policy.py
JAZZ_RELEASE_VERSION=0.1.0-alpha.1 bash scripts/release/build-alpha.sh

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Commit the release tooling before requiring a clean tree

When this command runs, all Task 7 scripts, workflow, notes, and Nix changes remain uncommitted until the later commit step, while build-alpha.sh is explicitly required at line 418 to reject any nonempty git status. The candidate build therefore exits immediately even when generated artifacts are correctly ignored. Commit the tooling before invoking the clean-tree release build, then make any audit corrections in a follow-up commit.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 90305e0. Release fixture/static checks now run while dirty, then the tooling is committed before build-alpha.sh's clean-tree gate. The local candidate runs from that clean commit; any audit correction is a separate commit followed by a rerun.


- [ ] Extend `scripts/check-docs.sh` to require RFC 0001–0008 and the RFC index, require the standard RFC fields, and reject `Status: Accepted` files below `rfcs/proposed/`.

- [ ] Confirm all still-active execution plans already live in `.codex/plans/`. Delete every file under `docs/superpowers/` and `docs/plans/` only after the eight RFCs and the public mapping in Task 5 contain their durable decisions.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Retire the clarification checker before deleting its inputs

Deleting docs/plans/ here leaves the tracked scripts/check-clarification-specs.sh permanently failing: that validator explicitly requires four files below docs/plans/spec-clarification/, and it also requires four docs/spec/ files that Task 5 deletes. The plan updates the other documentation validators but never modifies or removes this one, so rewrite it for the curated documentation layout or retire it in the same migration.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 90305e0. The clarification checker is now an explicit Task 3 modification: it must be rewritten against curated public, RFC, and .codex/execution owners in the same deletion change, with all deleted-input assertions removed while remaining in the aggregate gate.


Then run `nix develop --command bash scripts/ci/extended.sh`.

- [ ] Upload `artifacts/extended/` with SHA-pinned `actions/upload-artifact`, `if: always()`, a 30-day retention, and `if-no-files-found: error`. The artifact must include benchmark CSV/environment JSON, deterministic profiles, normalized corpus outputs, and the SHA-256 manifest.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Generate the promised normalized corpus evidence

The extended-script specification only runs program-corpus-spec twice, and the current suite validates each result in memory without writing normalized outputs or honoring JAZZ_ARTIFACT_ROOT. Consequently artifacts/extended/ can contain benchmark and determinism files but not the normalized corpus outputs required by this upload contract, and those outputs cannot be covered by manifest.json. Add an explicit corpus-evidence export step and validate its files before generating the manifest.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 90305e0. The extended contract now captures separate Cabal logs for both corpus runs, normalizes stable per-program results plus the terminal success marker into corpus/pass-one.txt and corpus/pass-two.txt, and requires both evidence files to be nonempty and byte-identical before manifesting.

3. run `scripts/ci/determinism.sh`;
4. build `cabal.project.profile-stages` and `cabal.project.profile-hotspots`;
5. run `cabal bench jazz-bench` with an environment label supplied by `JAZZ_BENCHMARK_LABEL` and result root below `JAZZ_ARTIFACT_ROOT`;
6. validate generated benchmark metadata with `benchmark-metadata-spec`; and

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Validate the generated benchmark metadata files

Running benchmark-metadata-spec does not validate the files produced by the preceding benchmark: the current component in test/JazzNext/Benchmark/MetadataSpec.hs accepts no artifact path and only exercises fixed values and a temporary fixture directory. A malformed or incomplete environment.json or results.csv under JAZZ_ARTIFACT_ROOT can therefore be hashed and uploaded despite this step claiming to validate it. Add a verifier that reads the actual generated run directory, or extend the test component to accept and validate that directory.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 90305e0. The plan now creates a dedicated fixture-tested verifier that reads the actual generated benchmark directory, requires one labeled run, validates environment.json schema/label/run id, and checks the exact results.csv header plus a data row. benchmark-metadata-spec remains unit-level coverage rather than evidence validation.

- [ ] Validate assets:

```bash
if rg -n "https?://|data:image" website/static/img --glob '*.svg'; then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allow the required SVG namespace in the asset audit

This search rejects every conventional standalone SVG because its required xmlns="http://www.w3.org/2000/svg" declaration matches https?://, even though that namespace identifier is not a fetched external asset. The brand files used through <img> should retain the namespace, so the prescribed validation cannot pass for otherwise valid assets. Restrict the audit to URL-bearing attributes such as href, src, CSS url(), and embedded raster data, or explicitly exclude the SVG namespace.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 90305e0. The raw https? SVG scan was replaced with a resource-aware XML/CSS contract: URL-bearing href/xlink:href and CSS url(...) values are inspected, while the required http://www.w3.org/2000/svg namespace is treated as metadata rather than a fetch. A valid-namespace fixture is required.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 4 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md Outdated
@Un3qual

Un3qual commented Aug 3, 2026

Copy link
Copy Markdown
Owner Author

Addressed CodeRabbit’s outside-diff artifact-root finding in 90305e0. The release-candidate contract now accepts or establishes one caller-owned JAZZ_ARTIFACT_ROOT, exports that exact path unchanged to extended.sh, and leaves it intact for build-alpha.sh. The alpha builder owns the trapped temporary evidence root, archives it before cleanup, and only then releases the lifecycle. The same plan change adds unconditional failure finalization and complete-evidence validation. Verification passed with bash scripts/check-docs.sh, the spec/clarification/queue checks, pinned Prettier, git diff --check, and the archive/Cabal shell probes.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 90305e06e9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


- [ ] Extend `scripts/check-docs.sh` to require RFC 0001–0008 and the RFC index, delegate all RFC grammar validation to `scripts/check-rfcs.py`, and reject `Status: Accepted` files below `rfcs/proposed/` through that checker.

- [ ] Confirm all still-active execution plans already live in `.codex/plans/`. Delete every file under `docs/superpowers/` and `docs/plans/` only after the eight RFCs and the public mapping in Task 5 contain their durable decisions. In the same change, rewrite `scripts/check-clarification-specs.sh` against the curated public, RFC, and `.codex/execution/` owners; remove every assertion that requires a deleted input, and keep the checker in the aggregate validation matrix.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Move source deletion after the public rewrite

Task 3 cannot satisfy this prerequisite in the specified task order: it requires the public pages authored in Task 5 to contain the durable material before deleting the source trees, but the immediately following audit requires both source trees to be gone and Task 3 then commits that state. Task 5 also lists the old documents as inputs to rewrite, so executing sequentially either blocks Task 3 or removes Task 5's sources; move the deletion and absence checks into Task 5, or author the dependent public pages before this step.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 241df80. Task 3 now keeps docs/superpowers and docs/plans intact as source inputs and records their final-owner mapping. Task 5 authors the dependent public pages, updates the authority and clarification checkers, then deletes and asserts absence of those trees. This removes the impossible sequential prerequisite.


1. create and validate `JAZZ_ARTIFACT_ROOT` before any workload, then install an `EXIT` finalizer that preserves the original exit status and always writes the manifest from all regular evidence files produced so far, excluding the manifest itself; a finalizer failure changes a successful run to failure but never hides an earlier workload failure;
2. run all tests with `-ffull-parser-scale -ffull-program-corpus`, including the four explicitly named full parser-scale suites and the first complete corpus execution, with a temporary Cabal test log;
3. run `program-corpus-spec -ffull-program-corpus` a second time with a separate test log, normalize only the stable per-program results and terminal success marker into `corpus/pass-one.txt` and `corpus/pass-two.txt`, require both files to be nonempty and byte-identical, and leave both below `JAZZ_ARTIFACT_ROOT`;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Export per-program corpus results before normalizing logs

Fresh evidence in the current tree shows that this still cannot generate the promised per-program evidence: testEveryCheckedInCase validates each case only through silent in-memory assertions, while JazzNext.TestHarness.runTestSuite emits only one PASS line for the aggregate test and the terminal suite marker. Consequently neither Cabal log contains stable per-program results to normalize, so these files can either omit the required evidence or be empty; add an explicit case-result exporter or make the suite emit a defined machine-readable record for every program before extracting the two passes.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 241df80. The plan now adds a direct versioned corpus-evidence renderer owned by ProgramCorpusSpec. It records each program identifier only after all termination, output, diagnostic, warning, report, and budget assertions pass, writes atomically through JAZZ_CORPUS_EVIDENCE_PATH, and compares the two direct evidence files. Aggregate Cabal PASS lines are explicitly diagnostic-only.

test -z "$(git status --porcelain=v1 --untracked-files=all)"
JAZZ_RELEASE_VERSION=0.1.0-alpha.1 bash scripts/release/build-alpha.sh
python3 scripts/release/verify-artifacts.py artifacts/release/0.1.0-alpha.1
test -z "$(git status --porcelain=v1 --untracked-files=all)"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Ignore generated release artifacts before checking cleanliness

The release builder is required to retain its verified output under artifacts/release/<version>/, but no task adds artifacts/ to .gitignore; the canonicalization plan's complete replacement ignore list contains only build, benchmark, profile, and website paths. On a normal checkout, the successful build therefore leaves four archives and SHA256SUMS as untracked files, so this final clean-tree assertion always fails despite the preceding verification succeeding. Add the generated artifact root to the tracked ignore policy before running this gate.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 241df80. Release Task 7 now owns a root-anchored /artifacts/ ignore rule, requires repository-policy coverage for it, and runs a git check-ignore probe before the clean-tree release gate. The downstream operations branch already added this rule in 1213dcb; the parent execution contract now requires it explicitly.


- [ ] Point the root README at `website/static/img/jazz-wordmark.svg`, then delete the old root `jazz_logo.png` after confirming no references remain.

- [ ] Extend the website-boundary fixtures and checker for brand assets. Parse SVGs as XML, inspect URL-bearing `href`/`xlink:href` attributes and CSS `url(...)` values for remote or embedded-raster fetches, and treat the required `http://www.w3.org/2000/svg` namespace declaration as metadata rather than a fetch. Read the PNG IHDR with standard-library Python and fail unless `website/static/img/social-card.png` is exactly 1200×630. Add fixtures for a valid namespace, a remote `<image href>`, a CSS remote URL, embedded raster data, and wrong PNG dimensions.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Verify the social PNG matches its SVG source

The asset checker validates only the PNG dimensions and external references, while render:brand is merely documented as a manual regeneration command and is not part of prebuild or any validation step. If social-card.svg changes without manually rerunning that command, the old 1200×630 PNG still passes every prescribed check and is deployed as the Open Graph image, leaving social previews stale. Regenerate and compare the PNG during validation, or make the build deterministically render it and fail on a dirty result.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 241df80. Brand validation now renders the tracked SVG twice to temporary PNGs without mutating tracked inputs, decodes both renders and the checked-in social PNG to normalized RGBA, and requires identical pixels plus exact 1200x630 metadata. This catches stale derived assets without coupling the gate to platform-specific PNG compression bytes.

- [ ] Implement `scripts/ci/extended.sh` to:

1. create and validate `JAZZ_ARTIFACT_ROOT` before any workload, then install an `EXIT` finalizer that preserves the original exit status and always writes the manifest from all regular evidence files produced so far, excluding the manifest itself; a finalizer failure changes a successful run to failure but never hides an earlier workload failure;
2. run all tests with `-ffull-parser-scale -ffull-program-corpus`, including the four explicitly named full parser-scale suites and the first complete corpus execution, with a temporary Cabal test log;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep Cabal failure logs inside the artifact root

When the first all-tests invocation fails, the extended script exits before later normalization while its EXIT finalizer can hash only files already under JAZZ_ARTIFACT_ROOT. This step places the Cabal log in a temporary location and never requires it to be copied into that root, whereas the workflow uploads only artifacts/extended/; a failed test run can therefore upload an empty manifest without the failure diagnostic that the artifact contract promises. Write the logs under the artifact root from the outset or copy them from the finalizer before generating the manifest.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 241df80. Both corpus invocations now create suite-log destinations below JAZZ_ARTIFACT_ROOT before starting and tee combined stdout/stderr to pass-specific transcripts under pipefail. The unconditional finalizer can therefore retain build failures, early test failures, and suite logs instead of producing a manifest with no diagnostic evidence.


- [ ] Extend package-policy tests to require the metadata above, reject example-domain or empty URLs and legacy product names, confirm `jazz-internal` remains private, and inspect the `cabal sdist` file list for required and forbidden paths.

- [ ] Add `repository`, `homepage`, `bugs`, `icon`, and `keywords` metadata to the VS Code extension. Keep its scope honest: syntax highlighting and editor configuration only, with no language-server/formatter claims.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Create a package-local VS Code icon

This adds icon metadata and later documents VSIX packaging, but no task creates an icon under editors/vscode-jazz/: the brand task deletes the only current PNG and creates only SVG marks plus a 1200×630 social card under the separate website tree. A path outside the extension package will not be included as its manifest icon when packaging the VSIX, so the promised packaging command will have a missing or invalid icon asset. Add an appropriately sized extension-local PNG and cover it in the editor/package audit.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 241df80. Package metadata now requires a tracked package-local editors/vscode-jazz/icon.png, generated from the canonical mark as a transparent 128x128 PNG. Brand tests compare normalized rendered pixels, and repository/package audits require the manifest path to stay inside the extension and be included in its packaged file list. PR 127 already contains the asset; the parent plan now specifies its invariant.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 4 files (changes from recent commits).

Confidence score: 4/5

  • In .codex/plans/2026-07-31-jazz-documentation-reset.md, the RFC validation command can succeed without actually executing tests because unittest won’t discover the hyphenated module path, which risks false-green validation and missed regressions in fixtures/docs checks — switch this step to the same direct-script invocation used for the public-doc tests.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".codex/plans/2026-07-31-jazz-documentation-reset.md">

<violation number="1" location=".codex/plans/2026-07-31-jazz-documentation-reset.md:168">
P2: The RFC validation step can pass without running any tests because `unittest` does not discover this hyphenated path as a test module. Use the same direct-script invocation specified for the public-doc tests so fixture regressions cannot be skipped.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread .codex/plans/2026-07-31-jazz-repository-canonicalization.md
Comment thread .codex/plans/2026-07-31-jazz-documentation-reset.md Outdated
- [ ] Audit RFC completeness:

```bash
python3 -m unittest scripts/test-check-rfcs.py

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The RFC validation step can pass without running any tests because unittest does not discover this hyphenated path as a test module. Use the same direct-script invocation specified for the public-doc tests so fixture regressions cannot be skipped.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .codex/plans/2026-07-31-jazz-documentation-reset.md, line 168:

<comment>The RFC validation step can pass without running any tests because `unittest` does not discover this hyphenated path as a test module. Use the same direct-script invocation specified for the public-doc tests so fixture regressions cannot be skipped.</comment>

<file context>
@@ -149,34 +158,20 @@
-  require_all_rfc_files_match '^## Decision$'
-  require_all_rfc_files_match '^## Context$'
-  require_all_rfc_files_match '^## Consequences$'
+  python3 -m unittest scripts/test-check-rfcs.py
+  python3 scripts/check-rfcs.py
   test ! -e docs/superpowers
</file context>
Suggested change
python3 -m unittest scripts/test-check-rfcs.py
python3 scripts/test-check-rfcs.py

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No change needed. I reproduced the claimed path issue with the repository Python 3.14.5 runtime: python3 -m unittest scripts/test-check-public-docs.py loaded the hyphenated file path, ran 59 tests, and exited successfully. The RFC command uses the same supported unittest file-path form, so switching invocation style would not close a real false-green path.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 4 files (changes from recent commits).

Confidence score: 4/5

  • In .codex/plans/2026-07-31-jazz-project-operations.md, the release validation probe uses git check-ignore in a way that can give false negatives when the probe path does not exist, which could let ignore-rule regressions slip through or cause flaky release checks — update the probe to check a guaranteed existing path (or create a temporary file) before running git check-ignore.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".codex/plans/2026-07-31-jazz-project-operations.md">

<violation number="1" location=".codex/plans/2026-07-31-jazz-project-operations.md:478">
P2: The release validation probe does not reliably validate the new ignore rule: `git check-ignore` only succeeds when the supplied path is actually ignored, so a nonexistent probe can fail depending on repository/index state. A temporary probe file (or an explicit `git check-ignore -v --no-index -- artifacts/release/.probe` check with cleanup) would make this gate deterministic.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

- [ ] Run one local candidate from that clean commit and verify the exact final set:

```bash
git check-ignore -q --no-index artifacts/release/.probe

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The release validation probe does not reliably validate the new ignore rule: git check-ignore only succeeds when the supplied path is actually ignored, so a nonexistent probe can fail depending on repository/index state. A temporary probe file (or an explicit git check-ignore -v --no-index -- artifacts/release/.probe check with cleanup) would make this gate deterministic.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .codex/plans/2026-07-31-jazz-project-operations.md, line 478:

<comment>The release validation probe does not reliably validate the new ignore rule: `git check-ignore` only succeeds when the supplied path is actually ignored, so a nonexistent probe can fail depending on repository/index state. A temporary probe file (or an explicit `git check-ignore -v --no-index -- artifacts/release/.probe` check with cleanup) would make this gate deterministic.</comment>

<file context>
@@ -455,6 +475,7 @@
 - [ ] Run one local candidate from that clean commit and verify the exact final set:
 
   ```bash
+  git check-ignore -q --no-index artifacts/release/.probe
   test -z "$(git status --porcelain=v1 --untracked-files=all)"
   JAZZ_RELEASE_VERSION=0.1.0-alpha.1 bash scripts/release/build-alpha.sh
</file context>
Suggested change
git check-ignore -q --no-index artifacts/release/.probe
probe=artifacts/release/.probe
mkdir -p "$(dirname "$probe")"
: > "$probe"
git check-ignore -q --no-index -- "$probe"
rm -f "$probe"

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No change needed. I reproduced the exact condition with the tracked .gitignore from PR 127 commit a1a0291, which contains root-anchored /artifacts/. In an isolated repository, test ! -e artifacts/release/.probe exited 0, then git check-ignore -v --no-index -- artifacts/release/.probe also exited 0 and reported .gitignore:7:/artifacts/. Git ignore matching is lexical and does not require the candidate path to exist; --no-index also removes index-state dependence. Creating and deleting a real probe would add cleanup state without strengthening this gate.

@Un3qual
Un3qual merged commit 8e16565 into main Aug 3, 2026
5 checks passed
@Un3qual
Un3qual deleted the codex/repository-productization-design branch August 3, 2026 17:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant