Skip to content

feat(ui): name a session with a three-word slug - #197

Merged
senamakel merged 24 commits into
mainfrom
session-title-slug
Aug 6, 2026
Merged

feat(ui): name a session with a three-word slug#197
senamakel merged 24 commits into
mainfrom
session-title-slug

Conversation

@senamakel

@senamakel senamakel commented Aug 5, 2026

Copy link
Copy Markdown
Member

Summary

A session's name is now a three-word kebab slug — fix-session-handoff — everywhere one is shown, instead of a truncated prompt or a whole harness sentence.

Three surfaces, one rule:

  • Recent-session labels (medulla sessions, resume rows): the first human prompt was stored whole and cut at 72 chars. It is now slugged.
  • Agent rail lane titles: the harness advertises "Fix session handoff flow and pointer"; the rail shows fix-session-handoff.
  • Status-line thread field: same value, same treatment, so the two rows agree.

Problem

Every one of those slots is scanned, not read, and each was showing a string sized for something else. A prompt's leading words are usually conversational scaffolding ("okay so can you please…"), so the words that identify a session were exactly the ones truncation dropped; and the rail is measured against its widest row, so one long title widened the whole sidebar.

The two paths also disagreed with each other: session_history truncated at 72 chars with an ellipsis, the rail flattened control bytes and cut at 48 cells. Two shapes for one concept.

Solution

medulla::ui::util::slug is the single shaper: split on every non-alphanumeric character, lowercase, drop filler words (okay, so, can, you, please, the…), keep the first SLUG_MAX_WORDS (3), stop before SLUG_MAX_CHARS (48).

Design notes:

  • Untrusted text is handled by construction. Only alphanumerics survive, so a harness title carrying an escape sequence, a control byte, or a newline cannot reach a pane. This replaces display_session_title's hand-rolled control-byte scrub and width walk rather than sitting beside it.
  • All-filler input still names its session. "can you please" falls back to the unfiltered words — a bad-but-stable name beats an empty row.
  • A word longer than the ceiling is truncated, not dropped, since dropping it can empty an otherwise usable slug.
  • first_prompt_text still returns Option, so the (no prompt) fallback for a session with nothing usable is unchanged.

The generator side is a matching change in tinyhumansai/openhuman#5412, which asks the model for the same shape and enforces it on the stored thread title. This PR is the consumer side and stands alone: it reshapes what medulla renders regardless of what any harness advertises.

Validation

  • cargo test — full workspace green (sdk + tui, unit/feature/e2e).
  • cargo clippy --all-targets -- -D warnings — clean.
  • cargo fmt --check — clean.

New cases cover the slug rules (three-word cap, filler removal, all-filler fallback, punctuation/control-byte breaks, the length ceiling, empty input), the history label, and both rail surfaces.

Notes for reviewers

  • Public API: medulla::ui::util::{slug, SLUG_MAX_WORDS, SLUG_MAX_CHARS} added. session_history's internal truncate_label/LABEL_MAX are gone; RecentSession.label keeps its type and its (no prompt) fallback, so the medulla sessions JSON shape is unchanged — only the string is shorter.
  • vendor/openhuman gitlink now points at e29bfc66f, the merge of openhuman#5412. That PR shortens generated thread titles to at most three ordinary words ("Fix session handoff"); this crate keeps rendering its own kebab slug, which is the shape its terminal rails want. Full cargo test re-run green against the bumped core.

Summary by CodeRabbit

  • New Features

    • Session and thread labels are now generated as concise, lowercase, hyphen-separated slugs.
    • Labels use up to three meaningful words and are limited to 48 characters.
    • Apostrophes, punctuation, filler words, control characters, and excessively long text are handled consistently.
    • Empty or punctuation-only labels are omitted from the interface.
    • Thread names in the navigation rail now display consistently, with long names clipped cleanly.
  • Documentation

    • Updated label behavior documentation to describe slug-based naming from the first human prompt.

