# tests-exist gate — structural exemption allowlist
#
# One glob pattern per line. A new source file whose path matches any
# pattern here is exempt from the "must ship with a test in the same
# commit" rule enforced by both gate layers (tests-exist-gate.py PreToolUse
# hook + the git-native commit-msg hook). Matches are logged via
# fw_event_log.py, not silent.
#
# Semantics (read before adding a pattern):
#   - Matched with Python's fnmatch.fnmatch(), NOT pathlib.Path.match() and
#     NOT .gitignore glob rules. Under fnmatch, `*` DOES cross `/` — this is
#     the opposite of .gitignore's `*`, which stops at a path separator.
#     `src/*/foo.py` will match `src/a/b/foo.py`, not just `src/a/foo.py`.
#   - No `**` recursion syntax — fnmatch has no concept of it. Write the
#     pattern to match the literal path shape you intend.
#   - Every pattern MUST contain at least one `/` (repo-root-relative,
#     anchored) — a bare `*.py` or `*` is rejected at load time
#     (validate_allowlist_pattern) because it would silently exempt the
#     entire repo, mirroring .gitignore's own "unanchored pattern matches at
#     any depth" footgun in the opposite, safer direction.
#   - No leading `/` and no `..` segment — every pattern is implicitly
#     repo-root-relative; there is no way to escape the root or write an
#     absolute-looking pattern.
#
# Blank lines and full-line `#` comments are ignored.

# Trivial package markers — no logic to test.
src/shipteam/__init__.py
src/shipteam/framework/__init__.py

# Bundled-skill executable helpers under the wheel tree
# (src/shipteam/framework/skills/<skill>/bin/*.sh) are byte-identical MIRRORS of
# the canonical .claude/skills/<skill>/bin/*.sh. Their coverage is the
# byte-identity drift guard in tests/test_bundle_drift.py, not a separate unit
# test — a duplicate test on the mirror path would add no signal. (fnmatch `*`
# crosses `/`, so this matches nested bin/ paths too.)
src/shipteam/framework/skills/*/bin/*.sh
