[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RHV8DR6K242WDMB9HZ8WW":3,"skill-same:01M71RHV8DR6K242WDMB9HZ8WW":1050},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":6,"ownerHtmlUrl":62,"ownerBlogUrl":6,"ownerDescription":63,"updatedAt":64,"install":65,"resources":78},"01M71RHV8DR6K242WDMB9HZ8WW","autospec-test",null,"Use when you want to gate every Phase 4 PR on unit + E2E test coverage against an isolated environment, auto-heal coverage gaps within a 60-minute coding budget, and block assertion-loosening rewrites before auto-merge.","berlinguyinca\u002Fautospec","berlinguyinca","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16364?v=4","01M71R7C0SWBG05FNHQE4XQ7Y3","Gert Wohlgemuth","01M71R7C1VY5K3Q715RNDDBVGQ",3,"MIT","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"test","autospec test","autospec","gaps","coverage gaps","use","e2e","environment","pr","coding","Budget","test coverage","merge","phase","you","when","auto","e2e test","unit","coverage","2026-11-10 13:02:02",false,"---\nname: autospec-test\ndescription: Use when you want to gate every Phase 4 PR on unit + E2E test coverage against an isolated environment, auto-heal coverage gaps within a 60-minute coding budget, and block assertion-loosening rewrites before auto-merge.\n---\n\n# autospec-test — Unit + E2E Coverage Gate with Self-Heal Loop\n\nEnforce that every PR produced by `\u002Fautospec-run` ships with thorough, passing unit + E2E test coverage against an isolated environment, and that any gaps the gate finds get auto-healed by a bounded LLM loop within the same PR.\n\n## Self-update\n\nDecide this purely from the request text the harness handed you. Do NOT\nshell out (no `grep`, `sed`, `[[ =~ ]]`, command substitution, etc.) to\ntest the user's free-form request — passing it through a shell is what\nhistorically tripped harness permission engines. Read the request, normalize\nit in your reasoning (collapse whitespace, trim, lowercase), and if the result is\nexactly `update`, this skill enters self-update mode and does NOT run the\nnormal pipeline.\n\n1. Detect harness by checking which install path exists for this skill:\n   - Claude Code: `~\u002F.claude\u002Fskills\u002Fautospec-test\u002FSKILL.md`\n   - OpenCode:    `~\u002F.config\u002Fopencode\u002Fagent\u002Fautospec-test.md`\n   - Codex CLI:   `~\u002F.codex\u002Fprompts\u002Fautospec-test.md`\n2. Re-install from `main` by piping the canonical installer:\n   ```\n   curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fberlinguyinca\u002Fautospec\u002Fmain\u002Fbootstrap.sh | bash -s -- --skill all --harness all --update\n   ```\n   Run this one-liner once; it refreshes all autospec skills across all harnesses.\n3. Show the diff between the prior installed file(s) and the freshly fetched copy.\n4. Stop. Do not enter any pipeline phase. Print the upgrade summary and return to the user.\n\nIf no install path is detected, print `Self-update: no installed copy of autospec-test found; run install.sh first.` and exit.\n\n## Model tier\n\n`reasoning:standard, ctx:120k`\n\nThis skill runs inline inside the Phase 4 implementer worktree (same model tier as the outer implementer) or standalone against a specified PR branch. No Tier A dispatch required for normal operation; the coverage gate and self-heal loop are deterministic or LLM-light.\n\n## When to use\n\n- Automatically: `\u002Fautospec-run` Phase 4 invokes this skill after the build + lint gate passes and before admin auto-merge, for every PR that closes an `auto-implement` issue.\n- Standalone: `\u002Fautospec-test [PR#]` for ad-hoc validation of any branch or PR against main — useful before filing an issue or after a manual hot-fix.\n- First-time setup: `\u002Fautospec-test --init` to interactively configure `.autospec\u002Ftest.yml` in a target repo.\n\n## When not to use\n\n- When the target repo has no test suite at all (no jest\u002Fvitest\u002Fmocha\u002Fpytest\u002Fgo test\u002Fcargo test found, no Playwright). Use Skill D (suite bootstrapper) first.\n- When clone provisioning is not yet in place and no `E2E_BASE_URL` \u002F `PLAYWRIGHT_BASE_URL` \u002F `BASE_URL` env var is set. The gate will refuse to run (exit 2) rather than silently hit production.\n- When `~\u002F.autospec\u002Fno-test.flag` exists (operator opt-out for repos where testing is handled by an external CI system).\n- For repos in the autospec family itself (autospec is a bash\u002Fmarkdown skill repo with no Playwright suite). The skill self-detects and skips gracefully.\n\n## How it works\n\nTwo-stage gate runs sequentially inside the Phase 4 worktree:\n\n```\nPhase 4 existing: build + lint\n        │\n        ▼\nStage 1: unit tests + unit-coverage gate\n        │ (must pass before Stage 2 starts)\n        ▼\nStage 2: E2E tests + E2E coverage gate\n        │\n        ▼\nAssertion-shift guardrail (covers both stages' test diffs)\n        │\n        ▼\nAuto-merge or block\n```\n\n**Stage 1 — Unit (Metric E):** Code coverage thresholds (defaults 95\u002F90\u002F95 lines\u002Fbranches\u002Ffunctions), function-presence check (every exported\u002Fpublic function has at least one unit test), and all unit tests pass with no `.only`, `.skip`, or `xit`.\n\n**Stage 2A — disciplined authoring (opt-in):** Runs between Stage 1 and Stage 2 only when `e2e.authoring.enabled: true` in `.autospec\u002Ftest.yml`; otherwise it is skipped with zero overhead. The orchestrator (`stage2a-orchestrator.mjs`) clusters crawler-discovered routes into author-assignable groups (`clusterRoutes` — auto by first path segment, capped at `fanout_max`, or an explicit `route_clusters` override), centralizes shared harness files into `helpers_dir` as a single writer that never clobbers divergent files (`centralizeHelpers`), runs a `playwright test --list` parse gate before the real run (`parseGate`), and writes `e2e\u002F.autospec\u002Fcoverage.json` as `{total, covered, pct}` from the crawler manifest denominator — not author self-report (`coverageReport`). Each authored spec passes `lint-playwright-author.mjs`, whose `PW_SELECTOR_UNVERIFIED` rule resolves every selector against app source via `selector-evidence.mjs` so invented `data-testid`s hard-fail; failures feed the MAX=5 adaptive-retry loop with corrective directives.\n\n**Spec-compliance QA audit:** For UI\u002Fproduct features, Stage 2 must also use\nthe `autospec-qa` prompt shape when generating or healing E2E coverage: extract\nthe spec into a traceability matrix, interact with the running app like a user,\ncover text boxes, textareas, selects, dropdowns, checkboxes, radio buttons,\nbuttons, links, forms, validation, state changes, API effects, accessibility,\nresponsive layouts, negative paths, and cross-feature flows, then regenerate\ntests for every missing or weak behavior. Do not mark a spec requirement PASS\nfrom code inspection alone.\n\n**No-mock deployed smoke:** Mocked API tests are necessary but insufficient for\nworkflow buttons and dropdowns. For each workflow action, Stage 2 should include\na deterministic mocked happy path plus a no-mock smoke path against the\nconfigured deployed\u002Fdev URL when the target contract permits it. The smoke path\nmust assert no live-failure banner, a visible domain result, request\npayload\u002Fquery changes from selected values, and recovery or actionable UI for\nknown backend failure signatures such as `502` bridge\u002Fproxy outages.\n\n**Self-heal loop:** Up to 5 iterations, 60 minutes of coding time (paused while tests run). Each iteration classifies failures (missing_unit_test, missing_test, failing_unit_test, failing_test, flaky_test, selector_brittle, product_bug) and picks the highest-priority cluster that fits remaining budget. Loop state persisted in `.autospec\u002Ftest-loop-state.json` in the worktree so monitor relaunches resume rather than reset.\n\n**Assertion-shift guardrail:** AST + regex pass over all modified test files. LOOSENING changes block auto-merge (adds `needs-human-review` + `e2e:assertion-loosening`). SHIFTING is conditionally allowed if the same commit also modifies a non-test source file and includes `JUSTIFICATION:` in the commit message. STRENGTHENING always allowed.\n\n## Spec-compliance QA prompt\n\n`autospec-qa` is the canonical full prompt for spec-to-running-app QA. Do not\nduplicate that full prompt here. When Stage 2 or the self-heal loop generates\nUI\u002Fproduct E2E tests, import its intent and preserve these minimum anchors:\n\n- **Spec traceability:** every spec requirement maps to expected behavior,\n  evidence, and PASS\u002FFAIL\u002FPARTIAL\u002FNOT TESTED status.\n- **UI controls:** text inputs, textareas, selects, dropdowns, checkboxes,\n  radio buttons, buttons, links, forms, validation, state changes, responsive\n  layouts, and accessibility are exercised as user-visible behavior.\n- **No-mock deployed smoke:** mocked happy paths are paired with no-mock\n  deployed\u002Fdev smoke paths whenever the target contract permits it.\n- **Outcome assertions:** tests prove visible domain results and absence of\n  live-failure banners, not just clickability or request dispatch.\n- **User input intent review:** for every input-like control, ask what it is\n  for, why it exists, how users should use it, what request\u002Fstate\u002Fresult it\n  affects, how invalid\u002Frejected input behaves, and whether evidence from the\n  running app proves it was implemented and tested correctly.\n- **Live backend blocker triage:** before leaving no-mock smoke `NOT TESTED`,\n  search safe config surfaces, avoid printing secret values, clean temporary\n  credential material, probe health\u002Fstatus\u002Ffleet paths when available, and\n  classify the blocker as credentials, infrastructure health, route mental\n  model, or route-specific worker\u002Fhandler failure.\n- **Proof artifacts:** emit or draft `.autospec\u002Fproof-matrix.json`,\n  `.autospec\u002Freliability.yml`, `.autospec\u002Fcontrol-intent-ledger.json`,\n  `.autospec\u002Fmutation-proof.json`, and `.autospec\u002Fcanary-results.json` so spec\n  rows connect to implementation files, tests, live evidence, blockers, and\n  follow-ups.\n- **Reliability contract:** backend-backed features declare required live smoke\n  workflows, representative inputs, seed\u002Flive data, allowed mocks, required\n  no-mock paths, health probes, fallback behavior, forbidden URLs, and forbidden\n  false-green patterns.\n- **Control intent ledger:** every reachable control is classified as\n  functional, read_only, decorative, or unclassified; unclassified controls keep\n  the result PARTIAL or FAIL.\n- **Duplicate-code guardian:** generated components, helpers, validators, API\n  clients, request wrappers, error banners, fixtures, and test utilities are\n  checked against existing repo patterns before acceptance.\n- **Mutation\u002Fbreakage proof:** at least one critical workflow per feature proves\n  the test fails when request propagation, result rendering, fallback behavior,\n  persistence, or backend responses are broken.\n- **Post-merge deployed canary:** when a deployed\u002Fdev URL exists, representative\n  no-mock workflows are defined for post-merge verification and failed canaries\n  create regression issues with route classification.\n- **New code intent gate:** every new component, module, function, endpoint,\n  worker, hook, or test helper has a spec-linked reason, reuse check, public\n  contract, proof test, and \"what breaks if wrong\" answer.\n- **Artifact freshness:** proof artifacts record commit SHA, spec hash,\n  environment\u002Fapp URL, test command hash when practical, and generation time;\n  stale artifacts cannot support PASS.\n- **Evidence provenance:** every PASS cites inspectable evidence such as test\n  file\u002Fname, command output, screenshot\u002Fvideo\u002Ftrace\u002Flog path, network summary,\n  deployed URL, representative input, or backend probe result.\n- **Console\u002Fnetwork gate:** unexpected frontend exceptions, failed network calls,\n  runtime warnings, generic live-failure banners, swallowed errors, or timeouts\n  fail the workflow unless they are the explicit negative path under test.\n- **Spec contradiction detector:** conflicting, untestable, UI\u002FAPI-mismatched,\n  or data-missing requirements become AMBIGUOUS\u002FPARTIAL with follow-up.\n- **Data lifecycle proof:** stateful features prove create, refresh, edit,\n  delete, rollback, idempotency, navigation, and relevant concurrency behavior.\n- **Observability contract:** backend-backed workflows expose enough safe health,\n  timing, correlation, and user-safe error information to triage failed canaries\n  without leaking secrets or PII.\n- **Flake quarantine:** retries, sleeps, widened timeouts, and reruns are\n  classified as product race, selector fragility, backend instability,\n  environment issue, or test oracle weakness before acceptance.\n- **Reliability exhaustion loop:** repeatedly ask what else could make the app\n  unreliable, duplicated, or falsely green; every actionable answer becomes a\n  fix, stronger test, proof update, contract update, or follow-up issue.\n- **Legacy removal and spec cleanup:** when a spec or accepted architecture\n  deprecates a route, cache, bucket, storage backend, worker, feature flag,\n  config key, UI path, or data source, generated tests and fixes must prove the\n  replacement path and remove stale code\u002Fspec\u002Fdocs references instead of\n  repopulating or relying on the deprecated surface.\n- **Backend fragility:** `502` bridge\u002Fproxy\u002Fcache failures require regression\n  coverage plus either a documented fallback route or a clear actionable user\n  state; mocked endpoint success is not proof of deployed workflow success.\n- **Critical self-question:** before accepting green tests, ask: \"What could\n  still pass here while a real user workflow fails?\" Add one test or issue for\n  the highest-risk answer.\n\n## Contract file\n\n`.autospec\u002Ftest.yml` in the target repo. Most fields autodetected; the file's primary purpose is declaring **forbidden URLs** (mandatory) and any Mode II opt-in.\n\nMinimal valid contract:\n\n```yaml\n# .autospec\u002Ftest.yml\nmode: strict_isolation\n\ne2e:\n  clone_url_env: E2E_BASE_URL\n  forbidden_url_patterns:\n    - \"^https?:\u002F\u002Fapp\\\\.acme\\\\.com\"\n    - \"^https?:\u002F\u002F.*\\\\.prod\\\\.acme\\\\.internal\"\n\nbudgets:\n  coding_time_minutes: 60\n  max_loop_iterations: 5\n  same_error_halt_threshold: 3\n```\n\n**Fail-closed:** missing or empty `forbidden_url_patterns` (without `forbidden_url_patterns_intentionally_empty: true`) causes the skill to refuse to run (exit 2, operator-actionable).\n\n**Loop-immutable fields:** the self-heal loop may not edit `.autospec\u002Ftest.yml`, `.autospec\u002F.scoped-prod-acked-*.lock`, or Playwright config safety-related fields. A pre-commit hook in the worktree enforces this.\n\nFull schema at `schemas\u002Fautospec-test-contract.schema.json` in this repo.\n\n## Modes I and II\n\n**Mode I — strict isolation (default):** All test traffic is confined to a clone URL (`E2E_BASE_URL` or equivalent). Three enforcement layers:\n\n1. Pre-flight URL check: every URL-shaped value in Playwright config is matched against `forbidden_url_patterns` before any test runs. Match → hard fail, no tests run.\n2. Runtime network intercept: Playwright global setup injects `context.route('**\u002F*', handler)` that aborts requests whose final URL (post-redirect) matches a forbidden pattern.\n3. Egress allowlist (optional): if `egress_allowlist` declared, runner enforces at netns\u002Fcontainer level.\n\n**Mode II — scoped production (opt-in):** Requires `mode: scoped_production` plus `i_understand_this_writes_to_production: true` in the contract, plus `backup:` with a verified pre-suite snapshot and `restore_cmd`. Scope tokens constrain which rows, methods, and routes the test suite may touch. Scope violations trigger immediate restore and batch halt. Two consecutive scope violations across runs auto-quarantine Mode II and require manual re-acknowledgement.\n\nHard non-negotiables for Mode II (encoded in skill, not user-overridable): no `backup:` → refuse to run; no verified pre-suite snapshot → refuse to run; no `restore_cmd` → refuse to run; scope violation → restore + halt; 2 consecutive violations → quarantine.\n\n## Safety rails\n\nThe skill enforces these rails regardless of operator configuration:\n\n- **Fail-closed forbidden URL check:** no `forbidden_url_patterns` → refuse to run (exit 2).\n- **Loop-immutable contract:** self-heal loop cannot weaken safety config files.\n- **LOOSENING block:** any test assertion that becomes less strict blocks auto-merge.\n- **Mode II backup invariants:** see Modes I and II above.\n- **Stop flag respects existing convention:** if `~\u002F.autospec\u002Fstop.flag` is present, the skill exits gracefully using the same sentinel path as autospec-stop.\n- **Pre-commit hook:** installed in the worktree before the self-heal loop starts; blocks any loop commit that modifies `.autospec\u002Ftest.yml` or Playwright safety fields.\n\n## Self-heal loop\n\nLoop anatomy for each iteration:\n\n1. Read gate JSON + `.autospec\u002Ftest-findings.md` + last 3 iterations' summaries.\n2. Classify each failure: missing_unit_test, missing_test, failing_unit_test, failing_test, flaky_test, selector_brittle, product_bug.\n3. Prioritize: product_bug > missing_unit_test > missing_test > selector_brittle > failing_unit_test > failing_test > flaky_test.\n4. Pick the highest-priority cluster that fits remaining coding budget.\n5. Edit allowed surfaces: unit test files, Playwright test files, product source code, `playwright.config.*` (timeouts\u002Fretries\u002Fprojects only — not safety fields).\n6. Commit with structured message: `test-heal(iter N): \u003Cone-line>` plus `CLASSIFICATION:` and `JUSTIFICATION:` lines (required for assertion-shift compliance).\n7. Re-run gate. Green → exit. Red → next iteration.\n\n**Termination conditions (any one exits the loop):**\n- Gate passes → proceed to assertion-shift guardrail.\n- 60 min coding time exhausted → PR blocked (`e2e:blocked`, `needs-human-review`).\n- 5 iterations completed → PR blocked.\n- Same error signature in 3 consecutive iterations → PR blocked + `e2e:stuck-error`.\n- `~\u002F.autospec\u002Fstop.flag` present → graceful exit.\n- Loop classifier produces empty action 2 iterations in a row → PR blocked + `e2e:no-action`.\n\nLoop state schema:\n```json\n{\n  \"pr_number\": 1234,\n  \"started_at\": \"2026-05-21T12:00:00Z\",\n  \"coding_time_used_seconds\": 1842,\n  \"iterations\": [\n    { \"n\": 1, \"started_at\": \"...\", \"ended_at\": \"...\",\n      \"classification\": \"missing_test\",\n      \"files_changed\": [\"tests\u002Fdashboard.spec.ts\"],\n      \"gate_passed\": false,\n      \"error_signature\": \"sha256:abc...\" }\n  ],\n  \"last_error_signature\": \"sha256:abc...\",\n  \"same_error_consecutive\": 2\n}\n```\n\n## Wizard\n\n`\u002Fautospec-test --init` walks the operator through first-time setup:\n\n1. Mode selection (strict isolation vs scoped production; strict is the default).\n2. If scoped: scope-token kinds, identifiers, prod URL.\n3. Backup driver detection (probe for `zfs`, `pg_dump`, `mysqldump`, `custom_cmd`). If none detected and Mode II selected, refuse to write `.autospec\u002Ftest.yml`.\n4. Dry-run preview — print the constraints that will apply; require operator to type `I UNDERSTAND` before writing any files.\n5. Write `.autospec\u002Ftest.yml` and, for Mode II, the initial `.autospec\u002F.scoped-prod-acked-\u003Csha>.lock`. Operator handles `git add` and push.\n\nThe wizard does not run tests. It only produces config. Run `\u002Fautospec-test [PR#]` or let `\u002Fautospec-run` invoke the gate to exercise the configuration.\n\n## v2 — Stage 2.5 invariants\n\nStage 2.5 is an optional extension to Stage 2 that catches a specific regression class: Playwright suites pass green but the user-visible product still breaks — missing edit affordances on visible items, frontend-display windows wider than backend query windows, broken or unaffordable interactive elements, and UI claims the API cannot back.\n\nStage 2.5 runs four declarative gate metrics (F\u002FG\u002FH\u002FI) after Stage 2 passes, only when `e2e.invariants_v2.enabled: true` in the target's `.autospec\u002Ftest.yml`. If `enabled` is not `true`, the gate emits `{\"skipped\": true, \"passed\": true}` and exits 0 with zero overhead on v1-only targets.\n\n```\nStage 2 (E2E)\n     │ passes\n     ▼\nStage 2.5 (Invariants & contracts) — skipped if invariants_v2.enabled != true\n  Metric F — Structural invariants (edit affordances on all rows)\n  Metric G — Window-contract symmetry (UI window == API window)\n  Metric H — Extended crawler (all interactive elements affordable)\n  Metric I — Data-source contract symmetry (UI claims ↔ API responses)\n     │\n     ▼\nAuto-merge (all pass) or block (any fail)\n```\n\n**Stage 2.5 + docs drift-gate composition:** When the docs amendment is active (Phase 10c), the\ndrift-gate (`check-doc-drift.sh`) runs immediately after Stage 2.5 and shares its exit-code\nrouting. A `failing_doc_drift` result feeds the same self-heal loop as a Stage 2.5 metric\nfailure — the loop classifier routes it to `failing_doc_drift` → doc-section edit, not a\ntest rewrite. Both gates must pass before the fused guardian+LGTM step proceeds. If Stage 2.5\nis skipped (`invariants_v2.enabled` absent), the drift gate still runs independently.\n\n## Contract: invariants_v2\n\nAdd the `e2e.invariants_v2` namespace to `.autospec\u002Ftest.yml` to enable Stage 2.5:\n\n```yaml\ne2e:\n  clone_url_env: E2E_BASE_URL\n  forbidden_url_patterns:\n    - \"^https?:\u002F\u002Fapp\\\\.example\\\\.com\"\n\n  invariants_v2:\n    enabled: true\n    structural_invariants:\n      - name: dashboard-done-items-editable\n        selector: \"[data-done-item]\"\n        require_affordance: edit\n        routes:\n          - \u002Fdashboard\n    window_contracts:\n      - name: dashboard-streak-window\n        ui_attribute: data-window-days\n        api_param: from\n        tolerance_days: 1\n    contract_symmetry:\n      - name: streak-task-must-be-editable\n        ui_selector: \"[data-task-id]\"\n        api_endpoint: \u002Fapi\u002Ftimeline\n        require_field: editable\n    edge_case_seeds:\n      enforcement: refuse_to_run_if_missing\n      require_shapes:\n        - kind: done_item\n          count_at_least: 3\n        - kind: streak_gap\n          count_at_least: 1\n```\n\n## Built-in invariant kinds\n\n| Metric | Kind | What it checks | Block label |\n|--------|------|----------------|-------------|\n| F | `structural` | Every `selector` row has the required `affordance` button\u002Flink | `e2e:blocked-stage25` |\n| G | `window_contract` | UI window attribute matches API query window (±`tolerance_days`) | `e2e:window-mismatch` |\n| H | `crawler` | Every reachable interactive element is afforded (click → response within 5s) | `e2e:unaffordable-elements` |\n| I | `contract_symmetry` | UI claim fields present in API response and semantically consistent | `e2e:contract-mismatch` |\n\n## Edge-case seeds handshake\n\n`edge_case_seeds` in the contract creates a hard handshake with Skill C (autospec-e2e-clone). When declared, Stage 2.5 verifies that the clone contains at least `count_at_least` rows matching each declared shape before running any metric.\n\n- `enforcement: refuse_to_run_if_missing` (default) → gate exits 2 (`e2e:seed-missing`) if shapes absent; operator re-runs Skill C.\n- Loop cannot fix missing seeds — Skill A explicitly does not edit clone-provisioner concerns.\n\n## Helper library (@autospec\u002Ftest)\n\nThe `@autospec\u002Ftest` npm package ships Playwright helpers for writing the same invariant patterns imperatively inside target-repo test suites:\n\n```typescript\nimport { checkStructuralInvariant, verifyWindowContract } from '@autospec\u002Ftest';\n\ntest('dashboard done items are editable', async ({ page }) => {\n  await checkStructuralInvariant(page, {\n    selector: '[data-done-item]',\n    requireAffordance: 'edit',\n  });\n});\n```\n\nInstall: `npm install --save-dev @autospec\u002Ftest` (wizard handles this during `--init`).\n\n## Harness detection (run once at skill start)\n\nDetect your harness by checking available tools before dispatching work:\n\n1. **Claude Code** — the `Agent` tool with a `subagent_type` parameter is available.\n   - `TIER_A` = `opus` + `ultrathink`  (the alias, which resolves to the current Claude Opus generation)\n   - `TIER_B` = `sonnet`               (the alias, which resolves to the current Claude Sonnet generation)\n\n2. **OpenCode** — a `task` tool with model\u002Ftier configuration is available (no `subagent_type`).\n   - `TIER_A` = top-tier task model + high reasoning\n   - `TIER_B` = smaller-tier task model + medium reasoning\n\n3. **Codex CLI** — neither `Agent` nor a configurable `task` tool is available; `apply_patch` is the primary edit tool.\n   - `TIER_A` = current top GPT model + `reasoning_effort=high`\n   - `TIER_B` = the spark \u002F cost-optimized variant of the configured model when one exists, else the configured model + `reasoning_effort=medium`\n\n**Fallback rule:** If `TIER_B` is not available in your harness (model unknown, quota\u002Fcapacity failure, authorization failure, or tool call returns an error for that model), silently retry the same dispatch with `TIER_A`. Preserve the parent context on retry; for Codex native subagents, fork\u002Finherit the current conversation context and use the latest top GPT model instead of moving the work into the main session. Never ask the user.\n\nHold `TIER_A` and `TIER_B` for the entire skill run.\n\n## Required capabilities & harness adapter\n\n| Capability                  | Claude Code                             | OpenCode                              | Codex CLI                              | Fallback if missing                         |\n|-----------------------------|-----------------------------------------|---------------------------------------|----------------------------------------|---------------------------------------------|\n| Foreground delegation       | `Agent` (subagent_type=general-purpose) | nested `task` agent, await output     | spawn nested CLI session               | Run inline (more context cost)              |\n| Shell execution             | `Bash` tool                             | shell tool                            | `apply_patch` + shell                  | Required; skill cannot run without shell    |\n| Read-only codebase research | `Agent` (subagent_type=Explore)         | `task` agent in read-only mode        | shell `grep` \u002F `rg`                    | In-thread grep                              |\n| Ask the user a question     | `AskUserQuestion`                       | inline prompt                         | inline prompt                          | Ask in the response and wait               |\n| Subagent model tier         | TIER_B: `sonnet`; TIER_A: `opus` + ultrathink | TIER_B: smaller task model       | TIER_B: current spark\u002Fcost-optimized Codex          | Fall back UP to TIER_A on unavailability    |\n\u003C!-- autospec-block:harness-adapter-core -->\n\n## Stop mode\n\nWhen the user's request (normalized: collapsed whitespace, trimmed, lowercased) is exactly `stop`, or `stop` followed by one or more `--\u003Cword>` flags, this skill enters stop mode and does NOT run the normal pipeline.\n\nDispatch to `bash \"${AUTOSPEC_SCRIPTS_DIR:-$HOME\u002F.autospec\u002Fscripts}\u002Fautospec-stop.sh\" \u003Cargs>`, print the helper's stdout, then stop.\n\nInside the self-heal loop, the skill checks `~\u002F.autospec\u002Fstop.flag` after each iteration. If present, it writes the current loop state to `.autospec\u002Ftest-loop-state.json`, comments on the PR with the current iteration summary, and exits without blocking or labeling. The next monitor relaunch will resume from the saved state.\n","# autospec-test — Unit + E2E Coverage Gate with Self-Heal Loop\n\nEnforce that every PR produced by `\u002Fautospec-run` ships with thorough, passing unit + E2E test coverage against an isolated environment, and that any gaps the gate finds get auto-healed by a bounded LLM loop within the same PR.\n\n## Self-update\n\nDecide this purely from the request text the harness handed you. Do NOT\nshell out (no `grep`, `sed`, `[[ =~ ]]`, command substitution, etc.) to\ntest the user's free-form request — passing it through a shell is what\nhistorically tripped harness permission engines. Read the request, normalize\nit in your reasoning (collapse whitespace, trim, lowercase), and if the result is\nexactly `update`, this skill enters self-update mode and does NOT run the\nnormal pipeline.\n\n1. Detect harness by checking which install path exists for this skill:\n   - Claude Code: `~\u002F.claude\u002Fskills\u002Fautospec-test\u002FSKILL.md`\n   - OpenCode:    `~\u002F.config\u002Fopencode\u002Fagent\u002Fautospec-test.md`\n   - Codex CLI:   `~\u002F.codex\u002Fprompts\u002Fautospec-test.md`\n2. Re-install from `main` by piping the canonical installer:\n   ```\n   curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fberlinguyinca\u002Fautospec\u002Fmain\u002Fbootstrap.sh | bash -s -- --skill all --harness all --update\n   ```\n   Run this one-liner once; it refreshes all autospec skills across all harnesses.\n3. Show the diff between the prior installed file(s) and the freshly fetched copy.\n4. Stop. Do not enter any pipeline phase. Print the upgrade summary and return to the user.\n\nIf no install path is detected, print `Self-update: no installed copy of autospec-test found; run install.sh first.` and exit.\n\n## Model tier\n\n`reasoning:standard, ctx:120k`\n\nThis skill runs inline inside the Phase 4 implementer worktree (same model tier as the outer implementer) or standalone against a specified PR branch. No Tier A dispatch required for normal operation; the coverage gate and self-heal loop are deterministic or LLM-light.\n\n## When to use\n\n- Automatically: `\u002Fautospec-run` Phase 4 invokes this skill after the build + lint gate passes and before admin auto-merge, for every PR that closes an `auto-implement` issue.\n- Standalone: `\u002Fautospec-test [PR#]` for ad-hoc validation of any branch or PR against main — useful before filing an issue or after a manual hot-fix.\n- First-time setup: `\u002Fautospec-test --init` to interactively configure `.autospec\u002Ftest.yml` in a target repo.\n\n## When not to use\n\n- When the target repo has no test suite at all (no jest\u002Fvitest\u002Fmocha\u002Fpytest\u002Fgo test\u002Fcargo test found, no Playwright). Use Skill D (suite bootstrapper) first.\n- When clone provisioning is not yet in place and no `E2E_BASE_URL` \u002F `PLAYWRIGHT_BASE_URL` \u002F `BASE_URL` env var is set. The gate will refuse to run (exit 2) rather than silently hit production.\n- When `~\u002F.autospec\u002Fno-test.flag` exists (operator opt-out for repos where testing is handled by an external CI system).\n- For repos in the autospec family itself (autospec is a bash\u002Fmarkdown skill repo with no Playwright suite). The skill self-detects and skips gracefully.\n\n## How it works\n\nTwo-stage gate runs sequentially inside the Phase 4 worktree:\n\n```\nPhase 4 existing: build + lint\n        │\n        ▼\nStage 1: unit tests + unit-coverage gate\n        │ (must pass before Stage 2 starts)\n        ▼\nStage 2: E2E tests + E2E coverage gate\n        │\n        ▼\nAssertion-shift guardrail (covers both stages' test diffs)\n        │\n        ▼\nAuto-merge or block\n```\n\n**Stage 1 — Unit (Metric E):** Code coverage thresholds (defaults 95\u002F90\u002F95 lines\u002Fbranches\u002Ffunctions), function-presence check (every exported\u002Fpublic function has at least one unit test), and all unit tests pass with no `.only`, `.skip`, or `xit`.\n\n**Stage 2A — disciplined authoring (opt-in):** Runs between Stage 1 and Stage 2 only when `e2e.authoring.enabled: true` in `.autospec\u002Ftest.yml`; otherwise it is skipped with zero overhead. The orchestrator (`stage2a-orchestrator.mjs`) clusters crawler-discovered routes into author-assignable groups (`clusterRoutes` — auto by first path segment, capped at `fanout_max`, or an explicit `route_clusters` override), centralizes shared harness files into `helpers_dir` as a single writer that never clobbers divergent files (`centralizeHelpers`), runs a `playwright test --list` parse gate before the real run (`parseGate`), and writes `e2e\u002F.autospec\u002Fcoverage.json` as `{total, covered, pct}` from the crawler manifest denominator — not author self-report (`coverageReport`). Each authored spec passes `lint-playwright-author.mjs`, whose `PW_SELECTOR_UNVERIFIED` rule resolves every selector against app source via `selector-evidence.mjs` so invented `data-testid`s hard-fail; failures feed the MAX=5 adaptive-retry loop with corrective directives.\n\n**Spec-compliance QA audit:** For UI\u002Fproduct features, Stage 2 must also use\nthe `autospec-qa` prompt shape when generating or healing E2E coverage: extract\nthe spec into a traceability matrix, interact with the running app like a user,\ncover text boxes, textareas, selects, dropdowns, checkboxes, radio buttons,\nbuttons, links, forms, validation, state changes, API effects, accessibility,\nresponsive layouts, negative paths, and cross-feature flows, then regenerate\ntests for every missing or weak behavior. Do not mark a spec requirement PASS\nfrom code inspection alone.\n\n**No-mock deployed smoke:** Mocked API tests are necessary but insufficient for\nworkflow buttons and dropdowns. For each workflow action, Stage 2 should include\na deterministic mocked happy path plus a no-mock smoke path against the\nconfigured deployed\u002Fdev URL when the target contract permits it. The smoke path\nmust assert no live-failure banner, a visible domain result, request\npayload\u002Fquery changes from selected values, and recovery or actionable UI for\nknown backend failure signatures such as `502` bridge\u002Fproxy outages.\n\n**Self-heal loop:** Up to 5 iterations, 60 minutes of coding time (paused while tests run). Each iteration classifies failures (missing_unit_test, missing_test, failing_unit_test, failing_test, flaky_test, selector_brittle, product_bug) and picks the highest-priority cluster that fits remaining budget. Loop state persisted in `.autospec\u002Ftest-loop-state.json` in the worktree so monitor relaunches resume rather than reset.\n\n**Assertion-shift guardrail:** AST + regex pass over all modified test files. LOOSENING changes block auto-merge (adds `needs-human-review` + `e2e:assertion-loosening`). SHIFTING is conditionally allowed if the same commit also modifies a non-test source file and includes `JUSTIFICATION:` in the commit message. STRENGTHENING always allowed.\n\n## Spec-compliance QA prompt\n\n`autospec-qa` is the canonical full prompt for spec-to-running-app QA. Do not\nduplicate that full prompt here. When Stage 2 or the self-heal loop generates\nUI\u002Fproduct E2E tests, import its intent and preserve these minimum anchors:\n\n- **Spec traceability:** every spec requirement maps to expected behavior,\n  evidence, and PASS\u002FFAIL\u002FPARTIAL\u002FNOT TESTED status.\n- **UI controls:** text inputs, textareas, selects, dropdowns, checkboxes,\n  radio buttons, buttons, links, forms, validation, state changes, responsive\n  layouts, and accessibility are exercised as user-visible behavior.\n- **No-mock deployed smoke:** mocked happy paths are paired with no-mock\n  deployed\u002Fdev smoke paths whenever the target contract permits it.\n- **Outcome assertions:** tests prove visible domain results and absence of\n  live-failure banners, not just clickability or request dispatch.\n- **User input intent review:** for every input-like control, ask what it is\n  for, why it exists, how users should use it, what request\u002Fstate\u002Fresult it\n  affects, how invalid\u002Frejected input behaves, and whether evidence from the\n  running app proves it was implemented and tested correctly.\n- **Live backend blocker triage:** before leaving no-mock smoke `NOT TESTED`,\n  search safe config surfaces, avoid printing secret values, clean temporary\n  credential material, probe health\u002Fstatus\u002Ffleet paths when available, and\n  classify the blocker as credentials, infrastructure health, route mental\n  model, or route-specific worker\u002Fhandler failure.\n- **Proof artifacts:** emit or draft `.autospec\u002Fproof-matrix.json`,\n  `.autospec\u002Freliability.yml`, `.autospec\u002Fcontrol-intent-ledger.json`,\n  `.autospec\u002Fmutation-proof.json`, and `.autospec\u002Fcanary-results.json` so spec\n  rows connect to implementation files, tests, live evidence, blockers, and\n  follow-ups.\n- **Reliability contract:** backend-backed features declare required live smoke\n  workflows, representative inputs, seed\u002Flive data, allowed mocks, required\n  no-mock paths, health probes, fallback behavior, forbidden URLs, and forbidden\n  false-green patterns.\n- **Control intent ledger:** every reachable control is classified as\n  functional, read_only, decorative, or unclassified; unclassified controls keep\n  the result PARTIAL or FAIL.\n- **Duplicate-code guardian:** generated components, helpers, validators, API\n  clients, request wrappers, error banners, fixtures, and test utilities are\n  checked against existing repo patterns before acceptance.\n- **Mutation\u002Fbreakage proof:** at least one critical workflow per feature proves\n  the test fails when request propagation, result rendering, fallback behavior,\n  persistence, or backend responses are broken.\n- **Post-merge deployed canary:** when a deployed\u002Fdev URL exists, representative\n  no-mock workflows are defined for post-merge verification and failed canaries\n  create regression issues with route classification.\n- **New code intent gate:** every new component, module, function, endpoint,\n  worker, hook, or test helper has a spec-linked reason, reuse check, public\n  contract, proof test, and \"what breaks if wrong\" answer.\n- **Artifact freshness:** proof artifacts record commit SHA, spec hash,\n  environment\u002Fapp URL, test command hash when practical, and generation time;\n  stale artifacts cannot support PASS.\n- **Evidence provenance:** every PASS cites inspectable evidence such as test\n  file\u002Fname, command output, screenshot\u002Fvideo\u002Ftrace\u002Flog path, network summary,\n  deployed URL, representative input, or backend probe result.\n- **Console\u002Fnetwork gate:** unexpected frontend exceptions, failed network calls,\n  runtime warnings, generic live-failure banners, swallowed errors, or timeouts\n  fail the workflow unless they are the explicit negative path under test.\n- **Spec contradiction detector:** conflicting, untestable, UI\u002FAPI-mismatched,\n  or data-missing requirements become AMBIGUOUS\u002FPARTIAL with follow-up.\n- **Data lifecycle proof:** stateful features prove create, refresh, edit,\n  delete, rollback, idempotency, navigation, and relevant concurrency behavior.\n- **Observability contract:** backend-backed workflows expose enough safe health,\n  timing, correlation, and user-safe error information to triage failed canaries\n  without leaking secrets or PII.\n- **Flake quarantine:** retries, sleeps, widened timeouts, and reruns are\n  classified as product race, selector fragility, backend instability,\n  environment issue, or test oracle weakness before acceptance.\n- **Reliability exhaustion loop:** repeatedly ask what else could make the app\n  unreliable, duplicated, or falsely green; every actionable answer becomes a\n  fix, stronger test, proof update, contract update, or follow-up issue.\n- **Legacy removal and spec cleanup:** when a spec or accepted architecture\n  deprecates a route, cache, bucket, storage backend, worker, feature flag,\n  config key, UI path, or data source, generated tests and fixes must prove the\n  replacement path and remove stale code\u002Fspec\u002Fdocs references instead of\n  repopulating or relying on the deprecated surface.\n- **Backend fragility:** `502` bridge\u002Fproxy\u002Fcache failures require regression\n  coverage plus either a documented fallback route or a clear actionable user\n  state; mocked endpoint success is not proof of deployed workflow success.\n- **Critical self-question:** before accepting green tests, ask: \"What could\n  still pass here while a real user workflow fails?\" Add one test or issue for\n  the highest-risk answer.\n\n## Contract file\n\n`.autospec\u002Ftest.yml` in the target repo. Most fields autodetected; the file's primary purpose is declaring **forbidden URLs** (mandatory) and any Mode II opt-in.\n\nMinimal valid contract:\n\n```yaml\n# .autospec\u002Ftest.yml\nmode: strict_isolation\n\ne2e:\n  clone_url_env: E2E_BASE_URL\n  forbidden_url_patterns:\n    - \"^https?:\u002F\u002Fapp\\\\.acme\\\\.com\"\n    - \"^https?:\u002F\u002F.*\\\\.prod\\\\.acme\\\\.internal\"\n\nbudgets:\n  coding_time_minutes: 60\n  max_loop_iterations: 5\n  same_error_halt_threshold: 3\n```\n\n**Fail-closed:** missing or empty `forbidden_url_patterns` (without `forbidden_url_patterns_intentionally_empty: true`) causes the skill to refuse to run (exit 2, operator-actionable).\n\n**Loop-immutable fields:** the self-heal loop may not edit `.autospec\u002Ftest.yml`, `.autospec\u002F.scoped-prod-acked-*.lock`, or Playwright config safety-related fields. A pre-commit hook in the worktree enforces this.\n\nFull schema at `schemas\u002Fautospec-test-contract.schema.json` in this repo.\n\n## Modes I and II\n\n**Mode I — strict isolation (default):** All test traffic is confined to a clone URL (`E2E_BASE_URL` or equivalent). Three enforcement layers:\n\n1. Pre-flight URL check: every URL-shaped value in Playwright config is matched against `forbidden_url_patterns` before any test runs. Match → hard fail, no tests run.\n2. Runtime network intercept: Playwright global setup injects `context.route('**\u002F*', handler)` that aborts requests whose final URL (post-redirect) matches a forbidden pattern.\n3. Egress allowlist (optional): if `egress_allowlist` declared, runner enforces at netns\u002Fcontainer level.\n\n**Mode II — scoped production (opt-in):** Requires `mode: scoped_production` plus `i_understand_this_writes_to_production: true` in the contract, plus `backup:` with a verified pre-suite snapshot and `restore_cmd`. Scope tokens constrain which rows, methods, and routes the test suite may touch. Scope violations trigger immediate restore and batch halt. Two consecutive scope violations across runs auto-quarantine Mode II and require manual re-acknowledgement.\n\nHard non-negotiables for Mode II (encoded in skill, not user-overridable): no `backup:` → refuse to run; no verified pre-suite snapshot → refuse to run; no `restore_cmd` → refuse to run; scope violation → restore + halt; 2 consecutive violations → quarantine.\n\n## Safety rails\n\nThe skill enforces these rails regardless of operator configuration:\n\n- **Fail-closed forbidden URL check:** no `forbidden_url_patterns` → refuse to run (exit 2).\n- **Loop-immutable contract:** self-heal loop cannot weaken safety config files.\n- **LOOSENING block:** any test assertion that becomes less strict blocks auto-merge.\n- **Mode II backup invariants:** see Modes I and II above.\n- **Stop flag respects existing convention:** if `~\u002F.autospec\u002Fstop.flag` is present, the skill exits gracefully using the same sentinel path as autospec-stop.\n- **Pre-commit hook:** installed in the worktree before the self-heal loop starts; blocks any loop commit that modifies `.autospec\u002Ftest.yml` or Playwright safety fields.\n\n## Self-heal loop\n\nLoop anatomy for each iteration:\n\n1. Read gate JSON + `.autospec\u002Ftest-findings.md` + last 3 iterations' summaries.\n2. Classify each failure: missing_unit_test, missing_test, failing_unit_test, failing_test, flaky_test, selector_brittle, product_bug.\n3. Prioritize: product_bug > missing_unit_test > missing_test > selector_brittle > failing_unit_test > failing_test > flaky_test.\n4. Pick the highest-priority cluster that fits remaining coding budget.\n5. Edit allowed surfaces: unit test files, Playwright test files, product source code, `playwright.config.*` (timeouts\u002Fretries\u002Fprojects only — not safety fields).\n6. Commit with structured message: `test-heal(iter N): \u003Cone-line>` plus `CLASSIFICATION:` and `JUSTIFICATION:` lines (required for assertion-shift compliance).\n7. Re-run gate. Green → exit. Red → next iteration.\n\n**Termination conditions (any one exits the loop):**\n- Gate passes → proceed to assertion-shift guardrail.\n- 60 min coding time exhausted → PR blocked (`e2e:blocked`, `needs-human-review`).\n- 5 iterations completed → PR blocked.\n- Same error signature in 3 consecutive iterations → PR blocked + `e2e:stuck-error`.\n- `~\u002F.autospec\u002Fstop.flag` present → graceful exit.\n- Loop classifier produces empty action 2 iterations in a row → PR blocked + `e2e:no-action`.\n\nLoop state schema:\n```json\n{\n  \"pr_number\": 1234,\n  \"started_at\": \"2026-05-21T12:00:00Z\",\n  \"coding_time_used_seconds\": 1842,\n  \"iterations\": [\n    { \"n\": 1, \"started_at\": \"...\", \"ended_at\": \"...\",\n      \"classification\": \"missing_test\",\n      \"files_changed\": [\"tests\u002Fdashboard.spec.ts\"],\n      \"gate_passed\": false,\n      \"error_signature\": \"sha256:abc...\" }\n  ],\n  \"last_error_signature\": \"sha256:abc...\",\n  \"same_error_consecutive\": 2\n}\n```\n\n## Wizard\n\n`\u002Fautospec-test --init` walks the operator through first-time setup:\n\n1. Mode selection (strict isolation vs scoped production; strict is the default).\n2. If scoped: scope-token kinds, identifiers, prod URL.\n3. Backup driver detection (probe for `zfs`, `pg_dump`, `mysqldump`, `custom_cmd`). If none detected and Mode II selected, refuse to write `.autospec\u002Ftest.yml`.\n4. Dry-run preview — print the constraints that will apply; require operator to type `I UNDERSTAND` before writing any files.\n5. Write `.autospec\u002Ftest.yml` and, for Mode II, the initial `.autospec\u002F.scoped-prod-acked-\u003Csha>.lock`. Operator handles `git add` and push.\n\nThe wizard does not run tests. It only produces config. Run `\u002Fautospec-test [PR#]` or let `\u002Fautospec-run` invoke the gate to exercise the configuration.\n\n## v2 — Stage 2.5 invariants\n\nStage 2.5 is an optional extension to Stage 2 that catches a specific regression class: Playwright suites pass green but the user-visible product still breaks — missing edit affordances on visible items, frontend-display windows wider than backend query windows, broken or unaffordable interactive elements, and UI claims the API cannot back.\n\nStage 2.5 runs four declarative gate metrics (F\u002FG\u002FH\u002FI) after Stage 2 passes, only when `e2e.invariants_v2.enabled: true` in the target's `.autospec\u002Ftest.yml`. If `enabled` is not `true`, the gate emits `{\"skipped\": true, \"passed\": true}` and exits 0 with zero overhead on v1-only targets.\n\n```\nStage 2 (E2E)\n     │ passes\n     ▼\nStage 2.5 (Invariants & contracts) — skipped if invariants_v2.enabled != true\n  Metric F — Structural invariants (edit affordances on all rows)\n  Metric G — Window-contract symmetry (UI window == API window)\n  Metric H — Extended crawler (all interactive elements affordable)\n  Metric I — Data-source contract symmetry (UI claims ↔ API responses)\n     │\n     ▼\nAuto-merge (all pass) or block (any fail)\n```\n\n**Stage 2.5 + docs drift-gate composition:** When the docs amendment is active (Phase 10c), the\ndrift-gate (`check-doc-drift.sh`) runs immediately after Stage 2.5 and shares its exit-code\nrouting. A `failing_doc_drift` result feeds the same self-heal loop as a Stage 2.5 metric\nfailure — the loop classifier routes it to `failing_doc_drift` → doc-section edit, not a\ntest rewrite. Both gates must pass before the fused guardian+LGTM step proceeds. If Stage 2.5\nis skipped (`invariants_v2.enabled` absent), the drift gate still runs independently.\n\n## Contract: invariants_v2\n\nAdd the `e2e.invariants_v2` namespace to `.autospec\u002Ftest.yml` to enable Stage 2.5:\n\n```yaml\ne2e:\n  clone_url_env: E2E_BASE_URL\n  forbidden_url_patterns:\n    - \"^https?:\u002F\u002Fapp\\\\.example\\\\.com\"\n\n  invariants_v2:\n    enabled: true\n    structural_invariants:\n      - name: dashboard-done-items-editable\n        selector: \"[data-done-item]\"\n        require_affordance: edit\n        routes:\n          - \u002Fdashboard\n    window_contracts:\n      - name: dashboard-streak-window\n        ui_attribute: data-window-days\n        api_param: from\n        tolerance_days: 1\n    contract_symmetry:\n      - name: streak-task-must-be-editable\n        ui_selector: \"[data-task-id]\"\n        api_endpoint: \u002Fapi\u002Ftimeline\n        require_field: editable\n    edge_case_seeds:\n      enforcement: refuse_to_run_if_missing\n      require_shapes:\n        - kind: done_item\n          count_at_least: 3\n        - kind: streak_gap\n          count_at_least: 1\n```\n\n## Built-in invariant kinds\n\n| Metric | Kind | What it checks | Block label |\n|--------|------|----------------|-------------|\n| F | `structural` | Every `selector` row has the required `affordance` button\u002Flink | `e2e:blocked-stage25` |\n| G | `window_contract` | UI window attribute matches API query window (±`tolerance_days`) | `e2e:window-mismatch` |\n| H | `crawler` | Every reachable interactive element is afforded (click → response within 5s) | `e2e:unaffordable-elements` |\n| I | `contract_symmetry` | UI claim fields present in API response and semantically consistent | `e2e:contract-mismatch` |\n\n## Edge-case seeds handshake\n\n`edge_case_seeds` in the contract creates a hard handshake with Skill C (autospec-e2e-clone). When declared, Stage 2.5 verifies that the clone contains at least `count_at_least` rows matching each declared shape before running any metric.\n\n- `enforcement: refuse_to_run_if_missing` (default) → gate exits 2 (`e2e:seed-missing`) if shapes absent; operator re-runs Skill C.\n- Loop cannot fix missing seeds — Skill A explicitly does not edit clone-provisioner concerns.\n\n## Helper library (@autospec\u002Ftest)\n\nThe `@autospec\u002Ftest` npm package ships Playwright helpers for writing the same invariant patterns imperatively inside target-repo test suites:\n\n```typescript\nimport { checkStructuralInvariant, verifyWindowContract } from '@autospec\u002Ftest';\n\ntest('dashboard done items are editable', async ({ page }) => {\n  await checkStructuralInvariant(page, {\n    selector: '[data-done-item]',\n    requireAffordance: 'edit',\n  });\n});\n```\n\nInstall: `npm install --save-dev @autospec\u002Ftest` (wizard handles this during `--init`).\n\n## Harness detection (run once at skill start)\n\nDetect your harness by checking available tools before dispatching work:\n\n1. **Claude Code** — the `Agent` tool with a `subagent_type` parameter is available.\n   - `TIER_A` = `opus` + `ultrathink`  (the alias, which resolves to the current Claude Opus generation)\n   - `TIER_B` = `sonnet`               (the alias, which resolves to the current Claude Sonnet generation)\n\n2. **OpenCode** — a `task` tool with model\u002Ftier configuration is available (no `subagent_type`).\n   - `TIER_A` = top-tier task model + high reasoning\n   - `TIER_B` = smaller-tier task model + medium reasoning\n\n3. **Codex CLI** — neither `Agent` nor a configurable `task` tool is available; `apply_patch` is the primary edit tool.\n   - `TIER_A` = current top GPT model + `reasoning_effort=high`\n   - `TIER_B` = the spark \u002F cost-optimized variant of the configured model when one exists, else the configured model + `reasoning_effort=medium`\n\n**Fallback rule:** If `TIER_B` is not available in your harness (model unknown, quota\u002Fcapacity failure, authorization failure, or tool call returns an error for that model), silently retry the same dispatch with `TIER_A`. Preserve the parent context on retry; for Codex native subagents, fork\u002Finherit the current conversation context and use the latest top GPT model instead of moving the work into the main session. Never ask the user.\n\nHold `TIER_A` and `TIER_B` for the entire skill run.\n\n## Required capabilities & harness adapter\n\n| Capability                  | Claude Code                             | OpenCode                              | Codex CLI                              | Fallback if missing                         |\n|-----------------------------|-----------------------------------------|---------------------------------------|----------------------------------------|---------------------------------------------|\n| Foreground delegation       | `Agent` (subagent_type=general-purpose) | nested `task` agent, await output     | spawn nested CLI session               | Run inline (more context cost)              |\n| Shell execution             | `Bash` tool                             | shell tool                            | `apply_patch` + shell                  | Required; skill cannot run without shell    |\n| Read-only codebase research | `Agent` (subagent_type=Explore)         | `task` agent in read-only mode        | shell `grep` \u002F `rg`                    | In-thread grep                              |\n| Ask the user a question     | `AskUserQuestion`                       | inline prompt                         | inline prompt                          | Ask in the response and wait               |\n| Subagent model tier         | TIER_B: `sonnet`; TIER_A: `opus` + ultrathink | TIER_B: smaller task model       | TIER_B: current spark\u002Fcost-optimized Codex          | Fall back UP to TIER_A on unavailability    |\n\u003C!-- autospec-block:harness-adapter-core -->\n\n## Stop mode\n\nWhen the user's request (normalized: collapsed whitespace, trimmed, lowercased) is exactly `stop`, or `stop` followed by one or more `--\u003Cword>` flags, this skill enters stop mode and does NOT run the normal pipeline.\n\nDispatch to `bash \"${AUTOSPEC_SCRIPTS_DIR:-$HOME\u002F.autospec\u002Fscripts}\u002Fautospec-stop.sh\" \u003Cargs>`, print the helper's stdout, then stop.\n\nInside the self-heal loop, the skill checks `~\u002F.autospec\u002Fstop.flag` after each iteration. If present, it writes the current loop state to `.autospec\u002Ftest-loop-state.json`, comments on the PR with the current iteration summary, and exits without blocking or labeling. The next monitor relaunch will resume from the saved state.\n",{"name":5,"description":7},"main","9e7f04357ff46ab731d4f56a4ac5ca5449c13bb0","skills\u002Fautospec-test",1,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec","https:\u002F\u002Fgithub.com\u002Fberlinguyinca","Love to lead, code, cook and contribute to open source and believe that you can learn anything you set your mind too.\r\n","2026-11-11 07:09:35",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add berlinguyinca\u002Fautospec --skill autospec-test",{"tool":71,"command":72},"bunx","bunx skills add berlinguyinca\u002Fautospec --skill autospec-test",{"tool":74,"command":75},"pnpm","pnpm dlx skills add berlinguyinca\u002Fautospec --skill autospec-test","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002FSKILL.md",true,[79,85,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,427,431,435,441,445,449,453,457,461,465,469,473,477,480,484,488,492,496,500,504,508,512,516,520,524,528,532,536,540,544,547,551,555,559,563,567,571,575,579,583,587,591,594,598,602,606,610,614,618,622,626,630,634,638,642,646,650,654,658,662,666,670,674,678,682,686,690,694,698,702,706,710,713,717,721,725,729,732,735,739,743,747,751,755,759,763,767,770,774,777,781,785,789,793,796,800,804,807,810,813,816,819,822,825,828,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,899,903,907,911,915,919,923,927,931,935,939,943,947,951,955,959,963,967,971,975,979,983,987,991,995,999,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046],{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"codex\u002Fprompt.md","REFERENCE","参考文档",25755,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fcodex\u002Fprompt.md",{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"install.sh","SCRIPT","脚本",3400,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Finstall.sh",{"path":92,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":93,"sourceHtmlUrl":94},"lib\u002Findex.ts",322,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Flib\u002Findex.ts",{"path":96,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":97,"sourceHtmlUrl":98},"lib\u002Finvariants.ts",18059,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Flib\u002Finvariants.ts",{"path":100,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":101,"sourceHtmlUrl":102},"opencode\u002Fagent.md",26010,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fopencode\u002Fagent.md",{"path":104,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":105,"sourceHtmlUrl":106},"package-lock.json",5895,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fpackage-lock.json",{"path":108,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":109,"sourceHtmlUrl":110},"package.json",1185,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fpackage.json",{"path":112,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":113,"sourceHtmlUrl":114},"README.md",846,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002FREADME.md",{"path":116,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":117,"sourceHtmlUrl":118},"scripts\u002Fadapters\u002Fcargo-test.mjs",3991,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fcargo-test.mjs",{"path":120,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":121,"sourceHtmlUrl":122},"scripts\u002Fadapters\u002Fgeneric.mjs",7581,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fgeneric.mjs",{"path":124,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":125,"sourceHtmlUrl":126},"scripts\u002Fadapters\u002Fgo-test.mjs",4829,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fgo-test.mjs",{"path":128,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":129,"sourceHtmlUrl":130},"scripts\u002Fadapters\u002Fjest.mjs",272,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fjest.mjs",{"path":132,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":133,"sourceHtmlUrl":134},"scripts\u002Fadapters\u002Fmocha.mjs",1435,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fmocha.mjs",{"path":136,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":137,"sourceHtmlUrl":138},"scripts\u002Fadapters\u002Fplaywright.mjs",2690,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fplaywright.mjs",{"path":140,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":141,"sourceHtmlUrl":142},"scripts\u002Fadapters\u002Fpytest.mjs",5205,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fpytest.mjs",{"path":144,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":145,"sourceHtmlUrl":146},"scripts\u002Fadapters\u002Fvitest.mjs",1331,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fadapters\u002Fvitest.mjs",{"path":148,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":149,"sourceHtmlUrl":150},"scripts\u002Fassertion-shift-classifier.mjs",15509,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fassertion-shift-classifier.mjs",{"path":152,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":153,"sourceHtmlUrl":154},"scripts\u002Fassertion-shift-v2-buckets.mjs",22161,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fassertion-shift-v2-buckets.mjs",{"path":156,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":157,"sourceHtmlUrl":158},"scripts\u002Fauthoring-config.mjs",11907,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fauthoring-config.mjs",{"path":160,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":161,"sourceHtmlUrl":162},"scripts\u002Fautodetect.sh",6464,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fautodetect.sh",{"path":164,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":165,"sourceHtmlUrl":166},"scripts\u002Fbackup-drivers\u002Fcustom.sh",2245,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fbackup-drivers\u002Fcustom.sh",{"path":168,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":169,"sourceHtmlUrl":170},"scripts\u002Fbackup-drivers\u002Fmysqldump.sh",2817,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fbackup-drivers\u002Fmysqldump.sh",{"path":172,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":173,"sourceHtmlUrl":174},"scripts\u002Fbackup-drivers\u002Fpgdump.sh",2726,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fbackup-drivers\u002Fpgdump.sh",{"path":176,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":177,"sourceHtmlUrl":178},"scripts\u002Fbackup-drivers\u002Fzfs.sh",1675,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fbackup-drivers\u002Fzfs.sh",{"path":180,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":181,"sourceHtmlUrl":182},"scripts\u002Fbehavior-taxonomy-check.mjs",5469,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fbehavior-taxonomy-check.mjs",{"path":184,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":185,"sourceHtmlUrl":186},"scripts\u002Fbootstrap-labels.sh",3244,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fbootstrap-labels.sh",{"path":188,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":189,"sourceHtmlUrl":190},"scripts\u002Fclone-gate-hook.sh",4796,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fclone-gate-hook.sh",{"path":192,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":193,"sourceHtmlUrl":194},"scripts\u002Fcontract-symmetry\u002Finterpolator.mjs",1404,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcontract-symmetry\u002Finterpolator.mjs",{"path":196,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":197,"sourceHtmlUrl":198},"scripts\u002Fcontract-symmetry\u002Fjsonpath-verifier.mjs",6396,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcontract-symmetry\u002Fjsonpath-verifier.mjs",{"path":200,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":201,"sourceHtmlUrl":202},"scripts\u002Fcontract-symmetry\u002Frun-symmetry.mjs",8378,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcontract-symmetry\u002Frun-symmetry.mjs",{"path":204,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":205,"sourceHtmlUrl":206},"scripts\u002Fcontract-symmetry\u002Fui-extractor.mjs",2415,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcontract-symmetry\u002Fui-extractor.mjs",{"path":208,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":209,"sourceHtmlUrl":210},"scripts\u002Fcontrol-effects.mjs",18296,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcontrol-effects.mjs",{"path":212,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":213,"sourceHtmlUrl":214},"scripts\u002Fcoverage-collectors\u002Fc8.sh",1005,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcoverage-collectors\u002Fc8.sh",{"path":216,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":217,"sourceHtmlUrl":218},"scripts\u002Fcoverage-collectors\u002Fcargo-llvm-cov.sh",739,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcoverage-collectors\u002Fcargo-llvm-cov.sh",{"path":220,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":221,"sourceHtmlUrl":222},"scripts\u002Fcoverage-collectors\u002Fcoverage-py.sh",885,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcoverage-collectors\u002Fcoverage-py.sh",{"path":224,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":225,"sourceHtmlUrl":226},"scripts\u002Fcoverage-collectors\u002Fgo-cover.sh",1625,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcoverage-collectors\u002Fgo-cover.sh",{"path":228,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":229,"sourceHtmlUrl":230},"scripts\u002Fcoverage-collectors\u002Fistanbul.sh",719,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcoverage-collectors\u002Fistanbul.sh",{"path":232,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":233,"sourceHtmlUrl":234},"scripts\u002Fcoverage-collectors\u002Fjacoco.sh",2232,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcoverage-collectors\u002Fjacoco.sh",{"path":236,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":237,"sourceHtmlUrl":238},"scripts\u002Fcrawler-v2\u002Faffordance-verifier.mjs",4578,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcrawler-v2\u002Faffordance-verifier.mjs",{"path":240,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":241,"sourceHtmlUrl":242},"scripts\u002Fcrawler-v2\u002Fextended-crawler.mjs",6374,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcrawler-v2\u002Fextended-crawler.mjs",{"path":244,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":245,"sourceHtmlUrl":246},"scripts\u002Fcrawler-v2\u002Ffoldout-opener.mjs",1626,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fcrawler-v2\u002Ffoldout-opener.mjs",{"path":248,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":249,"sourceHtmlUrl":250},"scripts\u002Ferror-signature.mjs",3655,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Ferror-signature.mjs",{"path":252,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":253,"sourceHtmlUrl":254},"scripts\u002Ffindings-generator.mjs",6690,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Ffindings-generator.mjs",{"path":256,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":257,"sourceHtmlUrl":258},"scripts\u002Fforbidden-url-check.mjs",4579,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fforbidden-url-check.mjs",{"path":260,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":261,"sourceHtmlUrl":262},"scripts\u002Ffunction-presence.mjs",9520,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Ffunction-presence.mjs",{"path":264,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":265,"sourceHtmlUrl":266},"scripts\u002Fgate-stage-2-5.sh",20865,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fgate-stage-2-5.sh",{"path":268,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":269,"sourceHtmlUrl":270},"scripts\u002Fgate-stage-e2e.sh",18607,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fgate-stage-e2e.sh",{"path":272,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":273,"sourceHtmlUrl":274},"scripts\u002Fgate-stage-unit.sh",9695,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fgate-stage-unit.sh",{"path":276,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":277,"sourceHtmlUrl":278},"scripts\u002Finvariants\u002Fkinds\u002Fcustom-kind-protocol.md",4343,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Fkinds\u002Fcustom-kind-protocol.md",{"path":280,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":281,"sourceHtmlUrl":282},"scripts\u002Finvariants\u002Fkinds\u002Fevery-foldout-opens-all-nested.mjs",2689,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Fkinds\u002Fevery-foldout-opens-all-nested.mjs",{"path":284,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":285,"sourceHtmlUrl":286},"scripts\u002Finvariants\u002Fkinds\u002Fevery-modal-returns-to-body-scroll.mjs",3189,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Fkinds\u002Fevery-modal-returns-to-body-scroll.mjs",{"path":288,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":289,"sourceHtmlUrl":290},"scripts\u002Finvariants\u002Fkinds\u002Fevery-row-has-required-actions.mjs",2186,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Fkinds\u002Fevery-row-has-required-actions.mjs",{"path":292,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":293,"sourceHtmlUrl":294},"scripts\u002Finvariants\u002Fkinds\u002Fevery-visible-x-has-accessible-name.mjs",3096,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Fkinds\u002Fevery-visible-x-has-accessible-name.mjs",{"path":296,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":297,"sourceHtmlUrl":298},"scripts\u002Finvariants\u002Fkinds\u002Fevery-visible-x-is-y.mjs",3534,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Fkinds\u002Fevery-visible-x-is-y.mjs",{"path":300,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":301,"sourceHtmlUrl":302},"scripts\u002Finvariants\u002Frun-structural.mjs",6342,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Finvariants\u002Frun-structural.mjs",{"path":304,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":305,"sourceHtmlUrl":306},"scripts\u002Flint-playwright-author.mjs",22243,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Flint-playwright-author.mjs",{"path":308,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":309,"sourceHtmlUrl":310},"scripts\u002Fload-contract.sh",4480,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fload-contract.sh",{"path":312,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":313,"sourceHtmlUrl":314},"scripts\u002Floop-budget.sh",7437,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Floop-budget.sh",{"path":316,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":317,"sourceHtmlUrl":318},"scripts\u002Floop-classifier.mjs",13040,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Floop-classifier.mjs",{"path":320,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":321,"sourceHtmlUrl":322},"scripts\u002Floop-controller.sh",12595,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Floop-controller.sh",{"path":324,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":325,"sourceHtmlUrl":326},"scripts\u002Fmode-ii-postcheck.mjs",7544,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fmode-ii-postcheck.mjs",{"path":328,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":329,"sourceHtmlUrl":330},"scripts\u002Fmode-ii-preflight.sh",8981,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fmode-ii-preflight.sh",{"path":332,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":333,"sourceHtmlUrl":334},"scripts\u002Fmode-ii-runtime-intercept.mjs",4844,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fmode-ii-runtime-intercept.mjs",{"path":336,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":337,"sourceHtmlUrl":338},"scripts\u002Fnetwork-intercept-inject.mjs",4894,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fnetwork-intercept-inject.mjs",{"path":340,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":341,"sourceHtmlUrl":342},"scripts\u002Fplaywright-config-resolver.mjs",5341,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fplaywright-config-resolver.mjs",{"path":344,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":345,"sourceHtmlUrl":346},"scripts\u002Fplaywright-fixtures\u002Ftouched.ts",5351,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fplaywright-fixtures\u002Ftouched.ts",{"path":348,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":349,"sourceHtmlUrl":350},"scripts\u002Fpr-report.sh",13069,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fpr-report.sh",{"path":352,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":353,"sourceHtmlUrl":354},"scripts\u002Fpre-commit-loop-guard.sh",2259,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fpre-commit-loop-guard.sh",{"path":356,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":357,"sourceHtmlUrl":358},"scripts\u002Fpublish-helpers.sh",3277,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fpublish-helpers.sh",{"path":360,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":361,"sourceHtmlUrl":362},"scripts\u002Fquarantine.mjs",4599,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fquarantine.mjs",{"path":364,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":365,"sourceHtmlUrl":366},"scripts\u002Freset-endpoint-gen.mjs",26319,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Freset-endpoint-gen.mjs",{"path":368,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":369,"sourceHtmlUrl":370},"scripts\u002Frun-gate.sh",9706,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Frun-gate.sh",{"path":372,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":373,"sourceHtmlUrl":374},"scripts\u002Fseed-shapes\u002Fcatalog.yml",3659,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fseed-shapes\u002Fcatalog.yml",{"path":376,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":377,"sourceHtmlUrl":378},"scripts\u002Fseed-shapes\u002Fdb-driver\u002Fjsonpath-store.mjs",5364,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fseed-shapes\u002Fdb-driver\u002Fjsonpath-store.mjs",{"path":380,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":381,"sourceHtmlUrl":382},"scripts\u002Fseed-shapes\u002Fdb-driver\u002Fmysql.mjs",2072,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fseed-shapes\u002Fdb-driver\u002Fmysql.mjs",{"path":384,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":385,"sourceHtmlUrl":386},"scripts\u002Fseed-shapes\u002Fdb-driver\u002Fpostgres.mjs",2171,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fseed-shapes\u002Fdb-driver\u002Fpostgres.mjs",{"path":388,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":389,"sourceHtmlUrl":390},"scripts\u002Fseed-shapes\u002Fdb-driver\u002Fsqlite.mjs",2746,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fseed-shapes\u002Fdb-driver\u002Fsqlite.mjs",{"path":392,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":393,"sourceHtmlUrl":394},"scripts\u002Fseed-shapes\u002Fverify-seeds.mjs",11146,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fseed-shapes\u002Fverify-seeds.mjs",{"path":396,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":397,"sourceHtmlUrl":398},"scripts\u002Fselector-evidence.mjs",16618,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fselector-evidence.mjs",{"path":400,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":401,"sourceHtmlUrl":402},"scripts\u002Fstage2a-orchestrator.mjs",10890,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fstage2a-orchestrator.mjs",{"path":404,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":405,"sourceHtmlUrl":406},"scripts\u002Fui-crawler.mjs",8190,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fui-crawler.mjs",{"path":408,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":409,"sourceHtmlUrl":410},"scripts\u002Fvalidate-contract.sh",12579,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fvalidate-contract.sh",{"path":412,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":413,"sourceHtmlUrl":414},"scripts\u002Fwindow-contract\u002Fdate-math.mjs",2343,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fwindow-contract\u002Fdate-math.mjs",{"path":416,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":417,"sourceHtmlUrl":418},"scripts\u002Fwindow-contract\u002Frequest-recorder.mjs",2168,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fwindow-contract\u002Frequest-recorder.mjs",{"path":420,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":421,"sourceHtmlUrl":422},"scripts\u002Fwindow-contract\u002Frun-window.mjs",8874,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fwindow-contract\u002Frun-window.mjs",{"path":424,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":425,"sourceHtmlUrl":426},"scripts\u002Fwizard-preview.sh",2387,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fwizard-preview.sh",{"path":428,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":429,"sourceHtmlUrl":430},"scripts\u002Fwizard-probe-backup.sh",1023,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fwizard-probe-backup.sh",{"path":432,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":433,"sourceHtmlUrl":434},"scripts\u002Fwizard.sh",9348,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fscripts\u002Fwizard.sh",{"path":436,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":439,"sourceHtmlUrl":440},"test-targets\u002Flang-matrix\u002Fgo\u002Fgo.mod","OTHER","其他",65,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fgo\u002Fgo.mod",{"path":442,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":443,"sourceHtmlUrl":444},"test-targets\u002Flang-matrix\u002Fgo\u002Fsrc\u002Fhello_test.go",182,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fgo\u002Fsrc\u002Fhello_test.go",{"path":446,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":447,"sourceHtmlUrl":448},"test-targets\u002Flang-matrix\u002Fgo\u002Fsrc\u002Fhello.go",117,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fgo\u002Fsrc\u002Fhello.go",{"path":450,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":451,"sourceHtmlUrl":452},"test-targets\u002Flang-matrix\u002Fjvm\u002Fpom.xml",1024,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fjvm\u002Fpom.xml",{"path":454,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":455,"sourceHtmlUrl":456},"test-targets\u002Flang-matrix\u002Fjvm\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002FHello.java",202,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fjvm\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002FHello.java",{"path":458,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":459,"sourceHtmlUrl":460},"test-targets\u002Flang-matrix\u002Fjvm\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fexample\u002FHelloTest.java",243,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fjvm\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fexample\u002FHelloTest.java",{"path":462,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":463,"sourceHtmlUrl":464},"test-targets\u002Flang-matrix\u002Fnode\u002Fpackage.json",229,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fnode\u002Fpackage.json",{"path":466,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":467,"sourceHtmlUrl":468},"test-targets\u002Flang-matrix\u002Fnode\u002Fsrc\u002Fhello.js",139,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fnode\u002Fsrc\u002Fhello.js",{"path":470,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":471,"sourceHtmlUrl":472},"test-targets\u002Flang-matrix\u002Fnode\u002Fsrc\u002Fhello.test.js",130,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fnode\u002Fsrc\u002Fhello.test.js",{"path":474,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":475,"sourceHtmlUrl":476},"test-targets\u002Flang-matrix\u002Fpython\u002Fpyproject.toml",256,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fpython\u002Fpyproject.toml",{"path":478,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":447,"sourceHtmlUrl":479},"test-targets\u002Flang-matrix\u002Fpython\u002Fsrc\u002Fhello.py","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fpython\u002Fsrc\u002Fhello.py",{"path":481,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":482,"sourceHtmlUrl":483},"test-targets\u002Flang-matrix\u002Fpython\u002Fsrc\u002Ftest_hello.py",105,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Fpython\u002Fsrc\u002Ftest_hello.py",{"path":485,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":486,"sourceHtmlUrl":487},"test-targets\u002Flang-matrix\u002Frust\u002FCargo.toml",133,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Frust\u002FCargo.toml",{"path":489,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":490,"sourceHtmlUrl":491},"test-targets\u002Flang-matrix\u002Frust\u002Fsrc\u002Flib.rs",259,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Flang-matrix\u002Frust\u002Fsrc\u002Flib.rs",{"path":493,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":494,"sourceHtmlUrl":495},"test-targets\u002Ftarget-clean-pass\u002F.autospec\u002Fstub-gate.json",676,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-clean-pass\u002F.autospec\u002Fstub-gate.json",{"path":497,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":498,"sourceHtmlUrl":499},"test-targets\u002Ftarget-clean-pass\u002F.autospec\u002Fstub-pr-comment.md",329,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-clean-pass\u002F.autospec\u002Fstub-pr-comment.md",{"path":501,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":502,"sourceHtmlUrl":503},"test-targets\u002Ftarget-clean-pass\u002F.autospec\u002Ftest.yml",342,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-clean-pass\u002F.autospec\u002Ftest.yml",{"path":505,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":506,"sourceHtmlUrl":507},"test-targets\u002Ftarget-clean-pass\u002Fpackage.json",309,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-clean-pass\u002Fpackage.json",{"path":509,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":510,"sourceHtmlUrl":511},"test-targets\u002Ftarget-clean-pass\u002Fsrc\u002FApp.tsx",311,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-clean-pass\u002Fsrc\u002FApp.tsx",{"path":513,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":514,"sourceHtmlUrl":515},"test-targets\u002Ftarget-clean-pass\u002Ftests\u002FApp.test.ts",510,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-clean-pass\u002Ftests\u002FApp.test.ts",{"path":517,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":518,"sourceHtmlUrl":519},"test-targets\u002Ftarget-contract-symmetry-bait\u002F.autospec\u002Ftest.yml",1332,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-contract-symmetry-bait\u002F.autospec\u002Ftest.yml",{"path":521,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":522,"sourceHtmlUrl":523},"test-targets\u002Ftarget-contract-symmetry-bait\u002Fgolden\u002Fstage-2-5-gate.json",770,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-contract-symmetry-bait\u002Fgolden\u002Fstage-2-5-gate.json",{"path":525,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":526,"sourceHtmlUrl":527},"test-targets\u002Ftarget-contract-symmetry-bait\u002Fpackage.json",340,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-contract-symmetry-bait\u002Fpackage.json",{"path":529,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":530,"sourceHtmlUrl":531},"test-targets\u002Ftarget-contract-symmetry-bait\u002Fsrc\u002Findex.html",989,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-contract-symmetry-bait\u002Fsrc\u002Findex.html",{"path":533,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":534,"sourceHtmlUrl":535},"test-targets\u002Ftarget-contract-symmetry-bait\u002Fsrc\u002Fserver.mjs",2095,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-contract-symmetry-bait\u002Fsrc\u002Fserver.mjs",{"path":537,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":538,"sourceHtmlUrl":539},"test-targets\u002Ftarget-failing-gap\u002F.autospec\u002Fstub-gate.json",847,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-failing-gap\u002F.autospec\u002Fstub-gate.json",{"path":541,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":542,"sourceHtmlUrl":543},"test-targets\u002Ftarget-failing-gap\u002F.autospec\u002Fstub-pr-comment.md",451,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-failing-gap\u002F.autospec\u002Fstub-pr-comment.md",{"path":545,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":502,"sourceHtmlUrl":546},"test-targets\u002Ftarget-failing-gap\u002F.autospec\u002Ftest.yml","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-failing-gap\u002F.autospec\u002Ftest.yml",{"path":548,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":549,"sourceHtmlUrl":550},"test-targets\u002Ftarget-failing-gap\u002Fpackage.json",325,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-failing-gap\u002Fpackage.json",{"path":552,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":553,"sourceHtmlUrl":554},"test-targets\u002Ftarget-failing-gap\u002Fsrc\u002FApp.tsx",555,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-failing-gap\u002Fsrc\u002FApp.tsx",{"path":556,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":557,"sourceHtmlUrl":558},"test-targets\u002Ftarget-failing-gap\u002Ftests\u002FApp.test.ts",514,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-failing-gap\u002Ftests\u002FApp.test.ts",{"path":560,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":561,"sourceHtmlUrl":562},"test-targets\u002Ftarget-greenwash-bait\u002F.autospec\u002Fstub-gate.json",814,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-greenwash-bait\u002F.autospec\u002Fstub-gate.json",{"path":564,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":565,"sourceHtmlUrl":566},"test-targets\u002Ftarget-greenwash-bait\u002F.autospec\u002Fstub-pr-comment.md",401,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-greenwash-bait\u002F.autospec\u002Fstub-pr-comment.md",{"path":568,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":569,"sourceHtmlUrl":570},"test-targets\u002Ftarget-greenwash-bait\u002F.autospec\u002Ftest.yml",1360,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-greenwash-bait\u002F.autospec\u002Ftest.yml",{"path":572,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":573,"sourceHtmlUrl":574},"test-targets\u002Ftarget-greenwash-bait\u002Fpackage.json",337,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-greenwash-bait\u002Fpackage.json",{"path":576,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":577,"sourceHtmlUrl":578},"test-targets\u002Ftarget-greenwash-bait\u002Fsrc\u002Fpeak_detector.ts",546,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-greenwash-bait\u002Fsrc\u002Fpeak_detector.ts",{"path":580,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":581,"sourceHtmlUrl":582},"test-targets\u002Ftarget-greenwash-bait\u002Ftests\u002Fpeak_detector.test.ts",623,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-greenwash-bait\u002Ftests\u002Fpeak_detector.test.ts",{"path":584,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":585,"sourceHtmlUrl":586},"test-targets\u002Ftarget-invariant-bait\u002F.autospec\u002Ftest.yml",611,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-invariant-bait\u002F.autospec\u002Ftest.yml",{"path":588,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":589,"sourceHtmlUrl":590},"test-targets\u002Ftarget-invariant-bait\u002Fgolden\u002Fstage-2-5-gate.json",535,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-invariant-bait\u002Fgolden\u002Fstage-2-5-gate.json",{"path":592,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":549,"sourceHtmlUrl":593},"test-targets\u002Ftarget-invariant-bait\u002Fpackage.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-invariant-bait\u002Fpackage.json",{"path":595,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":596,"sourceHtmlUrl":597},"test-targets\u002Ftarget-invariant-bait\u002Fsrc\u002Findex.html",2244,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-invariant-bait\u002Fsrc\u002Findex.html",{"path":599,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":600,"sourceHtmlUrl":601},"test-targets\u002Ftarget-mode-ii-fixture\u002F.autospec\u002Fstub-gate.json",755,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-mode-ii-fixture\u002F.autospec\u002Fstub-gate.json",{"path":603,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":604,"sourceHtmlUrl":605},"test-targets\u002Ftarget-mode-ii-fixture\u002F.autospec\u002Fstub-pr-comment.md",482,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-mode-ii-fixture\u002F.autospec\u002Fstub-pr-comment.md",{"path":607,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":608,"sourceHtmlUrl":609},"test-targets\u002Ftarget-mode-ii-fixture\u002F.autospec\u002Ftest.yml",1067,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-mode-ii-fixture\u002F.autospec\u002Ftest.yml",{"path":611,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":612,"sourceHtmlUrl":613},"test-targets\u002Ftarget-mode-ii-fixture\u002Fpackage.json",324,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-mode-ii-fixture\u002Fpackage.json",{"path":615,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":616,"sourceHtmlUrl":617},"test-targets\u002Ftarget-mode-ii-fixture\u002Fsrc\u002Fapp.ts",549,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-mode-ii-fixture\u002Fsrc\u002Fapp.ts",{"path":619,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":620,"sourceHtmlUrl":621},"test-targets\u002Ftarget-mode-ii-fixture\u002Ftests\u002Fapp.test.ts",599,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-mode-ii-fixture\u002Ftests\u002Fapp.test.ts",{"path":623,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":624,"sourceHtmlUrl":625},"test-targets\u002Ftarget-window-mismatch-bait\u002F.autospec\u002Ftest.yml",840,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-window-mismatch-bait\u002F.autospec\u002Ftest.yml",{"path":627,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":628,"sourceHtmlUrl":629},"test-targets\u002Ftarget-window-mismatch-bait\u002Fgolden\u002Fstage-2-5-gate.json",572,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-window-mismatch-bait\u002Fgolden\u002Fstage-2-5-gate.json",{"path":631,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":632,"sourceHtmlUrl":633},"test-targets\u002Ftarget-window-mismatch-bait\u002Fpackage.json",339,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-window-mismatch-bait\u002Fpackage.json",{"path":635,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":636,"sourceHtmlUrl":637},"test-targets\u002Ftarget-window-mismatch-bait\u002Fsrc\u002Findex.html",1447,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-window-mismatch-bait\u002Fsrc\u002Findex.html",{"path":639,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":640,"sourceHtmlUrl":641},"test-targets\u002Ftarget-window-mismatch-bait\u002Fsrc\u002Fserver.mjs",1511,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftest-targets\u002Ftarget-window-mismatch-bait\u002Fsrc\u002Fserver.mjs",{"path":643,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":644,"sourceHtmlUrl":645},"tests\u002Ffixtures\u002Fauthoring-fixture\u002Fpackage.json",215,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fauthoring-fixture\u002Fpackage.json",{"path":647,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":648,"sourceHtmlUrl":649},"tests\u002Ffixtures\u002Fauthoring-fixture\u002Fserver.mjs",3564,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fauthoring-fixture\u002Fserver.mjs",{"path":651,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":652,"sourceHtmlUrl":653},"tests\u002Ffixtures\u002Fauthoring-fixture\u002Fsrc\u002Fviews.mjs",2131,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fauthoring-fixture\u002Fsrc\u002Fviews.mjs",{"path":655,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":656,"sourceHtmlUrl":657},"tests\u002Ffixtures\u002Fcontracts\u002Fautodetect-only.yml",90,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fautodetect-only.yml",{"path":659,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":660,"sourceHtmlUrl":661},"tests\u002Ffixtures\u002Fcontracts\u002Fempty-forbidden-no-ack.yml",296,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fempty-forbidden-no-ack.yml",{"path":663,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":664,"sourceHtmlUrl":665},"tests\u002Ffixtures\u002Fcontracts\u002Fminimal-valid.yml",328,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fminimal-valid.yml",{"path":667,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":668,"sourceHtmlUrl":669},"tests\u002Ffixtures\u002Fcontracts\u002Fmode-ii-missing-backup.yml",584,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fmode-ii-missing-backup.yml",{"path":671,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":672,"sourceHtmlUrl":673},"tests\u002Ffixtures\u002Fcontracts\u002Fmode-ii-valid.json",1339,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fmode-ii-valid.json",{"path":675,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":676,"sourceHtmlUrl":677},"tests\u002Ffixtures\u002Fcontracts\u002Fmode-ii-valid.yml",699,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fmode-ii-valid.yml",{"path":679,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":680,"sourceHtmlUrl":681},"tests\u002Ffixtures\u002Fcontracts\u002Funparseable.yml",114,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Funparseable.yml",{"path":683,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":684,"sourceHtmlUrl":685},"tests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fall-metrics.yml",3919,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fall-metrics.yml",{"path":687,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":688,"sourceHtmlUrl":689},"tests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Finvalid-shapes.yml",767,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Finvalid-shapes.yml",{"path":691,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":692,"sourceHtmlUrl":693},"tests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fminimal-v2.yml",592,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fminimal-v2.yml",{"path":695,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":696,"sourceHtmlUrl":697},"tests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fmissing-edge-seeds.yml",761,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fmissing-edge-seeds.yml",{"path":699,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":700,"sourceHtmlUrl":701},"tests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fscoped-prod-with-v2.yml",1171,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fv2\u002Fscoped-prod-with-v2.yml",{"path":703,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":704,"sourceHtmlUrl":705},"tests\u002Ffixtures\u002Flang\u002Fjs\u002Fsrc\u002Fcalculator.js",575,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Flang\u002Fjs\u002Fsrc\u002Fcalculator.js",{"path":707,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":708,"sourceHtmlUrl":709},"tests\u002Ffixtures\u002Flang\u002Fjs\u002Fsrc\u002Fgreeter.ts",440,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Flang\u002Fjs\u002Fsrc\u002Fgreeter.ts",{"path":711,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":506,"sourceHtmlUrl":712},"tests\u002Ffixtures\u002Flang\u002Fjs\u002Ftests\u002Fcalculator.test.js","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Flang\u002Fjs\u002Ftests\u002Fcalculator.test.js",{"path":714,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":715,"sourceHtmlUrl":716},"tests\u002Ffixtures\u002Flang\u002Fjs\u002Ftests\u002Fgreeter.test.ts",197,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Flang\u002Fjs\u002Ftests\u002Fgreeter.test.ts",{"path":718,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":719,"sourceHtmlUrl":720},"tests\u002Ffixtures\u002Frepos\u002Fgreenwash-bait\u002FREADME.md",343,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Frepos\u002Fgreenwash-bait\u002FREADME.md",{"path":722,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":723,"sourceHtmlUrl":724},"tests\u002Ffixtures\u002Frepos\u002Fgreenwash-bait\u002Fsrc\u002Fcalc.js",189,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Frepos\u002Fgreenwash-bait\u002Fsrc\u002Fcalc.js",{"path":726,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":727,"sourceHtmlUrl":728},"tests\u002Ffixtures\u002Frepos\u002Fgreenwash-bait\u002Ftests\u002Fcalc.test.js",299,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Frepos\u002Fgreenwash-bait\u002Ftests\u002Fcalc.test.js",{"path":730,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":664,"sourceHtmlUrl":731},"tests\u002Ffixtures\u002Frepos\u002Fminimal-valid\u002F.autospec\u002Ftest.yml","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Frepos\u002Fminimal-valid\u002F.autospec\u002Ftest.yml",{"path":733,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":668,"sourceHtmlUrl":734},"tests\u002Ffixtures\u002Frepos\u002Fmode-ii-missing-backup\u002F.autospec\u002Ftest.yml","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Frepos\u002Fmode-ii-missing-backup\u002F.autospec\u002Ftest.yml",{"path":736,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":737,"sourceHtmlUrl":738},"tests\u002Ffixtures\u002Fv2\u002Fcrawler-v2\u002Fsite\u002Fpage-a.html",1045,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fcrawler-v2\u002Fsite\u002Fpage-a.html",{"path":740,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":741,"sourceHtmlUrl":742},"tests\u002Ffixtures\u002Fv2\u002Fcrawler-v2\u002Fsite\u002Fpage-b.html",704,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fcrawler-v2\u002Fsite\u002Fpage-b.html",{"path":744,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":745,"sourceHtmlUrl":746},"tests\u002Ffixtures\u002Fv2\u002Fcrawler-v2\u002Fsite\u002Fpage-c.html",877,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fcrawler-v2\u002Fsite\u002Fpage-c.html",{"path":748,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":749,"sourceHtmlUrl":750},"tests\u002Ffixtures\u002Fv2\u002Fgreenwash-bait\u002Floop-attempts-to-delete-invariants.diff",1109,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fgreenwash-bait\u002Floop-attempts-to-delete-invariants.diff",{"path":752,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":753,"sourceHtmlUrl":754},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-foldout-opens-all-nested\u002Ffail.html",416,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-foldout-opens-all-nested\u002Ffail.html",{"path":756,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":757,"sourceHtmlUrl":758},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-foldout-opens-all-nested\u002Fpass.html",918,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-foldout-opens-all-nested\u002Fpass.html",{"path":760,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":761,"sourceHtmlUrl":762},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-modal-returns-to-body-scroll\u002Ffail.html",930,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-modal-returns-to-body-scroll\u002Ffail.html",{"path":764,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":765,"sourceHtmlUrl":766},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-modal-returns-to-body-scroll\u002Fpass.html",835,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-modal-returns-to-body-scroll\u002Fpass.html",{"path":768,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":549,"sourceHtmlUrl":769},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-row-has-required-actions\u002Ffail.html","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-row-has-required-actions\u002Ffail.html",{"path":771,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":772,"sourceHtmlUrl":773},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-row-has-required-actions\u002Fpass.html",390,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-row-has-required-actions\u002Fpass.html",{"path":775,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":129,"sourceHtmlUrl":776},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-has-accessible-name\u002Ffail.html","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-has-accessible-name\u002Ffail.html",{"path":778,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":779,"sourceHtmlUrl":780},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-has-accessible-name\u002Fpass.html",331,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-has-accessible-name\u002Fpass.html",{"path":782,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":783,"sourceHtmlUrl":784},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-is-y\u002Ffail.html",380,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-is-y\u002Ffail.html",{"path":786,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":787,"sourceHtmlUrl":788},"tests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-is-y\u002Fpass.html",804,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fkinds\u002Fevery-visible-x-is-y\u002Fpass.html",{"path":790,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":791,"sourceHtmlUrl":792},"tests\u002Ffixtures\u002Fv2\u002Fstructural\u002Findex.html",2605,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fstructural\u002Findex.html",{"path":794,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":608,"sourceHtmlUrl":795},"tests\u002Ffixtures\u002Fv2\u002Fwindow-contract\u002Findex.html","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fv2\u002Fwindow-contract\u002Findex.html",{"path":797,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":798,"sourceHtmlUrl":799},"tests\u002Ffixtures\u002Fwizard\u002Fmode-ii-no-driver.yml",598,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fwizard\u002Fmode-ii-no-driver.yml",{"path":801,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":802,"sourceHtmlUrl":803},"tests\u002Ffixtures\u002Fwizard\u002Fmode-ii.yml",1098,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fwizard\u002Fmode-ii.yml",{"path":805,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":502,"sourceHtmlUrl":806},"tests\u002Ffixtures\u002Fwizard\u002Fstrict-default.yml","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Ffixtures\u002Fwizard\u002Fstrict-default.yml",{"path":808,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":494,"sourceHtmlUrl":809},"tests\u002Fintegration\u002Fgolden\u002Ftarget-clean-pass\u002Fgate.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-clean-pass\u002Fgate.json",{"path":811,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":498,"sourceHtmlUrl":812},"tests\u002Fintegration\u002Fgolden\u002Ftarget-clean-pass\u002Fpr-comment.md","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-clean-pass\u002Fpr-comment.md",{"path":814,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":538,"sourceHtmlUrl":815},"tests\u002Fintegration\u002Fgolden\u002Ftarget-failing-gap\u002Fgate.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-failing-gap\u002Fgate.json",{"path":817,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":542,"sourceHtmlUrl":818},"tests\u002Fintegration\u002Fgolden\u002Ftarget-failing-gap\u002Fpr-comment.md","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-failing-gap\u002Fpr-comment.md",{"path":820,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":561,"sourceHtmlUrl":821},"tests\u002Fintegration\u002Fgolden\u002Ftarget-greenwash-bait\u002Fgate.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-greenwash-bait\u002Fgate.json",{"path":823,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":565,"sourceHtmlUrl":824},"tests\u002Fintegration\u002Fgolden\u002Ftarget-greenwash-bait\u002Fpr-comment.md","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-greenwash-bait\u002Fpr-comment.md",{"path":826,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":600,"sourceHtmlUrl":827},"tests\u002Fintegration\u002Fgolden\u002Ftarget-mode-ii-fixture\u002Fgate.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-mode-ii-fixture\u002Fgate.json",{"path":829,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":604,"sourceHtmlUrl":830},"tests\u002Fintegration\u002Fgolden\u002Ftarget-mode-ii-fixture\u002Fpr-comment.md","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fgolden\u002Ftarget-mode-ii-fixture\u002Fpr-comment.md",{"path":832,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":833,"sourceHtmlUrl":834},"tests\u002Fintegration\u002Fphase4-integration.bats",5527,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fphase4-integration.bats",{"path":836,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":837,"sourceHtmlUrl":838},"tests\u002Fintegration\u002Frun-against-target.bats",8971,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Frun-against-target.bats",{"path":840,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":841,"sourceHtmlUrl":842},"tests\u002Fintegration\u002Fv2\u002Frun-against-target.bats",9585,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fintegration\u002Fv2\u002Frun-against-target.bats",{"path":844,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":845,"sourceHtmlUrl":846},"tests\u002Fstage2a-integration.test.mjs",12878,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Fstage2a-integration.test.mjs",{"path":848,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":849,"sourceHtmlUrl":850},"tests\u002Funit\u002Fassertion-shift\u002Ffixtures.mjs",28952,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fassertion-shift\u002Ffixtures.mjs",{"path":852,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":853,"sourceHtmlUrl":854},"tests\u002Funit\u002Fassertion-shift\u002Ffixtures.test.mjs",1162,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fassertion-shift\u002Ffixtures.test.mjs",{"path":856,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":857,"sourceHtmlUrl":858},"tests\u002Funit\u002Fassertion-shift\u002Frun-parameterized.mjs",7246,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fassertion-shift\u002Frun-parameterized.mjs",{"path":860,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":861,"sourceHtmlUrl":862},"tests\u002Funit\u002Fauthoring-config.test.mjs",11624,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fauthoring-config.test.mjs",{"path":864,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":865,"sourceHtmlUrl":866},"tests\u002Funit\u002Fbehavior-taxonomy-check.test.mjs",7014,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fbehavior-taxonomy-check.test.mjs",{"path":868,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":869,"sourceHtmlUrl":870},"tests\u002Funit\u002Fcalculator-fixture.bats",255,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fcalculator-fixture.bats",{"path":872,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":873,"sourceHtmlUrl":874},"tests\u002Funit\u002Fcontract-loader.bats",10080,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fcontract-loader.bats",{"path":876,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":877,"sourceHtmlUrl":878},"tests\u002Funit\u002Fcontrol-effects.test.mjs",13712,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fcontrol-effects.test.mjs",{"path":880,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":881,"sourceHtmlUrl":882},"tests\u002Funit\u002Ferror-signature.test.mjs",5133,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Ferror-signature.test.mjs",{"path":884,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":885,"sourceHtmlUrl":886},"tests\u002Funit\u002Fforbidden-url-check.test.mjs",4905,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fforbidden-url-check.test.mjs",{"path":888,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":889,"sourceHtmlUrl":890},"tests\u002Funit\u002Fgate-stage-2-5-coercion.bats",5123,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgate-stage-2-5-coercion.bats",{"path":892,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":893,"sourceHtmlUrl":894},"tests\u002Funit\u002Fgate-stage-2-5-live-server.bats",21683,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgate-stage-2-5-live-server.bats",{"path":896,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":897,"sourceHtmlUrl":898},"tests\u002Funit\u002Fgate-stage-2-5.bats",15124,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgate-stage-2-5.bats",{"path":900,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":901,"sourceHtmlUrl":902},"tests\u002Funit\u002Fgate-stage-e2e.bats",17196,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgate-stage-e2e.bats",{"path":904,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":905,"sourceHtmlUrl":906},"tests\u002Funit\u002Fgate-stage-unit.bats",14429,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgate-stage-unit.bats",{"path":908,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":909,"sourceHtmlUrl":910},"tests\u002Funit\u002Fgeneric-adapter.test.mjs",1785,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgeneric-adapter.test.mjs",{"path":912,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":913,"sourceHtmlUrl":914},"tests\u002Funit\u002Fgreeter-fixture.bats",478,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fgreeter-fixture.bats",{"path":916,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":917,"sourceHtmlUrl":918},"tests\u002Funit\u002Flint-playwright-author.test.mjs",20402,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Flint-playwright-author.test.mjs",{"path":920,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":921,"sourceHtmlUrl":922},"tests\u002Funit\u002Floop-budget.bats",7248,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Floop-budget.bats",{"path":924,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":925,"sourceHtmlUrl":926},"tests\u002Funit\u002Floop-classifier.env-blocker.test.mjs",12786,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Floop-classifier.env-blocker.test.mjs",{"path":928,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":929,"sourceHtmlUrl":930},"tests\u002Funit\u002Floop-classifier.test.mjs",8243,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Floop-classifier.test.mjs",{"path":932,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":933,"sourceHtmlUrl":934},"tests\u002Funit\u002Floop-controller.bats",11949,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Floop-controller.bats",{"path":936,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":937,"sourceHtmlUrl":938},"tests\u002Funit\u002Fmode-ii\u002Fbackup-drivers.test.mjs",5395,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fmode-ii\u002Fbackup-drivers.test.mjs",{"path":940,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":941,"sourceHtmlUrl":942},"tests\u002Funit\u002Fmode-ii\u002Fpostcheck.test.mjs",7493,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fmode-ii\u002Fpostcheck.test.mjs",{"path":944,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":945,"sourceHtmlUrl":946},"tests\u002Funit\u002Fmode-ii\u002Fpreflight.test.mjs",6806,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fmode-ii\u002Fpreflight.test.mjs",{"path":948,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":949,"sourceHtmlUrl":950},"tests\u002Funit\u002Fmode-ii\u002Fquarantine.test.mjs",5721,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fmode-ii\u002Fquarantine.test.mjs",{"path":952,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":953,"sourceHtmlUrl":954},"tests\u002Funit\u002Fmode-ii\u002Fruntime-intercept.test.mjs",5066,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fmode-ii\u002Fruntime-intercept.test.mjs",{"path":956,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":957,"sourceHtmlUrl":958},"tests\u002Funit\u002Fpr-report-coercion.bats",4266,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fpr-report-coercion.bats",{"path":960,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":961,"sourceHtmlUrl":962},"tests\u002Funit\u002Freset-endpoint-gen.test.mjs",16220,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Freset-endpoint-gen.test.mjs",{"path":964,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":965,"sourceHtmlUrl":966},"tests\u002Funit\u002Frun-gate-coercion.bats",3871,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Frun-gate-coercion.bats",{"path":968,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":969,"sourceHtmlUrl":970},"tests\u002Funit\u002Fselector-evidence.test.mjs",16766,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fselector-evidence.test.mjs",{"path":972,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":973,"sourceHtmlUrl":974},"tests\u002Funit\u002Fstage2a-orchestrator.test.mjs",10287,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fstage2a-orchestrator.test.mjs",{"path":976,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":977,"sourceHtmlUrl":978},"tests\u002Funit\u002Fui-crawler.test.mjs",3698,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fui-crawler.test.mjs",{"path":980,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":981,"sourceHtmlUrl":982},"tests\u002Funit\u002Fv2\u002Fcontract-loader-v2.bats",6696,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fcontract-loader-v2.bats",{"path":984,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":985,"sourceHtmlUrl":986},"tests\u002Funit\u002Fv2\u002Fdate-math.test.mjs",2713,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fdate-math.test.mjs",{"path":988,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":989,"sourceHtmlUrl":990},"tests\u002Funit\u002Fv2\u002Fextended-crawler.test.mjs",14573,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fextended-crawler.test.mjs",{"path":992,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":993,"sourceHtmlUrl":994},"tests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-foldout-opens-all-nested.test.mjs",2808,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-foldout-opens-all-nested.test.mjs",{"path":996,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":997,"sourceHtmlUrl":998},"tests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-modal-returns-to-body-scroll.test.mjs",2859,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-modal-returns-to-body-scroll.test.mjs",{"path":1000,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":985,"sourceHtmlUrl":1001},"tests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-row-has-required-actions.test.mjs","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-row-has-required-actions.test.mjs",{"path":1003,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1004,"sourceHtmlUrl":1005},"tests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-visible-x-has-accessible-name.test.mjs",2365,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-visible-x-has-accessible-name.test.mjs",{"path":1007,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1008,"sourceHtmlUrl":1009},"tests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-visible-x-is-y.test.mjs",4871,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fkinds\u002Fevery-visible-x-is-y.test.mjs",{"path":1011,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1012,"sourceHtmlUrl":1013},"tests\u002Funit\u002Fv2\u002Flib-import.test.mjs",12479,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Flib-import.test.mjs",{"path":1015,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1016,"sourceHtmlUrl":1017},"tests\u002Funit\u002Fv2\u002Frun-structural.test.mjs",9769,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Frun-structural.test.mjs",{"path":1019,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1020,"sourceHtmlUrl":1021},"tests\u002Funit\u002Fv2\u002Frun-symmetry.test.mjs",17119,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Frun-symmetry.test.mjs",{"path":1023,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1024,"sourceHtmlUrl":1025},"tests\u002Funit\u002Fv2\u002Frun-window.test.mjs",11962,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Frun-window.test.mjs",{"path":1027,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1028,"sourceHtmlUrl":1029},"tests\u002Funit\u002Fv2\u002Fverify-seeds.test.mjs",15293,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fv2\u002Fverify-seeds.test.mjs",{"path":1031,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":1032,"sourceHtmlUrl":1033},"tests\u002Funit\u002Fvalidate-skill-structure.bats",9713,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fvalidate-skill-structure.bats",{"path":1035,"resourceType":437,"resourceTypeDesc":438,"sizeBytes":1036,"sourceHtmlUrl":1037},"tests\u002Funit\u002Fwizard.bats",8973,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftests\u002Funit\u002Fwizard.bats",{"path":1039,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":1040,"sourceHtmlUrl":1041},"tsconfig.json",444,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Ftsconfig.json",{"path":1043,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1044,"sourceHtmlUrl":1045},"uninstall.sh",1351,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Funinstall.sh",{"path":1047,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":1048,"sourceHtmlUrl":1049},"validate.sh",8703,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002Fvalidate.sh",[1051,1060,1069,1078,1102,1125],{"skillNo":1052,"name":1053,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":1054,"categories":1055,"keywords":1057,"publishedAt":52},"01M71RJHYMKPTC9AAPXWQ6F4RT","trio-pass-skill","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Flockstep-trio-pass\u002FSKILL.md",[1056],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[1058,1059],"trio","trio pass skill",{"skillNo":1061,"name":1062,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":1063,"categories":1064,"keywords":1066,"publishedAt":52},"01M71RJFBQ1KAF9XM3T3Y4VMSK","duo-pass-skill","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Flockstep-duo-pass\u002FSKILL.md",[1065],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[1067,1068],"duo pass skill","duo",{"skillNo":1070,"name":1071,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":1072,"categories":1073,"keywords":1075,"publishedAt":52},"01M71RJDT1TB3P9TRWR6A534FB","duo-divergence-skill","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Flockstep-duo-divergence\u002FSKILL.md",[1074],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[1076,1068,1077],"duo divergence skill","divergence",{"skillNo":1079,"name":34,"nameZh":6,"description":1080,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":1081,"categories":1082,"keywords":1086,"publishedAt":52},"01M71RJAC4NNEQSYBDSY3NZS73","Use when the user wants to ship a feature end-to-end across multiple commits — bootstraps repo if missing, brainstorms a design spec, decomposes into linked GitHub issues, or splits an existing spec into issues, then runs an autonomous implementation loop with auto-merge.","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec\u002FSKILL.md",[1083],{"categoryNo":1084,"categoryName":1085,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",[34,1087,1088,1089,1090,1091,48,1092,47,1093,1094,44,1095,1096,1097,1098,1099,1100,1101,37],"ship a feature","end","issues","design","autonomous","loop","across","design spec","ship","implementation loop","github issues","feature","commits","repo","missing",{"skillNo":1103,"name":1104,"nameZh":6,"description":1105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":1106,"categories":1107,"keywords":1108,"publishedAt":52},"01M71RJ4F9HT8PT26CKNM9XE1M","autospec-upgrade","Use when the user wants to upgrade an Angular, Next.js, or React project to the latest official versions safely — by locking observable behavior before touching versions, upgrading one major at a time with official codemods, and gating completion on mutation score rather than coverage theater.","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002FSKILL.md",[],[1109,34,1110,1111,51,1112,1113,1114,1115,47,1116,1117,1118,1119,37,1120,1121,1122,1123,1124],"autospec upgrade","upgrade","mutation","official","project","time","gating","angular","react","next","at","Next.js","one","with","behavior","latest",{"skillNo":1126,"name":1127,"nameZh":6,"description":1128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":1129,"categories":1130,"keywords":1134,"publishedAt":52},"01M71RJ28FJ4PM6DXHB7T5CF8H","autospec-ui-audit","Use when a React Router application needs a deterministic whole-site route inventory before UI, UX, navigation, or evidence auditing begins.","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-ui-audit\u002FSKILL.md",[1131],{"categoryNo":1132,"categoryName":1133,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师",[1135,34,1136,1137,1138,37,1139,1140,1141,1142,1143,1144,1145,1146,1147,1117,1148,47,1149],"ui audit","audit","autospec ui audit","ui","inventory","evidence","deterministic","route","ux","site","react router","navigation","application","needs","router"]