mirror of
https://github.com/yogeshojha/rengine.git
synced 2026-10-20 15:21:30 +02:00
The comment rule in CLAUDE.md is one line maximum, never narration: no multi-line blocks, no module-header explainers, no sentences that explain or justify the code to the reader. The tree had drifted a long way from it, and most of the drift is mine. Removed: 232 lines of multi-line comment blocks 203 single-line comments that argued instead of stating 154 comments joined by so/because/otherwise/rather-than 143 narrating comments in the frontend 112 test docstrings (the test name already says what it asserts) 25 test module docstrings and 25 decorative section dividers Collapsed: 324 multi-line docstrings to one factual line 271 one-line docstrings that had a justifying clause bolted on Kept: functional directives, section dividers, short field labels, alembic revision headers, and the eight FastAPI route docstrings that render in /docs. Where a fact was load-bearing it is in CLAUDE.md, which is where it belongs. 284 python tests and 34 frontend tests pass, ruff and ruff-format clean across ten packages, svelte-check 0 errors, prettier and eslint clean, app.main imports. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013dKUV96WkQQETZBMoAG98C
47 lines
1.0 KiB
Python
47 lines
1.0 KiB
Python
"""A provider decides why a host is an exposure."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import uuid
|
|
from collections.abc import Iterable
|
|
from dataclasses import dataclass
|
|
|
|
from interest.context import InterestContext
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RawSignal:
|
|
subdomain_id: uuid.UUID
|
|
host: str
|
|
source: str
|
|
key: str
|
|
kind: str
|
|
weight: int
|
|
label: str
|
|
reason: str
|
|
evidence: str | None = None
|
|
rule_id: uuid.UUID | None = None
|
|
model: str | None = None
|
|
prompt_version: str | None = None
|
|
booster: bool = False
|
|
|
|
|
|
class InterestProvider:
|
|
name: str = ""
|
|
source: str = ""
|
|
emits: tuple[str, ...] = ()
|
|
title: str = ""
|
|
description: str = ""
|
|
requires_ai: bool = False
|
|
order: int = 50
|
|
|
|
@classmethod
|
|
def sources(cls) -> tuple[str, ...]:
|
|
return cls.emits or ((cls.source,) if cls.source else ())
|
|
|
|
def available(self, ctx: InterestContext) -> bool: # noqa: ARG002
|
|
return True
|
|
|
|
def evaluate(self, ctx: InterestContext) -> Iterable[RawSignal]:
|
|
raise NotImplementedError
|