Skip to content

docs: complete the Action rename and anchor release dates to git tags - #182

Open
flyingrobots wants to merge 4 commits into
mainfrom
docs/action-rename-upkeep
Open

docs: complete the Action rename and anchor release dates to git tags#182
flyingrobots wants to merge 4 commits into
mainfrom
docs/action-rename-upkeep

Conversation

@flyingrobots

Copy link
Copy Markdown
Owner

Plain-English Walkthrough

TL;DR

Documentation upkeep that turned into three linked findings. The workspace-wide
IntentAction rename missed a topic shelf and was never recorded in the
changelog even though it breaks two contracts. Release dates across the repo
described a planned schedule rather than what actually shipped. And the tests
meant to prevent that second problem could not have caught it, because they
compared two generated copies of the same field against each other.

Contract-visible results: the intentaction break is now documented as
breaking for both surface syntax and the canonical CBOR ABI; all eleven release
dates match the tags that published them; and cargo xtask release-dates
reconciles those dates against git for-each-ref refs/tags inside the local
gate. Net −555 / +237 lines in the guard rework.

No library, schema, or golden artifact behavior changes. No issues are closed by
this PR.

Walkthrough

What was already broken

Commit 9f1a11e0 renamed Intent to Action across 108 files. It was a clean
substitution — 905 insertions, 905 deletions — but it left three problems.

First, docs/topics/target-ir/README.md does not appear in that commit's file
list at all [claim:target-ir-missed, confidence:1.00]. It carried six
occurrences of the old term and zero of the new one, so the shelf described a
Core intent that no longer exists. docs/topics/target-ir/test-plan.md was
worse in a subtle way: its evidence test names were renamed correctly while
the prose around them was not, leaving oracles that read "preserve … intent
input constraints" directly beside evidence named
action_constraints_and_budget_are_preserved_in_echo_span_ir.

The local gate could not see this. contract-check verifies that evidence names
resolve to real test functions, that links resolve, and that fixture paths
exist — all of which still held, because the test names were correct. This is
the split DOCS-REQ-006 describes: deterministic checks for software facts,
human review for reader-task quality.

Second, the rename was never logged. It rewrote historical changelog entries in
place but added no Unreleased entry, and it is breaking twice over. The
declaration keyword changed from intent to action, so existing .edict
sources no longer parse [claim:keyword-break, confidence:1.00]. The canonical
CBOR map key changed from intents to actions in both edict.core/v1 and
edict.target-ir.artifact/v1, which moved every derived digest
[claim:abi-key-break, confidence:1.00].

That second break is easy to miss on review, and the reason is worth stating
plainly: intents and actions are both seven characters, so the canonical
fixtures show Bin 1478 -> 1478 bytes in the diff stat. Nothing in the byte
column signals a wire change. Only the .sha256 files do.

Release dates described a plan, not a history

Every release heading in CHANGELOG.md was months later than the tag that
published it [claim:date-drift, confidence:1.00]:

Version CHANGELOG (before) Tag (actual)
v0.9.0-alpha.1 2026-10-07 2026-06-28
v0.10.0-alpha.1 2026-10-21 2026-06-29
v0.11.0-alpha.1 2026-11-04 2026-06-30

These were not typos. release-prep writes the heading from a target_date
field at scaffold time, and nothing back-fills the real date after tagging. The
dates were a planned biweekly cadence; the releases shipped roughly four months
early. Keep a Changelog, which CHANGELOG.md claims to follow, defines that
heading as the release date.

