Skip to content

feat(chat): suggest fresh threads for independent drafts - #55

Merged
ScriptedAlchemy merged 10 commits into
mainfrom
feat/thread-split-evaluation
Nov 4, 2026
Merged

ScriptedAlchemy merged 10 commits into
mainfrom
feat/thread-split-evaluation

Conversation

@ScriptedAlchemy

@ScriptedAlchemy ScriptedAlchemy commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner

A fresh task can inherit a long thread's context even when it needs none of that work. This draft adds an opt-in, passive suggestion beside a text-only draft on web/desktop and mobile. Choosing it opens a fresh thread with the draft; nothing is automatically split or sent. Dismissal and concurrent edits preserve the current draft.

Settings → Labs enables suggestions per environment. Web/desktop configures a loopback Jev-compatible endpoint serving pplx-decider-flash-v 1.2; mobile uses that environment's configuration. T 3 does not download models or start a model server. The server checks permissions and eligibility, serializes inference, and abstains on invalid/truncated responses, stale history, errors or timeout. Remote clients call their connected T 3 server.

The expanded evaluation does not establish useful recall. It contains 194 app-attributed human follow-ups across 24 threads and five provider configurations. DeepSeek and Opus independently labeled every case; GPT-6.1 Sol adjudicated 13 disagreements. Whole ancestry groups reserve 54 held-out cases, with 140 development/calibration cases. Private transcripts remain outside the repository.

At the shipped 0.94 threshold, the baseline produced zero held-out suggestions. Of 23 eligible cases, it missed the one actionable new task and falsely flagged none of 21 negatives; one label remained uncertain. Two additional new tasks were excluded by production gates. Zero false positives on 21 negatives has a 95% Wilson upper bound of 15.5%, even assuming independent checkpoints. No near-perfect accuracy claim is supported.

Replay through the actual production service, reconstructed projections and real local HTTP inference confirmed zero suggestions across 54 cases:23 HTTP requests,31 exclusions, no state mismatches or observed failures. Sequential service latency was 494 ms median and 885 ms p 95. This does not reproduce historical settings, authenticated RPC, or client typing behavior. Three fixed prompts were scored on calibration; only 23 eligible negatives were available, below the predeclared 100-negative requirement, so no tuned candidate qualified. The prompt and threshold remain unchanged.

Validation: vp run check:changed passes on the rebased change, and all six focused Python tests pass. The service replay harness also passes 28 synthetic gate/response/timeout scenarios. The committed evaluator checks session-group separation, frozen labels/sources/model identities, calibration-only selection and explicit coverage denominators.

Interactive verification remains incomplete: the T 3 Browser panel opened, but snapshot/evaluate repeatedly timed out after 15 seconds; agent device access was disabled. No UI screenshots or native device pass are claimed. Keep this PR draft: useful recall and integrated client verification remain unproven. Automatic splitting and default-on rollout are outside scope.

Implementation and evaluation: GPT-6 Astra through Codex in T 3 Code; independent labeling/review by DeepSeek V 4.1 Flash via OpenCode, Claude Opus 5.5, and GPT-6.1 Sol medium via Devin.

@changeset-bot

changeset-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: a412d2e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@ScriptedAlchemy ScriptedAlchemy changed the title feat(evals): evaluate independent thread suggestions feat(chat): suggest fresh threads for independent drafts Nov 3, 2026
ScriptedAlchemy and others added 8 commits November 3, 2026 14:07
Most real user messages carry a context object with zero records, and the
suggestion service treated any context object as a reason to abstain, so
most threads could never receive a suggestion. Abstain only when a prior
message actually references context records.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…raft is edited

Dismissal was keyed to the exact draft text, so continuing to type the same
draft requested inference again and brought the suggestion back. Dismissal
now holds until the draft is sent or cleared, on web and mobile. Mobile also
skips requests when the environment has no decision endpoint, matching web.
The user guide names the setting as the UI labels it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…unts

The composer remounts when switching threads or restoring a persisted
draft, which reset dismissal to false and brought the suggestion back
for a draft the user already declined. Hold dismissal in a per-thread
set so it survives remounts until the draft is sent or cleared, on web
and mobile.

Co-Authored-By: SWE-2 High <noreply@cognition.ai>
Running the thread-split unittest leaves evals/thread-split/__pycache__
untracked; ignore it alongside eval run output.

Co-Authored-By: SWE-2 High <noreply@cognition.ai>
…luation

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ScriptedAlchemy
ScriptedAlchemy marked this pull request as ready for review November 4, 2026 10:58
@ScriptedAlchemy
ScriptedAlchemy merged commit c5f3419 into main Nov 4, 2026
16 checks passed
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