Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
87818da
test(ci): close three master-tip readiness races
cursoragent Sep 19, 2026
0178593
style(tests): collapse idle admission check
cursoragent Sep 19, 2026
ba835fc
test(advisory): accept peer-won Codex stop ingest
cursoragent Sep 19, 2026
37d6bc0
test(advisory): wait out accepted_for_replay ingest
cursoragent Sep 19, 2026
2b6d8cf
fix(code-index): index clone postings by occurrence
cursoragent Sep 19, 2026
787892c
fix(code-index): keep directory pointer faults in publication family
cursoragent Sep 19, 2026
a943654
fix(ci): lint integration commits on dispatch
cursoragent Sep 19, 2026
a0d26c7
test(daemon): prove the protected preview stays redacted
ScriptedAlchemy Sep 19, 2026
74459e4
fix(build): keep eval lexical projection off transport
cursoragent Sep 19, 2026
690e843
fix(retention): defer a census that races a missing path
cursoragent Sep 19, 2026
fdb756d
fix(codex): keep prepare Ready when the plugin CLI is absent
cursoragent Sep 19, 2026
df9f190
fix(extraction): stop bare receivers inventing callers
cursoragent Sep 19, 2026
391c6a4
test(mcp): prove remote status across the tools/call boundary
ScriptedAlchemy Sep 19, 2026
e898421
fix(code-index): keep sealed generation when proof expires
cursoragent Sep 19, 2026
ed3d945
fix(lcm): describe the captured message, not a stub
cursoragent Sep 19, 2026
6099dda
fix(daemon): close socket-group and pointer-rename races
cursoragent Sep 19, 2026
0aed193
fix(memory): treat memory.max as the service ceiling
cursoragent Sep 19, 2026
b63b775
fix(cli): report installed binary identity on update
cursoragent Sep 19, 2026
0d00ec5
fix(hotpath): apply functions limit before live mcp
cursoragent Sep 19, 2026
88139f6
fix(global-db): classify session projection collisions by field
cursoragent Sep 19, 2026
2579de9
fix(code-index): idle means the pass tail already ran
cursoragent Sep 19, 2026
91c4bf9
fix(code-index): keep clone copy off the freshness receipt
cursoragent Sep 19, 2026
8c92434
fix(search-eval): pin ranking, not generation identity
cursoragent Sep 19, 2026
f51da58
fix(store): one owner for a reached cursor frontier
cursoragent Sep 19, 2026
e74cb00
fix(code-index): stop busy reads pinning freshness Verifying
cursoragent Sep 19, 2026
6bdb930
test(mcp): keep the seeded message for describe asserts
cursoragent Sep 19, 2026
3034d5a
test(daemon): retire the listen socket with its owner
cursoragent Sep 19, 2026
a2f50b7
docs(code-index): leave clone copy out of witness rebind
cursoragent Sep 19, 2026
53dc0b3
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
9762d3d
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
db55dfd
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
1cef6c5
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
b759356
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
a209441
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
8c2cb55
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
f0150c7
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
8d55e34
Merge branch 'fix/master-ci-green-3' into cursor/graph-rebuild-timeou…
ScriptedAlchemy Sep 19, 2026
ea5e23d
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
a10ecff
chore: merge origin/fix/master-ci-green-3 into the PR branch
ScriptedAlchemy Sep 19, 2026
72e2d81
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
b7be3fa
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
6f7468c
fix(global-db): refuse tampered projection messages on reopen
cursoragent Sep 19, 2026
9b54a5a
fix(sessions): wake temporal refresh from hook ingest
cursoragent Sep 19, 2026
3cb4bc5
fix(hooks): keep ingest commit status off the drain residual
cursoragent Sep 19, 2026
94bc893
fix(cli): return completed tool results instead of retrying them
cursoragent Sep 19, 2026
5d0c111
fix(global-db): rewrite stale raw twins under current provenance
cursoragent Sep 19, 2026
1518364
test(retention): assert a vanished census open defers
cursoragent Sep 19, 2026
8715742
test(code-index): drop the redundant idle-admission hold
ScriptedAlchemy Sep 19, 2026
b59e66e
test(memory): state the real text-build growth budget
ScriptedAlchemy Sep 19, 2026
1ee84d3
fix(admission): make NotApplicable a terminal no-op
cursoragent Sep 19, 2026
23c96f2
ci(partitions): register the hotpath guard crate's targets
ScriptedAlchemy Sep 19, 2026
d36517e
test(hotpath-guard): cover the functions limit env fallback
ScriptedAlchemy Sep 19, 2026
bf444b5
test(daemon): await the released descendant before probing
ScriptedAlchemy Sep 19, 2026
4e200b2
fix(ci): keep evaluator acceptance tests on the Windows lane
ScriptedAlchemy Sep 19, 2026
a99c819
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
575e762
Merge remote-tracking branch 'origin/fix/master-ci-green-3' into curs…
ScriptedAlchemy Sep 19, 2026
b8a12f8
test(lcm): expect the payload placeholder describe now returns
ScriptedAlchemy Sep 19, 2026
9a0f17d
Merge remote-tracking branch 'origin/master' into cursor/retire-daemo…
ScriptedAlchemy Sep 19, 2026
c9a371a
style(daemon): rewrap the store import after the error drop
ScriptedAlchemy Sep 19, 2026
ed6d8f9
style(code-index): use map_or for the pointer memo size
ScriptedAlchemy Sep 19, 2026
7725c98
fix(search-eval): keep the production fallback contract check
ScriptedAlchemy Sep 19, 2026
3daba38
fix(extraction): keep module scope in self receiver types
ScriptedAlchemy Sep 19, 2026
f060276
fix(code-index): alias module-scoped trait impl methods
ScriptedAlchemy Sep 19, 2026
1ebadc8
chore(code-index): move Rust extraction to extractor.rust.v11
ScriptedAlchemy Sep 19, 2026
97288d7
test(daemon): retire an endpoint only after a forced stop
ScriptedAlchemy Sep 19, 2026
c534d03
fix(code-index): keep admission ahead of the publication gate
ScriptedAlchemy Sep 19, 2026
1703387
fix(global-db): write reconciled rebuild sessions set-based
ScriptedAlchemy Sep 19, 2026
d59b7eb
test(daemon): never address a process group by a reaped pid
ScriptedAlchemy Sep 19, 2026
e441823
fix(code-index): refuse a sealed generation the checkout moved past
ScriptedAlchemy Sep 19, 2026
0201b13
fix(global-db): receipt a reached-frontier replay in this epoch
ScriptedAlchemy Sep 19, 2026
67ba061
Merge remote-tracking branch 'origin/cursor/advisory-codex-stop-durab…
ScriptedAlchemy Sep 19, 2026
a88e475
Merge remote-tracking branch 'origin/cursor/hotpath-functions-limit-2…
ScriptedAlchemy Sep 19, 2026
4763265
Merge remote-tracking branch 'origin/cursor/publication-fault-eisdir-…
ScriptedAlchemy Sep 19, 2026
daf9e0f
Merge remote-tracking branch 'origin/cursor/batch-merge-commit-hygien…
ScriptedAlchemy Sep 19, 2026
1a23c08
Merge remote-tracking branch 'origin/cursor/lexical-artifact-transpor…
ScriptedAlchemy Sep 19, 2026
35410dc
Merge remote-tracking branch 'origin/cursor/codex-prepare-deferral-16…
ScriptedAlchemy Sep 19, 2026
205ff61
Merge remote-tracking branch 'origin/cursor/false-edge-bare-receiver-…
ScriptedAlchemy Sep 19, 2026
4201dc6
Merge remote-tracking branch 'origin/pr1615/protected-preview-journey…
ScriptedAlchemy Sep 19, 2026
27822c5
Merge remote-tracking branch 'origin/pr1645/remote-status-proof' into…
ScriptedAlchemy Sep 19, 2026
6891328
Merge remote-tracking branch 'origin/cursor/fix-lcm-describe-empty-ou…
ScriptedAlchemy Sep 19, 2026
2c0a7ed
Merge remote-tracking branch 'origin/cursor/graph-rebuild-root-seal-5…
ScriptedAlchemy Sep 19, 2026
73210b5
Merge remote-tracking branch 'origin/cursor/memory-cgroup-ceiling-e93…
ScriptedAlchemy Sep 19, 2026
be7090c
Merge remote-tracking branch 'origin/cursor/session-projection-collis…
ScriptedAlchemy Sep 19, 2026
5333b82
Merge remote-tracking branch 'origin/cursor/graph-rebuild-timeout-1bd…
ScriptedAlchemy Sep 19, 2026
0a7c2c2
Merge remote-tracking branch 'origin/cursor/scheduler-admission-races…
ScriptedAlchemy Sep 19, 2026
5c1b8a0
Merge remote-tracking branch 'origin/cursor/search-eval-ranking-recei…
ScriptedAlchemy Sep 19, 2026
77890f7
Merge remote-tracking branch 'origin/cursor/fix-master-tip-ci-races-0…
ScriptedAlchemy Sep 19, 2026
8889736
test(daemon): unlink only the socket this child still publishes
ScriptedAlchemy Sep 19, 2026
154be27
Merge remote-tracking branch 'origin/master' into ci/pr-batch-c
ScriptedAlchemy Sep 19, 2026
792c4fe
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
75c8b5b
chore: merge PR #1829 (cursor/obs-cursor-frontier-owner-0d88)
ScriptedAlchemy Sep 19, 2026
19c8950
chore: merge PR #1833 (cursor/retire-daemon-listen-endpoint-464e)
ScriptedAlchemy Sep 19, 2026
0f11eba
Merge remote-tracking branch 'origin/master' into cursor/update-ident…
ScriptedAlchemy Sep 19, 2026
ebac532
Merge origin/master into cursor/clone-artifact-ready-ce49
ScriptedAlchemy Sep 19, 2026
4f09935
Merge remote-tracking branch 'origin/master' into cursor/dashboard-fr…
ScriptedAlchemy Sep 19, 2026
e3a017b
Merge remote-tracking branch 'origin/master' into cursor/hook-ingest-…
ScriptedAlchemy Sep 19, 2026
e7c3281
Merge remote-tracking branch 'origin/master' into cursor/global-db-st…
ScriptedAlchemy Sep 19, 2026
ea39a67
Merge remote-tracking branch 'origin/master' into cursor/gen-retentio…
ScriptedAlchemy Sep 19, 2026
0012466
Merge remote-tracking branch 'origin/master' into cursor/tool-result-…
claude Sep 19, 2026
8e20cbf
Merge remote-tracking branch 'origin/master' into cursor/profile-reop…
ScriptedAlchemy Sep 19, 2026
113161b
Merge remote-tracking branch 'origin/master' into cursor/hooks-ingest…
ScriptedAlchemy Sep 19, 2026
5ccb3c1
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
8772cdb
Merge remote-tracking branch 'origin/master' into cursor/not-applicab…
ScriptedAlchemy Sep 19, 2026
99b7bca
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
e436ba0
test(code-index): assert the clone occurrence index backfill
ScriptedAlchemy Sep 19, 2026
d6d8665
fix(retention): keep absent durable state a storage failure
ScriptedAlchemy Sep 19, 2026
b5231fd
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
8ba2ece
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
569660d
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
e6acc47
docs(global-db): restore the raw upsert doc split by the adopt helper
ScriptedAlchemy Sep 19, 2026
b6cd13c
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
fb58663
fix(cli): use ? for the missing install-probe binary
ScriptedAlchemy Sep 19, 2026
f2831bf
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
7458148
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
bd4036f
chore: merge PR #1811 (cursor/gen-retention-torn-census-c34f)
ScriptedAlchemy Sep 19, 2026
ae4e7c4
chore: merge PR #1835 (cursor/profile-reopen-tamper-518d)
ScriptedAlchemy Sep 19, 2026
36c335c
chore: merge PR #1803 (cursor/clone-artifact-ready-ce49)
ScriptedAlchemy Sep 19, 2026
e6f94cd
fix(daemon): retry a revoked response in the one-shot client
ScriptedAlchemy Sep 19, 2026
cde4e57
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
aba8bf8
chore: merge PR #1822 (cursor/update-identity-70d5)
ScriptedAlchemy Sep 19, 2026
426ca85
test(search-eval): re-pin the lexical baseline ranking receipts
ScriptedAlchemy Sep 19, 2026
c52fe01
chore: merge PR #1819 (cursor/daemon-socket-pointer-lock-8c78)
ScriptedAlchemy Sep 19, 2026
d7a18c7
chore: merge PR #1832 (cursor/dashboard-freshness-verifying-race-b461)
ScriptedAlchemy Sep 19, 2026
7d678d8
revert: "fix(codex): keep prepare Ready when the plugin CLI is absent"
ScriptedAlchemy Sep 19, 2026
1196eba
style(session-temporal): keep the test module last and rustfmt master
ScriptedAlchemy Sep 19, 2026
c30cc2d
fix(mcp): drop the unreachable NotApplicable wire no-op
ScriptedAlchemy Sep 19, 2026
efdfdef
fix(global-db): adopt a raw session only for projector-owned outputs
ScriptedAlchemy Sep 19, 2026
0cf720a
fix(global-db): compare a raw twin's derived columns before trusting it
ScriptedAlchemy Sep 19, 2026
79c8104
Merge remote-tracking branch 'origin/master' into cursor/hooks-ingest…
ScriptedAlchemy Sep 19, 2026
1c454d3
chore: merge PR #1837 (cursor/hook-ingest-refresh-wake-0d24)
ScriptedAlchemy Sep 19, 2026
75d6bf2
chore: merge PR #1839 (cursor/tool-result-retry-root-f891)
ScriptedAlchemy Sep 19, 2026
00fde63
chore: merge PR #1843 (cursor/not-applicable-terminal-noop-9c8a)
ScriptedAlchemy Sep 19, 2026
2ab3b8f
chore: merge fix/batch-c-codex-prepare (revert #1812)
ScriptedAlchemy Sep 19, 2026
27daaf5
chore: merge PR #1841 (cursor/global-db-stale-rows-1796)
ScriptedAlchemy Sep 19, 2026
57f56ee
chore: merge origin/master (58f8f83095, #1847)
ScriptedAlchemy Sep 19, 2026
f7840f4
chore: merge PR #1838 (cursor/hooks-ingest-drain-residual-0aa8)
ScriptedAlchemy Sep 19, 2026
0684e47
chore: merge origin/master (b61cbe4953, #1795)
cursoragent Sep 19, 2026
ad95bff
fix(daemon): resend a warming project open as mounting
cursoragent Sep 19, 2026
4a3f3b9
test(code-index): assert directory pointer faults stay put
cursoragent Sep 19, 2026
e7c3124
fix(global-db): page rebuild overlap reconciliation
ScriptedAlchemy Sep 19, 2026
17b1022
fix(sessions): drop the u64 identity conversion clippy rejects
ScriptedAlchemy Sep 19, 2026
2c27b49
chore: merge fix/batch-c-codex-triage (page rebuild overlap scan)
ScriptedAlchemy Sep 19, 2026
193d5f0
chore: merge origin/master (e1300458e4, #1858 #1849 #1854 #1837)
ScriptedAlchemy Sep 19, 2026
1533bf6
chore: merge origin/master (e1300458e4, #1858)
cursoragent Sep 19, 2026
3090599
test(mcp): pin describe previews and clone publish wait
cursoragent Sep 19, 2026
44eacdb
test(mcp): expect the bounded describe preview #1817 restores
ScriptedAlchemy Sep 19, 2026
835942d
chore: merge origin/ci/pr-batch-c describe pin
cursoragent Sep 19, 2026
024364a
fix(code-index): let a retired clone staging discard converge
ScriptedAlchemy Sep 19, 2026
59724ef
chore: merge fix/batch-c-redundancy-lane (clone staging discard)
ScriptedAlchemy Sep 19, 2026
f0a144a
test(mcp): wait only on the retryable clone-lane verdict
ScriptedAlchemy Sep 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,15 @@ rustflags = ["-C", "split-debuginfo=unpacked"]
#
# `test-ci` is the hosted acceptance selection: nextest's `ci` policy
# (.config/nextest.toml: fail-fast off, one retry that still fails flaky
# results, 8 threads, slow-timeout termination) and only the root fixture
# feature. `.github/workflows/ci.yml` runs this exact alias, and its support
# binaries/archives are built with `--profile perf` so they share artifacts
# with it. Extra flags append: `cargo test-ci --locked -E 'binary(=x)'`.
test-ci = "nextest run --workspace --profile ci --features tracedecay/test-helpers --cargo-profile perf"
# results, 8 threads, slow-timeout termination), the root fixture feature and
# `search-eval`, which is what compiles the evaluator acceptance suites (the
# root crate's dependency on the evaluator is optional so the Linux transport
# partition does not build the eval-only lexical projection; a `--workspace`
# run resolves the evaluator anyway). `.github/workflows/ci.yml` runs this
# exact alias, and its support binaries/archives are built with `--profile
# perf` so they share artifacts with it. Extra flags append: `cargo test-ci
# --locked -E 'binary(=x)'`.
test-ci = "nextest run --workspace --profile ci --features tracedecay/test-helpers,tracedecay/search-eval --cargo-profile perf"
# Deliberately broader than CI: every optional feature (test-transport
# acceptance suites, hotpath, …) under the same cargo profile, with the
# default nextest policy (no retries).
Expand Down
2 changes: 2 additions & 0 deletions .claude/skills/using-hotpath/references/hotpath-0.24.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ val_logs {"debug_id": 3}

Hotpath 0.24 detail calls accept IDs, not names, and have no per-call `limit`. Retention is controlled globally by `HOTPATH_LOGS_LIMIT`.

Published hotpath 0.24 applies `HOTPATH_FUNCTIONS_LIMIT`, else `HOTPATH_LIMIT`, when the exit report is built. Live `functions_timing` and `functions_alloc` use the builder limit captured at guard start. The shipped `tracedecay` process copies that environment onto the builder before the server starts, so a limit set for the process is what those tools return. Setting the variable after the process is already running does not resize the worker.

Recommended order:

1. `profiler_status`.
Expand Down
2 changes: 2 additions & 0 deletions .codex/skills/using-hotpath/references/hotpath-0.24.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ val_logs {"debug_id": 3}

Hotpath 0.24 detail calls accept IDs, not names, and have no per-call `limit`. Retention is controlled globally by `HOTPATH_LOGS_LIMIT`.

Published hotpath 0.24 applies `HOTPATH_FUNCTIONS_LIMIT`, else `HOTPATH_LIMIT`, when the exit report is built. Live `functions_timing` and `functions_alloc` use the builder limit captured at guard start. The shipped `tracedecay` process copies that environment onto the builder before the server starts, so a limit set for the process is what those tools return. Setting the variable after the process is already running does not resize the worker.

Recommended order:

1. `profiler_status`.
Expand Down
7 changes: 5 additions & 2 deletions .github/linux-test-partitions.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@
"example:tracedecay-host-cli-fixture"
],
"features": [
"tracedecay/test-helpers"
"tracedecay/test-helpers",
"tracedecay/search-eval"
]
},
{
Expand Down Expand Up @@ -193,6 +194,7 @@
"tracedecay-framing",
"tracedecay-hooks",
"tracedecay-host-integration",
"tracedecay-hotpath-guard",
"tracedecay-mcp-catalog",
"tracedecay-policy",
"tracedecay-privacy",
Expand Down Expand Up @@ -236,6 +238,7 @@
}
],
"not_run": {
"tracedecay-global-db::schema_convergence_hotpath": "requires hotpath-alloc, which no test lane enables; the hotpath workflows own it"
"tracedecay-global-db::schema_convergence_hotpath": "requires hotpath-alloc, which no test lane enables; the hotpath workflows own it",
"tracedecay-hotpath-guard::functions_limit_live": "requires hotpath and hotpath-mcp to start a live MCP server, which no test lane enables; the hotpath graph check compiles it"
}
}
48 changes: 25 additions & 23 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -219,24 +219,17 @@ jobs:
python3 scripts/test-check-dev-skill-mirrors.py
python3 scripts/check-dev-skill-mirrors.py check

- name: Validate pushed commit messages
if: github.event_name == 'push'
# Dispatch admits an integration branch. Judge the commits a merge onto
# the default branch would introduce, with the same linter a push uses.
# A push still uses the before SHA, so published history is not rejudged.
- name: Validate commit messages
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
env:
EVENT_NAME: ${{ github.event_name }}
BEFORE_SHA: ${{ github.event.before }}
HEAD_SHA: ${{ github.sha }}
run: |
set -euo pipefail
if [ "$BEFORE_SHA" = "0000000000000000000000000000000000000000" ]; then
if git rev-parse "${HEAD_SHA}^" >/dev/null 2>&1; then
base_sha="${HEAD_SHA}^"
else
git show --no-patch --format=%B "$HEAD_SHA" | npm run lint:commit --
exit 0
fi
else
base_sha="$BEFORE_SHA"
fi
node scripts/lint-commit-range.mjs --repository "$PWD" "$base_sha" "$HEAD_SHA"
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
run: scripts/lint-ci-commits.sh

macos-test-partition:
name: Test macOS ${{ matrix.group }}
Expand Down Expand Up @@ -431,10 +424,14 @@ jobs:
# `--lib` / `--test <name>` / `--bins` decide what compiles, and a filterset
# would compile everything and skip at run time. The three root partitions
# share one package selection (`tracedecay`, `tracedecay-cli`,
# `tracedecay-search-eval`) with the root fixture feature, so they resolve
# one identical dependency graph and every cargo invocation inside a job
# (the test build, the executables the suites spawn) is a cache hit against
# it. `scripts/linux-test-partitions.py check` proves, from `cargo
# `tracedecay-search-eval`) with the root fixture feature. Journeys also
# enable `tracedecay/search-eval`, the only link from the root crate to the
# evaluator library. It stays off every other partition: an unconditional
# dependency unifies `tracedecay-query/search-eval` into every test
# target of the package, and the transport suites then compile the eval-only
# lexical projection. Every cargo invocation inside a job (the test build,
# the executables the suites spawn) is a cache hit against that job's
# resolution. `scripts/linux-test-partitions.py check` proves, from `cargo
# metadata`, that every test target in the workspace is selected by exactly
# one partition or listed under `not_run` with a reason, so a new crate or
# suite cannot fall out of the lane silently; `scope-gate` derives the
Expand Down Expand Up @@ -737,7 +734,12 @@ jobs:
shared-key: ci-test-full-windows-msvc-lld
cache-on-failure: true

# Acceptance tests execute the ordinary evaluator binaries. Match the
# Acceptance tests execute the ordinary evaluator binaries, and
# `tracedecay/search-eval` is what compiles the suites that check the
# CLI receipt against the library. This lane builds `--workspace`, so
# the evaluator and `tracedecay-query/search-eval` already resolve here
# and the feature adds no compilation; the Linux partitions split the
# package selection, which is why it is per-partition there. Match the
# archive's features and perf profile to reuse dependency artifacts;
# nextest's archive.include carries the executables to every shard.
# `--tests` keeps the binaries in the dev-dependency graph the archive
Expand All @@ -746,14 +748,14 @@ jobs:
# lane).
- name: Build workspace binaries and tests for the Windows test lane
shell: pwsh
run: cargo build --workspace --bins --tests --locked --profile perf --features tracedecay/test-helpers
run: cargo build --workspace --bins --tests --locked --profile perf --features tracedecay/test-helpers,tracedecay/search-eval

# `--workspace`, not `-p tracedecay-cli`: the package selection decides
# feature unification, and the narrower one recompiles the code-index
# and extraction crates in a second configuration (see the Linux lane).
- name: Build Windows host-CLI test fixture
shell: pwsh
run: cargo build --workspace --example tracedecay-host-cli-fixture --locked --profile perf --features tracedecay/test-helpers
run: cargo build --workspace --example tracedecay-host-cli-fixture --locked --profile perf --features tracedecay/test-helpers,tracedecay/search-eval

# The controlled-workload Hotpath parity helpers are provisioned and
# verified by the `hotpath-parity` job. Building them here would put a
Expand All @@ -764,7 +766,7 @@ jobs:
# archive alias, so the arguments are spelled out here once.
- name: Build nextest archive
shell: pwsh
run: cargo nextest archive --workspace --profile ci --locked --features tracedecay/test-helpers --cargo-profile perf --timings --archive-file "$env:RUNNER_TEMP/nextest-archive.tar.zst"
run: cargo nextest archive --workspace --profile ci --locked --features tracedecay/test-helpers,tracedecay/search-eval --cargo-profile perf --timings --archive-file "$env:RUNNER_TEMP/nextest-archive.tar.zst"

- name: Upload Windows archive build timings
if: always()
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -1710,6 +1710,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- *(admission)* `NotApplicable` is a terminal no-op in the shared replay-pass
decision. A closed status that leaves the spool unchanged now stops until
the next kick instead of entering the retryable backoff arm.

- *(code-index)* the background worker consults the typed publication-authority
park instead of a loop-local bool, so a park it has not yet observed still
stops reconcile. Branch publication handles `NotApplicable` as a closed
Expand Down
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ members = [
"crates/tracedecay-host-admission",
"crates/tracedecay-host-integration",
"crates/tracedecay-hooks",
"crates/tracedecay-hotpath-guard",
"crates/tracedecay-lcm",
"crates/tracedecay-lsp",
"crates/tracedecay-maintenance",
Expand Down
11 changes: 11 additions & 0 deletions crates/tracedecay-agent-hosts/src/agents/codex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,17 @@ impl AgentIntegration for CodexIntegration {
// Core apply drives `codex plugin add` when the host CLI is present.
// When it is not, stop with the same backtick remediation preflight
// uses so operators (and lifecycle tests) can activate natively.
//
// `Ready` here is a promise that Core apply can complete, so it must
// not be returned when no `codex` resolves. Returning it anyway opens
// a component transaction that can only die in activation with
// `HostCliUnavailable`; the rollback leaves a `RolledBack` journal
// whose registration backup pins `config.toml` and the versioned
// plugin cache as they were *before* the operator runs the printed
// `codex plugin add`. The next lifecycle command starts with
// `recover_host`, replays that stale rollback over the now-remediated
// host, and refuses with `StalePreview` -- making the remediation this
// very error prints impossible to follow.
if plugin_registry::require_codex_plugin_cli().is_err() {
let marketplace_name = codex_exact_personal_marketplace_name(&ctx.home)
.ok()
Expand Down
36 changes: 36 additions & 0 deletions crates/tracedecay-agent-hosts/src/agents/codex/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1027,6 +1027,42 @@ fn prepare_stages_the_source_and_returns_ready_for_cli_activation() {
);
}

/// `Ready` promises Core apply can drive `codex plugin add`, so an
/// unresolvable plugin CLI must defer instead.
///
/// Answering `Ready` opens a component transaction that can only die in
/// activation with `HostCliUnavailable`. Its rollback leaves a `RolledBack`
/// journal pinning `config.toml` and the versioned cache as they were before
/// the operator runs the remediation the failure prints, and the next
/// lifecycle command's `recover_host` then refuses the drifted host with
/// `StalePreview`.
#[test]
fn prepare_defers_when_no_plugin_cli_resolves() {
let home = tempfile::tempdir().unwrap();
// Resolution sees only this empty directory; the process `PATH` (which on
// a developer box usually does carry `codex`) is untouched.
let empty = tempfile::tempdir().unwrap();
let _host_programs =
tracedecay_runtime_core::config::HostProgramSearchPathGuard::set(empty.path());

let outcome = CodexIntegration
.prepare_non_interactive_install(&install_ctx(home.path()))
.unwrap();
let NonInteractiveInstallOutcome::DeferredUserAction(deferred) = outcome else {
panic!("staging Codex without a resolvable plugin CLI must defer, got {outcome:?}");
};
assert!(
deferred
.remediation
.contains("`codex plugin add tracedecay@personal`"),
"the deferral must print the executable remediation: {}",
deferred.remediation
);
// The source is still staged: the operator's `codex plugin add` consumes it.
assert!(codex_plugin_manifest_path(home.path()).is_file());
assert!(codex_personal_marketplace_path(home.path()).is_file());
}

/// Activation must record hook trust even when Codex already reports the
/// plugin natively active (no `codex plugin add` run): an already-current
/// install can still carry missing or stale trust, and the canonical
Expand Down
1 change: 1 addition & 0 deletions crates/tracedecay-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ tracedecay-dashboard-api = { path = "../tracedecay-dashboard-api", version = "0.
tracedecay-domain = { path = "../tracedecay-domain", version = "0.1.0" }
tracedecay-global-db = { path = "../tracedecay-global-db", version = "0.1.0" }
tracedecay-hooks = { path = "../tracedecay-hooks", version = "0.1.0" }
tracedecay-hotpath-guard = { path = "../tracedecay-hotpath-guard", version = "0.1.0" }
tracedecay-host-integration = { path = "../tracedecay-host-integration", version = "0.1.0" }
tracedecay-lsp = { path = "../tracedecay-lsp", version = "0.1.0" }
tracedecay-maintenance = { path = "../tracedecay-maintenance", version = "0.1.0" }
Expand Down
6 changes: 3 additions & 3 deletions crates/tracedecay-cli/src/cli/dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,13 @@ pub async fn resolve_cli_application_surface(
execute_application_surface(operation, dispatched, executor).await
}

/// Delay before re-sending the same CLI application request when its typed
/// pre-admission problem explicitly directs an after-delay retry.
/// Delay before re-sending the same CLI application request when its completed
/// problem is the publication-window mounting refusal.
pub(crate) fn surface_retry_delay(result: &ApplicationSurfaceInvocationResult) -> Option<Duration> {
result
.result
.as_ref()
.err()?
.problem
.pre_admission_retry_delay()
.owner_mount_resend_delay()
}
11 changes: 8 additions & 3 deletions crates/tracedecay-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -523,9 +523,14 @@ fn hotpath_guard() -> hotpath::HotpathGuard {
// CPU sampling remains available only by explicit operator request:
// `HOTPATH_REPORT` (e.g. `functions-cpu`) takes precedence over this
// default exclusion.
hotpath::HotpathGuardBuilder::new("tracedecay")
.sections_exclude(vec![hotpath::Section::FunctionsCpu])
.build()
// Hotpath 0.24 reads HOTPATH_FUNCTIONS_LIMIT only when the exit report is
// built. Live functions_timing and functions_alloc use the builder limit
// captured when this guard starts, so the same env is applied here.
tracedecay_hotpath_guard::with_functions_display_limit(
hotpath::HotpathGuardBuilder::new("tracedecay")
.sections_exclude(vec![hotpath::Section::FunctionsCpu]),
)
.build()
}

#[cfg(feature = "hotpath")]
Expand Down
35 changes: 9 additions & 26 deletions crates/tracedecay-cli/src/tool_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,6 @@ const PROFILE_REGISTRY_TOOLS: &[&str] = &[
"tracedecay_project_context",
];

const MAX_SURFACE_ATTEMPTS: usize = 3;

fn tool_deadline_range_error() -> TraceDecayError {
TraceDecayError::Config {
message: format!(
Expand Down Expand Up @@ -429,17 +427,13 @@ fn dispatch_cli_application_surface_inner(
let handshake =
tracedecay::daemon::handshake_for_current_client(project, None, false, false)?;
let client = tracedecay_daemon_identity::invocation_client_for_current(handshake)?;
// A cold daemon answers a retryable pre-admission problem while the
// project open still warms in the background (bounded by the daemon's
// foreground open wait). The compatibility tool path rides that state out
// through its project-open retry loop; the typed surface path must present
// the same transport behavior, so re-send the same request per the
// envelope's own retry directive, bounded by both the CLI deadline and
// three attempts so a persistent refusal remains visible to callers.
// A cold daemon answers the mounting refusal while the project open
// still warms in the background. The compatibility tool path rides
// that state out through its project-open retry loop; the typed
// surface path re-sends only that same refusal, until the CLI
// deadline. Every other completed problem is the answer.
let mut next_request = Some(request);
let mut attempts = 0usize;
let result = loop {
attempts += 1;
let request = match next_request.take() {
Some(request) => request,
None => parse_application_surface_request(operation, tool_args.clone()).map_err(
Expand Down Expand Up @@ -486,29 +480,18 @@ fn dispatch_cli_application_surface_inner(
message: error.to_string(),
},
})?;
let Some(delay) = bounded_surface_retry_delay(
crate::cli::dispatch::surface_retry_delay(&result),
attempts,
deadline,
) else {
let Some(delay) = crate::cli::dispatch::surface_retry_delay(&result) else {
break result;
};
if deadline.saturating_duration_since(Instant::now()) <= delay {
break result;
}
tokio::time::sleep(delay).await;
};
print_cli_application_surface(result, requested_format == RequestedOutputFormat::Json)
})
}

fn bounded_surface_retry_delay(
delay: Option<Duration>,
attempts: usize,
deadline: Instant,
) -> Option<Duration> {
let delay = delay?;
(attempts < MAX_SURFACE_ATTEMPTS && deadline.saturating_duration_since(Instant::now()) > delay)
.then_some(delay)
}

fn print_cli_application_surface(
result: ApplicationSurfaceInvocationResult,
raw_json: bool,
Expand Down
Loading
Loading