All eleven now match their tags, across four surfaces: the changelog headings,
the target_date fields in policy.toml, the Target date: lines in
docs/releases/*.md, and the xtask guards that pinned them.

Why the existing guard could not have caught it

alpha_changelog_dates_match_release_policy asserted that changelog dates
equalled policy.toml target dates. Both are generated from the same field, so
the assertion compared a copy against its own source
[claim:guard-tautology, confidence:0.95].

The diagram below shows why that arrangement is unfalsifiable: every arrow the
guard checked flows out of one origin, and the only independent record of when a
release happened was never consulted.

flowchart LR
    TD["policy.toml<br/>target_date"] -->|release-prep writes| CL["CHANGELOG.md<br/>heading date"]
    TD -->|release-prep writes| RN["docs/releases/*.md<br/>Target date:"]
    TD -.->|"old guard compared<br/>source against copy"| CL
    GIT["git tags<br/>actual publication date"] -.-> NEVER["not an input to<br/>any assertion"]
Loading
Caption: One source, two copies, and an unconsulted authority
  1. target_date is written once at scaffold time by release-prep.
  2. The changelog heading and the release-notes line are both generated from it.
  3. The old guard compared those two generated copies against each other.
  4. The git tag — the only record of when publication actually occurred — was
    never an input to any assertion.

Two copies written from one source always agree, including when that source is
wrong. The guard stayed green through four months of drift across all eleven
releases, and only failed once a human corrected one side by hand. It detected
intervention, not incorrectness.

The nine release_policy_tracks_v0_N_boundary tests had a separate defect: they
matched substrings against the whole policy file rather than the release's own
block. Setting v0.3's target_date to 1999-01-01 leaves
release_policy_tracks_v0_3_boundary passing, because v0.4 carries the same
date string [claim:substring-false-pass, confidence:1.00]. Releases tagged on
the same day legitimately share dates, so this is the normal case rather than a
corner case. They were also roughly 250 lines of frozen-history boilerplate,
auto-written by a generator, asserting that a static file still contained
strings someone had typed.

The replacement

The new check compares recorded dates against the tags, so the authority is
outside the system that writes the dates.

flowchart LR
    GIT["git for-each-ref<br/>refs/tags"] --> R{{"reconcile_release_dates<br/>(pure)"}}
    POL["policy.toml<br/>target_date"] --> R
    CL["CHANGELOG.md"] --> R
    RN["docs/releases/*.md"] --> R
    R -->|date contradicts tag| D["drift → fails gate"]
    R -->|surface absent| G["gap → reported, passes"]
Loading
Caption: Reconciliation inputs and the two outcome classes
  1. Tag dates enter as the reference, not as one more comparable copy.
  2. All three recorded surfaces are compared against that reference.
  3. A recorded date that contradicts its tag is drift and fails the gate.
  4. An absent surface is a gap: reported on stdout, does not fail.

The drift / gap split is not cosmetic. Running the check for the first time
flagged that v0.1.0-alpha.1 has no policy block — which is true, and is
history, because that release predates the structured policy. A check that fails
on correct history gets switched off, so absence is reported without blocking
while contradictions still fail.

Splitting the pure reconcile_release_dates from the I/O in release_dates
matters for CI. ci.yml runs cargo test --workspace behind an
actions/checkout with no fetch-depth, which is a shallow clone without tags
[claim:ci-shallow, confidence:0.95]. The unit tests therefore take already-read
inputs and need no git, while the git-dependent reconciliation runs in
cargo xtask verify and in the release workflows, which do set fetch-depth: 0.

The eleven per-release guards collapse into one data-driven test over parsed
blocks, plus a regression guard that pins the false-pass above. Per-release
scope and non-goal content is now reviewed rather than string-tested, matching
the repo's own rule that policy detail is not encoded as a Rust test; the ten
affected requirement and test-case rows move to policy status accordingly.
That is a reduction in claimed coverage matching a reduction in actual
coverage that was always there.

Before After
alpha_changelog_dates_match_release_policy, hardcoded 10-row date table cargo xtask release-dates, zero hardcoded dates
10 × release_policy_tracks_v0_N_boundary, file-global contains() 1 × release_policy_blocks_are_structurally_complete, block-scoped
release_policy_block_parsing_scopes_fields_to_their_own_release
reconcile_release_dates + 2 hermetic tests

release-prep no longer scaffolds Rust test stubs or changelog date guard
entries, and policy.toml's scaffold_outputs list drops the two removed
entries.

Verification and known gaps

Both failure modes were negative-tested before the check was wired in. Corrupting
only the changelog date — the exact drift the old guard slept through — and
corrupting a single block's target_date each fail with a message naming the
tag and both dates [claim:new-check-catches, confidence:1.00]. The full local
gate passes [claim:gate-green, confidence:1.00].

Two gaps are recorded in the release-process test plan rather than left implicit:

  1. next_release_target_date still seeds the next value as last entry + 14
    days
    , which from the realigned history computes 2026-07-14 — already past
    [claim:stale-seed, confidence:0.95]. release-prep needs an explicit or
    clock-derived date. This now fails loudly at release time via
    release-dates instead of silently baking in another wrong date. Deciding
    the replacement seeding is follow-up work, not part of this PR.
  2. Nothing mechanically checks that a block's declared scope matches what the
    release actually shipped. That was equally true before; the removed tests
    only checked that the strings were present.

Compatibility

The breaking changes described here landed in 9f1a11e0 and are documented, not
introduced, by this PR. Because they remain unreleased, the next release should
carry them prominently: under 0.x a minor bump (v0.12.0-alpha.1) conventionally
carries a break, and previously published digests do not survive the ABI key
change.

Appendix: Citations
Claim Evidence Confidence Notes
claim:target-ir-missed git show --stat 9f1a11e0 -- docs/topics/target-ir/README.md → empty output; fixed at docs/topics/target-ir/README.md#57@66188d56 and #81@66188d56 1.00 The file is absent from the rename commit's file list.
claim:keyword-break crates/edict-syntax/src/parser.rs#788@66188d56 (self.expect_kw("action")?); git show 9f1a11e0^:crates/edict-syntax/src/parser.rs line 788 → self.expect_kw("intent")? 1.00 Before/after inspection of the same line in the parser.
claim:abi-key-break docs/abi/edict-core.cddl#13@66188d56 (actions: { + tstr => core-action }); docs/abi/edict-target-ir.cddl#26@66188d56; git show --stat 9f1a11e0 -- fixtures/core/canonical/bounded-hello.core.sha256 → 1 insertion, 1 deletion 1.00 CDDL key plus a moved checked digest fixture.
claim:date-drift git for-each-ref --format='%(refname:short) %(creatordate:short)' refs/tags → v0.9.0-alpha.1 2026-06-28, v0.10.0-alpha.1 2026-06-29, v0.11.0-alpha.1 2026-06-30, against pre-change CHANGELOG headings 2026-10-07 / 2026-10-21 / 2026-11-04 1.00 Annotated tag creation dates versus the recorded headings.
claim:guard-tautology xtask/src/release_prep.rs#199@66188d56 writes ## [{tag}] - {target_date}; xtask/src/release_prep.rs#251@66188d56 writes Target date: {target_date}; the removed guard compared those two outputs 0.95 Source inspection of the generator; no independent executable witness of the historical false-negative.
claim:substring-false-pass Reproduced against docs/topics/release-process/policy.toml@7aae09af: rewriting only v0.3's target_date to 1999-01-01 leaves all assertions of release_policy_tracks_v0_3_boundary satisfied, because v0.4 supplies the expected target_date = "2026-06-24" string 1.00 Executed reproduction against the committed policy file.
claim:new-check-catches release_date_reconciliation_reports_drift_and_gaps and release_date_reconciliation_accepts_dates_matching_their_tags in xtask/src/tests.rs#2822@66188d56 and #2875@66188d56; release_policy_block_parsing_scopes_fields_to_their_own_release at #2784@66188d56 1.00 Hermetic tests over reconcile_release_dates, plus the pinned false-pass regression.
claim:gate-green cargo xtask verify → all stages pass in 9s, ending release-dates: 11 tag(s) reconciled against git, 1 uncovered surface(s); cargo test -p xtask → 69 passed, 0 failed; markdownlint-cli2 → 0 errors 1.00 Full local gate including clippy -D warnings under pedantic.
claim:ci-shallow .github/workflows/ci.yml#28@66188d56 uses actions/checkout with only persist-credentials: false; release.yml#30@66188d56 and auto-release-tag.yml#44@66188d56 both set fetch-depth: 0 0.95 Inferred from actions/checkout defaulting to depth 1 without tags; not independently executed in CI.
claim:stale-seed xtask/src/release_prep.rs#383@66188d56 (add_days_to_iso_date(&latest, 14)); latest target_date after realignment is 2026-06-30, giving 2026-07-14 0.95 Arithmetic from source; not executed, since running release-prep would scaffold a release.

Follows the Kitten architecture where 'Action' replaces 'Intent' as the
Edict-compiled graph rewrite rule, avoiding collision with teleological Kitten 'Intent'.
The workspace-wide Intent -> Action rename in 9f1a11e missed
docs/topics/target-ir/README.md entirely and left stale prose in
docs/topics/target-ir/test-plan.md, where sentences still said "intent"
next to already-renamed evidence names such as
action_constraints_and_budget_are_preserved_in_echo_span_ir. The
contract-check gate could not catch this: link, evidence-name, and
fixture-path checks all still resolved, which is exactly the
deterministic-vs-human split DOCS-REQ-006 describes.

Also records the rename in the Unreleased CHANGELOG, which had rewritten
historical entries in place but never logged the change itself. It is
breaking twice over: the `action` declaration keyword replaces `intent`
in surface syntax, and the canonical CBOR map key is now `actions`, which
moved the reviewed Core and Target IR golden digests.

Refreshes the documentation coverage matrix cell that was gated on
"once #21 lands"; #21 and #20 both closed on 2026-06-24, so the
first-success path is now an admitted gap rather than pending work. That
cell was the only one in the matrix keyed to an issue number instead of a
capability, per DOCS-REQ-005.

docs-impact: documentation only; no behavior, schema, or fixture change.
Verified with markdownlint (0 errors), cargo xtask contract-check
(23 shelves), and cargo xtask target-ir-goldens --check (2 cases).

BREAKING CHANGE: the `action` keyword replaces `intent` in Edict surface
syntax, and the canonical CBOR action-map key is now `actions` in
edict.core/v1 and edict.target-ir.artifact/v1. Previously published
digests do not carry over.
CHANGELOG release headings recorded a planned biweekly schedule running
2026-06-24 through 2026-11-04, while every tag was actually cut between
2026-06-21 and 2026-06-30. The dates were never a typo: release-prep
writes "## [{tag}] - {target_date}" at scaffold time from
next_release_target_date(), and nothing back-filled the real date after
tagging. Keep a Changelog, which this file claims to follow, defines that
heading as the release date.

Realigns all four surfaces that carry the dates:

- CHANGELOG.md: 11 release headings
- docs/topics/release-process/policy.toml: 10 target_date fields
- docs/releases/*.md: 11 "Target date" lines
- xtask/src/tests.rs: the alpha_changelog_dates_match_release_policy
  table and the nine release_policy_tracks_v0_N_boundary guards

The synthetic temp-repo fixtures in xtask/src/tests.rs keep their
original dates; their values are load-bearing for the +14 scaffolding
arithmetic and describe no real release.

target_date keeps its field name but now holds the actual publication
date, so RELEASE-REQ-008, its fixture oracle, and RELEASE-TP-004 are
restated to say so rather than describing a planned date.

Known gap, recorded in the release-process test plan:
next_release_target_date still adds 14 days to the last entry, which now
seeds 2026-07-14, already past. release-prep needs an explicit or
clock-derived date before the next release.

docs-impact: documentation and release-guard fixtures only; no library,
schema, or golden artifact change. Verified with cargo xtask verify
(full gate, 52s), 76 xtask tests, contract-check 23 shelves, and
markdownlint 0 errors.
…pies

The release date guards were fragile and largely tautological.

alpha_changelog_dates_match_release_policy asserted that CHANGELOG.md
dates equalled policy.toml target_date values, but release-prep generates
both from that one field. Two copies written from a single source always
agree, including when the source is wrong, so the guard stayed green
through four months of drift across all eleven releases and only failed
once a human corrected one side by hand. It detected intervention, not
incorrectness.

The nine release_policy_tracks_v0_N_boundary tests (plus v0_2) matched
substrings against the whole policy file rather than the release's own
block. Verified: setting v0.3's target_date to 1999-01-01 left
release_policy_tracks_v0_3_boundary passing, because v0.4 carried the same
date string. Releases tagged on the same day share dates, so that is the
normal case. They were also ~250 lines of frozen-history boilerplate,
auto-written by a generator, asserting that a static file still contained
strings someone typed.

Replaces them with:

- `cargo xtask release-dates`, which reconciles policy.toml, CHANGELOG.md,
  and docs/releases/*.md against `git for-each-ref refs/tags` -- the
  independent authority for when a release happened. Wired into
  `xtask verify`. Date contradictions fail; absent surfaces are reported
  as uncovered rather than failing an otherwise-correct history, since the
  earliest releases predate these surfaces. A clone without tags says it
  skipped instead of passing vacuously.
- release_policy_blocks_are_structurally_complete, one data-driven test
  over parsed blocks, replacing eleven near-duplicates.
- release_policy_block_parsing_scopes_fields_to_their_own_release, a
  regression guard pinning the 1999-01-01 false-pass.
- reconcile_release_dates, a pure function over already-read inputs, with
  hermetic tests. cargo test needs no git tags, so CI's shallow checkout
  is unaffected.

release-prep no longer scaffolds Rust test stubs or changelog date guard
entries. Per-release scope and non-goal content is now reviewed rather
than string-tested, matching the repo's own rule in
docs/topics/documentation/test-plan.md that policy detail is not encoded
as a Rust test; the ten affected requirement and test-case rows move to
`policy` status accordingly.

docs-impact: release-process README, test plan, and policy.toml updated
with the new design and two recorded open gaps. Verified with cargo xtask
verify (full gate, 9s), 69 xtask tests, and markdownlint 0 errors.
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 122 files, which is 22 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.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e10524c0-f2a8-4f4a-b858-3ac065310727

📥 Commits

Reviewing files that changed from the base of the PR and between df80f92 and 66188d5.

⛔ Files ignored due to path filters (1)
  • fixtures/providers/components/lowerer.component.wasm is excluded by !**/*.wasm