Co-authored-by: Medulla <medulla@tinyhumans.ai>

@greptile-apps greptile-apps 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.

senamakel has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 37bf64c6-2220-4fe5-9174-4100dbbdb36f

📥 Commits

Reviewing files that changed from the base of the PR and between 335ab90 and 643bcfb.

📒 Files selected for processing (10)
  • src/sdk/src/session_history/README.md
  • src/sdk/src/session_history/summary.rs
  • src/sdk/src/session_history/tests.rs
  • src/sdk/src/session_history/types.rs
  • src/sdk/src/ui/util.rs
  • src/sdk/src/ui/util_tests.rs
  • src/tui/src/ui/app/render/agents/rail/harness_line/layout.rs
  • src/tui/src/ui/app/render/agents/rail/rows.rs
  • src/tui/src/ui/app/render/agents/rail/status_line_tests.rs
  • src/tui/src/ui/app/render/agents/rail/tests.rs
🚧 Files skipped from review as they are similar to previous changes (9)
  • src/tui/src/ui/app/render/agents/rail/status_line_tests.rs
  • src/tui/src/ui/app/render/agents/rail/harness_line/layout.rs
  • src/sdk/src/session_history/types.rs
  • src/sdk/src/ui/util_tests.rs
  • src/sdk/src/session_history/summary.rs
  • src/sdk/src/session_history/tests.rs
  • src/sdk/src/session_history/README.md
  • src/tui/src/ui/app/render/agents/rail/rows.rs
  • src/sdk/src/ui/util.rs

📝 Walkthrough

Walkthrough

Session labels and TUI rail titles now use a shared slug utility. The utility filters words, handles contractions and filler terms, bounds scanning, and limits output. Session-history and rail tests now verify slugged labels and terminal-cell clipping.

Changes

Session slugging

Layer / File(s) Summary
Slug generation contract and implementation
src/sdk/src/ui/util.rs, src/sdk/src/ui/util_tests.rs
Added bounded slug generation with filler-word filtering, fallback behavior, lowercase hyphenated output, contraction handling, and a 48-character limit.
Session history label integration
src/sdk/src/session_history/summary.rs, src/sdk/src/session_history/types.rs, src/sdk/src/session_history/README.md, src/sdk/src/session_history/tests.rs
Session history now derives an optional slug from the first human prompt. Documentation and expectations describe the new label format.
Rail thread and title rendering
src/tui/src/ui/app/render/agents/rail/harness_line/layout.rs, src/tui/src/ui/app/render/agents/rail/rows.rs, src/tui/src/ui/app/render/agents/rail/status_line_tests.rs, src/tui/src/ui/app/render/agents/rail/tests.rs
Rail thread names and session titles now use slugs, omit empty results, and clip output to terminal-cell limits with updated tests.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PromptOrThreadTitle
  participant slug
  participant SessionSummary
  participant RailRenderer
  PromptOrThreadTitle->>slug: prompt or title text
  slug->>SessionSummary: optional session label
  slug->>RailRenderer: normalized rail title
  RailRenderer->>RailRenderer: clip to 48 terminal cells
Loading

Suggested reviewers: sanil-23

Poem

I’m a rabbit with a slug in my ear,
Three neat words hop, crisp and clear.
Filler words fade, odd bytes take flight,
Rail titles fit the screen just right.
Session names now bound and bright.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: using a three-word slug to name sessions.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

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

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8cc717399f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/sdk/src/ui/util.rs Outdated
senamakel and others added 2 commits August 5, 2026 20:13
# Conflicts:
#	src/tui/src/ui/app/render/agents/rail/harness_line/layout.rs
#	src/tui/src/ui/app/render/agents/rail/rows.rs
…e string

Co-authored-by: Medulla <medulla@tinyhumans.ai>

@greptile-apps greptile-apps 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.

senamakel has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@senamakel

Copy link
Copy Markdown
Member Author

