hub-audit-24bd6d — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited hub-audit-24bd6d (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Orchestrate a multi-agent audit of the codebase against 8 agent-native architecture principles, coordinated through Thoughtbox Hub.
/hub-audit # Full audit (all 8 principles)
/hub-audit <principle> # Single principle deep-diveSingle principle arguments: action-parity, tools, context, shared-workspace, crud, ui, discovery, prompt-native
The hub is exposed as tb.hub.* inside the thoughtbox_execute MCP tool (the only registered Thoughtbox MCP tools are thoughtbox_search, thoughtbox_execute, and thoughtbox_peer_notebook). Register once per MCP session — the returned agentId is implicit for every later hub call in that session, and coordinator role is bound to the registering agentId. Submit at most ONE state-mutating hub call per thoughtbox_execute invocation; read-only calls (tb.hub.whoami, tb.hub.readChannel, tb.hub.workspaceDigest, tb.hub.listProposals) may be freely chained.
4 agents collaborate through a shared Hub workspace:
| Agent | Profile | Principles | Investigation Surface |
|---|---|---|---|
| Auditor-A | RESEARCHER | P1 Action Parity, P2 Tools as Primitives, P5 CRUD Completeness | Tool/API surface: tool definitions, route handlers, MCP schemas |
| Auditor-B | RESEARCHER | P3 Context Injection, P4 Shared Workspace, P8 Prompt-Native Features | Information flow: system prompts, data access, feature definitions |
| Auditor-C | RESEARCHER | P6 UI Integration, P7 Capability Discovery | User-facing: agent visibility in UI, discoverability |
| Synthesizer | REVIEWER | P9 Final Report | Reviews all proposals, calibrates scores, compiles report |
Sequential spawning (required per hub-collab findings) with 90-second verification gates.
All tb.hub.postMessage content MUST use one of these typed prefixes. This is the coordination backbone.
FINDING: P<n> | HIGH|MEDIUM|LOW | <description with file:line refs>
EVIDENCE: P<n> | <file:line> | <what it shows>
GAP: P<n> | <what's missing and why it matters>
SCORE: P<n> | X/Y (Z%) | <rationale>
XREF: P<n> | <finding relevant to another principle>
QUESTION: <addressed-to> | <question>
ANSWER: re:P<n> | <answer>
STATUS: STARTED|INVESTIGATING|SCORING|COMPLETE | <note>| Event | Type | Channel |
|---|---|---|
| Start investigating a principle | STATUS: STARTED | That principle's problem |
| Find relevant code | EVIDENCE | That principle's problem |
| Identify a gap | GAP | That principle's problem |
| Find something relevant to another principle | XREF | BOTH own + target problem |
| Complete scoring | SCORE | That principle's problem |
| Need clarification from another agent | QUESTION | Relevant problem |
| Respond to a question | ANSWER | Same channel as question |
| Finish all assigned principles | STATUS: COMPLETE | Each assigned problem |
XREF to BOTH own channel (recording discovery) AND target channel (delivering info)FINDING referencing the XREFExample:
# Auditor-A investigating P5 (CRUD), discovers no capability listing endpoint
# Relevant to P7 (Capability Discovery, owned by Auditor-C)
# Posts to P5 channel:
XREF: P7 | No "list_tools" or capability introspection endpoint. Relevant to discovery scoring.
# Posts to P7 channel:
XREF: P7 | [From Auditor-A/P5] No capability introspection endpoint. Tool list not programmatically queryable.
# Later, Auditor-C reads P7 channel before scoring, incorporates:
FINDING: P7 | HIGH | No programmatic capability discovery (confirmed by Auditor-A XREF from P5)Each auditor creates one proposal per principle problem:
## Principle [N]: [Name]
### Score: [X]/[Y] ([Z]%)
### Criteria Evaluated
| # | Criterion | Pass/Fail | Evidence |
|---|-----------|-----------|----------|
| 1 | [criterion] | PASS/FAIL | [file:line or description] |
### Key Findings
- [FINDING with severity and evidence]
### Gaps Identified
- [GAP with impact description]
### Cross-References Received
- [XREFs from other auditors that affected this score]
### Recommendations
1. [Actionable recommendation with estimated effort]## Agent-Native Architecture Audit Report
### Audit Target: [repository/project name]
### Date: [ISO date]
### Auditors: [agent names]
### Executive Summary
[2-3 sentences: overall posture, strongest and weakest areas]
### Overall Score: [total achieved] / [total possible] ([percentage]%)
### Principle Scores
| # | Principle | Score | % | Verdict |
|---|-----------|-------|---|---------|
| 1 | Action Parity | X/Y | Z% | STRONG/ADEQUATE/WEAK/MISSING |
| 2 | Tools as Primitives | X/Y | Z% | ... |
| 3 | Context Injection | X/Y | Z% | ... |
| 4 | Shared Workspace | X/Y | Z% | ... |
| 5 | CRUD Completeness | X/Y | Z% | ... |
| 6 | UI Integration | X/Y | Z% | ... |
| 7 | Capability Discovery | X/Y | Z% | ... |
| 8 | Prompt-Native Features | X/Y | Z% | ... |
### Cross-Cutting Themes
[Patterns that appeared across multiple principles]
### Top 5 Recommendations (Priority Order)
1. [Recommendation with principles affected and estimated effort]
### Methodology
- Each principle scored by independent auditor agent
- Cross-pollination via structured XREF messages on Thoughtbox Hub
- Scores reviewed and calibrated by Synthesizer
- Consensus recorded on Hub with thought referencesEach block below is JavaScript passed to thoughtbox_execute — one mutation per call.
async () => tb.hub.register({ name: "Audit-Coordinator", profile: "MANAGER" })Record the agentId. Do NOT re-register later — coordinator role (including the Phase 5 merge) is bound to this identity and session. Then create workspace:
async () => tb.hub.createWorkspace({
name: "audit/<project-name>",
description: "Agent-native architecture audit — 8 principles scored by 3 auditor agents with synthesizer"
})Create 9 problems (P1-P8 for principles, P9 for synthesis), one tb.hub.createProblem call each:
// P1 - Action Parity
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P1: Action Parity — Can agents do everything users can?",
description: "Enumerate ALL user actions (API calls, UI interactions). Check which have corresponding agent tools. Score: agent can do X out of Y user actions."
})
// P2 - Tools as Primitives
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P2: Tools as Primitives — Are tools atomic capabilities, not workflows?",
description: "Find all agent tools. Classify each as PRIMITIVE (single capability) or WORKFLOW (embeds business logic). Score: X out of Y tools are proper primitives."
})
// P3 - Context Injection
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P3: Context Injection — Does the system prompt include dynamic app state?",
description: "Find context injection code. Check what dynamic state (resources, preferences, activity, capabilities) is injected vs what should be."
})
// P4 - Shared Workspace
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P4: Shared Workspace — Do agents and users share the same data space?",
description: "Identify all data stores. Check if agents read/write the SAME tables/stores as users. Flag sandbox isolation anti-patterns."
})
// P5 - CRUD Completeness
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P5: CRUD Completeness — Does every entity have full CRUD for agents?",
description: "Identify all entities/models. For each, check agent tools for Create, Read, Update, Delete. Score per entity and overall."
})
// P6 - UI Integration
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P6: UI Integration — Are agent actions immediately reflected in UI?",
description: "Check how agent writes propagate to frontend. Look for streaming, polling, shared state, event buses. Flag silent action anti-patterns."
})
// P7 - Capability Discovery
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P7: Capability Discovery — Can users discover what agents can do?",
description: "Check 7 discovery mechanisms: onboarding, help docs, UI hints, self-description, suggested prompts, empty state guidance, slash commands."
})
// P8 - Prompt-Native Features
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P8: Prompt-Native Features — Are features prompts, not code?",
description: "Read agent prompts. Classify features as PROMPT-defined (outcomes in natural language) or CODE-defined (hardcoded logic). Check if behavior changes need code changes."
})
// P9 - Synthesis (depends on all above)
async () => tb.hub.createProblem({
workspaceId: "<ID>",
title: "P9: Synthesis — Compile final audit report",
description: "Review all auditor proposals. Calibrate scores for cross-principle consistency. Compile the final Agent-Native Architecture Audit Report."
})Add dependencies so P9 blocks until P1-P8 are resolved (one call per dependency):
async () => tb.hub.addDependency({ workspaceId: "<ID>", problemId: "<P9_ID>", dependsOnProblemId: "<P1_ID>" })
// ... repeat for P2-P8Gate: Verify with tb.hub.workspaceDigest({ workspaceId: "<ID>" }) — 9 problems, P9 blocked by 8 dependencies.
Spawn each auditor using the Agent tool with subagent_type: "general-purpose". Use the auditor team prompt template (.Codex/team-prompts/auditor.md) with these parameter substitutions:
Auditor-A:
{{AUDITOR_NAME}}: "Auditor-A"{{WORKSPACE_ID}}: from Phase 0{{PRINCIPLES}}: P1 (Action Parity), P2 (Tools as Primitives), P5 (CRUD Completeness){{PROBLEM_IDS}}: P1, P2, P5 IDs from Phase 0{{OTHER_PROBLEM_IDS}}: P3, P4, P6, P7, P8 IDs (for cross-pollination read)Wait 90 seconds after spawn, then verify:
async () => tb.hub.readChannel({ workspaceId: "<ID>", problemId: "<P1_ID>" })If no STATUS: STARTED message, send status query via tb.hub.postMessage. Wait 30s more. If still nothing, kill and respawn.
Auditor-B (after A verified): P3, P4, P8. Same gate. Auditor-C (after B verified): P6, P7. Same gate.
Gate: All 3 auditors posted STATUS: STARTED.
While auditors work, the coordinator:
Gate: All P1-P8 problems have status "resolved" AND at least 8 proposals exist (one per principle).
Spawn Synthesizer using the Agent tool with subagent_type: "general-purpose". Use the synthesizer team prompt template (.Codex/team-prompts/synthesizer.md).
Same 90-second verification gate.
Gate: Synthesizer claims P9.
The Synthesizer (working autonomously):
tb.hub.reviewProposal:approve or request-changes with reasoningtb.hub.markConsensus({ workspaceId: "<ID>", name: "P<n> Score: X/Y", description: "<rationale>", thoughtRef: <thought number> })Fallback: If Synthesizer has questions but auditor is no longer running, Synthesizer adjusts the score with documented reasoning and notes the adjustment in the final report.
Gate: P9 proposal exists.
These run from the coordinator's own session — the merge requires the coordinator identity registered in Phase 0.
tb.hub.reviewProposal({ workspaceId: "<ID>", proposalId: "<P9 proposal>", verdict: "approve", reasoning: "<assessment>" })tb.hub.markConsensus({ workspaceId: "<ID>", name: "Audit Complete", description: "All 8 principles scored and calibrated", thoughtRef: <thought number> })tb.hub.mergeProposal({ workspaceId: "<ID>", proposalId: "<P9 proposal>", mergeMessage: "Final audit report merged" })Search for all user-facing routes/endpoints (src/routes/, API handlers, form submissions). For each, check if a corresponding MCP tool or agent action exists. Count matches and gaps. Search tool registrations, MCP schema files, agent tool definitions.
List all MCP tools (search for tool registration, z.object schemas, handler definitions). For each: does it do one atomic thing (read, write, list, delete)? Or does it embed multi-step workflow logic, conditionals, or orchestration? Classify as PRIMITIVE or WORKFLOW.
Find system prompt construction (search for "system", "context", "inject", prompt template files). Check what dynamic state gets injected: available resources, user preferences, recent activity, available capabilities, session history, workspace state. Compare to what's available.
Identify all data stores (database tables, file stores, in-memory caches). Check if agents read/write the SAME stores as users/UI. Look for agent-only tables, sandboxed data, or separate state that creates an isolation anti-pattern.
Identify all major entities (users, projects, documents, sessions, etc.). For each, check if agent-accessible tools exist for Create, Read, Update, Delete. Score per entity (0-4 operations) and compute overall percentage.
Check how agent-initiated changes propagate to the UI. Look for: WebSocket/SSE streaming, polling endpoints, shared reactive state, event buses, optimistic updates. Identify "silent actions" where agents change state but UI doesn't reflect it.
Check for these 7 mechanisms: (1) onboarding flow showing agent capabilities, (2) help documentation, (3) capability hints in UI, (4) agent self-describes in responses, (5) suggested prompts/actions, (6) empty state guidance, (7) slash commands or help commands. Score against 7.
Read agent prompts and system messages. Classify each feature/behavior: is it defined in PROMPT (natural language outcome description, changeable by editing prompt) or CODE (hardcoded logic, requires code change to modify)? Score the ratio.
When invoked with a single principle argument, skip the multi-agent orchestration:
This runs in ~10 minutes vs ~30 minutes for the full audit.
| Phase | Duration |
|---|---|
| Phase 0: Setup | ~2 min |
| Phase 1: Spawn Auditors | ~5 min (90s gate x3) |
| Phase 2: Audit | ~10-15 min |
| Phase 3: Spawn Synthesizer | ~2 min |
| Phase 4: Synthesis | ~5-8 min |
| Phase 5: Finalize | ~2 min |
| Total | ~25-35 min |
agentId in every tb.hub.* mutation (hub-collab: the FIRST registration in the shared session is the implicit default — agentId-less calls get attributed to the coordinator)subagent_type: "general-purpose" always (deploy-team-hub: custom types lose ToolSearch)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.