Skip to content

ci: fold all open simplify PRs into one batch - #1923

Merged
ScriptedAlchemy merged 224 commits into
masterfrom
ci/pr-batch-simplify
Sep 21, 2026
Merged

ScriptedAlchemy merged 224 commits into
masterfrom
ci/pr-batch-simplify

Conversation

@ScriptedAlchemy

@ScriptedAlchemy ScriptedAlchemy commented Sep 21, 2026

Copy link
Copy Markdown
Owner

Folds every open non-release PR into one branch so CI runs once on the union instead of once per PR. Each PR is merged with its own --no-ff merge commit at the head it had when folded, so merging this PR with a merge commit marks all of them merged.

Folded: #1572, #1574, #1580, #1879, #1892, #1893, #1894, #1895, #1896, #1897, #1898, #1899, #1900, #1901, #1902, #1903, #1904, #1905, #1906, #1907, #1908, #1909, #1910, #1911, #1912, #1913, #1914, #1915, #1916, #1917, #1918, #1919, #1920, #1921, #1922.

Eight of them conflicted on one file each with a sibling that had already landed in the fold. Each was resolved by keeping the deduplicated form the fold already carried and taking only what the PR added beyond it:

Three fix commits on top of the merges: a 'static closure bound in the memory tool schemas, a rustfmt pass, and six clippy findings (four inherited from the PRs, two from the batch).

Local gates at the head: cargo fmt --check, workspace clippy with -D warnings, and lib tests for query (266), contracts (415), session-runtime (118), graph-query (31), domain (222), agent-hosts (512) all pass. The code-index-runtime lib lens lost 8 to 12 reconcile settle timeouts at machine load 69; the same tests pass in isolation in 1.5 s, which is the known load-only pattern. CI is the verdict.

CI fixes on the batch, each its own commit:

  • JsonRpcResponse import dropped by the perf(code-index): stop the readiness waits competing with the rebuild #1580 merge (feature gates and root-transport lenses only).
  • The runtime-root copy of the byte-pinned search-eval corpus fixture repository.rs, rewritten by cross-crate: test harnesses (5 passes) #1921's TryFrom codemod, restored from the pinned blob.
  • The field_sites real-literals test pinned absolute line numbers of the live monitor_ring.rs it copies; a simplify commit shifted them. The test now derives both lines from the fixture text.
  • The codex host shutdown-guard test read its descendant pid file between the shell's create and write; the shell now renames the file into place.
  • The shared MCP warm helper now also waits for the first search that answers fresh, the settled-seat condition test(mcp): take the first settled search before pinning freshness #1891 fenced in one test; the context behavior test hit the same window.
  • busy_scheduler_still_refuses_a_seated_generation_without_a_currency_witness (the previously reported unfenced flake): an unchanged pass bound the seat's source proof after releasing the scheduler mutex and its pass guard, so a reader holding the scheduler could watch the proof land. The bind now happens inside the locked reconcile closure.

Codex review, both P1s taken:

  • The release profile resolver ran the production feature checker with --manifest-only, skipping the transitive test-transport walk on the release path. Releases are dispatched on a tag without a CI gate, so the full check is back (under a second) and the flag is gone.
  • simplify sat three times in the commitlint type list. One entry remains and AGENTS.md names it.

Commit lint: the 120 simplify(...)-typed commits inside the Cursor PRs fail the conventional-type rule. CI's gates job only self-tests the linter, so this does not block, but release-please will omit those commits from the changelog.

🤖 Generated with Claude Code

cursoragent and others added 30 commits September 17, 2026 23:11
A retryable graph activation used to erase the prepared serving
candidate, and an unfinished clone-fingerprint successor withheld the
same seat after exact and lexical owners were ready. Keep the candidate
in both cases so search can move off the predecessor while graph retries.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
The graph-rebuild refresh fixture emits file Contains edges that abstain
and primitive u32 refs that never bind. Census edge_count 0 is that
shape, not a stalled projector.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Remove unused NEXT.md, archived dated plans, and unreferenced status leftovers. Trim pointers that treated NEXT.md as current delivery authority.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
The graph-rebuild receipt timed out for 90s against a generation that was
already current: status reported `current` on the expected revision with
the advertised generation matching what search served, and the seat never
moved for the whole wait.

`limit: 3` still rendered 18084 characters against the 15000-character
response frame, so MCP replaced the body with a retrieval handle and moved
`results` and `code_generation` inside `preview`. Every predicate read them
as absent and the wait spun to its deadline. One candidate carries several
KiB of ranking provenance, so the page has to be smaller than a guess at
how many results fit.

