agent-bober 0.17.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +26 -0
- package/README.md +402 -10
- package/agents/bober-art-director.md +100 -0
- package/agents/bober-design-critic.md +114 -0
- package/agents/bober-frontend-builder.md +101 -0
- package/agents/bober-security-auditor.md +193 -0
- package/agents/bober-security-verifier.md +104 -0
- package/agents/bober-seo-strategist.md +144 -0
- package/agents/bober-seo-verifier.md +103 -0
- package/dist/calendar/calendar-egress.d.ts +26 -0
- package/dist/calendar/calendar-egress.d.ts.map +1 -0
- package/dist/calendar/calendar-egress.js +35 -0
- package/dist/calendar/calendar-egress.js.map +1 -0
- package/dist/calendar/calendar-token.d.ts +34 -0
- package/dist/calendar/calendar-token.d.ts.map +1 -0
- package/dist/calendar/calendar-token.js +56 -0
- package/dist/calendar/calendar-token.js.map +1 -0
- package/dist/calendar/connector.d.ts +22 -0
- package/dist/calendar/connector.d.ts.map +1 -0
- package/dist/calendar/connector.js +3 -0
- package/dist/calendar/connector.js.map +1 -0
- package/dist/calendar/finding-source.d.ts +20 -0
- package/dist/calendar/finding-source.d.ts.map +1 -0
- package/dist/calendar/finding-source.js +35 -0
- package/dist/calendar/finding-source.js.map +1 -0
- package/dist/calendar/google-connector.d.ts +65 -0
- package/dist/calendar/google-connector.d.ts.map +1 -0
- package/dist/calendar/google-connector.js +129 -0
- package/dist/calendar/google-connector.js.map +1 -0
- package/dist/calendar/ics-connector.d.ts +12 -0
- package/dist/calendar/ics-connector.d.ts.map +1 -0
- package/dist/calendar/ics-connector.js +48 -0
- package/dist/calendar/ics-connector.js.map +1 -0
- package/dist/calendar/proposal-gate.d.ts +84 -0
- package/dist/calendar/proposal-gate.d.ts.map +1 -0
- package/dist/calendar/proposal-gate.js +126 -0
- package/dist/calendar/proposal-gate.js.map +1 -0
- package/dist/calendar/slotter.d.ts +34 -0
- package/dist/calendar/slotter.d.ts.map +1 -0
- package/dist/calendar/slotter.js +196 -0
- package/dist/calendar/slotter.js.map +1 -0
- package/dist/calendar/types.d.ts +162 -0
- package/dist/calendar/types.d.ts.map +1 -0
- package/dist/calendar/types.js +28 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/chat/answerer.d.ts +17 -0
- package/dist/chat/answerer.d.ts.map +1 -0
- package/dist/chat/answerer.js +52 -0
- package/dist/chat/answerer.js.map +1 -0
- package/dist/chat/approval-cursor.d.ts +25 -0
- package/dist/chat/approval-cursor.d.ts.map +1 -0
- package/dist/chat/approval-cursor.js +61 -0
- package/dist/chat/approval-cursor.js.map +1 -0
- package/dist/chat/approval-reader.d.ts +11 -0
- package/dist/chat/approval-reader.d.ts.map +1 -0
- package/dist/chat/approval-reader.js +20 -0
- package/dist/chat/approval-reader.js.map +1 -0
- package/dist/chat/careful-sidecar.d.ts +15 -0
- package/dist/chat/careful-sidecar.d.ts.map +1 -0
- package/dist/chat/careful-sidecar.js +39 -0
- package/dist/chat/careful-sidecar.js.map +1 -0
- package/dist/chat/chat-session.d.ts +156 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +570 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/completion-tailer.d.ts +27 -0
- package/dist/chat/completion-tailer.d.ts.map +1 -0
- package/dist/chat/completion-tailer.js +187 -0
- package/dist/chat/completion-tailer.js.map +1 -0
- package/dist/chat/conversation-store.d.ts +22 -0
- package/dist/chat/conversation-store.d.ts.map +1 -0
- package/dist/chat/conversation-store.js +66 -0
- package/dist/chat/conversation-store.js.map +1 -0
- package/dist/chat/cursor-store.d.ts +23 -0
- package/dist/chat/cursor-store.d.ts.map +1 -0
- package/dist/chat/cursor-store.js +42 -0
- package/dist/chat/cursor-store.js.map +1 -0
- package/dist/chat/pid-sidecar.d.ts +22 -0
- package/dist/chat/pid-sidecar.d.ts.map +1 -0
- package/dist/chat/pid-sidecar.js +42 -0
- package/dist/chat/pid-sidecar.js.map +1 -0
- package/dist/chat/roster-reader.d.ts +16 -0
- package/dist/chat/roster-reader.d.ts.map +1 -0
- package/dist/chat/roster-reader.js +39 -0
- package/dist/chat/roster-reader.js.map +1 -0
- package/dist/chat/run-spawner.d.ts +71 -0
- package/dist/chat/run-spawner.d.ts.map +1 -0
- package/dist/chat/run-spawner.js +121 -0
- package/dist/chat/run-spawner.js.map +1 -0
- package/dist/chat/slash-commands.d.ts +40 -0
- package/dist/chat/slash-commands.d.ts.map +1 -0
- package/dist/chat/slash-commands.js +153 -0
- package/dist/chat/slash-commands.js.map +1 -0
- package/dist/chat/steer-cleanup.d.ts +12 -0
- package/dist/chat/steer-cleanup.d.ts.map +1 -0
- package/dist/chat/steer-cleanup.js +60 -0
- package/dist/chat/steer-cleanup.js.map +1 -0
- package/dist/chat/turn-classifier.d.ts +46 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -0
- package/dist/chat/turn-classifier.js +157 -0
- package/dist/chat/turn-classifier.js.map +1 -0
- package/dist/cli/commands/blackboard.d.ts +33 -0
- package/dist/cli/commands/blackboard.d.ts.map +1 -0
- package/dist/cli/commands/blackboard.js +114 -0
- package/dist/cli/commands/blackboard.js.map +1 -0
- package/dist/cli/commands/calendar.d.ts +75 -0
- package/dist/cli/commands/calendar.d.ts.map +1 -0
- package/dist/cli/commands/calendar.js +203 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +43 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/do.d.ts +52 -0
- package/dist/cli/commands/do.d.ts.map +1 -0
- package/dist/cli/commands/do.js +216 -0
- package/dist/cli/commands/do.js.map +1 -0
- package/dist/cli/commands/evolve.d.ts +18 -0
- package/dist/cli/commands/evolve.d.ts.map +1 -0
- package/dist/cli/commands/evolve.js +72 -0
- package/dist/cli/commands/evolve.js.map +1 -0
- package/dist/cli/commands/facts.d.ts +15 -0
- package/dist/cli/commands/facts.d.ts.map +1 -0
- package/dist/cli/commands/facts.js +213 -0
- package/dist/cli/commands/facts.js.map +1 -0
- package/dist/cli/commands/hub.d.ts +29 -0
- package/dist/cli/commands/hub.d.ts.map +1 -0
- package/dist/cli/commands/hub.js +233 -0
- package/dist/cli/commands/hub.js.map +1 -0
- package/dist/cli/commands/medical.d.ts +49 -0
- package/dist/cli/commands/medical.d.ts.map +1 -0
- package/dist/cli/commands/medical.js +365 -0
- package/dist/cli/commands/medical.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +2 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +94 -7
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +29 -3
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/replay.d.ts +17 -0
- package/dist/cli/commands/replay.d.ts.map +1 -0
- package/dist/cli/commands/replay.js +261 -0
- package/dist/cli/commands/replay.js.map +1 -0
- package/dist/cli/commands/research.d.ts +41 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +313 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +27 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/security-audit.d.ts +89 -0
- package/dist/cli/commands/security-audit.d.ts.map +1 -0
- package/dist/cli/commands/security-audit.js +238 -0
- package/dist/cli/commands/security-audit.js.map +1 -0
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +17 -3
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/task.d.ts +64 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +422 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +10 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +44 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +40 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +122 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.js +45 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +8 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/role-providers.d.ts +16 -1
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +14 -2
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +4050 -454
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +429 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +84 -84
- package/dist/contracts/spec.d.ts +28 -28
- package/dist/contracts/sprint-contract.d.ts +4 -4
- package/dist/do-bridge/coding-promoter.d.ts +19 -0
- package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
- package/dist/do-bridge/coding-promoter.js +43 -0
- package/dist/do-bridge/coding-promoter.js.map +1 -0
- package/dist/do-bridge/finding-port.d.ts +88 -0
- package/dist/do-bridge/finding-port.d.ts.map +1 -0
- package/dist/do-bridge/finding-port.js +95 -0
- package/dist/do-bridge/finding-port.js.map +1 -0
- package/dist/do-bridge/launcher.d.ts +55 -0
- package/dist/do-bridge/launcher.d.ts.map +1 -0
- package/dist/do-bridge/launcher.js +37 -0
- package/dist/do-bridge/launcher.js.map +1 -0
- package/dist/do-bridge/promote.d.ts +50 -0
- package/dist/do-bridge/promote.d.ts.map +1 -0
- package/dist/do-bridge/promote.js +116 -0
- package/dist/do-bridge/promote.js.map +1 -0
- package/dist/do-bridge/reconcile.d.ts +50 -0
- package/dist/do-bridge/reconcile.d.ts.map +1 -0
- package/dist/do-bridge/reconcile.js +70 -0
- package/dist/do-bridge/reconcile.js.map +1 -0
- package/dist/do-bridge/registry.d.ts +23 -0
- package/dist/do-bridge/registry.d.ts.map +1 -0
- package/dist/do-bridge/registry.js +42 -0
- package/dist/do-bridge/registry.js.map +1 -0
- package/dist/do-bridge/types.d.ts +50 -0
- package/dist/do-bridge/types.d.ts.map +1 -0
- package/dist/do-bridge/types.js +17 -0
- package/dist/do-bridge/types.js.map +1 -0
- package/dist/fleet/child-config.d.ts.map +1 -1
- package/dist/fleet/child-config.js +7 -0
- package/dist/fleet/child-config.js.map +1 -1
- package/dist/fleet/coordinator.d.ts +27 -1
- package/dist/fleet/coordinator.d.ts.map +1 -1
- package/dist/fleet/coordinator.js +70 -0
- package/dist/fleet/coordinator.js.map +1 -1
- package/dist/fleet/critic-deep.d.ts +61 -0
- package/dist/fleet/critic-deep.d.ts.map +1 -0
- package/dist/fleet/critic-deep.js +202 -0
- package/dist/fleet/critic-deep.js.map +1 -0
- package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
- package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-constants.js +14 -0
- package/dist/fleet/decomposer-deep-constants.js.map +1 -0
- package/dist/fleet/decomposer-deep-types.d.ts +8 -0
- package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-types.js +9 -0
- package/dist/fleet/decomposer-deep-types.js.map +1 -0
- package/dist/fleet/decomposer-deep.d.ts +44 -0
- package/dist/fleet/decomposer-deep.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep.js +261 -0
- package/dist/fleet/decomposer-deep.js.map +1 -0
- package/dist/fleet/decomposer.d.ts +22 -0
- package/dist/fleet/decomposer.d.ts.map +1 -0
- package/dist/fleet/decomposer.js +144 -0
- package/dist/fleet/decomposer.js.map +1 -0
- package/dist/fleet/index.d.ts +102 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +316 -9
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest-write.d.ts +30 -0
- package/dist/fleet/manifest-write.d.ts.map +1 -0
- package/dist/fleet/manifest-write.js +90 -0
- package/dist/fleet/manifest-write.js.map +1 -0
- package/dist/fleet/manifest.d.ts +32 -6
- package/dist/fleet/manifest.d.ts.map +1 -1
- package/dist/fleet/manifest.js +8 -0
- package/dist/fleet/manifest.js.map +1 -1
- package/dist/fleet/reporter.d.ts +4 -1
- package/dist/fleet/reporter.d.ts.map +1 -1
- package/dist/fleet/reporter.js +2 -1
- package/dist/fleet/reporter.js.map +1 -1
- package/dist/fleet/scaffolder.d.ts +5 -1
- package/dist/fleet/scaffolder.d.ts.map +1 -1
- package/dist/fleet/scaffolder.js +11 -2
- package/dist/fleet/scaffolder.js.map +1 -1
- package/dist/fleet/shared-blackboard.d.ts +51 -0
- package/dist/fleet/shared-blackboard.d.ts.map +1 -0
- package/dist/fleet/shared-blackboard.js +79 -0
- package/dist/fleet/shared-blackboard.js.map +1 -0
- package/dist/fleet/synthesis.d.ts +16 -0
- package/dist/fleet/synthesis.d.ts.map +1 -0
- package/dist/fleet/synthesis.js +22 -0
- package/dist/fleet/synthesis.js.map +1 -0
- package/dist/fleet/tier-policy.d.ts +18 -0
- package/dist/fleet/tier-policy.d.ts.map +1 -0
- package/dist/fleet/tier-policy.js +53 -0
- package/dist/fleet/tier-policy.js.map +1 -0
- package/dist/fleet/tool-role-guard.d.ts +24 -0
- package/dist/fleet/tool-role-guard.d.ts.map +1 -0
- package/dist/fleet/tool-role-guard.js +55 -0
- package/dist/fleet/tool-role-guard.js.map +1 -0
- package/dist/graph/client.d.ts.map +1 -1
- package/dist/graph/client.js +115 -23
- package/dist/graph/client.js.map +1 -1
- package/dist/graph/mcp-client.d.ts +1 -0
- package/dist/graph/mcp-client.d.ts.map +1 -1
- package/dist/graph/mcp-client.js +58 -7
- package/dist/graph/mcp-client.js.map +1 -1
- package/dist/hub/collector.d.ts +12 -0
- package/dist/hub/collector.d.ts.map +1 -0
- package/dist/hub/collector.js +36 -0
- package/dist/hub/collector.js.map +1 -0
- package/dist/hub/finding-source.d.ts +22 -0
- package/dist/hub/finding-source.d.ts.map +1 -0
- package/dist/hub/finding-source.js +41 -0
- package/dist/hub/finding-source.js.map +1 -0
- package/dist/hub/finding-store.d.ts +68 -0
- package/dist/hub/finding-store.d.ts.map +1 -0
- package/dist/hub/finding-store.js +122 -0
- package/dist/hub/finding-store.js.map +1 -0
- package/dist/hub/finding.d.ts +54 -0
- package/dist/hub/finding.d.ts.map +1 -0
- package/dist/hub/finding.js +24 -0
- package/dist/hub/finding.js.map +1 -0
- package/dist/hub/gmail-to-task.d.ts +69 -0
- package/dist/hub/gmail-to-task.d.ts.map +1 -0
- package/dist/hub/gmail-to-task.js +102 -0
- package/dist/hub/gmail-to-task.js.map +1 -0
- package/dist/hub/hub-config.d.ts +18 -0
- package/dist/hub/hub-config.d.ts.map +1 -0
- package/dist/hub/hub-config.js +40 -0
- package/dist/hub/hub-config.js.map +1 -0
- package/dist/hub/judge.d.ts +30 -0
- package/dist/hub/judge.d.ts.map +1 -0
- package/dist/hub/judge.js +177 -0
- package/dist/hub/judge.js.map +1 -0
- package/dist/hub/lenses.d.ts +60 -0
- package/dist/hub/lenses.d.ts.map +1 -0
- package/dist/hub/lenses.js +123 -0
- package/dist/hub/lenses.js.map +1 -0
- package/dist/hub/priority-md.d.ts +21 -0
- package/dist/hub/priority-md.d.ts.map +1 -0
- package/dist/hub/priority-md.js +64 -0
- package/dist/hub/priority-md.js.map +1 -0
- package/dist/hub/repo-resolver.d.ts +11 -0
- package/dist/hub/repo-resolver.d.ts.map +1 -0
- package/dist/hub/repo-resolver.js +39 -0
- package/dist/hub/repo-resolver.js.map +1 -0
- package/dist/hub/scope.d.ts +39 -0
- package/dist/hub/scope.d.ts.map +1 -0
- package/dist/hub/scope.js +62 -0
- package/dist/hub/scope.js.map +1 -0
- package/dist/hub/task-inbox.d.ts +16 -0
- package/dist/hub/task-inbox.d.ts.map +1 -0
- package/dist/hub/task-inbox.js +39 -0
- package/dist/hub/task-inbox.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +2 -2
- package/dist/incident/types.d.ts +8 -8
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/run-manager.d.ts +9 -1
- package/dist/mcp/run-manager.d.ts.map +1 -1
- package/dist/mcp/run-manager.js.map +1 -1
- package/dist/medical/adapters/apple-health.d.ts +32 -0
- package/dist/medical/adapters/apple-health.d.ts.map +1 -0
- package/dist/medical/adapters/apple-health.js +100 -0
- package/dist/medical/adapters/apple-health.js.map +1 -0
- package/dist/medical/analysis/cadence.d.ts +32 -0
- package/dist/medical/analysis/cadence.d.ts.map +1 -0
- package/dist/medical/analysis/cadence.js +72 -0
- package/dist/medical/analysis/cadence.js.map +1 -0
- package/dist/medical/analysis/cross-marker.d.ts +33 -0
- package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
- package/dist/medical/analysis/cross-marker.js +79 -0
- package/dist/medical/analysis/cross-marker.js.map +1 -0
- package/dist/medical/analysis/finding-writer.d.ts +26 -0
- package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
- package/dist/medical/analysis/finding-writer.js +60 -0
- package/dist/medical/analysis/finding-writer.js.map +1 -0
- package/dist/medical/analysis/finding.d.ts +63 -0
- package/dist/medical/analysis/finding.d.ts.map +1 -0
- package/dist/medical/analysis/finding.js +70 -0
- package/dist/medical/analysis/finding.js.map +1 -0
- package/dist/medical/analysis/review-pass.d.ts +76 -0
- package/dist/medical/analysis/review-pass.d.ts.map +1 -0
- package/dist/medical/analysis/review-pass.js +119 -0
- package/dist/medical/analysis/review-pass.js.map +1 -0
- package/dist/medical/analysis/trends.d.ts +36 -0
- package/dist/medical/analysis/trends.d.ts.map +1 -0
- package/dist/medical/analysis/trends.js +157 -0
- package/dist/medical/analysis/trends.js.map +1 -0
- package/dist/medical/audit.d.ts +31 -0
- package/dist/medical/audit.d.ts.map +1 -0
- package/dist/medical/audit.js +56 -0
- package/dist/medical/audit.js.map +1 -0
- package/dist/medical/consent.d.ts +37 -0
- package/dist/medical/consent.d.ts.map +1 -0
- package/dist/medical/consent.js +73 -0
- package/dist/medical/consent.js.map +1 -0
- package/dist/medical/disclaimer.d.ts +11 -0
- package/dist/medical/disclaimer.d.ts.map +1 -0
- package/dist/medical/disclaimer.js +21 -0
- package/dist/medical/disclaimer.js.map +1 -0
- package/dist/medical/egress.d.ts +30 -0
- package/dist/medical/egress.d.ts.map +1 -0
- package/dist/medical/egress.js +50 -0
- package/dist/medical/egress.js.map +1 -0
- package/dist/medical/engine.d.ts +73 -0
- package/dist/medical/engine.d.ts.map +1 -0
- package/dist/medical/engine.js +333 -0
- package/dist/medical/engine.js.map +1 -0
- package/dist/medical/guardrails.d.ts +47 -0
- package/dist/medical/guardrails.d.ts.map +1 -0
- package/dist/medical/guardrails.js +92 -0
- package/dist/medical/guardrails.js.map +1 -0
- package/dist/medical/health-store.d.ts +85 -0
- package/dist/medical/health-store.d.ts.map +1 -0
- package/dist/medical/health-store.js +214 -0
- package/dist/medical/health-store.js.map +1 -0
- package/dist/medical/inference.d.ts +22 -0
- package/dist/medical/inference.d.ts.map +1 -0
- package/dist/medical/inference.js +39 -0
- package/dist/medical/inference.js.map +1 -0
- package/dist/medical/ingestion.d.ts +33 -0
- package/dist/medical/ingestion.d.ts.map +1 -0
- package/dist/medical/ingestion.js +52 -0
- package/dist/medical/ingestion.js.map +1 -0
- package/dist/medical/lab-note.d.ts +72 -0
- package/dist/medical/lab-note.d.ts.map +1 -0
- package/dist/medical/lab-note.js +161 -0
- package/dist/medical/lab-note.js.map +1 -0
- package/dist/medical/lab-pdf-parser.d.ts +19 -0
- package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
- package/dist/medical/lab-pdf-parser.js +57 -0
- package/dist/medical/lab-pdf-parser.js.map +1 -0
- package/dist/medical/lab-reindex.d.ts +24 -0
- package/dist/medical/lab-reindex.d.ts.map +1 -0
- package/dist/medical/lab-reindex.js +45 -0
- package/dist/medical/lab-reindex.js.map +1 -0
- package/dist/medical/lab-types.d.ts +75 -0
- package/dist/medical/lab-types.d.ts.map +1 -0
- package/dist/medical/lab-types.js +17 -0
- package/dist/medical/lab-types.js.map +1 -0
- package/dist/medical/numerics.d.ts +66 -0
- package/dist/medical/numerics.d.ts.map +1 -0
- package/dist/medical/numerics.js +216 -0
- package/dist/medical/numerics.js.map +1 -0
- package/dist/medical/profile.d.ts +96 -0
- package/dist/medical/profile.d.ts.map +1 -0
- package/dist/medical/profile.js +273 -0
- package/dist/medical/profile.js.map +1 -0
- package/dist/medical/recommend/context.d.ts +48 -0
- package/dist/medical/recommend/context.d.ts.map +1 -0
- package/dist/medical/recommend/context.js +109 -0
- package/dist/medical/recommend/context.js.map +1 -0
- package/dist/medical/recommend/judge-panel.d.ts +49 -0
- package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
- package/dist/medical/recommend/judge-panel.js +164 -0
- package/dist/medical/recommend/judge-panel.js.map +1 -0
- package/dist/medical/recommend/lenses.d.ts +72 -0
- package/dist/medical/recommend/lenses.d.ts.map +1 -0
- package/dist/medical/recommend/lenses.js +220 -0
- package/dist/medical/recommend/lenses.js.map +1 -0
- package/dist/medical/recommend/recommend.d.ts +86 -0
- package/dist/medical/recommend/recommend.d.ts.map +1 -0
- package/dist/medical/recommend/recommend.js +211 -0
- package/dist/medical/recommend/recommend.js.map +1 -0
- package/dist/medical/recommend/types.d.ts +98 -0
- package/dist/medical/recommend/types.d.ts.map +1 -0
- package/dist/medical/recommend/types.js +20 -0
- package/dist/medical/recommend/types.js.map +1 -0
- package/dist/medical/recommend/urgency.d.ts +26 -0
- package/dist/medical/recommend/urgency.d.ts.map +1 -0
- package/dist/medical/recommend/urgency.js +124 -0
- package/dist/medical/recommend/urgency.js.map +1 -0
- package/dist/medical/red-flag.d.ts +42 -0
- package/dist/medical/red-flag.d.ts.map +1 -0
- package/dist/medical/red-flag.js +161 -0
- package/dist/medical/red-flag.js.map +1 -0
- package/dist/medical/refusal.d.ts +46 -0
- package/dist/medical/refusal.d.ts.map +1 -0
- package/dist/medical/refusal.js +131 -0
- package/dist/medical/refusal.js.map +1 -0
- package/dist/medical/research/online-research.d.ts +65 -0
- package/dist/medical/research/online-research.d.ts.map +1 -0
- package/dist/medical/research/online-research.js +101 -0
- package/dist/medical/research/online-research.js.map +1 -0
- package/dist/medical/research/research-note.d.ts +32 -0
- package/dist/medical/research/research-note.d.ts.map +1 -0
- package/dist/medical/research/research-note.js +55 -0
- package/dist/medical/research/research-note.js.map +1 -0
- package/dist/medical/retrieval/grounding-critic.d.ts +34 -0
- package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
- package/dist/medical/retrieval/grounding-critic.js +153 -0
- package/dist/medical/retrieval/grounding-critic.js.map +1 -0
- package/dist/medical/retrieval/literature.d.ts +78 -0
- package/dist/medical/retrieval/literature.d.ts.map +1 -0
- package/dist/medical/retrieval/literature.js +292 -0
- package/dist/medical/retrieval/literature.js.map +1 -0
- package/dist/medical/retrieval/medline-source.d.ts +72 -0
- package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
- package/dist/medical/retrieval/medline-source.js +120 -0
- package/dist/medical/retrieval/medline-source.js.map +1 -0
- package/dist/medical/supplements.d.ts +82 -0
- package/dist/medical/supplements.d.ts.map +1 -0
- package/dist/medical/supplements.js +173 -0
- package/dist/medical/supplements.js.map +1 -0
- package/dist/medical/team.d.ts +15 -0
- package/dist/medical/team.d.ts.map +1 -0
- package/dist/medical/team.js +44 -0
- package/dist/medical/team.js.map +1 -0
- package/dist/medical/types.d.ts +175 -0
- package/dist/medical/types.d.ts.map +1 -0
- package/dist/medical/types.js +8 -0
- package/dist/medical/types.js.map +1 -0
- package/dist/medical/whoop/whoop-client.d.ts +114 -0
- package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-client.js +226 -0
- package/dist/medical/whoop/whoop-client.js.map +1 -0
- package/dist/medical/whoop/whoop-sync.d.ts +25 -0
- package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-sync.js +97 -0
- package/dist/medical/whoop/whoop-sync.js.map +1 -0
- package/dist/medical/whoop/whoop-token.d.ts +44 -0
- package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-token.js +66 -0
- package/dist/medical/whoop/whoop-token.js.map +1 -0
- package/dist/orchestrator/agentic-loop.d.ts +160 -1
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +350 -41
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/compaction.d.ts +47 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +75 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/context-handoff.d.ts +60 -60
- package/dist/orchestrator/contract-materialization.d.ts +33 -0
- package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
- package/dist/orchestrator/contract-materialization.js +113 -0
- package/dist/orchestrator/contract-materialization.js.map +1 -0
- package/dist/orchestrator/generator-agent.d.ts +19 -0
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +27 -1
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/loop-events.d.ts +98 -0
- package/dist/orchestrator/loop-events.d.ts.map +1 -0
- package/dist/orchestrator/loop-events.js +2 -0
- package/dist/orchestrator/loop-events.js.map +1 -0
- package/dist/orchestrator/memory/distill.d.ts +4 -1
- package/dist/orchestrator/memory/distill.d.ts.map +1 -1
- package/dist/orchestrator/memory/distill.js +41 -1
- package/dist/orchestrator/memory/distill.js.map +1 -1
- package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
- package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-detector.js +153 -0
- package/dist/orchestrator/memory/fact-detector.js.map +1 -0
- package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
- package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-judge.js +121 -0
- package/dist/orchestrator/memory/fact-judge.js.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.js +117 -0
- package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
- package/dist/orchestrator/memory/hygiene.d.ts +66 -0
- package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
- package/dist/orchestrator/memory/hygiene.js +153 -0
- package/dist/orchestrator/memory/hygiene.js.map +1 -0
- package/dist/orchestrator/memory/reconcile.d.ts +47 -0
- package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
- package/dist/orchestrator/memory/reconcile.js +116 -0
- package/dist/orchestrator/memory/reconcile.js.map +1 -0
- package/dist/orchestrator/memory/retrieve.d.ts +5 -3
- package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
- package/dist/orchestrator/memory/retrieve.js +9 -6
- package/dist/orchestrator/memory/retrieve.js.map +1 -1
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +10 -6
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +29 -4
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +165 -56
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +16 -1
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/orchestrator/security-audit-types.d.ts +53 -0
- package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
- package/dist/orchestrator/security-audit-types.js +10 -0
- package/dist/orchestrator/security-audit-types.js.map +1 -0
- package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
- package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-auditor-agent.js +482 -0
- package/dist/orchestrator/security-auditor-agent.js.map +1 -0
- package/dist/orchestrator/security-gate.d.ts +73 -0
- package/dist/orchestrator/security-gate.d.ts.map +1 -0
- package/dist/orchestrator/security-gate.js +174 -0
- package/dist/orchestrator/security-gate.js.map +1 -0
- package/dist/orchestrator/security-hub.d.ts +45 -0
- package/dist/orchestrator/security-hub.d.ts.map +1 -0
- package/dist/orchestrator/security-hub.js +147 -0
- package/dist/orchestrator/security-hub.js.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
- package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
- package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/index.js +66 -0
- package/dist/orchestrator/security-knowledge/index.js.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.js +137 -0
- package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.js +114 -0
- package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.js +63 -0
- package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.js +46 -0
- package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.js +2 -0
- package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
- package/dist/orchestrator/security-scanners.d.ts +126 -0
- package/dist/orchestrator/security-scanners.d.ts.map +1 -0
- package/dist/orchestrator/security-scanners.js +501 -0
- package/dist/orchestrator/security-scanners.js.map +1 -0
- package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
- package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-verifier-agent.js +230 -0
- package/dist/orchestrator/security-verifier-agent.js.map +1 -0
- package/dist/orchestrator/selfimprove/eval-guards.d.ts +51 -0
- package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
- package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.js +227 -0
- package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
- package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.js +119 -0
- package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.js +15 -0
- package/dist/orchestrator/selfimprove/replay-types.js.map +1 -0
- package/dist/orchestrator/session-store.d.ts +95 -0
- package/dist/orchestrator/session-store.d.ts.map +1 -0
- package/dist/orchestrator/session-store.js +186 -0
- package/dist/orchestrator/session-store.js.map +1 -0
- package/dist/orchestrator/stack-knowledge.d.ts +17 -0
- package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
- package/dist/orchestrator/stack-knowledge.js +35 -0
- package/dist/orchestrator/stack-knowledge.js.map +1 -0
- package/dist/orchestrator/subagents.d.ts +62 -0
- package/dist/orchestrator/subagents.d.ts.map +1 -0
- package/dist/orchestrator/subagents.js +143 -0
- package/dist/orchestrator/subagents.js.map +1 -0
- package/dist/orchestrator/tools/executor.d.ts +68 -0
- package/dist/orchestrator/tools/executor.d.ts.map +1 -0
- package/dist/orchestrator/tools/executor.js +104 -0
- package/dist/orchestrator/tools/executor.js.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.js +154 -0
- package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
- package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
- package/dist/orchestrator/tools/schemas.js +3 -0
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/budget.d.ts +24 -2
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
- package/dist/orchestrator/workflow/budget.js +39 -1
- package/dist/orchestrator/workflow/budget.js.map +1 -1
- package/dist/orchestrator/workflow/engine.d.ts +4 -2
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts +18 -0
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +51 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.js +2 -2
- package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.js +3 -3
- package/dist/orchestrator/workflow/workflow-engine.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +116 -26
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts.map +1 -1
- package/dist/providers/claude-code.js +17 -0
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/cost-meter.d.ts +52 -0
- package/dist/providers/cost-meter.d.ts.map +1 -0
- package/dist/providers/cost-meter.js +81 -0
- package/dist/providers/cost-meter.js.map +1 -0
- package/dist/providers/factory.d.ts +6 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +24 -5
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +29 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/grounded-search.d.ts +128 -0
- package/dist/providers/grounded-search.d.ts.map +1 -0
- package/dist/providers/grounded-search.js +160 -0
- package/dist/providers/grounded-search.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +15 -1
- package/dist/providers/openai-compat.d.ts.map +1 -1
- package/dist/providers/openai-compat.js +24 -0
- package/dist/providers/openai-compat.js.map +1 -1
- package/dist/providers/openai.d.ts +7 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +95 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +88 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/research/cadence.d.ts +33 -0
- package/dist/research/cadence.d.ts.map +1 -0
- package/dist/research/cadence.js +55 -0
- package/dist/research/cadence.js.map +1 -0
- package/dist/research/digest.d.ts +80 -0
- package/dist/research/digest.d.ts.map +1 -0
- package/dist/research/digest.js +119 -0
- package/dist/research/digest.js.map +1 -0
- package/dist/research/egress.d.ts +28 -0
- package/dist/research/egress.d.ts.map +1 -0
- package/dist/research/egress.js +41 -0
- package/dist/research/egress.js.map +1 -0
- package/dist/research/job-store.d.ts +30 -0
- package/dist/research/job-store.d.ts.map +1 -0
- package/dist/research/job-store.js +100 -0
- package/dist/research/job-store.js.map +1 -0
- package/dist/research/model-diversity.d.ts +27 -0
- package/dist/research/model-diversity.d.ts.map +1 -0
- package/dist/research/model-diversity.js +52 -0
- package/dist/research/model-diversity.js.map +1 -0
- package/dist/research/note-writer.d.ts +36 -0
- package/dist/research/note-writer.d.ts.map +1 -0
- package/dist/research/note-writer.js +53 -0
- package/dist/research/note-writer.js.map +1 -0
- package/dist/research/online-retrieval.d.ts +27 -0
- package/dist/research/online-retrieval.d.ts.map +1 -0
- package/dist/research/online-retrieval.js +22 -0
- package/dist/research/online-retrieval.js.map +1 -0
- package/dist/research/runner.d.ts +80 -0
- package/dist/research/runner.d.ts.map +1 -0
- package/dist/research/runner.js +115 -0
- package/dist/research/runner.js.map +1 -0
- package/dist/research/scheduler.d.ts +61 -0
- package/dist/research/scheduler.d.ts.map +1 -0
- package/dist/research/scheduler.js +58 -0
- package/dist/research/scheduler.js.map +1 -0
- package/dist/research/types.d.ts +81 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +57 -0
- package/dist/research/types.js.map +1 -0
- package/dist/seo/adapters/http.d.ts +43 -0
- package/dist/seo/adapters/http.d.ts.map +1 -0
- package/dist/seo/adapters/http.js +35 -0
- package/dist/seo/adapters/http.js.map +1 -0
- package/dist/seo/ai-visibility-provider.d.ts +171 -0
- package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
- package/dist/seo/ai-visibility-provider.js +165 -0
- package/dist/seo/ai-visibility-provider.js.map +1 -0
- package/dist/seo/ai-visibility-scorer.d.ts +43 -0
- package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
- package/dist/seo/ai-visibility-scorer.js +102 -0
- package/dist/seo/ai-visibility-scorer.js.map +1 -0
- package/dist/seo/analyzer.d.ts +58 -0
- package/dist/seo/analyzer.d.ts.map +1 -0
- package/dist/seo/analyzer.js +265 -0
- package/dist/seo/analyzer.js.map +1 -0
- package/dist/seo/benchmark/harness.d.ts +56 -0
- package/dist/seo/benchmark/harness.d.ts.map +1 -0
- package/dist/seo/benchmark/harness.js +172 -0
- package/dist/seo/benchmark/harness.js.map +1 -0
- package/dist/seo/builder/approved-finding.d.ts +115 -0
- package/dist/seo/builder/approved-finding.d.ts.map +1 -0
- package/dist/seo/builder/approved-finding.js +145 -0
- package/dist/seo/builder/approved-finding.js.map +1 -0
- package/dist/seo/builder/build-runner.d.ts +41 -0
- package/dist/seo/builder/build-runner.d.ts.map +1 -0
- package/dist/seo/builder/build-runner.js +156 -0
- package/dist/seo/builder/build-runner.js.map +1 -0
- package/dist/seo/builder/draft-generators.d.ts +32 -0
- package/dist/seo/builder/draft-generators.d.ts.map +1 -0
- package/dist/seo/builder/draft-generators.js +31 -0
- package/dist/seo/builder/draft-generators.js.map +1 -0
- package/dist/seo/builder/draft-store.d.ts +30 -0
- package/dist/seo/builder/draft-store.d.ts.map +1 -0
- package/dist/seo/builder/draft-store.js +76 -0
- package/dist/seo/builder/draft-store.js.map +1 -0
- package/dist/seo/builder/draft-types.d.ts +36 -0
- package/dist/seo/builder/draft-types.d.ts.map +1 -0
- package/dist/seo/builder/draft-types.js +14 -0
- package/dist/seo/builder/draft-types.js.map +1 -0
- package/dist/seo/builder/hub-approved-source.d.ts +11 -0
- package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
- package/dist/seo/builder/hub-approved-source.js +48 -0
- package/dist/seo/builder/hub-approved-source.js.map +1 -0
- package/dist/seo/builder/seo-builder.d.ts +72 -0
- package/dist/seo/builder/seo-builder.d.ts.map +1 -0
- package/dist/seo/builder/seo-builder.js +72 -0
- package/dist/seo/builder/seo-builder.js.map +1 -0
- package/dist/seo/citation-gate.d.ts +36 -0
- package/dist/seo/citation-gate.d.ts.map +1 -0
- package/dist/seo/citation-gate.js +59 -0
- package/dist/seo/citation-gate.js.map +1 -0
- package/dist/seo/command.d.ts +11 -0
- package/dist/seo/command.d.ts.map +1 -0
- package/dist/seo/command.js +90 -0
- package/dist/seo/command.js.map +1 -0
- package/dist/seo/content-sanitizer.d.ts +56 -0
- package/dist/seo/content-sanitizer.d.ts.map +1 -0
- package/dist/seo/content-sanitizer.js +55 -0
- package/dist/seo/content-sanitizer.js.map +1 -0
- package/dist/seo/crawl-engine.d.ts +35 -0
- package/dist/seo/crawl-engine.d.ts.map +1 -0
- package/dist/seo/crawl-engine.js +2 -0
- package/dist/seo/crawl-engine.js.map +1 -0
- package/dist/seo/data-source.d.ts +156 -0
- package/dist/seo/data-source.d.ts.map +1 -0
- package/dist/seo/data-source.js +2 -0
- package/dist/seo/data-source.js.map +1 -0
- package/dist/seo/egress.d.ts +39 -0
- package/dist/seo/egress.d.ts.map +1 -0
- package/dist/seo/egress.js +64 -0
- package/dist/seo/egress.js.map +1 -0
- package/dist/seo/hub-emitter.d.ts +28 -0
- package/dist/seo/hub-emitter.d.ts.map +1 -0
- package/dist/seo/hub-emitter.js +95 -0
- package/dist/seo/hub-emitter.js.map +1 -0
- package/dist/seo/index.d.ts +42 -0
- package/dist/seo/index.d.ts.map +1 -0
- package/dist/seo/index.js +19 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/never-encode-filter.d.ts +45 -0
- package/dist/seo/never-encode-filter.d.ts.map +1 -0
- package/dist/seo/never-encode-filter.js +51 -0
- package/dist/seo/never-encode-filter.js.map +1 -0
- package/dist/seo/parser.d.ts +46 -0
- package/dist/seo/parser.d.ts.map +1 -0
- package/dist/seo/parser.js +113 -0
- package/dist/seo/parser.js.map +1 -0
- package/dist/seo/playbook-index.d.ts +19 -0
- package/dist/seo/playbook-index.d.ts.map +1 -0
- package/dist/seo/playbook-index.js +74 -0
- package/dist/seo/playbook-index.js.map +1 -0
- package/dist/seo/quota-governor.d.ts +100 -0
- package/dist/seo/quota-governor.d.ts.map +1 -0
- package/dist/seo/quota-governor.js +199 -0
- package/dist/seo/quota-governor.js.map +1 -0
- package/dist/seo/quota-ledger.d.ts +50 -0
- package/dist/seo/quota-ledger.d.ts.map +1 -0
- package/dist/seo/quota-ledger.js +95 -0
- package/dist/seo/quota-ledger.js.map +1 -0
- package/dist/seo/report-store.d.ts +30 -0
- package/dist/seo/report-store.d.ts.map +1 -0
- package/dist/seo/report-store.js +94 -0
- package/dist/seo/report-store.js.map +1 -0
- package/dist/seo/retriever.d.ts +34 -0
- package/dist/seo/retriever.d.ts.map +1 -0
- package/dist/seo/retriever.js +95 -0
- package/dist/seo/retriever.js.map +1 -0
- package/dist/seo/runner.d.ts +108 -0
- package/dist/seo/runner.d.ts.map +1 -0
- package/dist/seo/runner.js +512 -0
- package/dist/seo/runner.js.map +1 -0
- package/dist/seo/scrape-throttle.d.ts +84 -0
- package/dist/seo/scrape-throttle.d.ts.map +1 -0
- package/dist/seo/scrape-throttle.js +149 -0
- package/dist/seo/scrape-throttle.js.map +1 -0
- package/dist/seo/serp-provider.d.ts +52 -0
- package/dist/seo/serp-provider.d.ts.map +1 -0
- package/dist/seo/serp-provider.js +17 -0
- package/dist/seo/serp-provider.js.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.js +85 -0
- package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
- package/dist/seo/sources/api-spine-provider.d.ts +66 -0
- package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
- package/dist/seo/sources/api-spine-provider.js +68 -0
- package/dist/seo/sources/api-spine-provider.js.map +1 -0
- package/dist/seo/sources/citation-verifier.d.ts +95 -0
- package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
- package/dist/seo/sources/citation-verifier.js +106 -0
- package/dist/seo/sources/citation-verifier.js.map +1 -0
- package/dist/seo/sources/crawl-source.d.ts +62 -0
- package/dist/seo/sources/crawl-source.d.ts.map +1 -0
- package/dist/seo/sources/crawl-source.js +87 -0
- package/dist/seo/sources/crawl-source.js.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
- package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.js +335 -0
- package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
- package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
- package/dist/seo/sources/gsc-adapter.d.ts +64 -0
- package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
- package/dist/seo/sources/gsc-adapter.js +221 -0
- package/dist/seo/sources/gsc-adapter.js.map +1 -0
- package/dist/seo/sources/local-export.d.ts +53 -0
- package/dist/seo/sources/local-export.d.ts.map +1 -0
- package/dist/seo/sources/local-export.js +307 -0
- package/dist/seo/sources/local-export.js.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.js +272 -0
- package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.js +129 -0
- package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
- package/dist/seo/tracked-prompt-store.d.ts +33 -0
- package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
- package/dist/seo/tracked-prompt-store.js +68 -0
- package/dist/seo/tracked-prompt-store.js.map +1 -0
- package/dist/seo/types.d.ts +128 -0
- package/dist/seo/types.d.ts.map +1 -0
- package/dist/seo/types.js +14 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/seo/verifier.d.ts +34 -0
- package/dist/seo/verifier.d.ts.map +1 -0
- package/dist/seo/verifier.js +204 -0
- package/dist/seo/verifier.js.map +1 -0
- package/dist/seo/workflow-capabilities.d.ts +26 -0
- package/dist/seo/workflow-capabilities.d.ts.map +1 -0
- package/dist/seo/workflow-capabilities.js +12 -0
- package/dist/seo/workflow-capabilities.js.map +1 -0
- package/dist/state/facts.d.ts +114 -0
- package/dist/state/facts.d.ts.map +1 -0
- package/dist/state/facts.js +218 -0
- package/dist/state/facts.js.map +1 -0
- package/dist/state/guidance.d.ts +37 -0
- package/dist/state/guidance.d.ts.map +1 -0
- package/dist/state/guidance.js +144 -0
- package/dist/state/guidance.js.map +1 -0
- package/dist/state/history.d.ts +2 -2
- package/dist/state/index.d.ts +2 -2
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +2 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/memory.d.ts +43 -11
- package/dist/state/memory.d.ts.map +1 -1
- package/dist/state/memory.js +93 -15
- package/dist/state/memory.js.map +1 -1
- package/dist/state/outline-state.d.ts +0 -12
- package/dist/state/outline-state.d.ts.map +1 -1
- package/dist/state/outline-state.js +1 -18
- package/dist/state/outline-state.js.map +1 -1
- package/dist/state/pause.d.ts +47 -0
- package/dist/state/pause.d.ts.map +1 -0
- package/dist/state/pause.js +146 -0
- package/dist/state/pause.js.map +1 -0
- package/dist/state/security-audit-state.d.ts +20 -0
- package/dist/state/security-audit-state.d.ts.map +1 -0
- package/dist/state/security-audit-state.js +59 -0
- package/dist/state/security-audit-state.js.map +1 -0
- package/dist/state/sprint-state.d.ts +8 -0
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +32 -1
- package/dist/state/sprint-state.js.map +1 -1
- package/dist/teams/registry.d.ts +16 -0
- package/dist/teams/registry.d.ts.map +1 -0
- package/dist/teams/registry.js +70 -0
- package/dist/teams/registry.js.map +1 -0
- package/dist/teams/types.d.ts +25 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +2 -0
- package/dist/teams/types.js.map +1 -0
- package/dist/telegram/bot.d.ts +137 -0
- package/dist/telegram/bot.d.ts.map +1 -0
- package/dist/telegram/bot.js +323 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/telegram/digest.d.ts +19 -0
- package/dist/telegram/digest.d.ts.map +1 -0
- package/dist/telegram/digest.js +23 -0
- package/dist/telegram/digest.js.map +1 -0
- package/dist/telegram/fleet-view.d.ts +38 -0
- package/dist/telegram/fleet-view.d.ts.map +1 -0
- package/dist/telegram/fleet-view.js +98 -0
- package/dist/telegram/fleet-view.js.map +1 -0
- package/dist/telegram/handlers/approvals.d.ts +61 -0
- package/dist/telegram/handlers/approvals.d.ts.map +1 -0
- package/dist/telegram/handlers/approvals.js +122 -0
- package/dist/telegram/handlers/approvals.js.map +1 -0
- package/dist/telegram/handlers/capture.d.ts +43 -0
- package/dist/telegram/handlers/capture.d.ts.map +1 -0
- package/dist/telegram/handlers/capture.js +51 -0
- package/dist/telegram/handlers/capture.js.map +1 -0
- package/dist/telegram/handlers/prioritize.d.ts +50 -0
- package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
- package/dist/telegram/handlers/prioritize.js +99 -0
- package/dist/telegram/handlers/prioritize.js.map +1 -0
- package/dist/telegram/handlers/upload.d.ts +105 -0
- package/dist/telegram/handlers/upload.d.ts.map +1 -0
- package/dist/telegram/handlers/upload.js +149 -0
- package/dist/telegram/handlers/upload.js.map +1 -0
- package/dist/telegram/keyboard.d.ts +48 -0
- package/dist/telegram/keyboard.d.ts.map +1 -0
- package/dist/telegram/keyboard.js +81 -0
- package/dist/telegram/keyboard.js.map +1 -0
- package/dist/telegram/outbound.d.ts +77 -0
- package/dist/telegram/outbound.d.ts.map +1 -0
- package/dist/telegram/outbound.js +45 -0
- package/dist/telegram/outbound.js.map +1 -0
- package/dist/telegram/router.d.ts +46 -0
- package/dist/telegram/router.d.ts.map +1 -0
- package/dist/telegram/router.js +63 -0
- package/dist/telegram/router.js.map +1 -0
- package/dist/telegram/streaming.d.ts +36 -0
- package/dist/telegram/streaming.d.ts.map +1 -0
- package/dist/telegram/streaming.js +55 -0
- package/dist/telegram/streaming.js.map +1 -0
- package/dist/telegram/whitelist.d.ts +20 -0
- package/dist/telegram/whitelist.d.ts.map +1 -0
- package/dist/telegram/whitelist.js +34 -0
- package/dist/telegram/whitelist.js.map +1 -0
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +0 -19
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/vault/conventions.d.ts +23 -0
- package/dist/vault/conventions.d.ts.map +1 -0
- package/dist/vault/conventions.js +22 -0
- package/dist/vault/conventions.js.map +1 -0
- package/dist/vault/frontmatter.d.ts +47 -0
- package/dist/vault/frontmatter.d.ts.map +1 -0
- package/dist/vault/frontmatter.js +149 -0
- package/dist/vault/frontmatter.js.map +1 -0
- package/dist/vault/index-map.d.ts +35 -0
- package/dist/vault/index-map.d.ts.map +1 -0
- package/dist/vault/index-map.js +67 -0
- package/dist/vault/index-map.js.map +1 -0
- package/dist/vault/mcp-adapter.d.ts +96 -0
- package/dist/vault/mcp-adapter.d.ts.map +1 -0
- package/dist/vault/mcp-adapter.js +176 -0
- package/dist/vault/mcp-adapter.js.map +1 -0
- package/dist/vault/note-io.d.ts +29 -0
- package/dist/vault/note-io.d.ts.map +1 -0
- package/dist/vault/note-io.js +44 -0
- package/dist/vault/note-io.js.map +1 -0
- package/dist/vault/profile.d.ts +35 -0
- package/dist/vault/profile.d.ts.map +1 -0
- package/dist/vault/profile.js +50 -0
- package/dist/vault/profile.js.map +1 -0
- package/dist/vault/reindex.d.ts +55 -0
- package/dist/vault/reindex.d.ts.map +1 -0
- package/dist/vault/reindex.js +69 -0
- package/dist/vault/reindex.js.map +1 -0
- package/dist/vault/types.d.ts +25 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +9 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +22 -4
- package/scripts/sync-targets.json +2 -1
- package/skills/bober.design/SKILL.md +190 -0
- package/skills/bober.design/references/1-anti-slop.md +102 -0
- package/skills/bober.design/references/2-design-brief.md +84 -0
- package/skills/bober.design/references/3-critique-rubric.md +62 -0
- package/skills/bober.design/references/4-copy-guide.md +43 -0
- package/skills/bober.plan/SKILL.md +15 -1
- package/skills/bober.run/SKILL.md +7 -4
- package/skills/bober.security-anchor/SKILL.md +172 -0
- package/skills/bober.security-audit/SKILL.md +288 -0
- package/skills/bober.security-dex-backend/SKILL.md +306 -0
- package/skills/bober.security-generic/SKILL.md +295 -0
- package/skills/bober.security-igaming/SKILL.md +290 -0
- package/skills/bober.security-node/SKILL.md +267 -0
- package/skills/bober.security-payments/SKILL.md +249 -0
- package/skills/bober.security-react/SKILL.md +194 -0
- package/skills/bober.security-solidity/SKILL.md +306 -0
- package/skills/bober.seo/SKILL.md +132 -0
- package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
- package/skills/bober.seo-content-decay/SKILL.md +99 -0
- package/skills/bober.seo-generic/SKILL.md +173 -0
- package/skills/bober.seo-internal-linking/SKILL.md +87 -0
- package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
- package/skills/bober.seo-rank-track/SKILL.md +98 -0
- package/skills/bober.seo-schema-audit/SKILL.md +97 -0
- package/skills/bober.seo-technical-audit/SKILL.md +113 -0
- package/skills/bober.seo-topical-map/SKILL.md +100 -0
- package/skills/bober.seo-verticals/SKILL.md +133 -0
- package/skills/bober.using-bober/SKILL.md +1 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober.security-solidity
|
|
3
|
+
description: "Solidity/EVM smart-contract security signature library. Not a workflow skill -- a data file of discrete vulnerable/safe code signature blocks read by SecuritySignatureParser. Covers reentrancy (single-function, cross-function, read-only), spot-price oracle manipulation, missing access control, unprotected initializers, unchecked arithmetic, ERC-4626 inflation, unsafe ERC20, tx.origin auth, missing slippage/deadline, DoS via unbounded loops, and signature replay."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bober.security-solidity — Solidity/EVM Security Signature Library
|
|
7
|
+
|
|
8
|
+
This skill is a **signature-library** file, not a workflow skill. It is read (as raw
|
|
9
|
+
markdown text) by `SecuritySignatureParser.parse()`
|
|
10
|
+
(`src/orchestrator/security-knowledge/parser.ts`) and turned into typed
|
|
11
|
+
`SecuritySignature[]` records used by the security-audit agent team. Do not confuse this
|
|
12
|
+
with `bober.solidity`, which is the general Solidity development skill, or
|
|
13
|
+
`bober.security-audit`, which is the audit *workflow* skill.
|
|
14
|
+
|
|
15
|
+
## Signature Block Format
|
|
16
|
+
|
|
17
|
+
Each signature is a level-3 heading (three `#` characters, a space, then the
|
|
18
|
+
`signatureId`) followed by labelled fields and two fenced code examples. This file and
|
|
19
|
+
`SecuritySignatureParser` are one executable spec — keep them in sync.
|
|
20
|
+
|
|
21
|
+
Required fields per block:
|
|
22
|
+
- The heading text itself is the `signatureId` (must be non-empty).
|
|
23
|
+
- `- **Title:** <human-readable title>`
|
|
24
|
+
- `- **CWE:** CWE-xx` (optional — omit the line entirely for `cwe: null`)
|
|
25
|
+
- `- **Severity:** critical|high|medium|low|info`
|
|
26
|
+
- `- **VulnClass:** <a VulnClass union member, verbatim — see security-audit-types.ts>`
|
|
27
|
+
- `- **Invariant:** <the safety invariant this signature protects>`
|
|
28
|
+
- `- **Keywords:** comma, separated, keywords`
|
|
29
|
+
|
|
30
|
+
Then two labelled fenced code examples:
|
|
31
|
+
- `**Unsafe:**` followed by a fenced `ts` block with the vulnerable example.
|
|
32
|
+
- `**Safe:**` followed by a fenced `ts` block with the fixed example.
|
|
33
|
+
|
|
34
|
+
A block missing `Title`, a valid `VulnClass`, a valid `Severity`, or a non-empty
|
|
35
|
+
unsafe/safe example is dropped by the parser — never a fatal error.
|
|
36
|
+
|
|
37
|
+
## Signatures
|
|
38
|
+
|
|
39
|
+
### solidity.reentrancy-single-function
|
|
40
|
+
- **Title:** Single-function reentrancy: external call before state update
|
|
41
|
+
- **CWE:** SWC-107
|
|
42
|
+
- **Severity:** critical
|
|
43
|
+
- **VulnClass:** race-condition
|
|
44
|
+
- **Invariant:** All state that a function depends on is finalized (checks-effects-interactions) before any external call that could re-enter the same function.
|
|
45
|
+
- **Keywords:** reentrancy, call, checks-effects-interactions, nonReentrant
|
|
46
|
+
|
|
47
|
+
**Unsafe:**
|
|
48
|
+
```ts
|
|
49
|
+
(bool ok, ) = msg.sender.call{value: balances[msg.sender]}("");
|
|
50
|
+
require(ok);
|
|
51
|
+
balances[msg.sender] = 0;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Safe:**
|
|
55
|
+
```ts
|
|
56
|
+
uint256 amount = balances[msg.sender];
|
|
57
|
+
balances[msg.sender] = 0;
|
|
58
|
+
(bool ok, ) = msg.sender.call{value: amount}("");
|
|
59
|
+
require(ok);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### solidity.reentrancy-readonly
|
|
63
|
+
- **Title:** Read-only reentrancy via view function during callback
|
|
64
|
+
- **CWE:** SWC-107
|
|
65
|
+
- **Severity:** high
|
|
66
|
+
- **VulnClass:** race-condition
|
|
67
|
+
- **Invariant:** A view function's return value must never be trusted mid-callback while a caller's external hook (e.g. an ERC777/ERC721 receiver hook) can still mutate the same pool state.
|
|
68
|
+
- **Keywords:** read-only reentrancy, view, getReserves, callback
|
|
69
|
+
|
|
70
|
+
**Unsafe:**
|
|
71
|
+
```ts
|
|
72
|
+
function price() external view returns (uint256) {
|
|
73
|
+
(uint112 r0, uint112 r1, ) = pair.getReserves(); // stale mid-callback
|
|
74
|
+
return r1 * 1e18 / r0;
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Safe:**
|
|
79
|
+
```ts
|
|
80
|
+
function price() external view returns (uint256) {
|
|
81
|
+
require(!pair.locked(), "reentrant read"); // reentrancy-guard-aware getter
|
|
82
|
+
(uint112 r0, uint112 r1, ) = pair.getReserves();
|
|
83
|
+
return r1 * 1e18 / r0;
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### solidity.spot-price-oracle-flashloan
|
|
88
|
+
- **Title:** Spot AMM price used as oracle (flash-loan manipulable)
|
|
89
|
+
- **Severity:** critical
|
|
90
|
+
- **VulnClass:** money-integrity
|
|
91
|
+
- **Invariant:** A price used for liquidation/collateral/settlement math is never a single-block spot reserve ratio — it comes from a manipulation-resistant source with a staleness bound.
|
|
92
|
+
- **Keywords:** oracle, spot price, getReserves, TWAP, flash loan
|
|
93
|
+
|
|
94
|
+
**Unsafe:**
|
|
95
|
+
```ts
|
|
96
|
+
(uint112 r0, uint112 r1, ) = pair.getReserves();
|
|
97
|
+
uint256 price = r1 * 1e18 / r0; // manipulable within one flash-loaned tx
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Safe:**
|
|
101
|
+
```ts
|
|
102
|
+
uint256 price = chainlinkFeed.latestAnswer();
|
|
103
|
+
require(block.timestamp - chainlinkFeed.updatedAt() < MAX_STALENESS, "stale price");
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### solidity.missing-onlyowner
|
|
107
|
+
- **Title:** Missing onlyOwner/role modifier on a privileged function
|
|
108
|
+
- **CWE:** SWC-105
|
|
109
|
+
- **Severity:** critical
|
|
110
|
+
- **VulnClass:** authn-authz
|
|
111
|
+
- **Invariant:** Every function that mutates protocol-critical state (fees, admin addresses, pausing, minting) is gated by an explicit ownership or role check.
|
|
112
|
+
- **Keywords:** onlyOwner, AccessControl, modifier, privileged
|
|
113
|
+
|
|
114
|
+
**Unsafe:**
|
|
115
|
+
```ts
|
|
116
|
+
function setFee(uint256 newFee) public {
|
|
117
|
+
fee = newFee; // callable by anyone
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Safe:**
|
|
122
|
+
```ts
|
|
123
|
+
function setFee(uint256 newFee) public onlyRole(FEE_ADMIN_ROLE) {
|
|
124
|
+
fee = newFee;
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### solidity.unprotected-initializer
|
|
129
|
+
- **Title:** Unprotected initializer / uninitialized proxy implementation (Parity-style)
|
|
130
|
+
- **CWE:** CWE-665
|
|
131
|
+
- **Severity:** critical
|
|
132
|
+
- **VulnClass:** privilege-escalation
|
|
133
|
+
- **Invariant:** An upgradeable contract's `initialize()` can only ever run once, and the logic-contract instance itself is never left in an initializable state.
|
|
134
|
+
- **Keywords:** initializer, initialize, proxy, _disableInitializers
|
|
135
|
+
|
|
136
|
+
**Unsafe:**
|
|
137
|
+
```ts
|
|
138
|
+
function initialize(address _owner) public {
|
|
139
|
+
owner = _owner; // callable repeatedly by anyone on the implementation contract
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Safe:**
|
|
144
|
+
```ts
|
|
145
|
+
constructor() { _disableInitializers(); }
|
|
146
|
+
|
|
147
|
+
function initialize(address _owner) public initializer {
|
|
148
|
+
owner = _owner;
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### solidity.unchecked-arithmetic
|
|
153
|
+
- **Title:** unchecked{} block underflows a balance
|
|
154
|
+
- **CWE:** SWC-101
|
|
155
|
+
- **Severity:** critical
|
|
156
|
+
- **VulnClass:** money-integrity
|
|
157
|
+
- **Invariant:** A balance or supply subtraction never wraps — the subtrahend is bounds-checked before entering an unchecked block, or the block is dropped in favor of checked arithmetic.
|
|
158
|
+
- **Keywords:** unchecked, overflow, underflow, arithmetic
|
|
159
|
+
|
|
160
|
+
**Unsafe:**
|
|
161
|
+
```ts
|
|
162
|
+
unchecked {
|
|
163
|
+
balances[msg.sender] -= amount; // wraps to a huge balance if amount > balance
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Safe:**
|
|
168
|
+
```ts
|
|
169
|
+
require(balances[msg.sender] >= amount, "insufficient balance");
|
|
170
|
+
balances[msg.sender] -= amount;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### solidity.erc4626-inflation
|
|
174
|
+
- **Title:** ERC-4626 first-depositor / share-inflation attack
|
|
175
|
+
- **Severity:** critical
|
|
176
|
+
- **VulnClass:** money-integrity
|
|
177
|
+
- **Invariant:** Share-price math (assets-per-share) can never be driven to an attacker-favorable rounding extreme by a first depositor donating raw assets directly to the vault.
|
|
178
|
+
- **Keywords:** ERC4626, first depositor, inflation, virtual shares, dead shares
|
|
179
|
+
|
|
180
|
+
**Unsafe:**
|
|
181
|
+
```ts
|
|
182
|
+
function deposit(uint256 assets) external returns (uint256 shares) {
|
|
183
|
+
shares = totalSupply == 0 ? assets : assets * totalSupply / totalAssets();
|
|
184
|
+
_mint(msg.sender, shares); // attacker mints 1 share then donates assets to inflate price
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Safe:**
|
|
189
|
+
```ts
|
|
190
|
+
function deposit(uint256 assets) external returns (uint256 shares) {
|
|
191
|
+
shares = assets * (totalSupply + 10 ** decimalsOffset) / (totalAssets() + 1); // virtual shares/assets offset
|
|
192
|
+
_mint(msg.sender, shares);
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### solidity.unsafe-erc20
|
|
197
|
+
- **Title:** Unsafe ERC20 usage (no SafeERC20 / fee-on-transfer / rebasing)
|
|
198
|
+
- **CWE:** SWC-104
|
|
199
|
+
- **Severity:** high
|
|
200
|
+
- **VulnClass:** money-integrity
|
|
201
|
+
- **Invariant:** Every ERC20 transfer's return value is checked, and any accounting derived from a transfer uses the measured balance delta, not the nominal amount passed in.
|
|
202
|
+
- **Keywords:** transfer, SafeERC20, fee-on-transfer, rebasing, return value
|
|
203
|
+
|
|
204
|
+
**Unsafe:**
|
|
205
|
+
```ts
|
|
206
|
+
token.transfer(recipient, amount); // return value ignored; assumes amount fully received
|
|
207
|
+
credited[recipient] += amount;
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Safe:**
|
|
211
|
+
```ts
|
|
212
|
+
uint256 before = token.balanceOf(address(this));
|
|
213
|
+
token.safeTransfer(recipient, amount);
|
|
214
|
+
uint256 received = before - token.balanceOf(address(this));
|
|
215
|
+
credited[recipient] += received;
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### solidity.txorigin-auth
|
|
219
|
+
- **Title:** tx.origin used for authorization (phishable)
|
|
220
|
+
- **CWE:** SWC-115
|
|
221
|
+
- **Severity:** high
|
|
222
|
+
- **VulnClass:** authn-authz
|
|
223
|
+
- **Invariant:** Authorization checks compare against `msg.sender`, never `tx.origin`, so a malicious intermediate contract cannot impersonate the original caller.
|
|
224
|
+
- **Keywords:** tx.origin, msg.sender, phishing
|
|
225
|
+
|
|
226
|
+
**Unsafe:**
|
|
227
|
+
```ts
|
|
228
|
+
function withdraw() external {
|
|
229
|
+
require(tx.origin == owner); // phishable via a malicious contract the owner interacts with
|
|
230
|
+
payable(owner).transfer(address(this).balance);
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Safe:**
|
|
235
|
+
```ts
|
|
236
|
+
function withdraw() external {
|
|
237
|
+
require(msg.sender == owner);
|
|
238
|
+
payable(owner).transfer(address(this).balance);
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### solidity.missing-slippage-deadline
|
|
243
|
+
- **Title:** Swap missing amountOutMin / deadline (sandwich-attack surface)
|
|
244
|
+
- **Severity:** high
|
|
245
|
+
- **VulnClass:** money-integrity
|
|
246
|
+
- **Invariant:** Every swap specifies a caller-supplied minimum output and a real expiry deadline, so a sandwiching attacker cannot extract unbounded slippage.
|
|
247
|
+
- **Keywords:** amountOutMin, deadline, slippage, swap, sandwich
|
|
248
|
+
|
|
249
|
+
**Unsafe:**
|
|
250
|
+
```ts
|
|
251
|
+
router.swapExactTokensForTokens(amountIn, 0, path, msg.sender, block.timestamp);
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Safe:**
|
|
255
|
+
```ts
|
|
256
|
+
router.swapExactTokensForTokens(amountIn, minAmountOut, path, msg.sender, userSuppliedDeadline);
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### solidity.dos-unbounded-loop
|
|
260
|
+
- **Title:** DoS via unbounded loop over a growable array
|
|
261
|
+
- **CWE:** SWC-128
|
|
262
|
+
- **Severity:** high
|
|
263
|
+
- **VulnClass:** denial-of-service
|
|
264
|
+
- **Invariant:** No externally-triggerable function iterates over a collection whose size is controlled by untrusted users within a single transaction's gas budget.
|
|
265
|
+
- **Keywords:** unbounded loop, gas limit, pull-over-push, DoS
|
|
266
|
+
|
|
267
|
+
**Unsafe:**
|
|
268
|
+
```ts
|
|
269
|
+
function distribute() external {
|
|
270
|
+
for (uint256 i = 0; i < holders.length; i++) { // holders.length grows unbounded
|
|
271
|
+
payable(holders[i]).transfer(shares[holders[i]]);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**Safe:**
|
|
277
|
+
```ts
|
|
278
|
+
function claim() external { // pull-over-push, one holder per call, bounded gas
|
|
279
|
+
uint256 amount = shares[msg.sender];
|
|
280
|
+
shares[msg.sender] = 0;
|
|
281
|
+
payable(msg.sender).transfer(amount);
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### solidity.signature-replay
|
|
286
|
+
- **Title:** Missing nonce/chainId/EIP-712 domain; ecrecover==0 malleability
|
|
287
|
+
- **CWE:** SWC-117
|
|
288
|
+
- **Severity:** critical
|
|
289
|
+
- **VulnClass:** crypto-weakness
|
|
290
|
+
- **Invariant:** A recovered signer address is checked against the zero address, and the signed payload binds a single-use nonce, the chain id, and an EIP-712 domain so a signature cannot be replayed across calls or chains.
|
|
291
|
+
- **Keywords:** ecrecover, nonce, chainId, EIP-712, replay, malleability
|
|
292
|
+
|
|
293
|
+
**Unsafe:**
|
|
294
|
+
```ts
|
|
295
|
+
address signer = ecrecover(hash, v, r, s); // no domain, no nonce, no zero-address check
|
|
296
|
+
require(signer == expectedSigner);
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Safe:**
|
|
300
|
+
```ts
|
|
301
|
+
bytes32 digest = _hashTypedDataV4(structHash); // EIP-712 domain-bound, includes nonce + chainId
|
|
302
|
+
address signer = ecrecover(digest, v, r, s);
|
|
303
|
+
require(signer != address(0) && signer == expectedSigner);
|
|
304
|
+
require(!usedNonces[nonce]);
|
|
305
|
+
usedNonces[nonce] = true;
|
|
306
|
+
```
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober.seo
|
|
3
|
+
description: >-
|
|
4
|
+
Orchestration skill for the Bober SEO/GEO suite — routes to the 8 workflows
|
|
5
|
+
(technical-audit, rank-track, content-decay, topical-map, ai-visibility,
|
|
6
|
+
parasite-watch, internal-linking, schema-audit) run via `bober seo <workflow>
|
|
7
|
+
[target]`. Offline by default; live data is behind two default-false egress
|
|
8
|
+
axes (seo.egress.search-console, seo.egress.serp-provider). Use when you want
|
|
9
|
+
an SEO audit, rank/decay analysis, topical map, AI-visibility check, schema
|
|
10
|
+
audit, internal-linking pass, or parasite-SEO watch.
|
|
11
|
+
argument-hint: "<workflow> [target]"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# bober.seo — SEO/GEO Suite Orchestrator
|
|
15
|
+
|
|
16
|
+
You are the **orchestrator** for an SEO/GEO run. You do NOT analyze data yourself —
|
|
17
|
+
you route to the `bober seo <workflow> [target]` CLI (scriptable/CI-friendly, exit-code
|
|
18
|
+
driven) or spawn the `bober-seo-strategist` subagent (conversational, findings woven
|
|
19
|
+
into this session), optionally followed by the `bober-seo-verifier` subagent, then
|
|
20
|
+
present the result. The whole suite is **offline by construction**: the default data
|
|
21
|
+
source reads local exports under `.bober/seo/imports/`; live Google Search Console or
|
|
22
|
+
DataForSEO data only flows when the matching egress axis is explicitly opted in.
|
|
23
|
+
|
|
24
|
+
## The 8 workflows
|
|
25
|
+
|
|
26
|
+
| Workflow | What it analyzes |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `technical-audit` | Crawlability, indexing state, robots/sitemap, technical health (URL inspection + search-analytics data) |
|
|
29
|
+
| `rank-track` | Ranking position movement and SERP presence for tracked keywords |
|
|
30
|
+
| `content-decay` | Pages/queries losing clicks or position over time — candidates for a refresh |
|
|
31
|
+
| `topical-map` | Topical coverage and site-focus/site-radius gaps against a target topic |
|
|
32
|
+
| `ai-visibility` | Brand/citation presence in AI answers (AI Overviews, ChatGPT, Perplexity, etc.) |
|
|
33
|
+
| `parasite-watch` | Third-party-host placement risk — **detect-only**, never recommends the tactic itself (see Guardrails) |
|
|
34
|
+
| `internal-linking` | Internal link structure, orphan pages, anchor-text distribution |
|
|
35
|
+
| `schema-audit` | Structured-data / entity markup coverage and validity |
|
|
36
|
+
|
|
37
|
+
Name these 8 verbatim when discussing the suite — this is the canonical list
|
|
38
|
+
(`src/seo/command.ts:27-36`); do not invent a 9th workflow or rename one.
|
|
39
|
+
|
|
40
|
+
## How to run
|
|
41
|
+
|
|
42
|
+
**CLI (scriptable / CI-friendly):**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
bober seo <workflow> [target]
|
|
46
|
+
# or: agent-bober seo <workflow> [target]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- `[target]` is a URL, domain, or local path; when omitted the runner falls back to
|
|
50
|
+
`config.seo.defaultTarget` if set.
|
|
51
|
+
- Prints one summary line: `SEO report <id>: verdict=…, findings=…, droppedUncited=…`.
|
|
52
|
+
- **Exit codes:** `0` = pass, `2` = blocked (citation-gate threshold tripped) or
|
|
53
|
+
fail-closed (an unknown workflow, or the run threw). `1` is reserved for Commander's
|
|
54
|
+
own usage errors, never an audit outcome.
|
|
55
|
+
- An unrecognized `<workflow>` prints the valid list and exits `2` immediately — no
|
|
56
|
+
partial run.
|
|
57
|
+
|
|
58
|
+
**Conversational (spawn the subagent):** use when the user wants findings discussed,
|
|
59
|
+
iterated on, or woven into this conversation rather than piped through CI.
|
|
60
|
+
|
|
61
|
+
## When to spawn which agent
|
|
62
|
+
|
|
63
|
+
- **`bober-seo-strategist`** (`agents/bober-seo-strategist.md`, read-only: Read/Grep/Glob
|
|
64
|
+
only) — the analysis role. Feed it the workflow, target, a retrieved playbook context
|
|
65
|
+
(`SeoSignature` blocks selected from `skills/bober.seo-*/SKILL.md` for the declared
|
|
66
|
+
workflow), and a gathered SEO data bundle. It returns evidence-cited findings; it
|
|
67
|
+
cannot write, edit, or call a live API itself.
|
|
68
|
+
- **`bober-seo-verifier`** (`agents/bober-seo-verifier.md`, no tools, fresh contract-free
|
|
69
|
+
context) — the adversarial false-positive control. Spawn it **after** the strategist,
|
|
70
|
+
only when `config.seo.verifier.enabled` is `true`, feeding it ONLY the strategist's
|
|
71
|
+
findings (never the sprint contract or any "already reviewed" framing). It can only
|
|
72
|
+
confirm, downgrade, or drop a finding — never promote or add one.
|
|
73
|
+
- Route the CLI path instead of spawning either agent when the user wants a scriptable,
|
|
74
|
+
exit-code-driven result (CI, a script, a quick pass/fail check).
|
|
75
|
+
|
|
76
|
+
## Offline vs. live data
|
|
77
|
+
|
|
78
|
+
**Offline by default.** The default `LocalExportSource` reads one file per capability
|
|
79
|
+
from `.bober/seo/imports/`: `search-analytics`, `url-inspection`, `serp`, `keywords`,
|
|
80
|
+
`backlinks`, each as `<capability>.csv` or `<capability>.json`. A missing file for a
|
|
81
|
+
capability degrades to `disabled` for that capability alone — it never blocks the rest
|
|
82
|
+
of the run, and it requires no API key.
|
|
83
|
+
|
|
84
|
+
**Live data is opt-in, per source, and default-false** — two independent egress axes
|
|
85
|
+
(`SeoEgressGuard`, `src/seo/egress.ts`):
|
|
86
|
+
|
|
87
|
+
| Axis | Config key | Gates |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| Google Search Console | `seo.egress.search-console` | Live search-analytics / URL-inspection API calls |
|
|
90
|
+
| DataForSEO | `seo.egress.serp-provider` | Live SERP / keyword / backlink API calls |
|
|
91
|
+
|
|
92
|
+
Both default `false`; the whole `seo.egress` object is optional and omitting it keeps
|
|
93
|
+
every workflow fully offline. Opting into one axis does **not** opt into the other.
|
|
94
|
+
Live credentials come from environment variables, not config: `GSC_OAUTH_TOKEN` for
|
|
95
|
+
`search-console`, `DATAFORSEO_LOGIN` / `DATAFORSEO_PASSWORD` for `serp-provider`.
|
|
96
|
+
|
|
97
|
+
## Config knobs
|
|
98
|
+
|
|
99
|
+
- `seo.budget.maxUsd` — per-run USD spend ceiling for PAYG DataForSEO calls (absent =
|
|
100
|
+
uncapped).
|
|
101
|
+
- `seo.verifier.enabled` — turns on the adversarial `bober-seo-verifier` pass (default
|
|
102
|
+
`false`).
|
|
103
|
+
- `seo.defaultTarget` — used when the CLI's `[target]` argument is omitted.
|
|
104
|
+
- `seo.blockThreshold` — `never | any-uncited | critical-uncited` (default
|
|
105
|
+
`critical-uncited`) — the citation gate's exit-code-2 threshold.
|
|
106
|
+
|
|
107
|
+
## Guardrails to restate
|
|
108
|
+
|
|
109
|
+
- **Never-encode tactics are dropped at parse, never surfaced.** Any playbook block
|
|
110
|
+
tagged `PolicyClass: never-encode` (e.g. parasite-SEO placement on a third-party host)
|
|
111
|
+
is dropped by `SeoPlaybookParser` before it ever reaches an analysis prompt — this is
|
|
112
|
+
why `parasite-watch` is detect-only: it can flag exposure, never recommend the tactic.
|
|
113
|
+
- **`humanApprovalRequired` findings need a human.** Any recommendation touching policy
|
|
114
|
+
compliance (paid links, cloaking, structured-data misuse) or spend (ad budget, paid
|
|
115
|
+
placements, metered live-API calls) is flagged for manual review before acting on it.
|
|
116
|
+
- **Citation discipline.** Every finding the strategist emits must carry a primary-source
|
|
117
|
+
`citationUrl`; an uncited finding is dropped by the deterministic `SeoCitationGate`
|
|
118
|
+
before it reaches a report or the hub — the LLM's judgment never bypasses this gate.
|
|
119
|
+
|
|
120
|
+
For the full reference (CLI exit codes, config schema, import file format, per-workflow
|
|
121
|
+
detail), see [`docs/seo.md`](../../docs/seo.md).
|
|
122
|
+
|
|
123
|
+
## Report
|
|
124
|
+
|
|
125
|
+
After a run (CLI or subagent), summarize for the user: the workflow + target, the
|
|
126
|
+
verdict (`pass`/`blocked`), the finding count and how many were dropped for missing
|
|
127
|
+
citations (`droppedUncited`), and — for any `humanApprovalRequired` finding — call it out
|
|
128
|
+
explicitly rather than folding it into the general list. The CLI path persists the
|
|
129
|
+
report to `.bober/seo/reports/<reportId>.json` (`SeoReportStore`) and best-effort emits
|
|
130
|
+
critical/notable findings into the priority hub — point the user there. When you spawn
|
|
131
|
+
the subagent(s) directly instead of the CLI, you own persisting the returned JSON
|
|
132
|
+
yourself if the user wants it kept; the subagents have no Write tool.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober.seo-ai-visibility
|
|
3
|
+
description: "Per-workflow SEO signature library for the ai-visibility workflow. A data file of discrete, cited SEO/GEO tactics read by SeoPlaybookParser (src/seo/parser.ts), not a workflow skill. Encodes VERIFIED 2025-2026 AI-visibility correlations (Ahrefs 75k-brand study, Semrush ghost-citations study, Profound platform-citation study) with per-platform GEO divergence marked perishable."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bober.seo-ai-visibility — AI-Visibility (GEO) Signature Library
|
|
7
|
+
|
|
8
|
+
This skill is a **signature-library** file for the `ai-visibility` workflow, not a
|
|
9
|
+
workflow skill in its own right. It is read (as raw markdown text) by
|
|
10
|
+
`SeoPlaybookParser.parse()` (`src/seo/parser.ts`) and turned into typed
|
|
11
|
+
`SeoSignature[]` records consumed by the SEO agent team's retriever
|
|
12
|
+
(`SeoPlaybookRetriever`). It follows the identical block format defined and
|
|
13
|
+
documented in `skills/bober.seo-generic/SKILL.md` ("Signature Block Format") --
|
|
14
|
+
the two files are one executable spec; a block missing `Title` or
|
|
15
|
+
`PrimarySourceUrl`, or tagged `PolicyClass: never-encode`, is DROPPED by the
|
|
16
|
+
parser at load time.
|
|
17
|
+
|
|
18
|
+
The signatures below encode VERIFIED generative-engine-optimization (GEO)
|
|
19
|
+
correlations from three independent 2025-2026 studies -- Ahrefs' 75,000-brand
|
|
20
|
+
correlation analysis, Semrush's ghost-citations study, and Profound's
|
|
21
|
+
680-million-citation platform analysis -- plus one deliberate `never-encode`
|
|
22
|
+
boundary block for AI-recommendation poisoning. Per-platform citation-mix
|
|
23
|
+
figures are explicitly marked **PERISHABLE** below: platform algorithms and
|
|
24
|
+
source-weighting change fast, so treat those specific percentages as
|
|
25
|
+
dated-as-of-measurement, not durable constants. See
|
|
26
|
+
`.bober/research/research-20260715-ultimate-seo-agents-skills-research.md`
|
|
27
|
+
§1/§7 for the underlying evidence and the two REFUTED claims that must never
|
|
28
|
+
be encoded here (ChatGPT-Wikipedia dominance, Reddit-leading-AI-Overviews).
|
|
29
|
+
|
|
30
|
+
## Signatures
|
|
31
|
+
|
|
32
|
+
### ai-visibility-youtube-presence-audit
|
|
33
|
+
- **Title:** Audit and grow YouTube presence -- the strongest single AI-visibility correlate
|
|
34
|
+
- **Workflows:** ai-visibility
|
|
35
|
+
- **Tactic:** Include YouTube brand presence (owned-channel content, creator partnerships, video PR, transcript/caption quality) as a first-class line item in every AI-visibility audit, not an afterthought to written-content SEO. Report current YouTube mention volume as a baseline metric alongside branded web mentions.
|
|
36
|
+
- **Invariant:** Across ChatGPT, Google AI Mode, and AI Overviews, YouTube mentions show the single highest correlation (~0.737 Spearman) with brand visibility in AI answers, in a 75,000-brand Ahrefs correlation study -- stronger than any other measured signal, including backlinks.
|
|
37
|
+
- **PrimarySourceUrl:** https://ahrefs.com/blog/ai-brand-visibility-correlations/
|
|
38
|
+
- **PolicyClass:** auto-safe
|
|
39
|
+
- **EvidenceGrade:** verified
|
|
40
|
+
- **Keywords:** youtube, ai-visibility, geo, correlation, audit
|
|
41
|
+
|
|
42
|
+
### ai-visibility-branded-mention-audit
|
|
43
|
+
- **Title:** Audit branded web-mention volume (linked or unlinked) -- the strongest non-video AI-visibility signal
|
|
44
|
+
- **Workflows:** ai-visibility
|
|
45
|
+
- **Tactic:** Track and report branded web-mention volume across the open web as a distinct AI-visibility metric, counting unlinked mentions equally with linked ones; do not discount coverage that omits a hyperlink when assessing AI-visibility health.
|
|
46
|
+
- **Invariant:** Branded web mentions (linked or unlinked) correlate at 0.66-0.71 with brand visibility in AI answers -- the strongest non-YouTube signal, and dramatically stronger than classic backlink volume (~0.218), in the same 75,000-brand Ahrefs study.
|
|
47
|
+
- **PrimarySourceUrl:** https://ahrefs.com/blog/ai-brand-visibility-correlations/
|
|
48
|
+
- **PolicyClass:** auto-safe
|
|
49
|
+
- **EvidenceGrade:** verified
|
|
50
|
+
- **Keywords:** brand-mention, ai-visibility, geo, correlation, backlinks-weak
|
|
51
|
+
|
|
52
|
+
### ai-visibility-ghost-citation-mention-split
|
|
53
|
+
- **Title:** Track citation rate and mention rate as two distinct AI-visibility metrics
|
|
54
|
+
- **Workflows:** ai-visibility
|
|
55
|
+
- **Tactic:** Report AI-citation rate and AI-mention rate as separate audit metrics for every tracked brand/page; do not conflate "the page is linked as a source" with "the brand is named in the answer text" -- they measure different things and a gap between them is itself a finding.
|
|
56
|
+
- **Invariant:** 61.7% of AI citations are "ghost citations" -- the source page is linked but the brand is never named in the AI-generated answer -- across 3,981 domain appearances / 115 prompts / 4 platforms / 14 countries in the Semrush/Kevin Indig ghost-citations study.
|
|
57
|
+
- **PrimarySourceUrl:** https://www.semrush.com/blog/the-ghost-citations-study/
|
|
58
|
+
- **PolicyClass:** auto-safe
|
|
59
|
+
- **EvidenceGrade:** verified
|
|
60
|
+
- **Keywords:** ghost-citation, citation-rate, mention-rate, ai-visibility
|
|
61
|
+
|
|
62
|
+
### ai-visibility-per-platform-geo-divergence
|
|
63
|
+
- **Title:** [PERISHABLE, dated 2026] Audit per-platform citation/mention mix separately -- platforms diverge sharply and the mix will shift over time
|
|
64
|
+
- **Workflows:** ai-visibility
|
|
65
|
+
- **Tactic:** Do not optimize AI-visibility as a single undifferentiated target; audit and report citation-vs-mention behavior per platform (ChatGPT, Gemini, Perplexity, AI Overviews), because a page can be heavily mentioned on one platform and heavily cited-but-unnamed on another. Re-measure this split on a recurring cadence -- the specific percentages below are a point-in-time snapshot, not a stable baseline.
|
|
66
|
+
- **Invariant:** [PERISHABLE] The Semrush ghost-citations study documents sharp per-platform divergence in citation-vs-mention behavior (e.g. platforms differ materially in how often a cited source page is also named as the brand in the answer text); this mix is measured as of the 2025-2026 study window and should be treated as dated, not durable, given known platform-algorithm churn.
|
|
67
|
+
- **PrimarySourceUrl:** https://www.semrush.com/blog/the-ghost-citations-study/
|
|
68
|
+
- **PolicyClass:** auto-safe
|
|
69
|
+
- **EvidenceGrade:** single-source
|
|
70
|
+
- **Keywords:** per-platform, geo-divergence, perishable, citation-mix, dated-2026
|
|
71
|
+
|
|
72
|
+
### ai-visibility-comparative-query-mention-lift
|
|
73
|
+
- **Title:** Build comparison ("vs") content to capture the comparative-query mention lift
|
|
74
|
+
- **Workflows:** ai-visibility, topical-map
|
|
75
|
+
- **Tactic:** Prioritise comparative/"X vs Y" content in the AI-visibility content plan -- comparison-framed queries earn a measurably higher brand-mention rate than single-entity queries, so this is a specific, evidence-backed content type to invest in, not a generic content-marketing suggestion.
|
|
76
|
+
- **Invariant:** Comparative queries generate 2.4x more brand mentions than single-entity queries (43.3% vs 18% mention rate) in the Semrush ghost-citations study's query-type breakdown.
|
|
77
|
+
- **PrimarySourceUrl:** https://www.semrush.com/blog/the-ghost-citations-study/
|
|
78
|
+
- **PolicyClass:** human-approve
|
|
79
|
+
- **EvidenceGrade:** single-source
|
|
80
|
+
- **Keywords:** comparative-query, mention-lift, content-plan, ai-visibility
|
|
81
|
+
|
|
82
|
+
### ai-visibility-aio-citation-rank-decouple
|
|
83
|
+
- **Title:** Audit AI Overview citation coverage separately from organic rank -- most cited pages no longer rank top-10
|
|
84
|
+
- **Workflows:** ai-visibility, rank-track
|
|
85
|
+
- **Tactic:** Do not treat organic top-10 ranking as a prerequisite for AIO citation in the audit methodology; run a dedicated AIO-citation crawl/check independent of rank-tracking, since a majority of currently-cited pages rank outside the top 10.
|
|
86
|
+
- **Invariant:** Only 38% of AIO-cited pages ranked in the organic top-10 as of Jan 2026 (down from ~76% in Jul 2025); 31.2% of cited pages ranked 11-100 and 31.0% ranked beyond top-100, per an Ahrefs analysis of 863K SERPs / 4M AIO URLs.
|
|
87
|
+
- **PrimarySourceUrl:** https://ahrefs.com/blog/ai-overview-citations-top-10/
|
|
88
|
+
- **PolicyClass:** auto-safe
|
|
89
|
+
- **EvidenceGrade:** verified
|
|
90
|
+
- **Keywords:** aio, citations, rank-decouple, ai-visibility
|
|
91
|
+
|
|
92
|
+
### ai-visibility-perplexity-community-weighted
|
|
93
|
+
- **Title:** [PERISHABLE, dated 2026] For Perplexity-specific work, weight community presence over publisher-style placement
|
|
94
|
+
- **Workflows:** ai-visibility
|
|
95
|
+
- **Tactic:** When auditing or building Perplexity-specific AI-visibility, prioritise genuine community presence and discussion (Reddit and similar forums) as one input among several platform-mix signals, alongside publisher-style content; re-check this platform mix periodically since platform citation-source weighting is known to shift.
|
|
96
|
+
- **Invariant:** [PERISHABLE] In a 680-million-citation Profound study, Perplexity showed the most community-weighted citation mix of the platforms measured, with community-forum sources forming a materially larger share of Perplexity's citations than of other platforms' citation mixes; this mix is a point-in-time measurement, not a durable constant.
|
|
97
|
+
- **PrimarySourceUrl:** https://www.tryprofound.com/blog/ai-platform-citation-patterns
|
|
98
|
+
- **PolicyClass:** auto-safe
|
|
99
|
+
- **EvidenceGrade:** single-source
|
|
100
|
+
- **Keywords:** perplexity, community, platform-specific, perishable, dated-2026
|
|
101
|
+
|
|
102
|
+
### ai-recommendation-poisoning-boundary
|
|
103
|
+
- **Title:** AI-recommendation poisoning via prompt injection -- NEVER encode as a tactic
|
|
104
|
+
- **Workflows:** ai-visibility
|
|
105
|
+
- **Tactic:** NEVER encode as actionable. Injecting hidden prompts into page content, browser-extension "Summarize with AI" surfaces, or other AI-consumed channels to manipulate an AI assistant's recommendation or citation behavior toward a brand is prompt injection / AI-recommendation poisoning, a security and trust violation, not a legitimate GEO tactic. Documented here only to mark the automation boundary; the parser DROPS this block so it can never reach an analyzer prompt.
|
|
106
|
+
- **Invariant:** AI-recommendation poisoning (prompt-injection attacks against AI-summarization and AI-assistant surfaces) is a documented 2025-2026 attack class against AI-consumed content; it must never be surfaced as an option, even human-approval-gated -- it is a manipulation technique, not a judgment call.
|
|
107
|
+
- **PrimarySourceUrl:** https://developers.google.com/search/docs/essentials/spam-policies
|
|
108
|
+
- **PolicyClass:** never-encode
|
|
109
|
+
- **EvidenceGrade:** primary-unverified
|
|
110
|
+
- **Keywords:** ai-recommendation-poisoning, prompt-injection, never-encode, policy-violation
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bober.seo-content-decay
|
|
3
|
+
description: "Per-workflow SEO signature library for the content-decay workflow. A data file of discrete, cited SEO tactics read by SeoPlaybookParser (src/seo/parser.ts), not a workflow skill. Encodes the leak's NavBoost click-decay mechanism, the rolling 13-month refresh window, and the HCU-era content-decay baseline (522 sites, 64% traffic-lost) for the content-decay workflow."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bober.seo-content-decay — Content Decay Signature Library
|
|
7
|
+
|
|
8
|
+
This skill is a **signature-library** file for the `content-decay` workflow, not a
|
|
9
|
+
workflow skill in its own right. It is read (as raw markdown text) by
|
|
10
|
+
`SeoPlaybookParser.parse()` (`src/seo/parser.ts`) and turned into typed
|
|
11
|
+
`SeoSignature[]` records consumed by the SEO agent team's retriever
|
|
12
|
+
(`SeoPlaybookRetriever`). It follows the identical block format defined and
|
|
13
|
+
documented in `skills/bober.seo-generic/SKILL.md` ("Signature Block Format") --
|
|
14
|
+
the two files are one executable spec; a block missing `Title` or
|
|
15
|
+
`PrimarySourceUrl`, or tagged `PolicyClass: never-encode`, is DROPPED by the
|
|
16
|
+
parser at load time -- see
|
|
17
|
+
`.bober/research/research-20260715-ultimate-seo-agents-skills-research.md`
|
|
18
|
+
for the underlying evidence.
|
|
19
|
+
|
|
20
|
+
The signatures below encode the leaked Google Content Warehouse API's
|
|
21
|
+
NavBoost click-decay mechanism (decay as a failure to keep driving a page's
|
|
22
|
+
expected click share over a rolling 13-month window) and Detailed's
|
|
23
|
+
522-content-site post-HCU study, which found 64% of content-first sites lost
|
|
24
|
+
traffic with a median loss of -471K visits / -17.8%. Most signatures here are
|
|
25
|
+
**read-only detection/monitoring** (auto-safe); the one signature that would
|
|
26
|
+
execute a large-scale rewrite or page consolidation that changes the live
|
|
27
|
+
site is `human-approve` -- consistent with research §6's automation boundary.
|
|
28
|
+
|
|
29
|
+
## Signatures
|
|
30
|
+
|
|
31
|
+
### navboost-decay-expected-clicks
|
|
32
|
+
- **Title:** Content decay is partly a NavBoost failure to keep driving a page's expected click share
|
|
33
|
+
- **Workflows:** content-decay
|
|
34
|
+
- **Tactic:** Detect decay by comparing a page's current click share against the click share its rank would predict, not by watching raw rank alone; flag pages whose click-share is sliding relative to their rank as decaying even before the rank itself drops.
|
|
35
|
+
- **Invariant:** The leaked Google Content Warehouse API documents NavBoost as a click-based re-ranking system tracking goodClicks, badClicks, lastLongestClicks, and unsquashedClicks over a rolling 13-month window; a page's ranking position and its actual click performance can diverge, and a sustained failure to drive the clicks NavBoost expects for that position is a mechanical decay signal.
|
|
36
|
+
- **PrimarySourceUrl:** https://ipullrank.com/google-algo-leak
|
|
37
|
+
- **PolicyClass:** auto-safe
|
|
38
|
+
- **EvidenceGrade:** single-source
|
|
39
|
+
- **Keywords:** navboost, decay, expected-clicks, click-share
|
|
40
|
+
|
|
41
|
+
### navboost-13month-refresh-window
|
|
42
|
+
- **Title:** Set refresh cadence inside NavBoost's rolling 13-month click window, not annually
|
|
43
|
+
- **Workflows:** content-decay
|
|
44
|
+
- **Tactic:** Schedule content-refresh review cycles to land within the 13-month click-history window NavBoost scores over, rather than on a slower annual cadence that lets a page's click history fully roll past its refresh.
|
|
45
|
+
- **Invariant:** The leak documents NavBoost as scoring goodClicks/badClicks/lastLongestClicks/unsquashedClicks on a rolling 13-month window at the URL, subdomain, and root-domain level; a refresh cadence slower than that window lets decayed click history persist uncorrected for a full scoring cycle.
|
|
46
|
+
- **PrimarySourceUrl:** https://ipullrank.com/google-algo-leak
|
|
47
|
+
- **PolicyClass:** auto-safe
|
|
48
|
+
- **EvidenceGrade:** single-source
|
|
49
|
+
- **Keywords:** navboost, 13-month-window, refresh-cadence, click-history
|
|
50
|
+
|
|
51
|
+
### content-decay-hcu-baseline
|
|
52
|
+
- **Title:** Post-HCU decay is the norm, not the exception -- run a standing decay-detection pass on every site
|
|
53
|
+
- **Workflows:** content-decay
|
|
54
|
+
- **Tactic:** Treat decay detection as a standing, recurring audit line item for every content-first site rather than a one-off diagnostic run only when traffic visibly craters; the base rate of decay is high enough that absence of a detection pass is itself a risk.
|
|
55
|
+
- **Invariant:** A study of 522 content-first sites post-Helpful Content Update found 64% lost organic traffic, with a median loss of -471K visits (-17.8%) among the sites that declined, per Detailed's Q3 analysis (Glen Allsopp).
|
|
56
|
+
- **PrimarySourceUrl:** https://detailed.com/q3/
|
|
57
|
+
- **PolicyClass:** auto-safe
|
|
58
|
+
- **EvidenceGrade:** single-source
|
|
59
|
+
- **Keywords:** hcu, decay-baseline, 64-percent, detailed-q3
|
|
60
|
+
|
|
61
|
+
### goodclicks-badclicks-early-warning
|
|
62
|
+
- **Title:** Audit good/bad-click proxies as a leading indicator of decay before rank drops
|
|
63
|
+
- **Workflows:** content-decay
|
|
64
|
+
- **Tactic:** Pull bounce-back behavior and dwell/engagement proxies for at-risk pages as a leading-indicator audit line item; a rising badClicks-to-goodClicks proxy ratio is a decay early warning worth flagging before the page's rank actually falls.
|
|
65
|
+
- **Invariant:** The leak documents goodClicks and badClicks as tracked NavBoost inputs distinguishing navDemotion (on-site UX causes) from serpDemotion (SERP-behavior causes); a shift in that ratio precedes and helps cause the rank movement decay is ultimately measured by.
|
|
66
|
+
- **PrimarySourceUrl:** https://ipullrank.com/google-algo-leak
|
|
67
|
+
- **PolicyClass:** auto-safe
|
|
68
|
+
- **EvidenceGrade:** single-source
|
|
69
|
+
- **Keywords:** goodclicks, badclicks, early-warning, navdemotion
|
|
70
|
+
|
|
71
|
+
### refresh-cadence-monitoring
|
|
72
|
+
- **Title:** Re-measure decaying pages on a recurring cadence, not a one-shot report
|
|
73
|
+
- **Workflows:** content-decay
|
|
74
|
+
- **Tactic:** Build decay monitoring as a recurring, read-only re-measurement pass over previously-flagged pages rather than a single diagnostic snapshot; re-check decay status on each cadence run so a page's trajectory (worsening, stabilizing, recovering) is visible over time.
|
|
75
|
+
- **Invariant:** Both the 64%-decayed HCU baseline and the underlying NavBoost rolling-window mechanism argue that decay is an ongoing, shifting condition rather than a fixed state -- a single audit snapshot cannot capture trajectory, only recurring monitoring can.
|
|
76
|
+
- **PrimarySourceUrl:** https://detailed.com/q3/
|
|
77
|
+
- **PolicyClass:** auto-safe
|
|
78
|
+
- **EvidenceGrade:** single-source
|
|
79
|
+
- **Keywords:** refresh-cadence, monitoring, recurring-audit, trajectory
|
|
80
|
+
|
|
81
|
+
### content-refresh-genuine-effort
|
|
82
|
+
- **Title:** Refresh decaying pages with genuine substantiation, not scaled regeneration
|
|
83
|
+
- **Workflows:** content-decay
|
|
84
|
+
- **Tactic:** When recommending a refresh for a decaying page, recommend adding genuine original substantiation (new data, analysis, first-hand detail) rather than a scaled/templated rewrite pass; a low-effort regeneration risks tripping the same low-effort signal that contributes to decay in the first place.
|
|
85
|
+
- **Invariant:** Mike King's technical analysis of the leak documents contentEffort as an LLM-based effort-estimation signal Google runs on article pages; refreshing a decaying page with low-effort scaled output risks reinforcing, not reversing, the mechanical signal associated with decline.
|
|
86
|
+
- **PrimarySourceUrl:** https://ipullrank.com/google-algo-leak
|
|
87
|
+
- **PolicyClass:** auto-safe
|
|
88
|
+
- **EvidenceGrade:** single-source
|
|
89
|
+
- **Keywords:** content-refresh, genuine-effort, contenteffort, scaled-regeneration
|
|
90
|
+
|
|
91
|
+
### large-scale-rewrite-consolidation-approval
|
|
92
|
+
- **Title:** Mass rewrite or consolidation of decayed pages changes the live site -- requires human sign-off
|
|
93
|
+
- **Workflows:** content-decay
|
|
94
|
+
- **Tactic:** When decay analysis surfaces a large batch of decayed pages warranting mass rewrite or consolidation/merging into fewer stronger URLs, propose the plan as a report but do not execute the rewrite, redirect, or merge without explicit human approval, since it is a structural change to the live site.
|
|
95
|
+
- **Invariant:** The 522-site/64%-decayed HCU baseline shows decay clusters at scale across many pages at once; executing a large-scale rewrite or consolidation response to that scale of finding involves redirects and content replacement that a human must own the execution decision for, mirroring the internal-linking workflow's authority-consolidation-merge boundary.
|
|
96
|
+
- **PrimarySourceUrl:** https://detailed.com/q3/
|
|
97
|
+
- **PolicyClass:** human-approve
|
|
98
|
+
- **EvidenceGrade:** single-source
|
|
99
|
+
- **Keywords:** large-scale-rewrite, consolidation, human-approve, live-site-change
|