# Finance Live Contract Review — Phase 5B

Date: 2026-06-13

Scope: local FinanceManager read-only smoke against `http://127.0.0.1:8001` and JARVIS Gateway `FINANCE_ADAPTER_MODE=live_readonly`.

No raw FinanceManager responses are committed here. This report records only structural, redacted observations.

## Local start

FinanceManager source was discovered through the existing editable venv install:

- Source: local FinanceManager repository
- App: `jarvis_finance.api.main:app`
- Command shape: `python -m uvicorn jarvis_finance.api.main:app --host 127.0.0.1 --port 8001`
- Runtime: existing local FinanceManager runtime outside Git

## Tested endpoints

### GET /api/health

- Reachable: yes
- HTTP status: 200
- Response category: small status object
- Used fields: status-like availability only
- Ignored fields: app/version/mode labels except for reachability inference
- Sensitive fields present: no structural sensitive keys observed
- MVP suitability: suitable

### GET /api/provider/status

- Reachable: yes
- HTTP status: 200
- Response category: list of provider status objects
- Used fields: provider status-like flags only
- Ignored fields: provider labels/messages are not passed through to JARVIS output
- Sensitive fields present: no structural sensitive keys observed
- MVP suitability: suitable as status-only input

### GET /api/runtime/status

- Reachable: yes
- HTTP status: 200
- Response category: runtime status object
- Used fields: reachability/status-like flags only
- Ignored fields: runtime path and currency metadata
- Sensitive fields present: path-like key observed and dropped
- MVP suitability: suitable only after sanitizer; raw response must never be exposed

### GET /api/system/status

- Reachable: yes
- HTTP status: 200
- Response category: system status object
- Used fields: status-like metadata only
- Ignored fields: URL/process/detail metadata
- Sensitive fields present: no value is passed through; URL-like metadata is ignored
- MVP suitability: suitable as reachability signal only

### GET /api/budget/import-status-audit

- Reachable: yes
- HTTP status: 200
- Response category: nested audit/status object
- Used fields: safe review-count style counters only
- Ignored fields: source names, candidate details, transaction/category/account-like structures
- Sensitive fields present: many account/transaction/budget-like structural keys observed and dropped
- MVP suitability: suitable only through strict allowlist mapping

## Resulting safe Finance Snapshot

Safe KPIs retained:

- Review Items count
- Provider verbunden yes/no/unknown
- Runtime erreichbar yes/no

Safe Attention Items retained:

- Review nötig
- Provider degradiert
- Import Audit prüfen
- Runtime offline

Safe SourceHealth retained:

- reachable
- stale
- source_type=`http_api`
- contract_version
- last_success_at
- last_attempt_at

## Risks and mitigations

- Runtime endpoint contains path-like structure: ignored and covered by redaction tests.
- Budget audit endpoint contains many budget/account/transaction-like keys: allowlist mapping only; unknown fields ignored.
- Provider endpoint is a list, not a dict: sanitizer now handles list status shape without copying provider names/messages.
- No raw responses are committed. Synthetic fixtures mimic structure only.

## Phase 5B gate result

`make smoke-finance-live-readonly` passed against the local FinanceManager at `http://127.0.0.1:8001`.
