Skip to content

Tier 1 convergence: docs, security, emitter fixes, and LLM resilience#2

Merged
moonrunnerkc merged 11 commits into
mainfrom
convergence/2026-05-22-tier1-resolution
May 23, 2026
Merged

Tier 1 convergence: docs, security, emitter fixes, and LLM resilience#2
moonrunnerkc merged 11 commits into
mainfrom
convergence/2026-05-22-tier1-resolution

Conversation

@moonrunnerkc
Copy link
Copy Markdown
Owner

Summary

  • Documentation refresh for v4.5.0 surface (README, API reference, SECURITY.md, LLM budgets).
  • Emitter fixes: legacy ESLint output stays valid JSON and drops implicit extends; bidirectional mapping table synced with active per-rule mapper.
  • LLM resilience: retry transient 429/503 responses from OpenAI; KNOWN_PATTERN_TYPES extracted into a shared module; types.ts split into core and results modules.
  • Security hardening: GitHub Actions pinned to commit SHAs; gitignore expanded for credential extensions and editor backups.

Commits

  • security(docs): document LLM call budgets per opt-in mode
  • refactor(types): split types.ts into core and results modules
  • feat(llm): retry transient 429 and 503 responses from OpenAI
  • refactor(llm): extract KNOWN_PATTERN_TYPES into a shared module
  • fix(mappings): sync bidirectional table with active per-rule mapper
  • fix(emitter): drop implicit extends from legacy ESLint output
  • fix(emitter): keep legacy ESLint output as valid JSON
  • security(ci): pin GitHub Actions to commit SHAs
  • chore(gitignore): add credential extensions, editor backups, and dedupe
  • docs: refresh SECURITY.md for v4.5.0 surface and audit status
  • docs: refresh README, api reference, and cover for v4.5.0 surface

Test plan

  • `npm test` passes
  • `npm run build` passes
  • Emitted legacy ESLint config validates as JSON
  • LLM retry path exercised against simulated 429/503
  • Bidirectional mapping table round-trips for active rules

Brad Kinnard added 11 commits May 22, 2026 21:55
The README and api reference still claimed APIs that were removed in
v4.5.0 and described type unions that no longer match src/types.ts.
The README's opening also led with prose instead of the artifact, and
the cover image referenced in the assets path was missing.

Specific changes:
- Add assets/cover.svg (was missing, referenced by README header)
- Rewrite README header to show cover + concrete 2-sentence description
- Drop the "What's New in v4.5.0" section (duplicates CHANGELOG.md)
- Trim 110 lines of inline CLI deep-dive (lives in docs/cli-reference.md)
- Add the tree-sitter engine row to How It Works (re-added in v4.5.0)
- docs/api-reference.md: remove the Agent Invocation section
  (buildAgentConfig, invokeAgent, isAgentSdkAvailable, hasAgentOutput,
  watchForCompletion, countCodeFiles were all removed in v4.5.0 and
  no longer exist in src/)
- docs/api-reference.md: correct RuleCategory from 15 stale members to
  the 8 in src/types.ts; correct VerifierType to 4 members
- docs/api-reference.md: replace the ruleprobe/semantic subpath import
  example with a note (package.json has no exports field)

Closes: docs-cover-missing, docs-stale-agent-invocation,
docs-rulecategory-mismatch, docs-verifiertype-mismatch,
docs-semantic-subpath
Co-found: docs-reviewer
Two stale claims in SECURITY.md:

The list of network opt-in flags still referenced ruleprobe run, a
command removed in v4.5.0. Trimmed it back to the three flags that
actually trigger network calls: --llm-extract, --rubric-decompose,
and --semantic.

The audit status block still claimed "as of v0.1.0, 5 moderate
advisories in esbuild." Current npm audit reports 7 moderate
advisories across the vitest chain (vite, esbuild, postcss,
brace-expansion). All dev-tooling; none reach the published package.
Updated text and removed the unsupported version pin.

Closes: docs-security-run-stale, docs-security-audit-stale
Co-found: docs-reviewer, security-reviewer
The .gitignore was missing a handful of defense-in-depth patterns
that are baseline for a Node project, and it had a duplicate entry
for .ruleprobe-semantic/. No sensitive files are currently tracked
as a result of the gaps, but the gaps create accident surface for
future contributors.

