docs(6209): wide net, startup, stamps, slippage, miss route and parity tests
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 15s
CI & Build / TypeScript typecheck (push) Successful in 53s
CI & Build / integration (push) Successful in 1m10s
CI & Build / Build & push image (push) Canceled after 0s
CI & Build / Python tests (push) Canceled after 1m23s
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 15s
CI & Build / TypeScript typecheck (push) Successful in 53s
CI & Build / integration (push) Successful in 1m10s
CI & Build / Build & push image (push) Canceled after 0s
CI & Build / Python tests (push) Canceled after 1m23s
Eight more test files state the property they pin as a present-tense fact. Incident narratives (a dated storage stall, a week of zero tuning events, a two-project poisoned ledger, a twenty-site owner audit) become the failure shape each test defends; one-install figures that name a rule become a general worked example with the calibration numbers kept. The family-grouping regression guard is renamed for what it checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
"""One definition of what SHIPS in the plugin, and the drift guards on it.
|
||||
|
||||
WHAT THIS IS ABOUT (#3127 §3, milestone 334 step 2). Scribe publishes two
|
||||
artifacts. `plugin/` is not in the Docker image — installs fetch it from this
|
||||
WHAT THIS IS ABOUT. Scribe publishes two artifacts. `plugin/` is not in the Docker image — installs fetch it from this
|
||||
repo through `.claude-plugin/marketplace.json`, so **a push IS the release**,
|
||||
with no build step in between. That makes "which files reach an install?" a
|
||||
question with real consequences, and it has been answered wrong twice:
|
||||
question with real consequences, and it can be answered wrong two ways:
|
||||
|
||||
- #2198 — `plugin/**` was in no `paths:` filter, so four broken hooks
|
||||
reached live installs having triggered no CI at all.
|
||||
- #2209 — the fix for that shipped and still could not reach an install,
|
||||
because the manifest version had not moved.
|
||||
- a shipped path in no `paths:` filter reaches live installs having
|
||||
triggered no CI at all;
|
||||
- a fix that ships without the manifest version moving cannot reach an
|
||||
install.
|
||||
|
||||
The set lives in `scripts/check_plugin.py`. Its second consumer is the
|
||||
workflow's `paths:` trigger, which is YAML and cannot import Python — so the
|
||||
@@ -66,7 +65,7 @@ def test_every_shipped_path_exists():
|
||||
|
||||
|
||||
def test_every_shipped_path_triggers_ci():
|
||||
"""#2198's exact hole, stated as an assertion.
|
||||
"""A shipped path that runs no CI, stated as an assertion.
|
||||
|
||||
Directional on purpose: the trigger is a superset (it also fires on
|
||||
`src/**`, `tests/**` and friends). What must never happen is a path that
|
||||
@@ -77,7 +76,7 @@ def test_every_shipped_path_triggers_ci():
|
||||
covered = any(t == path or t.startswith(f"{path}/") for t in triggers)
|
||||
assert covered, (
|
||||
f"{path} ships to installs but no `paths:` entry covers it — "
|
||||
f"changes there would reach a live install having run no CI (#2198)"
|
||||
f"changes there would reach a live install having run no CI"
|
||||
)
|
||||
|
||||
|
||||
@@ -94,10 +93,8 @@ def test_the_checker_itself_triggers_ci():
|
||||
def test_no_trigger_path_names_something_that_does_not_exist():
|
||||
"""The guard that catches scaffolding outliving its subsystem.
|
||||
|
||||
`fable-mcp/**` sat in this list for three months after the directory was
|
||||
deleted (commit 91bafb6, 2026-05-27), and `assets/**` named a path that
|
||||
never existed at all. Neither ever failed anything — a `paths:` entry
|
||||
matching nothing simply never fires — which is precisely why a list kept
|
||||
A `paths:` entry matching nothing simply never fires, so an entry for a
|
||||
deleted directory, or for a path that never existed, fails nothing — which is precisely why a list kept
|
||||
by hand drifts and nobody finds out.
|
||||
"""
|
||||
missing = [
|
||||
@@ -114,7 +111,7 @@ def test_every_deriver_exists():
|
||||
"""§3's table, kept honest.
|
||||
|
||||
The point of the table is that the next artifact is a one-line addition
|
||||
(milestone 334 step 3 adds the plugin's mint script). A row pointing at a
|
||||
(the plugin's mint script is one). A row pointing at a
|
||||
file that has moved would make the table read as complete when it is not.
|
||||
"""
|
||||
for path, artifacts in DERIVERS.items():
|
||||
@@ -162,7 +159,7 @@ def test_every_OTHER_manifest_field_still_demands_a_new_version(field, value):
|
||||
`plugin.json` carries description, mcpServers and userConfig alongside the
|
||||
version, and all of them reach an install. Excluding the file wholesale
|
||||
would mean a userConfig-only edit computes an unchanged version and never
|
||||
refreshes — #2209 again, with a narrower trigger and the same silence.
|
||||
refreshes — a fix that cannot reach an install, in silence.
|
||||
"""
|
||||
assert manifest_differs_beyond_version(manifest(**{field: value}), manifest()) is True
|
||||
|
||||
@@ -181,7 +178,7 @@ def test_reformatting_is_not_a_content_change():
|
||||
def test_unreadable_input_demands_a_new_version(bad):
|
||||
"""The conservative direction, chosen deliberately.
|
||||
|
||||
A spurious bump costs one cache refresh. A missed one is #2209 — the fix
|
||||
A spurious bump costs one cache refresh. A missed one means the fix
|
||||
reaches the repo and stops there, and the only detector is a human saying
|
||||
"I don't think it updated."
|
||||
"""
|
||||
@@ -238,9 +235,8 @@ def test_shipped_content_changed_reports_a_hook_edit_as_changed(monkeypatch):
|
||||
def test_a_failed_diff_is_None_and_never_False(monkeypatch):
|
||||
"""Could-not-tell and nothing-changed must not collapse into one value.
|
||||
|
||||
#2663 is the precedent: a read that failed inside a broad except reported
|
||||
the same zero as a genuinely empty window, and every counter read zero for
|
||||
weeks with nothing to distinguish the two.
|
||||
A read that fails inside a broad except and reports the same zero as a
|
||||
genuinely empty window leaves nothing to distinguish the two.
|
||||
"""
|
||||
from scripts import check_plugin
|
||||
|
||||
|
||||
Reference in New Issue
Block a user