Phase 5: voice consistency pass
Tier-1 voice-consistency pass: whole-document LLM review surfacing passages that read tonally out of place (formal/over-polished/paraphrased-too-closely), as honey-decorated `voice` flags with no correction (awareness-only). - internal/llm/voice.go: RunVoice sends the whole document (no TruncateDoc), MaxTokens 2048, 20s per-doc floor (VoiceInterval). Standalone voice prompt in prompts.go (not bundled with the grammar checkpoint, per spec). - internal/suggestions: POST /api/docs/:id/voice. replacePending is now family-scoped (pendingScope) so grammar and voice never clobber each other's pending flags; both passes return the unified pending set. check/voice share one runPass helper. TestVoicePassCoexists covers both directions. - Frontend: api.voiceDoc, useCheckpoint voicing/runVoice, honey "Check my voice" toolbar pill, breathing honey dot in StatusBar. Claude-Session: https://claude.ai/code/session_016Yr6jELuRc7hyzYLccQKZd
This commit is contained in:
@@ -41,7 +41,7 @@ func TestAskPetalChat(t *testing.T) {
|
||||
checkpoint: `{"suggestions":[{"original":"I has","replacement":"I have","explanation":"subject-verb agreement","type":"grammar"}]}`,
|
||||
tokens: []string{"Because ", "\"I\" ", "takes ", "\"have\"."},
|
||||
}
|
||||
srv, docID := newTestServer(t, client)
|
||||
srv, docID, _ := newTestServer(t, client)
|
||||
|
||||
// Seed one suggestion via the checkpoint route, then grab its id.
|
||||
do(t, srv, http.MethodPost, "/docs/"+docID+"/check", "")
|
||||
@@ -102,7 +102,7 @@ func TestAskPetalChat(t *testing.T) {
|
||||
|
||||
func TestAskPetalChatNotFound(t *testing.T) {
|
||||
client := &streamClient{checkpoint: `{"suggestions":[]}`}
|
||||
srv, _ := newTestServer(t, client)
|
||||
srv, _, _ := newTestServer(t, client)
|
||||
rec := do(t, srv, http.MethodPost, "/suggestions/does-not-exist/chat",
|
||||
`{"messages":[{"role":"user","content":"hi"}]}`)
|
||||
if rec.Code != http.StatusNotFound {
|
||||
|
||||
Reference in New Issue
Block a user