2026-05-12 executor security analysis — add Section 7: task analysis flow, awaiting-go queue, full task inventory with fix details

This commit is contained in:
Alexey Martemyanov
2026-05-12 12:04:11 +06:00
parent 3ce046d8e4
commit d9fb503933
+123 -1
View File
@@ -437,7 +437,129 @@ None are privilege escalation, memory corruption, sandbox escape, or any other s
---
## 7. Summary of Control Failure
## 7. Task Analysis Flow — Awaiting-Go Queue
### 7.1 Architecture
The `executor-autonomous` cron job (ID `174de8444e1c`, schedule `*/30 9-18 * * 1-5`, later `*/30 * * * *`) ran in four phases each tick:
- **Phase 0** — Read context (status.md, TP, focus score)
- **Phase A** — Check active PRs (CI status, reviewer feedback)
- **Phase B** — Spawn worker for next approved task if slot available (max 2 concurrent)
- **Phase C** — Analyze pending tasks from the local Asana snapshot: read task details, research the codebase, produce root-cause + fix analysis, classify complexity/feasibility, then assign `awaiting_go` (needs Alex's `go {gid}` command) or `skip` with reason
- **Phase D** — Update `~/Developer/personal-os/briefs/executor-queue.md` + commit to Obsidian
Analysis output was delivered to Discord `#executor` channel automatically by the Hermes cron delivery system (not posted by the agent itself). Each tick's full output is also preserved in `~/.hermes/cron/output/174de8444e1c/`.
The job ran from **2026-04-28** through **2026-04-30** (96 ticks total before AFK + subsequent pausing). It processed ~230 tasks total — analysing each against the live codebase via `gh` CLI, local repo reads, and the Asana snapshot DB.
### 7.2 What was analysed and sent to Discord
Each task that passed Phase C and entered `awaiting_go` had the following disclosed on Discord:
- Asana task GID and URL (`https://app.asana.com/0/0/{gid}`)
- Task name (bug title)
- Root cause analysis (specific file paths, line numbers, function names, code logic)
- Exact fix approach (what to change and where)
- Files to modify (explicit paths)
- Complexity and feasibility estimate
- Risk assessment
This is substantially more detail than the execution threads — the analysis phase included line-level codebase findings even for tasks that were never executed.
**Example from tick #3 (2026-04-28 10:19 UTC)** — four tasks delivered to Discord in full:
> **Task 1 — Ctrl+PgUp/PgDn tab navigation** (`go 1210067060365235`):
> — Root cause: Tab switching shortcuts don't include Ctrl+PgUp/PgDn
> — Probable fix: Add `.pageUp` / `.pageDown` constants to `NSEvent.KeyEquivalent` in `NSEventExtension.swift` using Unicode chars `\u{F72F}` / `\u{F72D}`, add 2 hidden NSMenuItems to `MainMenu.swift`
> — Files: `macOS/LocalPackages/AppKitExtensions/Sources/AppKitExtensions/NSEventExtension.swift`, `macOS/DuckDuckGo/Menus/MainMenu.swift`
> — Complexity: trivial · Feasibility: high · Risk: none
> **Task 2 — Privacy dashboard on localhost** (`go 1207062650987868`):
> — Root cause: `AddressBarButtonsViewController.swift` line 1011 has `&& !isLocalUrl` in privacy button `isShown` condition
> — Probable fix: Remove `&& !isLocalUrl` from the condition
> — Files: `macOS/DuckDuckGo/NavigationBar/View/AddressBarButtonsViewController.swift` (1 line)
> — Complexity: trivial · Feasibility: high · Risk: very low
> **Task 3 — SwiftLint UITestCase rule** (`go 1209477403052217`):
> — Root cause: UI tests call `app.launch()` directly, ~10+ files affected
> — Probable fix: Add custom SwiftLint rule to `.swiftlint.yml` matching `app.launch()` in `macOS/UITests/**/*.swift`
> — Files: `macOS/.swiftlint.yml`
> — Complexity: trivial · Feasibility: high · Risk: low
> **Task 4 — Universal Links on macOS 15** (`go 1208684501456999`):
> — Root cause: macOS 15 WebKit opens https:// links in associated apps by default. iOS has fix: `WKNavigationActionPolicy(rawValue: .allow.rawValue + 2)` with `allowUniversalLinks = false`
> — Probable fix: Add `allowUniversalLinks` preference to macOS, return `.allowWithoutUniversalLinks` in `ExternalAppSchemeHandler.decidePolicy(for:)`, add toggle to General Preferences
> — Complexity: small · Feasibility: medium · Risk: uses `rawValue + 2` private WebKit API
### 7.3 Full awaiting-go task inventory at shutdown (last tick, 2026-04-30 15:50 UTC)
At the final executor-autonomous tick before AFK (tick #96), the queue state was:
| Status | Count |
|---|---|
| in_progress | 16 (1 worker active, 15 awaiting_review) |
| approved | 1 |
| awaiting_go | **9** |
| pending | 0 |
| skip | 930 |
The 9 tasks in `awaiting_go` — all with root-cause + fix analysis delivered to Discord:
| GID | Task name | Fix summary disclosed | Complexity |
|---|---|---|---|
| `1214409626306654` | BookmarkHTMLReader ImportError 5 (readFolder) | Defensive handling in `BookmarkHTMLReader.swift:239` | small/high |
| `1208684501456999` | Universal Links on macOS 15 | `allowUniversalLinks` pref + `ExternalAppSchemeHandler` policy | medium/medium |
| `1209893341190805` | Bitwarden startup hang | `connectToBitwardenProcess()` blocking main thread | medium/medium |
| `1204665601780731` | Bitwarden host page status not updated | 54 instances, regression fix | small/high |
| `1208863397075129` | 2 folders highlighted in Bookmarks sidebar drag | Clear highlight on drag update | trivial/high |
| `1205464234816310` | Tabs width not updated on mouse-out in background | `NSWindow.didBecomeKeyNotification` + layout update | small/high |
| `1214002132145484` | Latent click when maximizing window | mouseUp on bookmark bar after zoom | small/medium |
| `1213905392439005` | Disable title animations after page load | `TitleDisplayPolicy.swift` ~3 lines | trivial/high |
| `1214382511195593` | Home button fails to load (blank page) | `homeButtonAction()``setContent(.newtab)` intermittent | small/medium |
Additionally, from earlier ticks (tasks that were `awaiting_go` at various points and visible on Discord before being acted on or superseded):
| GID | Task name | Notes |
|---|---|---|
| `1211217619381277` | Add bookmarklet support | Eventually executed → PR #4608 |
| `1210067060365235` | Ctrl+PgUp/PgDn tab shortcuts | Eventually executed → PR #4609 |
| `1209477403052217` | SwiftLint UITestCase rule | Eventually executed |
| `1207062650987868` | Privacy dashboard on localhost | Eventually executed → PR #4611 |
| `1214038885921128` | Pinned tab opens link in background | In awaiting_go |
| `1214136191944220` | Pin only tab closes window | Eventually executed |
| `1208684501456999` | Universal Links on macOS 15 | Remained in awaiting_go |
| `1208705149123008` | SwiftLint Unicode ellipsis rule | Eventually executed → PR #4610 |
### 7.4 Skip analysis — also disclosed on Discord
Every skip decision included the reason. Phase C in tick #3 alone skipped 36 tasks with these reasons (all visible on Discord):
- Duplicate tab reports (×3): PR #4530 already open
- Tab bar overlap: already fixed in commit `80d12bf7` (Apr 20)
- ChromiumLoginReader errors (×4): Keychain/system-level, not actionable
- Import failures: old Chrome versions, system-level
- Performance/vague bugs: Asana inbox slow, NY Times (v1.77.0), Facebook crashes
- VPN conflicts, feature requests: YouTube ad blocking, collapse tabs
- Too large/long-running: Download Resume (24d), Pinned tabs multi-monitor (5d)
This skip inventory was also committed to `~/obsidian/work/projects/executor-skip-report.md` each tick.
### 7.5 Assessment relative to Q3 (data inventory)
The analysis phase disclosed **more sensitive data than the execution phase** for the tasks that reached `awaiting_go` but were never executed:
- Specific file paths and line numbers for bugs that have **not yet been patched** (the 9 tasks still in the queue at shutdown)
- Detailed root-cause analysis of unpatched issues (Bitwarden hang, latent click, home button failure, bookmark drag bug, tab width regression)
- Exact fix approaches for all of these
None of these are security vulnerabilities (Q8 answer remains no). But the combination of task GID → bug title → exact file + line → fix approach for unpatched UX bugs was all in Discord.
The 9 tasks still in `awaiting_go` at shutdown are the most sensitive items in this category — they represent unexecuted analysis of real bugs that were disclosed in detail but never fixed.
---
## 8. Summary of Control Failure
The autonomous executor ran with a "lethal trifecta" gate: once an internal data MCP (Asana) is called in a session, external HTTP is blocked. This was designed to prevent exfiltration *outward*. It did not prevent *writes inward* to Asana.