Simple Agility Decision Log

This page records the decisions that bind more than one product in the Simple Agility stack. Read it before you design something that another product, or the observability plane, will have to agree with. Logging formats, label names and repository boundaries are all decided here.

How to use this page.

Index

IDDateDecisionBindsNormative page
SA-132026-10-24A project's cross-project context is derived from the pages it cites; hierarchy is expressed by citations, never by cluster nestingall coding agents, every productProjectContextSeparationDesign
SA-122026-10-17Marketing attribution and customer sales flywheel (Roller to Stockroom)Roller, Stockroom, JakeMon, accountingSimpleAgilityAttributionRFC
SA-112026-10-14Commerce and financial reconciliation lifecycle (Inbound to General Ledger)Stockroom, accountingSimpleAgilityCommerceDataFlow
SA-102026-10-14Small business accounting is a dedicated suite component; WealthView remains personal financeaccounting, WealthViewSimpleAgilityStackHub
SA-92026-10-14Cross-repo agent coordination and architectural decisions run through the wiki's Agent Coordination Ledgerall coding agentsSimpleAgilityAgentCoordination
SA-82026-10-14Stockroom-to-Roller customer spotlight flywheel is operator-assistedStockroom, RollerResellingHub, RollerHub
SA-72026-10-14Roller is the canonical customer communication platform; customer outreach blogs use Roller native agent publishingRoller, Blogger AgentRollerHub
SA-62026-10-12Elastic Common Schema (ECS) is the stack's logging standardevery productSimpleAgilityTelemetryContract §2
SA-52026-10-12Product instances are named <product>-<env> in a service_instance labelevery product, jakemonSimpleAgilityTelemetryContract §1
SA-42026-10-12jakemon may hold application code only when it serves the whole stack and belongs with the planejakemonJakemonHub
SA-32026-08-18Every alert names its runbookjakemon, WikantikSimpleAgilityOnCallAutomation
SA-22026-08-18The stack deployment is the deployment label, never instancejakemonSimpleAgilityObservabilityPlane
SA-12026-08-18Telemetry goes to the plane; product inputs stay in the productevery productSimpleAgilityObservabilityPlane

SA-13: Project context is derived from citations, not declared

Decided 2026-10-24.

Decision. A citation from a project page to a shared page is that project's adoption of it. A project is its cluster (roller, jakemon, stockroom, wikantik-development). The session-start briefing (get_briefing on the knowledge MCP, /api/briefing over HTTP) scoped to a project cluster delivers, in order: the project's own pages ranked by how many sibling pages link to them; then the shared pages the project's pages cite ("Contracts this project cites"), ranked by how many project pages cite them; and finally — only as one-line pointers — relevant sections from other projects ("Elsewhere in the wiki"). Nothing is declared for this to work: no project: field, no pattern tag, no hub registry. Project hierarchy is expressed by citations, never by nesting project clusters under simple-agility; the roadmap's "cluster restructuring" question is closed.

Why.

Consequences.

SA-12: Marketing attribution and customer sales flywheel (Roller to Stockroom)

Decided 2026-10-17 (Architectural RFC).

Decision. Customer outreach on Roller weblogs will be attributed to realized inventory sales in Stockroom and the general ledger using four structured vectors: (1) eBay Partner Network (EPN) affiliate tracking URLs with structured customid payloads (roller_<weblog>_<slug>_<sku>); (2) marketplace coded coupons (e.g. ROLLER5) extracted from order promotional metadata (appliedPromotions); (3) direct sovereign inquiries and Stripe Payment Links (client_reference_id) bypassing marketplace fees; and (4) a zero-code single-quantity SKU temporal heuristic joining Umami outbound cta-click events with Stockroom sales in Grafana. Stockroom's sale schema will be extended in a future phase with nullable attribution columns (attribution_channel, attribution_campaign, promo_code, attribution_confidence).

Why.

Consequences.

SA-11: Commerce and financial reconciliation lifecycle (Inbound to General Ledger)

Decided 2026-10-14.

Decision. Stockroom serves as the authoritative physical Warehouse Management System (WMS) and transaction pipeline, emitting four immutable, append-only JSON event types (ItemAcquired, ItemSold, ItemShipped, ItemDisposed) with integer-cent monetary values. Financial reconciliation into a double-entry General Ledger is decoupled into a dedicated accounting engine (simple-agility-accounting). Cost allocation on inbound acquisition lots defaults to uniform per-unit splits across batch items with manual unit overrides for high-value standouts. Marketplace disbursements (eBay Managed Payments, Amazon FBA) settle via two-tier accrual clearing accounts (1110 Marketplace Clearing), while non-sale inventory exits are booked explicitly via disposition reason codes.

Why.

Consequences.

SA-10: Small business accounting is a dedicated suite component; WealthView remains personal finance

Decided 2026-10-14.

