[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MNYYVNG3J1C5DCGSWFDKHM":3,"skill-same:01M6MNYYVNG3J1C5DCGSWFDKHM":74},{"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":23,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6MNYYVNG3J1C5DCGSWFDKHM","falsegreen-skill",null,"Analyze test files for false-positive smells, meaning tests that pass even when the code breaks. Use when the user asks to review tests for false positives, weak assertions, mock misuse, test smells, or asks whether a test can actually fail. Covers Python (pytest, unittest), TypeScript, JavaScript (Jest, Vitest, Mocha), and Robot Framework.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1566,"MIT","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvinicq\u002Ffalsegreen-skill\u002Fskills\u002Ffalsegreen-skill\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"falsegreen skill","pytest","when","assertions","for","mocha","meaning","mock","false","tests","jest","review","files","use","analyze","vitest","false-positive","framework","code","python","typescript","2026-11-10 10:12:30",false,"---\nname: falsegreen-skill\ndescription: Analyze test files for false-positive smells, meaning tests that pass even when the code breaks. Use when the user asks to review tests for false positives, weak assertions, mock misuse, test smells, or asks whether a test can actually fail. Covers Python (pytest, unittest), TypeScript, JavaScript (Jest, Vitest, Mocha), and Robot Framework.\nlicense: MIT\n---\n\n# falsegreen-skill: false-positive test detection\n\nThis skill is a thin entry point. Default path: judge from this file. It carries\nthe protocol summary, the structural code index, the S-series table, and the\nlook-alike exemptions, which covers a Mode A review of a TypeScript, JavaScript,\nor Robot Framework test end to end.\n\nOpen a plugin-root file only where this file sends you:\n\n- `..\u002F..\u002Freference.md` - the full definition or worked example of one specific\n  code, after the index below has named it. Read the passage, not the section.\n- `..\u002F..\u002FSKILL.md` - the long-form J1-J6 wording, the Python structural catalog,\n  Mode B (authoring), or Mode C (AI-fix). At ~36 KiB on a ~32 KiB host this\n  replaces the rest of your context, so it is a decision, not a warm-up read.\n\nDo not open either before reading this file through.\n\n**Mandatory for every language, Python included: load the semantic catalog.** The\nS-series (S1-S18, S21) is language-agnostic and lives in `reference.md` under\n`## Patterns only the semantic pass can catch (AI-only)`, above the per-language\nsections. The root `SKILL.md` names only S3 and S17, so a run that loads a\nlanguage section alone never sees the rest. The complete table is in this file\nunder \"Semantic cases\", with the look-alike exemptions right after it. Use both:\nthe S-series without its exemptions produces false positives, which this skill\ntreats as worse than a miss. `..\u002F..\u002Freference.md` has the same codes as prose with\nexamples if a finding needs the long form.\n\n**Mandatory for any non-Python file (JavaScript, TypeScript, Robot Framework,\nGherkin, Tavern): work the structural code index below before you judge.** It\nnames every code all three scanners emit, so it is what stops a non-Python review\nunder-detecting. The root `SKILL.md` tables are complete only for Python; for every\nother language they are a summary.\n\nReach for the matching `reference.md` section only when the index has named a\ncandidate and you need its full definition, and then read that passage, not the\nsection. On a ~32 KiB host a whole section does not fit beside this file: the TS\u002FJS\nsection alone is ~19 KiB.\n\nThis file is the floor: the structural code index names every code all three\nscanners emit, the semantic table carries a row per S-code, and the exemptions\nfollow it. `..\u002F..\u002Freference.md` is ~92 KiB, so an eager full read overruns the\nbudget and truncates mid-file without warning, which is why the order above is\nindex first and passage second. `..\u002F..\u002Ffragments\u002Fprecision-rules.md` carries the\nprecision rules if the host resolves plugin-root paths.\n\n## Structural code index (all three scanners)\n\nGenerated from `schema\u002Fcode-catalog.json` and `schema\u002Fscanner-codes.json`, so it\ncannot drift. Scanner column: `py` falsegreen, `js` falsegreen-js, `rf`\nfalsegreen-robot. Severity `-` means no fixed severity. Diagnostic codes\n(D-series, M2) are opt-in: apply them only when asked.\n\nOne limit worth knowing before you match on a row. A code shared across languages\ncarries one title here, and for the C-series that title is the Python form. C31 is\nthe clearest case: the row reads \"capsys.readouterr() result discarded\", and the\nRobot form of the same id is any captured keyword value that is never asserted on.\nC3, C9, C23 and C44 reuse ids the same way. Read a shared row as the concept, not\nas the syntax to grep for, and pull the language-specific prose when the row is\nclose but the syntax does not match.\n\n\u003C!-- fg:structural-codes-all:start -->\n| Code | Scanner | Severity | What to look for |\n|---|---|---|---|\n| C1 | py | LOW | Assertion inside conditional or loop that may never run |\n| C2 | py\u002Fjs\u002Frf | HIGH | Test body contains no assertion at all |\n| C2b | py\u002Fjs\u002Frf | LOW | Test calls production code but verifies nothing |\n| C2c | py | LOW | Empty `self.subTest(...)` block |\n| C3 | py\u002Frf | HIGH | Assert inside try whose except swallows the error |\n| C4 | py | HIGH | Test function not collected by pytest |\n| C4b | py | LOW | Test class has `__init__` (pytest won't collect it) |\n| C5 | py\u002Fjs\u002Frf | HIGH | Always-true assertion |\n| C6 | py\u002Fjs\u002Frf | LOW | Weak assertion: only checks that something came back |\n| C6b | py | LOW | Assertion on positional mock argument via computed index |\n| C6c | py | LOW | Mock `call_count` truthiness as the oracle |\n| C7 | py\u002Fjs\u002Frf | HIGH | Self-comparison: both sides are identical |\n| C8 | py\u002Fjs | LOW | Float exact equality |\n| C8b | py\u002Fjs | LOW | Approximate equality with no explicit tolerance |\n| C9 | py\u002Fjs\u002Frf | LOW | pytest.raises too broad |\n| C9b | rf | - | RequestsLibrary `expected_status=any` |\n| C11a | py\u002Fjs\u002Frf | LOW | Self-confirming literal: test assigns then asserts the same value |\n| C13 | py | HIGH | Mock assertion misspelled or not called |\n| C13b | py | LOW | patch() without autospec |\n| C14 | py | LOW | Golden file generated from the actual output |\n| C16 | py\u002Fjs\u002Frf | LOW | Result depends on uncontrolled time, randomness, or sleep |\n| C17 | py | HIGH | pytest.skip() inside broad except |\n| C18 | py\u002Fjs | LOW | String\u002Frepr comparison |\n| C19 | py | LOW | pytest.raises wraps more than one call |\n| C20 | py\u002Fjs\u002Frf | HIGH | Assertion after unconditional return\u002Fraise\u002Ffail |\n| C21 | py\u002Fjs\u002Frf | LOW | Every assertion is inside a conditional; none runs unconditionally |\n| C22 | py | OFF | Async test never awaits the unit under test |\n| C23 | py\u002Fjs\u002Frf | LOW | Hard-coded absolute or home-relative file path |\n| C24 | py | LOW | Module-level mutable state mutated by test |\n| C25 | py | LOW | xfail without strict=True |\n| C27 | py | HIGH | try\u002Fexcept\u002Fpass around SUT call with no assertion |\n| C28 | py | LOW | pytest.raises binding variable never read |\n| C29 | py | LOW | os.environ modified directly in test |\n| C30 | py | LOW | HTTP mock not activated |\n| C31 | py\u002Frf | LOW | capsys.readouterr() result discarded |\n| C32 | py\u002Frf | LOW | @pytest.mark.skip without reason |\n| C33 | py | LOW | ML metric computed but not asserted |\n| C34 | py | LOW | Suboptimal assertion form |\n| C35 | py | LOW | Retry\u002Fflaky decorator |\n| C36 | py | LOW | pytest.fail() without reason |\n| C37 | py\u002Fjs\u002Frf | LOW | Duplicate parametrize case |\n| C38 | py | HIGH | Two tests share a name |\n| C39 | py | HIGH | Returns a comparison instead of asserting |\n| C41 | py | LOW | Assertion on a None-returning mutator |\n| C42 | py | HIGH | Assertion on a generator\u002Flambda |\n| C43 | py | LOW | Mid-test skip |\n| C44 | py\u002Fjs\u002Frf | HIGH | Numeric tautology |\n| C45 | py | HIGH | Empty parametrize |\n| C48 | py\u002Fjs | LOW | Dark patch: flips a test-mode flag then asserts |\n| C49 | py | LOW | `pytest.warns`\u002F`assertWarns` wraps more than one call |\n| C50 | py | LOW | Captured log never asserted |\n| C51 | py | HIGH | Empty-bodied `pytest.raises`\u002F`warns` context |\n| C52 | py | LOW | Membership self-confirmation |\n| C55 | py | LOW | Assertion compares two mock-rooted values |\n| C56 | py | LOW | Sync assert of a never-awaited coroutine |\n| C57 | py | LOW | Assertion against an unconfigured Mock attribute |\n| C59 | py | HIGH | Bare comparison written as a statement |\n| CC | py\u002Fjs\u002Frf | LOW | Commented-out assert |\n| D1 | py\u002Fjs | LOW | Assertion Roulette: multiple asserts, none with a message |\n| D2 | rf | - | Control flow at test level |\n| D3 | py\u002Fjs | LOW | Duplicate Assert: same assertion appears twice |\n| D4 | py\u002Fjs | LOW | Unnamed parametrize cases |\n| D5 | py | LOW | Excessive inline setup |\n| D6 | py\u002Fjs | LOW | Debug print in test |\n| D7 | js | LOW | Anonymous test: empty or missing description |\n| D8 | js | LOW | Magic number in an assertion |\n| JS1 | js | HIGH | focused test (`it.only`\u002F`fit`) skips the rest of the suite |\n| JS2 | js | HIGH | `expect(x)` with no matcher |\n| JS3 | js | LOW | snapshot is the only assertion |\n| JS4 | js | LOW | skipped test (`it.skip`\u002F`xit`\u002F`it.todo`) |\n| JS5 | js | LOW | async query\u002Fevent not awaited (`findBy*`\u002F`waitFor`\u002Fuser-event) |\n| JS6 | js | HIGH | empty `describe`\u002F`suite` |\n| JS7 | js | LOW | assertion in a non-awaited `setTimeout`\u002F`then` callback |\n| JS8 | js | LOW | mocks the unit under test and asserts it directly |\n| JS9 | js | HIGH | assertion in a dead literal branch (`if(false)`) |\n| JS11 | js | LOW | `try\u002Fcatch` swallows the assertion |\n| JS13 | js | LOW | `queryBy*`\u002F`queryAllBy*` query (returns null when absent) as a loose statement, never asserted - `getBy*`\u002F`getAllBy*`\u002F`findBy*`\u002F`findAllBy*` throw on absence and ARE the assertion |\n| JS15 | js | LOW | comparison wrapped in a boolean (`expect(a===b).toBe(true)`) |\n| JS17 | js | LOW | commented-out test block (`\u002F\u002F it(...)`) |\n| JS18 | js | LOW | `done` callback instead of async\u002Fawait |\n| JS21 | js | HIGH | matcher referenced but never called (`expect(x).toBe` with no `()`) |\n| JS22 | js | HIGH | empty `it.each`\u002F`test.each` table |\n| JS23 | js | HIGH | `expect.assertions(N)` with fewer unconditional reachable `expect()` calls than `N` |\n| JS24 | js | LOW | Cypress `cy.get\u002Ffind\u002Fcontains` query statement with no `.should`\u002F`.and`\u002F`.then` assertion |\n| JS25 | js | HIGH | the only assertion sits inside an array-iterator callback (`forEach`\u002F`map`\u002F`filter`\u002F`some`\u002F`every`\u002F`flatMap`) - runs zero times on an empty collection |\n| JS26 | js | LOW | fake timers installed but never advanced (`runAllTimers`\u002F`advanceTimersByTime`\u002F`tick`) - the scheduled callback never fires, so the assertion reads un-mutated state |\n| JS27 | js | LOW | `toHaveBeenCalled*` is the sole oracle on a locally-created double - verifies wiring, not behaviour |\n| JS29 | js | LOW | `expect(...).resolves`\u002F`.rejects` chain is a bare statement, not awaited or returned - the test finishes green before the matcher settles |\n| JS30 | js | HIGH | literal-vs-literal assertion (`expect(2).toBe(3)`, chai `expect(x).to.equal(y)`) - both operands are fixed at parse time |\n| JS31 | js | LOW | `try\u002Fcatch` swallows a possible throw with no assertion on the exception - a unit that stops throwing still passes green |\n| M2 | py\u002Fjs\u002Frf | LOW | Long test method |\n| PL1 | py | - | Asserts stripped at runtime |\n| PL2 | py | - | Warnings not promoted |\n| PL7 | py\u002Fjs | - | No coverage gate |\n| PL8 | py\u002Fjs | - | Run stops early |\n| PL9 | rf | - | Skip-on-failure run option |\n| PL10 | js | - | passWithNoTests |\n| R1 | rf | - | Forced green |\n| R2 | rf | - | Hollow verifier keyword |\n| R3 | rf | - | Test Cases in a .resource |\n| R4 | rf | - | No Operation only |\n| R5 | rf | - | Empty [Template] |\n| R6 | rf | - | Should Be True on a string literal |\n| R7 | rf | - | Hollow [Template] keyword |\n| R8 | rf | - | Verification only in Setup |\n| R8b | rf | - | Verification only in Teardown |\n\u003C!-- fg:structural-codes-all:end -->\n\n## Semantic cases\n\nEvery AI-only S-code, plus the five numbered semantic cases. Complete: this is\nwhat Step 4 screens against.\n\n\u003C!-- fg:semantic-cases-compact:start -->\n| Case | Judgment | Severity | Name | Rule |\n|---|---|---|---|---|\n| 10 | J3 | HIGH | Mocks the unit under test | Patches\u002Fmocks the function being tested, then asserts on the mock's return value |\n| 11 | J2\u002FJ3 | HIGH | Asserts the value fed to the mock | Stubs dependency to return X, then asserts result == X with no real logic in between |\n| 12 | J2 | HIGH | Re-implements the production formula | Expected value computed with the same formula as the SUT; both sides agree on the same wrong answer |\n| 15 | J6 | HIGH | Passes only if another test ran first | Reads shared mutable state written by a sibling test; fails when run alone |\n| 18 | J2 | HIGH | Expected value contradicts what the code should do | Asserts a value the independent oracle says is wrong; requires cited oracle before reporting |\n| S1 | J4 | - | Intent mismatch | The name or docstring claims to verify X, the assertion checks Y or a trivial property (`test_applies_discount` that only asserts the call did not raise) |\n| S2 | J4 | - | Irrelevant oracle | The assertion checks a property unrelated to the behavior under test: a test of the computed total that only asserts the response is not null |\n| S3 | J2 | - | Plausible-but-wrong expected value | The expected constant looks reasonable but contradicts the spec (off-by-one, wrong rounding, wrong sign); derive the correct value from the spec and compare |\n| S4 | J4 | - | Oracle cannot distinguish correct from a likely bug | The assertion passes for the right output and for a plausible wrong one: `len(result) == 3` when the suspected bug also yields three items |\n| S5 | J3 | - | Tests the framework, not the code | The assertion exercises a language or library guarantee (a dict stores a key, the ORM returns what was just saved) instead of the code under test |\n| S6 | J4 | - | Happy-path only against a stated contract | The spec or docstring promises error handling or boundaries, the test covers only the nominal path |\n| S7 | J2 | - | Expected lifted from the output | The expected value was copied from a run of the current code (a pasted dict, a captured response), so the test can only confirm the code matches itself |\n| S8 | J3 | - | Mock return reaches the assertion through an indirection | The stub's value flows through one or two trivial steps to the assertion, so the test still echoes the stub instead of verifying real behavior |\n| S9 | J2 | - | Self-fulfilling arrangement | The test arranges the exact state it then asserts, with no transformation by the unit under test |\n| S10 | J4 | - | Asserts the log, not the effect | The only check is that a message was logged, not the state change the message describes |\n| S11 | J4 | - | Negative-only assertion on a security filter | A sanitizer, redactor, or auth test asserts only that the bad thing is absent (`\"password\" not in response`); it passes when the output is empty or dropped, so require a paired positive assertion |\n| S12 | J3 | - | Patches core logic instead of an external edge | The test patches a private method or a direct collaborator on the class under test, so the assertion reads the stub, not the unit's own logic; patching a genuine external edge is legitimate |\n| S13 | J6 | - | Passes only via shared state a sibling set up | The test relies on module-global, fixture, or hoisted state that another test or an import mutates, so it passes only in a given execution order |\n| S14 | J2 | - | Recorded model output as the oracle | Asserts `==` against a snapshotted LLM\u002Fmodel result; green means the model still emits what it once emitted, not that the output is correct |\n| S15 | J6 | LOW | Hand-rolled retry\u002Fpoll loop masking flakiness | Wraps action+assertion in a retry\u002Fpoll and passes if any attempt succeeds; only the swallow-and-pass form (a retry that re-raises on exhaustion is a sanctioned settle, not S15) |\n| S16 | J4 | LOW | Call-verification as the sole oracle | The only check is that a collaborator was called (`assert_called_once`\u002F`toHaveBeenCalled`), with no assertion on the unit's own return value or state |\n| S17 | J4 | HIGH | Exception-path oracle blindness | `pytest.raises(Exception)`\u002F`expect(fn).toThrow()` with no type or message on a documented error contract; goes green when the exception came from arrange (typo, missing import, None-deref) and the SUT never reached its raise |\n| S18 | J3 | LOW | Contract-impossible stub value | A legitimate edge stub is configured to return a value the real collaborator can never emit (negative price, schema-violating row, `None` where non-null is guaranteed); the SUT handles an unreachable branch while the real defect goes untouched |\n| S21 | J2 | LOW | Self-judging LLM\u002Fagent assertion | The oracle is a live model call (`judge_llm(...) == \"yes\"`, embedding-similarity against a model-generated reference, agent grading its own transcript); circular, passes whenever the judge is wrong in the same direction as the SUT |\n\u003C!-- fg:semantic-cases-compact:end -->\n\n### Look-alike exemptions for the semantic codes\n\nCheck these before reporting any S-code. They override the table above: a pattern\nlisted here is correct code.\n\n\u003C!-- fg:semantic-exemptions:start -->\nLook-alikes - do NOT flag: a deliberately narrow unit test whose scope the spec confirms\n(S6 needs a stated broader contract); a constant that the spec genuinely endorses (not S3);\na sanitizer test that already pairs the negative check with a positive one (not S11); a test\nof a filter whose contract is to drop the input entirely - a blocklist sanitizer, a\nguard that returns empty on a forbidden value, a redactor that suppresses the whole field -\nwhere empty output is the correct behavior, so the negative-only assertion legitimately\npasses and a positive \"content survived\" assertion would contradict the design (not S11); a\nmock on a genuine external edge - DB, network, clock (not S12); a `jest.spyOn(instance, 'methodA')` \u002F `vi.spyOn` that stubs a DIFFERENT method than the one under test, to isolate an orchestrator from a sibling sub-unit (the assertion is on the composed result, not the stub) - S12 fires only when the patched symbol is a method of the SUT instance itself or the assertion echoes the stub value (not S12); a constructor-injected or module-level collaborator mock - repository, db, auth, or HTTP client (a clean case-10 external edge, not S12); a stub-config call made on the very library under test - `mockingoose`, `tinyspy`, `jsdom-testing-mocks` - where the mocking library IS the SUT, so the stub setup is production code (not S5\u002FS8\u002FC11a); a test whose shared state is\nreset by an autouse\u002F`beforeEach` teardown (not S13); a structural or contract assertion on a\nmodel output - valid JSON, required keys present, a cited source id matches, a refusal on a\nbanned prompt, a deterministic post-processing step - or a mocked\u002Fstubbed model whose return is\nfixture data (not S14); a sanctioned async-settling wait - Robot `Wait Until Keyword Succeeds`,\nTesting Library `waitFor`\u002F`findBy*`, Playwright\u002FCypress auto-wait, `await expect(...).toPass()` -\nthat polls a real settle condition and still fails hard on timeout (not S15); a call-only\nassertion where the interaction IS the contract - a fire-and-forget event, an audit-log or\ntelemetry write, a queue publish - or a `toHaveBeenCalledWith`\u002F`assert_called_once_with` that\npins the specific arguments, or any call-verification paired with an assertion on the SUT's return value or state - S16 requires the call-verification to be the SOLE oracle (not S16); a `pytest.raises(SpecificError, match=...)` bound to the SUT line (not S17); a stub fed a value the collaborator's contract can actually return (not S18); a test under `*.problem.*` \u002F `*.solution.*` \u002F `exercises\u002F` \u002F `katas\u002F` \u002F `playground\u002F` - a teaching or TDD-spec fixture whose expected value is intentional (the exercise IS the spec), not a frozen bug (not case 18, not S3); a deterministic rubric, structural validator, or frozen human-labeled judge set rather than a live model verdict (not S21).\n\u003C!-- fg:semantic-exemptions:end -->\n\n## Structural code index (TS\u002FJS, Robot, project layer)\n\nGenerated from `schema\u002Fcode-catalog.json`, so it cannot drift from\n`reference.md`. Severity `-` means the code carries no fixed severity.\n\n\u003C!-- fg:structural-codes-compact:start -->\n| Code | Severity | What to look for |\n|---|---|---|\n| **TypeScript \u002F JavaScript** | | 24 codes |\n| JS1 | HIGH | focused test (`it.only`\u002F`fit`) skips the rest of the suite |\n| JS2 | HIGH | `expect(x)` with no matcher |\n| JS3 | LOW | snapshot is the only assertion |\n| JS4 | LOW | skipped test (`it.skip`\u002F`xit`\u002F`it.todo`) |\n| JS5 | LOW | async query\u002Fevent not awaited (`findBy*`\u002F`waitFor`\u002Fuser-event) |\n| JS6 | HIGH | empty `describe`\u002F`suite` |\n| JS7 | LOW | assertion in a non-awaited `setTimeout`\u002F`then` callback |\n| JS8 | LOW | mocks the unit under test and asserts it directly |\n| JS9 | HIGH | assertion in a dead literal branch (`if(false)`) |\n| JS11 | LOW | `try\u002Fcatch` swallows the assertion |\n| JS13 | LOW | `queryBy*`\u002F`queryAllBy*` query (returns null when absent) as a loose statement, never asserted - `getBy*`\u002F`getAllBy*`\u002F`findBy*`\u002F`findAllBy*` throw on absence and ARE the assertion |\n| JS15 | LOW | comparison wrapped in a boolean (`expect(a===b).toBe(true)`) |\n| JS17 | LOW | commented-out test block (`\u002F\u002F it(...)`) |\n| JS18 | LOW | `done` callback instead of async\u002Fawait |\n| JS21 | HIGH | matcher referenced but never called (`expect(x).toBe` with no `()`) |\n| JS22 | HIGH | empty `it.each`\u002F`test.each` table |\n| JS23 | HIGH | `expect.assertions(N)` with fewer unconditional reachable `expect()` calls than `N` |\n| JS24 | LOW | Cypress `cy.get\u002Ffind\u002Fcontains` query statement with no `.should`\u002F`.and`\u002F`.then` assertion |\n| JS25 | HIGH | the only assertion sits inside an array-iterator callback (`forEach`\u002F`map`\u002F`filter`\u002F`some`\u002F`every`\u002F`flatMap`) - runs zero times on an empty collection |\n| JS26 | LOW | fake timers installed but never advanced (`runAllTimers`\u002F`advanceTimersByTime`\u002F`tick`) - the scheduled callback never fires, so the assertion reads un-mutated state |\n| JS27 | LOW | `toHaveBeenCalled*` is the sole oracle on a locally-created double - verifies wiring, not behaviour |\n| JS29 | LOW | `expect(...).resolves`\u002F`.rejects` chain is a bare statement, not awaited or returned - the test finishes green before the matcher settles |\n| JS30 | HIGH | literal-vs-literal assertion (`expect(2).toBe(3)`, chai `expect(x).to.equal(y)`) - both operands are fixed at parse time |\n| JS31 | LOW | `try\u002Fcatch` swallows a possible throw with no assertion on the exception - a unit that stops throwing still passes green |\n| **Robot Framework** | | 9 codes |\n| R1 | - | Forced green |\n| R2 | - | Hollow verifier keyword |\n| R3 | - | Test Cases in a .resource |\n| R4 | - | No Operation only |\n| R5 | - | Empty [Template] |\n| R6 | - | Should Be True on a string literal |\n| R7 | - | Hollow [Template] keyword |\n| R8 | - | Verification only in Setup |\n| R8b | - | Verification only in Teardown |\n| **Project layer** | | 6 codes |\n| PL1 | - | Asserts stripped at runtime |\n| PL2 | - | Warnings not promoted |\n| PL7 | - | No coverage gate |\n| PL8 | - | Run stops early |\n| PL9 | - | Skip-on-failure run option |\n| PL10 | - | passWithNoTests |\n\u003C!-- fg:structural-codes-compact:end -->\n\n## Protocol in one paragraph\n\nA test is useful only if it fails when the code breaks. Detect the language and\nframework, classify the test intent (spec, characterization, regression,\nbehavior), then apply the six judgments: J1 does the assertion run, J2 is the\nexpected value from an independent oracle, J3 is the real unit under test, J4\ndoes the assertion verify enough, J5 is the test coupled to implementation\ninternals, J6 does the test pass in isolation. For Python, also run the full\nstructural catalog (families A-E, the 56 emitted C-codes). Flag only the first failing\njudgment per test.\n\n## Non-negotiable rules\n\n- Never report case 18 (expected value contradicts the spec) without citing an\n  independent oracle, and always run the adversarial verify pass first.\n- Precision over recall: a wrong HIGH finding is worse than a missed LOW one.\n- Check the look-alike exemptions in `reference.md` before flagging.\n\n## Output\n\nUse the CASE \u002F SUMMARY format defined in the root `SKILL.md` Step 6:\n\n```\nCASE {number} ({J-code}) - {HIGH|LOW} - {language} - {intent}\nTest \u002F Finding \u002F Evidence \u002F Oracle (case 18 only) \u002F Fix hint\n```\n","# falsegreen-skill: false-positive test detection\n\nThis skill is a thin entry point. Default path: judge from this file. It carries\nthe protocol summary, the structural code index, the S-series table, and the\nlook-alike exemptions, which covers a Mode A review of a TypeScript, JavaScript,\nor Robot Framework test end to end.\n\nOpen a plugin-root file only where this file sends you:\n\n- `..\u002F..\u002Freference.md` - the full definition or worked example of one specific\n  code, after the index below has named it. Read the passage, not the section.\n- `..\u002F..\u002FSKILL.md` - the long-form J1-J6 wording, the Python structural catalog,\n  Mode B (authoring), or Mode C (AI-fix). At ~36 KiB on a ~32 KiB host this\n  replaces the rest of your context, so it is a decision, not a warm-up read.\n\nDo not open either before reading this file through.\n\n**Mandatory for every language, Python included: load the semantic catalog.** The\nS-series (S1-S18, S21) is language-agnostic and lives in `reference.md` under\n`## Patterns only the semantic pass can catch (AI-only)`, above the per-language\nsections. The root `SKILL.md` names only S3 and S17, so a run that loads a\nlanguage section alone never sees the rest. The complete table is in this file\nunder \"Semantic cases\", with the look-alike exemptions right after it. Use both:\nthe S-series without its exemptions produces false positives, which this skill\ntreats as worse than a miss. `..\u002F..\u002Freference.md` has the same codes as prose with\nexamples if a finding needs the long form.\n\n**Mandatory for any non-Python file (JavaScript, TypeScript, Robot Framework,\nGherkin, Tavern): work the structural code index below before you judge.** It\nnames every code all three scanners emit, so it is what stops a non-Python review\nunder-detecting. The root `SKILL.md` tables are complete only for Python; for every\nother language they are a summary.\n\nReach for the matching `reference.md` section only when the index has named a\ncandidate and you need its full definition, and then read that passage, not the\nsection. On a ~32 KiB host a whole section does not fit beside this file: the TS\u002FJS\nsection alone is ~19 KiB.\n\nThis file is the floor: the structural code index names every code all three\nscanners emit, the semantic table carries a row per S-code, and the exemptions\nfollow it. `..\u002F..\u002Freference.md` is ~92 KiB, so an eager full read overruns the\nbudget and truncates mid-file without warning, which is why the order above is\nindex first and passage second. `..\u002F..\u002Ffragments\u002Fprecision-rules.md` carries the\nprecision rules if the host resolves plugin-root paths.\n\n## Structural code index (all three scanners)\n\nGenerated from `schema\u002Fcode-catalog.json` and `schema\u002Fscanner-codes.json`, so it\ncannot drift. Scanner column: `py` falsegreen, `js` falsegreen-js, `rf`\nfalsegreen-robot. Severity `-` means no fixed severity. Diagnostic codes\n(D-series, M2) are opt-in: apply them only when asked.\n\nOne limit worth knowing before you match on a row. A code shared across languages\ncarries one title here, and for the C-series that title is the Python form. C31 is\nthe clearest case: the row reads \"capsys.readouterr() result discarded\", and the\nRobot form of the same id is any captured keyword value that is never asserted on.\nC3, C9, C23 and C44 reuse ids the same way. Read a shared row as the concept, not\nas the syntax to grep for, and pull the language-specific prose when the row is\nclose but the syntax does not match.\n\n\u003C!-- fg:structural-codes-all:start -->\n| Code | Scanner | Severity | What to look for |\n|---|---|---|---|\n| C1 | py | LOW | Assertion inside conditional or loop that may never run |\n| C2 | py\u002Fjs\u002Frf | HIGH | Test body contains no assertion at all |\n| C2b | py\u002Fjs\u002Frf | LOW | Test calls production code but verifies nothing |\n| C2c | py | LOW | Empty `self.subTest(...)` block |\n| C3 | py\u002Frf | HIGH | Assert inside try whose except swallows the error |\n| C4 | py | HIGH | Test function not collected by pytest |\n| C4b | py | LOW | Test class has `__init__` (pytest won't collect it) |\n| C5 | py\u002Fjs\u002Frf | HIGH | Always-true assertion |\n| C6 | py\u002Fjs\u002Frf | LOW | Weak assertion: only checks that something came back |\n| C6b | py | LOW | Assertion on positional mock argument via computed index |\n| C6c | py | LOW | Mock `call_count` truthiness as the oracle |\n| C7 | py\u002Fjs\u002Frf | HIGH | Self-comparison: both sides are identical |\n| C8 | py\u002Fjs | LOW | Float exact equality |\n| C8b | py\u002Fjs | LOW | Approximate equality with no explicit tolerance |\n| C9 | py\u002Fjs\u002Frf | LOW | pytest.raises too broad |\n| C9b | rf | - | RequestsLibrary `expected_status=any` |\n| C11a | py\u002Fjs\u002Frf | LOW | Self-confirming literal: test assigns then asserts the same value |\n| C13 | py | HIGH | Mock assertion misspelled or not called |\n| C13b | py | LOW | patch() without autospec |\n| C14 | py | LOW | Golden file generated from the actual output |\n| C16 | py\u002Fjs\u002Frf | LOW | Result depends on uncontrolled time, randomness, or sleep |\n| C17 | py | HIGH | pytest.skip() inside broad except |\n| C18 | py\u002Fjs | LOW | String\u002Frepr comparison |\n| C19 | py | LOW | pytest.raises wraps more than one call |\n| C20 | py\u002Fjs\u002Frf | HIGH | Assertion after unconditional return\u002Fraise\u002Ffail |\n| C21 | py\u002Fjs\u002Frf | LOW | Every assertion is inside a conditional; none runs unconditionally |\n| C22 | py | OFF | Async test never awaits the unit under test |\n| C23 | py\u002Fjs\u002Frf | LOW | Hard-coded absolute or home-relative file path |\n| C24 | py | LOW | Module-level mutable state mutated by test |\n| C25 | py | LOW | xfail without strict=True |\n| C27 | py | HIGH | try\u002Fexcept\u002Fpass around SUT call with no assertion |\n| C28 | py | LOW | pytest.raises binding variable never read |\n| C29 | py | LOW | os.environ modified directly in test |\n| C30 | py | LOW | HTTP mock not activated |\n| C31 | py\u002Frf | LOW | capsys.readouterr() result discarded |\n| C32 | py\u002Frf | LOW | @pytest.mark.skip without reason |\n| C33 | py | LOW | ML metric computed but not asserted |\n| C34 | py | LOW | Suboptimal assertion form |\n| C35 | py | LOW | Retry\u002Fflaky decorator |\n| C36 | py | LOW | pytest.fail() without reason |\n| C37 | py\u002Fjs\u002Frf | LOW | Duplicate parametrize case |\n| C38 | py | HIGH | Two tests share a name |\n| C39 | py | HIGH | Returns a comparison instead of asserting |\n| C41 | py | LOW | Assertion on a None-returning mutator |\n| C42 | py | HIGH | Assertion on a generator\u002Flambda |\n| C43 | py | LOW | Mid-test skip |\n| C44 | py\u002Fjs\u002Frf | HIGH | Numeric tautology |\n| C45 | py | HIGH | Empty parametrize |\n| C48 | py\u002Fjs | LOW | Dark patch: flips a test-mode flag then asserts |\n| C49 | py | LOW | `pytest.warns`\u002F`assertWarns` wraps more than one call |\n| C50 | py | LOW | Captured log never asserted |\n| C51 | py | HIGH | Empty-bodied `pytest.raises`\u002F`warns` context |\n| C52 | py | LOW | Membership self-confirmation |\n| C55 | py | LOW | Assertion compares two mock-rooted values |\n| C56 | py | LOW | Sync assert of a never-awaited coroutine |\n| C57 | py | LOW | Assertion against an unconfigured Mock attribute |\n| C59 | py | HIGH | Bare comparison written as a statement |\n| CC | py\u002Fjs\u002Frf | LOW | Commented-out assert |\n| D1 | py\u002Fjs | LOW | Assertion Roulette: multiple asserts, none with a message |\n| D2 | rf | - | Control flow at test level |\n| D3 | py\u002Fjs | LOW | Duplicate Assert: same assertion appears twice |\n| D4 | py\u002Fjs | LOW | Unnamed parametrize cases |\n| D5 | py | LOW | Excessive inline setup |\n| D6 | py\u002Fjs | LOW | Debug print in test |\n| D7 | js | LOW | Anonymous test: empty or missing description |\n| D8 | js | LOW | Magic number in an assertion |\n| JS1 | js | HIGH | focused test (`it.only`\u002F`fit`) skips the rest of the suite |\n| JS2 | js | HIGH | `expect(x)` with no matcher |\n| JS3 | js | LOW | snapshot is the only assertion |\n| JS4 | js | LOW | skipped test (`it.skip`\u002F`xit`\u002F`it.todo`) |\n| JS5 | js | LOW | async query\u002Fevent not awaited (`findBy*`\u002F`waitFor`\u002Fuser-event) |\n| JS6 | js | HIGH | empty `describe`\u002F`suite` |\n| JS7 | js | LOW | assertion in a non-awaited `setTimeout`\u002F`then` callback |\n| JS8 | js | LOW | mocks the unit under test and asserts it directly |\n| JS9 | js | HIGH | assertion in a dead literal branch (`if(false)`) |\n| JS11 | js | LOW | `try\u002Fcatch` swallows the assertion |\n| JS13 | js | LOW | `queryBy*`\u002F`queryAllBy*` query (returns null when absent) as a loose statement, never asserted - `getBy*`\u002F`getAllBy*`\u002F`findBy*`\u002F`findAllBy*` throw on absence and ARE the assertion |\n| JS15 | js | LOW | comparison wrapped in a boolean (`expect(a===b).toBe(true)`) |\n| JS17 | js | LOW | commented-out test block (`\u002F\u002F it(...)`) |\n| JS18 | js | LOW | `done` callback instead of async\u002Fawait |\n| JS21 | js | HIGH | matcher referenced but never called (`expect(x).toBe` with no `()`) |\n| JS22 | js | HIGH | empty `it.each`\u002F`test.each` table |\n| JS23 | js | HIGH | `expect.assertions(N)` with fewer unconditional reachable `expect()` calls than `N` |\n| JS24 | js | LOW | Cypress `cy.get\u002Ffind\u002Fcontains` query statement with no `.should`\u002F`.and`\u002F`.then` assertion |\n| JS25 | js | HIGH | the only assertion sits inside an array-iterator callback (`forEach`\u002F`map`\u002F`filter`\u002F`some`\u002F`every`\u002F`flatMap`) - runs zero times on an empty collection |\n| JS26 | js | LOW | fake timers installed but never advanced (`runAllTimers`\u002F`advanceTimersByTime`\u002F`tick`) - the scheduled callback never fires, so the assertion reads un-mutated state |\n| JS27 | js | LOW | `toHaveBeenCalled*` is the sole oracle on a locally-created double - verifies wiring, not behaviour |\n| JS29 | js | LOW | `expect(...).resolves`\u002F`.rejects` chain is a bare statement, not awaited or returned - the test finishes green before the matcher settles |\n| JS30 | js | HIGH | literal-vs-literal assertion (`expect(2).toBe(3)`, chai `expect(x).to.equal(y)`) - both operands are fixed at parse time |\n| JS31 | js | LOW | `try\u002Fcatch` swallows a possible throw with no assertion on the exception - a unit that stops throwing still passes green |\n| M2 | py\u002Fjs\u002Frf | LOW | Long test method |\n| PL1 | py | - | Asserts stripped at runtime |\n| PL2 | py | - | Warnings not promoted |\n| PL7 | py\u002Fjs | - | No coverage gate |\n| PL8 | py\u002Fjs | - | Run stops early |\n| PL9 | rf | - | Skip-on-failure run option |\n| PL10 | js | - | passWithNoTests |\n| R1 | rf | - | Forced green |\n| R2 | rf | - | Hollow verifier keyword |\n| R3 | rf | - | Test Cases in a .resource |\n| R4 | rf | - | No Operation only |\n| R5 | rf | - | Empty [Template] |\n| R6 | rf | - | Should Be True on a string literal |\n| R7 | rf | - | Hollow [Template] keyword |\n| R8 | rf | - | Verification only in Setup |\n| R8b | rf | - | Verification only in Teardown |\n\u003C!-- fg:structural-codes-all:end -->\n\n## Semantic cases\n\nEvery AI-only S-code, plus the five numbered semantic cases. Complete: this is\nwhat Step 4 screens against.\n\n\u003C!-- fg:semantic-cases-compact:start -->\n| Case | Judgment | Severity | Name | Rule |\n|---|---|---|---|---|\n| 10 | J3 | HIGH | Mocks the unit under test | Patches\u002Fmocks the function being tested, then asserts on the mock's return value |\n| 11 | J2\u002FJ3 | HIGH | Asserts the value fed to the mock | Stubs dependency to return X, then asserts result == X with no real logic in between |\n| 12 | J2 | HIGH | Re-implements the production formula | Expected value computed with the same formula as the SUT; both sides agree on the same wrong answer |\n| 15 | J6 | HIGH | Passes only if another test ran first | Reads shared mutable state written by a sibling test; fails when run alone |\n| 18 | J2 | HIGH | Expected value contradicts what the code should do | Asserts a value the independent oracle says is wrong; requires cited oracle before reporting |\n| S1 | J4 | - | Intent mismatch | The name or docstring claims to verify X, the assertion checks Y or a trivial property (`test_applies_discount` that only asserts the call did not raise) |\n| S2 | J4 | - | Irrelevant oracle | The assertion checks a property unrelated to the behavior under test: a test of the computed total that only asserts the response is not null |\n| S3 | J2 | - | Plausible-but-wrong expected value | The expected constant looks reasonable but contradicts the spec (off-by-one, wrong rounding, wrong sign); derive the correct value from the spec and compare |\n| S4 | J4 | - | Oracle cannot distinguish correct from a likely bug | The assertion passes for the right output and for a plausible wrong one: `len(result) == 3` when the suspected bug also yields three items |\n| S5 | J3 | - | Tests the framework, not the code | The assertion exercises a language or library guarantee (a dict stores a key, the ORM returns what was just saved) instead of the code under test |\n| S6 | J4 | - | Happy-path only against a stated contract | The spec or docstring promises error handling or boundaries, the test covers only the nominal path |\n| S7 | J2 | - | Expected lifted from the output | The expected value was copied from a run of the current code (a pasted dict, a captured response), so the test can only confirm the code matches itself |\n| S8 | J3 | - | Mock return reaches the assertion through an indirection | The stub's value flows through one or two trivial steps to the assertion, so the test still echoes the stub instead of verifying real behavior |\n| S9 | J2 | - | Self-fulfilling arrangement | The test arranges the exact state it then asserts, with no transformation by the unit under test |\n| S10 | J4 | - | Asserts the log, not the effect | The only check is that a message was logged, not the state change the message describes |\n| S11 | J4 | - | Negative-only assertion on a security filter | A sanitizer, redactor, or auth test asserts only that the bad thing is absent (`\"password\" not in response`); it passes when the output is empty or dropped, so require a paired positive assertion |\n| S12 | J3 | - | Patches core logic instead of an external edge | The test patches a private method or a direct collaborator on the class under test, so the assertion reads the stub, not the unit's own logic; patching a genuine external edge is legitimate |\n| S13 | J6 | - | Passes only via shared state a sibling set up | The test relies on module-global, fixture, or hoisted state that another test or an import mutates, so it passes only in a given execution order |\n| S14 | J2 | - | Recorded model output as the oracle | Asserts `==` against a snapshotted LLM\u002Fmodel result; green means the model still emits what it once emitted, not that the output is correct |\n| S15 | J6 | LOW | Hand-rolled retry\u002Fpoll loop masking flakiness | Wraps action+assertion in a retry\u002Fpoll and passes if any attempt succeeds; only the swallow-and-pass form (a retry that re-raises on exhaustion is a sanctioned settle, not S15) |\n| S16 | J4 | LOW | Call-verification as the sole oracle | The only check is that a collaborator was called (`assert_called_once`\u002F`toHaveBeenCalled`), with no assertion on the unit's own return value or state |\n| S17 | J4 | HIGH | Exception-path oracle blindness | `pytest.raises(Exception)`\u002F`expect(fn).toThrow()` with no type or message on a documented error contract; goes green when the exception came from arrange (typo, missing import, None-deref) and the SUT never reached its raise |\n| S18 | J3 | LOW | Contract-impossible stub value | A legitimate edge stub is configured to return a value the real collaborator can never emit (negative price, schema-violating row, `None` where non-null is guaranteed); the SUT handles an unreachable branch while the real defect goes untouched |\n| S21 | J2 | LOW | Self-judging LLM\u002Fagent assertion | The oracle is a live model call (`judge_llm(...) == \"yes\"`, embedding-similarity against a model-generated reference, agent grading its own transcript); circular, passes whenever the judge is wrong in the same direction as the SUT |\n\u003C!-- fg:semantic-cases-compact:end -->\n\n### Look-alike exemptions for the semantic codes\n\nCheck these before reporting any S-code. They override the table above: a pattern\nlisted here is correct code.\n\n\u003C!-- fg:semantic-exemptions:start -->\nLook-alikes - do NOT flag: a deliberately narrow unit test whose scope the spec confirms\n(S6 needs a stated broader contract); a constant that the spec genuinely endorses (not S3);\na sanitizer test that already pairs the negative check with a positive one (not S11); a test\nof a filter whose contract is to drop the input entirely - a blocklist sanitizer, a\nguard that returns empty on a forbidden value, a redactor that suppresses the whole field -\nwhere empty output is the correct behavior, so the negative-only assertion legitimately\npasses and a positive \"content survived\" assertion would contradict the design (not S11); a\nmock on a genuine external edge - DB, network, clock (not S12); a `jest.spyOn(instance, 'methodA')` \u002F `vi.spyOn` that stubs a DIFFERENT method than the one under test, to isolate an orchestrator from a sibling sub-unit (the assertion is on the composed result, not the stub) - S12 fires only when the patched symbol is a method of the SUT instance itself or the assertion echoes the stub value (not S12); a constructor-injected or module-level collaborator mock - repository, db, auth, or HTTP client (a clean case-10 external edge, not S12); a stub-config call made on the very library under test - `mockingoose`, `tinyspy`, `jsdom-testing-mocks` - where the mocking library IS the SUT, so the stub setup is production code (not S5\u002FS8\u002FC11a); a test whose shared state is\nreset by an autouse\u002F`beforeEach` teardown (not S13); a structural or contract assertion on a\nmodel output - valid JSON, required keys present, a cited source id matches, a refusal on a\nbanned prompt, a deterministic post-processing step - or a mocked\u002Fstubbed model whose return is\nfixture data (not S14); a sanctioned async-settling wait - Robot `Wait Until Keyword Succeeds`,\nTesting Library `waitFor`\u002F`findBy*`, Playwright\u002FCypress auto-wait, `await expect(...).toPass()` -\nthat polls a real settle condition and still fails hard on timeout (not S15); a call-only\nassertion where the interaction IS the contract - a fire-and-forget event, an audit-log or\ntelemetry write, a queue publish - or a `toHaveBeenCalledWith`\u002F`assert_called_once_with` that\npins the specific arguments, or any call-verification paired with an assertion on the SUT's return value or state - S16 requires the call-verification to be the SOLE oracle (not S16); a `pytest.raises(SpecificError, match=...)` bound to the SUT line (not S17); a stub fed a value the collaborator's contract can actually return (not S18); a test under `*.problem.*` \u002F `*.solution.*` \u002F `exercises\u002F` \u002F `katas\u002F` \u002F `playground\u002F` - a teaching or TDD-spec fixture whose expected value is intentional (the exercise IS the spec), not a frozen bug (not case 18, not S3); a deterministic rubric, structural validator, or frozen human-labeled judge set rather than a live model verdict (not S21).\n\u003C!-- fg:semantic-exemptions:end -->\n\n## Structural code index (TS\u002FJS, Robot, project layer)\n\nGenerated from `schema\u002Fcode-catalog.json`, so it cannot drift from\n`reference.md`. Severity `-` means the code carries no fixed severity.\n\n\u003C!-- fg:structural-codes-compact:start -->\n| Code | Severity | What to look for |\n|---|---|---|\n| **TypeScript \u002F JavaScript** | | 24 codes |\n| JS1 | HIGH | focused test (`it.only`\u002F`fit`) skips the rest of the suite |\n| JS2 | HIGH | `expect(x)` with no matcher |\n| JS3 | LOW | snapshot is the only assertion |\n| JS4 | LOW | skipped test (`it.skip`\u002F`xit`\u002F`it.todo`) |\n| JS5 | LOW | async query\u002Fevent not awaited (`findBy*`\u002F`waitFor`\u002Fuser-event) |\n| JS6 | HIGH | empty `describe`\u002F`suite` |\n| JS7 | LOW | assertion in a non-awaited `setTimeout`\u002F`then` callback |\n| JS8 | LOW | mocks the unit under test and asserts it directly |\n| JS9 | HIGH | assertion in a dead literal branch (`if(false)`) |\n| JS11 | LOW | `try\u002Fcatch` swallows the assertion |\n| JS13 | LOW | `queryBy*`\u002F`queryAllBy*` query (returns null when absent) as a loose statement, never asserted - `getBy*`\u002F`getAllBy*`\u002F`findBy*`\u002F`findAllBy*` throw on absence and ARE the assertion |\n| JS15 | LOW | comparison wrapped in a boolean (`expect(a===b).toBe(true)`) |\n| JS17 | LOW | commented-out test block (`\u002F\u002F it(...)`) |\n| JS18 | LOW | `done` callback instead of async\u002Fawait |\n| JS21 | HIGH | matcher referenced but never called (`expect(x).toBe` with no `()`) |\n| JS22 | HIGH | empty `it.each`\u002F`test.each` table |\n| JS23 | HIGH | `expect.assertions(N)` with fewer unconditional reachable `expect()` calls than `N` |\n| JS24 | LOW | Cypress `cy.get\u002Ffind\u002Fcontains` query statement with no `.should`\u002F`.and`\u002F`.then` assertion |\n| JS25 | HIGH | the only assertion sits inside an array-iterator callback (`forEach`\u002F`map`\u002F`filter`\u002F`some`\u002F`every`\u002F`flatMap`) - runs zero times on an empty collection |\n| JS26 | LOW | fake timers installed but never advanced (`runAllTimers`\u002F`advanceTimersByTime`\u002F`tick`) - the scheduled callback never fires, so the assertion reads un-mutated state |\n| JS27 | LOW | `toHaveBeenCalled*` is the sole oracle on a locally-created double - verifies wiring, not behaviour |\n| JS29 | LOW | `expect(...).resolves`\u002F`.rejects` chain is a bare statement, not awaited or returned - the test finishes green before the matcher settles |\n| JS30 | HIGH | literal-vs-literal assertion (`expect(2).toBe(3)`, chai `expect(x).to.equal(y)`) - both operands are fixed at parse time |\n| JS31 | LOW | `try\u002Fcatch` swallows a possible throw with no assertion on the exception - a unit that stops throwing still passes green |\n| **Robot Framework** | | 9 codes |\n| R1 | - | Forced green |\n| R2 | - | Hollow verifier keyword |\n| R3 | - | Test Cases in a .resource |\n| R4 | - | No Operation only |\n| R5 | - | Empty [Template] |\n| R6 | - | Should Be True on a string literal |\n| R7 | - | Hollow [Template] keyword |\n| R8 | - | Verification only in Setup |\n| R8b | - | Verification only in Teardown |\n| **Project layer** | | 6 codes |\n| PL1 | - | Asserts stripped at runtime |\n| PL2 | - | Warnings not promoted |\n| PL7 | - | No coverage gate |\n| PL8 | - | Run stops early |\n| PL9 | - | Skip-on-failure run option |\n| PL10 | - | passWithNoTests |\n\u003C!-- fg:structural-codes-compact:end -->\n\n## Protocol in one paragraph\n\nA test is useful only if it fails when the code breaks. Detect the language and\nframework, classify the test intent (spec, characterization, regression,\nbehavior), then apply the six judgments: J1 does the assertion run, J2 is the\nexpected value from an independent oracle, J3 is the real unit under test, J4\ndoes the assertion verify enough, J5 is the test coupled to implementation\ninternals, J6 does the test pass in isolation. For Python, also run the full\nstructural catalog (families A-E, the 56 emitted C-codes). Flag only the first failing\njudgment per test.\n\n## Non-negotiable rules\n\n- Never report case 18 (expected value contradicts the spec) without citing an\n  independent oracle, and always run the adversarial verify pass first.\n- Precision over recall: a wrong HIGH finding is worse than a missed LOW one.\n- Check the look-alike exemptions in `reference.md` before flagging.\n\n## Output\n\nUse the CASE \u002F SUMMARY format defined in the root `SKILL.md` Step 6:\n\n```\nCASE {number} ({J-code}) - {HIGH|LOW} - {language} - {intent}\nTest \u002F Finding \u002F Evidence \u002F Oracle (case 18 only) \u002F Fix hint\n```\n",{"name":5,"license":15,"description":7},"main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fvinicq\u002Ffalsegreen-skill\u002Fskills\u002Ffalsegreen-skill",483,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-13 02:16:32",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill falsegreen-skill",{"tool":66,"command":67},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill falsegreen-skill",{"tool":69,"command":70},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill falsegreen-skill","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvinicq\u002Ffalsegreen-skill\u002Fskills\u002Ffalsegreen-skill\u002FSKILL.md",true,[],[75,84,91,98,124,148],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":83},"01M746ZWACVKMZ1BJXJZHYJSSX","migrate-to-e2e","Moves an existing Playwright, Cypress, Selenium, Appium, Detox, Maestro, or TesterArmy suite to e2e one slice at a time, with the old suite running beside the new one until each ported test is proven. Keeps a MIGRATION.md progress file so any later session resumes where the last stopped. Optionally plants a defect to show both suites catch it. Use for \u002Fmigrate-to-e2e, \"migrate our tests to e2e\", \"port these Maestro flows\", \"move our TesterArmy tests\", or when a project has an e2e config and an older suite still running.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fmigrate-to-e2e\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":83},"01M746ZPTAX1Q0FBKAB1CYND7E","e2e","Writes, runs, and debugs end-to-end tests for web and mobile apps with e2e, the agentic test runner, which mixes agent.act goals with exact locator assertions on a Playwright browser or an iOS or Android device. Also drives a project's running app live over the e2e MCP server to look at a screen, check a UI change, take a screenshot or record a video, and try a locator; and runs bug bashes, parallel e2e explore runs with each bug proven by a repro test. Use when a project depends on e2e or has an e2e.config.ts, when asked for end-to-end, browser, mobile, or agentic UI tests, to check a change in the running app, to QA or bug bash an app or branch, or when an e2e run fails.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fe2e\u002FSKILL.md",[],[],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":83},"01M746ZJN784HVHMDP9MQGCSGG","create-verification-skill","Generate a project-local verify-\u003Capp> skill on top of e2e, so any coding agent can launch the app, check it is worth driving, exercise a feature the way a user does, keep evidence, and bug bash it. Writes the skill, a feature map with one explore charter per feature, and proves it once. Use for \u002Fcreate-verification-skill, \"make a verification skill for this repo\", or when a project has no scripted way to prove UI behavior.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fcreate-verification-skill\u002FSKILL.md",[],[],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":45},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[105,106,107,108,109,110,111,112,113,114,115,26,116,117,118,119,120,121,122,123],"search","deja search","never","error","ready","memory","re","decide","fix","design","debugging","you","done","reviewer","io","change","cli","merge","past",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":45},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[131,132,35,119,133,134,135,136,137,138,139,140,141,142,110,143,144,145,146,147],"deja reflect","reflect","with","record","github","next","https","node","Rules","decisions","brew","remember","project rules","project","session","end","reflection",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":161,"publishedAt":45},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[154,157,158],{"categoryNo":155,"categoryName":156,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":159,"categoryName":160,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[150,162,163,164,165,166,167,144,168,111,169,170,171,172,26,173,174,175,176,177],"URL","Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","image","mcp server","schedule","api","publish"]