Design Jazz repository productization - #123
Conversation
📝 WalkthroughWalkthroughThe PR adds five planning documents for Jazz repository canonicalization, documentation ownership, a Docusaurus website, project operations, and the accepted productization design. ChangesRepository productization
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Up to standards ✅🟢 Issues
|
There was a problem hiding this comment.
All reported issues were addressed across 5 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
There was a problem hiding this comment.
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
📒 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.mddocs/superpowers/specs/2026-07-31-jazz-repository-productization-design.md
There was a problem hiding this comment.
💡 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".
| - Delete: `jazz-hs/**` | ||
| - Delete: `jazz2/**` | ||
| - Move: `jazz-next/app/**` -> `app/**` |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
| - [ ] 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: |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
| rg -L '^Status: Accepted$' rfcs/accepted/*.md | ||
| rg -L '^## Decision$' rfcs/accepted/*.md | ||
| rg -L '^## Consequences$' rfcs/accepted/*.md |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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`. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 👍 / 👎.
| - 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 |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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`. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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 — Review Status
|
Thanks for using CodeAnt! 🎉We're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X · |
There was a problem hiding this comment.
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 winDefine the artifact-root contract for release-candidate runs.
extended.shwrites evidence underJAZZ_ARTIFACT_ROOT, andci-extended.ymlsets that variable. The release-candidate requirement does not set or return the same root before invokingextended.sh.build-alpha.shtherefore has no defined path for the extended evidence it must archive.Pass one release artifact root through
release-candidate.shandbuild-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
📒 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
| - 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. |
There was a problem hiding this comment.
🗄️ 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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
💡 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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
All reported issues were addressed across 4 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
|
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. |
There was a problem hiding this comment.
💡 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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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`; |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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)" |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 becauseunittestwon’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
| - [ ] Audit RFC completeness: | ||
|
|
||
| ```bash | ||
| python3 -m unittest scripts/test-check-rfcs.py |
There was a problem hiding this comment.
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>
| python3 -m unittest scripts/test-check-rfcs.py | |
| python3 scripts/test-check-rfcs.py |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 usesgit check-ignorein 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 runninggit 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 |
There was a problem hiding this comment.
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>
| 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" |
There was a problem hiding this comment.
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.
Summary
Defines the approved productization program for the Jazz repository before any structural migration lands.
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
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
jazz-next/to root as the singlejazzcompiler; set Haskell namespace toJazz.*; unify Cabal/Nix/CLI/flake identities asjazz; archive legacy trees with an annotated tag; keep behavior unchanged.docs/the only public docs; put durable decisions inrfcs/; keep execution plans and ops in.codex/; enforce boundaries in checks and execute the README example.website/Docusaurus app that readsdocs/viapath: "../docs"; ship accessible, branded UI; deploy immutable static output via a GitHub Pages workflow.Operations
main; weekly exhaustive parser/corpus/profiling/bench runs; release candidates reuse all tiers and package artifacts.Written for commit 241df80. Summary will update on new commits.
Summary by CodeRabbit