RuleSpoolfor OpenCode 2
RULESPOOL / NOTE 02UPDATED October 15, 2026

Specific is not the same as last.

The first example contains a narrow allow followed by a broad ask. Both match the signup skill, and the broad rule has the last word.

Pull the first example apart

[
  {"action":"skill","resource":"qa-signup","effect":"allow"},
  {"action":"skill","resource":"*","effect":"ask"}
]

For the synthetic request skill / qa-signup, both tickets match. The second ticket wins, so the supplied result is ask. RuleSpool shows the earlier match and the winning ticket separately; a match does not necessarily control the result.

Move the exception, then inspect the other cases

Open the explorer, select “An exception in the wrong place”, and move the first agent ticket later. The signup case changes to allow. The unrelated skill still asks, and the source-read request still asks because neither skill rule matches its action.

Open Review changes to compare all three cases. The expected-result assertion for signup should now match. This is a focused local example, not a recommendation to permit that skill in your environment. The exported replay includes the original order and the changed order so a reviewer can reproduce the same question.

Wildcards are not filesystem glob libraries

The pinned matcher treats * as a sequence of UTF-16 units that can include slashes; ? consumes one unit. Other pattern characters are literal. A pattern such as SRC/*.TS can match a nested path. POSIX case matching and Windows case matching can produce different results for the same text.

There is also a special ending: git status * matches the base command without arguments. The visually similar git status ** does not receive that optional-space treatment. RuleSpool preserves this distinction instead of replacing the matcher with a generic glob package.

Order across layers

The session layer follows the agent layer. Moving a ticket within the agent array cannot place it after an already supplied session rule. Inspect both layers before deciding that a reordering “did nothing”. Saved approvals are a separate stage with a configured-deny check first; see the approval example.

Semantics follow the pinned matcher and last-match evaluator. These examples are original synthetic fixtures.