📒 Files selected for processing (122)
  • ARCHITECTURE.md
  • CHANGELOG.md
  • EDICT.md
  • README.md
  • ROADMAP.md
  • crates/edict-cli/src/main.rs
  • crates/edict-cli/tests/jsonl_cli.rs
  • crates/edict-provider-host-wasmtime/tests/invocation.rs
  • crates/edict-provider-schema/tests/provider_contract_pack.rs
  • crates/edict-provider-schema/tests/registry.rs
  • crates/edict-syntax/src/ast.rs
  • crates/edict-syntax/src/canonical.rs
  • crates/edict-syntax/src/compiler.rs
  • crates/edict-syntax/src/core_ir.rs
  • crates/edict-syntax/src/highlight.rs
  • crates/edict-syntax/src/lib.rs
  • crates/edict-syntax/src/parser.rs
  • crates/edict-syntax/src/semantic.rs
  • crates/edict-syntax/src/target_ir.rs
  • crates/edict-syntax/tests/authority_facts.rs
  • crates/edict-syntax/tests/authority_facts_cbor.rs
  • crates/edict-syntax/tests/canonical_encoding.rs
  • crates/edict-syntax/tests/common/mod.rs
  • crates/edict-syntax/tests/compiler_spine.rs
  • crates/edict-syntax/tests/contract_bundle.rs
  • crates/edict-syntax/tests/core_golden_fixtures.rs
  • crates/edict-syntax/tests/parse_control_flow.rs
  • crates/edict-syntax/tests/parse_greeting.rs
  • crates/edict-syntax/tests/parse_hello.rs
  • crates/edict-syntax/tests/parse_keywords.rs
  • crates/edict-syntax/tests/parse_loops.rs
  • crates/edict-syntax/tests/parse_negative.rs
  • crates/edict-syntax/tests/parse_review_regressions.rs
  • crates/edict-syntax/tests/parse_variants.rs
  • crates/edict-syntax/tests/provider_invocation.rs
  • crates/edict-syntax/tests/provider_lowering.rs
  • crates/edict-syntax/tests/semantic_validation.rs
  • crates/edict-syntax/tests/target_ir.rs
  • docs/DESIGN_runtime-neutral-edict-sha-lock-assurance.md
  • docs/REQUIREMENTS.md
  • docs/RETRO_phase1-parser.md
  • docs/SPEC_edict-language-v1.md
  • docs/SPEC_edict-lawpack-abi-v1.md
  • docs/SPEC_edict-target-profile-abi-v1.md
  • docs/TECHNICAL_EXPLANATION.md
  • docs/abi/edict-common.cddl
  • docs/abi/edict-core.cddl
  • docs/abi/edict-target-ir.cddl
  • docs/audit/2026-06-28_code-quality.md
  • docs/audit/2026-06-28_documentation-quality.md
  • docs/design/authority-fact-governance.md
  • docs/design/canonical-target-ir-v0.11.md
  • docs/design/obstruction-strands-v0.md
  • docs/releases/v0.1.0-alpha.1.md
  • docs/releases/v0.10.0-alpha.1.md
  • docs/releases/v0.11.0-alpha.1.md
  • docs/releases/v0.2.0-alpha.1.md
  • docs/releases/v0.3.0-alpha.1.md
  • docs/releases/v0.4.0-alpha.1.md
  • docs/releases/v0.5.0-alpha.1.md
  • docs/releases/v0.6.0-alpha.1.md
  • docs/releases/v0.7.0-alpha.1.md
  • docs/releases/v0.8.0-alpha.1.md
  • docs/releases/v0.9.0-alpha.1.md
  • docs/topics/compiler-spine/README.md
  • docs/topics/compiler-spine/test-plan.md
  • docs/topics/core-ir/README.md
  • docs/topics/core-ir/canonical-encoding.md
  • docs/topics/core-ir/test-plan.md
  • docs/topics/developer-tooling/test-plan.md
  • docs/topics/documentation/README.md
  • docs/topics/obstruction-strands/README.md
  • docs/topics/release-process/README.md
  • docs/topics/release-process/policy.toml
  • docs/topics/release-process/test-plan.md
  • docs/topics/semantic-validation/README.md
  • docs/topics/semantic-validation/test-plan.md
  • docs/topics/syntax/README.md
  • docs/topics/syntax/test-plan.md
  • docs/topics/target-ir/README.md
  • docs/topics/target-ir/test-plan.md
  • editors/vscode/syntaxes/edict.tmLanguage.json
  • fixtures/bundle/assembly/bounded-hello.bundle-digests.txt
  • fixtures/cli/01-source-ok/request.jsonl
  • fixtures/cli/05-path-input-ok/inputs/hello.edict
  • fixtures/cli/06-directory-expansion-ok/inputs/a.edict
  • fixtures/cli/06-directory-expansion-ok/inputs/nested/b.edict
  • fixtures/cli/07-path-list-ok/inputs/first.edict
  • fixtures/cli/07-path-list-ok/inputs/second.edict
  • fixtures/cli/08-glob-expansion-ok/inputs/x.edict
  • fixtures/cli/08-glob-expansion-ok/inputs/y.edict
  • fixtures/cli/09-shape-source-ok/request.jsonl
  • fixtures/core/canonical/bounded-hello.core.cbor
  • fixtures/core/canonical/bounded-hello.core.sha256
  • fixtures/core/schema/accepted/core-action-minimal.fields
  • fixtures/core/schema/accepted/core-module-minimal.fields
  • fixtures/core/schema/rejected/core-action-unknown-verified-mode.fields
  • fixtures/core/schema/rejected/core-module-missing-actions.fields
  • fixtures/lang/bounds/bounded-hello.edict
  • fixtures/lang/effects/conditional-blob.edict
  • fixtures/lang/effects/read-greeting.edict
  • fixtures/lang/tooling/highlight-smoke.edict
  • fixtures/lang/types/color-match.edict
  • fixtures/obstruction-strands/v0/stale-basis/README.md
  • fixtures/obstruction-strands/v0/stale-basis/source.edict
  • fixtures/provider-contracts/v1/edict-provider-contracts.cddl
  • fixtures/provider-contracts/v1/manifest.json
  • fixtures/providers/components/inventory.json
  • fixtures/target-ir/canonical/echo-effectful.target-ir.cbor
  • fixtures/target-ir/canonical/echo-effectful.target-ir.sha256
  • fixtures/target-ir/canonical/gitwarp-append.target-ir.cbor
  • fixtures/target-ir/canonical/gitwarp-append.target-ir.sha256
  • grammars/textmate/edict.tmLanguage.json
  • grammars/tree-sitter-edict/grammar.js
  • grammars/tree-sitter-edict/src/grammar.json
  • grammars/tree-sitter-edict/src/node-types.json
  • grammars/tree-sitter-edict/test/corpus/current-subset.txt
  • xtask/src/goldens.rs
  • xtask/src/main.rs
  • xtask/src/release_dates.rs
  • xtask/src/release_prep.rs
  • xtask/src/tests.rs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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