Added patterns: .env.* glob (with .env.example/.env.template
exceptions), credential extensions (*.pem, *.key, *.p12, *.pfx,
*.crt), editor backup patterns (*~, *.bak, *.orig, *.swp, *.swo),
npm and yarn debug logs, Windows noise (Thumbs.db, desktop.ini),
and the local pubprep output directory.

Removed the duplicate .ruleprobe-semantic/ line.

Closes: L-02-gitignore-gaps
Co-found: security-reviewer
Both the self-check workflow and the published composite action
referenced actions/checkout and actions/setup-node by mutable v4
tag. A tag redirect by a compromised maintainer account would run
in CI with contents:read and pull-requests:write, exposing the
workflow's GITHUB_TOKEN.

Pinned actions/checkout to 11bd71901bbe5b1630ceea73d27597364c9af683
(v4.2.2) and actions/setup-node to 49933ea5288caeca8642d1e84afbd3f7d6820020
(v4.4.0). Version tags retained as adjacent comments for human
review and Dependabot tag-comment updates.

Closes: M-01-a03-ci-sha-pinning
Co-found: security-reviewer
emitLegacyConfig appended a // Unmappable rules comment block after
the JSON body whenever any rule from the instruction file did not
map to an ESLint rule. The full output was not valid JSON, breaking
the JSDoc contract on emitEslintConfig that promises "valid JSON
suitable for .eslintrc.json files." The existing test acknowledged
this by stripping the comment block before calling JSON.parse, which
just tested around the invariant violation.

emitLegacyConfig now returns strict JSON only. Unmappable rules are
surfaced through a new exported helper formatUnmappableSummary(),
which lint-config writes to stderr after the JSON has been emitted.
The flat config path is unchanged because flat config is JavaScript
and the comments are syntactically valid there.

The existing test is rewritten to assert two contracts: the legacy
output parses cleanly and contains no // markers, and the summary
helper surfaces unmappable entries by id, reason, and source text.

Closes: a3f1c8d2
Co-found: tech-debt-reviewer
emitLegacyConfig unconditionally added eslint:recommended plus
plugin:<name>/recommended to the extends field whenever any plugin
was referenced. The flat emitter does not do this. The same
EslintConfig produced a minimal targeted output in flat format and
a full recommended-set output (often hundreds of extra rules) in
legacy format, breaking symmetry and surprising users who asked
for a targeted config.

The legacy emitter now omits extends entirely. Users who want the
recommended sets can add `extends` in their own root config; the
generated file no longer makes that choice for them.

Updated the corresponding test to assert extends is absent.

Closes: e5a3c197
Co-found: tech-debt-reviewer
The bidirectional mapping table in src/mappings/index.ts had two
entries that did not match the canonical names used by the per-rule
mappers in src/mapper/mappings/. The extractor reads this table to
reverse-map ESLint rule names back to instruction prose, so the
mismatch meant `ruleprobe extract` silently failed to recognize the
rules the mapper now correctly emits.

- no-enum: was mapped to @typescript-eslint/no-enum (a rule that
  does not exist in typescript-eslint). Now no-restricted-syntax,
  matching src/mapper/mappings/type-safety.ts which uses
  no-restricted-syntax with a TSEnumDeclaration selector.
- no-unused-exports: was mapped to no-unused-vars (different
  semantics, scoped to local variable usage). Now
  import/no-unused-modules, matching the canonical mapper.

Closes: b7e2a941
Co-found: tech-debt-reviewer
KNOWN_PATTERN_TYPES was defined twice as a module-level const in
src/llm/pipeline.ts and src/llm/rubric-pipeline.ts, each with a
"keep in sync" comment and no test to enforce equality. The two
lists had already diverged: the rubric version included type-aware
and tree-sitter entries that the extraction version did not, so an
unparseable line involving those checks would degrade the
extraction prompt without warning.

Moved the canonical list to src/llm/known-patterns.ts and grouped
the entries by verifier (AST, regex, filesystem, type-aware,
tree-sitter) so the next addition lands in one place. Both
pipelines now import the same constant.

