80 lines
8.2 KiB
Markdown
80 lines
8.2 KiB
Markdown
# APP-4549: Tech Spec — Feedback Bundled Skill Setting
|
||
Linear: [APP-4549](https://linear.app/warpdotdev/issue/APP-4549/add-setting-to-disable-the-feedback-skill)
|
||
## Context
|
||
`PRODUCT.md` defines the user-visible behavior: add a default-on setting that disables only Warp’s built-in `feedback` bundled skill.
|
||
The relevant code already has a central bundled-skill activation path:
|
||
- `app/src/ai/skills/skill_manager.rs (20-47)` — `BundledSkillActivation` models whether a bundled skill is active.
|
||
- `app/src/ai/skills/skill_manager.rs (361-389)` — bundled skills are loaded from app resources and assigned an activation condition.
|
||
- `app/src/ai/skills/skill_manager.rs (591-600)` — `activation_for_bundled_skill` currently makes most bundled skills, including `feedback`, always active.
|
||
- `app/src/ai/skills/skill_manager.rs (185-201)` — `get_skills_for_working_directory` appends bundled skills whose activation condition is enabled.
|
||
- `app/src/ai/skills/skill_utils.rs (94-121)` — `list_skills_if_changed` sends available skill descriptors to the agent when the list changes.
|
||
- `app/src/ai/blocklist/action_model/execute/read_skill.rs (36-63)` — `read_skill` resolves `SkillReference::BundledSkillId` through `SkillManager::skill_by_reference`.
|
||
- `app/src/settings/ai.rs (715-1464)` — `AISettings` defines user-level Agent settings, including public TOML-backed settings under `agents.warp_agent.*`.
|
||
- `app/src/settings_view/ai_page.rs (6024-6223)` — the Agent settings “Other” widget renders related Agent toggles using shared helpers.
|
||
- `app/src/bin/generate_settings_schema.rs (146-199)` and `script/prepare_bundled_resources (132-159)` — public settings with `toml_path` are included in the generated settings schema bundled with app resources.
|
||
Bundled skills are copied into the application bundle from `resources/bundled` by `script/prepare_bundled_resources:48`. This change should not try to remove the feedback skill from the bundle at build time; it should make the skill inactive at runtime.
|
||
## Proposed changes
|
||
1. Add a public AI setting in `app/src/settings/ai.rs`.
|
||
- Suggested field: `feedback_bundled_skill_enabled`.
|
||
- Suggested generated setting type: `FeedbackBundledSkillEnabled`.
|
||
- Type: `bool`.
|
||
- Default: `true`.
|
||
- Supported platforms: `SupportedPlatforms::ALL`.
|
||
- Sync: `SyncToCloud::Globally(RespectUserSyncSetting::Yes)`.
|
||
- Private: `false`.
|
||
- Suggested TOML path: `agents.warp_agent.other.feedback_bundled_skill_enabled`.
|
||
- Description: “Whether Warp’s built-in feedback skill is available to the Warp Agent.”
|
||
2. Extend bundled skill activation in `app/src/ai/skills/skill_manager.rs`.
|
||
- Add a `BundledSkillActivation` variant for settings-backed feedback activation, for example `FeedbackSkillSetting`.
|
||
- Update `BundledSkillActivation::is_enabled` to consult `AISettings::as_ref(ctx).feedback_bundled_skill_enabled` for that variant.
|
||
- Update `activation_for_bundled_skill` so `skill_id == "feedback"` uses that variant.
|
||
- Keep `modify-settings` on `RequiresFile` and all unrelated bundled skills on their existing activation behavior.
|
||
3. Add an activation-aware lookup for bundled skill reads.
|
||
- Preserve raw lookup behavior where the UI needs historical metadata for already-rendered outputs.
|
||
- Add a method such as `skill_by_reference_if_active(&self, reference: &SkillReference, ctx: &AppContext) -> Option<&ParsedSkill>`, or update `ReadSkillExecutor` to pattern-match bundled references and call `active_bundled_skill(id, ctx)`.
|
||
- Use the activation-aware path in `ReadSkillExecutor` so `read_skill` cannot expose `@warp-skill:feedback` content when the setting is disabled.
|
||
- Path-based user skills should continue to use `skills_by_path` and should not be affected by the feedback bundled-skill setting.
|
||
4. Add the UI toggle in `app/src/settings_view/ai_page.rs`.
|
||
- Import the generated `FeedbackBundledSkillEnabled` setting type.
|
||
- Add a `SwitchStateHandle` to `OtherAIWidget`.
|
||
- Add `AISettingsPageAction::ToggleFeedbackBundledSkill`.
|
||
- Handle the action by toggling `AISettings.feedback_bundled_skill_enabled` and notifying the view.
|
||
- Render the toggle in the existing Agent “Other” section using `render_ai_setting_toggle`.
|
||
- Suggested label: “Enable built-in feedback skill”.
|
||
- Suggested description: “Let Oz use Warp’s built-in skill for turning Warp product feedback into GitHub issues.”
|
||
- Update `OtherAIWidget::search_terms` to include feedback, skill, and bundled skill.
|
||
5. Schema and resources.
|
||
- No manual schema file changes should be necessary. The setting should appear in generated schema output through the existing settings inventory path.
|
||
- Normal resource preparation should continue to copy the `feedback` skill file into the bundle.
|
||
6. Keep the implementation narrow.
|
||
- Do not alter `resources/bundled/skills/feedback/SKILL.md`.
|
||
- Do not add broad bundled-skill allow/deny lists.
|
||
- Do not change skill deduplication, provider precedence, or user-created skill scoping.
|
||
## Testing and validation
|
||
Map tests to the product behavior in `PRODUCT.md`:
|
||
1. Product behavior 2 and 3: add a skill manager test showing `feedback` is active by default and included in `get_skills_for_working_directory` when bundled skills are enabled.
|
||
2. Product behavior 4: add a skill manager test that sets `feedback_bundled_skill_enabled` to `false` and verifies `feedback` is excluded from returned bundled skill descriptors.
|
||
3. Product behavior 8: in the same test or a companion test, verify another bundled skill remains included when feedback is disabled.
|
||
4. Product behavior 7: verify path-based skills named `feedback` are still returned according to existing home/project skill scope rules when the bundled feedback skill is disabled.
|
||
5. Product behavior 4: add or update `read_skill_tests` so `ReadSkillExecutor` returns an error for `SkillReference::BundledSkillId("feedback")` when the setting is disabled.
|
||
6. Product behavior 3 and 8: add a read-skill test showing an enabled bundled skill can still be read.
|
||
7. Product behavior 9, 12, and 13: update `ai_page_tests` if the existing settings page tests assert widget search/filtering or rendered action coverage for the “Other” widget.
|
||
8. Run `cargo fmt`.
|
||
9. Run targeted tests:
|
||
- `cargo test -p warp skill_manager_tests`
|
||
- `cargo test -p warp read_skill_tests`
|
||
- `cargo test -p warp ai_page_tests`
|
||
Adjust exact package/test filters if local test names differ.
|
||
10. If this is prepared for PR review, follow repo guidance and run the required formatting and clippy checks before opening or updating a PR.
|
||
## Risks and mitigations
|
||
- Stale skill context could still reference `@warp-skill:feedback`. Mitigation: guard direct `read_skill` execution with the same activation state used by skill listing.
|
||
- The setting could accidentally disable user-authored skills named `feedback`. Mitigation: check only the bundled skill ID, not parsed skill name or path-based references.
|
||
- Other bundled skills could regress if activation is generalized too broadly. Mitigation: add tests that feedback is disabled while another bundled skill remains active.
|
||
- Settings UI copy could imply all feedback mechanisms are disabled. Mitigation: label and description should explicitly say “built-in feedback skill.”
|
||
## Parallelization
|
||
Do not parallelize the implementation. The setting definition, activation logic, direct read enforcement, and UI toggle are tightly coupled and touch overlapping files, so a single implementer should make the code changes in one checkout on branch `safia/app-4549-add-setting-to-disable-the-feedback-skill`.
|
||
Validation can be parallelized after implementation if desired:
|
||
- Agent A: local execution in `/Users/captainsafia/code/warp`, same branch, owns `skill_manager_tests` and `read_skill_tests`.
|
||
- Agent B: local execution in a separate worktree, for example `/Users/captainsafia/code/warp-app-4549-ui-tests` on branch `safia/app-4549-ui-validation`, owns `ai_page_tests` and settings UI review.
|
||
If using the optional validation split, Agent B should not modify source files unless asked; it should report failures and suggested fixes back to the main branch owner. The final PR should land as a single branch/PR from `safia/app-4549-add-setting-to-disable-the-feedback-skill`.
|