{
  "repoRoot": "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01",
  "configDir": "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/.slopgate",
  "roots": [
    "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/src"
  ],
  "rootsRel": [
    "src"
  ],
  "exts": [
    ".ts",
    ".tsx",
    ".astro"
  ],
  "skipDirs": [
    "node_modules",
    "dist",
    "tests",
    ".worktrees"
  ],
  "patterns": [
    {
      "id": "no-stubs-placeholder",
      "title": "Stub / placeholder / not-implemented marker",
      "category": "convention",
      "severity": "critical",
      "pattern": "(?:for now|in a real app|placeholder\\s+(?:for now|implementation|impl|until)\\b|TODO: ?implement|not implemented)",
      "flags": "i",
      "description": "Stub or deferred-work marker — global rule forbids stubs/placeholders/workarounds.",
      "resolution": "Implement the real behavior now; remove the placeholder.",
      "canary": "// placeholder for now",
      "negativeCanary": [
        "placeholder={t('x')}",
        "placeholder:text-ink",
        "admin.incidents.titlePlaceholder",
        "const namePlaceholder = 1"
      ]
    },
    {
      "id": "ts-suppress-added",
      "title": "TypeScript suppression directive",
      "category": "convention",
      "severity": "high",
      "pattern": "(?:\\/\\/\\s*|\\/\\*\\s*)?@ts-(?:ignore|expect-error|nocheck)\\b",
      "description": "Suppressing the type checker instead of fixing the cause.",
      "resolution": "Fix the underlying type error; remove the suppression.",
      "canary": "// @ts-expect-error",
      "negativeCanary": [
        "/* eslint-disable zync/no-raw-html-in-pages */"
      ]
    },
    {
      "id": "as-any-cast",
      "title": "`as any` cast",
      "category": "convention",
      "severity": "high",
      "pattern": "as any\\b",
      "description": "Escape-hatch cast that disables type safety.",
      "resolution": "Use a precise type or a discriminated narrowing.",
      "canary": "const x = foo as any;"
    },
    {
      "id": "explicit-any-annotation",
      "title": "`: any` type annotation",
      "category": "convention",
      "severity": "high",
      "pattern": "^\\s*(?!\\/\\/|\\/\\*|\\*|\\*\\/)(?:(?!\\/\\/|\\/\\*).)*:\\s*any\\b",
      "description": "Explicit `any` annotation disables type checking at the boundary.",
      "resolution": "Use a precise type, unknown plus narrowing, or a generic constraint.",
      "canary": "const value: any = payload;",
      "negativeCanary": [
        "// const value: any = payload;",
        "/* const value: any = payload; */",
        "* @param value: any",
        "const value: unknown = payload;",
        "const x = foo as any;"
      ]
    },
    {
      "id": "array-any-generic",
      "title": "`Array<any>` generic",
      "category": "convention",
      "severity": "high",
      "pattern": "^\\s*(?!\\/\\/|\\/\\*|\\*|\\*\\/)(?:(?!\\/\\/|\\/\\*).)*(?:[:=,<({\\[]\\s*)Array\\s*<\\s*any\\s*>",
      "description": "`Array<any>` propagates unchecked values through collections.",
      "resolution": "Use a precise element type or Array<unknown> with narrowing at reads.",
      "canary": "const values: Array<any> = [];",
      "negativeCanary": [
        "// type Values = Array<any>;",
        "/* type Values = Array<any>; */",
        "* @type {Array<any>}",
        "const values: Array<unknown> = [];",
        "const label = \"Array<any>\";"
      ]
    },
    {
      "id": "promise-any-generic",
      "title": "`Promise<any>` generic",
      "category": "convention",
      "severity": "high",
      "pattern": "^\\s*(?!\\/\\/|\\/\\*|\\*|\\*\\/)(?:(?!\\/\\/|\\/\\*).)*(?:[:=,<({\\[]\\s*)Promise\\s*<\\s*any\\s*>",
      "description": "`Promise<any>` hides the async value contract from callers.",
      "resolution": "Return a precise promise type or Promise<unknown> with explicit narrowing.",
      "canary": "async function load(): Promise<any> { return fetchJson(); }",
      "negativeCanary": [
        "// async function load(): Promise<any>;",
        "/* type Load = Promise<any>; */",
        "* @returns {Promise<any>}",
        "async function load(): Promise<unknown> { return fetchJson(); }",
        "const label = \"Promise<any>\";"
      ]
    },
    {
      "id": "record-string-any-generic",
      "title": "`Record<string, any>` generic",
      "category": "convention",
      "severity": "high",
      "pattern": "^\\s*(?!\\/\\/|\\/\\*|\\*|\\*\\/)(?:(?!\\/\\/|\\/\\*).)*(?:[:=,<({\\[]\\s*)Record\\s*<\\s*string\\s*,\\s*any\\s*>",
      "description": "`Record<string, any>` erases the value contract for dictionary-shaped data.",
      "resolution": "Use a precise value type, Record<string, unknown>, or a validated schema type.",
      "canary": "type Payload = Record<string, any>;",
      "negativeCanary": [
        "// type Payload = Record<string, any>;",
        "/* type Payload = Record<string, any>; */",
        "* @type {Record<string, any>}",
        "type Payload = Record<string, unknown>;",
        "const label = \"Record<string, any>\";"
      ]
    }
  ],
  "astRuleDirs": [
    "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/rules/baseline/ast",
    "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/.slopgate/rules/ast"
  ],
  "checkers": {
    "diff-shape": {
      "maxDirs": 5
    }
  },
  "astDisable": [],
  "baselinePath": "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/.slopgate/baseline.json",
  "gate": {
    "file": [
      "critical",
      "high"
    ],
    "staged": [
      "critical",
      "high"
    ]
  },
  "suppressionsPath": "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/.slopgate/suppressions.json",
  "fixturesDirs": [
    "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/rules/baseline/fixtures",
    "/home/user/Projects/slopgate/.worktrees/feat/rust-rewrite-phase01/.slopgate/fixtures"
  ],
  "checkerConcurrency": 3,
  "uxAstSeverity": {},
  "uxAstAll": [
    "ux-div-onclick",
    "ux-anchor-no-href",
    "ux-img-no-alt",
    "ux-button-no-type",
    "ux-img-no-dimensions",
    "ux-media-no-dimensions",
    "ux-async-onclick-no-disable",
    "ux-modal-no-close"
  ]
}