Closes: c9d4b073
Co-found: tech-debt-reviewer
The OpenAI provider made a single fetch and surfaced any non-ok
response as an error. A transient rate-limit (429) or upstream
outage (503) silently dropped the batch of unparseable lines for
that call, even though the failure mode was retriable. Static
extraction always covers the same lines on the next run, so the
failure went unnoticed.

The provider now retries 429 and 503 responses up to maxAttempts
(default 3), with exponential backoff starting at 1000ms or the
Retry-After header value when present. Non-transient statuses
(400, 401, 500, etc.) still surface immediately because retrying
will not fix a misconfigured request.

The provider config grew three injectable knobs (maxAttempts,
retryBaseDelayMs, sleep, fetchImpl) so the retry path is testable
without a network. New tests cover 429/503 retry, non-retryable
errors, exhaustion, and Retry-After honoring.

Closes: a8c5d620
Co-found: tech-debt-reviewer
src/types.ts sat at 293 lines, 7 short of the self-check 300-line
limit. The next substantive type addition would have tripped the
self-check workflow on the PR that introduced it; src/types.ts is
imported by nearly every feature module, so any new type ends up
here.

Split into two files:
- src/types-core.ts: instruction-file and rule primitives (Rule,
  RuleSet, VerificationPattern, RuleCategory, VerifierType,
  QualifierType, InstructionFileType, MarkdownSection, RuleMatcher,
  INSTRUCTION_FILE_NAMES)
- src/types-results.ts: verification and report types (Evidence,
  RuleResult, ReportSummary, AdherenceReport, AgentRun,
  TaskTemplate, ReportFormat, CrossFileConflict,
  CrossFileRedundancy, FileAnalysis, ProjectAnalysis,
  DEFAULT_COMPLIANCE_THRESHOLD)

src/types.ts is now a 39-line barrel that re-exports both. Every
existing `from '../types.js'` import keeps working with no call-site
changes.

Closes: d2e6f318
Co-found: tech-debt-reviewer
The security review flagged LLM10:2025 unbounded consumption for the
opt-in LLM paths. Each path already has an effective per-invocation
budget in code, but the budget model was not documented and the
review treated it as absent.

- --llm-extract: one OpenAI call per invocation (batch of 50 lines),
  3 retry attempts on 429/503 only.
- --rubric-decompose: one OpenAI call per invocation (batch of 20).
- --semantic: bounded by --max-llm-calls (default 20), already
  enforced by the semantic engine and tested.

Added a SECURITY.md section spelling this out so operators know
their worst-case cost ceiling without reading the source.

Closes: L-03-llm10-unbounded-calls
Co-found: security-reviewer
@moonrunnerkc moonrunnerkc merged commit 3e07171 into main May 23, 2026
1 check passed
@github-actions
Copy link
Copy Markdown

RuleProbe: Instruction Adherence Report

Click to expand full report (247 lines)
RuleProbe Adherence Report
Agent: ci | Model: unknown | Task: manual
Date: 2026-05-23T04:13:45.171Z

Rules: 22 total | 15 passed | 7 failed | Score: 68%

