Merge pull request #717 from fabro-sh/codex/trim-run-created

Trim unused run creation event fields
This commit is contained in:
Bryan Helmkamp 2026-08-03 16:45:07 -04:00 • committed by GitHub
commit c87f005b5f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
38 changed files with 66 additions and 217 deletions

View file

@ -44,7 +44,6 @@ Emitted when the run record is created.
"event": "run.created",
"properties": {
"workflow_slug": "my-workflow",
"run_dir": "/home/user/.fabro/storage/scratch/20260428-01JQXYZ",
"source_directory": "/home/user/src/my-project",
"repo_origin_url": "https://github.com/acme/my-project.git",
"base_branch": "main",
@ -79,20 +78,21 @@ Emitted when the run record is created.
| `settings` | object | Workflow settings snapshot |
| `graph` | object | Parsed workflow graph |
| `workflow_source` | string? | Workflow source text |
| `workflow_config` | string? | Workflow config text |
| `labels` | object | Run labels |
| `run_dir` | string | Local scratch directory for the run |
| `source_directory` | string? | Submitter-side source directory |
| `repo_origin_url` | string? | Normalized repository origin URL used by clone-based sandboxes |
| `base_branch` | string? | Submitter-side base branch |
| `workflow_slug` | string? | Workflow slug |
| `db_prefix` | string? | Store prefix used for the run |
| `provenance` | object | Actor and request provenance |
| `manifest_blob` | string? | Blob id for the submitted manifest |
| `pre_run_git` | object? | Submitter-side pre-run git context and push outcome |
| `fork_source_ref` | object? | Source run/checkpoint reference when this run was forked |
| `in_place` | boolean | Whether the run was created with `--in-place` (no git checkpoints) |
Readers remain tolerant of the legacy `workflow_config`, `run_dir`, and
`db_prefix` properties when replaying historical events, but newly emitted
`run.created` events omit them.
### `run.started`
Emitted when the workflow run begins.

View file

@ -916,7 +916,6 @@ fn attach_json_errors_without_prompting_for_human_input() {
"login": "dev"
}
},
"run_dir": "[RUN_DIR]",
"settings": {
"project": {
"description": null,

View file

@ -115,11 +115,6 @@ fn events_completed_run_reads_store_without_progress_jsonl() {
r#""id":"[0-9a-f-]+""#.to_string(),
r#""id":"[EVENT_ID]""#.to_string(),
));
filters.push((
r#""run_dir":"(?:\[DRY_RUN_DIR\]|\[STORAGE_DIR\]/scratch/REDACTED)""#.to_string(),
r#""run_dir":"[RUN_DIR]""#.to_string(),
));
let mut cmd = context.command();
cmd.args(["events", "--tail", "2", &run.run_id]);
@ -146,10 +141,6 @@ fn events_tail_limits_output() {
r#""id":"[0-9a-f-]+""#.to_string(),
r#""id":"[EVENT_ID]""#.to_string(),
));
filters.push((
r#""run_dir":"(?:\[DRY_RUN_DIR\]|\[STORAGE_DIR\]/scratch/REDACTED)""#.to_string(),
r#""run_dir":"[RUN_DIR]""#.to_string(),
));
let mut cmd = context.command();
cmd.args(["events", "--tail", "2", &run.run_id]);

View file

@ -2069,7 +2069,6 @@ async fn mcp_events_decodes_run_created_with_model_keyed_fallbacks() {
"settings": settings,
"graph": Graph::new("Remote Workflow"),
"labels": {},
"run_dir": "/tmp/run",
"source_directory": "/srv/repo",
"provenance": test_support::test_run_provenance()
},

View file

@ -621,13 +621,10 @@ mod stage_events_tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::new(),
run_dir: "/tmp/test".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -1021,13 +1021,10 @@ mod tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::new(),
run_dir: "/tmp/test".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -1365,7 +1365,6 @@ mod retrieve_sandbox_tests {
"properties": {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"run_dir": "/tmp/test",
"provenance": test_support::test_run_provenance(),
},
}),

View file

