sync claude-skills: plugin 1.3.1, s1-secops-mcp 1.3.3 - #88
Open
pmoses-s1 wants to merge 3 commits into
Open
Conversation
Syncs the eight skills, the MCP server, docker assets and CLAUDE.md from claude-skills, and rebuilds the plugin bundle in this repo. SDL configuration files move to POST <console>/sdl/v2/graphql. The legacy REST endpoints are incomplete: measured on a live tenant, listFiles returned 1,914 paths against configFiles' 2,264, and getFile on any of the 350 udoId-addressed dashboards returns success/noSuchFile. The sdl-api skill and the MCP tools now use GraphQL, address dashboards by udoId, and refuse a name-addressed write to an existing dashboard because that creates a duplicate rather than updating. One console API token authorises every SDL surface. SDL_XDR_URL and the scoped SDL config and log keys are retired and no longer read. Plugin 1.3.1: the previously distributed bundles were built before this work, so four skills shipped superseded guidance. Rebuilt from source; the version bump is what makes the corrected skills reach anyone already on 1.3.0.
docs/ and README.md are structurally adapted copies that the sync script does not overwrite, so they had drifted from the behaviour the synced skills now describe. - credentials.md, architecture.md, vm-deployment.md presented the scoped SDL keys as required. One console token authorises every SDL surface; those keys are retired and are not read. - upgrading.md installed @pmoses-s1/s1-secops-mcp@1.3.1 and expected that version back. The published package is 1.3.3, so following it downgraded the server. - mcp-tools.md described the four sdl_* tools as path-addressed against an unnamed API. They run over POST <console>/sdl/v2/graphql, dashboards are addressed by udoId, expectedVersion is enforced on both address forms, and a name-addressed write to an existing dashboard is refused because it duplicates. - skills.md omitted the GraphQL surface and the dashboard udoId rule. - docker.md advertised 1.2.3 as the current tag, and the plugin download in README.md and zero-to-hero.md still pointed at v1.2.5; both are now 1.3.1. - The 1.3.1 release note recorded npm 1.3.1 and plugin 1.3.0. The build pins S1_MCP_VERSION=1.3.3 and the plugin is 1.3.1.
… copies, workflow-list traps
Documentation-only sync from claude-skills. Plugin rebuilt at the SAME version (1.3.1) and the MCP
is unchanged at 1.3.3, since nothing here changes behaviour.
All items were measured on a live tenant while building and testing the UEBA and ingest-health
deployers; none are inferred.
hyperautomation
- LRQ poll loops need a {{<poll>.status_code}} >= 400 gate routing to an action that ENDS the run.
A backend-terminated query answers 404 not_found for the rest of the run, HA does not treat that
as a failed action, and with the JQ counter defaults the loop spins to the workflow timeout
(17+ iterations observed). continue_on_fail=False does not help: only retry_on_status_codes
reacts to status, and retrying a dead token is pointless.
- Poll counters via Function.JQ with defaults plus a stepsTotal > 0 gate, or a 0/0 first poll is
treated as complete over an empty result set and writes a stub baseline.
- New pitfalls: an http_request's `status` is "success" for ANY response including 404 (branch on
status_code, top level, not under .body); run-now executions park at executed_actions=0 and
accumulate, holding scheduler slots.
powerquery
- `savelookup` REPLACES its table rather than appending, which rules out any design where several
flows write one shared table.
- Union width, not the time window, is what gets a query killed: ~15 steps per block, and the
backend terminates mid-flight (1 block = 16 steps always completes; 6 = 91 killed at step 58).
Shortening the window does not rescue it, and completing standalone via the API proves nothing
about surviving inside an HA flow.
- Scheduled rules: hard cap lookbackWindowMinutes / runIntervalMinutes <= 96, else HTTP 400 naming
neither field. Clamp rather than failing the deploy; the cadence is also the floor on any
end-to-end test, since scheduled rules have no run-now.
sdl-api
- The HEC receive-time "shadow copy" defect is now documented in the HEC section itself rather than
only in the root support-ticket file: back-dated events index correctly AND produce extra copies
stamped at ingest time that carry no body fields. Includes the impact on synthetic test data (a
source deliberately left empty will not read as empty, so SILENT-style detections cannot be
validated that way) and the list of causes already eliminated, so the investigation is not
repeated: payload shape, isParsed, chunk size, run-tag field name, timestamp recency, concurrency.
mgmt-console-api
- Workflow-listing traps, both of which fail silently as "not found" and cause duplicate deploys:
the unfiltered list is alphabetical and page-capped, and name__contains returns HTTP 502 for any
value containing a space. Filter on a whitespace-free token, exact-match client-side, and never
treat an API error as absence.
- Parked run-now executions and how to clear them.
Sync verification: no NEW broken links (18 pre-existing excluded), no dangling symlinks, identities
consistent (npm 1.3.3 / plugin 1.3.1 / dist v1.3.1). The three files reported by the stale-names
check are false positives: they name the retired SDL keys only to state they are retired.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Syncs the eight skills, the MCP server, docker assets and
CLAUDE.mdfrom claude-skills, rebuilds the plugin bundle in this repo, and brings this repo's own docs back in line.SDL configuration files move to GraphQL
Config files are read and written over
POST <console>/sdl/v2/graphql. The legacy REST endpoints are incomplete: measured on a live tenant,listFilesreturned 1,914 paths againstconfigFiles' 2,264, andgetFileon any of the 350udoId-addressed dashboards returnssuccess/noSuchFile.udoIdis assigned by namespace. Only/dashboards/files carry one;/lookups/,/datatables/,/logParsers/and/automaticLookupsare name-addressed. The console displays a dashboard as/dashboards/id/<udoId>/<name>, which is a display string, not a path.addConfigFile(name:)updates in place for a name-addressed file but creates a duplicate for a dashboard, sosdl_put_filerefuses a name-addressed write to an existing dashboard and names theudoIds already holding that name.expectedVersionis enforced on both address forms.Credentials
One console API token authorises every SDL surface.
SDL_XDR_URLand the scoped SDL config and log keys are retired and no longer read.Plugin 1.3.1
The previously distributed bundles were built before this work, so four skills shipped superseded guidance: the
sdl-apiSKILL.md inside the bundle still describedlistFilesand contained noudoIdor GraphQL content. Rebuilt from source. The version bump is what makes the corrected skills reach anyone already on 1.3.0.The
sdl-apidescription used/dashboards/id/<number>/<name>as a trigger phrase; plugin validation reads<number>as an XML tag and rejects the skill, so the placeholders are now braces.This repo's own docs
docs/andREADME.mdare structurally adapted copies the sync script deliberately does not overwrite, so they had drifted:credentials.md,architecture.mdandvm-deployment.mdstill presented the retired SDL keys as required.upgrading.mdinstalled npm1.3.1and expected it back, which downgraded the server from the published 1.3.3.mcp-tools.mdandskills.mdomitted the GraphQL surface and theudoIdrule.docker.mdadvertised 1.2.3 as the current tag, and the plugin download inREADME.mdandzero-to-hero.mdstill pointed atv1.2.5.Verification
tools/list.md)Pre-existing and out of scope:
shfmt -i 2flagshooks/bootstrap_creds.sh,scripts/build.shandworkflows/community/reorganize-actions.shonorigin/maintoo;bootstrap_creds.shis functionally identical to the source copy, differing only in indentation.Update 2026-08-09: skills documentation refresh (plugin still 1.3.1, MCP still 1.3.3)
Documentation-only. No behavioural change, so the plugin was rebuilt at the same version.
Every item below was measured on a live tenant while building and testing the UEBA and
ingest-health deployers.
hyperautomation
{{<poll>.status_code}} >= 400gate routing to an action that ENDSthe run. A backend-terminated query answers
404 not_foundfor the rest of the run; HA does nottreat that as a failed action, so with the JQ counter defaults the loop spins to the workflow
timeout (17+ iterations observed).
continue_on_fail: falsedoes not help — onlyretry_on_status_codesreacts to status, and retrying a dead token is pointless.Function.JQwith defaults, plus astepsTotal > 0gate — otherwise a0/0 first poll counts as complete over an empty result set and writes a stub baseline that
silently suppresses every detection reading it.
http_request'sstatusis"success"for any response including 404(branch on
status_code, which sits at the top level, not under.body); and run-nowexecutions park at
executed_actions: 0and accumulate, holding scheduler slots.powerquery
savelookupREPLACES its table, it does not append — rules out any design where severalflows write one shared table.
Union width, not the time window, is what gets a query killed. ~15 steps per block and the
backend terminates mid-flight:
stepsTotalShortening the window does not rescue it, and completing standalone via the API proves nothing
about surviving inside an HA flow.
Scheduled rules: hard cap
lookbackWindowMinutes / runIntervalMinutes <= 96, else HTTP 400naming neither field. Clamp rather than failing the deploy. The cadence is also the floor on any
end-to-end test, since scheduled rules have no run-now.
sdl-api
the root support-ticket file. Back-dated events index correctly and produce extra copies
stamped at ingest time carrying no body fields. Documents the impact on synthetic test data (a
source deliberately left empty will not read as empty, so SILENT-style detections cannot be
validated that way) and, deliberately, the causes already eliminated so the investigation is
not repeated: payload shape,
isParsed, chunk size, run-tag field name, timestamp recency, andconcurrency.
mgmt-console-api
deploys: the unfiltered list is alphabetical and page-capped, and
name__containsreturnsHTTP 502 for any value containing a space. Filter on a whitespace-free token, exact-match
client-side, and never treat an API error as absence.
Verification
1.3.3, plugin1.3.1, dists1-secops-skills-v1.3.1.plugin.shfmtandshellcheckclean;markdownlintclean for the edited files (two pre-existingMD056 table errors in the powerquery references are unchanged and fail identically at HEAD).
keys only in order to state that they are retired.