doc-shared-packages — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited doc-shared-packages (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
pkg/)All REST API request and response structs with validate: struct tags.
RequestWontDoRequest, RejectWontDoRequest, ReorderTaskRequest, MoveTaskToProjectRequest, TaskResponse, TaskWithDetailsResponse
New(baseURL) — validates URL (http/https only, rejects link-local/metadata IPs)UpdateProjectAgent, DeleteProjectAgent, GetNextTasks, WaitForNextTask (SSE blocking), UpdateTaskSessionID, UpdateTask, ListTasks, CreateTask, CompleteTask, BlockTask, MoveTask, GetColumnCounts, AddComment, ListComments, GetColumns, AddDependency
Types: docker.list, docker.rebuild, docker.logs, docker.prune, build.event, prune.event, error
ChatStatsEvent, ChatEndEvent, ChatErrorEvent, ChatTTLWarningEvent Types: chat.start, chat.message, chat.user_msg, chat.end, chat.error, chat.stats, chat.ping, chat.ttl_warning
Error struct: Code (string), Message (string), wraps underlying errorIsDomainError(err) bool — type assertion helperinternal/pkg/)Error struct: Code, Message, ErrNewController(logger) — registers custom validators: entity_id (UUID), slug (lowercase alphanum+hyphens, max 100)SendSuccess(w, r, data) — 200 OK with JSend wrapper {status: "success", data: ...}SendFail(w, r, statusCode, err) — 4xx with {status: "fail", error: {code, message}}SendError(w, r, err) — 500 with {status: "error", error: {code, message}}DecodeAndValidate(r, dest, validationErr) — JSON decode + struct tag validation, rejects non-application/jsonCodedError interface — allows errors to carry Code/Message without circular importsRequestLogger — logs method, path, status, duration, remote IPNewRequireAuth(authValidator) — JWT Bearer validation, injects Actor into context (ActorContextKey = "actor")Sets headers: X-Content-Type-Options, X-Frame-Options, Cache-Control, CORS
LimitBodySize — 512 KB request body limit (413 if exceeded)RateLimit — 5 req/s per IP, 10 burst, 10min cleanup of old limiters (429 if exceeded)Uses real RemoteAddr only (never trusts X-Forwarded-For)
Broadcast(Event) — project-scoped delivery, SendToDaemon(nodeID, data) — targeted delivery RegisterHandler(msgType, fn) — message type routing, NewRelayHandler() — daemon↔client relay Read/write: 64KB read limit, 10s write deadline, 60s pong wait, 54s ping period
RunWritePump[M]() and HandleUnregister[C]() helpersSubscribe(projectID) → (chan string, unsubscribe func)Publish(projectID, data) — sanitizes newlines, evicts slow consumersHasSubscribers(projectID) boolinternal/agachconfig/)Config struct: BaseURL (yaml: base_url)FindConfigFile(dir, filename, maxDepth) — walks up directory tree (max 5 levels)LoadSecureYAML(path, dest) — requires file permissions ≤ 0600ValidateBaseURL(url) — enforces https for remote hostsLoad(dir) — looks for .agach.yml in dir and parents~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.