PASS  forbidden-pattern/forbidden-no-any-type-1
PASS  structure/structure-named-exports-only-2
PASS  naming/naming-kebab-case-files-3
PASS  naming/naming-camelcase-variables-4
PASS  naming/naming-camelcase-general-5
PASS  naming/naming-pascalcase-types-6
PASS  structure/structure-jsdoc-required-7
PASS  structure/structure-max-file-length-8
PASS  forbidden-pattern/forbidden-no-console-log-9
PASS  forbidden-pattern/forbidden-no-console-extended-10
PASS  import-pattern/import-no-path-aliases-11
PASS  import-pattern/import-no-deep-relative-12
FAIL  code-style/rubric-clean-code-max-function-length-12732410
      action/main.ts:63 - found: function createDeps: 85 lines
      action/runner.ts:51 - found: function runDrift: 82 lines
      analyzers/project-analyzer.ts:71 - found: function detectConflicts: 61 lines
      ast-checks/type-aware.ts:35 - found: function checkImplicitAny: 52 lines
      commands/analyze-formatters.ts:198 - found: function formatDetailed: 70 lines
      commands/analyze.ts:59 - found: function handleAnalyze: 98 lines
      commands/verify.ts:56 - found: function handleVerify: 122 lines
      dataset/summary.ts:140 - found: function generateSummary: 87 lines
      drift/compare-configs.ts:30 - found: function compareConfigs: 93 lines
      emitter/eslint.ts:101 - found: function emitFlatConfig: 52 lines
      extractor/index.ts:56 - found: function extractRules: 83 lines
      extractor/index.ts:182 - found: function extractNamingEntries: 54 lines
      index.ts:98 - found: function generateReport: 56 lines
      llm/openai-provider.ts:75 - found: function createOpenAiProvider: 96 lines
      llm/openai-rubric-decomposer.ts:59 - found: method decompose: 53 lines
      mapper/index.ts:66 - found: function mapRule: 98 lines
      mappings/prose-template-helpers.ts:82 - found: function formatNamingConventionProse: 52 lines
      parsers/classify-statement.ts:104 - found: function classifyStatement: 150 lines
      parsers/rule-assembler.ts:55 - found: function assembleRules: 57 lines
      parsers/statement-classifier.ts:26 - found: function classifyAllStatements: 52 lines
      parsers/structural-parser.ts:39 - found: function parseStructuredMarkdown: 217 lines
      reporter/detailed.ts:46 - found: function formatDetailed: 52 lines
      reporter/markdown.ts:42 - found: function formatMarkdown: 62 lines
      reporter/text.ts:42 - found: function formatText: 69 lines
      reporter/text.ts:120 - found: function formatTextPlain: 58 lines
      semantic/engine/fingerprint/fingerprint-generator.ts:120 - found: function buildFeatureVector: 65 lines
      semantic/engine/llm-escalation.ts:35 - found: function resolveLlmEscalation: 73 lines
      semantic/engine/llm-escalation.ts:115 - found: function resolveQualifiedRule: 69 lines
      semantic/engine/llm-escalation.ts:186 - found: function resolveQualifierLlm: 61 lines
      semantic/engine/qualifiers/qualifier-resolver.ts:105 - found: function resolveQualifier: 58 lines
      semantic/engine/rule-resolver.ts:64 - found: function resolveRule: 81 lines
      semantic/engine/rule-resolver.ts:158 - found: function buildTargetVector: 61 lines
      semantic/local-extractor.ts:118 - found: function extractFileVector: 56 lines
      utils/safe-path.ts:71 - found: function walkDirectorySafe: 52 lines
      verifier/ast-check-dispatch.ts:65 - found: function runAstCheck: 77 lines
      verifier/ast-verifier-batch.ts:32 - found: function verifyAstRulesBatch: 69 lines
      verifier/ast-verifier.ts:42 - found: function verifyAstRule: 67 lines
      verifier/config-file-checks.ts:186 - found: function checkEnvTool: 67 lines
      verifier/config-file-verifier.ts:61 - found: function checkGitHook: 68 lines
      verifier/config-file-verifier.ts:134 - found: function checkPreCommitHook: 69 lines
      verifier/file-structure-checks.ts:158 - found: function checkTestColocation: 62 lines
      verifier/file-verifier.ts:82 - found: function verifyFileSystemRule: 102 lines
      verifier/git-history-checks.ts:39 - found: function checkCommitMessagePattern: 64 lines
      verifier/git-history-checks.ts:184 - found: function checkBranchNaming: 59 lines
      verifier/index.ts:48 - found: function verifyOutput: 53 lines
      verifier/path-exclusions.ts:84 - found: function countPathExclusions: 56 lines
      verifier/preference-verifier.ts:75 - found: function verifyPreferenceRule: 109 lines
      verifier/regex-checks.ts:227 - found: function checkConsistentSemicolons: 54 lines
      verifier/regex-verifier.ts:51 - found: function verifyRegexRule: 88 lines
      verifier/tooling-verifier.ts:115 - found: function checkTestFramework: 57 lines
      verifier/tooling-verifier.ts:176 - found: function checkToolPresent: 57 lines
