9.6 KiB
issue, issue_title
| issue | issue_title |
|---|---|
| 20 | 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, andPermissionRequestState(the event-specific type — not the permission source/state concepts used elsewhere). - Remove
createPermissionRequestIdand allrequestIdplumbing that exists solely for the event. - Remove all
emitPermissionRequestEvent(...)call sites (3 inpromptPermission). - Update
AGENTS.mdto remove the event channel from the preserved-identity list. - Update
README.mdto remove the event channel reference from the fork notice. - Confirm no remaining references in
src/ortests/.
Non-Goals
- Adding new event types or expanding the payload (deferred to #29).
- Changing the
/permission-systemslash 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
- Remove the three type aliases (
PermissionRequestSource,PermissionRequestState,PermissionRequestEvent). Check whetherPermissionRequestSourceis used byreviewPermissionDecisionorpromptPermissionparameter types — if so, inline the union type or keep the alias under a different name scoped to the review log. - Remove the constant and the
emitPermissionRequestEventfunction. - Remove
createPermissionRequestIdand allrequestIdfields passed throughpromptPermission/reviewPermissionDecision— but only ifrequestIdis used exclusively for the event channel. IfrequestIdis also written to the review log, keep the ID generation and the review-log fields; only remove the event-emission calls. - 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-requestevent 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-requestevent 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
- Red: Add a test that greps
src/index.tsforPERMISSION_REQUEST_EVENT_CHANNELand asserts it is absent (or: a build-only check that the deleted symbols no longer exist). This is lightweight — the real verification is thatnpm run buildsucceeds after deletion. Commit:test: assert permission-request event channel is removed (#20) - Green: Delete the event channel code from
src/index.ts. RenamePermissionRequestSource→PermissionReviewSource. RemovePermissionRequestStateandPermissionRequestEvent. RemoveemitPermissionRequestEventand all 3 call sites. Verifynpm run buildpasses. Commit:feat!: delete permission-request event channel (#20) - Docs: Update
AGENTS.md(3 locations) andREADME.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.