SkillOpt Epoch 3 improvements: make helper invocation, privacy handling, and separate downstream acceptance gates explicit. Local tests and repository CI validation passed; Droid review failure was an external tool-adapter failure with no substantive finding.
Authorized durable follow-up squash merge. Required validate passed at exact head f669280c1766c68df361b1703ea0d71cb4d52b05; PR was MERGEABLE and CLEAN with no blocking review.
Authorized durable follow-up squash merge. Required validate passed at exact head 42e62196bbdca341848e584985e687b0ec56ebf4; advisory droid-review failed due BYOK ApplyPatch tooling error with no review findings.
Align README runtime requirements and local core-test filtering with required CI semantics.\n\nCo-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add a focused regression covering default and explicit JSON output, document final repository validation commands, and include the catalog test in the shared core selection.\n\nCo-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Align local Makefile core tests with the required CI selection through a shared manifest and regression coverage.
Required validate passed at exact head f12e7fd576. Advisory droid-review failed with no actionable findings and is not a required gate.
2026-09-01 20:56:36 -04:00
Magnus HedemarkGitHubfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Squash-merge verified business methodology depth at exact head 9ca552f4c0. Required validate and paired evaluation checks passed; advisory droid review had no blocking findings.
Squash-merge verified telemetry query depth at exact head 02d16c58a4. Required validate and paired evaluation checks passed; advisory droid review had no blocking findings.
Squash-merge verified React and Vite expertise at exact head d4fd6cf70d. Required validate and paired evaluation checks passed; advisory droid review had no blocking findings.
Squash-merge verified routing remediation at exact head 690f9c14b0. Required validate and paired evaluation checks passed; advisory droid review had no blocking findings.
Squash-merge the verified #412 eval coverage implementation. Required validate and paired evaluation checks passed at exact head b43ac564a5919a0f23fdab49ba052d7c514915cb; droid-review BYOK failure had no findings and is advisory.
2026-09-01 19:58:35 -04:00
Magnus HedemarkGitHubfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Magnus HedemarkGitHubfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>factory-droid[bot] <138933559+factory-droid@users.noreply.github.com>
Document that the publish audio-guard fires only for --status published
(scheduling intentionally precedes audio attach) and that its pre-publish
episode GET consumes one rate-limit slot, relevant to bulk re-publish
loops.
Add references/skill-triggers.md rows for transistor and trakt, the two
thickened skills missing from the trigger index; phrasing follows each
skill frontmatter description.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-30 01:52:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
udp listen ignored the universal --dry-run flag and bound UDP 50222,
hanging when no hub is on the LAN. Add a dry-run plan branch that
describes the listen parameters (bind address, port, timeout, show-all)
and exits 0 without creating any socket, so doc claims of universal
--dry-run support stay universal and true.
Four regression tests pin the plan shape, the defaults/--show-all
propagation, and prove no socket is constructed (and no token demanded).
Recipe 5 documents the udp listen plan object alongside the other plans.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-30 01:52:10 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
main() sliced argv at the first occurrence of a known subcommand name,
so a value-flag pair whose value names a subcommand (e.g. login's
--server given `search`) made argparse dispatch the wrong subparser:
`jellyfin --server search browse ...` errored inside the `search`
sub-parser instead of running browse.
Dispatch now splits such misplaced pairs out of the top-level argv
(find_subcommand_token + split_misplaced_value_pairs) and re-attaches
them to the command tail, where each handler's parse_known_args already
tolerates unknown flags. A properly placed occurrence of the same flag
later in the tail still wins. Any other pre-command token (unknown
flags, stray positionals, `--`, dangling value flags) is untouched, so
argparse errors stay byte-identical to the pre-hardening CLI.
Also dedupe the twice-repeated "Bundled CLI --dry-run and exit-code
contract" section in references/worked-recipes.md (user-testing round 1
finding); content merged into one section.
Adds DispatchHardeningTests: the mis-slice scenario for every
subcommand shape, clean-argv dispatch for all 11 subcommands, flag
priority, argparse-owned error paths, and unit pinning of both helper
return-value tables.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-30 00:45:16 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
jellyfin: send the access token over exactly ONE channel per request (drop
the simultaneous X-Emby-Token header; the MediaBrowser Token= parameter is
the sole transport, legacy fallback remains documented as substitute-never-
stack and is request-capture tested); remove the dead no-op conditional in
JellyfinClient.__init__; make the login error-path test exception-safe with
patch.object; document the test-pinned dry-run plan keys and the actual
0/1/2 exit-code mapping in worked-recipes and SKILL.md.
peertube: replace the stale dry-run shape prose ('url'/'form') with the
test-pinned {dry_run, method, path, params} / form_fields keys; harden
cmd_me against a non-dict role (no AttributeError) with regression tests;
remove the dead client facade, the unused cmd_channels variable, and the
unused List/Tuple imports (ruff F401/F841 clean).
ghost: fold the 5 nested with-statements (ruff SIM117) in test_ghost.py
into single with-statements.
All three skills double-runner + proxy-trap green (25/56/37 tests);
validate-evals, paired smoke, quality validator, core gates, and catalog
check modes green.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-29 20:32:06 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Admin API writes carrying an html payload (create-post, update-post,
create-page) now attach the docs-required ?source=html query flag;
_post/_put gained params plumbing, and the create-post dry-run plan
includes params for plan/request parity. Regression tests pin the param
whenever an html payload is present (mocked request capture and dry-run
plans) and assert its absence on mobiledoc/lexical writes.
Docs: fix the jq interpolation typo in worked-recipes recipe 2 (missing
backslash made the scheduled-posts line exit 5), replace the blanket
"exit code 2" claim in admin-auth-and-basics with the script's actual
2-5 failure-class mapping, and state the source=html requirement in the
SKILL.md --html gotcha.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-29 19:53:50 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Research-driven rebuild of the peertube skill (docs.joinpeertube.org REST
reference 8.1.0 + SepiaSearch + server source + live anonymous probes):
- SKILL.md rewritten to the lastfm model: intent-grouped commands, pipeline
recipes, jq guidance, researched gotchas, When-to-use/When-not-to-use,
reference routing table. New negative boundary in the description
(YouTube/Vimeo uploads, video editing, server administration).
- scripts/peertube-cli -> scripts/peertube, rewritten and extended:
offset (start/count) pagination replaces the nonexistent page param,
comments fixed to the hyphenated /comment-threads route, server command
now composes /config/about + /server/stats (canonical paths), search
gains --search-target with searchTarget=local default and help text
stating its instance-local scope, new video/comments/channel/account/
my-videos/logout commands, --server hoisted before or after the
subcommand, OAuth2 password grant hardened for 2FA (x-peertube-otp)
and the production client_secret masking behavior, per-instance
owner-only token file with refresh-before-expiry and revocation.
- references/: auth-and-tokens, search-and-discovery, endpoint-catalog,
gotchas-field-guide, worked-recipes - all cited to official docs with
Sources footers (URLs verified live at authoring time).
- scripts/test_peertube.py: 54 offline tests (help, argument errors,
dry-run plans, mocked OAuth2 persistence/refresh/revocation, handler
contracts, documented pipeline chains) passing pytest strict-markers,
unittest discovery, and the proxy-trap zero-egress rerun; one
env-guarded anonymous live probe (PEERTUBE_LIVE_TESTS=1).
- evals/evals.json: six schema-v1 cases incl. SepiaSearch-scope and
masked-secret cases plus a should-not-trigger YouTube negative probe.
- README refreshed for humans; root README blurb and skill-triggers row
synced; marketplace.json/llms.txt regenerated (codex artifacts
unchanged); test-results/ gitignored (pytest runner artifact).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-29 18:43:00 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Root README blurb and references/skill-triggers.md trigger row now
match the thickened jellyfin description (manual-sync requirement).
- Regenerate .claude-plugin/marketplace.json and llms.txt via --write:
both embed skill descriptions, so the rewrite staled them; check
modes exit 0 again. Codex artifact unaffected (no descriptions).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-29 17:38:18 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Full lastfm-model rebuild of the jellyfin skill against the 12.0-era
OpenAPI spec, core-dev authorization guidance, and server source:
- Document the researched auth sequence end to end: complete pre-token
Authorization: MediaBrowser Client/Device/DeviceId/Version header
required by POST /Users/AuthenticateByName (400 "Error processing
request." without it), AccessToken returned, then Token= on the same
header (legacy X-Emby-Token deprecated, disableable since 10.11,
targeted for removal at 12.0).
- Extend scripts/jellyfin: new `login` subcommand demonstrating the
pre-token header and printing session exports (password via
stdin/prompt/env only), seasons/episodes TV navigation, next-up
--series-id, browse --user-id (userId is required on non-API-key
auth per the ItemsController guard), modern Token= header transport
with X-Emby-Token fallback, 503 Retry-After handling, search
Id/deprecated-ItemId fallback.
- Add 5 cited reference files (auth/sessions, endpoint catalog,
user-scoping matrix, gotchas field guide, worked recipes) plus
quick-connect; all cite api.jellyfin.org and live-verified sources.
- Upgrade relocated scripts/test_jellyfin_cli.py to the double-runner
standard: 24 tests (was 8) covering help, argument errors, dry-run,
mocked login header sequence, TV navigation, search-id fallback, and
jq-executed pipeline-consumability chains; zero egress proven via
proxy-trap rerun.
- Add evals/evals.json (6 cases incl. emby-install-not-for-jellyfin
negative probe); rewrite SKILL.md (224 lines) and README; sync root
README blurb and skill-triggers row; regenerate marketplace.json and
llms.txt (description-embedding artifacts).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Merging with required validation green. Droid Auto Review was retried twice and failed before producing a review because DeepSeek V4 Flash rejected the action's ApplyPatch tool; the check is non-required per branch protection. The diff was independently inspected and local/repository validation passed.
2026-08-26 19:42:25 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Addresses the tracked follow-up debt from thicken-openlibrary: the client
already bounds /type/redirect stub chasing at MAX_REDIRECT_HOPS, but a
chain that outlives the budget silently handed back an opaque stub, which
downstream commands rendered as an empty-shaped record with no hint why.
The walk now emits a stderr warning naming the unresolved location before
returning; mocked test drives HOPS+1 chained stubs end to end.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 19:35:15 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
cmd_work tolerates explicit "authors": null (and non-dict entries) via
(data.get("authors") or []) guarded iteration, returning an empty array
instead of raising TypeError. cmd_isbn --json now emits authors as an
array of bare OLA keys matching `work --json` under the same field:
the edition path uses tolerant key extraction (flat refs, stray
double-nested refs), dedupes, and falls back to the linked work's
double-nested author keys when the edition ships none; publishers
likewise become a real list. Human output still renders comma-joined
labels. Refreshes the recipe gotcha note that still described the old
raw-curl work-record shape.
Adds mocked coverage: null-author work record (JSON [] + human '?'),
cross-command symmetric author arrays, tolerant edition key-only and
mixed-shape refs, ISBN handoff type stability, human label rendering,
and label-vs-key separation on mixed records.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 19:32:59 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
SKILL.md essential commands show --page usage, add a seq/jq page-loop
recipe driven by the pagination.page_count field of the JSON output
(with 429 Retry-After handling), and document that --json emits
movies/shows plus the normalized pagination object whose keys mirror
X-Pagination-* headers, degrading to {} when headers are absent; human
output notes the Page N of M footer rule. References state
per-invocation paging and the same degradation fallback. Evals replace
the header-only pagination case with an executable loop case and a
second-page trending case asserting --page, pagination keys, and array
preservation. README Quick Start and test-table rows updated to match.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 18:50:30 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Every discovery command (movie/tv x trending/popular/anticipated) now
accepts --page alongside --limit and forwards both as query parameters.
TraktClient._get returns (data, pagination) where pagination is the
X-Pagination-* header set normalized onto the stable keys page, limit,
page_count, and item_count; missing or non-numeric headers degrade to an
empty object. JSON output keeps the movies/shows array beside a new
pagination object, human output appends "Page N of M" only when the
headers are present, and cmd_movie/cmd_tv collapse into one shared
cmd_discovery handler.
Adds mocked coverage for page=2 request params across all six commands,
header normalization (full/lowercase/partial/unparseable/missing),
missing-header fallback at client level, stable movie trending wrapper
and TV shapes beside pagination, and human page-line presence rules.
Green under pytest strict-markers, unittest discover, and the proxy
trap (zero egress).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 18:49:47 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Replace raw-argv dispatch with parsed-attribute routing; add the
documented nested `genre list --type movie|tv` subparser while keeping
the flat legacy form a clean argparse rejection instead of a crash.
- Route `tv search` through client.search_tv (/search/tv) with TV
formatting (name / first_air_date) via new cmd_tv_search.
- Gate find --source to exactly the official eight external_source
values (imdb_id, facebook_id, instagram_id, tvdb_id, tiktok_id,
twitter_id, wikidata_id, youtube_id); docs explicitly reject retired
freebase_mid/freebase_id; SKILL.md documents both --type variants.
Adds parser-level regression tests for genre list, endpoint-selection
and output-shape tests for tv search, and parameterized acceptance and
rejection tests for external_source values (13 tests, 10 subtests,
green under pytest strict-markers, unittest discover, and the proxy
trap).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 18:29:26 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add researched TMDb references, external-ID and detail commands, offline tests, and eval coverage. Refresh the human README and generated catalogs.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 09:52:28 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Root README blurb and skill-triggers row updated to match the new frontmatter description; marketplace.json and llms.txt regenerated via gen-*.rb --write (codex/agents outputs unchanged). Check modes all green.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 08:44:48 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
SKILL.md rebuilt to the lastfm model: keyless setup with covers-host table, intent-grouped commands including new editions/ratings, ISBN-to-work-to-author pipeline recipe, jq guidance, Known Gotchas grounded in researched behavior (ISBN 302 redirects, merge stubs inside HTTP 200, OL...M/W/A suffix system with double-nested author refs, availability-needs-ia projection rule, silent-empty search errors, rate etiquette), When-to-use/When-not-to-use boundaries, and a four-row reference routing table. Body 240 lines. README rewritten for humans with verified What You Get paths. Description updated with imperative verb start and negative boundary.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 08:44:37 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Six schema-v1 cases: ISBN-to-work-author key-graph walk, ebook discovery pipeline, the ISBN 302-redirect gotcha diagnosis, author disambiguation, a should-not-trigger probe for Koha/MARC library administration (id contains -not-), and keyless-setup/rate-etiquette guidance. Passes validate-evals and the fake-adapter paired smoke.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 08:44:08 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
27 tests across five classes: help output, argument errors, dry-run plans, mocked-client logic (merge-stub following with .json suffix repair, work-author fallback for authors:null editions, editions paging, ratings join, covers-host URLs, empty-results-as-success), plus two live probes gated behind OPENLIBRARY_LIVE_TESTS=1 that skip cleanly otherwise. Passes strict-markers pytest, unittest discovery, and the proxy-trap zero-egress rerun.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 08:43:54 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
New subcommands: editions (per-work edition listing with next_offset) and ratings (joined ratings + bookshelf counts). The client now follows in-body /type/redirect stubs left by merged records (appending .json to stub locations, since extension-less URLs 301 into HTML), recovers author keys from the linked work when edition records ship authors:null, normalizes bare/path key forms, unwraps {type,value} text fields centrally, assembles covers-host URLs skipping -1 placeholders, and validates sort choices client-side to avoid the server's plain-text 500 on unknown values. Existing flags, subcommands, --json, and --dry-run preserved.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 08:43:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Four cited reference files distilled from live-verified research against
openlibrary.org developer docs: OL...M/W/A key graph with merge-stub behavior,
search query syntax and error model, ISBN 302 redirect resolution and covers
host rules, plus worked curl/jq pipelines with a symptom-indexed gotcha table.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 08:43:13 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
The die() message on connection failure told users to 'use --server',
but no such flag exists; JIRA_SERVER is the only endpoint override.
Replace the false clause with a hint that matches actual behavior.
Flagship scrutiny follow-up (non-blocking issue 1 from
thicken-jira-flagship validation).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 06:50:46 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Rewrite SKILL.md (199/500 body lines) with Setup (basic-auth token
mechanics), intent-grouped commands incl. new count/transitions,
three pipeline recipes, jq guidance, Known Gotchas grounded in
researched API behavior (search-endpoint duality with CHANGE-2046
status, transition screen-field requirements, ADF, CAPTCHA lockouts,
rate-limit headers, accountId GDPR migration), When-to-use /
When-not-to-use boundary, and a routing table covering all six
reference files.
Add schema-v1 evals/evals.json: six cases (read-only search,
stalled-sprint bulk-close pipeline, transition-id gotcha,
approximate-count, auth setup/expiry, and a GitHub-issue
should-not-trigger negative probe). Passes validate-evals and the
paired fake smoke.
Refresh README to human format with What You Get table listing real
paths. Regenerate catalogs for the description change; sync root
README blurb.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 06:10:12 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Script: add a 'count' subcommand (POST /search/approximate-count) and a
'transitions' discovery subcommand, plus --resolution on transition
(satisfies Done-screen requirements in one call), offset-paginated
fetches for --max > 50 with empty-page termination when total shrinks,
parsed API error envelopes (errors map + errorMessages) instead of raw
dumps, and 429 handling surfacing Retry-After/RateLimit-Reason. Existing
flags, --json/--dry-run, and subcommands preserved; stdlib+requests only.
Tests: 20-case offline suite (help output, argument errors, dry-run
plans, mocked-client pagination/error/transition logic) passing pytest
and unittest runners including the proxy-trap zero-egress rerun.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 06:09:56 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Two new reference files distilled from live Atlassian docs research:
rest-auth-and-search.md (basic-auth email+token vs OAuth/PAT split,
rate-limit headers, error envelopes, legacy /search offset paging vs
enhanced /search/jql nextPageToken model with CHANGE-2046 deprecation
status) and rest-issues-and-transitions.md (issue CRUD shapes, the
GET-transitions-then-POST flow with screen-field requirements and
resolution semantics, ADF document model). Both carry Sources footers.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 06:09:16 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add jql-history-and-dates.md covering WAS/CHANGED predicate walkthrough,
relative-date expression tables, and saved-filter composition/naming
conventions, per foundation scrutiny depth directives. Swap cookbook
query 49's organizationMembers("Atlassian") for the YOUR_ORG placeholder
and fix the matching catalog example. All claims cited to live-verified
Atlassian docs.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 06:09:06 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Refresh all three generated artifacts so they reflect the jira-jql
removal and the renamed skill set:
- .claude-plugin/marketplace.json (154 plugins)
- .codex-plugin/plugin.json (154 skills)
- llms.txt (154 skills)
The codex generator also rewrites .agents/plugins/marketplace.json;
it remains byte-identical to origin/main (single-entry pointer
artifact carrying no skill names).
All three check modes exit 0 against the current tree.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 03:16:55 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Migrate the retired jira-jql skill content into three dense
jira/references/ files, preserving full substance:
- jql-functions-catalog.md: complete function catalog with fields and
operators, including JSM approval functions (approved/pending/
approver/pendingApprovalBy/myApproval family) and SLA functions
(breached/running/paused/completed/remaining/withinCalendarHours)
- jql-best-practices.md: performance rules, operator precedence
(AND binds tighter than OR), the empty-value trap (!= excludes
nulls), troubleshooting flows, marketplace extensions
- jql-cookbook.md: 50 ready-to-run queries organized by role
(developers, scrum masters, product owners/managers, power users,
admins)
Wire a Reference Files routing table into jira/SKILL.md pointing at
all three; add JQL gotchas (empty-value trap, precedence, leading
wildcards, search-endpoint duality) and two multi-step pipeline
recipes to SKILL.md. Each migrated file carries a Sources footer with
verified Atlassian doc URLs plus attribution to the retired skill.
Token parity vs source corpus: 53/53 function tokens preserved.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 03:14:48 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Align the convenience-index keyword with the env vars the bundled
tmdb script actually reads (TMDB_ACCESS_TOKEN or TMDB_API_KEY).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 02:34:57 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
The quality validator enforces an imperative-verb description plus a
negative boundary on every changed SKILL.md. The six renamed skills and
cli-builder carried no substantive boundary, so add a tailored
When-not-to-use section to each naming concrete alternatives (dashboard
administration, sibling platforms, adjacent skills). cli-builder lands
at 499 lines, inside the 500-line budget.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 02:26:59 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Update every audited reference site to the six renamed skills:
root README headings and links (and drop the jira-jql entry ahead of
its absorption), references/skill-triggers.md rows for jellyfin and
tempest plus four new-name rows for ghost/jira/openlibrary/tmdb,
scripts/grandfathered-skills.txt pruned to the three retained *-cli
entries, pyproject.toml deptry exclusion jellyfin-cli -> jellyfin,
neckbeard routing seams, cli-builder example names, and the lastfm /
verification-methodology eval texts mentioning jellyfin.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-26 02:13:56 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Rename ghost-cli, jira-cli, jellyfin-cli, openlibrary-cli, tmdb-cli,
and tempest-cli to ghost, jira, jellyfin, openlibrary, tmdb, and tempest
via git mv. Rewrite frontmatter name fields to match new directories,
rename bundled scripts preserving executable bits, update internal
invocation strings and README quick-start examples, and relocate the
jellyfin pytest suite to jellyfin/scripts/ with its SCRIPT constant now
resolving to the renamed sibling script.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* feat(bmad): add BMad control-plane protocol skill
New standalone methodology skill that lets any agent run the BMad method
(Breakthrough Method of Agile AI-Driven Development) as a harness-agnostic
control-plane protocol: five-field intent contracts, direct/bounded/initiative
classification, review-as-triage, failure routing by layer, and autonomy gating
with machine-readable spec status.
- SKILL.md protocol core with progressive disclosure + When not to use
- README.md human-facing install guide
- 9 references: protocol, classification, spec, lifecycle, project-context,
review-and-failure-routing, autonomy, party-mode, adoption
- 4 templates: SPEC, INTENT, STORY, REVIEW
- scripts/check-spec.py + 16 tests (stdlib, deterministic spec validation)
- evals/evals.json: 9 output-quality cases
- Routing seams from bmad to adjacent skills and back from
spec-driven-development, product-shaping, implementation-planning, neckbeard
- Catalog updates: root README, skill-triggers, marketplace/plugin/llms.txt
Closes#399
* fix(bmad): address droid-review findings
- check-spec.py: skip headings inside fenced/indented code blocks so a spec
cannot PASS on section text that only appears in a code sample
- check-spec.py: catch UnicodeDecodeError on non-UTF-8 files and report FAIL
instead of crashing
- STORY.md template: add created key for resumability/traceability parity
- SPEC.md template: split in-progress and in-review status bullets
- add 2 regression tests (heading-in-fence, non-UTF-8)
* fix(bmad): address droid-review round 2
- check-spec.py: read specs with utf-8-sig so a UTF-8 BOM cannot silently
disable the frontmatter status check
- check-spec.py: handle standard YAML inline comments after status values
(status: draft # pending review) without a false FAIL
- references/protocol.md: make lifecycle phrasing consistent with
lifecycle.md — four phases plus a learning closeout
- add 2 regression tests (BOM, inline comment)
* fix(bmad): tolerate trailing whitespace on frontmatter delimiters
A spec whose --- delimiter lines carry trailing spaces or tabs would silently
disable the status check and let an invalid status PASS. Relax the delimiter
pattern and add a regression test.
* fix(bmad): ignore inline comments in quoted status values
* fix(bmad): tolerate leading blank lines before frontmatter
* fix(bmad): fail closed on unparseable frontmatter, matching fence markers
Address droid-review round 5 and 6 findings as a single closed class:
- Fail closed when a file opens with a --- delimiter that cannot be parsed,
so no whitespace/frontmatter permutation can silently disable the status
check (previously: unparseable frontmatter was treated as 'no status'
warning, letting an invalid status PASS).
- Track fence opener markers in collect_headings so a mismatched fence no
longer closes a code block early (false-PASS on missing sections) and an
unclosed fence no longer swallows real headings.
- Accept empty well-formed frontmatter (---\n---) and closing delimiters
without a trailing newline.
- STORY.md template: parent-spec points at the sibling SPEC.md.
- README: status vocabulary is not a strict linear chain; blocked is a
resumable routing signal.
Whitespace/frontmatter mutation sweep: 9 formatting variants x valid/invalid
status all verdict correctly; malformed delimiters fail closed. 29 tests.
- product-roadmapping-and-portfolio: name the bets boundary in "When Not
to Use" — this skill sequences strategic bets across cycles; shaping a
single bounded bet routes to product-shaping.
- product-shaping: sharpen the existing roadmapping boundary sentence to
spell out bet vs. sequences (appetite + circuit breaker vs.
continue/pause/kill across cycles).
- neckbeard README: route feature-sized work through product-shaping
between discovery (product-discovery) and specification
(spec-driven-development).
Docs-only routing seams per #394; no behavioral content changes.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Issue/ticket bodies emitted from a delivery run must be written for a cold
reader: a contributor with none of the session context and no access to the
agent's local artifacts. Encode this at the change-contract layer so any run
that emits tracker artifacts inherits it.
- templates/change-contract.md: new "Issue/ticket body (cold-reader
requirement)" section listing the five requirements (background naming the
investigation, complete inline evidence with file:line refs, reproduction
commands runnable by a stranger, acceptance-criteria checkboxes, no
agent-local paths or private-artifact references), plus a header-note
pointer with the litmus test.
- references/journey.md: journey-level statement of the requirement plus
pointers at phase 1 (intake output row) and phase 5 (verification-planning
output row) where tracker artifacts are emitted.
- evals/evals.json: add case cold-reader-issue-body-gate covering a body draft
that references off-repo artifacts ("artifact pyramid", local /tmp ledger,
detail available on request) and must be rejected/rewritten by the gate.
Closes#385
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Implements issue #378 (Finding F4 of the journey SDLC validation brief):
separate validation from verification in the change-request journey.
Gate 3 now requires that at least one SPEC.md acceptance criterion traces
to the requester's stated outcome/problem restated from primary evidence
in phase 2 - verification proves the build matches the spec; this
criterion proves it solves the requester's actual problem (15288/12207
validation vs. verification discipline).
- references/stages.md: authoritative new Gate 3 bullet (single source
of truth for gate definitions)
- references/journey.md: phase 4 Output and Gate rows aligned, deferring
to stages.md; phase-continuity and gate summary unchanged
- templates/change-contract.md: acceptance-criteria guidance requires a
criterion tracing to the Problem section
- templates/delivery-packet.md: acceptance-criteria mapping field asks
for the requester-outcome trace for the gate-3 verdict
- evals/evals.json: gate-3 assertions updated in four full-path cases;
all 13 case IDs stable
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
CI's changed-skill quality gate requires descriptions to begin with a
recognized imperative verb (repo AGENTS.md rule). The seam edit in this PR
made the file a changed skill, surfacing the pre-existing violation.
Implements issue #377 (journey dossier F2, ADAPT verdict): phase 9 closeout
now records lesson capture per stages.md Stage 6 "Deliver and learn" — either
the reusable lesson(s) and their durable destination (skill, memory, or
project docs), or an explicit "no reusable lesson identified" determination.
Mirrors skip transparency: silent omission is prohibited. Terminal-state
semantics stay intact — lessons are recorded IN the terminal record; a fired
trigger or follow-up starts a new change request via phase 1 intake.
- references/journey.md: phase 9 Output row gains the lesson-capture field;
phase-continuity row updated ("terminal; triggers and lessons recorded in
the terminal record").
- references/delivery-packet.md: group (i) row gains lesson capture; terminal
semantics cover lessons alongside triggers; skip-transparency doctrine
cross-referenced for closeout lessons.
- templates/delivery-packet.md: section (i) fillable "Lessons captured" field
with durable-destination note + example line.
- references/lifecycle.md: intro, terminal-states closeout note, and closeout
row aligned with the extended group-(i) field set.
- evals/evals.json: expected_output + assertions extended in bug-fix-
reproduction-regression and refactor-characterization-architecture-review
(13 IDs stable).
stages.md untouched: Stage 6 already mandates lesson capture; journey/packet
now consume it. README table unchanged (still accurate).
Closes#377
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Implements issue #376 (journey dossier F1, ADAPT-minimal verdict): phase 9
closeout now records rollback/follow-up triggers alongside terminal state +
release evidence, stating what would cause re-entry; operational discoveries
route to a NEW change request via phase 1 intake instead of resurrecting the
terminal packet. Terminal-state semantics stay intact.
- references/journey.md: phase 9 Output row gains trigger fields + new-CR
routing; phase-continuity row updated ("terminal; triggers recorded in the
terminal record").
- references/delivery-packet.md: group (i) row gains trigger fields; terminal
semantics clarify triggers are recorded in, not re-opening, the packet.
- templates/delivery-packet.md: section (i) fillable field + example.
- references/lifecycle.md: intro, terminal-states note, closeout row aligned.
- evals/evals.json: assertions extended in bug-fix-reproduction-regression,
schema-migration-rollback-release-readiness, release-authority-blocked-
terminal-state (13 IDs stable).
- research brief: F1 citation of "SKILL.md step 6" corrected to step 5.
No phase added; stages.md untouched (lesson capture is issue #377).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add NVIDIA SkillEvaluator as an advisory (non-blocking) Tier 1 gate on
PRs and pushes touching skill-relevant paths. Runs the documented
keyless check set (schema,pii,license,quality,unicode,lint) pinned to
skillevaluator v0.1.0 per changed skill, uploads JSON reports as an
artifact, and posts one advisory summary line per skill to the job log.
SkillSpector is deliberately not installed: upstream still ships it
"separately installed and unpinned", so the security scan is excluded
by design until a documented compatible pair exists.
Closes#383
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Convert the prose Scripts list into the formal table with copy-pasteable
invocations verified against each script --help, and add factual
Prerequisites and Limitations.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:55 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This resource-based skill ships no scripts, so instead of an Available
Scripts table, document the resources it loads (sub-skill protocols,
references, generation templates), the agent capabilities it needs, and
its real limitations (Hermes-runtime targeting, observation-mode turn
threshold, inference-only discovery).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:55 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Consolidate the two generation/post-processing scripts into the formal
Available Scripts table and add factual Prerequisites and Limitations,
slotting cleanly into the post-#382 references structure.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Document both previously undocumented pytest suites alongside the profiler
and reconciler in the formal table, and add factual Prerequisites and
Limitations.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add factual Prerequisites and Limitations. Lead the description with an
imperative verb and add an explicit negative boundary to satisfy the
quality validator; keep trigger keywords intact.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Add schema-v1 evals/evals.json with six cases covering growth check-ins,
series trending with time-to-target, decision framing, projections, a
should-not-trigger case, and benchmark honesty. Fix documented flags that
do not exist in the script (--project-weeks/--target-revenue/--add-to-
weekly) to the real ones (--project-periods/--target-value/--dry-run).
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:43 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Formalize the woodpecker-doctor.py entry into an Available Scripts table,
add factual Prerequisites and Limitations, and normalize the negative-
boundary heading so the quality gate recognizes it.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:29 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Convert the prose Root Scripts list into the formal Available Scripts table
with copy-pasteable invocations, and add factual Prerequisites and
Limitations from compatibility frontmatter and bundle behavior.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-22 23:38:29 -04:00
Magnus Hedemarkandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>