diff --git a/infra/tool/fleetdash.py b/infra/tool/fleetdash.py
index d35cff2..2679e17 100644
--- a/infra/tool/fleetdash.py
+++ b/infra/tool/fleetdash.py
@@ -514,6 +514,18 @@ def render_text(results, feed, risk, limit=40):
.asof{color:var(--dim);font-size:11px;white-space:nowrap} .asof .lag{color:var(--push)}
.pausebtn{font:12px var(--mono);padding:2px 9px;background:var(--panel);border:1px solid var(--line);
border-radius:6px;color:var(--dim);cursor:pointer} .pausebtn.on{color:var(--push);border-color:var(--push)}
+ /* tier-2 tool-use reveal: a themed action button + high-contrast decrypted-value rows */
+ .cwbtn{font:12px var(--mono);padding:5px 13px;background:rgba(57,208,216,.07);border:1px solid var(--accent);
+ border-radius:6px;color:var(--accent);cursor:pointer;letter-spacing:.03em;transition:background .15s,box-shadow .15s}
+ .cwbtn:hover{background:rgba(57,208,216,.15);box-shadow:0 0 0 1px var(--accent),0 0 12px rgba(57,208,216,.22)}
+ .cwvals{margin-top:8px}
+ .cwvals .cwstep{margin:12px 0 3px;color:var(--accent);font-weight:600;letter-spacing:.03em}
+ .cwvals .cwsha{color:var(--dim);font-weight:400;margin-left:6px;font-size:11px}
+ .cwvals .cwerr{color:var(--reject);margin:2px 0}
+ .cwvals table{width:100%;border-collapse:collapse}
+ .cwvals td{padding:3px 8px;border-bottom:1px solid var(--line);vertical-align:top}
+ .cwvals .cwk{color:var(--ink);white-space:nowrap;padding-right:18px}
+ .cwvals .cwv{color:#eaf2f9;font-weight:600;text-align:right;word-break:break-all}
.tzwrap{color:var(--dim);font-size:11px;display:flex;align-items:center;gap:5px}
.tzwrap select{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:5px;
font:11px var(--mono);padding:2px 4px}
@@ -1142,15 +1154,19 @@ def _values_reveal_script():
'out.textContent="";var steps=(d&&d.steps)||[];'
'if(!steps.length){out.textContent="no recorded values for this run";return}'
'steps.forEach(function(s){'
- 'var h=document.createElement("div");h.style.marginTop="8px";'
- 'var t=document.createElement("b");t.textContent="step "+s.step+" ยท "+(s.values_sha||"").slice(0,16);'
- 'h.appendChild(t);'
- 'var tbl=document.createElement("table");var body=document.createElement("tbody");'
- 'var vv=s.values||{};if(s.error){var er=document.createElement("div");er.className="no";'
+ 'var h=document.createElement("div");'
+ 'var t=document.createElement("div");t.className="cwstep";'
+ 't.textContent="step "+s.step;'
+ 'var sh=document.createElement("span");sh.className="cwsha";'
+ 'sh.textContent=(s.values_sha||"").slice(0,16);t.appendChild(sh);h.appendChild(t);'
+ 'if(s.error){var er=document.createElement("div");er.className="cwerr";'
'er.textContent="decrypt error: "+s.error;h.appendChild(er)}'
+ 'var tbl=document.createElement("table");var body=document.createElement("tbody");'
+ 'var vv=s.values||{};'
'Object.keys(vv).sort().forEach(function(k){var tr=document.createElement("tr");'
- 'var kd=document.createElement("td");kd.textContent=k;var vd=document.createElement("td");'
- 'vd.className="t";vd.textContent=String(vv[k]);tr.appendChild(kd);tr.appendChild(vd);'
+ 'var kd=document.createElement("td");kd.className="cwk";kd.textContent=k;'
+ 'var vd=document.createElement("td");vd.className="cwv";vd.textContent=String(vv[k]);'
+ 'tr.appendChild(kd);tr.appendChild(vd);'
'body.appendChild(tr)});tbl.appendChild(body);h.appendChild(tbl);out.appendChild(h)})'
'}).catch(function(e){out.textContent="fetch failed: "+e})});'
'})();')
@@ -1257,8 +1273,8 @@ def prob_line(p):
'exact declared, non-secret inputs into the value-free chain. The values themselves are '
'encrypted at rest (tier-2 ledger); reveal decrypts them live on the node with its '
'recipient key (secrets never recorded โ they stay *_FILE pointers).