FAIL  code-style/rubric-clean-code-no-magic-numbers-12732410
      action/main.ts:152 - found: 1024
      action/main.ts:152 - found: 1024
      ast-checks/concise-conditionals.ts:99 - found: 80
      ast-checks/max-function-length.ts:23 - found: 50
      ast-checks/max-params.ts:20 - found: 4
      ast-checks/nested-ternary.ts:32 - found: 80
      ast-checks/set-timeout-in-tests.ts:36 - found: 60
      dataset/github-client.ts:95 - found: 403
      dataset/github-client.ts:95 - found: 429
      dataset/github-client.ts:99 - found: 1000
      dataset/github-client.ts:110 - found: 422
      dataset/github-client.ts:115 - found: 404
      dataset/github-client.ts:121 - found: 200
      dataset/summary.ts:97 - found: 5
      dataset/summary.ts:99 - found: 20
      dataset/summary.ts:100 - found: 50
      dataset/summary.ts:109 - found: 5
      dataset/summary.ts:124 - found: 3
      dataset/summary.ts:136 - found: 120
      llm/openai-provider.ts:51 - found: 1000
      llm/openai-provider.ts:150 - found: 200
      llm/openai-rubric-decomposer.ts:48 - found: 30000
      llm/openai-rubric-decomposer.ts:94 - found: 200
      llm/rubric-decompose.ts:151 - found: 5
      llm/rubric-decompose.ts:222 - found: 0.01
      mapper/mappings/function-limits.ts:15 - found: 50
      mapper/mappings/function-limits.ts:27 - found: 4
      mapper/mappings/max-lines.ts:15 - found: 300
      mapper/mappings/max-lines.ts:27 - found: 120
      parsers/classify-statement.ts:88 - found: 3
      parsers/classify-statement.ts:246 - found: 3
      parsers/classify-statement.ts:249 - found: 0.60
      parsers/rubric-deterministic.ts:147 - found: 16
      parsers/rule-assembler-helpers.ts:50 - found: 3
      parsers/structural-parser.ts:62 - found: 3
      parsers/structural-parser.ts:88 - found: 3
      parsers/structural-parser.ts:166 - found: 3
      parsers/structural-parser.ts:191 - found: 3
      reporter/summary.ts:35 - found: 50
      reporter/summary.ts:41 - found: 50
      reporter/summary.ts:56 - found: 50
      semantic/anthropic-caller.ts:90 - found: 200
      semantic/engine/fingerprint/example-harvester.ts:95 - found: 0.6
      semantic/engine/fingerprint/example-harvester.ts:95 - found: 0.4
      semantic/engine/llm/prompt-builder.ts:140 - found: 12
      semantic/index.ts:87 - found: 0.7
      semantic/index.ts:87 - found: 0.4
      verifier/file-verifier.ts:159 - found: 0.8
      verifier/file-verifier.ts:168 - found: 0.8
      verifier/git-history-checks.ts:98 - found: 0.8
      verifier/git-history-checks.ts:136 - found: 0.8
      verifier/git-history-checks.ts:165 - found: 80
      verifier/git-history-checks.ts:175 - found: 0.8
      verifier/git-history-checks.ts:195 - found: 5000
      verifier/git-history-checks.ts:257 - found: 10000
      verifier/git-history-checks.ts:279 - found: 0.8
      verifier/git-history-checks.ts:291 - found: 0.8
      verifier/preference-verifier.ts:78 - found: 0.8
      verifier/regex-checks.ts:29 - found: 120
      verifier/regex-checks.ts:29 - found: 120
      verifier/tooling-verifier.ts:109 - found: 0.8
      verifier/treesitter-checks.ts:37 - found: 3
      verifier/treesitter-checks.ts:64 - found: 3
      verifier/treesitter-checks.ts:95 - found: 3
      verifier/treesitter-checks.ts:105 - found: 3
      verifier/treesitter-checks.ts:140 - found: 3
FAIL  code-style/rubric-clean-code-no-nested-ternary-12732410
      commands/drift.ts:37 - found: opts.format === 'markdown' ? 'markdown' : 'text'
      dataset/github-client.ts:228 - found: type === 'repo' ? REPO_FETCH_DELAY_MS
    : FILE_FETCH_DELAY_MS
      extractor/index.ts:164 - found: skip.reason === 'no-mapping'
          ? 'no RuleProbe equivalent'
          : '
      reporter/text.ts:57 - found: summary.adherenceScore >= 50
      ? chalk.yellow
      : chalk.red
      semantic/engine/fingerprint/hash-utils.ts:51 - found: count <= 20 ? 'mid' : 'high'
      semantic/index.ts:87 - found: rule.confidence === 'medium' ? 0.7 : 0.4
      verifier/tooling-verifier.ts:108 - found: competitors.length > 0 ? 0.5 : 1