Babysitter status: READY_FOR_APPROVAL

Inspected head: ba6f7ca0c830151d557468df2863c2a652684667

Fixes pushed this loop:

  • 767cdb25 — merged main in to resolve the base-branch conflict (agent/vocabulary rename in rows.rs / harness_line/layout.rs collided with this branch's slug wiring; both sides' intent kept — see thread reply below).
  • ba6f7ca0fix(ui): bound slug's scan so an unbounded title cannot walk the whole string, addressing Codex's P2 finding on src/sdk/src/ui/util.rs:230.

Validation: cargo test --locked (full suite, incl. ui::util 18/18), cargo clippy --all-targets -- -D warnings, cargo fmt --check — all pass on the current head.

CI: Rust SDK, Rust SDK (Windows), Vendored core resolution, E2E (docker + tmux + opencode), Coverage (>= 80% lines) — all SUCCESS. CodeRabbit: approved.

Feedback: Codex's scan-bound finding fixed and replied in-thread (resolved). Greptile hit its trial credit limit on both passes (no actual findings to act on). CodeRabbit's first pass was rate-limited, its second pass approved with no comments.

Note for reviewers: vendor/openhuman gitlink is intentionally left at 202b313e (not bumped) — the companion generator-side change is tinyhumansai/openhuman#5412, which is not yet merged.

No unresolved threads, no changes requested. Handing off to pr-approval-reviewer.

… title

openhuman#5412 landed as e29bfc66f, so the gitlink can move off the
pre-merge pin. The core now names a thread in at most three ordinary
words; this crate keeps rendering its own kebab slug for the rails.

Co-authored-by: Medulla <medulla@tinyhumans.ai>

@greptile-apps greptile-apps 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.

senamakel has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 30500fce13

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/sdk/src/ui/util.rs

@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

🤖 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 `@src/tui/src/ui/app/render/agents/rail/rows.rs`:
- Around line 232-239: Update display_session_title to apply the rail’s
48-terminal-cell width limit to the slug result before returning it, preserving
safe Unicode boundaries and existing slug behavior. Add a regression test using
wide Unicode characters such as 界 that verifies the returned title does not
exceed 48 display cells.
🪄 Autofix

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: CHILL

Plan: Pro

Run ID: cf22c56b-d244-4d36-b711-39b43e189b2f

📥 Commits

Reviewing files that changed from the base of the PR and between 09d6096 and 30500fc.

📒 Files selected for processing (11)
  • src/sdk/src/session_history/README.md
  • src/sdk/src/session_history/summary.rs
  • src/sdk/src/session_history/tests.rs
  • src/sdk/src/session_history/types.rs
  • src/sdk/src/ui/util.rs
  • src/sdk/src/ui/util_tests.rs
  • src/tui/src/ui/app/render/agents/rail/harness_line/layout.rs
  • src/tui/src/ui/app/render/agents/rail/rows.rs
  • src/tui/src/ui/app/render/agents/rail/status_line_tests.rs
  • src/tui/src/ui/app/render/agents/rail/tests.rs
  • vendor/openhuman

