docs: rewrite features.md, audit README + architecture against repo

Rewrote docs/features.md from scratch as authoritative feature inventory
(1255 lines, every claim verified against source files).

Audited README.md and architecture.md against repo — fixed 19 stale
references: K8s Secrets status, issuer counts, dashboard page counts,
CI thresholds, missing connectors in Mermaid diagrams, OpenAPI operation
count, GetCACertPEM behavior, and V2/V4 roadmap accuracy.

Also includes related fixes discovered during audit:
- Scheduler skips expired/failed/revoked certs from auto-renewal
- Seed demo expiry dates moved outside 31-day scheduler query window
- Agent pages use correct last_heartbeat_at field name

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shankar0123
2026-04-15 00:22:57 -04:00
parent 3da6584ab8
commit c015cab2f4
9 changed files with 1165 additions and 1314 deletions
+4 -4
View File
@@ -61,7 +61,7 @@ export default function AgentDetailPage() {
);
}
const health = agent.status || heartbeatStatus(agent.last_heartbeat);
const health = agent.status || heartbeatStatus(agent.last_heartbeat_at);
return (
<>
@@ -82,10 +82,10 @@ export default function AgentDetailPage() {
<InfoRow label="IP Address" value={<span className="font-mono text-xs">{agent.ip_address || '—'}</span>} />
<InfoRow label="Version" value={agent.version || '—'} />
<InfoRow label="Last Heartbeat" value={
agent.last_heartbeat ? (
agent.last_heartbeat_at ? (
<span>
{timeAgo(agent.last_heartbeat)}
<span className="text-ink-faint ml-2 text-xs">{formatDateTime(agent.last_heartbeat)}</span>
{timeAgo(agent.last_heartbeat_at)}
<span className="text-ink-faint ml-2 text-xs">{formatDateTime(agent.last_heartbeat_at)}</span>
</span>
) : '—'
} />
+2 -2
View File
@@ -39,7 +39,7 @@ export default function AgentsPage() {
{
key: 'status',
label: 'Health',
render: (a) => <StatusBadge status={a.status || heartbeatStatus(a.last_heartbeat)} />,
render: (a) => <StatusBadge status={a.status || heartbeatStatus(a.last_heartbeat_at)} />,
},
{ key: 'hostname', label: 'Hostname', render: (a) => <span className="text-ink-muted font-mono text-xs">{a.hostname || '—'}</span> },
{ key: 'os', label: 'OS / Arch', render: (a) => <span className="text-ink-muted text-xs">{a.os && a.architecture ? `${a.os}/${a.architecture}` : a.os || '—'}</span> },
@@ -48,7 +48,7 @@ export default function AgentsPage() {
{
key: 'heartbeat',
label: 'Last Heartbeat',
render: (a) => <span className="text-ink-muted text-xs">{timeAgo(a.last_heartbeat)}</span>,
render: (a) => <span className="text-ink-muted text-xs">{timeAgo(a.last_heartbeat_at)}</span>,
},
];