Ask for one result, and refuse a truncated envelope outright rather than
reading it as a warming generation, so the next frame overflow reports
itself instead of presenting as a deadline. Pace both waits as well: each
`tracedecay_status` call runs the census ready-probe, a freshness read, and
branch diagnostics, and a `yield_now` spin re-entered that path thousands of
times a second on the runtime running the reconcile it waits for.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
`GitMetadataFingerprintV1::capture` is the tier-1 staleness signal sampled
on every query admission, and its own contract calls that cost fixed and
cheap. It was neither: resolving the git-dir and common-dir through a fresh
`gix::open` cost 72.7us of the 75.2us per capture, and runtime-core already
owns a revalidating topology memo that answers the same question in 2.0us.
Search runs two to three captures per call.

Measured on a one-ref fixture repository, perf profile, 2000 warm
iterations: capture 75.2us -> 10.0us.

The memo is asked only for a checkout carrying `<root>/.git`, which is both
where an open at exactly this root resolves through and where a discovery
started at this root stops, so it returns the same two paths. A bare
control directory or a path that is not a checkout root still opens
directly, because discovery would walk past it to an ancestor whose git
metadata does not describe this project. The memo canonicalizes both paths;
the fingerprint samples file metadata and contents, so its value and its
persisted signature are unchanged.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
The production composition's publication wait re-ran its readiness probe
every 10ms for up to 20 seconds. That probe canonicalizes the root, takes
the scheduler registry's mounted mutex several times, offloads a
Git-metadata freshness capture to the blocking pool, and emits a decline
event — spent on the same cores as the reconcile it waits for, and leaving
a pending arrival the worker yields its graph prepare to.

The registry already publishes the edge this wants: the serving watch
signals every seat install and every source revalidation that keeps an
unchanged generation seated. Drive the wait from it, keeping a 100ms floor
for the terminal answers that install no seat — a route that has not
mounted yet, and a verified source that publishes no generation at all.

Measured on the graph-rebuild transport journey, perf profile: publication
waits 55.1s -> 50.1s and 15.4s -> 14.5s, suite 164.7s -> 155.3s.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Two suites reached the same wall — an MCP answer over the response frame
arrives as `{"truncated": true, "handle": …, "preview": …}`, where `preview`
is a string and `results` / `code_generation` are absent at the top level —
and only one of them handled it. The graph-rebuild receipt read that
envelope as a warming generation and spent its whole 90s deadline on a
generation that was already current; `limit: 20 -> 3` was a guess at how
many candidates fit, and 3 still rendered 18084 characters against 15000.

Lift the daemon suite's retrieve-paging resolver into the shared test
surface and read every tool answer through it, so the page size stops being
load-bearing: it is a property of how much ranking provenance a candidate
carries, not something a journey should track. Both suites' duplicate
`tool` / `tool_payload` helpers go with it.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
# Conflicts:
#	docs/plans/2026-02-26-codegraph-rust-implementation-plan.md
#	docs/plans/2026-02-26-codegraph-rust-port-design.md
#	docs/plans/2026-02-26-multi-language-implementation-plan.md
#	docs/plans/2026-02-26-multi-language-support-design.md
#	docs/plans/2026-07-01-macos-launchd-daemon-support.md
#	docs/plans/2026-07-04-tool-cli-args-agent-ergonomics.md
#	docs/plans/tracedecay-v2/NEXT.md
#	docs/plans/tracedecay-v2/audits/ci-triage-plan-2026-08-14.md
#	docs/plans/tracedecay-v2/audits/lane-staleness-2026-08-13.md
#	docs/plans/tracedecay-v2/audits/v2-implementation-audit-2026-08-14.md
#	docs/superpowers/plans/2026-07-31-one-shot-crate-split.md
#	docs/superpowers/plans/2026-08-08-v2-rc-recovery.md
#	docs/superpowers/plans/2026-08-23-pr663-agent-handoff-prompt.md
#	docs/superpowers/plans/2026-08-23-pr663-performance-recovery.md
#	docs/superpowers/plans/v2/pr16-remote-brain.md
#	docs/superpowers/plans/v2/pr18-public-sdks.md
#	docs/superpowers/plans/v2/pr20-performance.md
The product crate owns `crates/tracedecay/tests/fixtures`, the same path
the root `tests/fixtures` asset is staged onto. The snapshot regression
fixture never carried crate-local content there, so it never exercised
that overlap and the gate's first real run failed instead.

Seed the collision and assert the staged asset carries the root entries
and nothing else.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`cp -a` merges a directory into an existing directory of the same name,
so staging the root `tests/fixtures` asset beside the product manifest
left the package-local copy a superset of the root tree: the crate's own
`tests/fixtures/impls_behavior` survived alongside it. The snapshot
assertion then reported the staged asset differing from its snapshot and
the gate exited before packaging.