PASS  code-style/rubric-clean-code-no-else-after-return-12732410
PASS  code-style/rubric-clean-code-jsdoc-required-12732410
FAIL  code-style/rubric-clean-code-max-params-12732410
      semantic/ast-visitor.ts:44 - found: function visitNode has 5 parameters
      semantic/engine/comparison/compliance-scorer.ts:26 - found: function assembleReport has 5 parameters
      semantic/engine/comparison/vector-similarity.ts:141 - found: function combinedSimilarity has 5 parameters
      semantic/engine/llm-escalation.ts:35 - found: function resolveLlmEscalation has 11 parameters
      semantic/engine/llm-escalation.ts:115 - found: function resolveQualifiedRule has 8 parameters
      semantic/engine/llm-escalation.ts:186 - found: function resolveQualifierLlm has 8 parameters
      semantic/engine/qualifiers/qualifier-resolver.ts:201 - found: function buildQualifierVerdict has 8 parameters
      semantic/engine/rule-resolver.ts:64 - found: function resolveRule has 8 parameters
      verifier/index.ts:111 - found: function verifyNonAstRule has 8 parameters
FAIL  code-style/rubric-keep-it-simple-max-function-length-2778b120
      action/main.ts:63 - found: function createDeps: 85 lines
      action/runner.ts:51 - found: function runDrift: 82 lines
      analyzers/project-analyzer.ts:71 - found: function detectConflicts: 61 lines
      ast-checks/type-aware.ts:35 - found: function checkImplicitAny: 52 lines
      commands/analyze-formatters.ts:198 - found: function formatDetailed: 70 lines
      commands/analyze.ts:59 - found: function handleAnalyze: 98 lines
      commands/verify.ts:56 - found: function handleVerify: 122 lines
      dataset/summary.ts:140 - found: function generateSummary: 87 lines
      drift/compare-configs.ts:30 - found: function compareConfigs: 93 lines
      emitter/eslint.ts:101 - found: function emitFlatConfig: 52 lines
      extractor/index.ts:56 - found: function extractRules: 83 lines
      extractor/index.ts:182 - found: function extractNamingEntries: 54 lines
      index.ts:98 - found: function generateReport: 56 lines
      llm/openai-provider.ts:75 - found: function createOpenAiProvider: 96 lines
      llm/openai-rubric-decomposer.ts:59 - found: method decompose: 53 lines
      mapper/index.ts:66 - found: function mapRule: 98 lines
      mappings/prose-template-helpers.ts:82 - found: function formatNamingConventionProse: 52 lines
      parsers/classify-statement.ts:104 - found: function classifyStatement: 150 lines
      parsers/rule-assembler.ts:55 - found: function assembleRules: 57 lines
      parsers/statement-classifier.ts:26 - found: function classifyAllStatements: 52 lines
      parsers/structural-parser.ts:39 - found: function parseStructuredMarkdown: 217 lines
      reporter/detailed.ts:46 - found: function formatDetailed: 52 lines
      reporter/markdown.ts:42 - found: function formatMarkdown: 62 lines
      reporter/text.ts:42 - found: function formatText: 69 lines
      reporter/text.ts:120 - found: function formatTextPlain: 58 lines
      semantic/engine/fingerprint/fingerprint-generator.ts:120 - found: function buildFeatureVector: 65 lines
      semantic/engine/llm-escalation.ts:35 - found: function resolveLlmEscalation: 73 lines
      semantic/engine/llm-escalation.ts:115 - found: function resolveQualifiedRule: 69 lines
      semantic/engine/llm-escalation.ts:186 - found: function resolveQualifierLlm: 61 lines
      semantic/engine/qualifiers/qualifier-resolver.ts:105 - found: function resolveQualifier: 58 lines
      semantic/engine/rule-resolver.ts:64 - found: function resolveRule: 81 lines
      semantic/engine/rule-resolver.ts:158 - found: function buildTargetVector: 61 lines
      semantic/local-extractor.ts:118 - found: function extractFileVector: 56 lines
      utils/safe-path.ts:71 - found: function walkDirectorySafe: 52 lines
      verifier/ast-check-dispatch.ts:65 - found: function runAstCheck: 77 lines
      verifier/ast-verifier-batch.ts:32 - found: function verifyAstRulesBatch: 69 lines
      verifier/ast-verifier.ts:42 - found: function verifyAstRule: 67 lines
      verifier/config-file-checks.ts:186 - found: function checkEnvTool: 67 lines
      verifier/config-file-verifier.ts:61 - found: function checkGitHook: 68 lines
      verifier/config-file-verifier.ts:134 - found: function checkPreCommitHook: 69 lines
      verifier/file-structure-checks.ts:158 - found: function checkTestColocation: 62 lines
      verifier/file-verifier.ts:82 - found: function verifyFileSystemRule: 102 lines
      verifier/git-history-checks.ts:39 - found: function checkCommitMessagePattern: 64 lines
      verifier/git-history-checks.ts:184 - found: function checkBranchNaming: 59 lines
      verifier/index.ts:48 - found: function verifyOutput: 53 lines
      verifier/path-exclusions.ts:84 - found: function countPathExclusions: 56 lines
      verifier/preference-verifier.ts:75 - found: function verifyPreferenceRule: 109 lines
      verifier/regex-checks.ts:227 - found: function checkConsistentSemicolons: 54 lines
      verifier/regex-verifier.ts:51 - found: function verifyRegexRule: 88 lines
      verifier/tooling-verifier.ts:115 - found: function checkTestFramework: 57 lines
      verifier/tooling-verifier.ts:176 - found: function checkToolPresent: 57 lines
