From 9a776b8e1e4a308e62cffe5e236eb60ce68bf503 Mon Sep 17 00:00:00 2001 From: Edvane Cristina Santos Daltro Date: Sat, 31 Oct 2026 10:03:31 -0400 Subject: [PATCH 1/6] Correct Setup marker ownership and legacy deletion assumptions --- .../setup-design.md | 82 ++++++++++++++++--- 1 file changed, 70 insertions(+), 12 deletions(-) diff --git a/openspec/changes/complete-plugin-hook-runtime/setup-design.md b/openspec/changes/complete-plugin-hook-runtime/setup-design.md index 1c0023291..42e68fd16 100644 --- a/openspec/changes/complete-plugin-hook-runtime/setup-design.md +++ b/openspec/changes/complete-plugin-hook-runtime/setup-design.md @@ -39,9 +39,12 @@ no filesystem I/O. Retained path strings obey existing Session validation. Use `Store::append_checked` for Session creation: decide automatic eligibility under its writer transaction, then append `session.created.1` and an owned Setup -attempt event in the same Session aggregate/transaction. The marker projection -has a unique installation/directory key. Concurrent creators still create their -Sessions successfully; only the winner records a dispatchable automatic attempt. +attempt event atomically across their separate aggregates. The Setup event and +marker belong to the installation/Location owner, not the Session aggregate that +normal Session deletion purges. The marker projection has a unique +installation/directory key and no cascading Session ownership. Concurrent creators +still create their Sessions successfully; only the winner records a dispatchable +automatic attempt. A rolled-back creation records neither Session nor marker. A child Session cannot claim the automatic marker. Child-only history does not consume it. @@ -60,12 +63,15 @@ reported as an empty completed init. A bounded live-invocation registry identifi currently running attempts; an admitted, unsettled attempt without that owner is unknown. Transport retry inspects that state and never restarts dispatch. -For an existing Store without markers, prior root creation events at the same stored directory (including Sessions -later moved, archived or deleted) consume the legacy automatic marker without dispatching any -new effect. Decide this in the writer transaction, not a filesystem scan or -startup replay. A historical attempt may already have mutated external state. +For an existing Store without markers, surviving root creation events at the same +stored directory (including roots later moved or archived) are positive evidence +for consuming a legacy automatic marker without dispatching another effect. +Deleted roots need the separate legacy review below: their creation events are +not retained. Decide migrations in the writer transaction, not a filesystem scan +or startup replay. A historical attempt may already have mutated external state. Do not infer successful execution from history, replay uncertain effects, or -blanket-mark legacy handlers completed. Explicit init remains available. +blanket-mark legacy handlers completed. Explicit init remains a new user-owned +attempt rather than a replay of old execution. Dispatch only after commit, outside Session/writer locks and shutdown admission held by creation. Recheck the live Session/directory and existing hook policy @@ -73,6 +79,56 @@ before handler admission. Session moves/archive, shutdown and ownership loss cannot turn an old attempt into a newly authorized effect. A crash after marker commit may skip an unlaunched effect; it must not automatically replay it. +## Session deletion and legacy-history review + +Source inspection at `ecce8b38` establishes a limitation in the preceding draft. +`runtime/deletion.rs::Runtime::delete` removes the Session/descendant aggregates' +non-team events, their sequence rows and Session projections. Consequently a +query of `session.created.1` cannot recover every previously used Location after +normal deletion. Replacing the current eligibility query with only +`parent_id IS NULL` could turn child-only surviving history into a fresh Setup +even when an earlier root and its potentially mutating attempt were deleted. +The surviving child can belong to another root's subtree; deletion removes the +deleted root's own descendants. +No such query change has been implemented. + +The independent `hook.started.1` aggregates can retain positive Setup receipt +facts, while the `hook_execution` projection cascades with Session deletion. +Retained, non-synthetic Setup receipt facts may therefore establish an earlier +attempt; they do not establish successful settlement or a complete set of prior +Locations. The usage ledger retains only provider/auxiliary-call facts, so a +Session that ran no model call supplies no complete setup-history substitute. +The computer-deletion tombstone records an ID/time rather than a Location. +Absence from any of these sources is not proof that Setup never ran. + +Future installation markers, attempt admission/settlement and request deduplication +must survive Session deletion in their own durable aggregates/projections. Their +records retain bounded owner facts needed for this contract, not deleted prompt +history or handler IO. Checked live admission validates the real root Session +under the writer transaction; replay validates self-contained marker/attempt +facts without requiring a Session projection that may legitimately be gone. +Rebuilding projections must preserve an admitted or unknown attempt rather than +making it eligible again. Deletion cannot clear a consumed automatic marker or +allow an old init request ID to create another Session. + +Legacy bootstrap remains an explicit review item before S2. A migration can +consume positive historical evidence, but cannot manufacture the missing +pre-marker history of deleted roots. The complete migration/support decision +must explain how unproven legacy Locations obtain fresh user authority without +replaying uncertain effects. An explicit init is one available user-owned action; +no policy that silently reruns Setup, silently resets installation identity or +universally refuses automatic Setup is selected by this document. Approval of +the two epoch/key choices alone does not settle this newly identified legacy +bootstrap requirement. The full original Setup contract remains required until +a revised compatibility decision is reviewed. + +Required adversarial cases include root/attempt deletion before restart, a +previously deleted root with another parent's child surviving at that Location, +an empty settled attempt, +unknown execution, projection rebuild after Session deletion, and an exact init +retry whose original Session was deleted. Each must retain the original attempt +identity and outcome/uncertainty; none may manufacture another mutating dispatch. + ## Explicit init surface `cyber --init --cwd ` creates a root Session and requests a Setup @@ -107,17 +163,19 @@ remain authoritative; init grants no additional permissions. ## Implementation and acceptance tasks -- [ ] S1 Review both decisions above and update this document with the decision. +- [ ] S1 Review both epoch/key decisions and the legacy-deletion bootstrap requirement above; record the accepted complete migration/support decision before implementation. - [ ] S2 Add bounded events, marker projection/migration and writer-atomic root - Session admission; cover concurrent creation, children, legacy history and - projection rebuild with actual Store transactions. + Session admission across separate durable owners; cover concurrent creation, + children, legacy/deleted history and rebuild after Session deletion with actual + Store transactions. - [ ] S3 Bind Setup receipts to the admitted attempt; test duplicate, moved, archived and forged/synthetic admission, empty-settlement versus lost-owner ambiguity, failed/unknown outcomes, cancellation and crash points before/after marker and handler acknowledgement. - [ ] S4 Add the owner operation and top-level init CLI/API/SDK/schema artifacts; test transport retries, request-binding refusal, no model Turn/TUI and - explicit/automatic coalescing through the real App and CLI. + explicit/automatic coalescing and retry after Session deletion through the real + App and CLI. - [ ] S5 Verify unchanged hook trust/pure/managed rules and outcome reporting on Linux/macOS/Windows, including native command hooks and HTTP handlers where configured. Record unavailable checks explicitly. From 5693db1a118dc4268b6d5dd4a7b547da78b661cd Mon Sep 17 00:00:00 2001 From: Edvane Cristina Santos Daltro Date: Sat, 31 Oct 2026 10:22:41 -0400 Subject: [PATCH 2/6] Retain exact PR85 native FileChanged acceptance --- .../evidence/file-observation-ecce8b38.json | 157 ++++++++++++++++++ .../file-observation-acceptance.md | 12 ++ 2 files changed, 169 insertions(+) create mode 100644 openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-ecce8b38.json diff --git a/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-ecce8b38.json b/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-ecce8b38.json new file mode 100644 index 000000000..46af4b5f7 --- /dev/null +++ b/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-ecce8b38.json @@ -0,0 +1,157 @@ +{ + "head": "ecce8b381c91e22f25b43f9a1cf6f8761c991cce", + "scope": "Exact PR85 native platform acceptance; all relevant test/source bytes match the tested merge tree. Broader PR checks and merge review remain separate. This does not establish plugin confinement or Setup completion.", + "suite_order": [ + "core records", + "core envelope", + "native/scanner/owner", + "runtime roots", + "Store/runtime", + "HTTP callbacks", + "AppHost forwarding", + "MCP" + ], + "jobs": [ + { + "platform": "windows", + "job_id": 124555532039, + "url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41207519078/job/124555532039", + "tested_merge": "8de13b5445509a214d4f70f1082728a65b202df1", + "tree": "119568e94fdef8498056b4448a17980c440f483f", + "verified_tree_matches_head": true, + "log_sha256": "90f80e014e4eac8bd08b360299261cccc14776a91325a2b961362d3b24e2a244", + "named_retarget_cases_executed": [ + "unused_user_acknowledgement_cannot_follow_a_retargeted_alias", + "symlink_retarget_loses_old_delivery_and_user_input_admits_the_new_physical_scope" + ], + "suite_counts": [ + { + "passed": 13, + "ignored": 0 + }, + { + "passed": 1, + "ignored": 0 + }, + { + "passed": 49, + "ignored": 0 + }, + { + "passed": 2, + "ignored": 0 + }, + { + "passed": 17, + "ignored": 0 + }, + { + "passed": 24, + "ignored": 0 + }, + { + "passed": 2, + "ignored": 0 + }, + { + "passed": 29, + "ignored": 0 + } + ] + }, + { + "platform": "linux", + "job_id": 124555531908, + "url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41207519078/job/124555531908", + "tested_merge": "8de13b5445509a214d4f70f1082728a65b202df1", + "tree": "119568e94fdef8498056b4448a17980c440f483f", + "verified_tree_matches_head": true, + "log_sha256": "b8d397f46a5c00ecbe9a619497042161b360ce5ca5a743f187e6fc147afc9bd3", + "named_retarget_cases_executed": [ + "unused_user_acknowledgement_cannot_follow_a_retargeted_alias", + "symlink_retarget_loses_old_delivery_and_user_input_admits_the_new_physical_scope" + ], + "suite_counts": [ + { + "passed": 13, + "ignored": 0 + }, + { + "passed": 1, + "ignored": 0 + }, + { + "passed": 58, + "ignored": 1 + }, + { + "passed": 7, + "ignored": 1 + }, + { + "passed": 17, + "ignored": 0 + }, + { + "passed": 24, + "ignored": 0 + }, + { + "passed": 2, + "ignored": 0 + }, + { + "passed": 30, + "ignored": 0 + } + ] + }, + { + "platform": "macos", + "job_id": 124555532069, + "url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41207519078/job/124555532069", + "tested_merge": "8de13b5445509a214d4f70f1082728a65b202df1", + "tree": "119568e94fdef8498056b4448a17980c440f483f", + "verified_tree_matches_head": true, + "log_sha256": "2e9854e6f144ecbb6393cfe015c1e77ba8b22efd2bb0a0890c4874ed286daf6d", + "named_retarget_cases_executed": [ + "unused_user_acknowledgement_cannot_follow_a_retargeted_alias", + "symlink_retarget_loses_old_delivery_and_user_input_admits_the_new_physical_scope" + ], + "suite_counts": [ + { + "passed": 13, + "ignored": 0 + }, + { + "passed": 1, + "ignored": 0 + }, + { + "passed": 58, + "ignored": 1 + }, + { + "passed": 6, + "ignored": 1 + }, + { + "passed": 17, + "ignored": 0 + }, + { + "passed": 24, + "ignored": 0 + }, + { + "passed": 2, + "ignored": 0 + }, + { + "passed": 30, + "ignored": 0 + } + ] + } + ] +} diff --git a/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md b/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md index 3a8749744..970146eb4 100644 --- a/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md +++ b/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md @@ -73,3 +73,15 @@ checks pass. Strict OpenSpec passes 114 items; spec lint reports zero errors and 25 warnings. The subsequent native platform run above verifies the revised tests on Linux/macOS/Windows. It retains the existing intentional Unix subprocess-helper parent ignores and platform-specific component counts explicitly in the receipt. + +## Exact PR85 platform verification + +The [current-source receipt](evidence/file-observation-ecce8b38.json) verifies all +three focused jobs on `ecce8b381c91e22f25b43f9a1cf6f8761c991cce`. Each actual +checkout uses merge `8de13b5445509a214d4f70f1082728a65b202df1`, whose tree +`119568e94fdef8498056b4448a17980c440f483f` equals the PR head. Both named +retarget regressions execute and pass on every platform, with 17 Store/runtime +and 24 real HTTP cases each. Component/helper counts and log hashes remain +explicit in the receipt. This confirms the earlier direct-branch acceptance on +the actual PR composition; four broader PR checks were still running when this +receipt was recorded. Task 5.2 remains open for their results and merge review. From c335070dcac25830eebdd4cddea00c6799915ee9 Mon Sep 17 00:00:00 2001 From: Edvane Cristina Santos Daltro Date: Sat, 31 Oct 2026 10:37:17 -0400 Subject: [PATCH 3/6] Clarify atomic Store append prerequisite for Setup --- .../setup-design.md | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/openspec/changes/complete-plugin-hook-runtime/setup-design.md b/openspec/changes/complete-plugin-hook-runtime/setup-design.md index 42e68fd16..cbfdff9b8 100644 --- a/openspec/changes/complete-plugin-hook-runtime/setup-design.md +++ b/openspec/changes/complete-plugin-hook-runtime/setup-design.md @@ -37,14 +37,24 @@ Create the installation epoch once through the existing single writer. Automatic markers are keyed by `(installation_epoch, stored_directory)`. Projectors perform no filesystem I/O. Retained path strings obey existing Session validation. -Use `Store::append_checked` for Session creation: decide automatic eligibility -under its writer transaction, then append `session.created.1` and an owned Setup -attempt event atomically across their separate aggregates. The Setup event and +Extend the checked-append facility for Session creation: decide automatic +eligibility under its writer transaction, then append `session.created.1` and an +owned Setup attempt event atomically across their separate aggregates. The +current `Store::append_checked` accepts only one aggregate; it cannot already +perform this operation. The Setup event and marker belong to the installation/Location owner, not the Session aggregate that normal Session deletion purges. The marker projection has a unique installation/directory key and no cascading Session ownership. Concurrent creators still create their Sessions successfully; only the winner records a dispatchable automatic attempt. +The Store extension must bound the aggregate/event groups, retain registered +event validation, expected-sequence checks and fault injection, and run all +projectors in the same writer transaction. A late conflict or projector error +rolls back every group's events, sequence rows and projection effects. Publish +notifications only after the combined commit. Do not emulate this with two +separate acknowledged appends or call a public Store mutation from inside its +writer callback; `append_in_tx` is currently private to `cyber-store`. + A rolled-back creation records neither Session nor marker. A child Session cannot claim the automatic marker. Child-only history does not consume it. @@ -167,7 +177,9 @@ remain authoritative; init grants no additional permissions. - [ ] S2 Add bounded events, marker projection/migration and writer-atomic root Session admission across separate durable owners; cover concurrent creation, children, legacy/deleted history and rebuild after Session deletion with actual - Store transactions. + Store transactions. Extend checked append across the bounded owner aggregates; + test late CAS/validation/projector failures, complete rollback, ordering and + absence of uncommitted notifications through the actual writer. - [ ] S3 Bind Setup receipts to the admitted attempt; test duplicate, moved, archived and forged/synthetic admission, empty-settlement versus lost-owner ambiguity, failed/unknown outcomes, cancellation From 18d52b012561b8ff105c9288392a2f7b3df88d65 Mon Sep 17 00:00:00 2001 From: Edvane Cristina Santos Daltro Date: Sat, 31 Oct 2026 10:46:26 -0400 Subject: [PATCH 4/6] Reconcile native verifier task evidence --- .../changes/complete-plugin-hook-runtime/tasks.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/openspec/changes/complete-plugin-hook-runtime/tasks.md b/openspec/changes/complete-plugin-hook-runtime/tasks.md index 2cd312a09..3c747780a 100644 --- a/openspec/changes/complete-plugin-hook-runtime/tasks.md +++ b/openspec/changes/complete-plugin-hook-runtime/tasks.md @@ -55,10 +55,13 @@ also have source-bound native receipts. Its [trusted-worker capacity/recovery ca passed on x64/arm64 in run 41049265434, with source-bound receipts retained. These experiments change no production policy or accepted support floor. -The [raw datagram send-result correction](macos-send-result-validation.md) adds a -real copied-fixture regression for stale errno after a zero return and retains -current-source local evidence. Hosted verification and native admission remain -required; this correction does not close tasks 2.1–2.4. +The [raw datagram send-result correction](macos-send-result-validation.md) retains +raw syscall results and tests the shared verifier helpers with six deterministic +fault-injection cases and a precise missing-guard control. Both corrected hosted +macOS jobs at `62a3068e` passed those controls and the unchanged real IPC matrix. +The control is verifier evidence, not native confinement acceptance. The historical +unknown race cause and production native admission remain open; this correction +does not close tasks 2.1–2.4. ## 3. Host contribution lifecycle From f7db7edb4ff9d09fe40dbec9e70d9f1a345a355a Mon Sep 17 00:00:00 2001 From: Edvane Cristina Santos Daltro Date: Sat, 31 Oct 2026 14:01:22 -0400 Subject: [PATCH 5/6] Test CwdChanged refusal after unacknowledged Location settlement --- .../cyber-server/tests/location_activity.rs | 153 +++++++++++++++++- .../complete-plugin-hook-runtime/tasks.md | 18 +++ 2 files changed, 167 insertions(+), 4 deletions(-) diff --git a/crates/cyber-server/tests/location_activity.rs b/crates/cyber-server/tests/location_activity.rs index 334bb4778..4e2f38d58 100644 --- a/crates/cyber-server/tests/location_activity.rs +++ b/crates/cyber-server/tests/location_activity.rs @@ -3,7 +3,7 @@ mod support; use cyber_server::runtime::*; use futures::future::BoxFuture; use std::sync::{ - Arc, + Arc, Mutex, atomic::{AtomicBool, AtomicUsize, Ordering}, }; use std::time::Duration; @@ -17,6 +17,9 @@ struct Activity { deny: AtomicBool, shell_unresponsive: AtomicBool, claim_unresponsive: AtomicBool, + preserve_binding: AtomicBool, + fail_settlement: AtomicBool, + cwd_hooks: Mutex>, } struct Guard { @@ -26,6 +29,9 @@ struct Guard { impl LocationGuard for Guard { fn settle(mut self: Box) -> Result<(), String> { + if self.activity.fail_settlement.swap(false, Ordering::SeqCst) { + return Err("previous Location settlement unacknowledged".into()); + } self.settled = true; Ok(()) } @@ -58,10 +64,15 @@ impl ToolHost for Host { { return Err("checkout admission refused".into()); } - assert!(creating || info.worktree_id.as_deref() == Some("wt_test")); + let preserve_binding = self.activity.preserve_binding.load(Ordering::SeqCst); + assert!(preserve_binding || creating || info.worktree_id.as_deref() == Some("wt_test")); self.activity.active.fetch_add(1, Ordering::SeqCst); - let lease = LocationLease::managed( - "wt_test".into(), + let lease = LocationLease::guarded( + if preserve_binding { + info.worktree_id.clone() + } else { + Some("wt_test".into()) + }, Box::new(Guard { activity: Arc::clone(&self.activity), settled: false, @@ -75,6 +86,17 @@ impl ToolHost for Host { }) } + fn lifecycle_hooks( + &self, + event: LifecycleHook, + _: CancellationToken, + ) -> BoxFuture<'_, Result> { + if event.kind == "CwdChanged" { + self.activity.cwd_hooks.lock().unwrap().push(event); + } + Box::pin(async { Ok(LifecycleVerdict::default()) }) + } + fn definitions(&self, turn: &TurnContext) -> Vec { self.tools.definitions(turn) } @@ -452,3 +474,126 @@ fn retained_location_proof_preserves_acknowledged_guard_until_disposal() { assert!(!activity.unknown.load(Ordering::SeqCst)); drop(LocationLease::unmanaged().settle_retained().unwrap()); } + +#[tokio::test] +async fn cwd_changed_requires_acknowledged_previous_location_settlement() { + use cyber_core::worktrees::Managed; + + for unacknowledged in [false, true] { + let h = Harness::new(Setup { + scripts: vec![( + "test/main", + vec![tools(&[("lease_call", "read", "{}")]), text("done")], + )], + ..Default::default() + }); + h.tools.set("read", Behavior::Gated); + let (runtime, activity) = owned_runtime(&h); + activity.preserve_binding.store(true, Ordering::SeqCst); + let info = create(&runtime, &h, "test/main").await; + assert!(info.worktree_id.is_none()); + let destination = h.dir.path().join("destination"); + std::fs::create_dir(&destination).unwrap(); + let managed = Managed { + id: "wt_test".into(), + name: "destination".into(), + path: destination.clone(), + branch: "cyber/destination".into(), + base: "main".into(), + common_dir: h.repo.join(".git"), + ready: true, + included: vec![], + }; + runtime + .admit(&info.id, Admission::text("run", Delivery::Queue)) + .await + .unwrap(); + tokio::time::timeout(Duration::from_secs(5), h.tools.started.notified()) + .await + .unwrap(); + assert_eq!(activity.active.load(Ordering::SeqCst), 1); + activity + .fail_settlement + .store(unacknowledged, Ordering::SeqCst); + let result = tokio::time::timeout( + Duration::from_secs(5), + runtime.enter_worktree( + &info.id, + "lease_call", + &managed, + false, + CancellationToken::new(), + ), + ) + .await + .unwrap(); + // The path is committed before settlement of the previous admission. An + // uncertain acknowledgement must not turn that record into a success hook. + let state = runtime.state(&info.id).await.unwrap(); + assert_eq!(state.info.directory, destination.display().to_string()); + assert_eq!(state.info.worktree_id.as_deref(), Some("wt_test")); + let events = h + .store + .read_events(&info.id, -1, cyber_store::MAX_PAGE_LIMIT) + .unwrap() + .events; + let entered: Vec<_> = events + .iter() + .filter(|event| event.kind == "session.worktree.entered.1") + .collect(); + assert_eq!(entered.len(), 1); + assert!(!activity.fail_settlement.load(Ordering::SeqCst)); + assert_eq!(activity.unknown.load(Ordering::SeqCst), unacknowledged); + { + let hooks = activity.cwd_hooks.lock().unwrap(); + if unacknowledged { + assert!( + hooks.is_empty(), + "an unacknowledged transition emitted CwdChanged" + ); + assert!( + result + .unwrap_err() + .to_string() + .contains("settlement unacknowledged") + ); + } else { + result.unwrap(); + assert_eq!(hooks.len(), 1); + assert_eq!(hooks[0].directory, state.info.directory); + assert_eq!(hooks[0].fields["transition_id"], entered[0].id); + assert_eq!(hooks[0].fields["transition_sequence"], entered[0].seq); + } + } + if unacknowledged { + let error = runtime.exit_idle_worktree(&info.id).await.unwrap_err(); + assert!(error.to_string().contains("Location outcome unknown")); + let error = runtime + .check_enterable(&info.id, "lease_call") + .await + .unwrap_err(); + assert!(error.to_string().contains("Location outcome unknown")); + assert_eq!( + h.store + .read_events(&info.id, -1, cyber_store::MAX_PAGE_LIMIT) + .unwrap() + .events + .len(), + events.len() + ); + assert!(activity.cwd_hooks.lock().unwrap().is_empty()); + } + h.tools.release.notify_one(); + tokio::time::timeout(Duration::from_secs(5), runtime.wait_idle(&info.id)) + .await + .unwrap(); + tokio::time::timeout(Duration::from_secs(5), runtime.shutdown()) + .await + .unwrap(); + assert_eq!(activity.active.load(Ordering::SeqCst), 0); + assert_eq!( + activity.cwd_hooks.lock().unwrap().len(), + usize::from(!unacknowledged) + ); + } +} diff --git a/openspec/changes/complete-plugin-hook-runtime/tasks.md b/openspec/changes/complete-plugin-hook-runtime/tasks.md index 6c5bd4b3a..6e66375dd 100644 --- a/openspec/changes/complete-plugin-hook-runtime/tasks.md +++ b/openspec/changes/complete-plugin-hook-runtime/tasks.md @@ -115,3 +115,21 @@ The [pending observer owner correction](file-observation-pending-owner.md) bound remove/readmit replacement behind a settling owner while retaining cancellation and joined shutdown. Focused and platform acceptance remain required; task 5.2 stays open. + +## CwdChanged acknowledgement regression + +`location_activity::cwd_changed_requires_acknowledged_previous_location_settlement` +compares successful previous-Location settlement with an injected unacknowledged +settlement after the new Location has committed. Both paths retain one durable +enter record. Only acknowledged settlement emits CwdChanged with that record's +identity; the uncertain path returns an error, emits no success observation, and +refuses subsequent entry/idle-exit until recovery. It also checks that releasing +the running call and shutting down releases the remaining admission without a +delayed success hook. This exercises the real runtime and Store with a simulated +Location owner, not native OS confinement or an uncertain Store commit. + +The complete 12-case Location activity suite passes locally on macOS. A behavioral +negative control that falls through after failed settlement executes this exact +case and fails because it emitted CwdChanged; production source is restored. +Hosted platform acceptance and final review remain required. Task 5.3 stays open +for the complete producer matrix, including DirectoryAdded and Setup. From 4555bfd390ee444889eb3833d7b044c4ce7a49ad Mon Sep 17 00:00:00 2001 From: Edvane Cristina Santos Daltro Date: Sat, 31 Oct 2026 14:23:07 -0400 Subject: [PATCH 6/6] Record accepted FileChanged contract and platform evidence --- docs/goal-delivery.md | 22 +- .../evidence/file-observation-b08a1f5c.json | 273 ++++++++++++++++++ .../file-observation-post88-composition.json | 58 ++++ .../file-observation-acceptance.md | 78 +++-- .../file-observation-implementation.md | 7 + .../complete-plugin-hook-runtime/tasks.md | 37 ++- 6 files changed, 419 insertions(+), 56 deletions(-) create mode 100644 openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-b08a1f5c.json create mode 100644 openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-post88-composition.json diff --git a/docs/goal-delivery.md b/docs/goal-delivery.md index 5638603dc..f1575cac4 100644 --- a/docs/goal-delivery.md +++ b/docs/goal-delivery.md @@ -64,12 +64,22 @@ native result witness and deterministic missing-guard regression passed Intel and arm64; that accepts the verifier correction rather than production native admission or the historical unknown race cause. -Continue the first workstream on the single follow-up branch -`test/file-observer-windows-alias-acceptance`: native Windows retarget acceptance, -retained source-bound native evidence, and the DirectoryAdded prerequisite design -for review. Keep native activation and Linux dependency changes behind their -existing review/acceptance gates. The Setup marker choices and DirectoryAdded -proposal also require their recorded review before implementation. +PR #85 merged at `5d5826b7` after all 19 checks passed. It accepts bounded +FileChanged task 5.2 with verified native Windows retarget coverage and a reviewed +main composition; see the +[acceptance audit](../openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md). +PR #88 merged at `9cbbf08b` after all 18 checks passed, including all five +CwdChanged lifecycle cases on Windows. + +Continue the first workstream in PR #89 on `test/cwd-unknown-settlement`: +unacknowledged Location settlement must not emit successful CwdChanged, and the +FileChanged acceptance record is reconciled against accepted main. The regression +uses the actual runtime/Store with a simulated lease owner; its local positive +suite and behavioral negative control pass, while current-head hosted acceptance +is required. No production native activation or protocol implementation is +claimed. Keep native activation and Linux dependency changes behind their +existing review/acceptance gates. The complete Setup marker/migration choices +and DirectoryAdded proposal also need their recorded review before implementation. Native confinement foundations and regressions exist, but production enforcement and the remaining plugin/hook scope are incomplete. The diff --git a/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-b08a1f5c.json b/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-b08a1f5c.json new file mode 100644 index 000000000..33ad20d18 --- /dev/null +++ b/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-b08a1f5c.json @@ -0,0 +1,273 @@ +{ + "head": "b08a1f5c12491451ca8c9f011aab8427010039c3", + "platforms": { + "linux": { + "tested_merge": "151144ea4f94f53866710ff9a25d74d64ca6a605", + "job_url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41222546533/job/124599977235", + "suites_passed_ignored": [ + [ + "13", + "0" + ], + [ + "1", + "0" + ], + [ + "58", + "1" + ], + [ + "7", + "1" + ], + [ + "17", + "0" + ], + [ + "24", + "0" + ], + [ + "2", + "0" + ], + [ + "30", + "0" + ] + ], + "log_sha256": "963b3b1bfba2f77590c764b1968269c81d1087714967b0fcf09c77062923497e" + }, + "macos": { + "tested_merge": "151144ea4f94f53866710ff9a25d74d64ca6a605", + "job_url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41222546533/job/124599977368", + "suites_passed_ignored": [ + [ + "13", + "0" + ], + [ + "1", + "0" + ], + [ + "58", + "1" + ], + [ + "6", + "1" + ], + [ + "17", + "0" + ], + [ + "24", + "0" + ], + [ + "2", + "0" + ], + [ + "30", + "0" + ] + ], + "log_sha256": "172795fc0d39673b14dd82c8ccc445ed1a34160c50e67783d56655783ea8fce4" + }, + "windows": { + "tested_merge": "151144ea4f94f53866710ff9a25d74d64ca6a605", + "job_url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41222546533/job/124599976970", + "suites_passed_ignored": [ + [ + "13", + "0" + ], + [ + "1", + "0" + ], + [ + "49", + "0" + ], + [ + "2", + "0" + ], + [ + "17", + "0" + ], + [ + "24", + "0" + ], + [ + "2", + "0" + ], + [ + "29", + "0" + ] + ], + "log_sha256": "daf65a2301f6d17a7159f40e78f7581eb8dab028adbaf7525f1df567ca221b10" + } + }, + "tested_tree": "4ead043efe3fd5908a55a134544cdd1efaa139ec", + "head_tree_equal": true, + "requirements_checked": { + "builtin_write_and_edit_produce_observations_without_language_services": [ + "linux", + "macos", + "windows" + ], + "directory_registration_limit_is_visible_and_reconciliation_covers_its_tail": [ + "linux", + "macos", + "windows" + ], + "hard_link_scope_allows_owned_aliases_and_suppresses_private_state_aliases": [ + "linux", + "macos", + "windows" + ], + "hook_writes_stop_at_the_durable_feedback_limit_after_quiet_time": [ + "linux", + "macos", + "windows" + ], + "location_limit_is_visible_without_disabling_other_location_observations": [ + "linux", + "macos", + "windows" + ], + "long_path_inventory_publishes_a_partial_baseline_and_keeps_existing_files_live": [ + "linux", + "macos", + "windows" + ], + "native_foreground_and_background_shell_writes_are_observed_after_the_turn": [ + "linux", + "macos", + "windows" + ], + "native_formatter_settlement_produces_a_file_observation": [ + "linux", + "macos", + "windows" + ], + "native_owner_delivers_external_edits_rename_removal_to_shared_sessions_and_joins": [ + "linux", + "macos", + "windows" + ], + "native_owner_feedback_renews_only_for_new_committed_user_input": [ + "linux", + "macos", + "windows" + ], + "readmission_reuses_one_pending_replacement_until_previous_owner_settles": [ + "linux", + "macos", + "windows" + ], + "session_limit_is_visible_and_released_membership_admits_a_waiting_session": [ + "linux", + "macos", + "windows" + ], + "symlink_retarget_loses_old_delivery_and_user_input_admits_the_new_physical_scope": [ + "linux", + "macos", + "windows" + ], + "unused_user_acknowledgement_cannot_follow_a_retargeted_alias": [ + "linux", + "macos", + "windows" + ] + }, + "broad": { + "linux": { + "job_url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41222546523/job/124600042654", + "log_sha256": "fbb5e60dc594c1ebdb2790c44aadb3be9aecbf94cbda3a21b4dbbdd77be7e5b5", + "summaries": [ + "Summary [ 859.487s] 5504 tests run: 5504 passed (1 slow), 21 skipped" + ], + "warnings": [] + }, + "macos": { + "job_url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41222546523/job/124600042618", + "log_sha256": "604c1d958d51a133fd2625345953a4b2260b76604f903f68f8ac4d6df095f1af", + "summaries": [ + "Summary [1333.486s] 5504 tests run: 5504 passed (2 slow), 23 skipped" + ], + "warnings": [] + }, + "windows": { + "job_url": "https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41222546523/job/124600042571", + "log_sha256": "5055d9012c5003fbc0d8a3b557c344d26439e97386702d4ce7af251156f46af2", + "summaries": [ + "Summary [1042.035s] 3775 tests run: 3775 passed (1 leaky), 648 skipped", + "Summary [ 0.030s] 4 tests run: 4 passed, 387 skipped", + "Summary [ 0.094s] 9 tests run: 9 passed, 0 skipped", + "Summary [ 1.905s] 18 tests run: 18 passed, 0 skipped" + ], + "warnings": [ + "LEAK [ 20.250s] ( 520/3775) cyber-cli::messages_cli an_exec_session_refuses_messages_unless_it_accepts_them" + ] + } + }, + "checks_passed": 19, + "accepted_merge": "5d5826b72d41d6a833b523237bdbbd85ac51d31a", + "accepted_tree": "ad445cb227b0a7d1cc8593cc25d7cd3efc4b9e3f", + "limits": "Windows selected suite and Unix subprocess-helper ignores are explicit; leaked-process cause unverified; this is FileChanged acceptance, not plugin confinement or complete producer acceptance.", + "additional_component_contracts": { + "queue_loss_is_reported_even_without_another_successful_callback": [ + "linux", + "macos", + "windows" + ], + "coalesced_tool_and_native_hints_stay_bounded_and_signal_lost_names": [ + "linux", + "macos", + "windows" + ], + "registrations_are_bounded_and_partial_scans_preserve_existing_coverage": [ + "linux", + "macos", + "windows" + ], + "removing_membership_cancels_held_delivery_without_stopping_other_members": [ + "linux", + "macos", + "windows" + ], + "protected_subtrees_are_excluded_without_reading_contents": [ + "linux", + "macos", + "windows" + ], + "unknown_file_handler_delivery_remains_consumed_without_reexecution": [ + "linux", + "macos", + "windows" + ], + "readmitting_membership_does_not_revive_a_held_batch": [ + "linux", + "macos", + "windows" + ], + "incomplete_scan_prioritizes_existing_updates_and_preserves_unknown_preimages": [ + "linux", + "macos", + "windows" + ] + } +} diff --git a/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-post88-composition.json b/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-post88-composition.json new file mode 100644 index 000000000..db8859c16 --- /dev/null +++ b/openspec/changes/complete-plugin-hook-runtime/evidence/file-observation-post88-composition.json @@ -0,0 +1,58 @@ +{ + "head": "b08a1f5c12491451ca8c9f011aab8427010039c3", + "base": "9cbbf08b3382622625335210360928a729a47e33", + "tree": "ad445cb227b0a7d1cc8593cc25d7cd3efc4b9e3f", + "changes_from_tested_head": [ + "crates/cyber-tools/tests/worktree_setup.rs", + "openspec/changes/complete-plugin-hook-runtime/tasks.md" + ], + "binding": "FileChanged test files and nextest configuration equal tested PR85 head; CwdChanged test file equals accepted PR88 main; no production source changes.", + "checks": [ + { + "command": [ + "cargo", + "fmt", + "--all", + "--check" + ], + "exit_code": 0, + "summary": [] + }, + { + "command": [ + "git", + "diff", + "--cached", + "--check" + ], + "exit_code": 0, + "summary": [] + }, + { + "command": [ + "node", + "/Users/edvane/.npm/_npx/0aaef5be8686a8bb/node_modules/@fission-ai/openspec/bin/openspec.js", + "validate", + "--all", + "--strict" + ], + "exit_code": 0, + "summary": [ + "Totals: 114 passed, 0 failed (114 items)" + ] + }, + { + "command": [ + "python3", + "scripts/spec_lint.py" + ], + "exit_code": 0, + "summary": [ + "0 errors, 25 warnings" + ] + } + ], + "accepted_merge": "5d5826b72d41d6a833b523237bdbbd85ac51d31a", + "accepted_tree": "ad445cb227b0a7d1cc8593cc25d7cd3efc4b9e3f", + "accepted_tree_matches": true +} diff --git a/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md b/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md index bdf0e039a..327daf3f1 100644 --- a/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md +++ b/openspec/changes/complete-plugin-hook-runtime/file-observation-acceptance.md @@ -1,6 +1,6 @@ # FileChanged acceptance audit -Task 5.2 is implemented and under final acceptance review. This audit does not +Task 5.2 is accepted by merged PR #85 at `5d5826b7`. This audit does not close native plugin enforcement, the remaining producers, or the full goal. ## Requirements and direct evidence @@ -11,7 +11,7 @@ close native plugin enforcement, the remaining producers, or the full goal. | External, foreground and background edits; rename/delete | `native.rs`/`scan.rs`/`owner.rs`; `native_owner_delivers_external_edits_rename_removal_to_shared_sessions_and_joins`, `native_foreground_and_background_shell_writes_are_observed_after_the_turn` | Composed platform suite passes. | | Bounded observation, queue loss, partial inventory and recovery | Native queue/registration component cases; real-runtime `location_limit_is_visible_without_disabling_other_location_observations`, `session_limit_is_visible_and_released_membership_admits_a_waiting_session`, `directory_registration_limit_is_visible_and_reconciliation_covers_its_tail`, `long_path_inventory_publishes_a_partial_baseline_and_keeps_existing_files_live` | Composed platform suite passes; incomplete coverage remains visible and is not treated as absence. | | Private state, symlinks and hard-link scope | Pinned root/private identities, no-follow metadata scanner and link accounting; actual AppHost moved-private-root check, `hard_link_scope_allows_owned_aliases_and_suppresses_private_state_aliases`, both known-private retirement HTTP regressions | Composed platform suite passes. | -| Session scope, aliases and current project identity | Native leases, writer-validated scope records and admission-time physical input; alias-first sharing, root replacement, archive/resume and idle return regressions | Spelling aliases and both retarget/unused-old-ack cases pass on Linux, macOS and Windows at 01535d49. | +| Session scope, aliases and current project identity | Native leases, writer-validated scope records and admission-time physical input; alias-first sharing, root replacement, archive/resume and idle return regressions | Spelling aliases and both retarget/unused-old-ack cases pass on Linux, macOS and Windows at the final `b08a1f5c` source. | | Feedback, deduplication and unknown-effect recovery | Durable finite credit and owned user-ack validation; `hook_writes_stop_at_the_durable_feedback_limit_after_quiet_time`, `native_owner_feedback_renews_only_for_new_committed_user_input`, exhausted-credit/restart and unknown-handler Store regressions | Composed platform suite passes; quiet time or replay cannot manufacture renewal. | | Cancellation and bounded resource lifetime | Per-membership cancellation, held-batch identity, joined scanner/observer shutdown and pending-owner reuse; all held-member HTTP cases and `readmission_reuses_one_pending_replacement_until_previous_owner_settles` | Composed platform suite passes; Linux missing-fix controls also pass their required failure assertions. | @@ -22,7 +22,7 @@ claims based solely on test names: the workflow results, actual checkout and source composition are inspected separately. Native observations supply metadata and scoped handler admission, never permission or authenticated writer identity. -## Platform evidence and outstanding check +## Earlier platform evidence The [verified job receipt](evidence/file-observation-3f7067dd.json) records actual checkout checks, original log hashes, suite counts and platform exclusions. @@ -54,8 +54,9 @@ and passed on every platform. Windows now runs 17 Store/runtime and 24 HTTP case matching the corresponding Unix suites. This is actual Windows execution, not cross-compilation or an optional skip. Local Windows execution was unavailable. -Current-source relevant PR checks and final merge review remain required before -task 5.2 is closed. Parent plugin/native support and other producer tasks stay open. +These are historical receipts. Final current-source acceptance and the accepted +merge are recorded below. Parent plugin/native support and other producer tasks +stay open. ## Review and local checks @@ -74,29 +75,6 @@ checks pass. Strict OpenSpec passes 114 items; spec lint reports zero errors and on Linux/macOS/Windows. It retains the existing intentional Unix subprocess-helper parent ignores and platform-specific component counts explicitly in the receipt. -## Exact PR85 platform verification - -The [current-source receipt](evidence/file-observation-ecce8b38.json) verifies all -three focused jobs on `ecce8b381c91e22f25b43f9a1cf6f8761c991cce`. Each actual -checkout uses merge `8de13b5445509a214d4f70f1082728a65b202df1`, whose tree -`119568e94fdef8498056b4448a17980c440f483f` equals the PR head. Both named -retarget regressions execute and pass on every platform, with 17 Store/runtime -and 24 real HTTP cases each. Component/helper counts and log hashes remain -explicit in the receipt. This confirms the earlier direct-branch acceptance on -the actual PR composition; four broader PR checks were still running when this -receipt was recorded. Task 5.2 remains open for their results and merge review. - -## Composition after the independent Setup correction - -PR #86 merged at `92a3240d`, correcting only the Setup design. The -[composition receipt](evidence/file-observation-post86-composition.json) binds the -prospective PR #85 tree `d8b104a7d4573f2ebcd33e2333d00dbf95d6a5d4` to that -base and the original tested head. Compared with tested tree `119568e94f`, only -`setup-design.md` differs; executable, test, build and workflow inputs are identical. -The actual combined tree passes local strict OpenSpec (114 items), spec lint -(0 errors, 25 warnings) and whitespace checks. Original CI is not claimed to have -tested the new full documentation tree. The Linux workspace job remains active; -task 5.2 stays open for its result and final merge review. ## Superseded workspace run and bounded attempts The old [Linux workspace job](https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41207519002/job/124555564239) @@ -112,5 +90,45 @@ per-attempt slow timeout. The existing single retry is retained, so a retried case can consume two attempts. Timeouts remain failures; this bounds future stalls without claiming an application deadlock fix or FileChanged acceptance. The largest reported passing-test times in those PR #87 runs were 99.147 seconds -on Linux and 75.484 on macOS. Current-revision CI and final review remain -required before task 5.2 closes. +on Linux and 75.484 on macOS. The final run below supplies current-source +acceptance; the earlier incomplete workspace run is not treated as passing. + + +## Final accepted source and merge + +The [final receipt](evidence/file-observation-b08a1f5c.json) binds all three focused +jobs to actual checkout `151144ea4f94f53866710ff9a25d74d64ca6a605`, tree +`4ead043efe3fd5908a55a134544cdd1efaa139ec`, equal to PR #85 head +`b08a1f5c12491451ca8c9f011aab8427010039c3`. Each platform passes all eight +focused suites, including all 14 named regressions in this audit, with 17 +Store/runtime and 24 real HTTP cases per platform. Both alias-retarget cases +actually execute on native Windows. Full counts, intentional helper ignores, +platform exclusions and original log hashes are explicit in the receipt. + +All 19 current-head PR checks passed. Broad Linux/macOS workspace jobs each pass +5,504 tests (21/23 skipped); Windows passes 3,775 selected tests (648 skipped), +plus four metadata, nine migration and 18 AppContainer cases. The Windows job +reports a leaked-process warning in +`messages_cli::an_exec_session_refuses_messages_unless_it_accepts_them`; its cause +is unverified. The previously stalled stats case passes in these Linux/macOS/ +Windows runs, which does not establish the earlier stall's cause or a code fix. + +Main advanced independently through PR #88. The +[composition check](evidence/file-observation-post88-composition.json) verifies +that only the accepted CwdChanged test file and task ledger differ from the tested +PR #85 tree: FileChanged production/test inputs and the nextest configuration are +unchanged. The exact composed tree passes formatting, whitespace, strict OpenSpec +(114/0) and spec lint (0 errors/25 warnings). It does not claim a new full workspace +run on that documentation/test composition. PR #85 merged at +`5d5826b72d41d6a833b523237bdbbd85ac51d31a`, whose tree +`ad445cb227b0a7d1cc8593cc25d7cd3efc4b9e3f` equals the reviewed composition. + +The earlier [ecce8b38 receipt](evidence/file-observation-ecce8b38.json) and +[post-#86 composition](evidence/file-observation-post86-composition.json) are +retained as historical evidence, superseded by the final receipt above. Neither +is used to claim that its cancelled or pending workspace run passed. + +This closes bounded FileChanged task 5.2, including alias admission, finite +feedback, bounded publication and joined observer lifetime. The full producer +acceptance task 5.3, DirectoryAdded/Setup, native plugin enforcement and protocols, +daily coding and binary editor work remain incomplete. diff --git a/openspec/changes/complete-plugin-hook-runtime/file-observation-implementation.md b/openspec/changes/complete-plugin-hook-runtime/file-observation-implementation.md index 4ad1c9b82..884d78551 100644 --- a/openspec/changes/complete-plugin-hook-runtime/file-observation-implementation.md +++ b/openspec/changes/complete-plugin-hook-runtime/file-observation-implementation.md @@ -1,5 +1,12 @@ # File observation implementation notes +Status: bounded FileChanged task 5.2 is accepted by merged PR #85. The +[final acceptance audit](file-observation-acceptance.md#final-accepted-source-and-merge) +records the actual source-bound platform results and accepted composition. +Incremental results and then-pending checks below are historical development +notes, superseded by that final record. Other plugin/hook tasks remain open. + + Status: **in progress; task 5.2 remains open**. The observer is implemented; this is not an event without a producer. The #76 foundations milestone merged at `ec31ff9f` after its applicable CI passed, without closing the full acceptance diff --git a/openspec/changes/complete-plugin-hook-runtime/tasks.md b/openspec/changes/complete-plugin-hook-runtime/tasks.md index 74dfafc82..b11a2bc7c 100644 --- a/openspec/changes/complete-plugin-hook-runtime/tasks.md +++ b/openspec/changes/complete-plugin-hook-runtime/tasks.md @@ -80,7 +80,7 @@ does not close tasks 2.1–2.4. ## 5. Missing event producers - [ ] 5.1 Implement committed `DirectoryAdded`/`CwdChanged`, complete existing `Setup` init/marker semantics and fill proven isolated-child `WorktreeCreate` coverage gaps without moving its pre-effect veto. Isolated-child creation/recreation admission is implemented with regression coverage in `isolated_subagents.rs`; at source commit `b5ff9553`, all 16 broad CI jobs and both Linux/macOS before/after regression jobs passed ([broad CI](https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/40572548204), [regressions](https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/40572548267)). The parent task remains incomplete. Committed CwdChanged is implemented by PR #57; code revision d9932631 passed all 36 focused worktree tests on Linux/macOS plus broader CI. DirectoryAdded/Setup and combined event acceptance remain open. -- [ ] 5.2 Implement bounded `FileChanged` observation/reconciliation for tools, formatters, shell/background and external edits, including overflow and self-write loop prevention. Verify alias-aware Session admission and resource/lifecycle behavior before closing this task. See [file-observation-implementation.md](file-observation-implementation.md) for implementation and verification evidence. +- [x] 5.2 Implement bounded `FileChanged` observation/reconciliation for tools, formatters, shell/background and external edits, including overflow and self-write loop prevention. Verify alias-aware Session admission and resource/lifecycle behavior before closing this task. See [file-observation-implementation.md](file-observation-implementation.md) for implementation and verification evidence. - [ ] 5.3 Test no false post-effect success for refused/failed/unknown transitions, pre-effect WorktreeCreate veto/no Git mutation, stable event identity, correct scope/order, rename/delete, multiple Sessions, shutdown/restart and unknown handler outcomes. The CwdChanged regression @@ -93,10 +93,15 @@ exit is silent. This is a known before-append failure, not proof of an unknown commit outcome. All five HTTP CwdChanged cases are enabled on Unix and Windows with unchanged assertions. The Windows CI profile already selects the complete `worktree_setup` binary, so these cases must execute there. All five pass locally -on macOS; Windows execution is unavailable locally and hosted Windows acceptance -remains required. Task 5.3 stays open. +on macOS; the [merged PR #88 native Windows job](https://github.com/CyberdyneCorp/cybercode-cli/actions/runs/41221552314/job/124597023928) +also executes all five successfully. Its Linux/macOS checks pass as well. This +accepts those cases, not the full producer matrix; task 5.3 stays open. -Task 5.2 is in progress. The full focused suite at `3e852288` passed Linux/macOS/Windows. At `c0cc40e3`, complete Linux/Windows jobs also passed all 18 HTTP/runtime scenarios, including idle-return ownership, archive/resume and native burst recovery; macOS remained queued. Review then reproduced an oversized metadata baseline within the count/path limits. The new publication/batch byte-budget fix passes 63 local source-library tests and scoped Clippy, and its focused owner/application regression workflow at `5aa08018` now passes on Linux/macOS/Windows. Combined producer acceptance is pending on this integration branch. Remaining resource/lifecycle acceptance, broader workspace checks and substantive review are still open. See [the scope integration design](file-observation-scope-design.md) and [implementation notes](file-observation-implementation.md). +Task 5.2 is accepted by merged PR #85 (`5d5826b7`). The +[acceptance audit](file-observation-acceptance.md) maps the complete FileChanged +contract to actual native/runtime results, all three final platform jobs, broad +checks and the exact accepted main composition. Earlier byte-budget, private +retirement and pending-owner regressions are included in this acceptance. The [DirectoryAdded prerequisite proposal](directory-added-design.md) maps the unimplemented additional-directory owner operation to permission, sandbox and @@ -116,21 +121,13 @@ expand task 5.1 without closing it or the other producer obligations. - [ ] 6.4 Record accepted first-workstream evidence, then begin the reviewed Daily coding workstream. Archive only after accepted merge and reconcile overlapping deltas. -Composed-review follow-up: `6385cabe` passed all 16 broad and seven focused jobs, -then review reproduced false deletion dispatch when a known private inode/subtree -replaces a public baseline name. The new silent-retirement correction has two -real HTTP regressions and a missing-fix behavioral control. Task 5.2 remains open -for current-source platform acceptance; see the integration evidence above. - -The [pending observer owner correction](file-observation-pending-owner.md) bounds -remove/readmit replacement behind a settling owner while retaining cancellation -and joined shutdown. Focused and platform acceptance remain required; task 5.2 -stays open. - ## FileChanged acceptance after main integration -Task 5.2 is in progress. The [acceptance audit](file-observation-acceptance.md) maps the full producer contract to actual native/runtime evidence and records verified Windows retarget coverage and the remaining PR/merge acceptance. - -PR #85 now incorporates the accepted Setup design and CwdChanged regression from -main. Fresh checks of this composed revision and final merge review remain -required; the earlier focused receipts do not close task 5.2 by themselves. +PR #85 merged after all 19 current-head checks passed. Final source-bound +Linux/macOS/Windows suites pass both retarget regressions, bounded native and +runtime observation, durable feedback, private-state retirement and joined +observer/pending-owner lifetime checks. The accepted merge tree equals the +reviewed composition with PR #88. See the +[acceptance audit](file-observation-acceptance.md) and its final receipts for the +scope, intentional skips and unverified Windows leaked-process warning. This +closes only task 5.2; tasks 5.1, 5.3 and full workstream acceptance stay open.