Clear each destination path before copying, in both the product and CLI
asset loops, so a staged asset is exactly the validated root snapshot no
matter what the package directory already holds.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The step asked the extracted root package for its mcp_suite target, but
cargo package publishes no integration tests and the suite requires the
test-transport feature the production graph excludes, so the command
could never run. The step now runs the suite from the staged source
snapshot under the root-transport CI lens with the packaged CLI as the
binary the suite spawns.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The acceptance script runs the packaged grammar, query, root, LSP and
MCP suites through nextest, and the workflow never installed it, so the
first run to get past staging died on `no such command: nextest`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Asset staging rewrites package-local directories inside the staged tree
(crates/tracedecay/tests/fixtures becomes the root fixtures), so the
suite compiled from it could not find the package-local impls_behavior
fixture it include_str!s. Keep a second copy of the snapshot before
staging and run the suite from that.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The structural-rewrite proof in mcp_suite shells out to the host
ast-grep CLI, which CI installs and this workflow did not, so the first
run to reach the suite stopped at that test with 476 tests unrun. Run
the suite without fail-fast so one run reports every gap.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The library consumer and the test-API probe are fresh manifests, so
cargo resolves them from scratch, and offline resolution refuses a
version that has since been yanked (bisync 0.3.0 under gix-protocol)
even though the workspace lockfile pins it. Copy that lockfile in, as
the extracted packages already get, so they resolve what the product
resolves.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The acceptance battery's embedded consumer program calls the agent-hosts
bundle registry, whose functions gained a generator_commit parameter
after this step last compiled; the step had been unreachable behind the
staging defect, so the program went stale unnoticed. The consumer now
passes the packaged product's resolved source head, the same commit the
release binary is stamped with.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The suite carries settle races that CI proper tracks and fences one by
one; here two successive runs each failed a different one of them
(status opt-in, then search freshness) with 516 of 517 passing. This
gate proves the packaged product, not test stability, so a test that
passes on retry does not fail the battery.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Nothing in crates, scripts, or CI loaded these trees. The SQLite
evidence pack only checked itself, and the remaining files were
stale allowlists and unused samples.

Allow the simplify commit type so these passes satisfy commitlint.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
The reader and checkpoint journeys repeated the same WAL seed and
reader-budget overlay. One helper keeps both behaviors.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
One ApplicationProblem::ensure_admitted replaces the copied
cancellation and deadline match at each work and retained caller.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
Project-scoped bindings and family mounts built the same JSON shape
four times. One constructor keeps the shard identity and epochs.

Co-authored-by: Zack Jackson <ScriptedAlchemy@users.noreply.github.com>
ScriptedAlchemy and others added 19 commits September 20, 2026 22:40
The tabled memory tool schemas took a higher-ranked `FnMut(&str)`, but
`definitions.rs` passes a closure annotated `|operation: &'static str|`
and every `MemoryTool::operation` is a `&'static str` literal, so the
closure could never satisfy the `for<'a>` bound and the crate failed to
compile. Match the bound to the operations the callers actually supply.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`cargo fmt --all -- --check` reported drift in eleven files carried in by
merges made before this batch. The change is rustfmt output only; no
statement, signature, or control flow differs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`cargo clippy --workspace --all-targets -- -D warnings` did not pass on
this branch. Six findings, four inherited from earlier merges and two
introduced by this batch:

- `decode_with_canonical_digest` returned `Result<T, ()>`. No caller read
  the error, so it now returns `Option<T>` and the five call sites use
  `ok_or`/`ok_or_else`.
- `schema.rs` declared a test module before a later item.
- `score_lexical_row` takes eight arguments, so it carries the same
  `too_many_arguments` allow the rest of the tree uses.
- The `Default` impl for `LanguageRegistry` that #1910 removed as uncalled
  is required by `new_without_default`; it is back with a note saying so.
- The shared `isolated_profile` harness #1921 introduced was loaded as two
  modules in `tracedecay` and in `tracedecay-daemon-control`. Each crate
  now declares it once and the test modules import it from there.
- The two-argument problem helpers take `impl Into<String>`, which made
  five borrows in `automation_jobs_api` needless.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9b430d2

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 21, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-21T00:37:50.357827Z debc48c PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@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: debc48cee8

ℹ️ 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".

str(checker),
"--repo",
str(source),
"--manifest-only",

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 Keep the transitive feature check in release builds

When production remains clean in the root manifest but a dependency enables test-transport transitively, --manifest-only returns before the cargo tree contamination check. Both stable and beta release workflows call this resolver immediately before compiling and only smoke --version/--help, so a release can ship test-only ports if it runs before the independent CI feature-gates verdict or while that run is cancelled. Keep the resolved-graph check on the release path rather than relying solely on CI.

