fix(telemetry): classify permission denials as permission errors

Draft
AL
8d ago
+43-0

Summary

Automated fix proposed by the Altimate software factory; a maintainer reviews every change.

The problem, fix and criteria below are the agent's own account; check them against the diff.

Problem

The permission denial message includes the user's whole rule list as JSON, and the error classifier checks for the word parse before it checks for permission, so a rule such as dbt parse made the denial count as a parse error.

The telemetry message is the denial sentence followed by repeated permission entries, and a new test that builds a real denial with a dbt parse rule got parse_error before the fix and permission after it.

Fix

Tool calls blocked by permission rules or rejected by the user are now recorded as permission errors instead of parse errors in telemetry.

Acceptance criteria

  • classifyError returns permission for a PermissionNext.DeniedError whose ruleset contains a pattern with the word parse
  • classifyError returns permission for the core PermissionV1.DeniedError message
  • classifyError returns permission for RejectedError and for CorrectedError whose feedback mentions syntax
  • classifyError still returns parse_error for a genuine parse error message

Changes

2 files changed, 43 lines added, 0 lines removed.

  • packages/opencode/src/altimate/telemetry/index.ts
  • packages/opencode/test/telemetry/classify-permission-denial.test.ts

New tests

  • packages/opencode/test/telemetry/classify-permission-denial.test.ts

Independent review: accepted, confidence 0.87

Verification

  • Verify job: passed

Summary by cubic

Fixes telemetry error classification so permission denials and user rejections are recorded as permission errors instead of parse errors.

  • Denial messages embed the user's rule patterns (e.g. dbt parse *), so permission checks now run before the parse-error keyword match.
  • Adds tests covering config-rule denials, core v1 denials, rejections with feedback, and confirming genuine parse errors still classify as parse_error.