Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
e8942b1
docs(user-guide): align daemon requirement and read-only contract
ScriptedAlchemy Oct 21, 2026
234483c
test(cli): prove daemon-required init and local-only reads
ScriptedAlchemy Oct 21, 2026
2c2bd60
test(cli): make daemon contract checks observe real boundaries
ScriptedAlchemy Oct 21, 2026
0db3f31
fix(memory): size admission atomically and preserve blocked progress
ScriptedAlchemy Oct 21, 2026
bf193ab
fix(tests): finish MCP shutdown before removing fixture data
ScriptedAlchemy Oct 21, 2026
7fa37f8
fix(automation): retain curator ownership through settlement
ScriptedAlchemy Oct 21, 2026
99810d7
fix(automation): retain preparation writes through client abort
ScriptedAlchemy Oct 21, 2026
cf2b6fe
fix(runtime): await registered scope-set reads off native workers
ScriptedAlchemy Oct 21, 2026
b24ed62
fix(tests): use public native runtime context
ScriptedAlchemy Oct 21, 2026
c68e882
test(daemon): preserve runtime and JSON journey contracts
ScriptedAlchemy Oct 21, 2026
e39861a
test(cli): keep daemon fixtures outside tmpdir
ScriptedAlchemy Oct 22, 2026
960a6b0
Merge remote-tracking branch 'origin/master' into docs/4344-user-guid…
ScriptedAlchemy Oct 22, 2026
86342c6
Merge branch 'master' into docs/4344-user-guide-and-daemon-contract-t…
ScriptedAlchemy Oct 22, 2026
dd55701
test(runtime): retry typed transcript readiness before restart
ScriptedAlchemy Oct 22, 2026
4d6531b
Merge master and retain native daemon fixture ownership
ScriptedAlchemy Oct 22, 2026
5bbb112
Merge branch 'master' into docs/4344-user-guide-and-daemon-contract-t…
ScriptedAlchemy Oct 22, 2026
88f8594
Merge branch 'master' into docs/4344-user-guide-and-daemon-contract-t…
ScriptedAlchemy Oct 22, 2026
e5b5da2
Merge branch 'master' into docs/4344-user-guide-and-daemon-contract-t…
ScriptedAlchemy Oct 22, 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
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ the installed cache is loaded.
## Common Commands

```bash
tracedecay daemon install-service # install + start the user service (required before init)
tracedecay daemon run # foreground daemon when no systemd user session exists
tracedecay daemon install-service # optional persistent user service
tracedecay daemon run # foreground alternative; use another terminal for init
tracedecay init [path] # enroll and request the first index
tracedecay sync [path] # explicit administrative refresh
tracedecay status [path] # graph stats, freshness, savings, cost
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub async fn finalize_terminal_housekeeping(
) -> Result<()> {
let dashboard_root = dashboard_root.to_path_buf();
let journal_path = journal_path.to_path_buf();
tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
recovery_index::remove_pending_blocking(&dashboard_root, &journal_path)
})
.await
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1204,21 +1204,22 @@ impl AutomationEffectAuthority {
let index_root = dashboard_root.clone();
let index_path = journal_path.clone();
let indexed = admission.clone();
let reservation = tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
let _span = tracing::trace_span!("daemon.automation.effect.reserve").entered();
{
reserve_or_replay_indexed_blocking(
&reserve_path,
requested,
|| add_pending_blocking(&index_root, &index_path, &indexed),
|| remove_pending_blocking(&index_root, &index_path),
)
}
})
.await
.map_err(|error| {
contract_error(format!("automation reservation writer failed: {error}"))
})??;
let reservation =
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
let _span = tracing::trace_span!("daemon.automation.effect.reserve").entered();
{
reserve_or_replay_indexed_blocking(
&reserve_path,
requested,
|| add_pending_blocking(&index_root, &index_path, &indexed),
|| remove_pending_blocking(&index_root, &index_path),
)
}
})
.await
.map_err(|error| {
contract_error(format!("automation reservation writer failed: {error}"))
})??;
let admission = match reservation {
ReservationResult::Replay {
terminal,
Expand Down Expand Up @@ -1689,7 +1690,7 @@ impl AutomationEffectAuthority {
let path = self.journal_path.clone();
let admission = self.admission.clone();
let journal_publication = publication.clone();
let terminal = tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
let terminal = tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
promote_prepared_terminal_blocking(&path, &admission, terminal, &journal_publication)
})
.await
Expand All @@ -1715,7 +1716,7 @@ impl AutomationEffectAuthority {
let path = self.journal_path.clone();
let admission = self.admission.clone();
let cancellation = self.cancellation.clone();
tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
persist_recovered_terminal_blocking(&path, &admission, terminal, Some(&cancellation))?
.ok_or_else(|| contract_error("automation recovery settlement was cancelled"))
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ pub async fn publish_staged_run_record_exact(
let root = dashboard_root.to_path_buf();
let run_id = run_id.to_owned();
let publication = publication.clone();
tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
publish_staged_run_record_exact_blocking(&root, &run_id, &publication)
})
.await
Expand All @@ -394,7 +394,7 @@ pub async fn discard_staged_run_record_exact(
let root = dashboard_root.to_path_buf();
let run_id = run_id.to_owned();
let expected = expected.clone();
tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
discard_staged_run_record_exact_blocking(&root, &run_id, &expected)
})
.await
Expand Down Expand Up @@ -422,7 +422,7 @@ where
validate_run_id_component(run_id)?;
let root = dashboard_root.to_path_buf();
let run_id = run_id.to_owned();
tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
with_spool_lock(&root, || {
if !validate_unbound()? {
return Ok(ExactRunUnboundDiscardOutcome::Retained);
Expand Down Expand Up @@ -578,7 +578,7 @@ where
let root = dashboard_root.to_path_buf();
let run_id = run_id.to_owned();
let expected = expected.clone();
tracedecay_runtime_core::native_runtime::spawn_blocking(move || {
tracedecay_runtime_core::native_runtime::spawn_owned_blocking(move || {
discard_stale_staged_run_record_exact_after_terminal_blocking(
&root,
&run_id,
Expand Down
Loading
Loading