feat: Remove Agent Trace persistence and reset hooks to no-op baseline#23
feat: Remove Agent Trace persistence and reset hooks to no-op baseline#23davidabram wants to merge 6 commits intomainfrom
Conversation
Remove the Agent Trace implementation from the CLI runtime to establish a clean v0.3.0 redesign baseline Co-authored-by: SCE <sce@crocoder.dev>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: ⛔ Files ignored due to path filters (17)
📒 Files selected for processing (5)
💤 Files with no reviewable changes (3)
📝 WalkthroughWalkthroughRemoved the Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
cli/src/services/hooks.rs (1)
766-780:⚠️ Potential issue | 🟠 MajorDon't keep local DB warmup on the hook critical path.
let _ = ensure_agent_trace_local_db_ready_blocking()?;is still a hard failure. WithNoOpTraceRecordStorein both post-commit and post-rewrite, a broken/unwritable state directory now causes both hooks to skip git-notes emission and retry-queue replay even though the remaining persistence lives under.git. It also recreates the Agent Trace DB as a side effect of "resolving" runtime paths.Suggested fix
fn resolve_post_commit_runtime_paths(repository_root: &Path) -> Result<PostCommitRuntimePaths> { - let _ = ensure_agent_trace_local_db_ready_blocking()?; let retry_queue_path = resolve_git_path( repository_root, default_paths::git_relative_path::TRACE_RETRY_QUEUE, )?;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/services/hooks.rs` around lines 766 - 780, The call to ensure_agent_trace_local_db_ready_blocking() inside resolve_post_commit_runtime_paths makes the hook fail hard and recreates the Agent Trace DB; remove this blocking warmup from resolve_post_commit_runtime_paths (or make it non-fatal) so the function only resolves paths (retry_queue_path and emission_ledger_path) and returns PostCommitRuntimePaths; if you still want a best-effort warmup, invoke ensure_agent_trace_local_db_ready_blocking() outside the hook critical path (or catch and log its error and continue) and ensure NoOpTraceRecordStore behavior remains unaffected.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@cli/src/services/hooks.rs`:
- Around line 1353-1355: The NoOpRewriteRemapIngestion currently returns
Ok(true) unconditionally which prevents skipped_pairs from ever incrementing;
update the ingestion logic in the NoOpRewriteRemapIngestion handler (the code
that receives remap pairs and mutates accepted_requests) to check for existing
remap pairs in accepted_requests before accepting: if the pair already exists,
do not push it and return Ok(false) to indicate a duplicate was skipped; if it’s
new, push into accepted_requests and return Ok(true). Apply the same fix to the
other duplicate block referenced (the similar handler around the 1538-1546
region) so duplicate-skipping semantics and post-rewrite counts remain accurate.
---
Outside diff comments:
In `@cli/src/services/hooks.rs`:
- Around line 766-780: The call to ensure_agent_trace_local_db_ready_blocking()
inside resolve_post_commit_runtime_paths makes the hook fail hard and recreates
the Agent Trace DB; remove this blocking warmup from
resolve_post_commit_runtime_paths (or make it non-fatal) so the function only
resolves paths (retry_queue_path and emission_ledger_path) and returns
PostCommitRuntimePaths; if you still want a best-effort warmup, invoke
ensure_agent_trace_local_db_ready_blocking() outside the hook critical path (or
catch and log its error and continue) and ensure NoOpTraceRecordStore behavior
remains unaffected.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: db61c1e3-2ca3-4b33-a27e-4877c1beb8b9
⛔ Files ignored due to path filters (11)
context/architecture.mdis excluded by!context/**/*.mdcontext/context-map.mdis excluded by!context/**/*.mdcontext/glossary.mdis excluded by!context/**/*.mdcontext/overview.mdis excluded by!context/**/*.mdcontext/patterns.mdis excluded by!context/**/*.mdcontext/plans/agent-trace-removal-and-hook-noop-reset.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-core-schema-migrations.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-local-hooks-mvp-contract-gap-matrix.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-post-commit-dual-write.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-reconciliation-schema-ingestion.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-rewrite-trace-transformation.mdis excluded by!context/**/*.md
📒 Files selected for processing (7)
cli/src/app.rscli/src/cli_schema.rscli/src/command_surface.rscli/src/services/hooks.rscli/src/services/local_db.rscli/src/services/mod.rscli/src/services/sync.rs
💤 Files with no reviewable changes (5)
- cli/src/services/mod.rs
- cli/src/cli_schema.rs
- cli/src/app.rs
- cli/src/services/sync.rs
- cli/src/command_surface.rs
Remove the full agent trace pipeline (pre-commit checkpointing, post-commit trace persistence, retry queues, emission ledger) from git hooks. The hooks now operate in a simplified attribution-only mode that only manages the SCE co-author trailer in commit messages. Add `policies.attribution_hooks.enabled` config option and `SCE_ATTRIBUTION_HOOKS_ENABLED` environment variable to control whether attribution hooks are active. Defaults to false. Co-authored-by: SCE <sce@crocoder.dev>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
cli/src/services/config.rs (1)
1729-1731: 🧹 Nitpick | 🔵 TrivialConsider including
attribution_hooks_enabledin config show output.The new
attribution_hooks_enabledsetting is not displayed in theconfig showoutput (neither text nor JSON format). While this may be intentional since it's a hook-specific runtime setting, including it would help users verify their configuration during troubleshooting.♻️ Proposed addition to JSON output
"policies": { - "bash": format_bash_policies_json(&runtime.bash_policies), + "bash": format_bash_policies_json(&runtime.bash_policies), + "attribution_hooks": format_resolved_value_json( + runtime.attribution_hooks_enabled.value, + runtime.attribution_hooks_enabled.source, + ), }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/services/config.rs` around lines 1729 - 1731, The config show output currently emits "policies" JSON but omits the new runtime flag; update the formatter that builds the config show output to include runtime.attribution_hooks_enabled in both the JSON and text representations. Locate the block that constructs the JSON map (where "policies": { "bash": format_bash_policies_json(&runtime.bash_policies) } is added) and add an "attribution_hooks_enabled": runtime.attribution_hooks_enabled entry, and mirror that in the textual output generator (the same function that prints runtime fields for config show) so users see the flag in both formats.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@cli/src/services/config.rs`:
- Around line 292-295: The struct ResolvedHookRuntimeConfig currently derives
Clone, Debug, Eq, PartialEq but should also derive Copy because it contains only
a bool; update the derive attribute on ResolvedHookRuntimeConfig to include Copy
and follow the guideline order (Clone, Copy, Debug, Eq, PartialEq) so instances
can be copied trivially instead of moved.
---
Outside diff comments:
In `@cli/src/services/config.rs`:
- Around line 1729-1731: The config show output currently emits "policies" JSON
but omits the new runtime flag; update the formatter that builds the config show
output to include runtime.attribution_hooks_enabled in both the JSON and text
representations. Locate the block that constructs the JSON map (where
"policies": { "bash": format_bash_policies_json(&runtime.bash_policies) } is
added) and add an "attribution_hooks_enabled": runtime.attribution_hooks_enabled
entry, and mirror that in the textual output generator (the same function that
prints runtime fields for config show) so users see the flag in both formats.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: d59b8108-2628-4309-be18-3563dbc19a35
⛔ Files ignored due to path filters (14)
config/pkl/base/sce-config-schema.pklis excluded by!**/*.pklcontext/architecture.mdis excluded by!context/**/*.mdcontext/context-map.mdis excluded by!context/**/*.mdcontext/glossary.mdis excluded by!context/**/*.mdcontext/overview.mdis excluded by!context/**/*.mdcontext/patterns.mdis excluded by!context/**/*.mdcontext/plans/agent-trace-removal-and-hook-noop-reset.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-commit-msg-coauthor-policy.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-hooks-command-routing.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-post-commit-dual-write.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-post-rewrite-local-remap-ingestion.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-pre-commit-staged-checkpoint.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-retry-queue-observability.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-rewrite-trace-transformation.mdis excluded by!context/**/*.md
📒 Files selected for processing (3)
cli/src/services/config.rscli/src/services/hooks.rsconfig/schema/sce-config.schema.json
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
cli/src/services/local_db.rs (1)
18-37: 🧹 Nitpick | 🔵 TrivialAdd path/step context to local DB health failures.
Lines 18-37 bubble raw DB errors, so
sce doctorloses whether runtime creation, open, connect, init, orPRAGMA schema_versionfailed for a specific file. Wrapping each fallible step withContext/with_contextwould make failures much more actionable.♻️ Suggested change
-use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context, Result}; use turso::Builder; @@ pub(crate) fn check_local_db_health_blocking(path: &Path) -> Result<()> { let runtime = tokio::runtime::Builder::new_current_thread() .enable_time() - .build()?; + .build() + .context("Failed to create runtime for local DB health check.")?; runtime.block_on(check_local_db_health(path)) } async fn check_local_db_health(path: &Path) -> Result<()> { - let conn = connect_local(LocalDatabaseTarget::Path(path)).await?; - let mut rows = conn.query("PRAGMA schema_version", ()).await?; + let conn = connect_local(LocalDatabaseTarget::Path(path)) + .await + .with_context(|| format!("Failed to open local DB '{}'.", path.display()))?; + let mut rows = conn + .query("PRAGMA schema_version", ()) + .await + .with_context(|| format!("Failed to query local DB '{}'.", path.display()))?; let _ = rows.next().await?; Ok(()) } async fn connect_local(target: LocalDatabaseTarget<'_>) -> Result<turso::Connection> { let location = target_location(target)?; - let db = Builder::new_local(location).build().await?; - let conn = db.connect()?; - conn.execute("PRAGMA foreign_keys = ON", ()).await?; + let db = Builder::new_local(location) + .build() + .await + .with_context(|| format!("Failed to build local DB '{}'.", location))?; + let conn = db + .connect() + .with_context(|| format!("Failed to connect local DB '{}'.", location))?; + conn.execute("PRAGMA foreign_keys = ON", ()) + .await + .with_context(|| format!("Failed to initialize local DB '{}'.", location))?; Ok(conn) }As per coding guidelines, "Add context to I/O and process failures in Rust with
Context/with_context."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/services/local_db.rs` around lines 18 - 37, Wrap each fallible step with Context/with_context to add the file path and the specific operation so errors show where they failed: add context on tokio::runtime::Builder::new_current_thread().build() in check_local_db_health_blocking, on connect_local(LocalDatabaseTarget::Path(path)) and inside connect_local around Builder::new_local(location).build(), db.connect(), conn.execute("PRAGMA foreign_keys = ON", ...), conn.query("PRAGMA schema_version", ...), and rows.next().await; include the path and a short step message (e.g. "creating runtime", "opening DB at {path}", "connecting to DB", "enabling foreign_keys", "querying schema_version", "reading query row") using Context/with_context so failures report both the path and which step failed.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@cli/src/services/default_paths.rs`:
- Line 81: The change orphaned the legacy Agent Trace DB by moving the canonical
DB to a new path and removing the legacy artifact location; update
default_paths.rs to detect a legacy trace DB on startup (when handling the
LocalDb/default path resolution) and perform a one-time migration: if the legacy
file exists and the new canonical file is absent, move or copy the legacy DB to
the new canonical location (or import its contents), then remove the legacy
file; alternatively, until a migration is implemented, restore reporting of the
legacy file from the code paths that previously surfaced it so existing installs
remain visible until cleanup is done.
In `@cli/src/services/doctor.rs`:
- Around line 1239-1244: The change renamed the CLI label/JSON field for the
local DB which breaks existing JSON consumers; update the doctor output code
(references: local_db_status and report.local_db) to emit both the old and new
JSON keys during a deprecation window (e.g., include both "localDb" and
"local_db" or the previous key and the new "local_db") or gate the new shape
behind a versioned --format flag, and ensure the human-facing label change
("Local DB") remains unchanged; adjust the serialization logic that builds the
JSON payload (where report.local_db is used) to populate both keys or
conditionally choose the new key when a versioned format is requested.
---
Outside diff comments:
In `@cli/src/services/local_db.rs`:
- Around line 18-37: Wrap each fallible step with Context/with_context to add
the file path and the specific operation so errors show where they failed: add
context on tokio::runtime::Builder::new_current_thread().build() in
check_local_db_health_blocking, on
connect_local(LocalDatabaseTarget::Path(path)) and inside connect_local around
Builder::new_local(location).build(), db.connect(), conn.execute("PRAGMA
foreign_keys = ON", ...), conn.query("PRAGMA schema_version", ...), and
rows.next().await; include the path and a short step message (e.g. "creating
runtime", "opening DB at {path}", "connecting to DB", "enabling foreign_keys",
"querying schema_version", "reading query row") using Context/with_context so
failures report both the path and which step failed.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 630b0c03-1902-4289-ac79-867bfe833141
⛔ Files ignored due to path filters (10)
context/architecture.mdis excluded by!context/**/*.mdcontext/cli/cli-command-surface.mdis excluded by!context/**/*.mdcontext/cli/default-path-catalog.mdis excluded by!context/**/*.mdcontext/context-map.mdis excluded by!context/**/*.mdcontext/glossary.mdis excluded by!context/**/*.mdcontext/overview.mdis excluded by!context/**/*.mdcontext/patterns.mdis excluded by!context/**/*.mdcontext/plans/agent-trace-removal-and-hook-noop-reset.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-core-schema-migrations.mdis excluded by!context/**/*.mdcontext/sce/agent-trace-hook-doctor.mdis excluded by!context/**/*.md
📒 Files selected for processing (8)
cli/src/app.rscli/src/cli_schema.rscli/src/command_surface.rscli/src/services/default_paths.rscli/src/services/doctor.rscli/src/services/local_db.rscli/src/services/mod.rscli/src/services/trace.rs
💤 Files with no reviewable changes (3)
- cli/src/services/mod.rs
- cli/src/app.rs
- cli/src/services/trace.rs
Delete the agent_trace module which contained trace record structures, VCS metadata constants, and payload adapter functions that are no longer referenced by the codebase.
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
cli/src/services/local_db.rs (2)
17-35: 🛠️ Refactor suggestion | 🟠 MajorAdd context before bubbling local DB failures up to
doctor.
cli/src/services/doctor.rs:628-642renders{error}directly in the user-facing summary, but all of the runtime/DB calls here use bare?. If runtime construction, DB open,PRAGMA foreign_keys, orPRAGMA schema_versionfails, the report will not say which step or path failed.As per coding guidelines, "Add context to I/O and process failures in Rust with `Context` / `with_context`."♻️ Proposed change
-use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context, Result}; pub(crate) fn check_local_db_health_blocking(path: &Path) -> Result<()> { let runtime = tokio::runtime::Builder::new_current_thread() .enable_time() - .build()?; - runtime.block_on(check_local_db_health(path)) + .build() + .context("failed to construct local DB health-check runtime")?; + runtime + .block_on(check_local_db_health(path)) + .with_context(|| format!("failed to check local DB '{}'", path.display())) } async fn check_local_db_health(path: &Path) -> Result<()> { - let conn = connect_local(LocalDatabaseTarget::Path(path)).await?; - let mut rows = conn.query("PRAGMA schema_version", ()).await?; - let _ = rows.next().await?; + let conn = connect_local(LocalDatabaseTarget::Path(path)) + .await + .with_context(|| format!("failed to open local DB '{}'", path.display()))?; + let mut rows = conn + .query("PRAGMA schema_version", ()) + .await + .with_context(|| format!("failed to query local DB '{}'", path.display()))?; + let _ = rows + .next() + .await + .with_context(|| format!("failed to read PRAGMA schema_version from '{}'", path.display()))?; Ok(()) } async fn connect_local(target: LocalDatabaseTarget<'_>) -> Result<turso::Connection> { let location = target_location(target)?; - let db = Builder::new_local(location).build().await?; - let conn = db.connect()?; - conn.execute("PRAGMA foreign_keys = ON", ()).await?; + let db = Builder::new_local(location) + .build() + .await + .with_context(|| format!("failed to build local DB '{}'", location))?; + let conn = db + .connect() + .with_context(|| format!("failed to connect local DB '{}'", location))?; + conn.execute("PRAGMA foreign_keys = ON", ()) + .await + .with_context(|| format!("failed to enable foreign keys for '{}'", location))?; Ok(conn) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/services/local_db.rs` around lines 17 - 35, The health-check functions leak raw errors; wrap each I/O/DB operation with contextual messages using anyhow::Context (or .with_context) so the doctor summary can show which step/path failed: add context to tokio runtime construction in check_local_db_health_blocking (include the Path), to connect_local when calling target_location and Builder::new_local/build and db.connect (include target/location), and to the PRAGMA calls in check_local_db_health (specify which PRAGMA and the path) so every `?` is replaced with a contextualized error explaining the failing step and the database path.
17-29: 🛠️ Refactor suggestion | 🟠 MajorAdd focused unit tests for the reduced health-check contract.
This file now defines the baseline local DB health behavior, but there is no in-file
#[cfg(test)]coverage for the success and failure paths. Two tempdir-based tests would likely be enough here: one that accepts a valid SQLite file and one that rejects a non-database file.As per coding guidelines, "Add unit tests close to the code they exercise" and "Test names are descriptive, behavior-oriented, and usually sentence-like with underscores."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/services/local_db.rs` around lines 17 - 29, Add an in-file #[cfg(test)] module with two unit tests that exercise the reduced health-check contract via the synchronous wrapper check_local_db_health_blocking: one test (e.g., accepts_valid_sqlite_file) should create a temporary directory and a valid SQLite file (open a connection or create a DB there) then call check_local_db_health_blocking(path) and assert it returns Ok(()); the other test (e.g., rejects_non_database_file) should create a temp file containing non-SQLite data and assert check_local_db_health_blocking(path) returns an Err; place tests next to the functions check_local_db_health_blocking and check_local_db_health and give the tests descriptive, behavior-oriented names.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@cli/src/services/local_db.rs`:
- Around line 17-21: The current blocking wrapper for check_local_db_health
constructs a Tokio runtime with only timers enabled; update the runtime builder
in check_local_db_health_blocking so it enables Tokio I/O as well by using the
enable_all() (or otherwise enabling both time and io) on the runtime builder
before build(), ensuring the ad-hoc runtime supports async I/O used by
check_local_db_health.
---
Outside diff comments:
In `@cli/src/services/local_db.rs`:
- Around line 17-35: The health-check functions leak raw errors; wrap each
I/O/DB operation with contextual messages using anyhow::Context (or
.with_context) so the doctor summary can show which step/path failed: add
context to tokio runtime construction in check_local_db_health_blocking (include
the Path), to connect_local when calling target_location and
Builder::new_local/build and db.connect (include target/location), and to the
PRAGMA calls in check_local_db_health (specify which PRAGMA and the path) so
every `?` is replaced with a contextualized error explaining the failing step
and the database path.
- Around line 17-29: Add an in-file #[cfg(test)] module with two unit tests that
exercise the reduced health-check contract via the synchronous wrapper
check_local_db_health_blocking: one test (e.g., accepts_valid_sqlite_file)
should create a temporary directory and a valid SQLite file (open a connection
or create a DB there) then call check_local_db_health_blocking(path) and assert
it returns Ok(()); the other test (e.g., rejects_non_database_file) should
create a temp file containing non-SQLite data and assert
check_local_db_health_blocking(path) returns an Err; place tests next to the
functions check_local_db_health_blocking and check_local_db_health and give the
tests descriptive, behavior-oriented names.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 5190da6b-57a8-41d2-94ff-e30c7c5e2e55
📒 Files selected for processing (3)
cli/src/services/agent_trace.rscli/src/services/local_db.rscli/src/services/mod.rs
💤 Files with no reviewable changes (2)
- cli/src/services/mod.rs
- cli/src/services/agent_trace.rs
Clarify that Agent Trace adapter, payload builder, persistence, retry, and rewrite flows are no longer active runtime behavior. Document the current attribution-only hook baseline and empty-file local DB baseline, and mark T04 complete in the removal plan.
Remove the turso-based local database implementation and all associated Agent Trace persistence behavior from the CLI. This eliminates the local_db service, schema bootstrap, trace emission, and related doctor checks while keeping hook entrypoints present for optional attribution behavior (now gated and disabled by default).
Remove the Agent Trace implementation from the CLI runtime to establish a clean v0.3.0 redesign baseline
Summary by CodeRabbit
Chores
New Features