AGENTS.md reference: AGENTS.md:L132-L134

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Agreed. Release runs are dispatched on a tag with no gate on a green CI run, and a cancelled master run leaves the tag unproven, so the walk belongs on the release path. cc28eeb restores the full check in the resolver (0.8 s on the workspace), removes the now-unused --manifest-only flag, and turns the resolver fixture test into a real single-crate workspace so the same walk runs there.

Comment thread commitlint.config.cjs
"perf",
"refactor",
"revert",
"simplify",

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 Reject the undocumented simplify commit type

When a contributor uses the newly admitted simplify(...) header, the local hook and CI commit-range linter now accept a type outside the repository's authoritative type list, while the release configuration has no corresponding changelog classification. This allows user-facing changes to pass commit validation but disappear from generated release notes; remove all three simplify entries unless every commit and release authority is intentionally updated together.

AGENTS.md reference: AGENTS.md:L92-L98

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Three folded PRs each added the entry and the merges kept all three. e1717ab keeps one and adds simplify to the AGENTS.md type list, so the hook, the linter, and the conventions agree. Release notes: release-please has no changelog-sections override here, so simplify is hidden the same way refactor already is; the type marks behavior-preserving deletions, which are not user-facing changes.

ScriptedAlchemy and others added 7 commits September 21, 2026 01:20
Two CI failures on the batch, neither caught by the workspace clippy
lens.

The search-eval workload pins each corpus document to a blob at commit
8312618 and refuses to validate when the checked-in fixture copy
drifts. #1921's TryFrom codemod rewrote the runtime-root copy of
`repository.rs` along with the live sources, so `validate` failed with
"corpus fixture bytes differ from pinned source blob: repository". The
copy is restored byte-for-byte from the pinned blob.

`graph_rebuild_status_test.rs` lost its `JsonRpcResponse` import in the
#1580 merge while keeping the `tool_payload` helper that needs it, which
only compiles under the test-transport feature CI's feature gates and
root-transport lenses exercise. The import is back.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The real-literals field_sites test copies the live monitor_ring.rs as
its fixture and pinned two absolute line numbers in it: the string
literal that must not count as a field site and the one write site.
A simplify commit in this batch shortened a timestamp read three lines
above the write, so the write moved from 256 to 253 and the test broke
on an unrelated edit. The test now finds both lines in the fixture
text it copies, so only a change to the sites themselves fails it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
An unchanged reconcile pass re-proves a seat that was installed without
a currency witness. It did so after the blocking reconcile closure had
returned, so the scheduler mutex was already released and the pass
guard already dropped when the witness landed. A reader that held the
scheduler to keep the seat unproven, the exact state a restart-restored
seat is in before its first passing probe, could then watch the proof
appear under it: the verified read abstained and the readiness census
answered ready a moment later. CI hit that window in
busy_scheduler_still_refuses_a_seated_generation_without_a_currency_witness.

The proof is now bound inside the closure, on the Noop outcome, while
the pass still holds the scheduler and its in-progress guard. The late
arm only announces the change. The bind helper's own checks are
unchanged: it still refuses a seat whose snapshot is not the one the
pass verified and only records a proof the freshness fence can supply.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Three folded PRs each added `simplify` to the commitlint type list, and
the merges kept all three entries. One remains, and AGENTS.md's type list
now names it so the hook, the linter, and the conventions agree. It is
hidden from generated release notes the same way `refactor` is.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A folded commit passed --manifest-only to the production feature checker
from the release profile resolver, so a release build only read the
feature table and skipped the cargo tree walk that proves no dependency
enables test-transport transitively. Stable and beta releases are
dispatched on a tag without waiting for the CI run that still performs
that walk, and a cancelled master run leaves the tag unproven. The
resolver runs the full check again; it costs under a second on the
workspace. The flag had no other caller and is gone. The resolver's
fixture test builds a real single-crate workspace with an offline
lockfile so the same walk runs there.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The shared warm helper waited for status=current, a search on the
sealed generation, and complete lane coverage. A seat can still owe its
source proof to a continuation pass at that point, and a read taken
before the pass binds it reports verifying. #1891 fenced that window in
one search test; the context test then hit the same window on CI. The
helper now also takes the first search that answers fresh, so every
test that warms first is fenced in one place.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The shutdown-guard test polled for the pid file's existence and then
parsed it, but the shell's redirection creates the file before the pid
is written, so a fast poll read it empty and failed on ParseIntError.
The shell now writes a sibling and renames it into place, so the file
only appears with its pid inside.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@ScriptedAlchemy
ScriptedAlchemy merged commit 784806d into master Sep 21, 2026
26 checks passed
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.

2 participants