Skip to content

Security inventory delivery evidence

Task: a73430a7-ce0f-4ab7-9950-5e0fb53a1ac0, frozen version 14. Date: 2026-10-10. Repository: h8v6/heyaira. Branch: heyaira/a73430a7; current dispatch base: 37f4561. That base already contains the first inventory from the v2 attempt (original code snapshot 7d9d2ca). This delivery revalidates and updates those documents; it does not claim their first creation under v14. The RESULT receipt records full base and result commit IDs; the containing commit identifies this evidence.

Method and coverage

server_identity matched the assigned resource, project and instance; task_get read the exact historical version 14 before editing. The work contract v4 was read from HeyAira memory: dispatched Bridge workers use their frozen contract and task_result, without interactive claiming, status changes or continuity_context. The initial working tree was clean.

The repeated source scan covered 138 files: compose.yaml, src/heyaira/config.py, and text files under ops/, scripts/, .github/workflows/ and docs/, excluding docs/security/, symlinks and environment files. There are no docs/ops* files; the named runbooks and docs/operations/ supply those sources. Targeted reads checked Compose consumers, config defaults, vault policy/overlays, SSH/sudo restore commands, CI authority, OAuth/iOS scopes and lifetimes, static-token role intersection, Bridge keys, and R2 custody.

No production probes, provider dashboards, local credential stores, Keychain, environment files or secret files were opened. Paths in the register are source references, not verified production custody. The server identity check established MCP provenance only; it does not attest the deployed configuration.

Coverage and credential checks

A Python scan extracted uppercase symbols from the 138 files and selected passwords, secrets, token files, private/APNs keys, database URLs/users, age keys, access/application/consumer keys, link key IDs, SES config and GitHub job-token names. It found 48 matching symbols. Two were not credentials: the deployment script's directory-mode variable and an explicitly synthetic claim placeholder. The other 46 names all occur in register.md:

source_files=138; matched_symbols=48; noncredential_symbols=2
credential_symbols=46; missing_symbols=0

Manual checks cover classes that env-name extraction cannot establish: OAuth clients/grants, the iOS public client and scopes, static tokens, Bridge identity/enrollment/pairing/recovery/claim/lease credentials, passkeys, SSH/sudo, DB roles, CI runners, provider custody and Bridge allowlists. The register now explicitly maps credential settings to its sections and distinguishes directory modes and synthetic examples from live credentials.

The bounded source scan found zero provider-prefix or private-key-header candidates after requiring token boundaries (ordinary task-related words otherwise match a short provider prefix). It found 23 long quoted literals: configuration symbols, paths, status messages, public analytics resource paths, commit references and an explicit synthetic placeholder. Five additional mixed-case/digit entropy matches were documented environment assignments. Candidate output suppressed literals and showed only paths, lines and context. None was identified as a real-looking secret. These heuristics cannot certify Git history or live installations as secret-free.

Current verification results

Checks ran locally with Python 3.12 and bytecode writes disabled. Git used the installed command-line-tools binary, avoiding the system launcher that tried to create a cache outside the sandbox. Temporary build output stayed inside the worktree and was removed before commit.

Check Actual result
python scripts/check_docs_contract.py Exit 0: documentation contract passed: 46 MCP tools covered
python scripts/export_mcp_contract.py --check Exit 0: MCP contract is up to date
python scripts/check_product_name.py Exit 0: Product name check passed: use HeyAira in tracked text files
Credential-name coverage 46 credential symbols; zero missing from register
python -m mkdocs build --strict --site-dir <worktree scratch>/site Exit 0: Documentation built in 5.02 seconds
Finding fields and local links findings=11; required_fields=pass; local_links=6; broken_links=0
Scope and added-line credential scan against dispatch base changed_files=4; outside_scope=0; diff_credential_candidates=0
git diff --check Exit 0; no whitespace errors

The first MkDocs attempt rejected a site directory underneath docs/, before building anything. Moving disposable output to the worktree root resolved the configuration error. The successful strict build includes all four security pages; its informational messages about pages outside navigation and an existing excluded specification link are not new security-document link failures. The diff scan checked provider prefixes, private-key headers, credential-bearing DSNs and long mixed-case/digit blobs; candidate output would contain line numbers only. Finding validation required source, narrowing, implementation owner, agreement and closure evidence for each of R01–R11. Six relative Markdown links resolve to files. Scope validation requires exactly four changed files and the docs/security/ prefix for each, relative to 37f4561.

The previous attempt's build/test claims were replaced by this run's results. No production or PostgreSQL behavioral tests were run: this is documentation only, and runtime tests would not establish deployed access or custody.

Acceptance mapping and limits

  • register: register.md records names/paths, consumers, holder roles and proposed rotation/review intervals. Actual holders, last rotation and expiry remain unknown until an authorized value-free attestation.
  • review: review-2026-10.md maps access paths and retains five P2 and six P3 findings, each with source, narrowing, implementation owner, agreement and closure evidence. R06 now explicitly addresses the single-share unseal example. No confirmed P1 incident is asserted. README.md describes the monthly review and incident record; next review is 2026-11-10.
  • scope: only the four existing Markdown files under docs/security/ change relative to this dispatch base; no code/configuration/migration change.

The worker appends RESULT and receipt using task_result; Bridge performs independent verification and decides acceptance. No push, PR, merge, deploy, repair-task creation, access change or credential rotation was performed.