Ask bounded private questions from selected card evidence - #2885
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Independent bounded Luna review: no HIGH/CRITICAL blocker in selected-source access, before/after freshness, output bounds, shared quota or private queue/UI identity boundaries. Two MEDIUM follow-ups retained under #2808: close the final-read/save evidence interval with commit-time fencing, and handle quota settlement storage exceptions without masking completion. The API-only service registration fix is proven by21 API/insight/MCP cases including all three initial full-run failures; final14 frontend cases and the synthetic real-provider-transport browser journey pass. No live-provider usefulness claim. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 19edf4042e
ℹ️ 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".
| var rule = WorkspaceObservationContract.RulePrefix + candidate.Kind; | ||
| var existing = items.SingleOrDefault(x => x.Rule == rule && x.TargetKey == dto.CardId.ToString()); | ||
| // Stable category + card identity collapses paraphrases and preserves user decisions. | ||
| if (existing is { State: "dismissed" or "muted" or "snoozed" }) continue; |
There was a problem hiding this comment.
Stop suppressing expired snoozes
When a previously snoozed model question reaches SnoozeUntil while the page remains open, this unconditional branch still suppresses that category. The provider call and quota settlement have already occurred before this check, so the first post-expiry analysis consumes budget but saves nothing; only the subsequent insights refresh transitions the stale row out of snoozed, requiring another paid analysis. Check whether the snooze is still active, or revalidate persisted insights before dispatch.
Useful? React with 👍 / 👎.
| const answerStatus = ref<MemoryStatus>('statement') | ||
| const answerError = ref<string | null>(null) | ||
| const { leaveRequested, decide } = useUnsavedWorkspaceNavigation(() => Boolean(answeringInsightId.value && answerText.value.trim()) || busyInsightIds.value.size > 0) | ||
| const { leaveRequested, decide } = useUnsavedWorkspaceNavigation(() => Boolean(answeringInsightId.value && answerText.value.trim()) || busyInsightIds.value.size > 0 || modelBusy.value) |
There was a problem hiding this comment.
Keep navigation disabled during model analysis
When navigation is attempted while generateObservations is pending, this new predicate opens the leave dialog, but its “Discard answer and leave” button is disabled only for busyInsightIds, not modelBusy. The user can therefore leave while the uncancelled POST may still save private questions server-side, despite a dialog that only describes discarding an answer; include modelBusy in the dialog's disabled and busy-specific presentation, as the analogous sending flows do.
AGENTS.md reference: frontend/AGENTS.md:L5-L5
Useful? React with 👍 / 👎.
Quiet insights can now preview one selected card and explicitly ask the configured model for up to three private questions. Each saved question keeps an exact quote, source fingerprint and provider attribution. Questions expire when evidence changes or after one day; dismissals, muted categories, snoozes and retained statement answers survive repeated analysis. The board is not changed.
The request shares the user's Chat quota and kill switch, rechecks active access and the fingerprint before/after model completion, and rejects unsupported or ungrounded output as a whole batch. The UI preserves identity boundaries, disables overlapping operations, requires a new preview after uncertain completion and never automatically retries the model call. The model service is registered only by API model setup, leaving CLI/MCP host startup independent.
Continues #2808; stacked on #2866. Classic, Studio, Companion and Unified share the same question queue. This is an experimental explicit question producer, not full Context Fabric semantic-candidate processing, recall or automatic attention. The documented usefulness corpus supports future live-provider evaluation; no live-model quality score is claimed.
Validation:
One bounded independent Luna review found no HIGH/CRITICAL defect. Two MEDIUM limits remain tracked under #2808: commit-time evidence fencing between the final read and save, and graceful handling of quota-settlement storage failures. The next insights read invalidates stale evidence; an uncertain response requires refresh. Exact-head hosted CI remains required before merge. Existing OUTSTANDING_TASKS.md publisher, deployment, physical-device, provider/dogfooding and other owner decisions remain open.