Comment thread src/tui/src/ui/app/render/agents/rail/rows.rs Outdated
senamakel and others added 10 commits August 6, 2026 16:06
The row rendering now accounts for Unicode character widths when calculating layout, ensuring that multi-byte characters are displayed correctly without breaking alignment.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Session titles are now clipped to a maximum of 48 terminal cells in the agent rail rows, preventing overly long Unicode names from overflowing the row layout. This complements the existing character-based slug truncation by accounting for wide characters that occupy multiple columns.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Session titles are now truncated to fit the rail's width in terminal cells rather than characters, preventing wide characters from overflowing the pane. The clipping preserves whole grapheme sequences and appends an ellipsis when a title is cut short.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a test asserting that session titles made of wide characters are clipped a second time by display width, since the existing slug-based character ceiling does not account for double-width columns.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
The filler word list now includes common contractions like "let's", "I'm", and "you're" to prevent them from appearing in session slugs. Apostrophes are stripped before matching, so contractions are recognized in their letter-only form, ensuring conversational prompts produce cleaner slugs.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Slug generation now drops apostrophes from the source text instead of treating them as word separators, so contractions such as "don't" remain a single word in the resulting slug. The character scan bound is still applied before filtering, preserving the existing limit on work performed.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Apostrophes are now dropped instead of treated as word breaks, so contractions like "don't" remain a single word in session slugs. The documentation also clarifies that the slug length is measured in characters, not terminal cells, so callers rendering into fixed-width columns should clip the result again.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add tests confirming that apostrophes inside contractions are treated as word breaks without leaving orphaned letters behind, and that typographic apostrophes behave the same way.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
…record

The merge of main recorded vendor/openhuman at e29bfc66, which neither
parent points at: main and this branch both record 202b313e. The stray
bump paired the newer core with the older tinyagents this tree vendors,
and openhuman then failed to compile under --all-targets.

Bumping the embedded core is its own change, and independent of this
one: the slugging here shapes whatever title arrives, whether or not
the core names threads in three words itself.

Co-authored-by: Medulla <medulla@tinyhumans.ai>

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

.map(|title| display_session_title(&title))

P2 Badge Filter empty slugs from agent-lane titles

When a running harness advertises a punctuation/control-only title such as "---", display_session_title now returns an empty string, but this map still resolves the task as Some(""). The lane consequently renders a dangling ·, and if this is the newest running task it also masks an older task with a meaningful title. Filter the displayed title when it is empty, as the status-line path already does.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@senamakel senamakel self-assigned this Aug 6, 2026
senamakel and others added 2 commits August 6, 2026 18:57
Session titles that consist only of punctuation, such as "---", slugify to an empty string. Treating these as valid titles caused a dangling separator to be rendered and, because the newest running task takes precedence, could hide a real title from an older task. The title is now filtered out when empty.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
The session title rendering now delegates to the existing `lane_title` helper, which already handles the edge case where a title of pure punctuation slugs to an empty string. This avoids rendering a dangling separator and prevents an older task's real title from being hidden when the newest running task has no meaningful title.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
senamakel and others added 6 commits August 6, 2026 18:58
The thread name was previously converted to a string slice before being passed to the lane title function, which caused a borrow conflict. Now the closure borrows the title directly, avoiding the temporary dereference and fixing the compilation error.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Added a helper that filters out empty or punctuation-only harness titles before rendering rail rows, preventing dangling separators and ensuring older tasks with meaningful titles are not hidden by newer empty ones.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add the missing `lane_title` import to the rail rendering tests so the test module can reference it, aligning the imports with the current code structure.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a test asserting that titles which slug to nothing, such as punctuation-only or control-character strings, are not treated as lane titles. This prevents a dangling separator from being rendered and avoids masking older tasks that do have real titles.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test previously asserted that all-filler input like "okay so the" produces no lane title, but the slugging logic actually generates a stable, non-empty slug for such input. The assertion now expects the generated slug to be returned, reflecting the actual behavior where filler text still yields a usable lane title.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test for lane titles that slug to nothing now includes empty strings and whitespace with escape sequences, and clarifies that escape sequences alone still produce a slug from any alphanumeric content. This tightens the coverage around the edge cases that previously left the dangling separator behavior under-tested.

Co-authored-by: Medulla <medulla@tinyhumans.ai>

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@senamakel

Copy link
Copy Markdown
Member Author

Babysitter status: READY_FOR_APPROVAL

Inspected head: 94193153 (was 11cafb47).

Feedback worked this pass

