# Phase 11 - Findings Register

| ID | Severity | Category | Status | Affected Feature(s) | Evidence | Impact | Next Action | Blocks Launch | Confidence |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| F-001 | P0 | Security, Closed-loop wiring | RESOLVED | Marketplace | Active-scope grep finds no marketplace refs in `src ui scripts test package.json .env.example`. | Old paid entitlement self-grant risk removed with feature retirement. | Keep source/route contract hygiene to prevent reintroduction. | NO | High |
| F-002 | P1 | Auth/authz | RESOLVED | Local login | Active-scope grep finds no passwordless bypass refs; install/Docker/setup tests use passphrase. | Old no-password local login path removed. | Keep passphrase bootstrap tests. | NO | High |
| F-003 | P1 | Security | RESOLVED | Supply chain | `npm audit --audit-level=moderate --omit=dev` PASS after `axios` override. | Known axios advisory removed from npm production graph. | Track upstream SDK so override can be removed later. | NO | High |
| F-004 | P1 | Architecture | RESOLVED | Multi-tenant security (architecture boundary scaffolding only) | `npm run check:architecture-boundaries` PASS confirms no stray cross-layer imports between the security and rules layers; it does not certify cross-domain repository scoping or persistence-layer tenant isolation, which remain Phase 2 (RFC at `docs/architecture/multi-tenant-security-rfc.md`). | Security layer is architecturally separated from rules layer; this is necessary but not sufficient for tenant isolation, and the multi-tenant runtime path (env-gated by `FRIDAY_MULTI_TENANT_ENABLED=true`) is in-memory only. | Keep check in CI; do not treat this row as evidence that multi-tenant isolation is implemented. | NO | High |
| F-005 | P1 | Testing | RESOLVED | Full suite | `npm test` PASS: 10301 tests passed, 251 skipped, type errors 0. | Local test suite is green. | Keep live skipped lanes tracked separately. | NO | High |
| F-006 | P1 | Production readiness | RESOLVED | Docker/install auth | Docker clean passphrase smoke PASS; install smoke PASS. | Container/package auth path works without passwordless. | Keep unique-port smoke and token length checks. | NO | High |
| F-007 | P1 | Testing, Closed-loop wiring | RESOLVED | Real-world smoke (2026-05-01 SHA) | Reports `2026-05-01T21-21-24-003Z-fresh` and `2026-05-01T21-26-47-671Z-current-config` were captured locally on 2026-05-01 as 27/27 with `auth.source=local_passphrase_login`, DeepSeek primary, and OpenAI fallback. **2026-05-11 audit supplement**: the report files are not present in the current workspace at HEAD `9c27f9e98c1285818482e0dfe9a17ecb33aeb9c6` (`find -name "*2026-05-01T21-2*"` returns zero matches). The captured evidence is `local real-runtime/provider <deepseek+openai>` per `docs/release-evidence-policy.md`; it is historical/local diagnostic evidence only, **not** same-SHA release proof (the captured SHA predates 9 merged PRs #195-#203) and **not** RGG release proof (RGG artifact for current main is `status: blocked_by_env`). | Real LLM/tool/UI local smoke was captured for the 2026-05-01 SHA at a `local real-runtime/provider` tier; per §23.6 hard rule, that evidence is never same-SHA release proof on its own and is now historical relative to current main. The phrase "release-green" is not a defined tier in `docs/release-evidence-policy.md` and must not be reintroduced. | Keep these scenarios in CI/manual release gates and avoid passwordless/default-port regressions. Recapture against the current main SHA when a fresh local smoke run is performed; do not treat the 2026-05-01 capture as same-SHA proof. | NO | High |
| F-008 | P1 | Channels | OPEN | Live channels/Discord | Live channel suites skipped; no safe sandbox recipient/channel env in process; `DISCORD_BOT_TOKEN` is absent from the local/GitHub environment and the pasted token should be rotated. | Claimed channel delivery remains unverified. | Rotate pasted token, configure sandbox guild/channel IDs and token as environment secrets, run live channel E2E. | DEPENDS | High |
| F-009 | P1 | Production readiness | PARTIAL | External deployment | `fly.toml` now provides a Fly staging route, `staging-e2e` environment exists, and Cloud Live E2E has actor/ref guards; no Fly token/app/deployed URL is available yet. **2026-05-11 scope update**: the current owner-approved goal is non-cloud/local closure; Fly app creation, cloud secrets, deployed URL, Cloud Live E2E, and CORS/callback cloud smoke are explicitly out of scope for that goal. | Real CORS/cookie/OAuth/webhook deployment behavior remains unknown until staging is deployed. This must not be claimed complete for external launch, but it does not block the current non-cloud/local closure goal. | Deferred for the current non-cloud/local closure goal. Reopen only when the owner resumes external launch work; then create Fly app, set secrets, deploy, and run Cloud Live E2E plus CORS/callback smoke. | OUT OF SCOPE for current non-cloud/local goal; YES for external launch | High |
| F-010 | P2 | Maintainability | PARTIAL | Hub/runtime architecture | Large composition/runtime files remain, but PR #213 (`62093075705a83832d121880f21999d0a704ab6d`, head `c6bfdb5fae32a2e0535232e5777cc85e5f09a21d`) completed one local maintainability slice by extracting base API route installation into `src/api/runtime/friday-api-runtime-base-routes.ts`, reducing `src/api/runtime/friday-api-runtime.ts` route-composition bulk. PR #213 checks passed. | One meaningful local seam is now separated, lowering near-term runtime composition risk. The broader architecture debt is not fully closed: hub/bootstrap/runtime composition remains large and future safety/security review still benefits from smaller follow-on slices. | Keep this finding open as broader architecture debt. Future slices should extract one coherent module at a time with focused tests; do not bundle architecture cleanup with product behavior changes. | NO for the current non-cloud/local closure slice; DEPENDS for broader architecture-debt closure | Medium |
| F-011 | P2 | Observability | RESOLVED | Audit trail lifecycle | PR #214 (`ec755664dea4325006342ac5dc112f9ec6db839f`, head `839c19de80e91f7246a9683626d6f2a7c8133c2f`) tracks background audit appends in `src/observability/services/friday-observability-api-service.ts`, drains pending writes in `shutdown()`, surfaces background append failure as `OBS_AUDIT_BACKGROUND_APPEND_FAILED`, and calls `observabilityService.shutdown()` during hub shutdown before state close. Focused unit tests cover drain success and background failure behavior; PR #214 checks passed. | Late audit writes are deterministic and no longer hidden as expected DB-closed noise during shutdown. | Keep audit drain tests and avoid broad catches that hide append failures. | NO | High |
| F-012 | P2 | Workspace hygiene | RESOLVED | Local verification | 30 untracked duplicate/local artifact files were quarantined at `/tmp/friday-audit-quarantine-20260501T220523Z/`; repo-root `npm run check:migrations` now PASS. | Dirty workspace risk removed for this branch. | Keep generated/duplicate artifacts out of repo worktrees. | NO | High |
| F-013 | P2 | CI/CD governance | PARTIAL | Branch protection | Historical 2026-05-11 text recorded strict required checks plus a one-review posture; the 2026-05-19 Phase 18B readback supersedes that posture with `required_approving_review_count=0`, `required_status_checks.strict=true`, `required_conversation_resolution.enabled=true`, force-push/delete disabled, and `enforce_admins.enabled=false`. **2026-05-11 audit supplement**: `gh api repos/thesongzhu/Friday/branches/main/protection` also reports `enforce_admins.enabled: false` and `dismiss_stale_reviews: true`; the then-recorded required approving review count was superseded by the 2026-05-19 readback value `0`. With `enforce_admins=false`, repo admins can implicitly bypass the then-one-review requirement at merge time (no explicit `--admin` flag needed). PR #203 merge fact: `merged_by: thesongzhu`, `reviews: []` (0 approving reviews), `reviewDecision: REVIEW_REQUIRED`, `mergedAt: 2026-05-11T21:22:27Z`, merge commit `9c27f9e98c1285818482e0dfe9a17ecb33aeb9c6` — the merge was platform-allowed only because of the admin bypass mechanism above. This is a governance/process drift relative to §23.6 hard rule "`--admin` bypass of branch protection is forbidden by default" and §23.2 Stage 8 "PR author cannot self-approve", not a code-behavior regression. **2026-05-11 audit supplement (post-#204)**: a second admin-merged PR — `#204`, merge commit `862cbb23b6470e64019bea983dc4722e9ff95d69`, `mergedAt: 2026-05-11T22:49:43Z`, `merged_by: thesongzhu`, `reviews: []` (0 approving), `reviewDecision: REVIEW_REQUIRED` — was merged via the same implicit `enforce_admins=false` bypass. The durable PR #204 body explicitly stated *"This PR MUST receive a non-admin approving review before merge. Merging under the implicit `enforce_admins=false` platform bypass would repeat the PR #203 governance drift."* The merge action contradicted that pre-merge governance condition. The user later stated in-thread that no second write-access reviewer is available on this single-maintainer repo, but **that statement was not captured in any durable pre-merge PR-side artifact (PR body section OR PR comment) BEFORE the merge action (post-merge records, including the F-013 entry itself, document what happened but cannot supply a retroactive pre-merge approval)**. The merge action cannot retroactively be classified as the missing approval. Both PR #203 (silent drift) and PR #204 (durable-body-vs-merge contradiction) are the same platform mechanism: implicit `enforce_admins=false` admin bypass. The mechanism remains platform-enabled at this SHA. | Branch protection was formerly documented as configured for a one-review-required path; the current live posture is zero required approving reviews while the implicit `enforce_admins=false` admin-owner route remains platform-enabled and has now produced two same-day uncaptured-approval merges. This is **not** release proof. It is **not** reviewer proof. It is **not** a substitute for Stage 5 two-reviewer pass. It is not acceptable for safety / security / release-governance / irreversible / approval-boundary / secrets / runtime-execution / memory-context-compression / provider-plugin-MCP-skill-lifecycle / default-on / release-proof-standard scope. The platform mechanism is independent of the §23.6 `--admin` flag prohibition; that rule alone does not close this route. The narrow single-maintainer owner-bypass exception (defined in master prompt §23.6, mirrored in `AGENTS.md`) requires durable pre-merge approval capture; it does not extend to high-risk scope and does not retroactively absorb the #204 contradiction. | Choose one of the following before merging any further admin-author PR: (a) **Platform lockout path** — add a second write-access reviewer to the repo, then flip `enforce_admins.enabled` to `true` so §23.6 is enforceable at the GitHub layer. This blocks all self-merge until the second reviewer is in place; explicit user choice required because it removes the operator's ability to self-merge alone. (b) **Narrow owner-bypass exception path** — keep `enforce_admins=false`, but require every admin-author merge to satisfy the §23.6 single-maintainer exception conditions with a durable pre-merge record (PR body section OR PR comment) posted BEFORE the merge action (post-merge records, including this F-013 entry, document what happened and cannot supply a retroactive pre-merge approval). The exception is per-merge, never standing, and never extends to safety/security/release-governance/irreversible/approval/secrets/runtime/memory/provider/plugin/MCP/skill/default-on/release-proof scope. Do not change branch protection or GitHub settings as part of this finding entry. Decision deferred to a future explicit user choice. (Scope-class summary used by the Blocks Launch cell: high-risk scope blocks launch unconditionally; narrow doc-only slices may proceed only when every §23.6 owner-bypass condition is satisfied per-merge with durable pre-merge capture, and even then the merge is governance bookkeeping, not release proof.) | DEPENDS | High |
| F-014 | P2 | Observability | OPEN | External metrics/traces | Friday has internal observability routes/tests, but no configured OTEL/Grafana endpoint and RFC marks OTLP export as future work. **2026-05-11 scope update**: OTEL/Grafana external export is explicitly out of scope for the current non-cloud/local closure goal. | External alerts/traces cannot be claimed in production. This remains open for external observability, but it does not block the current non-cloud/local closure goal. | Deferred for the current non-cloud/local closure goal. Reopen only when external observability is in scope; then implement/configure OTLP export or collector bridge and verify events land in Grafana Cloud. | OUT OF SCOPE for current non-cloud/local goal; DEPENDS for external observability | Medium |
| F-015 | P2 | CI/CD governance | RESOLVED | Cloud Live E2E | `.github/workflows/cloud-e2e.yml:47-76` defines an `authorize-live-run` job that checks actor permission tier (admin/maintain/write) via `gh api repos/${REPOSITORY}/collaborators/${ACTOR}/permission` and pins ref to `branch=main`; both `cloud-contract` and `cloud-live-e2e` jobs declare `needs: authorize-live-run`. | In-workflow actor/ref check is now wired in addition to environment branch policy and GitHub permissions. | Keep the guard aligned if the workflow is renamed or split. | NO | High |
| F-016 | P2 | Architecture | PARTIAL | Packaging — architecture-vs-runtime honesty | Packaging engine uses in-memory `Map` storage (`src/packaging/engine/registry-manager.ts:180-184`, `src/packaging/engine/package-installer.ts:279-287`); bootstrap is env-gated by `FRIDAY_PACKAGING_ENABLED=true` (`src/hub/friday-hub-bootstrap.ts:5633`); no SQLite migration references package registry tables; the bootstrap publish handler creates stub manifest/signature data and returns "Stub verification passed" (`src/hub/friday-hub-bootstrap.ts:5661-5695`), and the verify handler also returns "Stub verification passed" without end-to-end signature verification (`src/hub/friday-hub-bootstrap.ts:5750-5756`). **2026-05-12 local-closure supplement**: the repository now mirrors this caveat in `docs/current-source-of-truth.md`, `docs/architecture/agent-package-rfc.md`, and `docs/phase3-refined-ac.md`; those docs explicitly state that package registry, install state, lifecycle events, trusted keys, and end-to-end signature verification are Phase 2/future and not current runtime proof. | Packaging remains a Phase 1 in-memory preview and still does not implement the SQLite-backed registry, install-lifecycle persistence, trusted-key persistence, or real signature verification described in `docs/architecture/agent-package-rfc.md`. The honesty gap is narrowed because current docs no longer present that Phase 2 design as already implemented. This is not package-distribution proof, not release proof, and not a default-on packaging capability claim. | For the current non-cloud/local closure goal, keep the honesty boundary and do not claim Phase 2 package distribution closure. To close packaging Phase 2 later, split into reviewed implementation slices: (1) SQLite-backed package registry persistence, (2) install/lifecycle/rollback persistence, (3) trusted-key persistence and key management, (4) real signature verification through the hub publish/verify path, and (5) migration/backfill/rollback tests. Do not mark F-016 `RESOLVED` until those paths are implemented and tested. | NO for current non-cloud/local honesty goal; DEPENDS for package distribution/default-on/Phase 2 packaging claims | High |
| F-017 | P1 | Skills lifecycle / Approval boundary / Runtime wiring | RESOLVED | Skill lifecycle HTTP routes (`/v1/skills/catalog`, `/v1/skills/:skillId`, `/v1/skills/validate-manifest`, `/v1/skills/:skillId/verify`, lifecycle-branch `install`/`update`/`delete`); `friday-self-healing-live` skill-verification-drift `it` | Original issue: lifecycle-gated routes required `deps.lifecycle`, hub did not pass `skillLifecycle`, and `POST /v1/skills/:skillId/verify` returned route-level HTTP 404 in the 2026-05-11 DeepSeek local live run. PR #210 (`3c4cc7029d65b4f2c9eab157b6bf3456edcc8ed7`, head `a53d059b26a04b9432b3bb1896abaea3681aaa29`) added canonical approval gates for lifecycle `update` and `delete` before mutation, with fail-closed tests. PR #211 (`76132acd8b4795c6c0b84ff1e9f67509263044a3`, head `c378171d5c9be261137c83bc8b3f213fe779664d`) constructs `createFridaySkillLifecycleService` in hub bootstrap and passes `skillLifecycle` into `createFridayApiRuntime`, registering the lifecycle-gated route family including `POST /v1/skills/:skillId/verify`. PR #210 and #211 checks passed. | The route-level 404 and unsafe-wiring blocker are closed for the current local/code goal: lifecycle routes are wired only after the mutating `update`/`delete` paths have canonical approval gates. This does not create same-SHA release proof, does not prove every live-provider self-healing scenario, and does not weaken the approval boundary. | Keep lifecycle approval-gate and route-registration tests. Live self-healing/provider proof must be rerun only when the relevant env is safely available and must be classified honestly; RGG `blocked_by_env` remains not pass. | NO for current non-cloud/local route-wiring goal; DEPENDS for future full live-provider/RGG proof or default-on claims | High |
| F-018 | P2 | Test harness / capability gating | RESOLVED | `test/e2e/live/friday-autonomous-restart.e2e.test.ts` 4th `it` (visual verification); DeepSeek lane vs vision capability | The 4th `it` block at `test/e2e/live/friday-autonomous-restart.e2e.test.ts:298-388` requires visual verification, while DeepSeek provider templates still expose only text/reasoning models. **2026-05-12 post-#208 supplement**: PR #208 (`ce27d96f9602ce97b22fcc6ac6217d5be56f2d84`, head `98af5b3012182dafb0b60fda09716b80130e7e20`) changed only `test/e2e/live/friday-autonomous-restart.e2e.test.ts`: it imports `selectFridayDeepProofProviderKind`, computes `AUTONOMOUS_RESTART_VISUAL_VERIFICATION_GATED = selectFridayDeepProofProviderKind() !== "deepseek"`, and applies `it.skipIf(!AUTONOMOUS_RESTART_VISUAL_VERIFICATION_GATED)` only to the fourth visual-verification `it`. The first three autonomous-restart tests remain active for DeepSeek; the whole file is not skipped; OpenAI/Anthropic/Ollama behavior is not weakened. Focused non-live verification showed the file correctly skipped when no live lane was enabled; PR #208 RGG artifact `real-green-gate-result.json` was `status: blocked_by_env`, scenarios `0/0/0`, so no release proof was produced. | The DeepSeek lane no longer overclaims vision-capable proof for the visual verification `it`. This is a truthful capability gate, not provider-agnostic vision proof and not release proof. | Keep the per-lane caveat in the post-#208 matrix snapshot. If a vision-capable DeepSeek model is later registered, explicitly update provider capabilities and re-enable the visual `it` under a separate reviewed slice. | NO for the current non-cloud/local goal; still not evidence that DeepSeek supports vision. | High |
| F-019 | P1 | Skills lifecycle / Generator-to-candidate-store bridge | RESOLVED | `test/e2e/live/friday-generator-maintenance-live.e2e.test.ts`; skill autonomy upgrade lifecycle | Original issue: generator approval wrote directly to the generated-skill path and did not produce a candidate/lifecycle handoff (`candidateId`, canonical approval, or plan digest), so generator-origin skills bypassed the candidate store. PR #212 (`2577c8ef9883c47ade4ed46af25c836373319f5b`, head `b492da6d990a86b9294856b1894392cb7ae8bc69`) added the generator-to-candidate bridge, returns `candidateId`/candidate metadata from approval, updates generator route/model/tool contracts, and added focused route/service/reflex/UI tests. PR #212 checks passed. | Generator-approved skills now enter the unified candidate/lifecycle handoff instead of bypassing lifecycle tracking. This is local/code contract closure, not same-SHA release proof and not proof that the DeepSeek generator-maintenance live test has been rerun end-to-end. | Keep generator approval tests aligned with the candidate contract. Rerun generator-maintenance live evidence only when provider/env is available and classify it separately from RGG release proof. | NO for current non-cloud/local bridge goal; DEPENDS for future live-provider/RGG proof claims | High |
| F-020 | P2 | Test hygiene / workspace pollution risk | RESOLVED | `test/e2e/live/friday-self-healing-live.e2e.test.ts` skill-verification-drift `it` | Original issue: the skill-verification-drift `it` wrote synthetic/broken skill fixtures under repo-tracked `<repo>/skills/`, risking tampered production starter-skill files if the process died before cleanup. **2026-05-12 post-#207 supplement**: PR #207 (`d711160d7deaf381bea5599032decb01dd6b3beb`, head `ec5b74c0cabefb85b7d3f0abf0e81b986774a915`) changed only `test/e2e/live/friday-self-healing-live.e2e.test.ts`. The test now creates an isolated `os.tmpdir()` fixture via `fs.mkdtempSync`, sets `FRIDAY_SKILLS_DIR` before `createRealHubEnv()`, restores the previous env value, and removes the tmpdir in `afterAll`. The touched test no longer contains `path.join(process.cwd(), "skills")`; the tracked `skills/` file count stayed at 177 during verification; no `e2e-skill-drift-*` directory was left under repo `skills/`. PR #207 RGG artifact `real-green-gate-result.json` was `status: blocked_by_env`, scenarios `0/0/0`, so no release proof was produced. | The repo-tracked `skills/` pollution route is closed for this live test. This test-hygiene fix did not by itself prove the skill-verification-drift live scenario; F-017 later closed the route-registration/approval-gate blocker via PR #210/#211, and that live scenario still requires a separately classified rerun if provider/runtime env is available. | Keep synthetic skill fixtures outside repo-tracked starter-skill directories. When live-provider env is safely available, rerun the skill-verification-drift `it` and classify its result separately from F-020 and from RGG release proof. | NO | High |

## 2026-05-12 Post-#208 Ledger Supplement

This section records post-#205 through post-#208 facts that cut across multiple findings. It does not change the release-proof tier of any row.

## 2026-05-19 Phase 18B Governance Truth Supplement

This supplement supersedes older F-013/P0/P2 text that described the live `main`
branch as requiring one approving review. The 2026-05-19 Phase 18B readback of
`gh api repos/thesongzhu/Friday/branches/main/protection` reports:

- `required_status_checks.strict=true` with required checks `build`, `test`,
  `migrations`, `security`, `contracts`, `ssd-lint`, `alignment-guard`,
  `agent-parity`, `secrets`, and `quality-gate`.
- `required_pull_request_reviews.required_approving_review_count=0`.
- `required_pull_request_reviews.dismiss_stale_reviews=true`.
- `required_pull_request_reviews.require_last_push_approval=false`.
- `required_conversation_resolution.enabled=true`.
- `allow_force_pushes.enabled=false` and `allow_deletions.enabled=false`.
- `enforce_admins.enabled=false`.

This is docs/register truth only. No branch protection, GitHub setting,
approval semantic, owner-bypass rule, release-proof standard, or runtime
behavior changed in this supplement. The current single-maintainer merge path
still requires the repo-tracked PR-side gate record, two isolated reviewer
passes for meaningful changes, required CI success, and same-SHA RGG artifact
truth before auto-merge can be considered. F-013 remains `PARTIAL` because
`enforce_admins.enabled=false` remains live and merge governance is bookkeeping,
not reviewer proof or release proof.

### Governance / Merge Facts

All four PRs below were merged by `thesongzhu` with `reviews: []` and `reviewDecision: REVIEW_REQUIRED` while branch protection still allowed the implicit admin-owner path (`enforce_admins.enabled: false`). These facts keep F-013 `PARTIAL`; they are governance bookkeeping, not reviewer proof and not release proof.

| PR | Merge commit | Head SHA | mergedAt UTC | Scope | RGG artifact status |
|---|---|---|---|---|---|
| #205 | `d282a104eccfbb00fbcdc3927fa1b67c9659d889` | `382fca3db2f91dda765525000cc5f18b5768e4d2` | `2026-05-12T03:11:11Z` | Governance mirror; F-013 `RESOLVED` -> `PARTIAL` | `blocked_by_env`, scenarios `0/0/0` |
| #206 | `bbc0ba69ddb37dc1fee053ca6e7811805837447e` | `8fae5decfda81e2e1146d5e4a0d108063af58475` | `2026-05-12T04:08:59Z` | Non-cloud/local closure boundary docs | `blocked_by_env`, scenarios `0/0/0` |
| #207 | `d711160d7deaf381bea5599032decb01dd6b3beb` | `ec5b74c0cabefb85b7d3f0abf0e81b986774a915` | `2026-05-12T04:29:47Z` | F-020 test hygiene | `blocked_by_env`, scenarios `0/0/0` |
| #208 | `ce27d96f9602ce97b22fcc6ac6217d5be56f2d84` | `98af5b3012182dafb0b60fda09716b80130e7e20` | `2026-05-12T05:08:39Z` | F-018 DeepSeek visual capability gate | `blocked_by_env`, scenarios `0/0/0` |

### DeepSeek Queue Evidence Update

Phase 4 read-only audit found local Claude JSONL transcript evidence for the two DeepSeek queue tests that lacked clean per-test log files:

- `friday-self-upgrade-mcp-server-live.e2e.test.ts`: transcript-backed local PASS (`1/1`, single attempt, 414 ms test time), but no clean log under `/tmp/friday-deepseek-queue-20260511/`.
- `friday-self-upgrade-channel-adapter-live.e2e.test.ts`: transcript-backed local PASS (`1/1`, single attempt, 334 ms test time), but no clean log under `/tmp/friday-deepseek-queue-20260511/`.

This improves the historical local evidence classification from "unknown outcome" to "transcript-backed local PASS, missing clean log artifact". It is not same-SHA release proof, not RGG proof, and not a substitute for a future rerun with clean per-test artifact capture.

## 2026-05-19 Phase 19 Release-Proof Debt Supplement

Phase 19 rechecked `P1-009` and `P2-007` against the post-Phase-18H public v1
local track. The public v1 local track remains limited to local UI + operator +
non-technical independent-use readiness, and release-facing claims must stay
inside current proof. Phase 18A still carries a live UI/LLM acknowledgement + SSE
tail as `blocked_by_env` until a safe provider environment is available; that is
not closed or converted to pass by this supplement. The track does not include
channel/cloud live proof, external OTEL/Grafana proof, PR #244 closure, or a
release-complete-all claim.

F-014 remains open for external observability, but it is a future/no-claim item
for public v1 local. Internal observability routes, traces, audit, metrics,
health, and alert-routing surfaces remain active. Slack/SMTP dispatch and
OTEL/Grafana export require configured external environments and same-SHA
RGG/manual-external proof before any release-complete claim. Missing credentials
or missing external endpoints remain `blocked_by_env`, not pass.

The current public v1 release-proof ledger is
[`CAPABILITY_PROOF_MATRIX_2026-05-19_POST_267.md`](CAPABILITY_PROOF_MATRIX_2026-05-19_POST_267.md).
That snapshot closes Phase 19 release-proof debt only for public v1 local claims;
it does not resolve external observability, channel, cloud, or release-complete-all
claims.
