Files
rengine/reports/sections/services/section.html
T
Yogesh OjhaandClaude Fable 5.1 0a69f3201c copy: state the fact, delete the explanation
Repo-wide sweep of every user-facing string: frontend components, routes,
config and stores; API details and route docs; shared definitions and
models; stage config help; report prose; MCP, toolbox, interest and
connector text; notification and worker messages.

Descriptions that explained, reassured, justified or restated their title
are deleted. Confirm dialogs name what is removed and stop. Failed actions
read "<Noun> not <verbed>", successes "<Noun> <verbed>". No reader address,
no product-as-subject, no em-dashes or parentheticals in prose.

Mirrors updated on both sides: EPSS band help, compare refusal reasons,
interest labels. Four tests asserting on old wording follow the new text.
The rules are condensed into CLAUDE.md under Writing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SK5o8xR96cbSnAfjYSTPSe
2026-09-12 11:35:07 +05:30

48 lines
2.5 KiB
HTML

{% import 'macros.html' as m with context %}
<p class="block muted small">{{ ctx.data.service_rows|length|num }} services answered on {{ addresses|num }} addresses. {{ web|num }} of them answer HTTP.{% if sensitive %} {{ sensitive|num }} {{ 'is' if sensitive == 1 else 'are' }} administrative or data.{% endif %}</p>
{% if classes %}
<div class="sub">
<div class="label block">Composition</div>
{% set items = [] %}
{% for row in classes %}{% set _ = items.append(Slice(row.label, row.count, ctx.hue(loop.index0))) %}{% endfor %}
{{ stack_bar(items)|safe }}
<div class="chips" style="margin-top:1.6mm">
{% for row in classes %}<span class="chip"><span style="display:inline-block;width:6px;height:6px;border-radius:2px;background:{{ ctx.hue(loop.index0) }}"></span>&nbsp;{{ row.label }} {{ row.count|num }}</span>{% endfor %}
</div>
</div>
{% endif %}
{% if policies %}
<div class="sub">
<div class="label block">Scan coverage</div>
<table class="table">
<tbody>
{% for key, count in policies.items() %}
<tr><td style="width:44mm">{{ {'full':'Scanned in full','web':'Web ports only, CDN edge','skip':'Not scanned'}.get(key, key) }}</td><td class="num">{{ count|num }} addresses</td></tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
<div class="sub">
<div class="label block">Services</div>
<table class="table table--fixed">
<thead><tr><th style="width:32mm">Address</th><th class="num" style="width:14mm">Port</th><th style="width:26mm">Service</th><th style="width:20mm">Class</th>{% if show_banner %}<th>Software</th>{% endif %}<th style="width:38mm">Hostnames</th></tr></thead>
<tbody>
{% for row in rows %}
<tr>
<td class="micro mono-break">{{ row.ip }}</td>
<td class="num micro">{{ row.port }}{% if row.tls %} <span class="faint">tls</span>{% endif %}</td>
<td class="micro">{{ row.service_name or '—' }}{% if row.sensitive %} <span class="badge badge--high">sensitive</span>{% endif %}</td>
<td class="micro muted">{{ row.service_class|svc }}</td>
{% if show_banner %}<td class="micro muted wrap">{{ ((row.product ~ ' ' ~ (row.version or '')) if row.product else (row.banner or ''))|clip(48) or '—' }}</td>{% endif %}
<td class="micro mono-break wrap">{{ row.hosts[:2]|join(', ')|clip(46) or '—' }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if hidden %}<p class="micro faint" style="margin-top:1.4mm">{{ hidden|num }} further services are not listed.</p>{% endif %}
</div>