function Services(){
const block=(id,kicker,title,lede,body,out)=>
<section id={id} style={{padding:'72px 40px',borderBottom:'1px solid var(--border-subtle)'}}>
<div style={{maxWidth:800,margin:'0 auto'}}>
<div style={{fontFamily:'var(--font-mono)',fontSize:12,letterSpacing:'.08em',color:'var(--text-faint)',marginBottom:10}}>{kicker}</div>
<h2 style={{fontSize:28,fontWeight:600,letterSpacing:'-.03em',margin:'0 0 16px'}}>{title}</h2>
<p style={{fontSize:15,color:'var(--text-muted)',margin:'0 0 20px'}}>{lede}</p>
{body.map((p,i)=><p key={i} style={{fontSize:14,color:'var(--text-muted)',lineHeight:1.7,margin:'0 0 14px'}}>{p}</p>)}
<div style={{marginTop:24,background:'var(--bg-1)',border:'1px solid var(--border-default)',borderRadius:'var(--radius-2)',padding:'18px 20px'}}>
<div style={{fontSize:12,letterSpacing:'.08em',color:'var(--text-faint)',marginBottom:10}}>YOU LEAVE WITH</div>
<ul style={{margin:0,paddingLeft:18,color:'var(--text-muted)',fontSize:14,lineHeight:1.7}}>{out.map(x=><li key={x}>{x}</li>)}</ul>
</div>
</div>
</section>;
return <div>
<div style={{padding:'48px 40px 24px'}}>
<div style={{maxWidth:800,margin:'0 auto'}}>
<h1 style={{fontFamily:'var(--font-mono)',fontSize:40,fontWeight:500,letterSpacing:'-.04em',margin:'0 0 12px'}}>Services</h1>
<p style={{fontSize:15,color:'var(--text-muted)',maxWidth:560}}>Four lines of work. All authorized. We do not run against systems you do not own or have in writing.</p>
</div>
</div>
{block('reverse-engineering','01','Reverse engineering','Firmware, protocols, and closed-source dependencies taken apart before they ship into your stack.',
['Most “we decompiled it” reports are a Ghidra dump plus adjectives. We treat the binary as an instrument: recover the layout the code actually uses, the parser it actually accepts, and the fields it never reads. See the offset-oracle note for the method.',
'Typical targets: vendor gateway firmware, mobile clients, native SDKs, protocol blobs. We start from an offline sample and a scope file. No production scanning from this engagement unless you put it in writing.',
'If an agent is in the loop, it is routed — not left to guess jadx vs IDA. The analyst still owns the finding.'],
['Struct and protocol notes that match the bytes','Risk register with evidence paths','Reproduction steps your engineers can run'])}
{block('ai-security','02','AI security','Model supply chain, injection resistance, and guardrail evaluation for systems that retrieve and act.',
['Weights, adapters, and fine-tunes are dependencies. We ask where they came from, who can swap them, and what the runtime actually loads — not what the manifest says.',
'RAG and agents fail the same way: untrusted text is treated as an instruction. We test whether a user prompt or a retrieved chunk can overwrite your preset, and whether tool calls still hit a broker when the model complies with a jailbreak.',
'Guardrails are scored as a pair: unauthorized must fail closed; in-scope questions must still answer. A bot that refuses everything is not hardened.'],
['Provenance notes for weights and adapters','Injection and RAG override results with cited inputs','Guardrail gaps mapped to tool policy'])}
{block('agents','03','Agent audits','Which agents to trust, with which tools, with evidence.',
['An agent is a model plus a harness. We inventory tools, credentials, network, and who can change the system prompt. Then we try to make it do something outside that inventory — and we stop at the broker, not at a scolding paragraph.',
'Recommendation is not a leaderboard. We assign Anthropic, OpenAI, Gemini, Bedrock, or Grok by lane: general, Mythos fallback, verified-defender. The comparison notes are public; the assignment for your tenant is not.',
'Deliverable is a trust report: allowlist, schema, sandbox, confirm-for-high-impact. If you cannot name those four gates, you do not have an agent product. You have a chat box with side effects.'],
['Tool and identity inventory','Allowlist / schema / sandbox / confirm gaps','Written assignment of model lane'])}
{block('network','04','Detection engineering','Hardening for networks that carry machine-to-machine and agent-to-tool traffic.',
['Agent traffic does not look like a browser user. We tune detections around tool calls, model endpoints, and the paths between them — not only phishing and ransomware defaults.',
'Protocol work from reverse engineering feeds this: once we know what the blob actually speaks, we can say what “normal” is on the wire.',
'This is not a 24/7 SOC we staff for you. It is the engineering that makes your SOC stop guessing.'],
['Detection notes tied to observed protocols','Hardening list with owners','What we explicitly did not cover'])}
</div>;
}
mountPage('services.html', Services);