Codex's P2 on src/tui/src/ui/app/render/agents/rail/rows.rs#L235"Filter empty slugs from agent-lane titles" — is valid and fixed. A punctuation-only harness title such as "---" slugs to the empty string; the lane's map still resolved it as Some(""), so the row rendered a dangling · and, because the newest running task wins running_session_title's max_by_key, an empty title from the newest task masked an older task's real one. The session-history path (first_prompt_text) already dropped empty slugs; the rail did not.

Rather than bury the rule in a closure, the fix names it as a seam so it is testable — the rail resolver now goes through lane_title:

pub(super) fn lane_title(title: &str) -> Option<String> {
    let displayed = display_session_title(title);
    (!displayed.is_empty()).then_some(displayed)
}

Regression test a_title_that_slugs_to_nothing_is_not_a_lane_title covers it. Two cases are deliberately not None, and the test pins both:

  • all-filler input ("okay so the") still yields okay-so-theslug falls back to the first words by design, so those lanes keep a name;
  • an escape sequence ("\u{1b}[2J") yields 2j — the control bytes are stripped and the alphanumerics survive, which is the safe outcome, not an empty title.

Validation on 94193153: cargo test --locked -p medulla-tui (1023 passed, 0 failed), cargo test --locked -p medulla --lib ui::util (19/19), cargo clippy --all-targets -- -D warnings, cargo fmt --check — all clean.

One caveat, not caused by this PR: three attribution::tests::hook_behavior tests fail on my local machine (repository_own_hook_still_runs, other_repository_hooks_still_run, a_failing_repository_hook_still_blocks_the_commit). They fail identically with and without this change, this PR touches no attribution code, and CI's Rust SDK job — which runs the same suite — is green. It reproduces against local git 2.53.0 and looks like a hook-chaining difference from CI's git, so I've left it alone rather than adjust an unrelated test to suit one machine. Worth a separate look.

CI on the previous head: Rust SDK, Rust SDK (Windows), Vendored core resolution, E2E (docker + tmux + opencode), Coverage (>= 80% lines) all pass; CodeRabbit approved. Re-running against 94193153 now.

No unresolved review threads and no changes-requested verdicts. Greptile's trial has expired, so its "reviews" on this PR carry no findings.

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@senamakel

Copy link
Copy Markdown
Member Author

Babysitter status: WAITING_ON_CI — blocked on a GitHub Actions runner outage, not on this PR.

Inspected head: 643bcfbe (was 94193153).

Review board: zero. No unresolved threads, no changes-requested verdicts. Nothing new arrived this pass — Greptile's trial has expired so its "reviews" carry no findings, and CodeRabbit's latest run posted no comments. Codex's P2 on rows.rs#L235 was fixed and resolved on the previous pass.

Pushed this pass

  • 643bcfbe — merged main in. This branch was ~180 files behind (the tiny.place removal, the contacts module deletion, the agent/vocabulary rename, the roster test split). The merge is clean; the only overlap with this branch's slug wiring is in rows.rs / harness_line/layout.rs, already reconciled on the earlier pass.

The three failing checks were infrastructure, not code. Rust SDK, Coverage, and E2E all failed at exactly 15m02s on run 31120337054 with:

The job was not acquired by Runner of type hosted even after multiple attempts

That is org-wide right now, not specific to this PR — the CI run for main itself (31125641878, commit 335ab903) fails the same three Linux jobs with the same annotation, while Windows and Coverage pass on whichever runners are available. The last run that actually got runners on this branch (31110433024, head 11cafb47) was green across the board. I pushed the merge commit to retrigger; as of writing GitHub has not yet created a run for 643bcfbe and the prior run is stuck queued, so the scheduling backlog is still draining.

Local validation on 643bcfbe (the merged tree, not the old head):

  • cargo fmt --check — clean
  • cargo clippy --all-targets -- -D warnings — clean
  • cargo test --locked --no-fail-fast2350 passed, plus every integration binary green (1001 in the TUI suite, 97, 88, …)

