Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c5a76bd
feat: GEPA self-improvement loop — phases 0-6b
rita-aga Mar 18, 2026
a8fcb52
style: cargo fmt --all
rita-aga Mar 18, 2026
693126c
fix: clippy needless_borrows_for_generic_args in MCP runtime
rita-aga Mar 18, 2026
80134c6
chore: update readability baseline for GEPA crate additions
rita-aga Mar 18, 2026
7a4e7d0
fix: address code review findings
rita-aga Mar 18, 2026
0fc8f9b
style: cargo fmt
rita-aga Mar 18, 2026
84d9e63
fix: production GEPA loop — spec_evaluator_fn, WASM buffers, effect s…
rita-aga Mar 19, 2026
b36e1c3
style: cargo fmt
rita-aga Mar 19, 2026
c770391
fix: clippy too_many_arguments in persist_ots_trajectory
rita-aga Mar 19, 2026
8e9520e
fix: clippy collapsible_if and manual_strip in skills
rita-aga Mar 19, 2026
4c43763
chore: update readability baseline for GEPA additions
rita-aga Mar 19, 2026
d2ae6ae
fix: remove blanket permit from policies/issue.cedar
rita-aga Mar 19, 2026
148acaa
fix: restore MCP OTS deps after cherry-pick merge
rita-aga Mar 19, 2026
7dc43ee
feat: complete GEPA wasm pipeline and frontier updates
rita-aga Mar 19, 2026
2ffd0aa
docs: record real claude GEPA live proof and trajectory
rita-aga Mar 19, 2026
6df6316
docs: expand GEPA live-proof trajectory and proof diagram
rita-aga Mar 19, 2026
b961da5
feat: run GEPA proposer through TemperAgent with OTS-backed replay
rita-aga Mar 19, 2026
adb326e
chore: refresh readability ratchet baseline for GEPA changes
rita-aga Mar 19, 2026
7cbd965
Fix single-run GEPA proposer reliability and document live OTS proof
rita-aga Mar 19, 2026
6074eb8
docs: add explicit failures and limitations to GEPA live proof
rita-aga Mar 19, 2026
7a605a7
feat: upgrade GEPA to workflow-level OTS replay and reflective patterns
rita-aga Mar 19, 2026
521b726
chore: refresh readability baseline for GEPA workflow changes
rita-aga Mar 19, 2026
33e1691
docs: add comprehensive GEPA E2E proof with taxonomy and live run art…
rita-aga Mar 19, 2026
1e00ea8
feat(temper-agent): add provider auth modes and openrouter support
rita-aga Mar 21, 2026
c40cc56
Restore apps as primary catalog naming
rita-aga Mar 23, 2026
a08f66e
feat(gepa): enforce optimizer-only mutations and unmet-intent handoff
rita-aga Mar 23, 2026
64fe5b5
chore(gepa): remove remaining JEPA naming
rita-aga Mar 23, 2026
83641e9
feat(intent-discovery): add logfire-backed intent evidence loop
rita-aga Mar 24, 2026
62565f9
Merge remote-tracking branch 'origin/main' into feat/intent-discovery…
rita-aga Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .ci/readability-baseline.env
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Generated by scripts/readability-ratchet.sh
PROD_RS_TOTAL=307
PROD_FILES_GT300=98
PROD_FILES_GT500=47
PROD_FILES_GT1000=0
PROD_MAX_FILE_LINES=987
PROD_MAX_FILE_PATH=crates/temper-spec/src/automaton/toml_parser.rs
ALLOW_CLIPPY_COUNT=22
PROD_RS_TOTAL=325
PROD_FILES_GT300=108
PROD_FILES_GT500=51
PROD_FILES_GT1000=3
PROD_MAX_FILE_LINES=1823
PROD_MAX_FILE_PATH=crates/temper-server/src/observe/evolution/insight_generator.rs
ALLOW_CLIPPY_COUNT=23
ALLOW_DEAD_CODE_COUNT=9
PROD_PRINTLN_COUNT=176
PROD_UNWRAP_CI_OK_COUNT=111
PROD_UNWRAP_CI_OK_COUNT=115
26 changes: 26 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
resolver = "2"
exclude = [
"wasm-modules/http-fetch",
"wasm-modules/gepa-replay",
"wasm-modules/gepa-score",
"wasm-modules/gepa-pareto",
"wasm-modules/gepa-reflective",
"wasm-modules/gepa-proposer-agent",
"crates/temper-wasm/tests/fixtures/echo-integration-src",
"os-apps/temper-agent/wasm/llm_caller",
"os-apps/temper-agent/wasm/tool_runner",
Expand Down Expand Up @@ -32,6 +37,7 @@ members = [
"crates/temper-wasm-sdk",
"crates/temper-sdk",
"crates/temper-sandbox",
"crates/temper-ots",
"reference-apps/ecommerce",
"reference-apps/oncall",
]
Expand Down Expand Up @@ -136,6 +142,7 @@ temper-wasm = { path = "crates/temper-wasm" }
temper-wasm-sdk = { path = "crates/temper-wasm-sdk" }
temper-sdk = { path = "crates/temper-sdk" }
temper-sandbox = { path = "crates/temper-sandbox" }
temper-ots = { path = "crates/temper-ots" }

# WASM runtime
wasmtime = { version = "29", features = ["component-model"] }
Expand Down
44 changes: 28 additions & 16 deletions crates/temper-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@ enum Commands {
/// Tenant name (used with --specs-dir to load user specs)
#[arg(long, default_value = "default")]
tenant: String,
/// Install an OS app into the default tenant at startup (repeatable)
#[arg(long)]
os_app: Vec<String>,
/// Install a skill into the default tenant at startup (repeatable)
#[arg(long, alias = "os-app")]
skill: Vec<String>,
/// Run spec verification in an isolated subprocess (panics/hangs won't crash the server).
///
/// Each entity's IOA source is written to stdin of `temper verify-ioa`;
Expand Down Expand Up @@ -147,7 +147,7 @@ async fn main() -> anyhow::Result<()> {
no_observe,
specs_dir,
tenant,
os_app,
skill,
verify_subprocess,
} => {
let storage_explicit =
Expand All @@ -169,7 +169,7 @@ async fn main() -> anyhow::Result<()> {
serve::run(
port,
apps,
os_app,
skill,
storage,
storage_explicit,
!no_observe,
Expand Down Expand Up @@ -343,32 +343,44 @@ mod tests {
}

#[test]
fn test_cli_parse_serve_with_os_app() {
fn test_cli_parse_serve_with_skill() {
let cli = Cli::parse_from(["temper", "serve", "--skill", "project-management"]);
match cli.command {
Commands::Serve { skill, .. } => {
assert_eq!(skill.len(), 1);
assert_eq!(skill[0], "project-management");
}
_ => panic!("expected Serve command"),
}
}

#[test]
fn test_cli_parse_serve_with_os_app_alias() {
let cli = Cli::parse_from(["temper", "serve", "--os-app", "project-management"]);
match cli.command {
Commands::Serve { os_app, .. } => {
assert_eq!(os_app.len(), 1);
assert_eq!(os_app[0], "project-management");
Commands::Serve { skill, .. } => {
assert_eq!(skill.len(), 1);
assert_eq!(skill[0], "project-management");
}
_ => panic!("expected Serve command"),
}
}

#[test]
fn test_cli_parse_serve_with_multiple_os_apps() {
fn test_cli_parse_serve_with_multiple_skills() {
let cli = Cli::parse_from([
"temper",
"serve",
"--os-app",
"--skill",
"project-management",
"--os-app",
"--skill",
"crm",
]);
match cli.command {
Commands::Serve { os_app, .. } => {
assert_eq!(os_app.len(), 2);
assert_eq!(os_app[0], "project-management");
assert_eq!(os_app[1], "crm");
Commands::Serve { skill, .. } => {
assert_eq!(skill.len(), 2);
assert_eq!(skill[0], "project-management");
assert_eq!(skill[1], "crm");
}
_ => panic!("expected Serve command"),
}
Expand Down
38 changes: 19 additions & 19 deletions crates/temper-cli/src/serve/bootstrap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -523,12 +523,12 @@ pub(super) async fn bootstrap_tenants(state: &PlatformState, apps: &[(String, St
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum OsAppBootstrapSource {
enum SkillBootstrapSource {
Persisted,
Cli,
}

fn tenant_has_os_app_specs(state: &PlatformState, tenant: &str, app_name: &str) -> bool {
fn tenant_has_skill_specs(state: &PlatformState, tenant: &str, app_name: &str) -> bool {
let Some(bundle) = temper_platform::os_apps::get_os_app(app_name) else {
return false;
};
Expand All @@ -540,46 +540,46 @@ fn tenant_has_os_app_specs(state: &PlatformState, tenant: &str, app_name: &str)
.all(|(entity_type, _)| registry.get_table(&tenant_id, entity_type).is_some())
}

/// Phase 8b: Restore persisted OS apps and apply `--os-app` requests.
/// Phase 8b: Restore persisted skills and apply `--skill` requests.
///
/// Why this exists:
/// - agent bootstrap (Phase 8) can replace tenant specs;
/// - OS app installs are durably tracked in `tenant_installed_apps`.
/// - Skill installs are durably tracked in `tenant_installed_apps`.
///
/// This phase replays persisted installs so app entities remain available
/// This phase replays persisted installs so skill entities remain available
/// after restart, and then applies explicit CLI installs for `default`.
pub(super) async fn bootstrap_installed_os_apps(state: &PlatformState, os_apps: &[String]) {
let mut requested: BTreeMap<(String, String), OsAppBootstrapSource> = BTreeMap::new();
pub(super) async fn bootstrap_installed_skills(state: &PlatformState, skills: &[String]) {
let mut requested: BTreeMap<(String, String), SkillBootstrapSource> = BTreeMap::new();

if let Some(ref store) = state.server.event_store
&& let Some(turso) = store.platform_turso_store()
{
match turso.list_all_installed_apps().await {
Ok(installed) => {
for (tenant, app_name) in installed {
requested.insert((tenant, app_name), OsAppBootstrapSource::Persisted);
requested.insert((tenant, app_name), SkillBootstrapSource::Persisted);
}
}
Err(e) => {
eprintln!(" Warning: failed to load installed OS apps: {e}");
eprintln!(" Warning: failed to load installed skills: {e}");
}
}
}

for app_name in os_apps {
for skill_name in skills {
requested
.entry(("default".to_string(), app_name.clone()))
.and_modify(|source| *source = OsAppBootstrapSource::Cli)
.or_insert(OsAppBootstrapSource::Cli);
.entry(("default".to_string(), skill_name.clone()))
.and_modify(|source| *source = SkillBootstrapSource::Cli)
.or_insert(SkillBootstrapSource::Cli);
}

for ((tenant, app_name), source) in requested {
if tenant_has_os_app_specs(state, &tenant, &app_name) {
if tenant_has_skill_specs(state, &tenant, &app_name) {
continue;
}
match temper_platform::install_os_app(state, &tenant, &app_name).await {
Ok(result) => match source {
OsAppBootstrapSource::Persisted => {
SkillBootstrapSource::Persisted => {
let all: Vec<String> = result
.added
.iter()
Expand All @@ -588,11 +588,11 @@ pub(super) async fn bootstrap_installed_os_apps(state: &PlatformState, os_apps:
.cloned()
.collect();
println!(
" Restored OS app '{app_name}' for '{tenant}': {}",
" Restored skill '{app_name}' for '{tenant}': {}",
all.join(", ")
);
}
OsAppBootstrapSource::Cli => {
SkillBootstrapSource::Cli => {
let all: Vec<String> = result
.added
.iter()
Expand All @@ -601,13 +601,13 @@ pub(super) async fn bootstrap_installed_os_apps(state: &PlatformState, os_apps:
.cloned()
.collect();
println!(
" OS app '{app_name}' installed for '{tenant}': {}",
" Skill '{app_name}' installed for '{tenant}': {}",
all.join(", ")
);
}
},
Err(e) => {
eprintln!(" Warning: failed to install OS app '{app_name}' for '{tenant}': {e}");
eprintln!(" Warning: failed to install skill '{app_name}' for '{tenant}': {e}");
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions crates/temper-cli/src/serve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct LoadedTenantSpecs {
pub async fn run(
port: u16,
apps: Vec<(String, String)>,
os_apps: Vec<String>,
skills: Vec<String>,
storage: StorageBackend,
storage_explicit: bool,
observe: bool,
Expand Down Expand Up @@ -153,8 +153,8 @@ pub async fn run(
// Phase 8: Bootstrap system + agent tenants
bootstrap::bootstrap_tenants(&state, &apps).await;

// Phase 8b: Restore persisted OS apps + apply CLI `--os-app` requests.
bootstrap::bootstrap_installed_os_apps(&state, &os_apps).await;
// Phase 8b: Restore persisted skills + apply CLI `--skill` requests.
bootstrap::bootstrap_installed_skills(&state, &skills).await;

// Phase 9: Bind, start background tasks, serve
let router = build_platform_router(state.clone());
Expand Down
Loading
Loading