UAT: TUI permission widgets (PermissionQuestionWidget, PermissionsScreen) not integrated into app compose() — never shown to user #6445

Open
opened 2026-04-09 21:04:05 +00:00 by HAL9000 · 1 comment
Owner

Bug Report

Spec Reference

Specification lines 29668–29734 (Permissions Screen), lines 29709–29734 (Inline Permission Question Widget)

Expected Behavior (from spec)

When a tool requests permission to modify resources:

  • Single-file operationsPermissionQuestionWidget rendered inline in the conversation stream
  • Multi-file operationsPermissionsScreen pushed directly (no inline widget)

The PermissionQuestionWidget should:

  • Show the actor name, requested operation type, target file path, inline diff
  • Support keyboard shortcuts: a (allow once), A (allow always), r (reject once), R (reject always), v (open full screen), up/down (navigate), enter (confirm)
  • Emit a PermissionDecisionEvent when a decision is made

Actual Behavior (from code analysis)

Both PermissionQuestionWidget and PermissionsScreen are implemented in:

  • src/cleveragents/tui/widgets/permission_question.pyPermissionQuestionWidget (250 lines)
  • src/cleveragents/tui/permissions/screen.pyPermissionsScreen (254 lines)

However, neither widget is imported or used in app.py:

src/cleveragents/tui/app.py imports (lines 1–23):

from cleveragents.tui.widgets.actor_selection_overlay import ActorSelectionOverlay
from cleveragents.tui.widgets.help_panel_overlay import HelpPanelOverlay, resolve_help_context
from cleveragents.tui.widgets.persona_bar import PersonaBar
from cleveragents.tui.widgets.prompt import PromptInput
from cleveragents.tui.widgets.reference_picker import ReferencePickerOverlay
from cleveragents.tui.widgets.slash_command_overlay import SlashCommandOverlay

PermissionQuestionWidget and PermissionsScreen are NOT imported. The compose() method (lines 109–121) does not yield either widget. There is no permission request handling logic in on_input_submitted() or any other event handler.

Code Location

  • src/cleveragents/tui/app.py — imports (lines 1–23), compose() (lines 109–121)
  • src/cleveragents/tui/widgets/permission_question.py — implemented but unused
  • src/cleveragents/tui/permissions/screen.py — implemented but unused

Steps to Reproduce (Code Analysis)

  1. Read src/cleveragents/tui/app.py lines 1–23 (imports)
  2. Observe: PermissionQuestionWidget and PermissionsScreen not imported
  3. Read compose() lines 109–121
  4. Observe: neither widget yielded
  5. Compare with spec lines 29709–29734

Severity

High — permission handling is a security-critical feature. Without it, the TUI cannot ask users to approve or reject tool operations that modify files.


Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: uat-tester

## Bug Report ### Spec Reference Specification lines 29668–29734 (Permissions Screen), lines 29709–29734 (Inline Permission Question Widget) ### Expected Behavior (from spec) When a tool requests permission to modify resources: - **Single-file operations** → `PermissionQuestionWidget` rendered inline in the conversation stream - **Multi-file operations** → `PermissionsScreen` pushed directly (no inline widget) The `PermissionQuestionWidget` should: - Show the actor name, requested operation type, target file path, inline diff - Support keyboard shortcuts: `a` (allow once), `A` (allow always), `r` (reject once), `R` (reject always), `v` (open full screen), `up`/`down` (navigate), `enter` (confirm) - Emit a `PermissionDecisionEvent` when a decision is made ### Actual Behavior (from code analysis) Both `PermissionQuestionWidget` and `PermissionsScreen` are implemented in: - `src/cleveragents/tui/widgets/permission_question.py` — `PermissionQuestionWidget` (250 lines) - `src/cleveragents/tui/permissions/screen.py` — `PermissionsScreen` (254 lines) However, **neither widget is imported or used in `app.py`**: `src/cleveragents/tui/app.py` imports (lines 1–23): ```python from cleveragents.tui.widgets.actor_selection_overlay import ActorSelectionOverlay from cleveragents.tui.widgets.help_panel_overlay import HelpPanelOverlay, resolve_help_context from cleveragents.tui.widgets.persona_bar import PersonaBar from cleveragents.tui.widgets.prompt import PromptInput from cleveragents.tui.widgets.reference_picker import ReferencePickerOverlay from cleveragents.tui.widgets.slash_command_overlay import SlashCommandOverlay ``` `PermissionQuestionWidget` and `PermissionsScreen` are NOT imported. The `compose()` method (lines 109–121) does not yield either widget. There is no permission request handling logic in `on_input_submitted()` or any other event handler. ### Code Location - `src/cleveragents/tui/app.py` — imports (lines 1–23), compose() (lines 109–121) - `src/cleveragents/tui/widgets/permission_question.py` — implemented but unused - `src/cleveragents/tui/permissions/screen.py` — implemented but unused ### Steps to Reproduce (Code Analysis) 1. Read `src/cleveragents/tui/app.py` lines 1–23 (imports) 2. Observe: `PermissionQuestionWidget` and `PermissionsScreen` not imported 3. Read `compose()` lines 109–121 4. Observe: neither widget yielded 5. Compare with spec lines 29709–29734 ### Severity High — permission handling is a security-critical feature. Without it, the TUI cannot ask users to approve or reject tool operations that modify files. --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: uat-tester
Author
Owner

Summary of transitions for issue #6445:

  1. Transition: State/Unverified -> State/Verified
  • Removed: State/Unverified
  • Added: State/Verified
  • Current labels: Priority/High, State/Verified, Type/Bug
  • Precondition checks: none
  • PRs updated: none
  1. Transition: State/Verified -> State/In Progress
  • Removed: State/Verified
  • Added: State/In Progress
  • Blocked: not present
  • Current labels: Priority/High, State/In Progress, Type/Bug
  • PR synchronization: No associated PRs found; if any PRs exist referencing this issue, we will synchronize their State/ labels and post comments per policy in a separate step.

Preconditions: None failed.

Notes:

  • This update uses the Forgejo label-manager to enforce consistent labeling; labels are organization-level; no new labels were created.
  • When transitioning to In Progress, if a Blocked label had existed, it would have been removed prior to the transition.

Next steps: PR state synchronization will be performed if there are PRs referencing this issue; results will be reported here.


Automated by CleverAgents Bot
Supervisor: Implementation | Agent: issue-state-updater

Summary of transitions for issue #6445: 1) Transition: State/Unverified -> State/Verified - Removed: State/Unverified - Added: State/Verified - Current labels: Priority/High, State/Verified, Type/Bug - Precondition checks: none - PRs updated: none 2) Transition: State/Verified -> State/In Progress - Removed: State/Verified - Added: State/In Progress - Blocked: not present - Current labels: Priority/High, State/In Progress, Type/Bug - PR synchronization: No associated PRs found; if any PRs exist referencing this issue, we will synchronize their State/ labels and post comments per policy in a separate step. Preconditions: None failed. Notes: - This update uses the Forgejo label-manager to enforce consistent labeling; labels are organization-level; no new labels were created. - When transitioning to In Progress, if a Blocked label had existed, it would have been removed prior to the transition. Next steps: PR state synchronization will be performed if there are PRs referencing this issue; results will be reported here. --- **Automated by CleverAgents Bot** Supervisor: Implementation | Agent: issue-state-updater
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
cleveragents/cleveragents-core#6445
No description provided.