v0.0.73 — Agent Hub, Agent Deployments, Scenarios Batch I
Released: 2026-05-16. Fourteen commits.
Three big tracks land together: Agent Hub (#9), Agent Deployments (Batch G), and Scenarios Batch I — the four-tab scenario detail page plus Reporters framework and three new step types.
Agent Hub (#9)
Slice 1 — Library endpoint + landing surface
GET /api/agents/library returns {enterprise, project, recent_conversations}. Enterprise = chat_agent assets with is_public=true (org-wide); project = scoped to the caller's current project. Both filter status != 'archived'. Recent conversations come from chat_sessions, capped via limit_conversations.
New AgentHubPage at /agent-hub: left rail with Recent conversations + Start new + Create new agent; main area shows two grouped sections of agent cards. Picking an agent navigates to /chat?agent=<key>; picking a conversation navigates to /chat?session=<id>. Sidebar gains an Agent Hub entry above Chat & SQL.
V2 — Sources / Activities / Downloads right rail
Closes the audit gap from slice 1 — agent answers were visible but not inspectable. Toggling Trace in the ChatPage header opens a 320px right rail with three tabs over the current session's tool executions:
- Sources — retrieval-style spans (
knowledge_search/dataset_lookup/sql_query/document_search/vector_search/rag_query). - Activities — every span in chronological order.
- Downloads — spans that produced an artifact (
document_generate/dataset_insert/dataset_update/file_export/report_generate).
Each span expands inline to show arguments, result preview, error, latency, tokens, cost. Reads from the existing /api/traces/sessions/{sid} endpoint — no new backend.
V2 — Quick access pins
Pinning a chat_agent surfaces it in the AgentHubPage left rail's new Quick access section above Recent conversations, and stars it in the main agent-card grid. Migration add_agent_pins.sql: composite PK (user_id, agent_id). POST /api/agents/{id}/pin is ON CONFLICT DO NOTHING (re-pinning is a no-op); DELETE is scoped to caller's user_id so users can't clear each other's pins. Cross-org returns 404 via _assert_agent_in_org probe.
Agent Deployments (Batch G)
Audit + history footer
New honeyframe.agent_deployments table captures every set_active_version call (from_version → to_version + deployed_by + change_note + ts). GET /api/publish/assets/{id}/deployments (most recent first, 50 limit) backs a Deploy history footer in AgentVersionPicker dropdown (top 5 entries, re-fetches on every flip).
Org-wide monitor view
GET /api/publish/agent-deployments returns one row per chat_agent asset with current/active version, latest deploy event, and 24h activity from agent_tool_executions (exec count, error count, total tokens). Powers a new admin-only AgentDeploymentsPage at /agent-deployments with a single-table view + error-rate color band (≥5% red, >0 amber). Sidebar entry added under the Agents group (admin-only — endpoint requires org.admin).
Agent versioning — VersionDiffDrawer
GET /api/publish/assets/{id}/versions/{a}/diff/{b} returns both configs plus a path-by-path diff (added / removed / changed) so the frontend stays pure rendering. A Diff button on each row in AgentVersionPicker opens VersionDiffDrawer side-by-side against the pinned active version (or latest).
The diff endpoint also returns theme_diff separately from diff; the drawer gains a Config/Theme tab toggle with per-tab change counts.
Scenarios Batch I — capability #21
Capability #21 from docs/dataiku-parity-roadmap.md. Four slices land together.
4-tab detail page
New ScenarioDetailPage with Settings / Steps / Last runs / History tabs at /projects/<slug>/scenarios/:scenarioId. List rows get an Open link. Nav group renamed Operate → Automation (EN + ID).
Reporters framework
New honeyframe.scenario_reporters table + rollback migration. services/reporter_dsl.py is a predicate evaluator (==, !=, >, <, &&, ||, parens, ${var}) + template interpolator — a strict subset of the DSS formula DSL. services/reporters/ package: mail, slack, webhook. fire_reporters wires into both scheduler.execute_scenario (cron) and the manual-run path; reporter failures never affect scenario outcome.
CRUD lives under routers/scenario_reporters.py (list / create / update / delete + test-send). Every endpoint enters via require_scenario_access; predicates are parse-checked at save time, not run time. ScenarioReportersSection.tsx mounts on the Settings tab with a per-kind editor (mail recipients / Slack webhook / generic HTTP) + Test button.
Two new step kinds + one new trigger
dbt_run— honeyframe-native (Dataiku has no equivalent). Wrapspaas/scripts/dbt_wrapper.pyso existing per-tenant fan-out, anomaly detection, orphan cleanup, andpipeline_loggerentries are reused. Config:select/all_tenants/project_slug/project_id/org_id. Unlocks collapsingdbt-run.timerintodaily_data_pipelineas a step.verify_rules— wires thedata_quality_rulesservice into a step. Config:rule_ids/source/fail_on(any|critical|none). Surfaces failing-rule count so a Slack reporter withoutcome != 'SUCCESS'fires automatically. Unlocks migratingalert_monitoroff custom_script.clear_dataset— TRUNCATEs the physical table backing a registered dataset. Looks up schema + name fromhoneyframe.datasets, scopes toproject_id, identifier-quotes both halves, supports CASCADE.compute_metrics— placeholder until the metric layer ships (Batch B). Reportsresult=deferredso the step exists in the palette without blocking scenarios that include it.dataset_modifiedtrigger — scheduler poll fires when the watched dataset'sCOALESCE(last_sync_at, updated_at)advances pastlast_checked_at. Update-first ordering (mirrorsfolder_change) so slow runs don't double-fire across ticks.
build_dataset UI toggles + Last-runs polish
The build_dataset step now honors Dataiku-equivalent toggles: build_mode (only / upstream / downstream / full_lineage → dbt --select +/− decoration), force_build (--full-refresh), outcome_on_warnings (warning | success). Selectors with explicit + are left undecorated.
Frontend: structured form for build_dataset config (replaces raw JSON), expandable Last runs rows with per-step status / duration / rows / error chips, and a View log modal pulling /pipeline/jobs/{id}/log.
Trigger column promotion + python trigger UI
The 2026-04-30 view cutover migrated honeyframe.scenarios into a view over (scenario_templates ⨝ scenario_enabled) but never exposed trigger_python — so post-cutover both the python and dataset_modified triggers had no write path. Migration 2026-05-16_promote_trigger_python_and_dataset_name.sql adds trigger_python + trigger_dataset_name to scenario_templates, recreates the view, updates the INSTEAD OF INSERT/UPDATE trigger functions, and re-extends the trigger_type CHECK to include python + dataset_modified.
The Settings tab trigger picker gains the python option (sandboxed-expression textarea) and the dataset_modified option (dataset-name input).
alert_monitor also picks up a mail reporter firing on outcome != 'SUCCESS' so script crashes no longer silently swallow alerts.