Skip to content

Record the claude.ai synced plugins as an owner-synced exception; correct the sync row (#27) - #1138

Open
seathatflowsinourveins wants to merge 4 commits into
mainfrom
claude/cc-native-practice-synced-plugins-off-20261015
Open

seathatflowsinourveins wants to merge 4 commits into
mainfrom
claude/cc-native-practice-synced-plugins-off-20261015

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes, in one or two sentences: Corrects the claude:setting:syncClaudeAiPlugins disposition row. It said the claude.ai plugin sync was "off on both hosts", but the key was unset and the sync was on. Also records the four synced plugins as an owner-synced exception to the pin policy, with an invoke trigger.
  • Base commit: c8d7fa9e4
  • Lane: lane:foundation
  • Owned paths touched:
    • catalogs/foundation/upstream-surface-dispositions.json (one row);
    • docs/decisions/2026-10-15-claudeai-synced-plugins-exception.md (new);
    • evidence/artifacts/claudeai-synced-plugins-20261015/ (new) and its rows in manifests/evidence.json;
    • tests/test_claudeai_synced_plugins_exception.py (new).

What was synced (inventory on the 2604 host, Claude Code 2.1.300):

  • Four plugins from the knowledge-work-plugins marketplace, in one of ten account buckets under ~/.claude/plugins/synced/:
    • cowork-plugin-management: 2 skills;
    • lseg: 8 skills, MCP lseg;
    • daloopa: 23 skills, MCP daloopa and daloopa-docs;
    • bigdata-com: 27 skills, MCP bigdata.com.
  • 30 sessions loaded them on 2026-10-09. The .in_use markers match 30 Loki sessions on 2.1.295.
  • 0 skill activations and 0 MCP calls since Loki's first event (2026-10-04).
  • No catalog pin.

Ruling (command center, 2026-10-15T03:07Z): hold the host flip; these are the owner's own claude.ai integrations, and the command center is asking the owner whether to keep them. Later the same day: a /skill-doctor run at 04:55:55Z found that the four plugins add about 8,450 of 16,490 listing tokens per turn. At 05:07Z, on the owner's direction (paraphrased by the command center), the command center disabled each one with claude plugin disable <id> --scope user. The keep decision is superseded; the row is default-on (the sync stays on, and each plugin is disabled), as the decision record's Status and Corrects lines say.

  • This PR corrects the row and records the exception.
  • The template is unchanged.
  • Trigger: the first invoke hit on any of the four requires either a catalog pin or syncClaudeAiPlugins: false.
  • If the owner chooses off, the template key, its config-map row and the host line follow in a separate PR.

SOTA sources

Evidence-class table

Claim Evidence class Command / receipt
Four synced plugins in one bucket, with their skills and MCP servers native_proven inventory.json (read from ~/.claude/plugins/synced/; identifiers left out)
30 loading sessions on 2026-10-09 native_proven .in_use markers; window_sessions.py against Loki 127.0.0.1:21300
0 skill activations, 0 MCP calls, 2026-10-04 to 2026-10-15T02:48:30Z native_proven loki_by.py output in skill-activations.json and mcp-tool-results.json (host server names left out)
The template never set the key source_review adoption/templates/claude.settings.template.json at c8d7fa9e4

Local commands run

$ python3 -m unittest tests.test_claudeai_synced_plugins_exception    # before the fix
FAILED (failures=2)
$ UPSTREAM_SURFACE_TEST_CACHE=/nonexistent python3 -m unittest tests.test_upstream_surface_watch tests.test_claudeai_synced_plugins_exception
Ran 118 tests; OK (skipped=6)
$ python3 scripts/validate.py
rc 0; {"components": 71, "hashed_files": 12047, "profiles": 4, "receipts": 240, "status": "passed"}

UPSTREAM_SURFACE_TEST_CACHE=/nonexistent keeps this host's installed surface-watch cache out of the cached-artifact tests; the re-baseline follow-up fixes that separately.

Decision record

docs/decisions/2026-10-15-claudeai-synced-plugins-exception.md. It refines the 2026-09-25 sentence that the key stays unset: the key still stays unset, now as a recorded exception with a trigger.

Fix round 1 (ac14d3f)

From GPT full1 at 9f63fc3 (full1-pr1138/GPT-VERDICT-9f63fc311.md) and the local review at 9f63fc3 (review_output.json; its P2 is the same as GPT P2 1). Pushed under the command center's standing release rule (2026-10-15T11:11Z).

Finding Fix Fail-first test (failed at 9f63fc3, passes at ac14d3f)
P2 1 (also the local P2): listing_cost.py crashed on the verbose event array Output is read with skill_usage.parse_claude_output(), which handles both a single object and an event array ListingCostScriptTests.test_a_verbose_event_array_and_a_result_object_measure_the_same, run through a fake claude on PATH: Tuples differ: (1, 0) != (0, 0)
P2 2: a failed or unmeasured probe overwrote evidence with zero cost The script refuses, and writes nothing, on:
- a nonzero exit;
- an error result, a nonzero cost or a model turn (the parser's checks);
- no table, or no source column.
The per-row source sums are unchanged, so listing-cost.json stays reproducible.
test_a_failed_or_unmeasured_run_leaves_earlier_evidence (4 cases): AssertionError: 0 == 0, and the sentinel was overwritten
P2 3: the unconditional --strict-mcp-config blocked managed-MCP hosts The probe is skill_usage.skill_doctor_argv() test_the_probe_is_skill_usages_managed_mcp_compatible_argv: AttributeError: no attribute 'main'
P2 4: the decision said the row is defer-user; it is default-on The Corrects line now says default-on, with the 05:07Z per-plugin disables; the Ruling paragraph above records the later events test_the_decision_names_the_rows_current_disposition: Lists differ: ['defer-user'] != ['default-on']
P2 5: the inventory called rows 447-450 "all PROPOSED" under one pin The inventory and the decision describe each row:
- 447 durable-memory: WATCH, pinned at ae1513ea;
- 448 and 449: PENDING, provisional WATCH, no pin;
- 450: PENDING, provisional OUT-OF-SCOPE, no pin.
test_the_grand_catalog_rows_are_described_one_by_one: 'all PROPOSED' unexpectedly found

python3 -m unittest tests.test_claudeai_synced_plugins_exception tests.test_skill_usage: OK. scripts/validate.py: rc 0.

One side effect: the fail-first run imported the old script, whose module-level code ran the real headless /skill-doctor (a local command, 0 turns, $0). It wrote one untracked file into the worktree; the file was deleted and never committed.

Checklist

  • No GitHub Actions changed.
  • No workflows changed.
  • No secrets are printed, logged or committed. No account or bucket identifiers are recorded.
  • No new paid hosting, subscription or billing surface.
  • Peer-owned untracked files and worktrees were preserved.

🤖 Generated with Claude Code

…rect the sync row (#27)

The syncClaudeAiPlugins disposition row said the sync was "off on both
hosts" (2026-10-04). The settings template never set the key and Claude
Code honours only false, so the sync was on: four plugins from the
knowledge-work-plugins marketplace (cowork-plugin-management, lseg,
daloopa, bigdata-com) loaded in 30 sessions on 2026-10-09, with 0 skill
activations and 0 MCP calls since Loki's first event, and no catalog pin.

- The row becomes defer-user and cites the new decision.
- docs/decisions/2026-10-15-claudeai-synced-plugins-exception.md records
  the four as an owner-synced exception to the pin policy (command center,
  2026-10-15T03:07Z). Trigger: the first invoke hit on any of them requires
  a catalog pin or the flip to false. The template and host settings stay
  unchanged; the flip, if the owner chooses it, is a follow-up.
- evidence/artifacts/claudeai-synced-plugins-20261015/ holds the
  inventory and the Loki count scripts and outputs; no account or bucket
  identifiers and no host MCP server names.
- tests/test_claudeai_synced_plugins_exception.py ties the row to the
  template; both of its tests failed on the old row.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Oct 15, 2026
…ing cost (#27)

The decision said the four unused synced plugins cost nothing measurable.
/skill-doctor at 2.1.300 (headless, 0 turns, $0; 2026-10-15T04:55:55Z)
lists their 66 skills in the system prompt of every turn: about 8,450
tokens (bigdata-com 6,360, lseg 1,230, daloopa 620,
cowork-plugin-management 240), about half of the 16,490 listing tokens of
all loaded skills.

- evidence/artifacts/claudeai-synced-plugins-20261015/listing_cost.py and
  listing-cost.json: the measurement, per source.
- The decision's rationale states the cost and names the per-plugin
  "<name>@synced": false route; the exception itself stands until the
  owner rules again with this number.
- New test asserts the stated figure equals the measured sum and the old
  claim is gone; it failed before this commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…eep decision (#27)

On the owner's direction of 2026-10-15 (01:05 ET, paraphrased by the
command center: resolve the synced plugins cleanly with current practice),
after the listing-cost measurement in this PR, the command center disabled
bigdata-com, lseg, daloopa and cowork-plugin-management with the native CLI
(`claude plugin disable <id> --scope user`), which writes
"<name>@synced": false into enabledPlugins in user settings (read back
2026-10-15T05:17Z; claude plugin list shows them disabled).

- The decision's status records the supersession, the inverse
  (`claude plugin enable <id> --scope user`) and why the sync itself stays
  on: a plugin the account adds later still arrives and meets the trigger.
- The syncClaudeAiPlugins disposition row becomes default-on: the key stays
  unset on purpose and each synced plugin is disabled per plugin.
- The test pins the new row and the dated supersession; it failed before
  this commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
… default-on; describe the catalog rows one by one

Fix round for #1138 at 9f63fc3 (GPT full1, five P2; the local review's P2 is the same as P2 1):
- P2 1-3: listing_cost.py builds its probe with skill_usage.skill_doctor_argv() (drops only --strict-mcp-config
  on a host with a managed MCP config) and reads the output with parse_claude_output() (a result object or a
  verbose event array; an error result, a nonzero cost or a model turn is refused). A failed process, a refused
  result or a result with no table writes nothing, so earlier evidence stays. The per-row source sums are
  unchanged, so listing-cost.json stays reproducible.
- P2 4: the decision now says the row is default-on (the sync stays on; per-plugin disables since 05:07Z).
- P2 5: the inventory and the decision describe grand-catalog rows 447-450 one by one: 447 durable-memory
  WATCH pinned at ae1513ea; 448-450 PENDING with PROPOSED provisional dispositions and no pin.

Fail-before (base files, new tests): 7 failures and 1 error, e.g. Tuples differ: (1, 0) != (0, 0) (the
verbose array crashed), AssertionError: 0 == 0 (a failed run exited 0 and overwrote the output), Lists differ:
['defer-user'] != ['default-on'], 'all PROPOSED' unexpectedly found, AttributeError: no attribute 'main'.
After: tests.test_claudeai_synced_plugins_exception 8 OK, tests.test_skill_usage OK; validate rc 0.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant