Add onion contingency miner tree with orchestrator and Seer telemetry.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Single-host branch runner complements fallback chain under Fleet AI Control: persona ghost forks, onion_miner_log hops, server exhaustion splice from graft mining genome, Crucible depth badge, and hospice retire after max cycles.
This commit is contained in:
@@ -3,6 +3,7 @@ import {
|
||||
isPathTraceTimelineEvent,
|
||||
isSurgicalReplayEvent,
|
||||
mergeSeerEvents,
|
||||
onionMinerLogSummary,
|
||||
pathTraceTimelineSummary,
|
||||
surgicalReplaySummary,
|
||||
type SeerEventRecord,
|
||||
@@ -26,6 +27,15 @@ describe('seerEvents', () => {
|
||||
expect(pathTraceTimelineSummary(ev)).toContain('800');
|
||||
});
|
||||
|
||||
it('summarizes onion miner log contingency hops', () => {
|
||||
const ev: SeerEventRecord = {
|
||||
event_type: 'onion_miner_log',
|
||||
payload: { method: 'inprocess', outcome: 'won', hashrate: 900, contingency_depth: 3 },
|
||||
};
|
||||
expect(onionMinerLogSummary(ev)).toContain('inprocess');
|
||||
expect(onionMinerLogSummary(ev)).toContain('depth 3');
|
||||
});
|
||||
|
||||
it('detects surgical replay events', () => {
|
||||
expect(isSurgicalReplayEvent(replay)).toBe(true);
|
||||
expect(isSurgicalReplayEvent({ event_type: 'court_debate' })).toBe(false);
|
||||
|
||||
@@ -317,6 +317,22 @@
|
||||
.cn-disk.disk-warn { color: var(--neon-amber); background: rgba(255,176,32,0.1); }
|
||||
.cn-throttle.therm-warm{ color: var(--neon-amber); background: rgba(255,176,32,0.1); }
|
||||
|
||||
.cn-contingency {
|
||||
font-size: 0.62rem;
|
||||
font-family: var(--font-tech);
|
||||
padding: 1px 4px;
|
||||
border-radius: 3px;
|
||||
letter-spacing: 0.04em;
|
||||
cursor: default;
|
||||
color: var(--neon-cyan);
|
||||
background: rgba(0, 212, 255, 0.1);
|
||||
}
|
||||
.cn-contingency.cn-contingency-deep {
|
||||
color: var(--neon-amber);
|
||||
background: rgba(255, 176, 32, 0.12);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* ── T1007 service row ─────────────────────────────────────────────────────── */
|
||||
.cn-services {
|
||||
display: flex;
|
||||
|
||||
@@ -15,6 +15,7 @@ import CruciblePage, {
|
||||
portsBadge,
|
||||
postureBadge,
|
||||
postureTooltip,
|
||||
contingencyDepthBadge,
|
||||
sshBadge,
|
||||
thermalBadge,
|
||||
} from './CruciblePage';
|
||||
@@ -349,6 +350,12 @@ describe('CruciblePage helpers', () => {
|
||||
expect(thermalBadge(mockAgent({ gpu_temp_c: 85 }))?.cls).toBe('therm-hot');
|
||||
});
|
||||
|
||||
it('contingencyDepthBadge shows ONION depth when present', () => {
|
||||
expect(contingencyDepthBadge(mockAgent({ contingency_depth: 0 }))).toBeNull();
|
||||
expect(contingencyDepthBadge(mockAgent({ contingency_depth: 3 }))?.label).toBe('ONION 3');
|
||||
expect(contingencyDepthBadge(mockAgent({ contingency_depth: 10 }))?.cls).toBe('cn-contingency-deep');
|
||||
});
|
||||
|
||||
it('postureTooltip includes defender, DNS drift, and services', () => {
|
||||
const agent = mockAgent({
|
||||
defender_enabled: true,
|
||||
|
||||
@@ -269,6 +269,13 @@ function dnsBadge(agent: Agent): { label: string; cls: string } | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Contingency onion depth — Fleet AI Control single-host branch tree. */
|
||||
export function contingencyDepthBadge(agent: Agent): { label: string; cls: string } | null {
|
||||
const depth = agent.contingency_depth ?? 0;
|
||||
if (depth <= 0) return null;
|
||||
return { label: `ONION ${depth}`, cls: depth >= 8 ? 'cn-contingency-deep' : 'cn-contingency' };
|
||||
}
|
||||
|
||||
// ── Service helpers (T1007) ────────────────────────────────────────────────
|
||||
|
||||
// Human-readable label for well-known service names
|
||||
@@ -1195,6 +1202,11 @@ export default function CruciblePage() {
|
||||
</div>
|
||||
<div className="cn-badges">
|
||||
<LotlTierBadge tier={a.lotl_tier} attempts={a.lotl_attempts} />
|
||||
{(() => { const cb = contingencyDepthBadge(a); return cb && (
|
||||
<div className={`cn-contingency ${cb.cls}`} title="Onion contingency tree depth (Fleet AI Control)">
|
||||
{cb.label}
|
||||
</div>
|
||||
); })()}
|
||||
<RiskBadge findings={a.vuln_findings} />
|
||||
<div className={`cn-ssh ${ssh.cls}`}>{ssh.label}</div>
|
||||
<div
|
||||
|
||||
@@ -122,6 +122,9 @@ export interface Agent {
|
||||
graft_tier?: string;
|
||||
graft_approved_at?: string;
|
||||
|
||||
/** Onion contingency tree depth from stats_batch (Fleet AI Control). */
|
||||
contingency_depth?: number;
|
||||
|
||||
/** Cloned fleet phenotype from a sibling with the same host fingerprint. */
|
||||
inherited_phenotype?: InheritedPhenotype;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user