Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 docs/PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -479,8 +479,8 @@ Fix-/Review-/Queue-Abnahme bleibt Release-Vorgänger; KI-30 wird nicht vorzeitig
| Z4-M4B-0-AUTH | Transaktionslokale Run-/Owner-/Fence-/Rollen-/Projektautorisierung, store/development_runs.rs und ggf. development_launches.rs, 180–260 ALL | Chief weist einen Nahtowner zu | st nach #632 frei; freigegebene Sicherheitskorrektur bei deaktiviertem Continuous Mode | eigener Worktree | A | Erledigt: #1607 (merged 2026-10-16); nur die Prüffunktion, kein Schreiber angebunden; Sicherheitsbefund besteht bis Z4-M4B-4-IMPORT fort; Continuous bleibt deaktiviert und eingefroren. | dieselbe Schreibtransaktion, stale/fremd/falsche Rolle/fehlendes Ziel abweisen; keine neue Auth-Transaktion/Migration; Rot vor Fix, eigene prepush und zwei Fremdreviews | fea04970 |
| Z4-M4B-1a-PLUMB | Autorität (Run, Owner, Fence; None = Operator) bis zu den vier Schreibern durchreichen, ohne Verhaltensänderung; die hier ursprünglich vorgesehene 403/refused-Korrektur wird verbindlich in GOAL nachgeholt; api.rs, main.rs, hq_routes.rs, planning_access.rs, Tests, 120–200 ALL (Schätzung) | ein serieller st/api/mn-Owner; Chief weist zu | Z4-M4B-0-AUTH (#1607); Nähte `api.rs` und `main.rs` frei | eigener Worktree | A | Erledigt: reine Durchreichung mit #1836 gemergt (22.10.2026, 9cc16b85). | No-Test (reines Durchreichen), bestehende Suite grün; Root dokumentierte Review-/PLAN-Regelabweichungen zu #1836; 403/refused noch nicht durch PLUMB geliefert, verbindliche Nachholung mit deterministischem Test in GOAL; Gesamtbefund bis IMPORT nicht geschlossen | – |
| Z4-M4B-1-GOAL | Atomare Autorisierung und Goal/Replan, continuous.rs plus api/planning_access/Tests/main, 220–290 ALL | ein serieller st/api/mn-Owner | Z4-M4B-1a-PLUMB; freigegebene Sicherheitskorrektur ohne Continuous-Aktivierung | eigener Worktree | A | Erledigt: #1842 (merged 2026-10-22T18:35:12Z, fa4f2d9a). Sicherheitsbefund bis Z4-M4B-4-IMPORT offen; Continuous bleibt eingefroren. | deterministisches kompilierendes Fence-Interleaving-Rot; stale ohne Goal/Event; PLANNING_REFUSED muss HTTP 403 und audit_planning mit refused ergeben (eigener deterministischer Rot vor Fix); Alle vier Planungs-POSTs liefern Some(Run/Owner/Fence), Operator explizit None; Scoped Goal-POST erreicht das erforderliche create_continuous_goal_with_authority mit gebundener Run-/Owner-/Fence-Autorität, Operator None; kein ignorierender Produktionsdefault für Goal, kein Goal-Legacy-Routenbypass; Import/Task/Zuweisung behalten ihre Durchreicher bis zum eigenen Paket; scoped control/queue bleiben gesperrt; gültiger Coordinator erfolgreich, autonome Root operator-only, Operator/Audit erhalten; eigene prepush, zwei zulässige Fremdreviews und GPT-Beobachter gemäß AGENTS.md | 2be81e2e |
| Z4-M4B-2-TASK | Atomare Taskanlage, gleicher begrenzter Dateisatz wie GOAL, 180–270 ALL | ein serieller st/api/mn-Owner | Z4-M4B-1-GOAL (Nahtübergabe) | eigener Worktree | A | Erledigt nach Merge dieses Pakets: TASK prüft Run/Owner/Fence/Rolle/Zielprojekt atomar in seiner SQLite-Schreibtransaktion; erforderliche API-Weiterleitung, Operator None erhalten. Eigene prepush ist Pflicht; vor Merge bleiben zwei qualifizierte Fremdvendor-Reviews plus GPT-Beobachter und Root-Abnahme ausstehend. ASSIGN/IMPORT und GOAL-Restbefunde (Ticket 2dbc396c-9b74-4556-9c28-d9e00f5c6310) bleiben offen; Sicherheitsbefund bis IMPORT offen, Continuous bleibt eingefroren. | Fence-Interleaving-Rot; stale ohne Task/Event; eigenes Projekt erfolgreich, fremde Goals/Dependencies abweisen, Operator erhalten; eigene prepush/zwei Fremdreviews | 8dbd5dc7 |
| Z4-M4B-3-ASSIGN | Atomare Zuweisung, team_assignments.rs plus api/planning_access/Tests/main, 200–280 ALL | ein serieller st/api/mn-Owner | Z4-M4B-2-TASK (Nahtübergabe) | eigener Worktree | A | Geplant: strikt seriell (Nutzer 16.10., K7 A; Prüfbericht 16.10.: der Befund gilt weiter); Sicherheitsbefund besteht bis Z4-M4B-4-IMPORT fort, Continuous bleibt eingefroren | Fence-Interleaving-Rot; stale ohne Assignment/Revision/Event; Selbsteskalation abweisen, gültige Zuweisung/Operator erhalten; eigene prepush/zwei Fremdreviews | 15d92066 |
| Z4-M4B-2-TASK | Atomare Taskanlage, gleicher begrenzter Dateisatz wie GOAL, 180–270 ALL | ein serieller st/api/mn-Owner | Z4-M4B-1-GOAL (Nahtübergabe) | eigener Worktree | A | Erledigt: #1849 (merged 2026-10-22T21:03:34Z, `8c86bfc44c50e55209da7de48fdc7e3cb692a750`); TASK prüft Run/Owner/Fence/Rolle/Zielprojekt atomar in seiner SQLite-Schreibtransaktion; erforderliche API-Weiterleitung, Operator None erhalten. IMPORT und GOAL-Restbefunde (Ticket 2dbc396c-9b74-4556-9c28-d9e00f5c6310) bleiben offen; Sicherheitsbefund bis IMPORT offen, Continuous bleibt eingefroren. | Fence-Interleaving-Rot; stale ohne Task/Event; eigenes Projekt erfolgreich, fremde Goals/Dependencies abweisen, Operator erhalten; eigene prepush/zwei Fremdreviews | 8dbd5dc7 |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Synchronize the M4B summary with the completed rows

After this row records M4B-2 as merged, the release-order summary at docs/PLAN.md:571-574 still says GOAL has not been accepted and that TASK follows it, leaving the canonical plan internally contradictory. Update that summary to reflect the merged GOAL/TASK state and the current ASSIGN/IMPORT sequence before approval.

AGENTS.md reference: AGENTS.md:L139-L139

Useful? React with 👍 / 👎.

| Z4-M4B-3-ASSIGN | Atomare Zuweisung, team_assignments.rs plus api/planning_access/Tests/main, 200–280 ALL | ein serieller st/api/mn-Owner | Z4-M4B-2-TASK (Nahtübergabe) | eigener Worktree | A | Erledigt nach Merge dieses Pakets: ASSIGN prüft Run/Owner/Fence/Rolle/Task-Projekt unter derselben SQLite-Schreibsperre wie Zuweisung/Revision/Event; getrimmte Coordinator-Selbsteskalation wird verweigert, gültige Zuweisung und Operator None bleiben erhalten. Fence-Interleaving-Rot und eigene prepush sind Pflicht; vor Merge bleiben Fremdreviews Stufe A und Root-Abnahme ausstehend. IMPORT und GOAL-Restbefunde (Ticket 2dbc396c-9b74-4556-9c28-d9e00f5c6310) bleiben offen; Sicherheitsbefund bis IMPORT offen, Continuous bleibt eingefroren. | Fence-Interleaving-Rot; stale ohne Assignment/Revision/Event; Selbsteskalation abweisen, gültige Zuweisung/Operator erhalten; eigene prepush/zwei Fremdreviews | 15d92066 |
| Z4-M4B-4-IMPORT | Autorisierung nach Source-Laden im Import-Schreibvorgang, development_plan/access plus api/planning_access/Tests/main, 230–300 ALL | ein serieller st/api/mn-Owner | Z4-M4B-3-ASSIGN (Nahtübergabe) | eigener Worktree | A | Geplant: strikt seriell (Nutzer 16.10., K7 A; Prüfbericht 16.10.: der Befund gilt weiter); Sicherheitsbefund besteht bis Z4-M4B-4-IMPORT fort, Continuous bleibt eingefroren | Fence beim Source-Laden ändern; Rot vor Fix; stale ohne Projektion/Revision/Event, gültiger Import/CAS/Sourceprüfung erhalten; vier Pfade integriert prüfen, eigene prepush/zwei Fremdreviews | e7c9e018 |
| F8-UNPROVEN-CHECK | PRÜFEN (nur lesend): ob `allow_unproven_project_create` (`src-tauri/src/api.rs`, abgeleitet aus einem gesetzten `PROJECTA_APP_DATA`) die Verdict-Prüfung der Projektregistrierung außerhalb des isolierten F8-Laufs aushebeln kann; Befund aus der README-Architekturanalyse vom 16.10. | Root disponiert | – | Server | A | Geplant: nicht disponiert (16.10.), zuerst nur lesend; ein Fix nur bei Befund als eigenes Stufe-A-Paket (Nahtdateien seriell) | Bericht mit `file:line` und rotem Test oder „gilt nicht“; keine Aktivierung | – |
| Z4-SERVER-DISK | Server-Platte: alte Worktrees (~151 GB) aufräumen; erst Backup | Nutzer entscheidet, Stabschef führt aus | Inbox E17 | Server | – | Geplant; wartet auf E17 (Nutzer); seit 08.10. ohne Beleg | Platte < 60 %, Backup-Beleg | – |
Expand Down
2 changes: 1 addition & 1 deletion scripts/ci/architecture-drift.allow
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.sto
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.agent_planning_scope(run,owner,fence,kind,target),)
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.agent_record_page(run,owner,fence,collection,cursor),)
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.agent_run_context(run,owner,fence))
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.assign_continuous_task(task_id,request))
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.assign_continuous_task_with_authority(authority,task_id,request),)
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.cancel_queue_entry(id))
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.checkpoint_continuous_task(task_id,owner,fence,status.as_deref(),detail.as_deref(),))
API_STORE_BLOCK_ON src-tauri/src/main.rs tauri::async_runtime::block_on(self.store.claim_continuous_task(task_id,owner,escalation))
Expand Down
7 changes: 0 additions & 7 deletions src-tauri/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -553,13 +553,6 @@ pub trait ControlBackend: Send + Sync {
) -> Result<ContinuousClaim, String> {
Err("continuous backend unavailable".to_string())
}
fn assign_continuous_task(
&self,
_task_id: &str,
_request: crate::store::team_assignments::AssignmentRequest,
) -> Result<crate::store::team_assignments::TeamAssignment, String> {
Err("team assignment backend unavailable".into())
}
fn continuous_task_assignment(
&self,
_task_id: &str,
Expand Down
5 changes: 5 additions & 0 deletions src-tauri/src/api/agent_access.rs
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,11 @@ mod tests {
serde_json::to_value(review).map_err(|error| error.to_string())
}
unavailable! {
fn assign_continuous_task_with_authority(
_authority: Option<crate::api::PlanningAuthority<'_>>,
_task_id: &str,
_request: crate::store::team_assignments::AssignmentRequest
) -> Result<crate::store::team_assignments::TeamAssignment, String>;
fn create_continuous_task_with_authority(
_authority: Option<crate::api::PlanningAuthority<'_>>,
_goal_id: &str,
Expand Down
11 changes: 4 additions & 7 deletions src-tauri/src/api/planning_access.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
//! would multiply planning authority). Every target project, goal or task is
//! confined to the coordinator run's project before routing.
//!
//! Goal/replan and task writers recheck authority under their SQLite writer lock.
//! Assignment and import writers still rely on the separate precheck;
//! their remaining fence races belong to the subsequent M4B packages.
//! Goal/replan, task and assignment writers recheck authority under their SQLite writer lock.
//! Import still relies on the separate precheck; its fence race belongs to M4B-4.
//!
//! Every refusal and every successful write appends one audit envelope
//! (M4-R19-08, `audit`): the run's project, the run, the result, the route.
Expand Down Expand Up @@ -69,12 +68,10 @@ macro_rules! planning_writer_adapters {
) -> Result<crate::store::ContinuousTask, String>;
fn assign_continuous_task_with_authority(
&self,
_authority: Option<crate::api::PlanningAuthority<'_>>,
authority: Option<crate::api::PlanningAuthority<'_>>,
task_id: &str,
request: crate::store::team_assignments::AssignmentRequest,
) -> Result<crate::store::team_assignments::TeamAssignment, String> {
self.assign_continuous_task(task_id, request)
}
) -> Result<crate::store::team_assignments::TeamAssignment, String>;
};
}
pub(crate) use planning_writer_adapters;
Expand Down
8 changes: 8 additions & 0 deletions src-tauri/src/api/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@
native_store: Option<crate::store::Store>,
goal_admission: Mutex<Option<(std::sync::mpsc::Sender<()>, std::sync::mpsc::Receiver<()>)>>,
task_admission: Mutex<Option<(std::sync::mpsc::Sender<()>, std::sync::mpsc::Receiver<()>)>>,
assignment_admission: Mutex<Option<(std::sync::mpsc::Sender<()>, std::sync::mpsc::Receiver<()>)>>,
/// M4-R19-08: `(run, result, sourceRef)` of every planning audit when
/// no `native_store` writes the real trail.
audited: Mutex<Vec<(String, String, String)>>,
Expand Down Expand Up @@ -695,6 +696,13 @@
request: crate::store::team_assignments::AssignmentRequest,
) -> Result<crate::store::team_assignments::TeamAssignment, String> {
self.record_planning_authority(&format!("assign:{task_id}"), authority);
if let Some(store) = &self.native_store {
if let Some((arrived, resume)) = self.assignment_admission.lock().unwrap().take() {
arrived.send(()).map_err(|error| error.to_string())?;
resume.recv_timeout(Duration::from_secs(5)).map_err(|error| error.to_string())?;
}
return tauri::async_runtime::block_on(store.assign_continuous_task_with_authority(authority, task_id, request));
}
if request.expected_revision != 0 {
return Err("team assignment revision conflict".into());
}
Expand Down
Loading
Loading