FAIL  code-style/rubric-keep-it-simple-no-nested-ternary-2778b120
      commands/drift.ts:37 - found: opts.format === 'markdown' ? 'markdown' : 'text'
      dataset/github-client.ts:228 - found: type === 'repo' ? REPO_FETCH_DELAY_MS
    : FILE_FETCH_DELAY_MS
      extractor/index.ts:164 - found: skip.reason === 'no-mapping'
          ? 'no RuleProbe equivalent'
          : '
      reporter/text.ts:57 - found: summary.adherenceScore >= 50
      ? chalk.yellow
      : chalk.red
      semantic/engine/fingerprint/hash-utils.ts:51 - found: count <= 20 ? 'mid' : 'high'
      semantic/index.ts:87 - found: rule.confidence === 'medium' ? 0.7 : 0.4
      verifier/tooling-verifier.ts:108 - found: competitors.length > 0 ? 0.5 : 1
FAIL  code-style/rubric-keep-it-simple-max-params-2778b120
      semantic/ast-visitor.ts:44 - found: function visitNode has 5 parameters
      semantic/engine/comparison/compliance-scorer.ts:26 - found: function assembleReport has 5 parameters
      semantic/engine/comparison/vector-similarity.ts:141 - found: function combinedSimilarity has 5 parameters
      semantic/engine/llm-escalation.ts:35 - found: function resolveLlmEscalation has 11 parameters
      semantic/engine/llm-escalation.ts:115 - found: function resolveQualifiedRule has 8 parameters
      semantic/engine/llm-escalation.ts:186 - found: function resolveQualifierLlm has 8 parameters
      semantic/engine/qualifiers/qualifier-resolver.ts:201 - found: function buildQualifierVerdict has 8 parameters
      semantic/engine/rule-resolver.ts:64 - found: function resolveRule has 8 parameters
      verifier/index.ts:111 - found: function verifyNonAstRule has 8 parameters
PASS  code-style/rubric-keep-it-simple-no-else-after-return-2778b120

By Category:
  naming:             4/4 (100%)
  forbidden-pattern:  3/3 (100%)
  structure:          3/3 (100%)
  import-pattern:     2/2 (100%)
  code-style:         3/10 (30%)

Summary: 22 checked | 15 passed | 7 failed | 0 skipped

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant