Skip to content

Finish Tutti trust and activation sprint - #130

Open
wren-nutthouse wants to merge 2 commits into
mainfrom
wren/tutti-trust-activation-sprint
Open

Finish Tutti trust and activation sprint#130
wren-nutthouse wants to merge 2 commits into
mainfrom
wren/tutti-trust-activation-sprint

Conversation

@wren-nutthouse

@wren-nutthouse wren-nutthouse commented May 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

Verification

  • targeted trust/activation tests passed
  • full test suite passed: 331 unit tests + 1 integration test
  • cargo run -- runs activation returned the expected activation summary from repo event history

Notes

  • keeps scope narrow around trust, onboarding clarity, and activation
  • leaves unrelated local junk files out of the PR

Summary by CodeRabbit

  • Documentation

    • Clarified Tutti's positioning as an operator layer coordinating multi-agent coding workflows.
    • Added planning and strategy documentation.
  • New Features

    • Added activation command to check workspace activation status and first successful workflow run timestamp.

@coderabbitai

coderabbitai Bot commented May 5, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR adds an activation status CLI command for Tutti workspaces, refactors prompt-activity detection into reusable helpers, and reshapes product positioning via README and strategic planning documents. The activation command queries control events to report whether a workspace has completed its first successful workflow run.

Changes

Documentation & Product Direction

