Canonicalize the Jazz repository root - #124
Conversation
|
Too many files changed for review. ( |
|
Important Review skippedToo many files! This PR contains 751 files, which is 651 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (751)
You can disable this status message by setting the 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 |
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| Security | 1 medium 1 minor |
| Complexity | 1 medium |
🟢 Metrics 82 complexity · 0 duplication
Metric Results Complexity 82 Duplication 0
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.
There was a problem hiding this comment.
9 issues found across 753 files
Confidence score: 3/5
- In
scripts/check_legacy_doc_claims.py, clause handling can both miss real live-claim violations (subject/negation split with “but remain read-only”) and incorrectly fail archive-only references, which makes the docs gate unreliable in both directions — preserve subject/status across continuations and distinguish archive/tag locations from current checkout before flagging. - In
scripts/check-spec-authority.sh, authority checks can be skipped when “legacy/historical” wording appears or when obsolete identifiers are spelledJazzNext/Paths_jazz_next, so live-authority claims may evade audit — keep only explicit negative-authority exemptions and add both identifiers to the obsolete pattern. - The combination of
flake.nixpointing cabal at./.and broader substring matching inscripts/check-docs.shraises false-positive risk and CI churn by scanning far more files with generic phrases — narrow derivation inputs and tighten reject pattern scope to intended paths/content. - Lower-severity consistency issues in
scripts/test_check_legacy_doc_claims.py,docs/spec/tooling/cli-source-input.md, anddocs/execution/queue.mdcan still mislead future maintenance (test intent mismatch, unresolved archive pointer, naming drift) — align test setup with its claim and normalize doc references/terminology.
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="flake.nix">
<violation number="1" location="flake.nix:18">
P3: Pointing the cabal source at the whole repository root (`./.`) means the derivation and `checks.jazz-test-suite` now include every tracked file — docs/, programs/, editors/, benchmark/, .codex/ and root markdown — not just the compiler tree that `./jazz-next` previously scoped. Any edit to a doc or README will now invalidate and fully rebuild the Nix derivation / flake check in CI, and the closure is needlessly large. Consider filtering the source with `pkgs.lib.cleanSourceWith` (keeping `jazz.cabal`, `cabal.project`, and `src/`, `jazz/`, `app/`, `test/`) to preserve the compiler-only purity the old `./jazz-next` path gave.</violation>
</file>
<file name="scripts/test_check_legacy_doc_claims.py">
<violation number="1" location="scripts/test_check_legacy_doc_claims.py:89">
P3: The name `test_repeated_obsolete_identity_claims_are_evaluated_independently` promises independent handling of multiple claims, but the combined sentence stays a single clause (no boundary chars), so it only repeats the negation-scoping case already covered by `test_negated_claim_does_not_hide_later_positive_claim`. Either split the fixture into separate clauses (e.g., two `. `-terminated sentences) so independence is actually exercised, or rename the test to match what it verifies.</violation>
</file>
<file name="scripts/check-docs.sh">
<violation number="1" location="scripts/check-docs.sh:85">
P3: This widened reject_pattern now does case-insensitive whole-tree substring matching for generic phrases like `js output`, `javascript generation`, and `codegen placeholder` across every file in `src/`, `jazz/`, and `test/`. Any future comment or .jz doc describing a JS backend or a codegen placeholder (legitimate content unrelated to legacy naming) will trip the docs gate with no way to exempt it, making the check brittle and hard to maintain. Consider scoping the scan to legacy-identity references (e.g. only flagging these phrases when adjacent to removed tree names) or allowing an explicit allowlist/annotation so the gate survives unrelated JS-backend notes.</violation>
</file>
<file name="scripts/check_legacy_doc_claims.py">
<violation number="1" location="scripts/check_legacy_doc_claims.py:13">
P1: A live claim can bypass the documentation gate when its subject is followed by an archive negation and a `but remain read-only` continuation. Preserve subject/status association across these clauses and limit negation matching to the status it negates.</violation>
<violation number="2" location="scripts/check_legacy_doc_claims.py:191">
P2: Archive-only historical references are rejected as live claims, so valid docs about the recovery tag can fail `check-docs.sh`. Distinguish an archive/tag location from a current checkout before returning a violation.</violation>
</file>
<file name="docs/spec/tooling/cli-source-input.md">
<violation number="1" location="docs/spec/tooling/cli-source-input.md:16">
P3: The referenced archive location isn't resolvable from the doc alone: no git tag named `archive/pre-root-canonicalization-2026-07-31` exists in this repo (git tag -l is empty), and only the recovery commit `1df2c5bd...` mentioned in the PR description resolves. Consider adding that commit hash here so the retained historical evidence is actually locatable by anyone reading this doc, rather than a tag that may not be created.</violation>
</file>
<file name="scripts/check-spec-authority.sh">
<violation number="1" location="scripts/check-spec-authority.sh:52">
P2: Live-authority claims using `JazzNext` or `Paths_jazz_next` bypass this audit because neither spelling is in `obsolete_identity_pattern`. Include both obsolete identifiers so the documentation check covers every identity the repository audit removes.</violation>
<violation number="2" location="scripts/check-spec-authority.sh:68">
P2: A live-authority claim is ignored whenever it also calls the implementation legacy or historical. Those terms do not negate authority, so retain only explicit negative-authority exemptions (or otherwise require the claim itself to be negated).</violation>
</file>
<file name="docs/execution/queue.md">
<violation number="1" location="docs/execution/queue.md:48">
P3: The JN-MODULE-REBASE row title now reads "onto active root owners", but the rest of this canonicalization pass (JN-PURITY-EFFECT and JN-ABSTRACTION rows, entry template `src/Jazz/`) uses `Jazz` for the same active compiler. For a PR whose goal is unifying naming, keeping two different labels points at the same root-path target is inconsistent; consider aligning this title to `Jazz` (e.g. "onto active `Jazz` owners").</violation>
</file>
Note: This PR contains a large number of files. cubic only reviews up to 200 files per PR, so some files may not have been reviewed. cubic prioritizes the most important files to review.
Re-trigger cubic
| _HEADING_PATTERN = re.compile(r"^\s*#{1,6}\s+") | ||
| _LIST_ITEM_PATTERN = re.compile(r"^\s*(?:[-*+]|\d+[.)])\s+(.*)$") | ||
| _CLAUSE_BOUNDARY_PATTERN = re.compile( | ||
| r"(?<=[.!?;])\s+|,\s+(?=(?:but|however)\b)", re.IGNORECASE |
There was a problem hiding this comment.
P1: A live claim can bypass the documentation gate when its subject is followed by an archive negation and a but remain read-only continuation. Preserve subject/status association across these clauses and limit negation matching to the status it negates.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/check_legacy_doc_claims.py, line 13:
<comment>A live claim can bypass the documentation gate when its subject is followed by an archive negation and a `but remain read-only` continuation. Preserve subject/status association across these clauses and limit negation matching to the status it negates.</comment>
<file context>
@@ -0,0 +1,243 @@
+_HEADING_PATTERN = re.compile(r"^\s*#{1,6}\s+")
+_LIST_ITEM_PATTERN = re.compile(r"^\s*(?:[-*+]|\d+[.)])\s+(.*)$")
+_CLAUSE_BOUNDARY_PATTERN = re.compile(
+ r"(?<=[.!?;])\s+|,\s+(?=(?:but|however)\b)", re.IGNORECASE
+)
+_LEGACY_TREE_PATTERN = re.compile(
</file context>
There was a problem hiding this comment.
No PR 124 code change: this migration-only checker and its caller are removed in stacked PR #125 (codex/documentation-reset), so the parsing bug is unreachable in the resulting stack. Fixing the deleted parser here would duplicate obsolete work.
| for pattern in _NEGATED_STATUS_PATTERNS | ||
| for negation in pattern.finditer(clause) | ||
| ) | ||
| if not prefixed_as_false and not directly_negated: |
There was a problem hiding this comment.
P2: Archive-only historical references are rejected as live claims, so valid docs about the recovery tag can fail check-docs.sh. Distinguish an archive/tag location from a current checkout before returning a violation.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/check_legacy_doc_claims.py, line 191:
<comment>Archive-only historical references are rejected as live claims, so valid docs about the recovery tag can fail `check-docs.sh`. Distinguish an archive/tag location from a current checkout before returning a violation.</comment>
<file context>
@@ -0,0 +1,243 @@
+ for pattern in _NEGATED_STATUS_PATTERNS
+ for negation in pattern.finditer(clause)
+ )
+ if not prefixed_as_false and not directly_negated:
+ return True
+ return False
</file context>
There was a problem hiding this comment.
No PR 124 code change: this migration-only legacy-claims checker is removed in stacked PR #125 (codex/documentation-reset). The archive-reference logic does not survive the stack.
| if [[ -n "$authority_candidates" ]]; then | ||
| unsupported_claims="$({ | ||
| printf '%s\n' "$authority_candidates" | rg -v -i \ | ||
| '(removed|legacy|historical|pre-migration|not[^[:alpha:]]{0,6}(active|authoritative|normative|source of truth|implementation target)|non[- ]normative)' || true |
There was a problem hiding this comment.
P2: A live-authority claim is ignored whenever it also calls the implementation legacy or historical. Those terms do not negate authority, so retain only explicit negative-authority exemptions (or otherwise require the claim itself to be negated).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/check-spec-authority.sh, line 68:
<comment>A live-authority claim is ignored whenever it also calls the implementation legacy or historical. Those terms do not negate authority, so retain only explicit negative-authority exemptions (or otherwise require the claim itself to be negated).</comment>
<file context>
@@ -23,40 +23,53 @@ require_pattern() {
+if [[ -n "$authority_candidates" ]]; then
+ unsupported_claims="$({
+ printf '%s\n' "$authority_candidates" | rg -v -i \
+ '(removed|legacy|historical|pre-migration|not[^[:alpha:]]{0,6}(active|authoritative|normative|source of truth|implementation target)|non[- ]normative)' || true
+ })"
+ if [[ -n "$unsupported_claims" ]]; then
</file context>
| '(removed|legacy|historical|pre-migration|not[^[:alpha:]]{0,6}(active|authoritative|normative|source of truth|implementation target)|non[- ]normative)' || true | |
| '(removed|not[^[:alpha:]]{0,6}(active|authoritative|normative|source of truth|implementation target)|non[- ]normative)' || true |
There was a problem hiding this comment.
No PR 124 code change: stacked PR #125 replaces this transitional docs/spec authority audit with the accepted-RFC/public-documentation authority gate. This filter is removed rather than carried forward.
| former_package='jazz-''next' | ||
| former_reference='jazz-''hs' | ||
| former_rewrite='jazz''2' | ||
| obsolete_identity_pattern="(${former_package}|${former_reference}|${former_rewrite})" |
There was a problem hiding this comment.
P2: Live-authority claims using JazzNext or Paths_jazz_next bypass this audit because neither spelling is in obsolete_identity_pattern. Include both obsolete identifiers so the documentation check covers every identity the repository audit removes.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/check-spec-authority.sh, line 52:
<comment>Live-authority claims using `JazzNext` or `Paths_jazz_next` bypass this audit because neither spelling is in `obsolete_identity_pattern`. Include both obsolete identifiers so the documentation check covers every identity the repository audit removes.</comment>
<file context>
@@ -23,40 +23,53 @@ require_pattern() {
+former_package='jazz-''next'
+former_reference='jazz-''hs'
+former_rewrite='jazz''2'
+obsolete_identity_pattern="(${former_package}|${former_reference}|${former_rewrite})"
+authority_claim_pattern="(${obsolete_identity_pattern}.{0,160}(active (compiler|implementation|authority|path)|authoritative|normative|source of truth|implementation target))|((active (compiler|implementation|authority|path)|authoritative|normative|source of truth|implementation target).{0,160}${obsolete_identity_pattern})"
+
</file context>
| obsolete_identity_pattern="(${former_package}|${former_reference}|${former_rewrite})" | |
| obsolete_identity_pattern="(${former_package}|${former_reference}|${former_rewrite}|[jJ]azz[Nn]ext|[Pp]aths_jazz_next)" |
There was a problem hiding this comment.
No PR 124 code change: stacked PR #125 replaces this transitional authority check, including these legacy identity assertions. This code does not survive the stack.
| - `jazz-hs/` and `jazz2/` remain read-only legacy evidence. | ||
| - Source-input behavior is implemented in `src/Jazz/CLI/Main.hs`. | ||
| - Pre-root-canonicalization behavior preserved at archive tag | ||
| `archive/pre-root-canonicalization-2026-07-31` is historical evidence only; |
There was a problem hiding this comment.
P3: The referenced archive location isn't resolvable from the doc alone: no git tag named archive/pre-root-canonicalization-2026-07-31 exists in this repo (git tag -l is empty), and only the recovery commit 1df2c5bd... mentioned in the PR description resolves. Consider adding that commit hash here so the retained historical evidence is actually locatable by anyone reading this doc, rather than a tag that may not be created.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/spec/tooling/cli-source-input.md, line 16:
<comment>The referenced archive location isn't resolvable from the doc alone: no git tag named `archive/pre-root-canonicalization-2026-07-31` exists in this repo (git tag -l is empty), and only the recovery commit `1df2c5bd...` mentioned in the PR description resolves. Consider adding that commit hash here so the retained historical evidence is actually locatable by anyone reading this doc, rather than a tag that may not be created.</comment>
<file context>
@@ -1,18 +1,20 @@
-- `jazz-hs/` and `jazz2/` remain read-only legacy evidence.
+- Source-input behavior is implemented in `src/Jazz/CLI/Main.hs`.
+- Pre-root-canonicalization behavior preserved at archive tag
+ `archive/pre-root-canonicalization-2026-07-31` is historical evidence only;
+ the archived implementation trees are absent from the current checkout.
</file context>
There was a problem hiding this comment.
No code change. The premise is false: the remote annotated tag archive/pre-root-canonicalization-2026-07-31 exists and peels to commit 1df2c5bd2524cdd52bd18e989967373e255f80d3. The referenced transitional document is also removed by stacked PR #125.
| jazzNext = pkgs.haskell.lib.enableCabalFlag | ||
| (hsPkgs.callCabal2nix "jazz-next" ./jazz-next { }) | ||
| jazz = pkgs.haskell.lib.enableCabalFlag | ||
| (hsPkgs.callCabal2nix "jazz" ./. { }) |
There was a problem hiding this comment.
P3: Pointing the cabal source at the whole repository root (./.) means the derivation and checks.jazz-test-suite now include every tracked file — docs/, programs/, editors/, benchmark/, .codex/ and root markdown — not just the compiler tree that ./jazz-next previously scoped. Any edit to a doc or README will now invalidate and fully rebuild the Nix derivation / flake check in CI, and the closure is needlessly large. Consider filtering the source with pkgs.lib.cleanSourceWith (keeping jazz.cabal, cabal.project, and src/, jazz/, app/, test/) to preserve the compiler-only purity the old ./jazz-next path gave.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At flake.nix, line 18:
<comment>Pointing the cabal source at the whole repository root (`./.`) means the derivation and `checks.jazz-test-suite` now include every tracked file — docs/, programs/, editors/, benchmark/, .codex/ and root markdown — not just the compiler tree that `./jazz-next` previously scoped. Any edit to a doc or README will now invalidate and fully rebuild the Nix derivation / flake check in CI, and the closure is needlessly large. Consider filtering the source with `pkgs.lib.cleanSourceWith` (keeping `jazz.cabal`, `cabal.project`, and `src/`, `jazz/`, `app/`, `test/`) to preserve the compiler-only purity the old `./jazz-next` path gave.</comment>
<file context>
@@ -14,8 +14,8 @@
- jazzNext = pkgs.haskell.lib.enableCabalFlag
- (hsPkgs.callCabal2nix "jazz-next" ./jazz-next { })
+ jazz = pkgs.haskell.lib.enableCabalFlag
+ (hsPkgs.callCabal2nix "jazz" ./. { })
"development";
in {
</file context>
There was a problem hiding this comment.
Fixed in 935f9e2: callCabal2nix now consumes an explicit lib.fileset containing the Cabal/package/test inputs instead of the whole repository. The evaluated source excludes .codex, README, and unrelated docs; docs/compiler/architecture.md remains because Cabal declares it. Repository audit and focused suites pass. The full Nix aggregate passed 60/61 suites; its sole known lexer timing flake passed immediately in isolation.
| | --- | --- | --- | --- | --- | --- | | ||
| | `JN-BOOTSTRAP-INTERPRETER-PROFILE-PLAN-001` | Stage the hosted Jazz bootstrap interpreter profile | `Approved closure/recursion design and executor-ready child` | The hosted lexer, parser, canonical core, typed-core and lowered-IR contract foundations, language-quality gate, and opt-in scalar/direct-call typed-core producer/lowerer are complete. Normal compile/run remains canonical-core/interpreter based. Closure/recursion is next only as a design gate; control flow, multi-module integration, LLVM, object/link, and native-runtime implementation remain unpromoted. | [2026-07-10-jazz-next-bootstrap-interpreter-profile-design.md](../superpowers/specs/2026-07-10-jazz-next-bootstrap-interpreter-profile-design.md) | `2026-07-30` | | ||
| | `JN-MODULE-REBASE-PLAN-001` | Rebase module/import execution plan onto active `jazz-next` owners | `No accepted module child after explicit export lists` | Active-path ownership is rebased onto the current resolver/compiler/runtime path. `JN-MODULE-TYPED-EXPORT-INVENTORY-001` and `JN-MODULE-EXPLICIT-EXPORT-LIST-001` landed the shared inventory plus header allowlists, local/public separation, deterministic `E4015`, compiler import filtering, and runtime publication. Re-exports, alias-qualified classes, package semantics, and further stdlib/catalog growth remain blocked behind separate contracts. | [2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md](../plans/2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md) | `2026-07-10` | | ||
| | `JN-MODULE-REBASE-PLAN-001` | Rebase module/import execution plan onto active root owners | `No accepted module child after explicit export lists` | Active-path ownership is rebased onto the current resolver/compiler/runtime path. `JN-MODULE-TYPED-EXPORT-INVENTORY-001` and `JN-MODULE-EXPLICIT-EXPORT-LIST-001` landed the shared inventory plus header allowlists, local/public separation, deterministic `E4015`, compiler import filtering, and runtime publication. Re-exports, alias-qualified classes, package semantics, and further stdlib/catalog growth remain blocked behind separate contracts. | [2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md](../plans/2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md) | `2026-07-10` | |
There was a problem hiding this comment.
P3: The JN-MODULE-REBASE row title now reads "onto active root owners", but the rest of this canonicalization pass (JN-PURITY-EFFECT and JN-ABSTRACTION rows, entry template src/Jazz/) uses Jazz for the same active compiler. For a PR whose goal is unifying naming, keeping two different labels points at the same root-path target is inconsistent; consider aligning this title to Jazz (e.g. "onto active Jazz owners").
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/execution/queue.md, line 48:
<comment>The JN-MODULE-REBASE row title now reads "onto active root owners", but the rest of this canonicalization pass (JN-PURITY-EFFECT and JN-ABSTRACTION rows, entry template `src/Jazz/`) uses `Jazz` for the same active compiler. For a PR whose goal is unifying naming, keeping two different labels points at the same root-path target is inconsistent; consider aligning this title to `Jazz` (e.g. "onto active `Jazz` owners").</comment>
<file context>
@@ -45,14 +45,14 @@ target and no named candidate currently.
| --- | --- | --- | --- | --- | --- |
| `JN-BOOTSTRAP-INTERPRETER-PROFILE-PLAN-001` | Stage the hosted Jazz bootstrap interpreter profile | `Approved closure/recursion design and executor-ready child` | The hosted lexer, parser, canonical core, typed-core and lowered-IR contract foundations, language-quality gate, and opt-in scalar/direct-call typed-core producer/lowerer are complete. Normal compile/run remains canonical-core/interpreter based. Closure/recursion is next only as a design gate; control flow, multi-module integration, LLVM, object/link, and native-runtime implementation remain unpromoted. | [2026-07-10-jazz-next-bootstrap-interpreter-profile-design.md](../superpowers/specs/2026-07-10-jazz-next-bootstrap-interpreter-profile-design.md) | `2026-07-30` |
-| `JN-MODULE-REBASE-PLAN-001` | Rebase module/import execution plan onto active `jazz-next` owners | `No accepted module child after explicit export lists` | Active-path ownership is rebased onto the current resolver/compiler/runtime path. `JN-MODULE-TYPED-EXPORT-INVENTORY-001` and `JN-MODULE-EXPLICIT-EXPORT-LIST-001` landed the shared inventory plus header allowlists, local/public separation, deterministic `E4015`, compiler import filtering, and runtime publication. Re-exports, alias-qualified classes, package semantics, and further stdlib/catalog growth remain blocked behind separate contracts. | [2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md](../plans/2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md) | `2026-07-10` |
+| `JN-MODULE-REBASE-PLAN-001` | Rebase module/import execution plan onto active root owners | `No accepted module child after explicit export lists` | Active-path ownership is rebased onto the current resolver/compiler/runtime path. `JN-MODULE-TYPED-EXPORT-INVENTORY-001` and `JN-MODULE-EXPLICIT-EXPORT-LIST-001` landed the shared inventory plus header allowlists, local/public separation, deterministic `E4015`, compiler import filtering, and runtime publication. Re-exports, alias-qualified classes, package semantics, and further stdlib/catalog growth remain blocked behind separate contracts. | [2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md](../plans/2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md) | `2026-07-10` |
| `JN-USER-DEFINED-OPERATORS-PLAN-001` | Stage user-defined operator work beyond frozen v1 operators | `No accepted operator child after custom associativity` | Stage 2 fixed-tier declarations, same-source executable function bindings, operator-specific adjacent signatures, custom numeric precedence, and explicit `left`/`right`/`nonassoc` associativity are complete for parser declaration recognition, source-unit-local metadata, fixed-tier parsing, custom `precedence 1..99` parsing, diagnostics, ordinary callable `(op) = <expr>.` bindings, infix use, bare operator values, left sections, right sections, recursive local bindings, signature-constrained hidden bindings, non-associative same-precedence chain rejection, and module replay isolation without user-visible operator imports or exports. Runtime overload dispatch, cross-module operator binding APIs, and new built-in operators remain blocked until separate executable contracts exist. | [15-operator-fixity-and-sections.md](../plans/spec-clarification/2026-03-03/syntax/15-operator-fixity-and-sections.md) | `2026-07-08` |
| `JN-TYPE-GRAMMAR-CLOSURE-PLAN-001` | Plan type-system expansion beyond rebase closure | `No accepted type-solver child after runtime evidence` | The broad type-solver coordination contract is accepted and recorded as `JN-TYPE-SOLVER-CONTRACT-001`. Ordinary-binding schemes/per-use instantiation, solver-backed variable constrained-signature schemes, inferred class constraints from strict equality and qualified method requirements, final defaulting/ambiguity diagnostics, explicit type application, and compiler-owned runtime evidence have landed. No remaining accepted child is source-backed; the umbrella stays blocked until a new concrete type-system contract names target paths and focused verification. | [2026-03-18-jazz-next-type-grammar-and-signature-rebase-plan.md](../plans/2026-03-18-jazz-next-type-grammar-and-signature-rebase-plan.md) | `2026-07-08` |
</file context>
| | `JN-MODULE-REBASE-PLAN-001` | Rebase module/import execution plan onto active root owners | `No accepted module child after explicit export lists` | Active-path ownership is rebased onto the current resolver/compiler/runtime path. `JN-MODULE-TYPED-EXPORT-INVENTORY-001` and `JN-MODULE-EXPLICIT-EXPORT-LIST-001` landed the shared inventory plus header allowlists, local/public separation, deterministic `E4015`, compiler import filtering, and runtime publication. Re-exports, alias-qualified classes, package semantics, and further stdlib/catalog growth remain blocked behind separate contracts. | [2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md](../plans/2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md) | `2026-07-10` | | |
| | `JN-MODULE-REBASE-PLAN-001` | Rebase module/import execution plan onto active `Jazz` owners | `No accepted module child after explicit export lists` | Active-path ownership is rebased onto the current resolver/compiler/runtime path. `JN-MODULE-TYPED-EXPORT-INVENTORY-001` and `JN-MODULE-EXPLICIT-EXPORT-LIST-001` landed the shared inventory plus header allowlists, local/public separation, deterministic `E4015`, compiler import filtering, and runtime publication. Re-exports, alias-qualified classes, package semantics, and further stdlib/catalog growth remain blocked behind separate contracts. | [2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md](../plans/2026-03-18-jazz-next-runtime-architecture-and-interpreter-execution-plan.md) | `2026-07-10` | |
There was a problem hiding this comment.
No PR 124 code change: docs/execution/queue.md is deleted in stacked PR #125 when private execution state moves out of public docs, so this wording does not survive the stack.
| ) | ||
|
|
||
| def test_repeated_obsolete_identity_claims_are_evaluated_independently(self) -> None: | ||
| obsolete_identity = "jazz-" + "hs" |
There was a problem hiding this comment.
P3: The name test_repeated_obsolete_identity_claims_are_evaluated_independently promises independent handling of multiple claims, but the combined sentence stays a single clause (no boundary chars), so it only repeats the negation-scoping case already covered by test_negated_claim_does_not_hide_later_positive_claim. Either split the fixture into separate clauses (e.g., two . -terminated sentences) so independence is actually exercised, or rename the test to match what it verifies.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/test_check_legacy_doc_claims.py, line 89:
<comment>The name `test_repeated_obsolete_identity_claims_are_evaluated_independently` promises independent handling of multiple claims, but the combined sentence stays a single clause (no boundary chars), so it only repeats the negation-scoping case already covered by `test_negated_claim_does_not_hide_later_positive_claim`. Either split the fixture into separate clauses (e.g., two `. `-terminated sentences) so independence is actually exercised, or rename the test to match what it verifies.</comment>
<file context>
@@ -0,0 +1,224 @@
+ )
+
+ def test_repeated_obsolete_identity_claims_are_evaluated_independently(self) -> None:
+ obsolete_identity = "jazz-" + "hs"
+ source = (
+ f"It is false that {obsolete_identity} remains read-only and "
</file context>
There was a problem hiding this comment.
No PR 124 code change: this migration-only checker regression suite is deleted with the checker in stacked PR #125, so the duplicated test case does not survive the stack.
| generated_artifact_pattern='generatedjs|generated js|js output|javascript output|javascript generation|codegen placeholder' | ||
| reject_pattern "jazz-next must not reference JavaScript generation artifacts" "$generated_artifact_pattern" jazz-next | ||
| reject_pattern "active compiler sources must not reference JavaScript generation artifacts" "$generated_artifact_pattern" src jazz test |
There was a problem hiding this comment.
P3: This widened reject_pattern now does case-insensitive whole-tree substring matching for generic phrases like js output, javascript generation, and codegen placeholder across every file in src/, jazz/, and test/. Any future comment or .jz doc describing a JS backend or a codegen placeholder (legitimate content unrelated to legacy naming) will trip the docs gate with no way to exempt it, making the check brittle and hard to maintain. Consider scoping the scan to legacy-identity references (e.g. only flagging these phrases when adjacent to removed tree names) or allowing an explicit allowlist/annotation so the gate survives unrelated JS-backend notes.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/check-docs.sh, line 85:
<comment>This widened reject_pattern now does case-insensitive whole-tree substring matching for generic phrases like `js output`, `javascript generation`, and `codegen placeholder` across every file in `src/`, `jazz/`, and `test/`. Any future comment or .jz doc describing a JS backend or a codegen placeholder (legitimate content unrelated to legacy naming) will trip the docs gate with no way to exempt it, making the check brittle and hard to maintain. Consider scoping the scan to legacy-identity references (e.g. only flagging these phrases when adjacent to removed tree names) or allowing an explicit allowlist/annotation so the gate survives unrelated JS-backend notes.</comment>
<file context>
@@ -62,13 +64,27 @@ require_pattern "docs/execution/done-archive.md" "done archive heading" '^# Exec
+ docs/spec docs/jazz-language-state.md
generated_artifact_pattern='generatedjs|generated js|js output|javascript output|javascript generation|codegen placeholder'
-reject_pattern "jazz-next must not reference JavaScript generation artifacts" "$generated_artifact_pattern" jazz-next
+reject_pattern "active compiler sources must not reference JavaScript generation artifacts" "$generated_artifact_pattern" src jazz test
reject_pattern "active compile docs must not expose generated-JS artifact naming" "$generated_artifact_pattern" \
docs/execution/queue.md \
</file context>
There was a problem hiding this comment.
No PR 124 code change: stacked PR #125 replaces check-docs.sh and removes this broad generated-artifact scan entirely. The brittle matcher does not survive the stack.
|
Skipping CodeAnt AI review — this PR changes more than 100 files, which usually means a migration, codemod, or vendored drop. Line-level review on diffs this large produces duplicate findings on the same rewrite pattern and drowns out anything that actually matters. If you still want a review, comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 935f9e26b8
ℹ️ 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".
| PERFORMANCE.md | ||
| programs/README.md | ||
|
|
||
| extra-source-files: |
There was a problem hiding this comment.
Include repository-audit inputs in the source distribution
When the generated source archive is unpacked and tested, repository-audit-spec runs testCanonicalRepositoryInfrastructure, which reads flake.nix, .gitignore, AGENTS.md, the cabal.project* files, and the scripts listed in infrastructurePaths. None of those files are declared under extra-source-files, so Cabal omits them from the source distribution and the test fails on its first missing-file read. Add these audit inputs to the distribution or exclude this repository-only audit from packaged tests.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in e24f999. jazz.cabal now packages .gitignore, AGENTS.md, flake.nix, the Cabal project files, and the Python/shell audit scripts through extra-source-files, so repository-audit-spec has all of its runtime inputs in an sdist. The script globs also accommodate PR 125 replacing checker scripts without stale exact-file entries. I reproduced the failure from an unpacked archive, regenerated the archive, and all 31 RepositoryAudit tests passed there; cabal check was clean and the full Nix aggregate passed 61/61 suites.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e24f999edc
ℹ️ 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".
| directly_negated = any( | ||
| negation.start() <= positive_claim.start() < negation.end() | ||
| for pattern in _NEGATED_STATUS_PATTERNS | ||
| for negation in pattern.finditer(clause) |
There was a problem hiding this comment.
Limit negation to the claim it actually negates
When one clause contains a negated status followed by a live claim, such as jazz-hs does not remain read-only and jazz2 remains read-only in the current checkout, the greedy negation match extends through the second read-only; the overlap test therefore treats both positive matches as negated and returns no violation. This lets the new documentation gate accept exactly the obsolete live-tree claim it is intended to reject, so the negation must be associated with its own subject/status rather than any later positive match in the clause.
AGENTS.md reference: AGENTS.md:L7-L11
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Confirmed on PR 124: the greedy negation matcher spans from the first does not through the later read-only, so the report is valid. The focused reproduction returned no violation for the mixed-subject sentence while rejecting the positive control. No PR 124 code change: stacked PR 125 deletes scripts/check_legacy_doc_claims.py, its test suite, and its caller. This also duplicates the earlier Cubic thread on the same subject/status bug; patching the deleted parser here would create dead work in the immediate successor.
| printf '%s\n' "$authority_candidates" | rg -v -i \ | ||
| '(removed|legacy|historical|pre-migration|not[^[:alpha:]]{0,6}(active|authoritative|normative|source of truth|implementation target)|non[- ]normative)' || true |
There was a problem hiding this comment.
Do not exempt the entire authority claim by keyword
If a candidate line contains any exemption word, the inverted filter discards the whole line even when that same line makes a positive authority claim; for example, Although it is a historical tree, jazz-hs is the authoritative source of truth matches authority_claim_pattern but is removed solely because it contains historical. The check then exits successfully despite the invalid authority assignment, so exemptions need to be scoped to a genuinely negated or historical claim rather than applied line-wide.
AGENTS.md reference: AGENTS.md:L17-L18
Useful? React with 👍 / 👎.
Summary
Canonicalizes Jazz around the active compiler and removes obsolete repository structure.
jazz-hs/andjazz2/legacy implementationsjazz-next/into the repository rootJazzNext/jazz-nexttoJazz/jazzCompiler semantics are unchanged. This is a structural and identity migration with regression coverage and both ordinary and extended behavioral-equivalence verification.
Recovery point
The complete pre-migration repository is preserved by the annotated tag:
archive/pre-root-canonicalization-2026-07-31The tag peels locally and remotely to
1df2c5bd2524cdd52bd18e989967373e255f80d3.Validation
Ordinary gate
cabal build all: passedcabal run jazz -- --help: passed with the canonical CLI identitycabal check: passed with no warnings or errorsnix flake check: passed, includingchecks.aarch64-darwin.jazz-test-suitegit diff --check: passedOne-time extended migration gate
These checks were run once for this migration and are intentionally not added to routine CI:
+full-parser-scale: passed, including all four exhaustive componentscabal bench jazz-bench --benchmark-options='--jazz-smoke': passedKnown pre-existing verification concerns
Stack
This draft PR is intentionally stacked on #123 (
codex/repository-productization-design). Review the design base first; after it lands, this PR can be retargeted tomainwithout changing its commits.Superseded instructions PR
PR #9 contains old-layout Copilot instructions referencing
jazz-hs/,jazz2/,jazz-next/, andJazzNext.*. It is superseded by this canonical layout and should be closed separately by a maintainer rather than merged.Summary by cubic
Canonicalizes the repository on the active compiler by promoting
jazz-nextto the rootjazzpackage and deleting legacy implementations. No semantic changes; paths, namespaces, and docs now use the canonical layout.Refactors
jazz-hs/andjazz2/; active code now lives insrc/,jazz/,app/, andtest/.jazz-next→jazz,JazzNext.*→Jazz.*,Paths_jazz_next→Paths_jazz.Jazz.*(e.g.,app/Main.hs,benchmark/*).cabal.project*now targetspackage jazz;flake.nixbuildsjazzfrom a tight fileset, packages repository audit inputs, and exposeschecks.jazz-test-suite.dist-newstyle//benchmark-results//profile-results/in.gitignore; addedwebsite/ignores; VS Code extension now undereditors/vscode-jazz/.archive/pre-root-canonicalization-2026-07-31.Migration
jazz-next/...to root paths (src/,jazz/,app/,test/).cabal build allandcabal test all --test-show-details=failures(run from repo root).checks.jazz-test-suite.Jazz.*modules andPaths_jazz.archive/pre-root-canonicalization-2026-07-31.Written for commit e24f999. Summary will update on new commits.