Dexter Williams (operator of Estate Solutions LLC, Estate Realty Group, Ahvino Enterprises LLC, and personal accounts) requested an evaluation of building a Finance Vault and AI Tax Strategist module integrated into his existing OpenClaw / Claude Code platform on a Hostinger VPS.
This document is a full evaluation report covering system feasibility, security risks, architecture recommendations, and a detailed build plan. No build actions have been taken. All findings are advisory only. Phase 2 build requires Dexter's explicit approval on 7 decisions documented in Section 7.
Verdict: Feasible with targeted mitigations. The infrastructure to support an AI tax strategist exists on this VPS. The critical constraint is that financial documents must NOT be stored on the VPS. The processing engine can live on-VPS; the documents live off-VPS (encrypted on Dexter's PC or Backblaze B2).
The existing platform consists of:
| Component | Location | Role |
|---|---|---|
| Claude Code Bridge | /opt/claude-bridge/bridge.js | Discord bot → headless Claude Code sessions via Anthropic SDK |
| OpenClaw (COS) | /opt/openclaw/ (root-owned) | Multi-agent orchestration platform; manages Estelle, Aria, Atlas |
| Workspace | /home/coder/workspace/ | Git-tracked workspace; daily backup to GitHub at 5 AM |
| Channel Memory | /home/coder/workspace/channel-memory/ | Per-channel MEMORY.md + message-log.jsonl for persistence |
| 9 Discord Channels | Bridge-wired | #claude-code, #trading, #realestate, #estate-solutions, #ellie-email, #dexter-inbox, #platform, #fcs, #emerys-fashion |
| Public File Hosting | /docker/public-drops/ | https://drops.srv1617495.hstgr.cloud/ |
| Docker Containers | 19 running | n8n, traefik, openclaw, est8-web, a4p, serpbear, etc. |
Every Claude Code session spawned by bridge.js uses:
const options = {
model,
permissionMode: "bypassPermissions", // ← ALL permission checks skipped
cwd: WORKSPACE, // ← /home/coder/workspace
maxTurns: 400
};
Critical: permissionMode: "bypassPermissions" means any Claude Code session on any channel can read, write, or modify any file accessible to the coder user — including files from other channels.
C1 — No Attachment Cleanup
Discord attachments auto-download to /tmp/discord-attachments/<timestamp>-<name> with no cleanup, no TTL, no expiry. Files persist indefinitely. Tax documents, bank statements, and K-1s dropped into Discord would accumulate on the VPS in plaintext.
C2 — GitHub Backup Exposes Financial Documents
backup.sh runs git add -A daily at 5 AM and pushes to GitHub. .gitignore only excludes node_modules/, *.log, .env, .env.*. Any financial document placed in /home/coder/workspace/ would be committed and pushed to GitHub automatically.
C3 — bypassPermissions Cross-Channel Access
All 9 Discord channel sessions share permissionMode: "bypassPermissions". A Finance Vault session and a #trading session run with identical permissions. No file isolation between channels exists at the bridge level.
C4 — PermitRootLogin Yes
/etc/ssh/sshd_config has PermitRootLogin yes. This is a VPS-wide security gap independent of the Finance Vault. Should be remediated via COS regardless of vault timeline.
C5 — No Encryption at Rest
No workspace files are encrypted at rest. The age encryption tool is installed at /usr/bin/age and available for use. It is not currently used for any file-level encryption.
A Finance Vault / AI Tax Strategist module for a multi-entity small business operator. Entities: Estate Solutions LLC (GA), Estate Realty Group (GA), Ahvino Enterprises LLC (MS), Personal. Use cases: tax strategy planning, deduction categorization, entity-level analysis, CPA collaboration prep.
Claude Opus 4.8 has sufficient reasoning capability for tax strategy at the small-business level. The bridge and channel memory system provides adequate persistence for multi-session work. The age encryption tool supports file-level security. Capability gap: no ZDR (Zero Data Retention) — API calls are subject to Anthropic standard data handling.
| Data Type | Classification | Where It Can Live |
|---|---|---|
| Tax strategy discussions (no PII) | Sensitive | On-VPS vault dir, encrypted at rest |
| Research outputs (IRC citations, entity analysis) | Low sensitivity | On-VPS vault dir |
| Financial documents (returns, statements, K-1s) | High sensitivity / PII | OFF-VPS only (Dexter's PC or B2 encrypted) |
| CPA packages | Medium-high | age-encrypted export, local + B2 backup |
Four entities with cross-cutting relationships require the agent to reason about: shared owners, shared vendors, equipment usage across entities (triggers IRC §267 related-party rules), and multi-state nexus (GA + MS). The agent must always ask "does this transaction involve another entity in the Dexter Williams group?" before responding about deductions, basis, or elections.
Processing order: Federal (IRS) → Georgia DOR → Mississippi DOR. Source priority: IRS.gov → Treasury Regs (26 CFR) → GA DOR → MS DOR → Tax Court/Revenue Rulings → CPA-reviewed secondaries. Agent must never invert the jurisdiction stack.
/home/coder/finance-vault/ with 0700 permissions, outside workspace git treepermissionMode: "default" + explicit allowedToolsDocuments live OFF the VPS. Dexter decrypts on his PC and pastes relevant text into the vault Discord channel manually. The agent works from text pastes — never from raw financial document files. This keeps PII off the VPS processing pipeline.
The agent does strategy and planning. The CPA does execution and filing. The agent produces "CPA-ready packages" — structured summaries with citations, entity breakdown, and flagged questions. A !export-for-cpa command formats session findings into /home/coder/finance-vault/cpa-packages/. CPA corrections flow back in via Dexter paste; stored as authoritative overrides with higher confidence weight.
| Data Type | Sensitivity | Backup Method |
|---|---|---|
| Tax research (no PII) | Low | Workspace git (after vault exclusion rules set) |
| Strategy outputs | Medium | age-encrypted Backblaze B2 |
| Document transcriptions (PII possible) | High | NEVER backed up — delete after processing |
| CPA packages | Medium-high | age-encrypted, local + B2 |
COS, Estelle (Estate Solutions GHL agent), Aria (A4P), and Atlas (Platform) must have no access to Finance Vault content. COS has ssh_exec and file_write tools — the vault directory's 0700 permissions block COS (which runs as root/ubuntu, not coder... actually COS may run with elevated perms — verify). Explicit prohibition must be added to CLAUDE.md, COS operating doc, and each specialist agent's system prompt.
The age tool is installed at /usr/bin/age. Key pair: generate on Dexter's PC; private key stays on Dexter's PC only; public key stored at /home/coder/finance-vault/.age-public-key. Encryption command: age -r $(cat /home/coder/finance-vault/.age-public-key) -o output.age input.txt. VPS only ever stores encrypted outputs.
Every vault agent response includes a machine-parseable metadata block:
[TAX-CONFIDENCE: SETTLED | THRESHOLD | UNCERTAIN]
[ENTITY: Estate Solutions LLC]
[TAX-YEAR: 2025]
[JURISDICTION: Federal + GA]
[CPA-REVIEW-REQUIRED: YES/NO]
[CITATIONS: IRC §179(b)(1), Rev. Proc. 2024-38]
At least one entity is likely S-Corp elected or evaluating election. S-Corp strategies (reasonable compensation, basis tracking, QBID interaction, shareholder loans) are the single most complex area. Every S-Corp response must be prefaced with: "S-Corp planning requires current-year basis calculation. Confirm basis with your CPA before relying on this analysis." CPA escalation threshold is lower for S-Corp questions than for other tax areas.
When the agent gives wrong advice and the CPA corrects it: a !correct command records the correction alongside the original recommendation in corrections-log.md. The corrections log is injected into every session start (alongside MEMORY.md). The corrections log is included in every CPA package. This is the mechanism by which the vault agent improves over time.
See Section 7 of this document for full decision list.
See Section 8 of this document for the revised 11-step build plan.
Phase 1 listed "write the system prompt" as Step 6 of 9. This undersells it by a factor of 10. The system prompt IS the tax strategist. Everything else is infrastructure. A poorly-written system prompt produces hallucinated citations, cross-entity contamination, jurisdiction bleed, and overconfident output that bypasses CPA review gates.
The system prompt needs 12 distinct constraint blocks:
Switching to permissionMode: "default" alone is insufficient. Without specifying which tools are allowed, default mode will pop permission prompts in a headless session and hang silently. The vault channel handler must include an explicit allowedTools list:
allowedTools: ["Read", "Write", "Bash", "Glob", "Grep"],
// Blocked: WebSearch, Agent, WebFetch, Edit
// Edit blocked → use Write for full-file rewrites (better audit trail)
// WebSearch blocked → local tax knowledge base instead
// Agent blocked → no sub-agent spawning from vault sessions
Trading crons are paused but the channel still has a MEMORY.md. If it contains financial strategy data that could contaminate vault sessions, it should be purged before Phase 2 begins.
When a Discord attachment is read by a Claude Code session, the content flows through the session context window → potentially into MEMORY.md and message-log.jsonl → potentially into Anthropic API logs (no ZDR on this account). The system prompt must explicitly prohibit writing PII from documents to persistent memory.
/home/coder/finance-vault/
├── entities/
│ ├── estate-solutions-llc/
│ │ ├── 2024/
│ │ ├── 2025/
│ │ └── active/
│ ├── estate-realty-group/
│ ├── ahvino-enterprises/
│ └── personal/
├── research/
│ ├── federal/
│ ├── georgia/
│ └── mississippi/
├── cpa-packages/
├── session-logs/
├── corrections-log.md
└── vault.config.json
This structure forces every agent action to be scoped to a specific entity and tax year. vault.config.json holds entity metadata (type, state, fiscal year, member references) — NO actual EINs or SSNs in plaintext.
The agent works from downloaded, verified source documents in /research/ — not live web search. Documents: IRS Pub. 334, IRS Pub. 535, GA Form 600S instructions, MS Form 84-105 instructions, current-year Rev. Procs. relevant to construction/restoration. Agent cites by document name and page number. More reliable than web search — tax law doesn't change mid-session but web results do.
Machine-parseable block on every response (already detailed in S12 above). Allows Dexter to filter responses by confidence level and quickly identify what needs CPA review.
S-Corp questions (basis, reasonable compensation, QBID, shareholder loans) are the highest-complexity area. They should be recognized as a distinct trigger with higher CPA-escalation thresholds and a mandatory basis confirmation disclaimer on every response.
Already described in S15. This is the single most important mechanism for long-term vault agent quality. Without it, the agent will repeat the same wrong answers indefinitely.
The upload portal encrypts documents in the browser using Dexter's age public key BEFORE upload. The VPS only receives encrypted blobs. The agent never processes the encrypted blob — Dexter decrypts on his PC and pastes relevant text into the vault channel. VPS never touches plaintext financials.
If the agent confidently gives wrong tax advice and the CPA corrects it:
!correct [original recommendation] / [CPA correction] — records both in corrections-log.md| Layer | What | Where |
|---|---|---|
| Processing Engine | Claude Opus 4.8 via bridge | On-VPS, /home/coder/finance-vault/ |
| Document Storage | Financial documents (returns, statements, K-1s) | OFF-VPS — Dexter's PC (encrypted folder) or Backblaze B2 (age encrypted) |
| Research Library | IRS publications, state tax authority docs | On-VPS, /home/coder/finance-vault/research/ |
| Strategy Outputs | Analysis, recommendations, citations | On-VPS vault dir (age encrypted for CPA packages) |
| Persistent Memory | Channel MEMORY.md (no PII) | On-VPS, /home/coder/finance-vault/memory/ |
| Backup | Strategy/research only — no PII | age-encrypted to Backblaze B2 (separate from workspace git) |
| Agent Access | COS, Estelle, Aria, Atlas | EXCLUDED — zero access to vault |
The key principle: The VPS processes but doesn't store sensitive financials. Processing stays on-VPS for speed and integration. Documents stay off-VPS for security. The agent works from text pastes curated by Dexter — not from raw document files.
Decision 1Where do financial documents live?
Options: (A) Dexter's PC in an encrypted local folder, or (B) Backblaze B2 with age encryption. Recommendation: Dexter's PC as primary, B2 as backup. Documents never stored on VPS.
Decision 2Wife upload method?
Options: (A) LAN uploader on Dexter's PC (wife uploads to local folder via browser on home network), or (B) Cloudflare-tunneled HTTPS portal. Recommendation: LAN uploader — simpler, no external exposure. Client-side encryption either way.
Decision 3Finance Vault Discord channel — who has access?
Options: (A) Dexter-only private channel, or (B) Dexter + wife. Recommendation: Dexter-only — simpler to secure. Wife uploads to local portal; Dexter pastes context into vault channel.
Decision 4CPA status?
Is there an active CPA relationship currently? This determines how the CPA escalation triggers and CPA package export features are prioritized in the build. If no current CPA: the vault agent can still operate for strategy and planning, but all output carries higher CPA-required flags.
Decision 5Approve bypassPermissions → default hardening for vault sessions?
Switching vault bridge handler to permissionMode: "default" + explicit allowedTools is strongly recommended and is a prerequisite for secure operation. Requires bridge.js modification. Approve?
Decision 6Local IRS PDFs vs. training knowledge for tax law?
Options: (A) Download relevant IRS publications to /research/ as the agent's authoritative source (more reliable for year-specific rules, requires download step), or (B) Agent uses Claude's training knowledge for tax basics + web search for current-year specifics. Recommendation: Option A — local PDFs for anything that changes year-to-year; training knowledge for foundational concepts only.
Decision 7Should wife have direct Discord vault channel access?
If Decision 3 is Dexter-only: she uses the upload portal and Dexter pastes context. If Decision 3 includes wife: she can interact directly with the vault agent. Affects channel permissions design and upload portal scope.
Step 1Create vault directory structure
Create /home/coder/finance-vault/ with entity/year subdirectories at 0700 permissions. Outside workspace git tree. Add to backup.sh exclusion. Write vault.config.json with entity metadata.
Step 2Add attachment cleanup cron
Daily cron to delete files from /tmp/discord-attachments/ older than 24 hours. Prevents indefinite accumulation of sensitive files. Also configure vault sessions to NOT auto-read attachments — Dexter must explicitly paste or instruct.
Step 3 — LONGEST STEPBuild the vault agent system prompt
Write the full 12-constraint-block prompt, entity isolation model, forbidden operations list, confidence scoring format, CPA escalation triggers, corrections log injection pattern, jurisdiction stack, and structured workspace model. Estimated 2–3 sessions.
Step 4Build local tax knowledge base
Download IRS Pub. 334, Pub. 535, GA Form 600S instructions, MS Form 84-105 instructions, current-year relevant Rev. Procs. to /home/coder/finance-vault/research/. Configure agent to cite these by document name/page rather than using WebSearch.
Step 5Create Finance Vault Discord channel
Create new private Discord channel. Set permissions per Decision 3 (Dexter-only or include wife). Note the channel ID for bridge.js configuration.
Step 6Add Finance Vault channel handler to bridge.js
New channel handler with: cwd: '/home/coder/finance-vault', permissionMode: "default", explicit allowedTools: ["Read", "Write", "Bash", "Glob", "Grep"], blocked tools including WebSearch, Agent, WebFetch. Test with sandbox question before live use.
Step 7Wife's upload portal
Client-side encryption model. Browser loads Dexter's age public key. Encrypts document before upload. VPS receives encrypted blob only. Dexter decrypts on his PC. No plaintext financials on VPS. Delivery method per Decision 2 (LAN or Cloudflare tunnel).
Step 8Set up age encryption
Generate age keypair on Dexter's PC. Private key stays on Dexter's PC only — never on VPS. Public key stored at /home/coder/finance-vault/.age-public-key. !export-for-cpa command encrypts output before writing to cpa-packages/.
Step 9Finance Vault backup pipeline
Separate from workspace git backup. Includes only research/ and strategy outputs (no session transcripts with PII). age-encrypted before upload to Backblaze B2. Separate cron schedule from workspace 5 AM backup.
Step 10Update governance documents
Add Finance Vault rules to CLAUDE.md: vault channel isolation, cross-agent access prohibition, corrections-log requirement, CPA escalation rule. Add to DO_NOT_REPEAT.md: "Finance Vault agent must never write PII from documents to MEMORY.md." Add vault exclusion to COS operating doc and each specialist agent system prompt.
Step 11Test run and validation
Dexter pastes a single, known tax scenario into vault channel. Verify: correct entity isolation, correct citations, correct confidence tier, correct CPA escalation if warranted, no PII in MEMORY.md after session. Fix before declaring done and operational.
The agent MUST write to MEMORY.md: entity context, open strategy questions, decisions made in prior sessions, elected tax positions.
The agent MUST NOT write to MEMORY.md: specific dollar amounts from statements, account numbers, Social Security numbers, EINs, names of specific transactions, anything that would constitute a PII exposure if MEMORY.md were accessed by another session.
| Tier | Meaning | CPA Required? |
|---|---|---|
| SETTLED | Black-letter law, no active controversy, established by statute or long-standing IRS guidance | No (but always wise) |
| THRESHOLD | Settled law with fact-dependent application, or subject to reasonableness tests (e.g., reasonable compensation) | Strongly recommended |
| UNCERTAIN | Active litigation, changing guidance, novel application, or aggressive position | Required — flag explicitly |
Feasible — with the following conditions:
1. Financial documents stored off-VPS (Dexter's PC or Backblaze B2 with age encryption)
2. Agent system prompt written with full 12-constraint-block structure before any strategy sessions
3. Bridge.js vault handler uses permissionMode: "default" with explicit allowedTools
4. OpenClaw (COS, Estelle, Aria, Atlas) explicitly excluded from vault access
5. Corrections-log feedback loop implemented from day one
6. Vault directory outside workspace git tree (excluded from GitHub backup)
Do not rush the system prompt. The gap between "an AI that can talk about taxes" and "an AI tax strategist you'd trust for actual planning" is entirely in the system prompt quality. The infrastructure build is a half-day. The system prompt is a 2–3 session design effort. Budget accordingly.
Separate COS action packet (regardless of vault timeline): PermitRootLogin yes in /etc/ssh/sshd_config is a VPS-wide security gap that should be remediated independently. Route to COS: change to PermitRootLogin prohibit-password and verify key-based auth is working before applying.
This evaluation is complete. No build actions have been taken. The vault does not exist yet. All findings are advisory.
Phase 2 build begins when Dexter provides answers to all 7 decisions in Section 7 of this document.