Layer / File(s) Summary
README Reposition
README.md
Rewrote opening tagline to describe Tutti as an "operator layer" coordinating multi-agent workflows, added "Why Tutti exists" section enumerating coordination pain points, and renamed "Quick Start" to "Install from source".
Telemetry & Activation Strategy
docs/tutti-activation-telemetry-plan-2026-05-05.md
Defines activation (first successful orchestrated workflow run), specifies exact workflow.completed-based signal criteria, enumerates four-milestone funnel, summarizes existing event sources, and proposes a follow-up operator-facing query command.
Product Review & Issue Prioritization
docs/tutti-gstack-review-2026-05-05.md, docs/tutti-issue-triage-2026-05-05.md
GStack-style review recommends "Accelerate, but narrow" focus on operator trust/reliability, establishes differentiation as operator layer, prioritizes issues (#122, #24, #25, #56, #83), and proposes sprint themes around activation clarity.
Technical Audit & Risk Assessment
docs/tutti-local-audit-2026-05-05.md
Local repo audit documents current signals, inferred architecture, maturity assessment, technical risks (operator trust bugs, scope spread, version drift), and recommends narrowing scope around reliability.

Activation CLI Feature

Layer / File(s) Summary
Automation Helper Refactoring
src/automation/mod.rs
Extracted pane_indicates_runtime_working and pane_indicates_prompt_activity helpers to centralize prompt-activity detection logic, replacing inline computation in wait_for_prompt_activity_or_output; added unit tests covering runtime-working UI signal, consumed-prompt scenarios, and negative cases.
CLI Enum Extension
src/cli/mod.rs
Added Activation variant to RunsSubcommand enum to represent the new "show workspace activation status" CLI action.
Activation Command Implementation
src/cli/runs.rs
Implemented pub fn activation() to load control events, compute ActivationSummary (activation flag, first started/completed timestamps, workflow name, run id) via summarize_activation() and workflow_name_from_event(), and print formatted report; extended tests for activated and non-activated scenarios.
Command Routing
src/main.rs
Added dispatch handler for RunsSubcommand::Activation to route to cli::runs::activation().

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

  • nutthouse/tutti#125: Overlapping README positioning edits repositioning Tutti as an operator/agent-ops layer.
  • nutthouse/tutti#102: Related through reliance on workflow.* control events (workflow.started/completed) recorded in control event files, which are the data source for the activation command.

Poem

🐰 A layer for ops, with heart so true,
Tutti coordinates agents through and through—
No more lost threads, no more manual dance,
Just orchestration at a glance.
Hop forward, dear feature, make operators trust!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The pull request description is incomplete against the required template: it lacks the required 'Versioning' section with version bump justification, SemVer selection, and validation checkboxes. Add the required 'Versioning' section explaining the version bump choice, select appropriate SemVer level, and confirm validation steps completed (cargo test, CI).
Docstring Coverage ⚠️ Warning Docstring coverage is 35.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Finish Tutti trust and activation sprint' is partially related to the changeset—it refers to the sprint theme but lacks specificity about the main technical changes (activation command, prompt-activity refactoring, positioning updates).
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch wren/tutti-trust-activation-sprint
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch wren/tutti-trust-activation-sprint

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/cli/runs.rs (1)

50-55: ⚡ Quick win

Extract workspace-root resolution into a helper to avoid drift.

The same current_dir + TuttiConfig::load + project_root block is repeated in list, activation, and show. A small helper keeps error behavior consistent as this module grows.

♻️ Suggested refactor
+fn resolve_project_root() -> Result<std::path::PathBuf> {
+    let cwd = std::env::current_dir()?;
+    let (_config, config_path) = crate::config::TuttiConfig::load(&cwd)?;
+    config_path.parent().map(|p| p.to_path_buf()).ok_or_else(|| {
+        TuttiError::ConfigValidation("could not determine workspace root".to_string())
+    })
+}
+
 pub fn activation() -> Result<()> {
-    let cwd = std::env::current_dir()?;
-    let (_config, config_path) = crate::config::TuttiConfig::load(&cwd)?;
-    let project_root = config_path.parent().ok_or_else(|| {
-        TuttiError::ConfigValidation("could not determine workspace root".to_string())
-    })?;
+    let project_root = resolve_project_root()?;
 
-    let events = load_control_events(project_root)?;
+    let events = load_control_events(&project_root)?;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/runs.rs` around lines 50 - 55, Extract the repeated "current_dir +
TuttiConfig::load + project_root" logic into a small helper (e.g., fn
resolve_workspace_root() -> Result<PathBuf>) that performs
std::env::current_dir(), calls TuttiConfig::load(&cwd), and returns the
config_path.parent() or the same TuttiError::ConfigValidation("could not
determine workspace root".to_string()) on failure; then replace the duplicated
blocks in activation, list, and show to call this helper so all three functions
use the same error behavior and centralized resolution logic.
docs/tutti-gstack-review-2026-05-05.md (2)

75-78: 💤 Low value

Optional: Consider varying sentence structure.

Three consecutive sentences begin with "Not," which static analysis flagged. The parallel structure is rhetorically effective here—it emphasizes what Tutti isn't—so changing it is purely optional. If you prefer variety:

✨ Optional style alternative
-Not another agent.
-Not a general AI platform.
-Not an LLM wrapper.
+Not another agent, not a general AI platform, not an LLM wrapper.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/tutti-gstack-review-2026-05-05.md` around lines 75 - 78, The three short
lines "Not another agent.", "Not a general AI platform.", "Not an LLM wrapper."
all start with "Not" and static analysis flagged the repeated sentence-start;
optionally rephrase one or two of these lines to vary sentence openings while
preserving the negative emphasis — for example change one to "It's not another
agent." or "This is not a general AI platform." or combine two into a single
sentence like "Not an LLM wrapper — not a general AI platform either." — update
the three lines accordingly (the exact strings to edit are "Not another agent.",
"Not a general AI platform.", and "Not an LLM wrapper.").

13-13: 💤 Low value

Optional: Consider rephrasing to avoid word repetition.

Static analysis flagged the repetition of "right" in close proximity. While this doesn't impact comprehension, you could rephrase for polish:

✨ Optional style refinement
-The right move is **not** to broaden the roadmap. The right move is to make Tutti feel undeniably reliable for the operator managing multi-agent coding work.
+The right move is **not** to broaden the roadmap—it's to make Tutti feel undeniably reliable for the operator managing multi-agent coding work.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/tutti-gstack-review-2026-05-05.md` at line 13, Rephrase the sentence
"The right move is **not** to broaden the roadmap. The right move is to make
Tutti feel undeniably reliable for the operator managing multi-agent coding
work." to avoid repeating "The right move" twice — e.g., change the second
clause to a synonym or restructure the sentence so it reads smoothly (search for
the exact sentence text in the document and replace with a single revised
version that uses a different phrasing such as "Instead, focus on making Tutti
feel undeniably reliable for the operator managing multi-agent coding work" or
similar).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/tutti-activation-telemetry-plan-2026-05-05.md`:
- Around line 14-18: The current workflow.completed handler in src/cli/runs.rs
(around the code handling the event at lines ~275-290) only checks for event
existence and must be tightened: update the handler that processes
workflow.completed events to (1) verify the run result by checking
event.data.success == true, (2) filter by origin by requiring event.data.origin
== ExecutionOrigin::Run (use the ExecutionOrigin enum), (3) exclude
test/workspace runs by checking the workspace record (e.g., workspace.is_test or
workspace.metadata indicating a real workspace) and (4) add a way to capture
"first-run guided" (either by adding a first_run_guided boolean to the
Run/Workflow metadata and persisting it when the guided flow triggers, or defer
and flag it as out-of-scope and only count user-triggered runs for now). Modify
the workflow.completed processing function to return early if any of these
checks fail and ensure logs reflect which check caused the drop so telemetry
only records the exact activation signal.

---

Nitpick comments:
In `@docs/tutti-gstack-review-2026-05-05.md`:
- Around line 75-78: The three short lines "Not another agent.", "Not a general
AI platform.", "Not an LLM wrapper." all start with "Not" and static analysis
flagged the repeated sentence-start; optionally rephrase one or two of these
lines to vary sentence openings while preserving the negative emphasis — for
example change one to "It's not another agent." or "This is not a general AI
platform." or combine two into a single sentence like "Not an LLM wrapper — not
a general AI platform either." — update the three lines accordingly (the exact
strings to edit are "Not another agent.", "Not a general AI platform.", and "Not
an LLM wrapper.").
- Line 13: Rephrase the sentence "The right move is **not** to broaden the
roadmap. The right move is to make Tutti feel undeniably reliable for the
operator managing multi-agent coding work." to avoid repeating "The right move"
twice — e.g., change the second clause to a synonym or restructure the sentence
so it reads smoothly (search for the exact sentence text in the document and
replace with a single revised version that uses a different phrasing such as
"Instead, focus on making Tutti feel undeniably reliable for the operator
managing multi-agent coding work" or similar).

In `@src/cli/runs.rs`:
- Around line 50-55: Extract the repeated "current_dir + TuttiConfig::load +
project_root" logic into a small helper (e.g., fn resolve_workspace_root() ->
Result<PathBuf>) that performs std::env::current_dir(), calls
TuttiConfig::load(&cwd), and returns the config_path.parent() or the same
TuttiError::ConfigValidation("could not determine workspace root".to_string())
on failure; then replace the duplicated blocks in activation, list, and show to
call this helper so all three functions use the same error behavior and
centralized resolution logic.
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 218fa338-cbcf-45df-8166-bf76c2f60fd1

📥 Commits

Reviewing files that changed from the base of the PR and between 47d49f8 and 35ed773.

📒 Files selected for processing (9)
  • README.md
  • docs/tutti-activation-telemetry-plan-2026-05-05.md
  • docs/tutti-gstack-review-2026-05-05.md
  • docs/tutti-issue-triage-2026-05-05.md
  • docs/tutti-local-audit-2026-05-05.md
  • src/automation/mod.rs
  • src/cli/mod.rs
  • src/cli/runs.rs
  • src/main.rs

Comment on lines +14 to +18
Recommended exact signal:
- first `workflow.completed` event where:
- the run belongs to a real workspace
- the workflow is user-triggered or first-run guided
- the run result is successful

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check if workflow events contain trigger/source metadata

# Look for workflow.completed event structure in the codebase
rg -n "workflow\.completed" -A 5 -B 5 --type=rust

# Check ControlEvent enum definition for available fields
ast-grep --pattern 'enum ControlEvent {
  $$$
}'

Repository: nutthouse/tutti

Length of output: 3294


🏁 Script executed:

#!/bin/bash
# Find ControlEvent struct/enum definition
rg -n "struct ControlEvent|enum ControlEvent" -A 10 --type=rust

# Look for where workflow trigger type might be stored
rg -n "trigger|first-run|guided" --type=rust -i | head -30

# Check the workflow completion logic for trigger info
rg -n "fn.*workflow.*complete|workflow_trigger|trigger_type" --type=rust -i

Repository: nutthouse/tutti

Length of output: 3161


🏁 Script executed:

#!/bin/bash
# Find WorkflowCompletePayload struct definition
rg -n "struct WorkflowCompletePayload|WorkflowCompletePayload" -A 10 --type=rust | head -40

# Check how workflow.completed events are created and what data is included
rg -n "append_control_event.*workflow.completed" -B 5 -A 5 --type=rust

# Look at the activation logic in runs.rs more closely
sed -n '280,310p' src/cli/runs.rs

# Check if trigger source is captured anywhere in workflow complete
rg -n "success.*trigger|trigger.*source|user.triggered|first.run" --type=rust -i | head -20

Repository: nutthouse/tutti

Length of output: 3523


🏁 Script executed:

#!/bin/bash
# Find HookWorkflowSource enum definition
rg -n "enum HookWorkflowSource" -A 10 --type=rust

# Check how workflow_source from WorkflowCompletePayload flows into event data
rg -n "append_control_event" -B 10 -A 3 --type=rust | grep -A 13 "workflow.completed"

# Look for where workflow.completed event is created with data
rg -n "workflow.completed.*data|workflow.completed.*json|append_control_event.*success" -B 5 -A 5 --type=rust

# Check for workspace validation or real workspace determination
rg -n "real.workspace|test.workspace|workspace.*validation" --type=rust -i

Repository: nutthouse/tutti

Length of output: 1206


🏁 Script executed:

#!/bin/bash
# Get the complete workflow.completed event creation
sed -n '4160,4195p' src/automation/mod.rs

# Also check what data is included - look for the complete append_control_event call
sed -n '4172,4190p' src/automation/mod.rs

Repository: nutthouse/tutti

Length of output: 1855


🏁 Script executed:

#!/bin/bash
# Check the plan document itself
cat docs/tutti-activation-telemetry-plan-2026-05-05.md | head -50

# Find ExecutionOrigin enum
rg -n "enum ExecutionOrigin" -A 15 --type=rust

# Search for first-run or guided setup
rg -n "first.run|guided|onboarding" --type=rust -i | head -20

Repository: nutthouse/tutti

Length of output: 2615


🏁 Script executed:

#!/bin/bash
# Check for TODOs or FIXMEs around activation logic
rg -n "TODO|FIXME|XXX" src/cli/runs.rs

# Check if there's any filtering logic planned or mentioned in comments
rg -n "real.workspace|first.run|activation.*filter|first.*successful" --type=rust -i

# Verify the full activation logic once more
sed -n '275,310p' src/cli/runs.rs

Repository: nutthouse/tutti

Length of output: 1475


Activation criteria are not currently enforced; "first-run guided" tracking is missing.

The plan specifies three criteria for the activation signal, but the current implementation (src/cli/runs.rs:275-290) only checks for workflow.completed event existence without validating:

  • success status (event data has "success" field but it's not filtered)
  • user-triggered vs automated runs (event data has "origin" field that could distinguish ExecutionOrigin::Run from system-triggered workflows, but filtering is not implemented)
  • "first-run guided" status (this metadata is not tracked anywhere in the codebase)
  • real workspace vs test workspace (no validation exists)

The critical gap is that "first-run guided" has no mechanism to be captured or identified. Before this sprint, clarify whether:

  1. All completed workflows should count as activation (ignore the criteria for now)
  2. Only ExecutionOrigin::Run workflows count as "user-triggered" (feasible with current origin field)
  3. "First-run guided" should be added as a tracked field or deferred to a future sprint
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/tutti-activation-telemetry-plan-2026-05-05.md` around lines 14 - 18, The
current workflow.completed handler in src/cli/runs.rs (around the code handling
the event at lines ~275-290) only checks for event existence and must be
tightened: update the handler that processes workflow.completed events to (1)
verify the run result by checking event.data.success == true, (2) filter by
origin by requiring event.data.origin == ExecutionOrigin::Run (use the
ExecutionOrigin enum), (3) exclude test/workspace runs by checking the workspace
record (e.g., workspace.is_test or workspace.metadata indicating a real
workspace) and (4) add a way to capture "first-run guided" (either by adding a
first_run_guided boolean to the Run/Workflow metadata and persisting it when the
guided flow triggers, or defer and flag it as out-of-scope and only count
user-triggered runs for now). Modify the workflow.completed processing function
to return early if any of these checks fail and ensure logs reflect which check
caused the drop so telemetry only records the exact activation signal.

@wren-nutthouse

wren-nutthouse commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator Author

Hermes PR review tracker

Status

blocked

Findings

  • HERMES-001 blocking: PR remains conflicting with main; metadata confirms mergeable CONFLICTING / merge state DIRTY for head 35ed773ef8ac. Resolve conflicts before any merge path.
  • HERMES-002 decision: This broad trust/activation sprint should likely be split/mined rather than merged as-is, per Tutti caution and the wide product/docs/code scope.
  • HERMES-003 verification: CodeRabbit review remains CHANGES_REQUESTED / GitHub review-required in the packet. If carrying this branch forward, verify/fix activation-signal tightening and the src/cli/runs.rs workspace-root helper refactor.

Evidence checked

  • Live gh pr view: open, non-draft, conflicting/dirty at head 35ed773ef8ac, review decision REVIEW_REQUIRED.
  • Live checks: CodeQL analyses and CodeRabbit status are successful/noisy, but GitHub review state remains changes requested/review required.
  • Diff/files reviewed from packet: README repositioning, activation telemetry docs, prompt-activity detection helpers/tests, tt runs activation, and sprint audit/triage docs.

Recommended next action

Owner: Tutti activation lane. Mine useful pieces into smaller PRs or get an explicit human decision to carry the broad sprint as-is; resolve conflicts before any merge path.

Notes

No merge/deploy/close action taken. GitHub status max-status noise is non-blocking because this tracker comment is durable PR-visible state.


Managed by Hermes. Last updated: 2026-09-01T18:54:48Z. Source: silent-cron-reviewer.


Managed by Hermes. Last updated: 2026-09-01T18:57:38+00:00. Source: silent-cron-reviewer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant