{
  "definitions": [
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 17,
      "name": "CONCERNS_FILE",
      "signature": "const CONCERNS_FILE = \"concerns.generated.json\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 18,
      "name": "TOOLS_FILE",
      "signature": "const TOOLS_FILE = \"tools.generated.json\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 19,
      "name": "GENERATED_JSON",
      "signature": "const GENERATED_JSON = \".generated.json\";"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 20,
      "name": "UNKNOWN",
      "signature": "const UNKNOWN = \"unknown\";"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 22,
      "name": "concernRecordOf",
      "signature": "const concernRecordOf = function concernRecordOf([name, control]: [string, ConcernControl]): QualityConcernRecord {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 38,
      "name": "ruleRecordOf",
      "signature": "const ruleRecordOf = function ruleRecordOf(rule: CatalogRule, knobs: readonly RuleKnob[]): Record<string, unknown> {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 40,
      "name": "{ concern, ecosystem }",
      "signature": "const { concern, ecosystem } = rule;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 41,
      "name": "canonical",
      "signature": "const canonical = stringArrayField(rule, \"canonical\");"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 56,
      "name": "toolRecordsOf",
      "signature": "const toolRecordsOf = function toolRecordsOf("
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 60,
      "name": "tallies",
      "signature": "const tallies = new Map<string, { ecosystem?: string; knobCount: number; ruleCount: number }>();"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 62,
      "name": "tool",
      "signature": "const tool = stringField(rule, \"tool\");"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 63,
      "name": "{ ecosystem }",
      "signature": "const { ecosystem } = rule;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 64,
      "name": "tally",
      "signature": "const tally = tallies.get(tool) ?? {"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 84,
      "name": "clearEcosystemRules",
      "signature": "const clearEcosystemRules = function clearEcosystemRules(dir: string): void {"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 95,
      "name": "catalog",
      "signature": "const catalog = state.catalog ?? [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 96,
      "name": "ruleKnobs",
      "signature": "const ruleKnobs = state.ruleKnobs ?? {};"
    },
    {
      "callable": true,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 97,
      "name": "knobsOf",
      "signature": "const knobsOf = (rule: CatalogRule): RuleKnob[] =>"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 99,
      "name": "controls",
      "signature": "const controls = concernControls(catalog, knobLookup(catalog, ruleKnobs, loadKnobConcepts()));"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 100,
      "name": "byEcosystem",
      "signature": "const byEcosystem = new Map<string, Record<string, unknown>[]>();"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 102,
      "name": "ecosystem",
      "signature": "const ecosystem = typeof rule[\"ecosystem\"] === \"string\" ? rule[\"ecosystem\"] : UNKNOWN;"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 103,
      "name": "group",
      "signature": "const group = byEcosystem.get(ecosystem) ?? [];"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 107,
      "name": "dir",
      "signature": "const dir = absolutePath(\"govlab.quality.ecosystemRules\");"
    },
    {
      "callable": false,
      "callees": [],
      "callers": [],
      "exported": false,
      "flow": "isolated",
      "kind": "lexical_declaration",
      "line": 119,
      "name": "file",
      "signature": "const file = path.join(dir, `${slugify(ecosystem) || UNKNOWN}${GENERATED_JSON}`);"
    }
  ],
  "document": null,
  "findings": [],
  "generated": false,
  "href": "https://banes-lab.com/anatomy/quality#file-quality-core-steps-quality-step-ts",
  "language": "typescript",
  "layer": "application",
  "name": "quality.step.ts",
  "path": "core/steps/quality.step.ts",
  "ref": "anatomy:file-quality-core-steps-quality-step-ts",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/quality#folder-quality-core-steps",
          "json": "https://banes-lab.com/json/anatomy/quality/folder-quality-core-steps",
          "label": "core/steps",
          "markdown": "https://banes-lab.com/anatomy/quality/folder-quality-core-steps.md",
          "ref": "chapter:/anatomy/quality#folder-quality-core-steps"
        }
      ],
      "relation": "contained-in"
    }
  ],
  "slots": {
    "concern": "step",
    "subject": "quality",
    "variant": null
  },
  "stats": {
    "bytes": 5104,
    "callable": 5,
    "definitions": 23,
    "edges": 0,
    "exported": 0,
    "files": 1,
    "findings": {},
    "flows": {
      "isolated": 23
    },
    "lines": {
      "blank": 6,
      "code": 119,
      "total": 125
    }
  },
  "summary": "119 lines of code and 23 definitions.",
  "text": "https://banes-lab.com/source/quality/core/steps/quality.step.ts.txt",
  "tree": "quality",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/anatomy/quality#file-quality-core-steps-reference-step-ts",
      "json": "https://banes-lab.com/json/source/quality/core/steps/reference.step.ts",
      "label": "core/steps/reference.step.ts",
      "markdown": "https://banes-lab.com/source/quality/core/steps/reference.step.ts.md",
      "ref": "anatomy:file-quality-core-steps-reference-step-ts"
    },
    "previous": {
      "href": "https://banes-lab.com/anatomy/quality#file-quality-core-steps-knob-step-ts",
      "json": "https://banes-lab.com/json/source/quality/core/steps/knob.step.ts",
      "label": "core/steps/knob.step.ts",
      "markdown": "https://banes-lab.com/source/quality/core/steps/knob.step.ts.md",
      "ref": "anatomy:file-quality-core-steps-knob-step-ts"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/source/quality/core/steps",
    "label": "core/steps",
    "markdown": "https://banes-lab.com/api/source/quality/core/steps.md",
    "ref": "api:source/quality/core/steps"
  }
}