Decision. WealthView remains strictly dedicated to personal finance, household portfolio accounting, rental properties, and retirement modeling. It will not become the accounting or general ledger backbone for the reselling business. Instead, a dedicated, purpose-built small business accounting tool will be developed as a future component of the Simple Agility suite.

Why.

Consequences.

SA-9: Cross-repo agent coordination and architectural decisions run through the wiki's Agent Coordination Ledger

Decided 2026-10-14.

Decision. Coding agents across all repositories (including Antigravity agy, Claude Code, and autonomous scripts) must use Wikantik as the authoritative asynchronous coordination plane. Cross-repo initiatives must be registered in the Active Initiatives Ledger on SimpleAgilityAgentCoordination, cross-cutting decisions must be recorded here, and all repository CLAUDE.md and .agents/AGENTS.md files must carry the standard Simple Agility Agent Header.

Why.

Consequences.

SA-8: Stockroom-to-Roller customer spotlight flywheel is operator-assisted

Decided 2026-10-14.

Decision. Transitioning notable inventory items from Stockroom into customer-facing blog posts on Roller is operator-assisted. During intake, cataloging, or pricing triage, the operator may flag an item as "Feature on Blog". This action packages item facts, condition notes, curated photos, and channel links into a draft spotlight entry staged in Roller for final operator review and scheduled publication.

Why.

Consequences.

SA-7: Roller is the canonical customer communication platform; customer outreach blogs use Roller native agent publishing

Decided 2026-10-14.

Decision. Apache Roller (self-hosted fork, Spring Boot, Java 25, PostgreSQL) is the exclusive, canonical customer communication platform for the Simple Agility business. A dedicated weblog for the reselling business will be hosted directly on Roller. The existing blogger-agent system is to be refactored into a native Roller publisher utilizing Roller v0.2.0 API tokens and the /api/mcp endpoint, deprecating third-party Google Blogger dependencies for business outreach.

Why.

Consequences.

SA-6: ECS is the stack logging standard

Decided 2026-10-12.

Decision. Every product writes its logs to stdout as one JSON object per line, using Elastic Common Schema (ECS) field names. The required fields are:

trace.id carries the cross-product correlation identifier, transaction.id carries the per-hop request identifier, and event.action names a business or behavioural event. This replaces the stack's earlier home-grown envelope (ts, level, msg, service, event, request_id, correlation_id).

Why.

Consequences.

SA-5: Product instances are named service_instance="<product>-<env>"

Decided 2026-10-12.

Decision. Each running copy of a product is identified on metrics and log streams by two labels:

The plane attaches both labels at collection time, from the host's apps.alloy in jakemon, to the product's scrape target and to its container's log stream. Products do not label themselves.

Why.

Consequences.

SA-4: jakemon may hold application code that serves the whole stack as the plane

Decided 2026-10-12.

Decision. jakemon keeps its rule of no application code, with one exception: an application whose purpose is global across the stack's applications and that belongs with the observability plane. The agent-facing query server qualifies. It is a read-only MCP surface over alert state, PromQL, LogQL and dashboard links, used by every product's agents, and it lives in the jakemon repository.

Why. The query server is the plane's read interface. Splitting it into another repository would separate it from the label conventions, rules and dashboards it explains. Product-specific logic would not pass the test, and neither would a general-purpose service that happens to be convenient to host in jakemon.

Consequences.

SA-3: Every alert names its runbook

In force since 2026-08-18.

Decision. Every alert rule carries runbook: Incident<AlertName>, naming a wiki page. Incident runbooks are type: runbook pages tagged incident-runbook, with an alert: field. Their source is in the jakemon repository, and they are published to this wiki.

Why. The on-call agent must get from a firing alert to its procedure without guessing. A label that points at a missing page is worse than no label, so both ends are checked: jakemon's commit gate rejects an unlabelled rule, and bin/runbook-check.sh verifies that every page exists.

Normative page: SimpleAgilityOnCallAutomation.

SA-2: The stack deployment is deployment, never instance

In force since 2026-08-18.

Decision. Every agent-shipped series and log stream carries deployment, naming the whole stack deployment (one tenant's jakemon, Wikantik and Roller; today jakemon-home), and host. Prometheus's instance keeps its own meaning, the scrape target.

Why. Overwriting instance would make the targets within one deployment indistinguishable and break the dashboards that rely on it. Product instances got their own label later (SA-5).

SA-1: Telemetry goes to the plane; product inputs stay in the product

In force since 2026-08-18.

Decision. Anything emitted so that a human or an agent can observe the system belongs on the plane (Prometheus and Loki). Anything that is a functional input to the product's own behaviour is a product table, not a metric.

The test: if this data vanished, would the product behave differently, or would only a dashboard go blank?

Normative page: SimpleAgilityObservabilityPlane, including its carve-outs for compliance audit logs.

See also