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:
@@ -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 (2–4d), 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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user