--- issue: 20 issue_title: "Document or delete pi-permission-system:permission-request event channel" --- # Delete permission-request event channel ## Problem Statement `src/index.ts` defines and emits a custom event on the `pi-permission-system:permission-request` channel every time a permission decision occurs. The `PermissionRequestEvent` type has ~12 fields and three possible states (`waiting`, `approved`, `denied`). Nothing subscribes to this channel, it is undocumented, untested, and the type is not exported — making it the worst of both worlds: a public-shaped surface with no contract and no consumer. The user decision for this issue is **delete**. A follow-up issue (#29) tracks re-adding the channel later with a proper public contract (exported types, docs, payload-shape tests, versioning policy). ## Goals - Remove `PERMISSION_REQUEST_EVENT_CHANNEL`, `emitPermissionRequestEvent`, `PermissionRequestEvent`, `PermissionRequestSource`, and `PermissionRequestState` (the event-specific type — not the permission source/state concepts used elsewhere). - Remove `createPermissionRequestId` and all `requestId` plumbing that exists solely for the event. - Remove all `emitPermissionRequestEvent(...)` call sites (3 in `promptPermission`). - Update `AGENTS.md` to remove the event channel from the preserved-identity list. - Update `README.md` to remove the event channel reference from the fork notice. - Confirm no remaining references in `src/` or `tests/`. ## Non-Goals - Adding new event types or expanding the payload (deferred to #29). - Changing the `/permission-system` slash command name (preserved). - Modifying the permission review log (`reviewPermissionDecision`) — that is unrelated to the event channel. ## Background ### Affected surfaces This change touches the **event emission layer** only — no permission surfaces (tools / bash / mcp / skills / special / external_directory) are affected. The permission review log (`writeReviewLog`) continues to record all decisions; removing the event channel does not reduce auditability. ### Code locations | Location | What | Lines | | ------------------------ | ------------------------------------------------------------------ | ---------- | | `src/index.ts:82–84` | `PermissionRequestSource`, `PermissionRequestState` types | 3 | | `src/index.ts:85–99` | `PermissionRequestEvent` type | 15 | | `src/index.ts:100–101` | `PERMISSION_REQUEST_EVENT_CHANNEL` constant | 2 | | `src/index.ts:1347–1349` | `createPermissionRequestId` helper | 3 | | `src/index.ts:1350–1362` | `emitPermissionRequestEvent` function | 13 | | `src/index.ts:1416–1429` | emit in auto-approve path | 14 | | `src/index.ts:1434–1446` | emit in waiting path | 13 | | `src/index.ts:1460–1472` | emit in resolved path | 13 | | `AGENTS.md` | § Project Purpose, § Implementation Priorities, § Notes for Agents | 3 mentions | | `README.md` | Fork notice (line 9) | 1 mention | ### Dependencies - **#22** (relax on-disk identity rule) — closed/implemented. That plan added the event channel to the preserved list pending #20's outcome. This plan removes it, which is the expected follow-up. - **#29** (re-add event channel with proper contract) — new issue, deferred. ## Design Overview Pure deletion + doc edits. No new types, no new runtime behavior, no policy changes. ### Deletion strategy 1. Remove the three type aliases (`PermissionRequestSource`, `PermissionRequestState`, `PermissionRequestEvent`). Check whether `PermissionRequestSource` is used by `reviewPermissionDecision` or `promptPermission` parameter types — if so, inline the union type or keep the alias under a different name scoped to the review log. 2. Remove the constant and the `emitPermissionRequestEvent` function. 3. Remove `createPermissionRequestId` and all `requestId` fields passed through `promptPermission` / `reviewPermissionDecision` — but only if `requestId` is used exclusively for the event channel. If `requestId` is also written to the review log, keep the ID generation and the review-log fields; only remove the event-emission calls. 4. Remove debug-log references to `permission_request.event_emit_failed`. ### `requestId` analysis `requestId` is passed to both `emitPermissionRequestEvent` and `reviewPermissionDecision`. The review log writes `requestId` to disk — it is useful for correlating waiting/approved/denied log entries for the same prompt. Therefore: **keep `requestId` and `createPermissionRequestId`**; only remove the event-emission calls and the event-specific types. ### `PermissionRequestSource` reuse `PermissionRequestSource` (`"tool_call" | "skill_input" | "skill_read"`) is used in `reviewPermissionDecision`'s `source` parameter. Keep the type alias but rename it to `PermissionReviewSource` (or inline the union) to avoid confusion with the deleted event type. ### Doc edits #### `AGENTS.md` - § Project Purpose: remove "and the `pi-permission-system:permission-request` event channel name are preserved". - § Implementation Priorities: remove the event channel from the preserved-identity bullet. - § Notes for Agents item 4: remove the event channel reference. #### `README.md` - Fork notice: remove "and `pi-permission-system:permission-request` event channel" from the preserved-names sentence. ## Module-Level Changes | File | Action | Detail | | -------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `src/index.ts` | changed | Remove `PermissionRequestEvent`, `PERMISSION_REQUEST_EVENT_CHANNEL`, `emitPermissionRequestEvent`, all emit call sites. Rename `PermissionRequestSource` → `PermissionReviewSource`. Keep `requestId` for review log. | | `AGENTS.md` | changed | Remove event channel from preserved-identity mentions (3 locations). | | `README.md` | changed | Remove event channel from fork notice. | No changes to `schemas/`, `config/`, or `tests/` (there are no existing event-channel tests). ## TDD Order 1. **Red:** Add a test that greps `src/index.ts` for `PERMISSION_REQUEST_EVENT_CHANNEL` and asserts it is absent (or: a build-only check that the deleted symbols no longer exist). This is lightweight — the real verification is that `npm run build` succeeds after deletion. Commit: `test: assert permission-request event channel is removed (#20)` 2. **Green:** Delete the event channel code from `src/index.ts`. Rename `PermissionRequestSource` → `PermissionReviewSource`. Remove `PermissionRequestState` and `PermissionRequestEvent`. Remove `emitPermissionRequestEvent` and all 3 call sites. Verify `npm run build` passes. Commit: `feat!: delete permission-request event channel (#20)` 3. **Docs:** Update `AGENTS.md` (3 locations) and `README.md` (1 location) to remove event channel references. Commit: `docs: remove event channel from preserved-identity list (#20)` ## Risks and Mitigations | Risk | Mitigation | | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Could this silently weaken a permission? | No. The event channel is fire-and-forget with no subscribers. Removing it does not change any allow/deny/ask decision. The review log continues to record all decisions. | | External consumer breaks | No known consumers exist. The type was never exported. If someone was subscribing by channel name string, #29 will re-add with a proper contract. | | `requestId` removal breaks review log correlation | Plan explicitly keeps `requestId` and `createPermissionRequestId` — only the event emission is removed. | | `PermissionRequestSource` removal breaks review log | Plan renames to `PermissionReviewSource` rather than deleting, preserving the type for `reviewPermissionDecision`. | | #22's AGENTS.md wording becomes stale | This plan updates the same locations #22 touched, removing the now-deleted channel reference. | ## Open Questions - None. The delete-vs-document decision has been made. Re-adding with a proper contract is tracked in #29.