diff --git a/engine/core/src/adapters/cli.rs b/engine/core/src/adapters/cli.rs index df88bc1c..4e75c6a0 100644 --- a/engine/core/src/adapters/cli.rs +++ b/engine/core/src/adapters/cli.rs @@ -1818,7 +1818,7 @@ mod tests { fn a_domain_error_exits_one() { let registry = default_registry(); let result = at_eighty( - &argv(&["place", "metrics"]), + &argv(&["engine", "status"]), ®istry, "test", &mut no_dispatch, diff --git a/engine/core/src/application/place.rs b/engine/core/src/application/place.rs index 25849e39..27cc54f6 100644 --- a/engine/core/src/application/place.rs +++ b/engine/core/src/application/place.rs @@ -2,61 +2,59 @@ //! `src/vogt/application/services/place.py`. //! //! `place.metrics` answers every shell badge in one bounded response. A badge -//! whose source is not ported yet is `null`, the same shape Python returns -//! when a provider raises: one unavailable answer never hides the others or -//! fails the route. The saved Inbox filter, the backlog count and the inbox -//! badge itself are those sources. `work.list` and `drift.list` are ported, so -//! their badges are real answers. +//! whose source fails is `null`, the same shape Python returns when a provider +//! raises: one unavailable answer never hides the others or fails the route. +//! Read order follows Python's, because the step clock is read along the way +//! and the answer's `generated_at` is the last of those reads. use serde_json::{json, Value}; -use super::context::Built; +use super::context::{AppContext, Built}; +use super::services::inbox::inbox_badge; +use super::services::now_of; +use super::services::preferences::{saved_inbox_filter, InboxSavedFilter}; +use super::views::backlog_total_considered; +use crate::core::{Clock, IdFactory}; use crate::errors::VogtError; -use crate::storage::interface::{DeclaredStore, ReadView}; +use crate::storage::interface::{DeclaredStore, ReadView, WorkFilter}; /// Return all shell badge values in one bounded response. pub fn place_metrics_op(ctx: &Built, _params: Value) -> Result { - match ctx { - Built::SystemRandom(ctx) => metrics(ctx), - Built::SystemSequential(ctx) => metrics(ctx), - Built::StepRandom(ctx) => metrics(ctx), - Built::StepSequential(ctx) => metrics(ctx), - } + crate::with_ctx!(ctx, |ctx| metrics(ctx)) } -fn metrics( - ctx: &super::context::AppContext, -) -> Result { +fn metrics(ctx: &AppContext) -> Result +where + C: Clock + 'static, + I: IdFactory + 'static, +{ + // The saved filter and the badge are read first, as Python does. An + // unreadable filter means "no filter", and an unreadable badge is null. + let saved: Option = saved_inbox_filter(ctx).ok().flatten(); + let badge = inbox_badge(ctx, saved.as_ref()).ok(); + // The store counts, in Python's order. The backlog badge is the whole + // candidate population, which `backlog` ranks and reports. let projects_total = ctx.declared.read()?.counts()?.projects; - let revision = ctx.declared.read()?.current_revision()?; - let generated_at = crate::application::services::now_of(&ctx.clock); - // `work.list` and `list_drift` are ported, so both badges are real answers. - // The inbox and backlog badges read services that are not, and a null there - // means "not available", which is distinct from a counted zero. - // The badge counts every open item, the same total `work.list` reports with - // no project scope and the default filter. The upstream join adds nothing - // when no project is linked, which is the only state the declared store can - // answer on its own. - let work_total = - ctx.declared - .read()? - .count_work_items(&crate::storage::interface::WorkFilter { - exclude_terminal: true, - limit: 1, - ..crate::storage::interface::WorkFilter::default() - })?; + let work_total = ctx.declared.read()?.count_work_items(&WorkFilter { + exclude_terminal: true, + limit: 1, + ..WorkFilter::default() + })?; + let backlog_total = backlog_total_considered(ctx).ok(); let drift_present = !ctx .declared .read()? .list_drift(Some("open"), None, None, 1)? .is_empty(); + let revision = ctx.declared.read()?.current_revision()?; + let generated_at = now_of(&ctx.clock); Ok(json!({ - "inbox_active": Value::Null, - "inbox_active_unfiltered": Value::Null, - "inbox_filter": Value::Null, + "inbox_active": badge.map(|(filtered, _)| filtered), + "inbox_active_unfiltered": badge.map(|(_, active)| active), + "inbox_filter": saved, "projects_total": projects_total, "work_total": work_total, - "backlog_total_considered": Value::Null, + "backlog_total_considered": backlog_total, "drift_present": drift_present, "revision": revision, "generated_at": generated_at, @@ -67,9 +65,10 @@ fn metrics( mod tests { use super::*; use crate::core::{ActorKind, Principal, SequentialIds, StepClock}; + use crate::storage::interface::ObservedStore; #[test] - fn metrics_report_the_project_count_and_leave_unported_badges_absent() { + fn metrics_report_every_badge_as_a_counted_answer() { use std::sync::atomic::{AtomicU64, Ordering}; static COUNTER: AtomicU64 = AtomicU64::new(0); let dir = std::env::temp_dir().join(format!( @@ -101,11 +100,17 @@ mod tests { unreachable!() }; ctx.declared.migrate().unwrap(); + ctx.observed.migrate().unwrap(); ctx.declared.bootstrap(&principal).unwrap(); let result = place_metrics_op(&built, Value::Null).unwrap(); assert_eq!(result["projects_total"], 0); - assert!(result["inbox_active"].is_null()); - // No work items exist, so the ported work badge answers zero. + // An empty Inbox and an empty backlog count as zero, not null: null + // would mean the provider failed. + assert_eq!(result["inbox_active"], 0); + assert_eq!(result["inbox_active_unfiltered"], 0); + assert!(result["inbox_filter"].is_null()); + assert_eq!(result["backlog_total_considered"], 0); + // No work items exist, so the work badge answers zero. assert_eq!(result["work_total"], 0); // No proposals exist, so the ported drift badge answers false rather // than null. diff --git a/engine/core/src/application/projects.rs b/engine/core/src/application/projects.rs index bb10515e..7bb9a5e7 100644 --- a/engine/core/src/application/projects.rs +++ b/engine/core/src/application/projects.rs @@ -3,8 +3,6 @@ //! //! `project.import` clones, registers and (with `consolidate: false`) stops there. //! Consolidation waits on `forge.onboard`, which has no Rust port yet. -//! Ranked backlog is not ported, so the brief says `not_collected` for the -//! counts that come out of the gather rather than inventing a zero. use std::path::{Component, Path, PathBuf}; @@ -54,9 +52,6 @@ const PROJECT_SCAFFOLDED_EVENT: &str = "project.scaffolded"; /// string is what the observed store is queried by. const KIND_DEP_SCAN: &str = "dep_scan"; -/// Ranked backlog is `views._gather`, which is not ported. -const BACKLOG_NOT_COLLECTED: &str = "ranked backlog is not ported yet"; - // --- parameters ------------------------------------------------------------- #[derive(Debug, Deserialize)] @@ -930,6 +925,15 @@ fn brief_project( by_state.sort(); by_kind.sort(); let observed_version = observed_version(ctx, &project.id)?; + drop(view); + // The same population `backlog` and `bugs` rank, so the three views agree + // about one project at one moment. + let population = crate::application::views::brief_population( + ctx, + &project.slug, + params.backlog_limit as usize, + ¶ms.mode, + )?; let version_matches = match (&observed_version, &project.current_version) { (Some(observed), Some(declared)) => { Some(observed.trim_start_matches('v') == declared.trim_start_matches('v')) @@ -939,15 +943,13 @@ fn brief_project( let adopted = project.contract_adopted_at.is_some(); Ok(json!({ "project": project, - // The gather that ranks open work is not ported. These are not zeros: - // a zero would say a sweep found nothing. - "open_work": "not_collected", - "open_bugs": "not_collected", - "declared_work": "not_collected", - "observed_work": "not_collected", + "open_work": population.open_work, + "open_bugs": population.open_bugs, + "declared_work": population.declared, + "observed_work": population.observed, "by_state": tally_object(&by_state), "by_kind": tally_object(&by_kind), - "top_backlog": {"status": "not_collected", "detail": BACKLOG_NOT_COLLECTED}, + "top_backlog": population.top, "current_version": project.current_version, "declared_version": project.current_version, "observed_version": observed_version, @@ -961,8 +963,6 @@ fn brief_project( "ci_status": ci_summary(ctx, &project.id)?, "dependencies": dependency_summary(ctx, &project.id)?, "freshness": crate::application::services::freshness::freshness_of(&ctx.observed, &ctx.clock)?, - "backlog_limit": params.backlog_limit, - "mode": params.mode, })) } @@ -1150,7 +1150,12 @@ fn apply_change( let summary = if change.event == PROJECT_TRANSITIONED_EVENT { json!({"slug": project.slug, "from": project.lifecycle_state.to_string(), "to": change.lifecycle_state}) } else { - json!({"slug": project.slug, "exclusions": updated.exclusions, "repo_url": updated.repo_url}) + json!({ + "slug": project.slug, + "exclusions": updated.exclusions, + "repo_url": updated.repo_url, + "agent_policy": serde_json::to_value(&updated.agent_policy).unwrap_or(Value::Null), + }) }; let id = project.id.clone(); Ok(WriteOutcome::new( diff --git a/engine/core/src/application/services/inbox.rs b/engine/core/src/application/services/inbox.rs index f9a7d406..0108781f 100644 --- a/engine/core/src/application/services/inbox.rs +++ b/engine/core/src/application/services/inbox.rs @@ -16,6 +16,7 @@ use serde_json::{json, Value}; use crate::actors::{self, ActorClass}; use crate::application::context::{AppContext, Built}; +use crate::application::services::preferences::InboxSavedFilter; use crate::application::services::{context_parts, dispatch, now_of, write_context}; use crate::application::writes::{audited_write, WriteOutcome}; use crate::core::{ @@ -52,6 +53,53 @@ pub fn inbox_restore_op(built: &Built, params: Value) -> Result( + ctx: &AppContext, + saved: Option<&InboxSavedFilter>, +) -> Result<(i64, i64), VogtError> +where + C: Clock + 'static, + I: IdFactory + 'static, +{ + let (declared, observed, _, _, _, config) = context_parts(ctx); + let view = declared.read()?; + let mut entries = collect(ctx, observed, &view, config)?; + let triage = view.inbox_triage_by_keys( + &entries + .iter() + .map(|entry| text_of(entry, "entry_key")) + .collect::>(), + )?; + for entry in &mut entries { + *entry = apply_triage(ctx, &triage, entry.clone()); + } + let moment = now_of(&ctx.clock); + let active = ["active".to_string()]; + let active_total = entries + .iter() + .filter(|entry| triage_matches(entry, &active, moment)) + .count() as i64; + let filtered = match saved { + None => active_total, + Some(saved) => entries + .iter() + .filter(|entry| { + saved + .sources + .as_ref() + .is_none_or(|wanted| wanted.contains(&text_of(entry, "source"))) + && triage_matches(entry, &saved.triage_states, moment) + && actor_matches(entry, &saved.actor) + }) + .count() as i64, + }; + Ok((filtered, active_total)) +} + fn inbox_list(ctx: &AppContext, params: Value) -> Result where C: Clock + 'static, diff --git a/engine/core/src/application/views.rs b/engine/core/src/application/views.rs index e72ba844..0f25ceda 100644 --- a/engine/core/src/application/views.rs +++ b/engine/core/src/application/views.rs @@ -270,6 +270,63 @@ pub(crate) fn candidate_population( Ok((gathered.ranked.len() as i64, gathered.declared)) } +/// What `project.brief` reads from the backlog gather for one project: the +/// open-work and open-bug counts, the declared and observed split, and the top +/// rows. Python's `brief_project` calls `_gather` with no filters and then +/// takes these from it, so this is the same gather `backlog` ranks. +pub(crate) struct BriefPopulation { + pub open_work: i64, + pub open_bugs: i64, + pub declared: i64, + pub observed: i64, + pub top: Vec, +} + +pub(crate) fn brief_population( + ctx: &AppContext, + project: &str, + backlog_limit: usize, + mode: &str, +) -> Result { + let query = GatherQuery { + project: Some(project), + kinds: Vec::new(), + priorities: Vec::new(), + assignee: None, + initiative: None, + label: None, + trust_states: Vec::new(), + include_prs: true, + }; + let gathered = gather(ctx, &query)?; + let open_bugs = gathered + .ranked + .iter() + .filter(|row| row.value.get("kind").and_then(serde_json::Value::as_str) == Some("bug")) + .count() as i64; + Ok(BriefPopulation { + open_work: gathered.ranked.len() as i64, + open_bugs, + declared: gathered.declared, + observed: gathered.observed, + top: gathered + .ranked + .iter() + .take(backlog_limit) + .map(|row| projected(&row.value, mode)) + .collect(), + }) +} + +/// `backlog(limit=1).total_considered`, the backlog badge `place.metrics` +/// reads. It is the whole candidate population, not the page. +pub(crate) fn backlog_total_considered( + ctx: &AppContext, +) -> Result { + let answer = backlog(ctx, serde_json::json!({"limit": 1}))?; + Ok(answer["total_considered"].as_i64().unwrap_or(0)) +} + /// The candidate population of a ranked view, scored and ordered. Ports /// `_gather`: declared rows first, then the observed subjects that name no /// declared work, with a PR collapsed under the item it implements. diff --git a/engine/core/src/registry.rs b/engine/core/src/registry.rs index 31598e3e..c3ea550b 100644 --- a/engine/core/src/registry.rs +++ b/engine/core/src/registry.rs @@ -230,6 +230,8 @@ pub fn service_for(name: &str) -> Option { "project.list" => Some(crate::application::projects::list_op), "project.update" => Some(crate::application::projects::update_op), "project.transition" => Some(crate::application::projects::transition_op), + "project.brief" => Some(crate::application::projects::brief_op), + "place.metrics" => Some(crate::application::place::place_metrics_op), "label.create" => Some(crate::application::taxonomy::create_label_op), "label.list" => Some(crate::application::taxonomy::list_labels_op), "actor.create" => Some(crate::application::taxonomy::create_actor_op), @@ -992,7 +994,7 @@ mod tests { #[test] fn not_ported_is_a_failure() { let registry = registry(); - let operation = registry.get("place.metrics").unwrap(); + let operation = registry.get("engine.status").unwrap(); let error = operation.run(None, serde_json::json!({})).unwrap_err(); assert!( error.message().contains("not been ported"), @@ -1001,6 +1003,12 @@ mod tests { ); } + #[test] + fn the_project_brief_and_place_metrics_handlers_are_wired() { + assert!(service_for("project.brief").is_some()); + assert!(service_for("place.metrics").is_some()); + } + #[test] fn dump_names_every_operation_and_its_exclusion() { let manifest = dump(); diff --git a/scripts/parity.py b/scripts/parity.py index 30c1055b..b30efaf4 100644 --- a/scripts/parity.py +++ b/scripts/parity.py @@ -90,6 +90,8 @@ def main(argv: list[str] | None = None) -> int: golden = json.loads((args.golden / f"{args.transport}.json").read_text()) if args.only == "dump": golden = [step for step in golden if step["operation"].startswith("dump.")] + # A dump run executes the whole script so each mid-script dump sees the + # state the steps before it left; only the dumps are compared. recorded = [step for step in recorded if step["operation"].startswith("dump.")] elif args.only: golden = [step for step in golden if step["operation"].startswith(args.only)] @@ -126,6 +128,10 @@ def _resolve(impl: str) -> str: def _load_steps(prefix: str) -> list[dict[str, Any]]: document = json.loads(SCRIPT_PATH.read_text()) + if prefix == "dump": + # The dumps sit between the steps that write the tables they show, so + # a dump-only run has to execute the script up to them. + return list(document["steps"]) return [step for step in document["steps"] if step["operation"].startswith(prefix)] @@ -247,7 +253,7 @@ def request(method: str, params: dict[str, Any] | None = None) -> Any: recorded.append( { "operation": step["operation"], - "body": _dump(data, (step["dump"],)), + "body": _dump(data, _dump_names(step)), } ) continue @@ -336,13 +342,14 @@ def _run_cli(binary: str, steps: list[dict[str, Any]]) -> list[dict[str, Any]]: } ) for step in steps: - if "dump" in step: + # A dump step records tables at this point in the script, so a + # later step cannot hide a change an earlier one wrote. `true` + # dumps both stores; a store name dumps just that one. + if step.get("dump"): + body = _dump(data, _dump_names(step)) + _blank_payload_digests(body) answers.append( - { - "operation": step["operation"], - "exit": 0, - "body": _dump(data, (step["dump"],)), - } + {"operation": step["operation"], "exit": 0, "body": body} ) continue if "params" not in step: @@ -392,6 +399,28 @@ def _run_cli(binary: str, steps: list[dict[str, Any]]) -> list[dict[str, Any]]: return answers +def _dump_names(step: dict[str, Any]) -> tuple[str, ...]: + """The stores a dump step names: both for `true`, else the one named.""" + if step["dump"] is True: + return ("declared", "observed") + return (step["dump"],) + + +def _blank_payload_digests(dumped: dict[str, Any]) -> None: + """Blank the audit digests of a mid-script dump, in place. + + An audit row's `payload_digest` covers the whole payload, and a project's + payload names its root path, which is the run's temporary root. The digest + therefore differs from one run to the next even though the rest of the row + is fixed. The row's other fields still compare verbatim, so a changed + operation, actor, revision or reason is still caught. + """ + for tables in dumped.values(): + for row in (tables or {}).get("audit") or []: + if "payload_digest" in row: + row["payload_digest"] = "" + + def _dump( data: Path, names: tuple[str, ...] = ("declared", "observed") ) -> dict[str, Any]: @@ -524,7 +553,7 @@ def _run_http(binary: str, steps: list[dict[str, Any]]) -> list[dict[str, Any]]: { "operation": step["operation"], "result": _normalise( - _dump(data, (step["dump"],)), Path(scratch), data + _dump(data, _dump_names(step)), Path(scratch), data ), } ) diff --git a/tests/parity/golden/21c95f6/cli.json b/tests/parity/golden/21c95f6/cli.json index eaccc7e5..2d212d75 100644 --- a/tests/parity/golden/21c95f6/cli.json +++ b/tests/parity/golden/21c95f6/cli.json @@ -1149,6 +1149,674 @@ "exit": 0, "operation": "project.register" }, + { + "body": { + "declared": { + "actors": [ + { + "created_at": "2026-01-02T03:04:07+00:00", + "disabled": 0, + "display_name": "parity", + "id": "act_0001", + "identity_ref": "local:parity", + "kind": "human" + }, + { + "created_at": "2026-01-02T03:04:09+00:00", + "disabled": 0, + "display_name": "agent:vogt-engine", + "id": "act_0002", + "identity_ref": "agent:vogt-engine", + "kind": "agent" + }, + { + "created_at": "2026-01-02T03:04:13+00:00", + "disabled": 0, + "display_name": "agent:vogt-sessions", + "id": "act_0003", + "identity_ref": "agent:vogt-sessions", + "kind": "agent" + }, + { + "created_at": "2026-01-02T03:04:05+00:00", + "disabled": 0, + "display_name": "Parity Agent", + "id": "act_0004", + "identity_ref": "agent:parity", + "kind": "agent" + } + ], + "audit": [ + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:07+00:00", + "entity_id": "ins_0001", + "entity_kind": "instance", + "id": "aud_0001", + "operation": "instance.init", + "payload_digest": "", + "reason": "instance bootstrap", + "revision": 0, + "txn_id": "txn_0001" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "entity_id": "tok_0001", + "entity_kind": "token", + "id": "aud_0002", + "operation": "token.adopt", + "payload_digest": "", + "reason": "adopting the operator-supplied core token at init", + "revision": 1, + "txn_id": "txn_0002" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "entity_id": "tok_0002", + "entity_kind": "token", + "id": "aud_0003", + "operation": "token.adopt", + "payload_digest": "", + "reason": "adopting the operator-supplied agent token at init", + "revision": 2, + "txn_id": "txn_0003" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "entity_id": "act_0004", + "entity_kind": "actor", + "id": "aud_0004", + "operation": "actor.create", + "payload_digest": "", + "reason": "parity harness", + "revision": 3, + "txn_id": "txn_0004" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "entity_id": "lbl_0001", + "entity_kind": "label", + "id": "aud_0005", + "operation": "label.create", + "payload_digest": "", + "reason": "parity harness", + "revision": 4, + "txn_id": "txn_0005" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0006", + "operation": "project.register", + "payload_digest": "", + "reason": "parity harness", + "revision": 5, + "txn_id": "txn_0006" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0007", + "operation": "project.update", + "payload_digest": "", + "reason": "parity harness", + "revision": 6, + "txn_id": "txn_0007" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0008", + "operation": "project.transition", + "payload_digest": "", + "reason": "parity harness", + "revision": 7, + "txn_id": "txn_0008" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:05+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0009", + "operation": "project.scaffold", + "payload_digest": "", + "reason": "parity harness", + "revision": 8, + "txn_id": "txn_0009" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "entity_id": "prj_0002", + "entity_kind": "project", + "id": "aud_0010", + "operation": "project.register", + "payload_digest": "", + "reason": "parity harness", + "revision": 9, + "txn_id": "txn_0010" + } + ], + "events": [ + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "audit_id": "aud_0002", + "entity_id": "tok_0001", + "entity_kind": "token", + "kind": "token.adopted", + "seq": 1, + "summary": "{\"actor\": \"agent:vogt-engine\", \"scopes\": [\"read\", \"work.write\", \"project.write\"]}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "audit_id": "aud_0003", + "entity_id": "tok_0002", + "entity_kind": "token", + "kind": "token.adopted", + "seq": 2, + "summary": "{\"actor\": \"agent:vogt-sessions\", \"scopes\": [\"read\", \"work.write\", \"project.write\", \"writeback\"]}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "audit_id": "aud_0004", + "entity_id": "act_0004", + "entity_kind": "actor", + "kind": "actor.created", + "seq": 3, + "summary": "{\"identity_ref\": \"agent:parity\", \"kind\": \"agent\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "audit_id": "aud_0005", + "entity_id": "lbl_0001", + "entity_kind": "label", + "kind": "label.created", + "seq": 4, + "summary": "{\"name\": \"parity\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "audit_id": "aud_0006", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.registered", + "seq": 5, + "summary": "{\"slug\": \"parity\", \"name\": \"Parity\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "audit_id": "aud_0007", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.updated", + "seq": 6, + "summary": "{\"slug\": \"parity\", \"exclusions\": [\".venv/\", \"node_modules/\", \"target/\", \"dist/\", \"build/\", \".git/\", \".claude/\"], \"repo_url\": \"https://example.invalid/parity.git\", \"agent_policy\": {\"forbidden_text\": [], \"merge_deploys_prod\": false, \"main_branches\": [], \"base_branch\": \"\", \"commit_identity\": \"\", \"test_recipe\": \"\", \"deployed_setup\": \"\", \"rules\": [], \"session_wall_clock_minutes\": null, \"landing\": null, \"review\": null, \"verification\": null}}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "audit_id": "aud_0008", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.transitioned", + "seq": 7, + "summary": "{\"slug\": \"parity\", \"from\": \"incubating\", \"to\": \"active\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:05+00:00", + "audit_id": "aud_0009", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.scaffolded", + "seq": 8, + "summary": "{\"slug\": \"parity\", \"created\": 0, \"skipped\": 6}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:06+00:00", + "audit_id": "aud_0010", + "entity_id": "prj_0002", + "entity_kind": "project", + "kind": "project.registered", + "seq": 9, + "summary": "{\"slug\": \"second\", \"name\": \"Second\"}" + } + ], + "labels": [ + { + "color": "#d73a4a", + "created_at": "2026-01-02T03:04:05+00:00", + "id": "lbl_0001", + "name": "parity" + } + ], + "meta": [ + { + "key": "instance_id", + "value": "ins_0001" + }, + { + "key": "revision", + "value": "9" + }, + { + "key": "work_ref_seq", + "value": "0" + }, + { + "key": "created_at", + "value": "2026-01-02T03:04:07+00:00" + } + ], + "migration_lock": [ + { + "acquired_at": null, + "holder": null, + "id": 1 + } + ], + "migrations": [ + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "83cf77f4abe04e89c2efa22271c6d9275532f1dd37a270b7667226b3748ae643", + "id": "0001_foundation" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "f690b73e4b9523cd85b818ac11c6fecf086c020683324dccbc03ec3d7b59627d", + "id": "0002_work" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "9032649fc02951fe5d6340a6f9576a45b8d7197057990c68dca834a1d26f48b8", + "id": "0003_observed_first" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "cc588f67774949d31caf0305200e557cc666617b8f5a2469f958f511944ee3f4", + "id": "0004_drift" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "0e2adf0935fc90a6810710297ab3490edb430b47d9d169a2166ae189c24223b2", + "id": "0005_tokens" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "37b95c74c33d9d7c5ee649ab72b265b4de517b41a40cb3a2c768099f210b0f58", + "id": "0006_writeback" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "47c82ee427931ca7c0a3a8d047298ffe5c2b2ad49ff06f83b00acf59306a1ff6", + "id": "0007_sessions" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "f533369dd3625830341933caac68f4611a02d0e4055b9d37a62db9c59f731ce3", + "id": "0008_superseded_drift" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "b0ca1559346b05c6ef818b3b65c2ae798f05c755c7a0dd326c73227da770c226", + "id": "0009_inbox_triage" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "de3f70faf7ccb5fd276455a9a56eb7a731c8334fb6964ea6d5eb2407dbcb03f5", + "id": "0010_session_model" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "7b4ab541ce8b97e31f1871373c6400e7a6390bdc70356fe703f3aa5e29211582", + "id": "0011_contract_adoption" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "c819361c246e6c76035ed27c1a296d723235259c449a2ee2ce192163b8cb8a3a", + "id": "0012_forge_accounts" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "fa8e380cd0761fe49bf3a46fd7e9305799fe8f142fdc331c71d2a0836fa00c3f", + "id": "0013_upstream_truth" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "2fef3fae64abd522ef65b21eef63f5a93d2b44ded81e5836da1288639a59a70d", + "id": "0014_native_migration" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "6f60bd5cae2d90f79cfb72228c88b21927958bdeedc7f00da59835c3e18a928c", + "id": "0015_work_overlay_branches" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "e9d6f101a8d95929b51b6dd9a4d1ccc0e3a732e49fd605c60de3ee849be7a113", + "id": "0016_perf_indexes" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "3131bbedaed1c58d3997598f18e8f30d103ec6f1447d38dcaa2a2846f1b7d8f8", + "id": "0017_password_credentials" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "a04732a0b920af03fc8731b513260caf81d25216533efb8c8eac030185371c00", + "id": "0018_actor_preferences" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "2c307b06be247b5b5739230750785d9209dee953a22da0354952ebe1cf45811d", + "id": "0019_session_grants" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "e5fd2b7bd062d50c9d21a923df3176e9e5b69e9fb06b0dd6bf75b295d694b761", + "id": "0020_install_latch" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "9f11063cfd66c2940b21819453fa18f16123b56f59ce77f2bad74d50523d5127", + "id": "0021_agent_policy" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "1a86e121ab2879671fd44ee5a9276e05d4af19bb4b98e71e3426634958be7078", + "id": "0022_comment_kind" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "8fb4506bf7517137f5e20b26525268bda7af4bcd45057731547564d5428f615e", + "id": "0023_decisions" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "806ade321a5da9c91bbbbff49927587f48cb214cadca672c1b5a705d60662cf9", + "id": "0024_session_started_by" + } + ], + "projects": [ + { + "agent_policy": "{\"forbidden_text\":[],\"merge_deploys_prod\":false,\"main_branches\":[],\"base_branch\":\"\",\"commit_identity\":\"\",\"test_recipe\":\"\",\"deployed_setup\":\"\",\"rules\":[],\"session_wall_clock_minutes\":null,\"landing\":null,\"review\":null,\"verification\":null}", + "compliance_checked_at": null, + "compliance_status": "not_checked", + "contract_adopted_at": "2026-01-02T03:04:05+00:00", + "contract_version": null, + "created_at": "2026-01-02T03:04:05+00:00", + "current_version": null, + "exclusions": "[\".venv/\", \"node_modules/\", \"target/\", \"dist/\", \"build/\", \".git/\", \".claude/\"]", + "id": "prj_0001", + "lifecycle_state": "active", + "link_state": "unlinked", + "name": "Parity", + "repo_url": "https://example.invalid/parity.git", + "root_path": "/proj", + "slug": "parity", + "trust_state": "unverified", + "updated_at": "2026-01-02T03:04:05+00:00", + "write_back": "none" + }, + { + "agent_policy": "{\"forbidden_text\":[],\"merge_deploys_prod\":false,\"main_branches\":[],\"base_branch\":\"\",\"commit_identity\":\"\",\"test_recipe\":\"\",\"deployed_setup\":\"\",\"rules\":[],\"session_wall_clock_minutes\":null,\"landing\":null,\"review\":null,\"verification\":null}", + "compliance_checked_at": null, + "compliance_status": "not_checked", + "contract_adopted_at": null, + "contract_version": null, + "created_at": "2026-01-02T03:04:05+00:00", + "current_version": null, + "exclusions": "[\".venv/\", \"node_modules/\", \"target/\", \"dist/\", \"build/\", \".git/\", \".claude/\"]", + "id": "prj_0002", + "lifecycle_state": "active", + "link_state": "unlinked", + "name": "Second", + "repo_url": null, + "root_path": "/instance/repos/second", + "slug": "second", + "trust_state": "unverified", + "updated_at": "2026-01-02T03:04:05+00:00", + "write_back": "none" + } + ], + "tokens": [ + { + "actor_id": "act_0002", + "created_at": "2026-01-02T03:04:11+00:00", + "expires_at": null, + "id": "tok_0001", + "kind": "api", + "last_used_at": null, + "name": "bootstrap core token", + "revoked_at": null, + "revoked_reason": null, + "scopes": "[\"read\", \"work.write\", \"project.write\"]", + "token_hash": "9545b721f3788049180e1ccb546015bce1287aeb505e54d04a01344bb38fe4f6" + }, + { + "actor_id": "act_0003", + "created_at": "2026-01-02T03:04:15+00:00", + "expires_at": null, + "id": "tok_0002", + "kind": "api", + "last_used_at": null, + "name": "bootstrap agent token", + "revoked_at": null, + "revoked_reason": null, + "scopes": "[\"read\", \"work.write\", \"project.write\", \"writeback\"]", + "token_hash": "d3ff8dd34b248fd9895c7ca25e883f4bc79b2321c11f6ebee6a619c6e702ce71" + } + ], + "workflow_defs": [ + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "feature", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "bug", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "chore", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "question", + "updated_at": "2026-01-02T03:04:05+00:00" + } + ] + }, + "observed": { + "meta": [ + { + "key": "instance_id", + "value": "ins_0001" + }, + { + "key": "created_at", + "value": "2026-01-02T03:04:08+00:00" + } + ], + "migration_lock": [ + { + "acquired_at": null, + "holder": null, + "id": 1 + } + ], + "migrations": [ + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "c050f9e4dba983119f045b8fb4ccbe8b1ee97473170eead7d28279e99468de4b", + "id": "0001_foundation" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "9cdc9c9179740af96606bab0b557c7b35639eaabc78faf16630c7705f1d368f5", + "id": "0002_evidence" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "8bf0b8533774a156762fddc2e56bbb9656ba3b6bf0e38ec85a66c9dc9c325ed1", + "id": "0003_inherited_dep_refs" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "8d5cffbb2acb6ff18099ad73384eaa4ea5ebca7a6f45afb79d353fb4cbbcaee6", + "id": "0004_forge_sync" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "e6902e6616ab9948f9d222b2763ce9bc421a136b6acb1422240e5957683e5e45", + "id": "0005_perf_indexes" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "e0e959f4bf4f39db47d5e41ac11391d5f80a0b73bcce57d36168572062b1ab66", + "id": "0006_agent_activity" + } + ] + } + }, + "exit": 0, + "operation": "dump.after_project_and_label" + }, + { + "body": { + "by_kind": {}, + "by_state": {}, + "ci_status": { + "checks": 0, + "detail": "swept, but no CI checks were observed \u2014 either this project has none, or the optional forge adapter is not configured", + "earlier_failures": 0, + "failing": [], + "revision": null, + "revisions_observed": 0, + "status": "no_checks" + }, + "compliance_checked_at": null, + "compliance_status": "not_checked", + "current_version": null, + "declared_version": null, + "declared_work": 0, + "dependencies": { + "detail": "`dep-refs` has not walked this project; its references are not collected, which is not the same as none", + "referenced_by": 0, + "references_out": 0, + "status": "not_collected", + "unresolved": 0 + }, + "freshness": { + "age_seconds": null, + "collectors": {}, + "detail": "no collector has completed a sweep yet", + "oldest_relevant_sweep": null, + "status": "never_swept" + }, + "observed_version": null, + "observed_work": 0, + "open_bugs": 0, + "open_work": 0, + "project": { + "agent_policy": { + "base_branch": "", + "commit_identity": "", + "deployed_setup": "", + "forbidden_text": [], + "landing": null, + "main_branches": [], + "merge_deploys_prod": false, + "review": null, + "rules": [], + "session_wall_clock_minutes": null, + "test_recipe": "", + "verification": null + }, + "compliance_checked_at": null, + "compliance_status": "not_checked", + "contract_adopted_at": "2026-01-02T03:04:05Z", + "contract_version": null, + "created_at": "2026-01-02T03:04:05Z", + "current_version": null, + "exclusions": [ + ".venv/", + "node_modules/", + "target/", + "dist/", + "build/", + ".git/", + ".claude/" + ], + "id": "prj_0001", + "lifecycle_state": "active", + "link_state": "unlinked", + "name": "Parity", + "repo_url": "https://example.invalid/parity.git", + "root_path": "/proj", + "slug": "parity", + "trust_state": "unverified", + "updated_at": "2026-01-02T03:04:05Z", + "write_back": "none" + }, + "top_backlog": [], + "version_matches": null + }, + "exit": 0, + "operation": "project.brief" + }, + { + "body": { + "backlog_total_considered": 0, + "drift_present": false, + "generated_at": "2026-01-02T03:04:08Z", + "inbox_active": 0, + "inbox_active_unfiltered": 0, + "inbox_filter": null, + "projects_total": 2, + "revision": 9, + "work_total": 0 + }, + "exit": 0, + "operation": "place.metrics" + }, + { + "body": { + "configured": 0, + "detail": "deploy_lanes is not configured, so deployed versions are not collected", + "freshness": { + "age_seconds": null, + "collectors": {}, + "detail": "no collector has completed a sweep yet", + "oldest_relevant_sweep": null, + "status": "never_swept" + }, + "lanes": [] + }, + "exit": 0, + "operation": "deployed.versions" + }, { "body": { "initiative": { diff --git a/tests/parity/golden/21c95f6/http.json b/tests/parity/golden/21c95f6/http.json index 8a8dfbdf..0968373f 100644 --- a/tests/parity/golden/21c95f6/http.json +++ b/tests/parity/golden/21c95f6/http.json @@ -47,6 +47,347 @@ }, "status": 200 }, + { + "operation": "dump.after_project_and_label", + "result": { + "declared": { + "actors": [ + { + "created_at": "2026-01-02T03:04:07+00:00", + "disabled": 0, + "display_name": "parity", + "id": "act_0001", + "identity_ref": "local:parity", + "kind": "human" + }, + { + "created_at": "2026-01-02T03:04:09+00:00", + "disabled": 0, + "display_name": "agent:vogt-engine", + "id": "act_0002", + "identity_ref": "agent:vogt-engine", + "kind": "agent" + }, + { + "created_at": "2026-01-02T03:04:13+00:00", + "disabled": 0, + "display_name": "agent:vogt-sessions", + "id": "act_0003", + "identity_ref": "agent:vogt-sessions", + "kind": "agent" + } + ], + "audit": [ + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:07+00:00", + "entity_id": "ins_0001", + "entity_kind": "instance", + "id": "aud_0001", + "operation": "instance.init", + "payload_digest": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "reason": "instance bootstrap", + "revision": 0, + "txn_id": "txn_0001" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "entity_id": "tok_0001", + "entity_kind": "token", + "id": "aud_0002", + "operation": "token.adopt", + "payload_digest": "sha256:59549779aa0cda6825e03092b441cacac09d0003597ed7fd262fc918fdedf350", + "reason": "adopting the operator-supplied core token at init", + "revision": 1, + "txn_id": "txn_0002" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "entity_id": "tok_0002", + "entity_kind": "token", + "id": "aud_0003", + "operation": "token.adopt", + "payload_digest": "sha256:f1942d83b32c6907f41a7053a5e2b379b085799a1b1a2bb7dd9e2a327080cefc", + "reason": "adopting the operator-supplied agent token at init", + "revision": 2, + "txn_id": "txn_0003" + } + ], + "events": [ + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "audit_id": "aud_0002", + "entity_id": "tok_0001", + "entity_kind": "token", + "kind": "token.adopted", + "seq": 1, + "summary": "{\"actor\": \"agent:vogt-engine\", \"scopes\": [\"read\", \"work.write\", \"project.write\"]}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "audit_id": "aud_0003", + "entity_id": "tok_0002", + "entity_kind": "token", + "kind": "token.adopted", + "seq": 2, + "summary": "{\"actor\": \"agent:vogt-sessions\", \"scopes\": [\"read\", \"work.write\", \"project.write\", \"writeback\"]}" + } + ], + "meta": [ + { + "key": "instance_id", + "value": "ins_0001" + }, + { + "key": "revision", + "value": "2" + }, + { + "key": "work_ref_seq", + "value": "0" + }, + { + "key": "created_at", + "value": "2026-01-02T03:04:07+00:00" + } + ], + "migration_lock": [ + { + "acquired_at": null, + "holder": null, + "id": 1 + } + ], + "migrations": [ + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "83cf77f4abe04e89c2efa22271c6d9275532f1dd37a270b7667226b3748ae643", + "id": "0001_foundation" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "f690b73e4b9523cd85b818ac11c6fecf086c020683324dccbc03ec3d7b59627d", + "id": "0002_work" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "9032649fc02951fe5d6340a6f9576a45b8d7197057990c68dca834a1d26f48b8", + "id": "0003_observed_first" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "cc588f67774949d31caf0305200e557cc666617b8f5a2469f958f511944ee3f4", + "id": "0004_drift" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "0e2adf0935fc90a6810710297ab3490edb430b47d9d169a2166ae189c24223b2", + "id": "0005_tokens" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "37b95c74c33d9d7c5ee649ab72b265b4de517b41a40cb3a2c768099f210b0f58", + "id": "0006_writeback" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "47c82ee427931ca7c0a3a8d047298ffe5c2b2ad49ff06f83b00acf59306a1ff6", + "id": "0007_sessions" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "f533369dd3625830341933caac68f4611a02d0e4055b9d37a62db9c59f731ce3", + "id": "0008_superseded_drift" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "b0ca1559346b05c6ef818b3b65c2ae798f05c755c7a0dd326c73227da770c226", + "id": "0009_inbox_triage" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "de3f70faf7ccb5fd276455a9a56eb7a731c8334fb6964ea6d5eb2407dbcb03f5", + "id": "0010_session_model" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "7b4ab541ce8b97e31f1871373c6400e7a6390bdc70356fe703f3aa5e29211582", + "id": "0011_contract_adoption" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "c819361c246e6c76035ed27c1a296d723235259c449a2ee2ce192163b8cb8a3a", + "id": "0012_forge_accounts" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "fa8e380cd0761fe49bf3a46fd7e9305799fe8f142fdc331c71d2a0836fa00c3f", + "id": "0013_upstream_truth" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "2fef3fae64abd522ef65b21eef63f5a93d2b44ded81e5836da1288639a59a70d", + "id": "0014_native_migration" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "6f60bd5cae2d90f79cfb72228c88b21927958bdeedc7f00da59835c3e18a928c", + "id": "0015_work_overlay_branches" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "e9d6f101a8d95929b51b6dd9a4d1ccc0e3a732e49fd605c60de3ee849be7a113", + "id": "0016_perf_indexes" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "3131bbedaed1c58d3997598f18e8f30d103ec6f1447d38dcaa2a2846f1b7d8f8", + "id": "0017_password_credentials" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "a04732a0b920af03fc8731b513260caf81d25216533efb8c8eac030185371c00", + "id": "0018_actor_preferences" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "2c307b06be247b5b5739230750785d9209dee953a22da0354952ebe1cf45811d", + "id": "0019_session_grants" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "e5fd2b7bd062d50c9d21a923df3176e9e5b69e9fb06b0dd6bf75b295d694b761", + "id": "0020_install_latch" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "9f11063cfd66c2940b21819453fa18f16123b56f59ce77f2bad74d50523d5127", + "id": "0021_agent_policy" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "1a86e121ab2879671fd44ee5a9276e05d4af19bb4b98e71e3426634958be7078", + "id": "0022_comment_kind" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "8fb4506bf7517137f5e20b26525268bda7af4bcd45057731547564d5428f615e", + "id": "0023_decisions" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "806ade321a5da9c91bbbbff49927587f48cb214cadca672c1b5a705d60662cf9", + "id": "0024_session_started_by" + } + ], + "tokens": [ + { + "actor_id": "act_0002", + "created_at": "2026-01-02T03:04:11+00:00", + "expires_at": null, + "id": "tok_0001", + "kind": "api", + "last_used_at": null, + "name": "bootstrap core token", + "revoked_at": null, + "revoked_reason": null, + "scopes": "[\"read\", \"work.write\", \"project.write\"]", + "token_hash": "9545b721f3788049180e1ccb546015bce1287aeb505e54d04a01344bb38fe4f6" + }, + { + "actor_id": "act_0003", + "created_at": "2026-01-02T03:04:15+00:00", + "expires_at": null, + "id": "tok_0002", + "kind": "api", + "last_used_at": null, + "name": "bootstrap agent token", + "revoked_at": null, + "revoked_reason": null, + "scopes": "[\"read\", \"work.write\", \"project.write\", \"writeback\"]", + "token_hash": "d3ff8dd34b248fd9895c7ca25e883f4bc79b2321c11f6ebee6a619c6e702ce71" + } + ], + "workflow_defs": [ + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "feature", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "bug", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "chore", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "question", + "updated_at": "2026-01-02T03:04:05+00:00" + } + ] + }, + "observed": { + "meta": [ + { + "key": "instance_id", + "value": "ins_0001" + }, + { + "key": "created_at", + "value": "2026-01-02T03:04:08+00:00" + } + ], + "migration_lock": [ + { + "acquired_at": null, + "holder": null, + "id": 1 + } + ], + "migrations": [ + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "c050f9e4dba983119f045b8fb4ccbe8b1ee97473170eead7d28279e99468de4b", + "id": "0001_foundation" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "9cdc9c9179740af96606bab0b557c7b35639eaabc78faf16630c7705f1d368f5", + "id": "0002_evidence" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "8bf0b8533774a156762fddc2e56bbb9656ba3b6bf0e38ec85a66c9dc9c325ed1", + "id": "0003_inherited_dep_refs" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "8d5cffbb2acb6ff18099ad73384eaa4ea5ebca7a6f45afb79d353fb4cbbcaee6", + "id": "0004_forge_sync" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "e6902e6616ab9948f9d222b2763ce9bc421a136b6acb1422240e5957683e5e45", + "id": "0005_perf_indexes" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "e0e959f4bf4f39db47d5e41ac11391d5f80a0b73bcce57d36168572062b1ab66", + "id": "0006_agent_activity" + } + ] + } + } + }, { "operation": "install.bootstrap", "result": { diff --git a/tests/parity/golden/21c95f6/mcp.json b/tests/parity/golden/21c95f6/mcp.json index 5e18a5a5..3891f8e9 100644 --- a/tests/parity/golden/21c95f6/mcp.json +++ b/tests/parity/golden/21c95f6/mcp.json @@ -1078,16 +1078,665 @@ "is_error": false, "operation": "project.register" }, + { + "body": { + "declared": { + "actors": [ + { + "created_at": "2026-01-02T03:04:07+00:00", + "disabled": 0, + "display_name": "parity", + "id": "act_0001", + "identity_ref": "local:parity", + "kind": "human" + }, + { + "created_at": "2026-01-02T03:04:09+00:00", + "disabled": 0, + "display_name": "agent:vogt-engine", + "id": "act_0002", + "identity_ref": "agent:vogt-engine", + "kind": "agent" + }, + { + "created_at": "2026-01-02T03:04:13+00:00", + "disabled": 0, + "display_name": "agent:vogt-sessions", + "id": "act_0003", + "identity_ref": "agent:vogt-sessions", + "kind": "agent" + }, + { + "created_at": "2026-01-02T03:04:07+00:00", + "disabled": 0, + "display_name": "Parity Agent", + "id": "act_0004", + "identity_ref": "agent:parity", + "kind": "agent" + } + ], + "audit": [ + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:07+00:00", + "entity_id": "ins_0001", + "entity_kind": "instance", + "id": "aud_0001", + "operation": "instance.init", + "payload_digest": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "reason": "instance bootstrap", + "revision": 0, + "txn_id": "txn_0001" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "entity_id": "tok_0001", + "entity_kind": "token", + "id": "aud_0002", + "operation": "token.adopt", + "payload_digest": "sha256:59549779aa0cda6825e03092b441cacac09d0003597ed7fd262fc918fdedf350", + "reason": "adopting the operator-supplied core token at init", + "revision": 1, + "txn_id": "txn_0002" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "entity_id": "tok_0002", + "entity_kind": "token", + "id": "aud_0003", + "operation": "token.adopt", + "payload_digest": "sha256:f1942d83b32c6907f41a7053a5e2b379b085799a1b1a2bb7dd9e2a327080cefc", + "reason": "adopting the operator-supplied agent token at init", + "revision": 2, + "txn_id": "txn_0003" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:08+00:00", + "entity_id": "act_0004", + "entity_kind": "actor", + "id": "aud_0004", + "operation": "actor.create", + "payload_digest": "sha256:13c248cfc7facfe4a7022b16e588334355643842ebef9a6a9f0fd8979954320f", + "reason": "parity harness", + "revision": 3, + "txn_id": "txn_0004" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:10+00:00", + "entity_id": "lbl_0001", + "entity_kind": "label", + "id": "aud_0005", + "operation": "label.create", + "payload_digest": "sha256:f6f8e5c46129b1e6924fd1039c61d459516692bcd37e593e81ec685aae3abe8e", + "reason": "parity harness", + "revision": 4, + "txn_id": "txn_0005" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0006", + "operation": "project.register", + "payload_digest": "", + "reason": "parity harness", + "revision": 5, + "txn_id": "txn_0006" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:14+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0007", + "operation": "project.update", + "payload_digest": "sha256:85cef2a14b2915d804f8a1f0719eda74903a43d1a02acb5cd724a7116e91b517", + "reason": "parity harness", + "revision": 6, + "txn_id": "txn_0007" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0008", + "operation": "project.transition", + "payload_digest": "sha256:d0cff29b2f2ccbadaec9a3c59ffe9f147af198d477b8a01ca760d9dd27247a2a", + "reason": "parity harness", + "revision": 7, + "txn_id": "txn_0008" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:17+00:00", + "entity_id": "prj_0001", + "entity_kind": "project", + "id": "aud_0009", + "operation": "project.scaffold", + "payload_digest": "sha256:63107a85166b692b1819b975af61afe2e585b9921f36531a77717420e2922fd6", + "reason": "parity harness", + "revision": 8, + "txn_id": "txn_0009" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:19+00:00", + "entity_id": "prj_0002", + "entity_kind": "project", + "id": "aud_0010", + "operation": "project.register", + "payload_digest": "", + "reason": "parity harness", + "revision": 9, + "txn_id": "txn_0010" + } + ], + "events": [ + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "audit_id": "aud_0002", + "entity_id": "tok_0001", + "entity_kind": "token", + "kind": "token.adopted", + "seq": 1, + "summary": "{\"actor\": \"agent:vogt-engine\", \"scopes\": [\"read\", \"work.write\", \"project.write\"]}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "audit_id": "aud_0003", + "entity_id": "tok_0002", + "entity_kind": "token", + "kind": "token.adopted", + "seq": 2, + "summary": "{\"actor\": \"agent:vogt-sessions\", \"scopes\": [\"read\", \"work.write\", \"project.write\", \"writeback\"]}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:08+00:00", + "audit_id": "aud_0004", + "entity_id": "act_0004", + "entity_kind": "actor", + "kind": "actor.created", + "seq": 3, + "summary": "{\"identity_ref\": \"agent:parity\", \"kind\": \"agent\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:10+00:00", + "audit_id": "aud_0005", + "entity_id": "lbl_0001", + "entity_kind": "label", + "kind": "label.created", + "seq": 4, + "summary": "{\"name\": \"parity\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:12+00:00", + "audit_id": "aud_0006", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.registered", + "seq": 5, + "summary": "{\"slug\": \"parity\", \"name\": \"Parity\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:14+00:00", + "audit_id": "aud_0007", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.updated", + "seq": 6, + "summary": "{\"slug\": \"parity\", \"exclusions\": [\".venv/\", \"node_modules/\", \"target/\", \"dist/\", \"build/\", \".git/\", \".claude/\"], \"repo_url\": \"https://example.invalid/parity.git\", \"agent_policy\": {\"forbidden_text\": [], \"merge_deploys_prod\": false, \"main_branches\": [], \"base_branch\": \"\", \"commit_identity\": \"\", \"test_recipe\": \"\", \"deployed_setup\": \"\", \"rules\": [], \"session_wall_clock_minutes\": null, \"landing\": null, \"review\": null, \"verification\": null}}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:16+00:00", + "audit_id": "aud_0008", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.transitioned", + "seq": 7, + "summary": "{\"slug\": \"parity\", \"from\": \"incubating\", \"to\": \"active\"}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:17+00:00", + "audit_id": "aud_0009", + "entity_id": "prj_0001", + "entity_kind": "project", + "kind": "project.scaffolded", + "seq": 8, + "summary": "{\"slug\": \"parity\", \"created\": 0, \"skipped\": 6}" + }, + { + "actor_id": "act_0001", + "at": "2026-01-02T03:04:19+00:00", + "audit_id": "aud_0010", + "entity_id": "prj_0002", + "entity_kind": "project", + "kind": "project.registered", + "seq": 9, + "summary": "{\"slug\": \"second\", \"name\": \"Second\"}" + } + ], + "labels": [ + { + "color": "#d73a4a", + "created_at": "2026-01-02T03:04:09+00:00", + "id": "lbl_0001", + "name": "parity" + } + ], + "meta": [ + { + "key": "instance_id", + "value": "ins_0001" + }, + { + "key": "revision", + "value": "9" + }, + { + "key": "work_ref_seq", + "value": "0" + }, + { + "key": "created_at", + "value": "2026-01-02T03:04:07+00:00" + } + ], + "migration_lock": [ + { + "acquired_at": null, + "holder": null, + "id": 1 + } + ], + "migrations": [ + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "83cf77f4abe04e89c2efa22271c6d9275532f1dd37a270b7667226b3748ae643", + "id": "0001_foundation" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "f690b73e4b9523cd85b818ac11c6fecf086c020683324dccbc03ec3d7b59627d", + "id": "0002_work" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "9032649fc02951fe5d6340a6f9576a45b8d7197057990c68dca834a1d26f48b8", + "id": "0003_observed_first" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "cc588f67774949d31caf0305200e557cc666617b8f5a2469f958f511944ee3f4", + "id": "0004_drift" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "0e2adf0935fc90a6810710297ab3490edb430b47d9d169a2166ae189c24223b2", + "id": "0005_tokens" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "37b95c74c33d9d7c5ee649ab72b265b4de517b41a40cb3a2c768099f210b0f58", + "id": "0006_writeback" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "47c82ee427931ca7c0a3a8d047298ffe5c2b2ad49ff06f83b00acf59306a1ff6", + "id": "0007_sessions" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "f533369dd3625830341933caac68f4611a02d0e4055b9d37a62db9c59f731ce3", + "id": "0008_superseded_drift" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "b0ca1559346b05c6ef818b3b65c2ae798f05c755c7a0dd326c73227da770c226", + "id": "0009_inbox_triage" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "de3f70faf7ccb5fd276455a9a56eb7a731c8334fb6964ea6d5eb2407dbcb03f5", + "id": "0010_session_model" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "7b4ab541ce8b97e31f1871373c6400e7a6390bdc70356fe703f3aa5e29211582", + "id": "0011_contract_adoption" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "c819361c246e6c76035ed27c1a296d723235259c449a2ee2ce192163b8cb8a3a", + "id": "0012_forge_accounts" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "fa8e380cd0761fe49bf3a46fd7e9305799fe8f142fdc331c71d2a0836fa00c3f", + "id": "0013_upstream_truth" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "2fef3fae64abd522ef65b21eef63f5a93d2b44ded81e5836da1288639a59a70d", + "id": "0014_native_migration" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "6f60bd5cae2d90f79cfb72228c88b21927958bdeedc7f00da59835c3e18a928c", + "id": "0015_work_overlay_branches" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "e9d6f101a8d95929b51b6dd9a4d1ccc0e3a732e49fd605c60de3ee849be7a113", + "id": "0016_perf_indexes" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "3131bbedaed1c58d3997598f18e8f30d103ec6f1447d38dcaa2a2846f1b7d8f8", + "id": "0017_password_credentials" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "a04732a0b920af03fc8731b513260caf81d25216533efb8c8eac030185371c00", + "id": "0018_actor_preferences" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "2c307b06be247b5b5739230750785d9209dee953a22da0354952ebe1cf45811d", + "id": "0019_session_grants" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "e5fd2b7bd062d50c9d21a923df3176e9e5b69e9fb06b0dd6bf75b295d694b761", + "id": "0020_install_latch" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "9f11063cfd66c2940b21819453fa18f16123b56f59ce77f2bad74d50523d5127", + "id": "0021_agent_policy" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "1a86e121ab2879671fd44ee5a9276e05d4af19bb4b98e71e3426634958be7078", + "id": "0022_comment_kind" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "8fb4506bf7517137f5e20b26525268bda7af4bcd45057731547564d5428f615e", + "id": "0023_decisions" + }, + { + "applied_at": "2026-01-02T03:04:05+00:00", + "checksum": "806ade321a5da9c91bbbbff49927587f48cb214cadca672c1b5a705d60662cf9", + "id": "0024_session_started_by" + } + ], + "projects": [ + { + "agent_policy": "{\"forbidden_text\":[],\"merge_deploys_prod\":false,\"main_branches\":[],\"base_branch\":\"\",\"commit_identity\":\"\",\"test_recipe\":\"\",\"deployed_setup\":\"\",\"rules\":[],\"session_wall_clock_minutes\":null,\"landing\":null,\"review\":null,\"verification\":null}", + "compliance_checked_at": null, + "compliance_status": "not_checked", + "contract_adopted_at": "2026-01-02T03:04:11+00:00", + "contract_version": null, + "created_at": "2026-01-02T03:04:11+00:00", + "current_version": null, + "exclusions": "[\".venv/\", \"node_modules/\", \"target/\", \"dist/\", \"build/\", \".git/\", \".claude/\"]", + "id": "prj_0001", + "lifecycle_state": "active", + "link_state": "unlinked", + "name": "Parity", + "repo_url": "https://example.invalid/parity.git", + "root_path": "/proj", + "slug": "parity", + "trust_state": "unverified", + "updated_at": "2026-01-02T03:04:15+00:00", + "write_back": "none" + }, + { + "agent_policy": "{\"forbidden_text\":[],\"merge_deploys_prod\":false,\"main_branches\":[],\"base_branch\":\"\",\"commit_identity\":\"\",\"test_recipe\":\"\",\"deployed_setup\":\"\",\"rules\":[],\"session_wall_clock_minutes\":null,\"landing\":null,\"review\":null,\"verification\":null}", + "compliance_checked_at": null, + "compliance_status": "not_checked", + "contract_adopted_at": null, + "contract_version": null, + "created_at": "2026-01-02T03:04:18+00:00", + "current_version": null, + "exclusions": "[\".venv/\", \"node_modules/\", \"target/\", \"dist/\", \"build/\", \".git/\", \".claude/\"]", + "id": "prj_0002", + "lifecycle_state": "active", + "link_state": "unlinked", + "name": "Second", + "repo_url": null, + "root_path": "/instance/repos/second", + "slug": "second", + "trust_state": "unverified", + "updated_at": "2026-01-02T03:04:18+00:00", + "write_back": "none" + } + ], + "tokens": [ + { + "actor_id": "act_0002", + "created_at": "2026-01-02T03:04:11+00:00", + "expires_at": null, + "id": "tok_0001", + "kind": "api", + "last_used_at": null, + "name": "bootstrap core token", + "revoked_at": null, + "revoked_reason": null, + "scopes": "[\"read\", \"work.write\", \"project.write\"]", + "token_hash": "9545b721f3788049180e1ccb546015bce1287aeb505e54d04a01344bb38fe4f6" + }, + { + "actor_id": "act_0003", + "created_at": "2026-01-02T03:04:15+00:00", + "expires_at": null, + "id": "tok_0002", + "kind": "api", + "last_used_at": null, + "name": "bootstrap agent token", + "revoked_at": null, + "revoked_reason": null, + "scopes": "[\"read\", \"work.write\", \"project.write\", \"writeback\"]", + "token_hash": "d3ff8dd34b248fd9895c7ca25e883f4bc79b2321c11f6ebee6a619c6e702ce71" + } + ], + "workflow_defs": [ + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "feature", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "bug", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "chore", + "updated_at": "2026-01-02T03:04:05+00:00" + }, + { + "definition": "{\"initial_state\": \"open\", \"transitions\": {\"blocked\": [\"open\", \"in_progress\", \"wont_do\"], \"done\": [\"open\"], \"in_progress\": [\"review\", \"blocked\", \"open\", \"wont_do\"], \"open\": [\"in_progress\", \"blocked\", \"wont_do\"], \"review\": [\"done\", \"in_progress\", \"blocked\", \"wont_do\"], \"wont_do\": [\"open\"]}}", + "kind": "question", + "updated_at": "2026-01-02T03:04:05+00:00" + } + ] + }, + "observed": { + "meta": [ + { + "key": "instance_id", + "value": "ins_0001" + }, + { + "key": "created_at", + "value": "2026-01-02T03:04:08+00:00" + } + ], + "migration_lock": [ + { + "acquired_at": null, + "holder": null, + "id": 1 + } + ], + "migrations": [ + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "c050f9e4dba983119f045b8fb4ccbe8b1ee97473170eead7d28279e99468de4b", + "id": "0001_foundation" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "9cdc9c9179740af96606bab0b557c7b35639eaabc78faf16630c7705f1d368f5", + "id": "0002_evidence" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "8bf0b8533774a156762fddc2e56bbb9656ba3b6bf0e38ec85a66c9dc9c325ed1", + "id": "0003_inherited_dep_refs" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "8d5cffbb2acb6ff18099ad73384eaa4ea5ebca7a6f45afb79d353fb4cbbcaee6", + "id": "0004_forge_sync" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "e6902e6616ab9948f9d222b2763ce9bc421a136b6acb1422240e5957683e5e45", + "id": "0005_perf_indexes" + }, + { + "applied_at": "2026-01-02T03:04:06+00:00", + "checksum": "e0e959f4bf4f39db47d5e41ac11391d5f80a0b73bcce57d36168572062b1ab66", + "id": "0006_agent_activity" + } + ] + } + }, + "operation": "dump.after_project_and_label" + }, + { + "body": { + "by_kind": {}, + "by_state": {}, + "ci_status": { + "checks": 0, + "detail": "swept, but no CI checks were observed \u2014 either this project has none, or the optional forge adapter is not configured", + "earlier_failures": 0, + "failing": [], + "revisions_observed": 0, + "status": "no_checks" + }, + "compliance_status": "not_checked", + "declared_work": 0, + "dependencies": { + "detail": "`dep-refs` has not walked this project; its references are not collected, which is not the same as none", + "referenced_by": 0, + "references_out": 0, + "status": "not_collected", + "unresolved": 0 + }, + "freshness": { + "collectors": {}, + "detail": "no collector has completed a sweep yet", + "status": "never_swept" + }, + "observed_work": 0, + "open_bugs": 0, + "open_work": 0, + "project": { + "agent_policy": { + "base_branch": "", + "commit_identity": "", + "deployed_setup": "", + "forbidden_text": [], + "main_branches": [], + "merge_deploys_prod": false, + "rules": [], + "test_recipe": "" + }, + "compliance_status": "not_checked", + "contract_adopted_at": "2026-01-02T03:04:11Z", + "created_at": "2026-01-02T03:04:11Z", + "exclusions": [ + ".venv/", + "node_modules/", + "target/", + "dist/", + "build/", + ".git/", + ".claude/" + ], + "id": "prj_0001", + "lifecycle_state": "active", + "link_state": "unlinked", + "name": "Parity", + "repo_url": "https://example.invalid/parity.git", + "root_path": "/proj", + "slug": "parity", + "trust_state": "unverified", + "updated_at": "2026-01-02T03:04:15Z", + "write_back": "none" + }, + "top_backlog": [] + }, + "is_error": false, + "operation": "project.brief" + }, + { + "body": { + "backlog_total_considered": 0, + "drift_present": false, + "generated_at": "2026-01-02T03:04:25Z", + "inbox_active": 0, + "inbox_active_unfiltered": 0, + "projects_total": 2, + "revision": 9, + "work_total": 0 + }, + "is_error": false, + "operation": "place.metrics" + }, + { + "body": { + "configured": 0, + "detail": "deploy_lanes is not configured, so deployed versions are not collected", + "freshness": { + "collectors": {}, + "detail": "no collector has completed a sweep yet", + "status": "never_swept" + }, + "lanes": [] + }, + "is_error": false, + "operation": "deployed.versions" + }, { "body": { "initiative": { "body": "", - "created_at": "2026-01-02T03:04:20Z", + "created_at": "2026-01-02T03:04:26Z", "id": "ini_0001", "slug": "platform", "state": "open", "title": "Platform", - "updated_at": "2026-01-02T03:04:20Z", + "updated_at": "2026-01-02T03:04:26Z", "weight": 0 } }, @@ -1099,12 +1748,12 @@ "initiatives": [ { "body": "", - "created_at": "2026-01-02T03:04:20Z", + "created_at": "2026-01-02T03:04:26Z", "id": "ini_0001", "slug": "platform", "state": "open", "title": "Platform", - "updated_at": "2026-01-02T03:04:20Z", + "updated_at": "2026-01-02T03:04:26Z", "weight": 0 } ] @@ -1116,12 +1765,12 @@ "body": { "initiative": { "body": "", - "created_at": "2026-01-02T03:04:20Z", + "created_at": "2026-01-02T03:04:26Z", "id": "ini_0001", "slug": "platform", "state": "open", "title": "Platform work", - "updated_at": "2026-01-02T03:04:22Z", + "updated_at": "2026-01-02T03:04:28Z", "weight": 0 } }, @@ -1155,7 +1804,7 @@ "body": { "preference": { "key": "inbox.filter", - "updated_at": "2026-01-02T03:04:25Z", + "updated_at": "2026-01-02T03:04:31Z", "value": { "actor": "any", "sources": [ @@ -1244,7 +1893,7 @@ "github_scope": "registered projects only", "high_water": {}, "instance_scope": "registered projects only", - "snapshot_at": "2026-01-02T03:04:27Z" + "snapshot_at": "2026-01-02T03:04:33Z" }, "is_error": false, "operation": "inbox.list" @@ -1276,7 +1925,7 @@ "comments": [], "item": { "body": "", - "created_at": "2026-01-02T03:04:29Z", + "created_at": "2026-01-02T03:04:35Z", "id": "wrk_0001", "kind": "chore", "labels": [], @@ -1287,7 +1936,7 @@ "state": "open", "title": "parity item", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:29Z" + "updated_at": "2026-01-02T03:04:35Z" }, "live_sessions": [], "sessions": [], @@ -1302,7 +1951,7 @@ "comments": [], "item": { "body": "", - "created_at": "2026-01-02T03:04:29Z", + "created_at": "2026-01-02T03:04:35Z", "id": "wrk_0001", "kind": "chore", "labels": [], @@ -1313,7 +1962,7 @@ "state": "open", "title": "parity item renamed", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:31Z" + "updated_at": "2026-01-02T03:04:37Z" }, "live_sessions": [], "sessions": [], @@ -1366,7 +2015,7 @@ "comments": [], "item": { "body": "", - "created_at": "2026-01-02T03:04:29Z", + "created_at": "2026-01-02T03:04:35Z", "id": "wrk_0001", "kind": "chore", "labels": [], @@ -1377,7 +2026,7 @@ "state": "open", "title": "parity item renamed", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:31Z" + "updated_at": "2026-01-02T03:04:37Z" }, "live_sessions": [], "sessions": [], @@ -1392,7 +2041,7 @@ "actor_display_name": "parity", "actor_id": "act_0001", "body": "parity note", - "created_at": "2026-01-02T03:04:36Z", + "created_at": "2026-01-02T03:04:42Z", "id": "cmt_0001", "kind": "note", "work_item_id": "wrk_0001" @@ -1408,7 +2057,7 @@ "comments": [], "item": { "body": "", - "created_at": "2026-01-02T03:04:29Z", + "created_at": "2026-01-02T03:04:35Z", "id": "wrk_0001", "kind": "chore", "labels": [], @@ -1419,7 +2068,7 @@ "state": "in_progress", "title": "parity item renamed", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:39Z" + "updated_at": "2026-01-02T03:04:45Z" }, "live_sessions": [], "sessions": [], @@ -1462,8 +2111,8 @@ "": 1 }, "revision": 17, - "snapshot": "eyJmaW5nZXJwcmludCI6InNoYTI1Njo2N2JkMGQ3MTUxN2JlYThkM2VkNmJjYWE0ZTFmZTY2YzYyNTM5MGRkNjg2ODI3MjM1Njk4MTUxMDg2ZDc0MDYzIiwiaGlnaF93YXRlciI6WyIyMDI2LTAxLTAyVDAzOjA0OjI5KzAwOjAwIiwiV0ktMSJdLCJraW5kIjoic25hcHNob3QiLCJyZXZpc2lvbiI6MTcsInNuYXBzaG90X2F0IjoiMjAyNi0wMS0wMlQwMzowNDo0MSswMDowMCJ9", - "snapshot_at": "2026-01-02T03:04:41Z", + "snapshot": "eyJmaW5nZXJwcmludCI6InNoYTI1Njo2N2JkMGQ3MTUxN2JlYThkM2VkNmJjYWE0ZTFmZTY2YzYyNTM5MGRkNjg2ODI3MjM1Njk4MTUxMDg2ZDc0MDYzIiwiaGlnaF93YXRlciI6WyIyMDI2LTAxLTAyVDAzOjA0OjM1KzAwOjAwIiwiV0ktMSJdLCJraW5kIjoic25hcHNob3QiLCJyZXZpc2lvbiI6MTcsInNuYXBzaG90X2F0IjoiMjAyNi0wMS0wMlQwMzowNDo0NyswMDowMCJ9", + "snapshot_at": "2026-01-02T03:04:47Z", "total": 1 }, "is_error": false, @@ -1491,7 +2140,7 @@ "state": "in_progress", "title": "parity item renamed", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:39Z" + "updated_at": "2026-01-02T03:04:45Z" } ], "observed": 0, @@ -1556,7 +2205,7 @@ { "body": { "applied": false, - "base": "2026-01-02T03:04:48Z", + "base": "2026-01-02T03:04:54Z", "base_source": "an export of this same instance: its exported_at", "by_entity": { "actor": { @@ -1651,7 +2300,7 @@ "root_path": "/proj", "slug": "parity", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:50Z", + "updated_at": "2026-01-02T03:04:56Z", "write_back": "full" } }, @@ -1663,7 +2312,7 @@ "actions": [ { "action": "comment", - "at": "2026-01-02T03:04:37Z", + "at": "2026-01-02T03:04:43Z", "detail": "write-back is off for this project", "id": "wbk_0001", "outcome": "skipped", @@ -1680,7 +2329,7 @@ "actions": [ { "action": "comment", - "at": "2026-01-02T03:04:37Z", + "at": "2026-01-02T03:04:43Z", "detail": "write-back is off for this project", "id": "wbk_0001", "outcome": "skipped", @@ -1861,7 +2510,7 @@ "items": [ { "body": "", - "created_at": "2026-01-02T03:04:29Z", + "created_at": "2026-01-02T03:04:35Z", "id": "wrk_0001", "kind": "chore", "labels": [], @@ -1872,7 +2521,7 @@ "state": "in_progress", "title": "parity item renamed", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:39Z" + "updated_at": "2026-01-02T03:04:45Z" } ], "mode": "full", @@ -1915,7 +2564,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:04:52Z", + "at": "2026-01-02T03:04:58Z", "entity_id": "prj_0001", "entity_kind": "project", "id": "aud_0020", @@ -1928,7 +2577,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:04:51Z", + "at": "2026-01-02T03:04:57Z", "entity_id": "prj_0001", "entity_kind": "project", "id": "aud_0019", @@ -1941,12 +2590,12 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:04:40Z", + "at": "2026-01-02T03:04:46Z", "entity_id": "wrk_0001", "entity_kind": "work_item", "id": "aud_0018", "operation": "work.transition", - "payload_digest": "sha256:3e2a6091aa3749e51f7d31a8e33b394a832c09657e63217835f679d979d60c0e", + "payload_digest": "sha256:939b83a6dc5267e90a0a3a2a14a555a9e3f4e2aef4ad639c6cce2926b340b433", "reason": "parity", "revision": 17, "txn_id": "txn_0019" @@ -1954,12 +2603,12 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:04:38Z", + "at": "2026-01-02T03:04:44Z", "entity_id": "cmt_0001", "entity_kind": "comment", "id": "aud_0017", "operation": "work.comment", - "payload_digest": "sha256:4b2f8d9eeac24ac39262aff03628f2c1fd35cf5d69ee46e22cb9297504bac702", + "payload_digest": "sha256:99be8e34fd97a59c4231a9a0486189f35b99c0ffe966b6ef8b063cb25178d164", "reason": "parity", "revision": 16, "txn_id": "txn_0018" @@ -1967,12 +2616,12 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:04:32Z", + "at": "2026-01-02T03:04:38Z", "entity_id": "wrk_0001", "entity_kind": "work_item", "id": "aud_0016", "operation": "work.update", - "payload_digest": "sha256:1b7bbf5cf7c7f958e503144a57ead6668ed52a60ad818983f2b53baccbe0ff89", + "payload_digest": "sha256:bb461bbf55ff1118209c5b8a84ee0c9282ea3d25cb9db35ab8b07f3a62770b98", "reason": "parity", "revision": 15, "txn_id": "txn_0017" @@ -2011,7 +2660,7 @@ "test_recipe": "" }, "compliance_status": "not_checked", - "created_at": "2026-01-02T03:04:55Z", + "created_at": "2026-01-02T03:05:01Z", "exclusions": [ ".venv/", "node_modules/", @@ -2028,7 +2677,7 @@ "root_path": "/instance/repos/broken", "slug": "broken", "trust_state": "unverified", - "updated_at": "2026-01-02T03:04:55Z", + "updated_at": "2026-01-02T03:05:01Z", "write_back": "none" } }, @@ -2055,7 +2704,7 @@ }, "engine": "no session engine is configured (VOGT_ENGINE_URL is unset)", "rows": [], - "swept_at": "2026-01-02T03:04:58Z" + "swept_at": "2026-01-02T03:05:04Z" }, "is_error": false, "operation": "session.sweep" @@ -2206,7 +2855,7 @@ "content_digest": "sha256:af09c76d426d6e99f4350729e7969584f83fc572511e128eedce52b46eeab94f", "kind": "dep_scan", "observation_id": "obs_0001", - "observed_at": "2026-01-02T03:05:00+00:00", + "observed_at": "2026-01-02T03:05:06+00:00", "payload": "{\"manifests_read\": 0, \"references\": 0, \"root_exists\": true, \"unreadable_manifests\": [], \"unsupported_manifests\": []}", "project_id": "prj_0003", "promoted": 0, @@ -2218,7 +2867,7 @@ "content_digest": "sha256:af09c76d426d6e99f4350729e7969584f83fc572511e128eedce52b46eeab94f", "kind": "dep_scan", "observation_id": "obs_0002", - "observed_at": "2026-01-02T03:05:00+00:00", + "observed_at": "2026-01-02T03:05:06+00:00", "payload": "{\"manifests_read\": 0, \"references\": 0, \"root_exists\": true, \"unreadable_manifests\": [], \"unsupported_manifests\": []}", "project_id": "prj_0001", "promoted": 0, @@ -2230,7 +2879,7 @@ "content_digest": "sha256:efb8e7f9565a659b7236558520425790e45b29c9c53cc6687bad8156d87a0025", "kind": "dep_scan", "observation_id": "obs_0003", - "observed_at": "2026-01-02T03:05:00+00:00", + "observed_at": "2026-01-02T03:05:06+00:00", "payload": "{\"manifests_read\": 0, \"references\": 0, \"root_exists\": false, \"unreadable_manifests\": [], \"unsupported_manifests\": []}", "project_id": "prj_0002", "promoted": 0, @@ -2242,7 +2891,7 @@ "content_digest": "sha256:8dbc2923a29adb7ae1615b49a4ab4dc43d6bab026b898480c971647e4f376a4f", "kind": "git.checkout", "observation_id": "obs_0004", - "observed_at": "2026-01-02T03:05:03+00:00", + "observed_at": "2026-01-02T03:05:09+00:00", "payload": "{\"detail\": \"no .git directory; this project is a plain folder\", \"is_git_repository\": false}", "project_id": "prj_0001", "promoted": 0, @@ -2254,7 +2903,7 @@ "content_digest": "sha256:8dbc2923a29adb7ae1615b49a4ab4dc43d6bab026b898480c971647e4f376a4f", "kind": "git.checkout", "observation_id": "obs_0005", - "observed_at": "2026-01-02T03:05:03+00:00", + "observed_at": "2026-01-02T03:05:09+00:00", "payload": "{\"detail\": \"no .git directory; this project is a plain folder\", \"is_git_repository\": false}", "project_id": "prj_0002", "promoted": 0, @@ -2321,7 +2970,7 @@ "content_digest": "sha256:af09c76d426d6e99f4350729e7969584f83fc572511e128eedce52b46eeab94f", "id": "obs_0001", "kind": "dep_scan", - "observed_at": "2026-01-02T03:05:00+00:00", + "observed_at": "2026-01-02T03:05:06+00:00", "payload": "{\"manifests_read\": 0, \"references\": 0, \"root_exists\": true, \"unreadable_manifests\": [], \"unsupported_manifests\": []}", "project_id": "prj_0003", "promoted": 0, @@ -2334,7 +2983,7 @@ "content_digest": "sha256:af09c76d426d6e99f4350729e7969584f83fc572511e128eedce52b46eeab94f", "id": "obs_0002", "kind": "dep_scan", - "observed_at": "2026-01-02T03:05:00+00:00", + "observed_at": "2026-01-02T03:05:06+00:00", "payload": "{\"manifests_read\": 0, \"references\": 0, \"root_exists\": true, \"unreadable_manifests\": [], \"unsupported_manifests\": []}", "project_id": "prj_0001", "promoted": 0, @@ -2347,7 +2996,7 @@ "content_digest": "sha256:efb8e7f9565a659b7236558520425790e45b29c9c53cc6687bad8156d87a0025", "id": "obs_0003", "kind": "dep_scan", - "observed_at": "2026-01-02T03:05:00+00:00", + "observed_at": "2026-01-02T03:05:06+00:00", "payload": "{\"manifests_read\": 0, \"references\": 0, \"root_exists\": false, \"unreadable_manifests\": [], \"unsupported_manifests\": []}", "project_id": "prj_0002", "promoted": 0, @@ -2360,7 +3009,7 @@ "content_digest": "sha256:8dbc2923a29adb7ae1615b49a4ab4dc43d6bab026b898480c971647e4f376a4f", "id": "obs_0004", "kind": "git.checkout", - "observed_at": "2026-01-02T03:05:03+00:00", + "observed_at": "2026-01-02T03:05:09+00:00", "payload": "{\"detail\": \"no .git directory; this project is a plain folder\", \"is_git_repository\": false}", "project_id": "prj_0001", "promoted": 0, @@ -2373,7 +3022,7 @@ "content_digest": "sha256:8dbc2923a29adb7ae1615b49a4ab4dc43d6bab026b898480c971647e4f376a4f", "id": "obs_0005", "kind": "git.checkout", - "observed_at": "2026-01-02T03:05:03+00:00", + "observed_at": "2026-01-02T03:05:09+00:00", "payload": "{\"detail\": \"no .git directory; this project is a plain folder\", \"is_git_repository\": false}", "project_id": "prj_0002", "promoted": 0, @@ -2386,51 +3035,51 @@ { "collector": "dep-refs", "detail": null, - "finished_at": "2026-01-02T03:05:01+00:00", + "finished_at": "2026-01-02T03:05:07+00:00", "id": "swp_0001", "outcome": "ok", "scope": "[\"prj_0003\", \"prj_0001\", \"prj_0002\"]", - "started_at": "2026-01-02T03:04:59+00:00", + "started_at": "2026-01-02T03:05:05+00:00", "stats": "{\"projects\": 3, \"new\": 3, \"unchanged\": 0, \"failed_projects\": 0}" }, { "collector": "git-local", "detail": "broken: CollectorError: git status could not be read in /instance/repos/broken: fatal: not a git repository: /nowhere", - "finished_at": "2026-01-02T03:05:04+00:00", + "finished_at": "2026-01-02T03:05:10+00:00", "id": "swp_0002", "outcome": "partial", "scope": "[\"prj_0003\", \"prj_0001\", \"prj_0002\"]", - "started_at": "2026-01-02T03:05:02+00:00", + "started_at": "2026-01-02T03:05:08+00:00", "stats": "{\"projects\": 3, \"new\": 2, \"unchanged\": 0, \"failed_projects\": 1}" }, { "collector": "mirrored-source", "detail": null, - "finished_at": "2026-01-02T03:05:07+00:00", + "finished_at": "2026-01-02T03:05:13+00:00", "id": "swp_0003", "outcome": "ok", "scope": "[\"prj_0003\", \"prj_0001\", \"prj_0002\"]", - "started_at": "2026-01-02T03:05:05+00:00", + "started_at": "2026-01-02T03:05:11+00:00", "stats": "{\"projects\": 3, \"new\": 0, \"unchanged\": 0, \"failed_projects\": 0}" }, { "collector": "source-markers", "detail": null, - "finished_at": "2026-01-02T03:05:10+00:00", + "finished_at": "2026-01-02T03:05:16+00:00", "id": "swp_0004", "outcome": "ok", "scope": "[\"prj_0003\", \"prj_0001\", \"prj_0002\"]", - "started_at": "2026-01-02T03:05:08+00:00", + "started_at": "2026-01-02T03:05:14+00:00", "stats": "{\"projects\": 3, \"new\": 0, \"unchanged\": 0, \"failed_projects\": 0}" }, { "collector": "git-local", "detail": "broken: CollectorError: git status could not be read in /instance/repos/broken: fatal: not a git repository: /nowhere", - "finished_at": "2026-01-02T03:05:17+00:00", + "finished_at": "2026-01-02T03:05:23+00:00", "id": "swp_0005", "outcome": "partial", "scope": "[\"prj_0003\", \"prj_0001\", \"prj_0002\"]", - "started_at": "2026-01-02T03:05:15+00:00", + "started_at": "2026-01-02T03:05:21+00:00", "stats": "{\"projects\": 3, \"new\": 0, \"unchanged\": 2, \"failed_projects\": 1}" } ] @@ -2538,13 +3187,13 @@ "user": { "actor_id": "act_0005", "actor_identity_ref": "human:ada", - "created_at": "2026-01-02T03:05:20Z", + "created_at": "2026-01-02T03:05:26Z", "scopes": [ "read", "work.write", "project.write" ], - "updated_at": "2026-01-02T03:05:20Z", + "updated_at": "2026-01-02T03:05:26Z", "username": "ada" } }, @@ -2557,13 +3206,13 @@ { "actor_id": "act_0005", "actor_identity_ref": "human:ada", - "created_at": "2026-01-02T03:05:20Z", + "created_at": "2026-01-02T03:05:26Z", "scopes": [ "read", "work.write", "project.write" ], - "updated_at": "2026-01-02T03:05:20Z", + "updated_at": "2026-01-02T03:05:26Z", "username": "ada" } ] @@ -2576,13 +3225,13 @@ "user": { "actor_id": "act_0005", "actor_identity_ref": "human:ada", - "created_at": "2026-01-02T03:05:20Z", + "created_at": "2026-01-02T03:05:26Z", "scopes": [ "read", "work.write", "project.write" ], - "updated_at": "2026-01-02T03:05:22Z", + "updated_at": "2026-01-02T03:05:28Z", "username": "ada" } }, @@ -2633,7 +3282,7 @@ "id": "tok_0002", "kind": "api", "name": "bootstrap agent token", - "revoked_at": "2026-01-02T03:05:24Z", + "revoked_at": "2026-01-02T03:05:30Z", "revoked_reason": "parity harness", "scopes": [ "read", @@ -2670,7 +3319,7 @@ "instance_id": "ins_0001", "observed_schema_version": 6, "path": "/backup", - "taken_at": "2026-01-02T03:05:26Z" + "taken_at": "2026-01-02T03:05:32Z" }, "is_error": false, "operation": "backup" @@ -2683,7 +3332,7 @@ "import_root_then": "/instance/repos", "instance_id": "ins_0001", "migrations_applied": [], - "restored_from": "2026-01-02T03:05:26Z", + "restored_from": "2026-01-02T03:05:32Z", "source": "/backup" }, "is_error": false, @@ -2825,7 +3474,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:05:31Z", + "at": "2026-01-02T03:05:37Z", "entity_id": "act_0005", "entity_kind": "user", "id": "aud_0025", @@ -2838,12 +3487,12 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:05:25Z", + "at": "2026-01-02T03:05:31Z", "entity_id": "tok_0002", "entity_kind": "token", "id": "aud_0024", "operation": "token.revoke", - "payload_digest": "sha256:72df0d8c068af204558312866d5eb8de530834ebebaeb2a0a52f63f61eef79d6", + "payload_digest": "sha256:8df0a912a481d9f60a40b1711ebc52960d101752220f6647c5fa559b92df773a", "reason": "parity harness", "revision": 23, "txn_id": "txn_0033" @@ -2851,7 +3500,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:05:23Z", + "at": "2026-01-02T03:05:29Z", "entity_id": "act_0005", "entity_kind": "user", "id": "aud_0023", @@ -2864,7 +3513,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:05:21Z", + "at": "2026-01-02T03:05:27Z", "entity_id": "act_0005", "entity_kind": "user", "id": "aud_0022", @@ -2877,7 +3526,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:04:56Z", + "at": "2026-01-02T03:05:02Z", "entity_id": "prj_0003", "entity_kind": "project", "id": "aud_0021", @@ -2899,12 +3548,12 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:05:25Z", + "at": "2026-01-02T03:05:31Z", "entity_id": "tok_0002", "entity_kind": "token", "id": "aud_0024", "operation": "token.revoke", - "payload_digest": "sha256:72df0d8c068af204558312866d5eb8de530834ebebaeb2a0a52f63f61eef79d6", + "payload_digest": "sha256:8df0a912a481d9f60a40b1711ebc52960d101752220f6647c5fa559b92df773a", "reason": "parity harness", "revision": 23, "txn_id": "txn_0033" @@ -2912,7 +3561,7 @@ { "actor_id": "act_0001", "actor_identity_ref": "local:parity", - "at": "2026-01-02T03:05:23Z", + "at": "2026-01-02T03:05:29Z", "entity_id": "act_0005", "entity_kind": "user", "id": "aud_0023", @@ -2968,8 +3617,8 @@ "decision": { "asker": "local:parity", "context": "CI is green.", - "created_at": "2026-01-02T03:05:32Z", - "expires_at": "2026-01-03T03:05:32Z", + "created_at": "2026-01-02T03:05:38Z", + "expires_at": "2026-01-03T03:05:38Z", "id": "dec_0001", "options": [ { @@ -2996,8 +3645,8 @@ "decision": { "asker": "local:parity", "context": "", - "created_at": "2026-01-02T03:05:35Z", - "expires_at": "2026-01-03T03:05:35Z", + "created_at": "2026-01-02T03:05:41Z", + "expires_at": "2026-01-03T03:05:41Z", "id": "dec_0002", "options": [ { @@ -3025,8 +3674,8 @@ { "asker": "local:parity", "context": "", - "created_at": "2026-01-02T03:05:35Z", - "expires_at": "2026-01-03T03:05:35Z", + "created_at": "2026-01-02T03:05:41Z", + "expires_at": "2026-01-03T03:05:41Z", "id": "dec_0002", "options": [ { @@ -3047,8 +3696,8 @@ { "asker": "local:parity", "context": "CI is green.", - "created_at": "2026-01-02T03:05:32Z", - "expires_at": "2026-01-03T03:05:32Z", + "created_at": "2026-01-02T03:05:38Z", + "expires_at": "2026-01-03T03:05:38Z", "id": "dec_0001", "options": [ { @@ -3077,8 +3726,8 @@ { "asker": "local:parity", "context": "", - "created_at": "2026-01-02T03:05:35Z", - "expires_at": "2026-01-03T03:05:35Z", + "created_at": "2026-01-02T03:05:41Z", + "expires_at": "2026-01-03T03:05:41Z", "id": "dec_0002", "options": [ { @@ -3099,8 +3748,8 @@ { "asker": "local:parity", "context": "CI is green.", - "created_at": "2026-01-02T03:05:32Z", - "expires_at": "2026-01-03T03:05:32Z", + "created_at": "2026-01-02T03:05:38Z", + "expires_at": "2026-01-03T03:05:38Z", "id": "dec_0001", "options": [ { @@ -3181,7 +3830,7 @@ "evidence_snapshot": "", "freshness": "live", "kind": "decision.pending", - "occurred_at": "2026-01-02T03:05:35Z", + "occurred_at": "2026-01-02T03:05:41Z", "provisional": true, "source": "agent", "source_subject_key": "dec_0002", @@ -3202,7 +3851,7 @@ "evidence_snapshot": "", "freshness": "live", "kind": "decision.pending", - "occurred_at": "2026-01-02T03:05:32Z", + "occurred_at": "2026-01-02T03:05:38Z", "provisional": true, "source": "agent", "source_subject_key": "dec_0001", @@ -3214,10 +3863,10 @@ ], "github_scope": "registered projects only", "high_water": { - "agent": "2026-01-02T03:05:35Z" + "agent": "2026-01-02T03:05:41Z" }, "instance_scope": "registered projects only", - "snapshot_at": "2026-01-02T03:05:42Z" + "snapshot_at": "2026-01-02T03:05:48Z" }, "is_error": false, "operation": "inbox.list" @@ -3229,12 +3878,12 @@ "label": "Merge", "note": "reviewed" }, - "answered_at": "2026-01-02T03:05:48Z", + "answered_at": "2026-01-02T03:05:54Z", "answered_by": "local:parity", "asker": "local:parity", "context": "CI is green.", - "created_at": "2026-01-02T03:05:32Z", - "expires_at": "2026-01-03T03:05:32Z", + "created_at": "2026-01-02T03:05:38Z", + "expires_at": "2026-01-03T03:05:38Z", "id": "dec_0001", "options": [ { @@ -3275,8 +3924,8 @@ "decision": { "asker": "local:parity", "context": "", - "created_at": "2026-01-02T03:05:35Z", - "expires_at": "2026-01-03T03:05:35Z", + "created_at": "2026-01-02T03:05:41Z", + "expires_at": "2026-01-03T03:05:41Z", "id": "dec_0002", "options": [ { @@ -3306,12 +3955,12 @@ "label": "Merge", "note": "reviewed" }, - "answered_at": "2026-01-02T03:05:48Z", + "answered_at": "2026-01-02T03:05:54Z", "answered_by": "local:parity", "asker": "local:parity", "context": "CI is green.", - "created_at": "2026-01-02T03:05:32Z", - "expires_at": "2026-01-03T03:05:32Z", + "created_at": "2026-01-02T03:05:38Z", + "expires_at": "2026-01-03T03:05:38Z", "id": "dec_0001", "options": [ { @@ -3383,7 +4032,7 @@ "github_scope": "registered projects only", "high_water": {}, "instance_scope": "registered projects only", - "snapshot_at": "2026-01-02T03:05:56Z" + "snapshot_at": "2026-01-02T03:06:02Z" }, "is_error": false, "operation": "inbox.list" @@ -3407,7 +4056,7 @@ "preferences": [ { "key": "inbox.filter", - "updated_at": "2026-01-02T03:04:25Z", + "updated_at": "2026-01-02T03:04:31Z", "value": { "actor": "any", "sources": [ diff --git a/tests/parity/golden/21c95f6/meta.json b/tests/parity/golden/21c95f6/meta.json index 26292275..35878d2a 100644 --- a/tests/parity/golden/21c95f6/meta.json +++ b/tests/parity/golden/21c95f6/meta.json @@ -1,5 +1,5 @@ { "main_sha": "21c95f674e1b03ee177394f605abb1abfac41cdd", - "recorded_at": "2026-10-17T07:59:07Z", + "recorded_at": "2026-10-17T08:16:32Z", "recorder": "scripts/parity.py" } diff --git a/tests/parity/script.json b/tests/parity/script.json index 064c3bae..d2533f17 100644 --- a/tests/parity/script.json +++ b/tests/parity/script.json @@ -189,6 +189,36 @@ "exit": 0 } }, + { + "operation": "dump.after_project_and_label", + "dump": true + }, + { + "operation": "project.brief", + "params": { + "slug": "parity" + }, + "expect": { + "exit": 0 + } + }, + { + "operation": "place.metrics", + "params": {}, + "expect": { + "exit": 0 + } + }, + { + "operation": "deployed.versions", + "cli": [ + "deployed-versions" + ], + "params": {}, + "expect": { + "exit": 0 + } + }, { "operation": "initiative.create", "params": {