Correcting my own note from last pass. I previously reported three attribution::tests::hook_behavior failures as a git-2.53 hook-chaining quirk. That diagnosis was wrong. The real cause is my sandbox: the local auto-commit hook exports core.hooksPath into the agent's shell via GIT_CONFIG_PARAMETERS / GIT_CONFIG_KEY_n, which overrides the per-test scratch repos' own .git/hooks, so the hooks those tests assert on never fire. Clearing every injected variable and re-running gives 16/16 passing. Nothing is wrong with the tests or with git — and nothing to do in this PR, which touches no attribution code.

Outstanding: only a green CI run. No code or review work remains.

The push of 643bcfb never produced a GitHub Actions workflow run: every
other app created a check suite for that commit, github-actions did not.
With no Rust SDK / Rust SDK (Windows) / E2E check present the ruleset
cannot be satisfied, so the PR sits BLOCKED on absent checks rather than
failing ones. This empty commit re-fires the synchronize event; it is
squashed away on merge.

Co-authored-by: Medulla <medulla@tinyhumans.ai>

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@senamakel senamakel closed this Aug 6, 2026
@senamakel senamakel reopened this Aug 6, 2026

@greptile-apps greptile-apps 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@senamakel
senamakel merged commit 1fc0d64 into main Aug 6, 2026
1 check passed
@senamakel

Copy link
Copy Markdown
Member Author

Babysitter status: WAITING_ON_CI — blocked on GitHub Actions, not on this PR.

Inspected head: 847009ec (unchanged this pass — no code changes were needed).

Review board: zero. pr-comments 197 returns 0 unresolved threads and pr-review-resolve 197 --list returns 0 reviews requesting changes. Nothing new arrived this pass: Greptile's trial has expired so its "reviews" carry no findings, CodeRabbit's latest run posted no comments, and Codex's two P2s (ui/util.rs scan bound, rows.rs#L235 empty-slug filter) were fixed and resolved on earlier passes. No findings were declined this pass because none were open.

Why the merge is still BLOCKED. The main ruleset requires three status checks — Rust SDK, Rust SDK (Windows), E2E (docker + tmux + opencode) — all from the github-actions app. None of them are failing; they are absent. GitHub Actions has created no workflow run at all for the last two pushes:

  • gh api .../actions/runs?head_sha=847009ectotal_count: 0
  • same for 643bcfbe
  • check suites exist on both commits for vercel, cursor, coderabbitai, digitalocean, sentry, claude and greptile — every app except github-actions

This is server-side, not branch-specific. The prior run on this branch (31120337054, head 94193153) is wedged in an inconsistent state: it lists as queued after 1h+, gh run cancel rejects it as "completed", and DELETE returns 403. The push run for main itself (31125641878) has been queued for over two hours, and runs on unrelated branches (codex-app-server, workflow-mcp-run-tools) are stuck the same way. No run has been created anywhere in this repo since 19:58 UTC.

What I tried, short of churning the diff: cancelling and then deleting the wedged run (both refused by the API), and closing/reopening the PR to re-fire the pull_request event. The reopen produced no run either — I watched the head SHA for a further 20 minutes. I did not push another empty retrigger commit; last pass's 847009ec already was one and it produced nothing, so more of them would only add noise to the squash.

Local validation on 847009ec (the exact head on the PR):

  • cargo fmt --check — clean
  • cargo clippy --all-targets -- -D warnings — clean
  • cargo test --locked --no-fail-fast — every unit, feature and e2e binary green, plus doc-tests

One honest caveat on that test run: the first invocation reported -p medulla --lib as failed. That is the local auto-commit hook injecting core.hooksPath into the agent shell via GIT_CONFIG_*, which overrides the scratch repos the attribution::tests::hook_behavior tests build — the same sandbox artifact I documented last pass, not a regression. Re-running the lib target with those variables scrubbed gives 2353 passed, 0 failed. This PR touches no attribution code.

Outstanding: a GitHub Actions run that actually gets scheduled. There is no code or review work left.

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