Activity Control Ui
Analysis
The dashboard is purpose-aligned, but its local web server lacks safe file-path and access controls, so it could expose agent activity and local files if run.
Findings (4)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Checks for instructions or behavior that redirect the agent, misuse tools, execute unexpected code, cascade across systems, exploit user trust, or continue outside the intended task.
let filePath = req.url; ... const fullPath = path.join(skillDir, filePath); ... fs.readFile(fullPath, (err, data) => {The HTTP request URL is joined directly into a filesystem path and read without an allowlist or check that the result stays inside the skill directory.
module.exports = { broadcastStatus, broadcastActivity, broadcastTasks }; ... server.listen(port, () => { console.log(`Activity Control UI running at http://localhost:${port}`); });The module both exports broadcast functions and starts the HTTP/WebSocket server at top level, so importing it for helper use can also start a listener.
"dependencies": { "ws": "^8.20.0" } ... "resolved": "https://registry.npmmirror.com/ws/-/ws-8.20.0.tgz"The WebSocket dependency is expected for this dashboard, but installation depends on an external npm mirror and is not represented in the registry install requirements.
Checks for exposed credentials, poisoned memory or context, unclear communication boundaries, or sensitive data that could leave the user's control.
const wss = new WebSocketServer({ server }); ... ws.send(JSON.stringify({ type: 'status', ...currentStatus })); ... activityHistory.forEach(activity => { ws.send(...); }); ... server.listen(port, () => {Any WebSocket client reaching the server receives status, task, and activity history, and the listener does not show authentication, origin checks, or an explicit localhost-only bind.