❤️ Share

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

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 66188d56ce

ℹ️ About Codex in GitHub

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

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

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

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

Comment on lines +143 to +149
action_declaration: $ => seq(
'action',
field('name', $.identifier),
$.parameter_list,
'returns',
field('returns', $.type_reference),
repeat($.intent_clause),
repeat($.action_clause),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Regenerate Tree-sitter artifacts for action declarations

Regenerate every Tree-sitter consumer when changing this rule: the checked-in src/parser.c still recognizes intent/intent_declaration, while queries/highlights.scm still captures the "intent" token and an intent_declaration node. Consequently, editors using the generated parser reject the newly valid action syntax, and regenerating the parser alone makes the stale highlight query fail to compile because those symbols no longer exist. The current xtask test only searches the grammar source and capture names, so it does not exercise either failure.

AGENTS.md reference: AGENTS.md:L54-L61

Useful? React with 👍 / 👎.

Comment on lines +233 to +238
if report.drift.is_empty() {
let (count, gap_count) = (tags.len(), report.gaps.len());
println!(
"release-dates: {count} tag(s) reconciled against git, {gap_count} uncovered surface(s)"
);
return Ok(());

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Fail when required release surfaces become missing

Fail verification for missing surfaces except for an explicit allowlist of historical gaps. Currently, removing an existing release-notes file, its Target date: line, a changelog section, or a policy block only appends to gaps; because success depends solely on drift.is_empty(), cargo xtask verify still passes. This permits future regressions in the release signposts that the new reconciliation is intended to protect.

AGENTS.md reference: AGENTS.md:L298-L300

Useful? React with 👍 / 👎.

SemanticErrorKind::MissingBudget => "MissingBudget",
SemanticErrorKind::MissingBasis => "MissingBasis",
SemanticErrorKind::DuplicateIntentClause => "DuplicateIntentClause",
SemanticErrorKind::DuplicateActionClause => "DuplicateActionClause",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve the v1 duplicate-clause diagnostic identifier

Keep the wire code as DuplicateIntentClause when renaming the Rust variant, or version the diagnostic contract before changing it. For any source containing duplicate singleton clauses, this line changes the public edict.cli.diagnostic/v1 kind value to DuplicateActionClause; that breaks clients dispatching on the documented stable identifier and directly contradicts the adjacent invariant that a Rust variant rename must not alter the wire contract.

AGENTS.md reference: AGENTS.md:L141-L144

Useful? React with 👍 / 👎.

@flyingrobots flyingrobots reopened this Aug 4, 2026
@flyingrobots

Copy link
Copy Markdown
Owner Author

@codex review please

CodeRabbit skipped this PR (Review skipped: 122 files exceed the limit of 100), so requesting the documented fallback review per docs/topics/release-process/../review-process/policy.toml (fallback_request, fallback_required_when_primary_unavailable).

Note for the record: a file-count skip is not among the policy's enumerated primary_unavailable_states (rate_limited, insufficient_usage_credits, out_of_credits). Treating it as unavailable here to satisfy goal = "at_least_one_automated_or_human_review"; whether to add it to that list is a separate decision.

The file count is inflated because commit 9f1a11e0 (the workspace-wide Intent → Action rename, ~108 files) had not previously been pushed to main, so it lands through this PR alongside the three commits that document and follow up on it.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 66188d56ce

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread xtask/src/main.rs
provider_contract_pack(root, ProviderContractPackMode::Check)?;
provider_runtime_dependencies(root)?;
contract_check(root)?;
release_dates(root)?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reconcile the newly created tag before publication

For a release-prep merge, this call cannot validate the release being prepared: the checked .github/workflows/ci.yml never runs cargo xtask verify, .github/workflows/auto-release-tag.yml creates the tag only after that CI succeeds, and .github/workflows/release.yml publishes without invoking release-dates. Consequently, when the scaffolded target_date differs from the eventual tag date, the immutable tag and GitHub Release are published before this check can observe the discrepancy; run reconciliation after tag creation and before gh release create.

AGENTS.md reference: AGENTS.md:L82-L83

Useful? React with 👍 / 👎.

Comment on lines 50 to 52
- `lower_to_target_ir`, `TargetIrLoweringFacts`, `TargetIrArtifact`,
`TargetIrIntent`, `TargetIrStep`, `TargetLoweringReport`, stable
`TargetIrAction`, `TargetIrStep`, `TargetLoweringReport`, stable
`TargetLoweringStatus`, and stable `TargetLoweringFailureKind` values.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore the API names actually shipped in v0.9

When users consult these published v0.9 release notes, this now tells them that the release exposed TargetIrAction, although the Action rename is recorded under Unreleased and v0.9 actually shipped TargetIrIntent. The same retrospective substitution appears in other versioned release notes and released CHANGELOG.md sections, making historical documentation describe APIs and wire terminology that did not exist at those tags; retain the old names in published-release records and document the new names only in the release that introduces them.

AGENTS.md reference: AGENTS.md:L128-L129

Useful? React with 👍 / 👎.

Comment thread EDICT.md
Comment on lines +1061 to +1062
| T13 | OG-II proves silent last-write-wins merges create a permanent "action-recovery insufficiency floor"; only preserving conflict/authored acts as first-class objects avoids it | `agy:og-2-summary.md#29@25ff542`, `agy:observer-geometry-overview.md#38@25ff542` | 0.8 | The theoretical case for Edict's obstruction strands |
| T14 | Real Edict source exists in cross-project design docs: a `task.edit_document@1` action with pinned digests, `budget <=`, a `require jim.basisFresh(input.basis) else ... StaleBase` guard, effect-level `else` obstructions, and a typed `EditReceipt` &#124; `EditObstruction` return union | `agy:agy/continuum-receipts.md#12-46@25ff542` | 0.8 | Matches the README's aspirational `createEntry` syntax family |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve terminology from the pinned external evidence

These claims remain pinned to the unchanged external commit agy@25ff542, but the mechanical rename changes OG-II's previously cited ordinary term intent-recovery insufficiency floor and the cited source's intent declaration into action terminology without updating the evidence. Readers following the fixed citations therefore find sources that do not substantiate the report's new wording; preserve the external artifacts' terminology or refresh the citations to evidence that actually uses action.

AGENTS.md reference: AGENTS.md:L128-L129

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant