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.
| ID | Date | Decision | Binds | Normative page |
|---|---|---|---|---|
| SA-13 | 2026-10-24 | A project's cross-project context is derived from the pages it cites; hierarchy is expressed by citations, never by cluster nesting | all coding agents, every product | ProjectContextSeparationDesign |
| SA-12 | 2026-10-17 | Marketing attribution and customer sales flywheel (Roller to Stockroom) | Roller, Stockroom, JakeMon, accounting | SimpleAgilityAttributionRFC |
| SA-11 | 2026-10-14 | Commerce and financial reconciliation lifecycle (Inbound to General Ledger) | Stockroom, accounting | SimpleAgilityCommerceDataFlow |
| SA-10 | 2026-10-14 | Small business accounting is a dedicated suite component; WealthView remains personal finance | accounting, WealthView | SimpleAgilityStackHub |
| SA-9 | 2026-10-14 | Cross-repo agent coordination and architectural decisions run through the wiki's Agent Coordination Ledger | all coding agents | SimpleAgilityAgentCoordination |
| SA-8 | 2026-10-14 | Stockroom-to-Roller customer spotlight flywheel is operator-assisted | Stockroom, Roller | ResellingHub, RollerHub |
| SA-7 | 2026-10-14 | Roller is the canonical customer communication platform; customer outreach blogs use Roller native agent publishing | Roller, Blogger Agent | RollerHub |
| SA-6 | 2026-10-12 | Elastic Common Schema (ECS) is the stack's logging standard | every product | SimpleAgilityTelemetryContract §2 |
| SA-5 | 2026-10-12 | Product instances are named <product>-<env> in a service_instance label | every product, jakemon | SimpleAgilityTelemetryContract §1 |
| SA-4 | 2026-10-12 | jakemon may hold application code only when it serves the whole stack and belongs with the plane | jakemon | JakemonHub |
| SA-3 | 2026-08-18 | Every alert names its runbook | jakemon, Wikantik | SimpleAgilityOnCallAutomation |
| SA-2 | 2026-08-18 | The stack deployment is the deployment label, never instance | jakemon | SimpleAgilityObservabilityPlane |
| SA-1 | 2026-08-18 | Telemetry goes to the plane; product inputs stay in the product | every product | SimpleAgilityObservabilityPlane |
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.
roller briefing could not reach SimpleAgilityTelemetryContract at all, because it is not a roller member; strict scoping made that worse; and Stockroom had no cluster of its own, its designs and plans being parked in simple-agility.RollerTelemetryHandoffSpec → SimpleAgilityTelemetryContract. No one edits the contract, no hub grows, and no registry is maintained across four repositories.Consequences.
get_briefing(clusters=["<project cluster>"], prompt="<your first task>").stockroom cluster; its eleven designs and plans moved there on 2026-10-24, and simple-agility holds only cross-project pages.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.
blogger-agent pipeline will incorporate EPN campaign parameters and coupon callouts when authoring spotlight drafts.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.
lot_acquisition_cost_cents) and calculates base item costs, allowing operators to enter line-item overrides before finalizing an intake batch.simple-agility-accounting.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.
simple-agility-accounting) will ingest Stockroom's realized sales and acquisition costs.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.
CLAUDE.md, .agents/AGENTS.md) must include the standard Simple Agility header.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-INIT-02)./api/mcp or REST API.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.
/api/mcp endpoint (RollerMcp), enabling autonomous agents to draft, stage, and schedule entries without fragile browser scraping or third-party OAuth flows.docker2 host within the Simple Agility container fleet, logging via ECS and monitored directly by jakemon.Consequences.
roller-prod).blogger-agent is refactored (SA-INIT-01) to replace Google Blogger API calls with Roller REST/MCP calls.blog-assets continues to serve as the high-availability media CDN for featured images and photograph hosting.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:
@timestamplog.levelmessageservice.nametrace.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.
JsonTemplateLayout ships an ECS template, and Elastic ships ECS loggers for most languages. A new product gets conformant logs from configuration, not code.traceparent. ECS names that value trace.id, which is also what OpenTelemetry and Elastic agents fill in, so adopting either later is additive.Consequences.
| json turns dotted keys into underscored labels: log.level becomes log_level and trace.id becomes trace_id. So a query reads {service="wikantik"} | json | trace_id="…".service.name (it currently uses a custom application key);requestId becomes transaction.id);trace.id.bin/simple-agility-conformance.sh, Wikantik repository) must check the ECS keys rather than the old envelope.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:
service: the product (wikantik, roller), matching its metric prefix and its service.name log field.service_instance: that copy, named <product>-<env> in lowercase with a hyphen. Examples: wiki-prod, wiki-support, wiki-dev, roller-prod.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.
instance is taken. Prometheus sets instance to the scrape target (host.docker.internal:8080). jakemon's dashboards rely on that meaning, and a product-emitted instance is renamed to exported_instance.deployment means something else. It names the whole stack deployment, the tenant, and stays that way (see SA-2).<product>-<env> reads well in an alert and generalizes. It is the form the plane contract already used in its examples. It also separates development copies from production ones without relying on host. Today minisforum runs development copies of production containers, and host is the only thing that tells them apart.wiki-prod or wiki-support unchanged.Consequences.
apps.alloy sets the labels on the product's scrape target, and on its containers' log streams through a discovery.relabel "products" hook. Live since 2026-10-12: wiki-prod (docker1, metrics and logs), crafter-prod (docker2, metrics and logs), roller-prod (docker2, logs only, because Roller has no /metrics yet), and wiki-dev and crafter-dev (minisforum, logs). Alerts on those series inherit the labels.service means the product everywhere on the plane. jakemon's per-systemd-unit resource series (host_service:*) label the unit unit, not service.service label also becomes Loki's automatic service_name.<product>-<env> pattern is the default wherever a product deployment is named: feed shipper targets, backup names, Grafana variables. The product short names are wiki (Wikantik), roller, crafter (CrafterCMS) and stockroom.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.
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.
deployment, never instanceIn 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).
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.