@ -4569,13 +4569,10 @@ async fn append_default_run_created(run_store: &fabro_store::RunDatabase, run_id
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,
@ -4623,13 +4620,10 @@ async fn create_slack_notification_run(
settings: serde_json::to_value(settings).unwrap(),
graph: serde_json::to_value(Graph::new(graph_name)).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: workflow_slug.map(str::to_string),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,
@ -5699,13 +5693,10 @@ async fn list_run_stages_distinguishes_visits() {
settings: serde_json::to_value(fabro_types::WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(&graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: String::new(),
source_directory: None,
workflow_slug: Some("test".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,
@ -5838,13 +5829,10 @@ async fn list_run_stages_exposes_execution_identity_for_resumed_stage() {
settings: serde_json::to_value(fabro_types::WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(&graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: String::new(),
source_directory: None,
workflow_slug: Some("test".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,
@ -7045,13 +7033,10 @@ async fn create_completed_run_ready_for_pull_request(
settings: serde_json::to_value(&run_spec.settings).unwrap(),
graph: serde_json::to_value(&run_spec.graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: run_spec.labels.clone().into_iter().collect(),
run_dir: run_spec.source_directory.clone().unwrap_or_default(),
source_directory: run_spec.source_directory.clone(),
workflow_slug: run_spec.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: run_spec.provenance.clone(),
manifest_blob: None,
git,
@ -10598,10 +10583,6 @@ async fn create_run_persists_manifest_and_definition_blobs_without_bundle_file()
);
assert_eq!(accepted_definition["workflow_path"], "workflow.fabro");
assert!(accepted_definition["workflows"]["workflow.fabro"].is_object());
created["properties"]["run_dir"]
.as_str()
.expect("run.created should include run_dir");
}
#[tokio::test]
@ -13869,13 +13850,10 @@ async fn create_preserved_local_sandbox_run(state: &Arc<AppState>, run_id: RunId
settings: serde_json::to_value(settings).unwrap(),
graph: serde_json::to_value(graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp/fabro-run".to_string(),
source_directory: Some("/tmp/fabro-run".to_string()),
workflow_slug: Some("test".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,
@ -14621,13 +14599,10 @@ async fn delete_run_retry_after_missing_provider_resource_removes_metadata() {
settings: serde_json::to_value(fabro_types::WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp/fabro-run".to_string(),
source_directory: Some("/tmp/fabro-run".to_string()),
workflow_slug: Some("test".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -62,13 +62,10 @@ async fn append_completed_run_with_final_patch(
.expect("workflow settings should serialize"),
graph: serde_json::to_value(Graph::new("test")).expect("graph should serialize"),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -2337,7 +2337,6 @@ mod tests {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -2351,6 +2350,48 @@ mod tests {
);
}
#[test]
fn run_created_replay_ignores_unknown_properties() {
let provenance = test_support::test_run_provenance();
let event = test_raw_event(
1,
"run.created",
&json!({
"title": "Historical run",
"settings": WorkflowSettings::default(),
"graph": Graph::new("historical"),
"workflow_source": "digraph historical { start -> exit }",
"labels": {"team": "platform"},
"source_directory": "/workspace/project",
"workflow_slug": "historical",
"unknown_future_property": {
"nested": ["value", 42, true]
},
"provenance": provenance
}),
None,
);
let projection = RunProjection::apply_events(&[event]).unwrap();
assert_eq!(projection.title(), "Historical run");
assert_eq!(projection.spec.graph.name, "historical");
assert_eq!(
projection.spec.graph_source.as_deref(),
Some("digraph historical { start -> exit }")
);
assert_eq!(
projection.spec.labels.get("team").map(String::as_str),
Some("platform")
);
assert_eq!(
projection.spec.source_directory.as_deref(),
Some("/workspace/project")
);
assert_eq!(projection.spec.workflow_slug.as_deref(), Some("historical"));
assert_eq!(projection.spec.provenance, provenance);
}
#[test]
fn run_created_projects_automation_into_spec_and_summary() {
let automation = AutomationRef {
@ -2366,7 +2407,6 @@ mod tests {
"graph": Graph::new("test"),
"automation": automation,
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -2390,7 +2430,6 @@ mod tests {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -2413,7 +2452,6 @@ mod tests {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -2491,7 +2529,6 @@ mod tests {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -4082,7 +4119,6 @@ mod tests {
"attrs": { "goal": { "String": "Goal title" } }
},
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -4110,7 +4146,6 @@ mod tests {
"attrs": { "goal": { "String": "## Plan: Legacy title\n\nDetails" } }
},
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -4140,7 +4175,6 @@ mod tests {
"attrs": { "goal": { "String": "Goal title" } }
},
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_support::test_run_provenance()
}),
None,
@ -4183,7 +4217,6 @@ mod tests {
"attrs": {}
},
"labels": {},
"run_dir": "/tmp/run",
"source_directory": "/tmp/run",
"provenance": test_support::test_run_provenance(),
"manifest_blob": manifest_blob

View file

@ -648,7 +648,6 @@ mod tests {
"graph": run_spec.graph,
"workflow_slug": run_spec.workflow_slug,
"source_directory": run_spec.source_directory,
"run_dir": format!("/tmp/{label}"),
"git": run_spec.git,
"labels": run_spec.labels,
"provenance": run_spec.provenance,
@ -674,7 +673,6 @@ mod tests {
"graph": run_spec.graph,
"workflow_slug": run_spec.workflow_slug,
"source_directory": run_spec.source_directory,
"run_dir": format!("/tmp/{label}"),
"git": run_spec.git,
"labels": run_spec.labels,
"parent_id": parent_id,
@ -1041,7 +1039,6 @@ mod tests {
"properties": {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"run_dir": "/tmp/test",
"provenance": test_support::test_run_provenance(),
},
}),
@ -1590,7 +1587,6 @@ mod tests {
"graph": run_spec["graph"],
"workflow_slug": run_spec["workflow_slug"],
"source_directory": run_spec["source_directory"],
"run_dir": "/tmp/run-2",
"git": run_spec["git"],
"labels": run_spec["labels"],
},

View file

@ -987,7 +987,6 @@ mod tests {
"properties": {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"run_dir": "/tmp/test",
"provenance": test_support::test_run_provenance(),
},
}),

View file

@ -30,13 +30,10 @@ fn event_body_from_event(event: &Event) -> EventBody {
settings,
graph,
workflow_source,
workflow_config,
labels,
run_dir,
source_directory,
workflow_slug,
automation,
db_prefix,
provenance,
manifest_blob,
git,
@ -51,13 +48,10 @@ fn event_body_from_event(event: &Event) -> EventBody {
.expect("run.created settings should deserialize: value was serialized from a typed struct in this session"),
graph: serde_json::from_value(graph.clone()).expect("run.created graph should deserialize: value was serialized from a typed struct in this session"),
workflow_source: workflow_source.clone(),
workflow_config: workflow_config.clone(),
labels: labels.clone(),
run_dir: run_dir.clone(),
source_directory: source_directory.clone(),
workflow_slug: workflow_slug.clone(),
automation: automation.clone(),
db_prefix: db_prefix.clone(),
provenance: provenance.clone(),
manifest_blob: *manifest_blob,
git: git.clone(),
@ -2657,13 +2651,10 @@ mod tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: BTreeMap::default(),
run_dir: "/tmp/run".to_string(),
source_directory: Some("/tmp/run".to_string()),
workflow_slug: None,
automation: Some(automation.clone()),
db_prefix: None,
provenance,
manifest_blob: None,
git: None,

View file

@ -30,18 +30,13 @@ pub enum Event {
graph: serde_json::Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
workflow_source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
workflow_config: Option<String>,
labels: BTreeMap<String, String>,
run_dir: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
source_directory: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
workflow_slug: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
automation: Option<AutomationRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
db_prefix: Option<String>,
provenance: RunProvenance,
#[serde(default, skip_serializing_if = "Option::is_none")]
manifest_blob: Option<RunBlobId>,
@ -795,10 +790,8 @@ impl Event {
pub fn trace(&self) {
use tracing::{debug, error, info, warn};
match self {
Self::RunCreated {
run_id, run_dir, ..
} => {
info!(run_id = %run_id, run_dir, "Run created");
Self::RunCreated { run_id, .. } => {
info!(run_id = %run_id, "Run created");
}
Self::WorkflowRunStarted { name, run_id, .. } => {
info!(workflow = name.as_str(), run_id = %run_id, "Workflow run started");

View file

@ -284,13 +284,10 @@ mod tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::new(),
run_dir: "/tmp/test".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -358,13 +358,10 @@ mod tests {
.unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -495,13 +495,10 @@ mod tests {
.unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -465,13 +465,10 @@ mod tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -950,13 +950,10 @@ mod tests {
.unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -273,13 +273,10 @@ mod tests {
.unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -744,13 +744,10 @@ mod tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("metadata")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: BTreeMap::new(),
run_dir: "/tmp/run".to_string(),
source_directory: Some("/tmp/project".to_string()),
workflow_slug: Some("metadata".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -221,13 +221,10 @@ mod tests {
.unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("test")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::default(),
run_dir: "/tmp".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -1,7 +1,9 @@
#![expect(
clippy::disallowed_methods,
reason = "sync workflow creation path: reads workflow.toml during workflow load and persists \
.fabro scaffolding outside the Tokio execution hot path"
#![cfg_attr(
test,
expect(
clippy::disallowed_methods,
reason = "tests write workflow fixture files synchronously before exercising async creation"
)
)]
use std::collections::{BTreeMap, HashMap};
@ -156,7 +158,6 @@ pub struct CompiledRun {
settings: WorkflowSettings,
raw_source: String,
workflow_slug: Option<String>,
workflow_config: Option<String>,
dot_path: Option<PathBuf>,
definition: Option<RunDefinition>,
source_directory: String,
@ -181,7 +182,6 @@ pub struct MaterializedRun {
settings: WorkflowSettings,
raw_source: String,
workflow_slug: Option<String>,
workflow_config: Option<String>,
dot_path: Option<PathBuf>,
definition: Option<RunDefinition>,
source_directory: String,
@ -290,10 +290,6 @@ pub fn compile_create_run(
.map_err(|err| Error::Parse(err.to_string()))?;
let settings = resolved.settings;
let labels = settings.combined_labels();
let workflow_config = resolved
.workflow_toml_path
.as_deref()
.and_then(|path| std::fs::read_to_string(path).ok());
let source_name = resolved
.dot_path
.as_ref()
@ -349,7 +345,6 @@ pub fn compile_create_run(
settings,
raw_source: resolved.raw_source,
workflow_slug: resolved.workflow_slug,
workflow_config,
dot_path: resolved.dot_path,
definition,
source_directory: resolved.working_directory.to_string_lossy().to_string(),
@ -368,7 +363,6 @@ pub fn materialize_create_run(
settings,
raw_source,
workflow_slug,
workflow_config,
dot_path,
definition,
source_directory,
@ -386,7 +380,6 @@ pub fn materialize_create_run(
settings,
raw_source,
workflow_slug,
workflow_config,
dot_path,
definition,
source_directory,
@ -458,7 +451,6 @@ pub async fn persist_create_run(
settings,
raw_source,
workflow_slug: _,
workflow_config,
dot_path,
definition,
source_directory,
@ -493,7 +485,6 @@ pub async fn persist_create_run(
store,
&persisted,
&raw_source,
workflow_config,
submitted_manifest_bytes.as_deref(),
definition.as_ref(),
title,
@ -514,7 +505,6 @@ async fn persist_created_run(
store: &Database,
persisted: &Persisted,
workflow_source: &str,
workflow_config: Option<String>,
submitted_manifest_bytes: Option<&[u8]>,
accepted_definition: Option<&RunDefinition>,
explicit_title: Option<String>,
@ -554,17 +544,14 @@ async fn persist_created_run(
.map_err(|err| Error::engine(err.to_string()))?,
),
workflow_source: (!workflow_source.is_empty()).then(|| workflow_source.to_string()),
workflow_config,
labels: record
.labels
.clone()
.into_iter()
.collect::<BTreeMap<_, _>>(),
run_dir: persisted.run_dir().display().to_string(),
source_directory: record.source_directory.clone(),
workflow_slug: record.workflow_slug.clone(),
automation: record.automation.clone(),
db_prefix: None,
provenance: record.provenance.clone(),
manifest_blob,
git: record.git.clone(),
@ -1753,20 +1740,9 @@ reasoning = false
web_url: None,
};
let catalog = test_catalog();
let workflow_config_path = dir.path().join("workflow.toml");
std::fs::write(
&workflow_config_path,
"_version = 1\n[workflow]\ngraph = \"workflow.fabro\"\n",
)
.unwrap();
let compiled = compile_create_run(compile_input(&request), Arc::clone(&catalog)).unwrap();
assert_eq!(
compiled.workflow_config.as_deref(),
Some("_version = 1\n[workflow]\ngraph = \"workflow.fabro\"\n")
);
std::fs::write(&dot_path, "this is no longer a graph").unwrap();
std::fs::write(&workflow_config_path, "changed after compilation").unwrap();
let materialized = materialize_create_run(compiled, catalog.as_ref()).unwrap();
let metadata = persistence_metadata(&request, fixtures::RUN_2, &storage_root);
@ -1798,10 +1774,6 @@ reasoning = false
created.workflow_source.as_deref(),
Some(compiled_source.as_str())
);
assert_eq!(
created.workflow_config.as_deref(),
Some("_version = 1\n[workflow]\ngraph = \"workflow.fabro\"\n")
);
let manifest_blob = created
.manifest_blob
.as_ref()

View file

@ -156,13 +156,10 @@ async fn persist_forked_run(
graph: serde_json::to_value(&spec.graph)
.map_err(|err| Error::engine(err.to_string()))?,
workflow_source: projection.spec.graph_source.clone(),
workflow_config: None,
labels: spec.labels.clone().into_iter().collect(),
run_dir: String::new(),
source_directory: spec.source_directory.clone(),
workflow_slug: spec.workflow_slug.clone(),
automation: spec.automation.clone(),
db_prefix: None,
provenance: spec.provenance.clone(),
manifest_blob: spec.manifest_blob,
git: spec.git.clone(),
@ -378,13 +375,10 @@ mod tests {
settings: serde_json::to_value(&settings).unwrap(),
graph: serde_json::to_value(&graph).unwrap(),
workflow_source: Some("digraph fork_source {}".to_string()),
workflow_config: None,
labels: BTreeMap::new(),
run_dir: "/tmp/source".to_string(),
source_directory: Some("/client/source".to_string()),
workflow_slug: Some("fork-source".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: Some(fabro_types::GitContext {

View file

@ -72,13 +72,10 @@ pub async fn retry_run(
settings,
graph,
workflow_source: graph_source,
workflow_config: None,
labels: labels.into_iter().collect::<BTreeMap<_, _>>(),
run_dir: String::new(),
source_directory,
workflow_slug,
automation,
db_prefix: None,
provenance: input.provenance.clone(),
manifest_blob,
git,
@ -183,13 +180,10 @@ mod tests {
settings: serde_json::to_value(&settings).unwrap(),
graph: serde_json::to_value(Graph::new("retry_source")).unwrap(),
workflow_source: Some("digraph retry_source { start -> exit }".to_string()),
workflow_config: None,
labels: labels.into_iter().collect(),
run_dir: "/tmp/source".to_string(),
source_directory: Some("/workspace/source".to_string()),
workflow_slug: Some("retry-source".to_string()),
automation: None,
db_prefix: None,
provenance: provenance("source-user"),
manifest_blob,
git: Some(git_context()),

View file

@ -35,15 +35,14 @@ pub(crate) struct ResolveWorkflowInput {
#[derive(Clone)]
pub(crate) struct ResolvedWorkflow {
pub raw_source: String,
pub settings: WorkflowSettings,
pub workflow_slug: Option<String>,
pub workflow_toml_path: Option<PathBuf>,
pub dot_path: Option<PathBuf>,
pub current_dir: Option<PathBuf>,
pub file_resolver: Option<Arc<dyn FileResolver>>,
pub goal_override: Option<String>,
pub working_directory: PathBuf,
pub raw_source: String,
pub settings: WorkflowSettings,
pub workflow_slug: Option<String>,
pub dot_path: Option<PathBuf>,
pub current_dir: Option<PathBuf>,
pub file_resolver: Option<Arc<dyn FileResolver>>,
pub goal_override: Option<String>,
pub working_directory: PathBuf,
}
pub(crate) fn resolve_workflow(request: ResolveWorkflowInput) -> anyhow::Result<ResolvedWorkflow> {
@ -60,7 +59,6 @@ pub(crate) fn resolve_workflow(request: ResolveWorkflowInput) -> anyhow::Result<
raw_source,
settings,
workflow_slug: location.slug,
workflow_toml_path: location.toml,
dot_path: Some(location.graph),
current_dir: Some(location.dir),
file_resolver: Some(Arc::new(FilesystemFileResolver::new(Some(
@ -79,7 +77,6 @@ pub(crate) fn resolve_workflow(request: ResolveWorkflowInput) -> anyhow::Result<
raw_source: source,
settings,
workflow_slug: None,
workflow_toml_path: None,
dot_path: None,
current_dir: base_dir,
file_resolver: has_base_dir.then(|| {
@ -100,7 +97,6 @@ pub(crate) fn resolve_workflow(request: ResolveWorkflowInput) -> anyhow::Result<
raw_source: workflow.source.clone(),
settings,
workflow_slug: workflow_slug_from_path(workflow.path.as_path()),
workflow_toml_path: None,
dot_path: Some(workflow.path.as_path().to_path_buf()),
current_dir: Some(workflow.current_dir()),
file_resolver: Some(workflow.file_resolver()),

View file

@ -213,13 +213,10 @@ async fn seed_created_and_starting(
settings: serde_json::to_value(&run_options.settings).unwrap(),
graph: serde_json::to_value(graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: run_options.labels.clone().into_iter().collect(),
run_dir: run_options.run_dir.display().to_string(),
source_directory: Some(std::env::current_dir().unwrap().display().to_string()),
workflow_slug: run_options.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: run_options.pre_run_git.clone(),

View file

@ -782,13 +782,10 @@ mod tests {
settings: serde_json::to_value(WorkflowSettings::default()).unwrap(),
graph: serde_json::to_value(fabro_types::Graph::new("metadata")).unwrap(),
workflow_source: None,
workflow_config: None,
labels: std::collections::BTreeMap::new(),
run_dir: "/tmp/run".to_string(),
source_directory: Some("/tmp/project".to_string()),
workflow_slug: Some("metadata".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -1048,13 +1048,10 @@ mod tests {
settings: serde_json::to_value(&run_options.settings).unwrap(),
graph: serde_json::to_value(&graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: BTreeMap::new(),
run_dir: run_dir.display().to_string(),
source_directory: Some(workspace.display().to_string()),
workflow_slug: Some("test".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -155,7 +155,7 @@ mod tests {
}
}
async fn seeded_store(run_dir: &Path, record: &RunSpec, source: Option<&str>) -> RunDatabase {
async fn seeded_store(record: &RunSpec, source: Option<&str>) -> RunDatabase {
let store = memory_store();
let run_store = store.create_run(&record.run_id).await.unwrap();
append_event(&run_store, &record.run_id, &Event::RunCreated {
@ -164,13 +164,10 @@ mod tests {
settings: serde_json::to_value(&record.settings).unwrap(),
graph: serde_json::to_value(&record.graph).unwrap(),
workflow_source: source.map(ToOwned::to_owned),
workflow_config: None,
labels: record.labels.clone().into_iter().collect(),
run_dir: run_dir.to_string_lossy().to_string(),
source_directory: record.source_directory.clone(),
workflow_slug: record.workflow_slug.clone(),
automation: record.automation.clone(),
db_prefix: None,
provenance: record.provenance.clone(),
manifest_blob: None,
git: record.git.clone(),
@ -250,7 +247,7 @@ mod tests {
)
.unwrap();
let run_store = seeded_store(&run_dir, &expected, Some(&source)).await;
let run_store = seeded_store(&expected, Some(&source)).await;
let loaded = load_from_store(&run_store.clone().into(), &run_dir)
.await
.unwrap();
@ -301,7 +298,7 @@ mod tests {
let mut record = sample_record(different_graph());
record.graph = graph;
let run_store = seeded_store(&run_dir, &record, None).await;
let run_store = seeded_store(&record, None).await;
let loaded = load_from_store(&run_store.clone().into(), &run_dir)
.await
.unwrap();
@ -319,7 +316,7 @@ mod tests {
let mut record = sample_record(different_graph());
record.graph = graph.clone();
let run_store = seeded_store(&run_dir, &record, Some(&source)).await;
let run_store = seeded_store(&record, Some(&source)).await;
let loaded = load_from_store(&run_store.clone().into(), &run_dir)
.await
.unwrap();

View file

@ -1048,13 +1048,10 @@ mod tests {
settings: serde_json::to_value(&run_spec.settings).unwrap(),
graph: serde_json::to_value(&run_spec.graph).unwrap(),
workflow_source: Some("digraph test { plan -> code }".to_string()),
workflow_config: None,
labels: run_spec.labels.clone().into_iter().collect(),
run_dir: "/tmp/project".to_string(),
source_directory: run_spec.source_directory.clone(),
workflow_slug: run_spec.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: run_spec.provenance.clone(),
manifest_blob: None,
git: run_spec.git.clone(),
@ -1119,13 +1116,10 @@ mod tests {
settings: serde_json::to_value(&run_spec.settings).unwrap(),
graph: serde_json::to_value(&run_spec.graph).unwrap(),
workflow_source: Some("digraph test { plan -> code }".to_string()),
workflow_config: None,
labels: run_spec.labels.clone().into_iter().collect(),
run_dir: "/tmp/project".to_string(),
source_directory: run_spec.source_directory.clone(),
workflow_slug: run_spec.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: run_spec.provenance.clone(),
manifest_blob: None,
git: run_spec.git.clone(),
@ -1539,13 +1533,10 @@ mod tests {
settings: serde_json::to_value(&run_spec.settings).unwrap(),
graph: serde_json::to_value(&run_spec.graph).unwrap(),
workflow_source: Some("digraph test { plan -> code }".to_string()),
workflow_config: None,
labels: run_spec.labels.clone().into_iter().collect(),
run_dir: "/tmp/project".to_string(),
source_directory: run_spec.source_directory.clone(),
workflow_slug: run_spec.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,
@ -1733,13 +1724,10 @@ mod tests {
settings: serde_json::to_value(&run_spec.settings).unwrap(),
graph: serde_json::to_value(&run_spec.graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: run_spec.labels.clone().into_iter().collect(),
run_dir: "/tmp/x".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -507,13 +507,10 @@ mod tests {
settings: serde_json::to_value(&run_spec.settings).unwrap(),
graph: serde_json::to_value(&run_spec.graph).unwrap(),
workflow_source: None,
workflow_config: None,
labels: run_spec.labels.clone().into_iter().collect(),
run_dir: run_dir.display().to_string(),
source_directory: run_spec.source_directory.clone(),
workflow_slug: run_spec.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: run_spec.provenance.clone(),
manifest_blob: None,
git: run_spec.git.clone(),

View file

@ -163,13 +163,10 @@ mod tests {
settings: serde_json::to_value(&record.settings).unwrap(),
graph: serde_json::to_value(&record.graph).unwrap(),
workflow_source: Some("digraph test {}".to_string()),
workflow_config: None,
labels: std::collections::BTreeMap::new(),
run_dir: "/tmp/test".to_string(),
source_directory: Some("/tmp/test".to_string()),
workflow_slug: Some("test".to_string()),
automation: None,
db_prefix: None,
provenance: test_support::test_run_provenance(),
manifest_blob: None,
git: None,

View file

@ -188,17 +188,14 @@ async fn initialized(
.expect("failed to serialize settings"),
graph: serde_json::to_value(graph).expect("failed to serialize graph"),
workflow_source: None,
workflow_config: None,
labels: run_options
.labels
.clone()
.into_iter()
.collect::<BTreeMap<_, _>>(),
run_dir: run_options.run_dir.display().to_string(),
source_directory: Some(sandbox.working_directory().to_string()),
workflow_slug: run_options.workflow_slug.clone(),
automation: None,
db_prefix: None,
provenance: fabro_types::RunProvenance {
server: None,
client: None,

View file

@ -19,7 +19,6 @@ fn run_event_round_trips_run_created() {
"properties": {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"run_dir": "/tmp/fabro/run-1",
"source_directory": "/tmp/fabro/run-1",
"provenance": test_support::test_run_provenance()
}
@ -38,7 +37,6 @@ fn run_event_round_trips_run_created_with_web_url() {
"properties": {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"run_dir": "/tmp/fabro/run-1",
"source_directory": "/tmp/fabro/run-1",
"web_url": format!("http://localhost:3000/runs/{}", fixtures::RUN_1),
"provenance": test_support::test_run_provenance()

View file

@ -1007,7 +1007,6 @@ mod tests {
"settings": settings,
"graph": graph,
"labels": {},
"run_dir": "/tmp/run",
"source_directory": "/tmp/run",
"provenance": test_support::test_run_provenance()
}
@ -1055,7 +1054,6 @@ mod tests {
"settings": WorkflowSettings::default(),
"graph": Graph::new("test"),
"labels": {},
"run_dir": "/tmp/run",
"source_directory": "/tmp/run",
"provenance": test_support::test_run_provenance(),
"manifest_blob": RunBlobId::new(br#"{"version":1}"#).to_string()

View file

@ -17,19 +17,14 @@ pub struct RunCreatedProps {
pub graph: Graph,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub workflow_source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub workflow_config: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub labels: BTreeMap<String, String>,
pub run_dir: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_directory: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub workflow_slug: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub automation: Option<AutomationRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub db_prefix: Option<String>,
pub provenance: RunProvenance,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub manifest_blob: Option<RunBlobId>,

View file

@ -22,9 +22,7 @@ fn run_created_props_round_trip_templated_settings() {
settings: templated_settings(),
graph: Graph::new("ship"),
workflow_source: Some("digraph Ship { start -> exit }".to_string()),
workflow_config: Some("[run]\ngoal = \"Ship {{ env.TASK }}\"".to_string()),
labels: BTreeMap::from([("team".to_string(), "platform".to_string())]),
run_dir: "/tmp/run".to_string(),
source_directory: Some("/Users/client/project".to_string()),
workflow_slug: Some("demo".to_string()),
automation: Some(AutomationRef {
@ -32,7 +30,6 @@ fn run_created_props_round_trip_templated_settings() {
name: Some("Nightly".to_string()),
trigger_id: Some("schedule_1".to_string()),
}),
db_prefix: Some("run_".to_string()),
provenance: test_run_provenance(),
manifest_blob: None,
git: Some(GitContext {
@ -91,13 +88,10 @@ fn run_created_props_omits_web_url_when_absent() {
settings: WorkflowSettings::default(),
graph: Graph::new("ship"),
workflow_source: None,
workflow_config: None,
labels: BTreeMap::new(),
run_dir: "/tmp/run".to_string(),
source_directory: None,
workflow_slug: None,
automation: None,
db_prefix: None,
provenance: test_run_provenance(),
manifest_blob: None,
git: None,
@ -135,7 +129,6 @@ fn run_created_props_defaults_additive_fields_for_legacy_events() {
"settings": WorkflowSettings::default(),
"graph": Graph::new("ship"),
"labels": {},
"run_dir": "/tmp/run",
"provenance": test_run_provenance()
});