Echo: retire legacy interactions prototype and drop provider prompt: sugar (Slice 6) - #1654
Conversation
QA Evidence Report — ready-for-human-mergeBranch: Slice cap: 11 files, +63/-175 (238 lines) — within ≤15 files / ≤600 lines. CI jobs reproduced (all on PR head)
Note on audits: run bare, bundler-audit/ruby-audit surface Affected-flow checks (independent repro)
Affected-flow spec bundle (interactions request + provider + session specs): Findings
Verdictready-for-human-merge |
7f771a6 to
c4956d2
Compare
1858e27 to
b61be9b
Compare
c4956d2 to
7f70e30
Compare
b61be9b to
bed38e9
Compare
7f70e30 to
5f5bdbb
Compare
bed38e9 to
c231749
Compare
5f5bdbb to
38e257e
Compare
c231749 to
565bf02
Compare
38e257e to
ccdf987
Compare
565bf02 to
b98aeac
Compare
0d6449c to
abb836f
Compare
b98aeac to
374cf22
Compare
SEC-514 — PR #1655 code-review fixes (Slice 6:
|
abb836f to
83fb1a9
Compare
a44e5e2 to
f644293
Compare
QA Evidence Report — send-backBranch: CI jobs reproduced (
|
| Job | Command | Exit | Duration | Output snippet |
|---|---|---|---|---|
| bundler-audit | bundle exec bundler-audit --update --ignore CVE-2024-21510 CVE-2025-61921 CVE-2026-38969 |
1 ❌ | 1.2s | loofah (2.25.1) GHSA-9wjq-cp2p-hrgf + rails-html-sanitizer (1.6.2) GHSA-cj75-f6xr-r4g7 → Vulnerabilities found! |
| ruby-audit | ruby-audit update && ruby-audit check --ignore CVE-2025-61594 CVE-2025-58767 CVE-2026-41316 |
0 ✅ | — | No vulnerabilities found |
| brakeman | bundle exec brakeman -q -w2 |
0 ✅ | 4.4s | No warnings found |
| rubocop-ci | bin/rubocop-ci develop false |
0 ✅ | — | Clean code — 9 changed files, 0 offenses (also slice-level direct lint vs 5b: 9 files, 0 offenses) |
| rspec (echo engine, non-feature) | bundle exec rspec engines/dradis-echo/spec --exclude-pattern "**/features/**" |
0 ✅ | 16.7s | 197 examples, 0 failures |
Affected-flow checks
- Cascade integrity — 7 designer commits (
648f591c1…09995d236) all ancestors off644293d2✅; retire's own 3 commits (4734a95af/79de2140a/f644293d2) replay on top ✅ - Dual intent (legacy removed + redesign intact) —
interactions_controller.rbnow exposes only#index(legacy#show/#creategone);interaction_job.rbdeleted; redesigned index intact (@sessions = Session.for_record(@record).order(updated_at: :desc)) ✅ - Slice cap Echo: retire legacy interactions prototype and drop provider prompt: sugar (Slice 6) #1654 (retire vs 5b) — 11 files, 51+/185− = 236 lines ✅ (≤15 / ≤600)
NOT run (environment gaps — coverage the CTO in-browser pass must still cover)
- Selenium feature specs (
sessions_spec,sessions_conversation_spec,providers_spec= 10 examples) — no Firefox/geckodriver in either Coder's or QA's box. - Pro-schema engine specs — this is the CE box.
Findings
- BLOCKER — bundler-audit CI job fails. The branch's
Gemfile.lockcarriesloofah 2.25.1+rails-html-sanitizer 1.6.2, which are vulnerable (GHSA-9wjq-cp2p-hrgf, GHSA-cj75-f6xr-r4g7).origin/developalready bumped these toloofah 2.25.2/rails-html-sanitizer 1.7.1to fix exactly these advisories. The branch is behind develop — merge-base(retire, develop) =7fa72106c, develop tip =3eaead603— so it never picked up the bump.- Proof of attribution (isolated, same ignore list):
origin/develop's exact lock → bundler-audit EXIT 0 "No vulnerabilities found"; this branch's lock → EXIT 1 "Vulnerabilities found!". The branch is the sole cause; not an environment/audit-DB false alarm. - Impact: Echo Sessions: full feature #1655 →
develop. As-is, the branch's push CI is red, and merging would regress develop's security posture (downgrade both gems). This is a hard pre-merge blocker. - Fix (Coder): bring the Echo stack up to develop's gems — rebase the stack on current
develop(preferred), or bumpGemfile+Gemfile.locktoloofah 2.25.2/rails-html-sanitizer 1.7.1. This is stack-wide staleness (the whole 5a/5b/retire base predates the bump), so coordinate the rebase/freeze with the CTO before force-pushing.
- Proof of attribution (isolated, same ignore list):
Verdict
send-back-with-findings — the cascade mechanics are correct (commits present, dual intent verified, engine specs/rubocop/brakeman/ruby-audit all green), but the branch fails the bundler-audit CI job because it is behind develop's loofah/rails-html-sanitizer security bump. Fix the Gemfile.lock staleness (rebase on develop) and re-request QA. Prior verdict remains void.
QA re-verify — PASS on
|
| Check | Result |
|---|---|
bundler-audit (CI ignore list CVE-2024-21510 CVE-2025-61921 CVE-2026-38969) |
✅ EXIT 0, "No vulnerabilities found" |
| lock versions | ✅ loofah 2.25.2, rails-html-sanitizer 1.7.1; Gemfile ~> 1.7.1 |
| echo engine specs (non-feature, bumped gems) | ✅ 197 examples, 0 failures |
| 7 designer + retire's 3 commits ancestors of tip | ✅ all 10 present |
| Slice cap #1654 (retire vs 5b) | ✅ 14 files, 57+/191− = 248 lines (≤15 / ≤600; +3 files are the bump's CHANGELOG/Gemfile/lock) |
Still not runnable in either box → CTO's in-browser pass covers these
- Selenium feature specs (
sessions_spec,sessions_conversation_spec,providers_spec) — no Firefox/geckodriver. - Pro-schema engine specs — QA box is CE.
Verdict
PASS on the full automated scope I can run. bundler-audit blocker is cleared. Handing to CTO for the in-browser two-column UI pass + go-signal (which also covers the Selenium/Pro-schema gaps).
QA Evidence Report — ready-for-human-mergeBranch: Slice cap8 files changed, 72 LOC — within the ≤15-file / ≤600-LOC cap. Spec-only, style-only → no CHANGELOG required. ✅ CI jobs reproduced (independent, on Coder's branch)
CI base note (why the lint job is green)CI triggers on Affected-flow checks
Findings
Verdictready-for-human-merge — SEC-536's scoped deliverable (Style/BlockDelimiters = 0 in |
4b4a48d to
9e49c1a
Compare
5006340 to
61da461
Compare
QA Evidence Report — ready-for-human-mergeBranch: CI jobs reproduced
Note on the CI command: CI runs the Scope / slice cap
Affected-flow checks
Findings
Verdictready-for-human-merge Independently reproduced on a clean worktree pinned to Handing to CTO for the go-signal. |
9e49c1a to
f67f9dd
Compare
61da461 to
c94dd5c
Compare
f67f9dd to
9a7c1e6
Compare
c94dd5c to
d626fd8
Compare
9a7c1e6 to
e3925a8
Compare
d626fd8 to
382f4ff
Compare
e3925a8 to
52cc86b
Compare
382f4ff to
db6b1b3
Compare
52cc86b to
7a148cb
Compare
db6b1b3 to
974d9bb
Compare
Slice 5 repurposed InteractionsController#index/#preview into the sessions landing, leaving #create/#show and InteractionJob as the last remnants of the Roslin one-shot prototype. Remove them now that ReplyJob-backed sessions are live, so the record panel keeps only the sessions entry point.
The prompt: sugar and resolve_messages existed solely for the one-shot InteractionJob path, which is now gone. ReplyJob already calls generate(messages:), so drop the single-string convenience and require a multi-turn messages array everywhere.
Applies PR #1655 review findings on the retire slice: - check_turbo_config (#10): interactions_controller now uses the shared TurboConfigCheck concern instead of its own Redis-pinging copy, so non-Redis adapters no-op silently. - Blank type (nit): set_record raises RecordNotFound when @type is blank so an unknown/missing type returns 404 instead of a 500 from send('').pluralize, mirroring SessionsController#set_record. - set_prompt (nit): scope the preview prompt lookup through .for(@type) like sessions#create, honouring the Prompt::SCOPES whitelist. The conversations N+1 fix (includes(:user) + grouped counts) is carried up from the views slice and remains applied to interactions#index here.
Pre-existing Style/BlockDelimiters offenses across Echo spec files that would break CI once this stack merges onto develop (where the cop is enabled). Spec-only, parse-equivalent delimiter change.
dff3b57 to
232a0ab
Compare
974d9bb to
265142e
Compare
Summary
Final PR (7th) of the Echo Sessions merge train. Retires the legacy Roslin
one-shot interaction prototype now that the ReplyJob-backed sessions UI is live
(Slices 3–5), and drops the provider
prompt:sugar that only existed to serveit.
Stacked on
echo/add-session-stimulus(Slice 5b, #1653) — merge after Slice 5bso the sessions replacement is on
developbefore the legacy path is removed.Removed (legacy Roslin one-shot path):
Projects::InteractionsController#createand#show(their views were alreadyremoved by Slice 5;
#showwas orphaned). Pruned the now-deadbefore_actionfilters —
set_promptruns on:previewonly;set_recordruns on everysurviving action.
resources :interactionsnowonly: [:index], keepingpreviewas themember route.
Dradis::Plugins::Echo::InteractionJob+ its spec.prompt:sugar and#resolve_messagesfromprovider.rb,http_streaming.rb,ollama.rb(+ specs).#generatenow takesmessages:only.
ReplyJobalready callsgenerate(messages:), so this is safe. Updatedthe
http_streaming.rbdoc comment that referencedInteractionJob.Kept (this is the new UI, not legacy):
InteractionsController#index/#preview, theinteractions/*views, and the Echo tab wiring.SEC-498 · Milestone: SEC-469
Testing steps
existing conversations) still loads.
POST/GET :idinteraction routes no longer resolve.path, unchanged).
Automated coverage: new
spec/requests/.../projects/interactions_spec.rbassertsthe panel loads and the
create/showroutes are gone; provider specs updated tomessages:-only.Other Information
-w2, andzeitwerk:checkall clean.Check List
develop)