avodado
avodado docs
Blocks reference

Business & decisions

Field contracts and worked examples for the 16 business & decisions blocks.

Field contracts and worked examples for the business & decisions blocks — converted at build time from the repo's authoring-skill reference. Every example body is YAML; in a real doc the fence language is the block type (for example sequence … ). Schemas are strict — unknown fields are rejected. See the field contract for the at-a-glance shape of all 87 blocks, or the block catalog for live previews.

Access control / RBAC

matrix — a role × resource capability grid

```matrixeditable · live
renderedavo renders this
SECTION 01 · Capability matrix

Who can do what

Role / AppBillingReportsAdmin
OwnerFullFullFull
ManagerFullRead
ViewerReadRead
Valid — passes avo check

cells is positional — one value per cols entry, in order. Cells tint by meaning: Full/Admin/Write/ → green, /None/ → muted, anything else → amber. Use matrix (not table) for a capability grid where the columns are resources and each cell is a permission level.

anatomy — the parts of a structured string (e.g. a permission)

```anatomyeditable · live
renderedavo renders this
SECTION 01 · Anatomy

Anatomy of a permission

acme:billing:invoices.read
App
acme
Which product.
:
Feature
billing
The area within the app.
:
Action
invoices.read
The specific capability.
Valid — passes avo check

Renders the full string (acme:billing:invoices.read) with each segment coloured, then a labelled card per segment. Use it to explain one identifier's shape — a permission string, a resource URN, a topic name.

composition — effective access as intersected gates

```compositioneditable · live
renderedavo renders this
SECTION 01 · Composition

How access is decided

Identity
A valid signed-in user.
Scope
The request is in range.
Permission
The action is granted.
=
Effective
May read invoices
Valid — passes avo check

Renders gate₁ ∩ gate₂ ∩ … = result. Use it when access is the AND of several independent checks (authn ∩ scope ∩ permission), not a sequence of steps (use flow/sequence for ordered steps).

Presentation cards

drivers — the forces that shaped a design

```driverseditable · live
renderedavo renders this
SECTION 01 · Drivers

What guided the architecture

Single sign-on
One login carries the user everywhere.
HOW: token
Read per site
Access is scoped to the user's sites.
WHERE: site group
Governed roles
An IGA requests, approves, certifies.
WHO: role groups
Per-app permissions
The same role differs per app.
WHAT: matrix
Valid — passes avo check

A grid of "the N drivers/requirements behind this." icon is one of a fixed set (location · shield · grid · lock · key · user · clock · check · database · bolt · flag · doc · link · eye · server · layers); accent colours the top edge + icon.

team — people cards (who owns what)

```teameditable · live
renderedavo renders this
SECTION 01 · Team

Who owns what

AR
Ana Ruiz
Tech lead
Rendering pipeline
SO
Sam Okafor
Backend
Sync + integrations
LF
Lena Fischer
Design
Themes and house style
DR
DevRel
Advocacy
Docs and community
Valid — passes avo check

Compact cards on a 3-column grid — initials avatar, name, uppercase role, and a one-line focus. Initials derive from name; set initials to override (e.g. for a team rather than a person). Use team for ownership/contact overviews; use persona for user archetypes with goals and frustrations.

options — approaches explored, with a verdict

```optionseditable · live
renderedavo renders this
SECTION 01 · Options

Approaches explored

Option 1App-managed roles
Roles in our own DB.
  • Full control
  • Second source of truth
REJECTED — fails the constraint
Option 2Global role groups
One global group per role.
  • Fewest groups
  • A role applies at every site
VIABLE — fallback
Option 3Per-site role groups
One group per persona per site.
  • Least privilege
  • Most groups
CHOSEN
Valid — passes avo check

Use when you weighed several approaches. Each card is one option; tone: chosen highlights the winner. For one option's trade-offs alone, use proscons.

scorecard — a weighted decision matrix

```scorecardeditable · live
renderedavo renders this
SECTION 01 · Decision matrix

Queue technology choice

CriteriaKafkaself-hostedSQSWINNERmanagedRabbitMQ
Throughput×2533
Operational cost×2253
Team familiarity344
Ecosystem534
TOTAL222320
Valid — passes avo check

Criteria are rows (an ×N chip marks weights other than 1), options are columns, and the footer TOTAL row carries the weighted sum per option — the winner's header and total are highlighted with a WINNER chip (ties highlight all). Scores are plain numbers, 0-5 by convention. Use scorecard when the decision was scored; use options for qualitative pros / cons / verdict cards and table for plain data.

spec — a labelled spec sheet

```speceditable · live
renderedavo renders this
SECTION 01 · Spec

Per-site role groups

Groups
SiteN-Users (read) + SiteN-<Persona> per staffed plant.
Roles
Each group reads as (site, role); the token carries the scope.
Resolution
Decode tokenRead (site, role)Check matrix
Cost
Up to Sites × Roles groups; a new role multiplies them.
Valid — passes avo check

A compact "fact sheet" for one approach/component. A row with steps: renders as an arrow-joined pill flow (great for a short resolution pipeline).

envelope — back-of-envelope capacity math

```envelopeeditable · live
renderedavo renders this
SECTION 01 · Capacity math

Write-path capacity

Daily active users
5M
Writes / user / day
4
Writes per day5M × 420M/day
Write QPS20M / 86,400 s≈ 230 rps
Peak QPS230 × 3 (peak factor)≈ 700 rps
Provision for
~1,400 rps (2× peak headroom)
Valid — passes avo check

The system-design "step 2" block: assumptions are the givens, each steps row is one derivation (label · calc · result), and the optional result is the highlighted bottom line. Every value is a string — write units and /× freely, and quote anything containing , : or #. Use envelope for the estimate that justifies a design; use stats for measured KPIs.

Business & strategy

swot — strengths / weaknesses / opportunities / threats

```swoteditable · live
renderedavo renders this
SECTION 01 · SWOT

Entering the enterprise segment

Strengths
  • Fastest onboarding in the category
  • Strong developer community
Weaknesses
  • No SSO / SCIM yet
  • Small support team
Opportunities
  • Competitor sunsetting its legacy plan
  • Compliance push creates demand
Threats
  • Incumbent bundling a free tier
  • Procurement cycles slow adoption
Valid — passes avo check

Four plain string lists — the classic 2×2 draws itself (S green · W red · O blue · T amber). Omit a quadrant you have nothing for; it still draws so the shape reads as a SWOT. Use swot for a strategic position; use proscons for one option's trade-offs and quadrant to plot items on two axes. For a conversion funnel (drop-off between ordered stages), use chart with kind: funnel — see charts-overviews.md.

okr — objectives + key results

```okreditable · live
renderedavo renders this
SECTION 01 · Objectives

Q3 objectives

Make onboarding effortlessGrowth
Time-to-first-doc under 5 minutes
70%
Activation rate from 45% to 60%
40%
Earn enterprise trustPlatform
Ship SSO + audit log
100%
SOC 2 Type II report issued
20%
Valid — passes avo check

One card per objective; each key result renders a progress bar (progress is a plain number 0..1) coloured by status — done / on-track green, at-risk amber, off-track red, no status navy. Use okr for goal tracking; use slo for reliability targets and statustable for task-level work.

persona — user persona cards

```personaeditable · live
renderedavo renders this
SECTION 01 · Personas

Who we build for

MC
Maya Chen
Staff engineer
I want the diagram in the PR diff, not in a wiki.
Goals
  • Docs that live with the code
  • Reviewable architecture changes
Frustrations
  • Stale wiki pages
  • Screenshots of whiteboards
Tools
VS CodeGitHub
PP
Priya Patel
Engineering manager
Every reorg breaks our onboarding docs.
Goals
  • One source of truth per system
Frustrations
  • Docs no one owns
Tools
LinearNotion
Valid — passes avo check

A 2-column grid of cards — initials avatar (from name), role, an italic quote with an accent bar, then GOALS / FRUSTRATIONS lists and TOOLS chips (sections with no data are omitted). Use persona for user archetypes; use team for real people and ownership.

wardley — value chain against evolution

Strategy on two axes: how visible a component is to the user (up) and how evolved it is (right — genesis, custom-built, product, commodity). The value of the map is that it forces both judgements to be stated as numbers, so "we should stop building this" becomes a position rather than an opinion.

```wardleyeditable · live
renderedavo renders this
SECTION 01 · Strategy map

Where to build, where to buy

WARDLEY
Wardley mapGENESISCUSTOM-BUILTPRODUCTCOMMODITYEVOLUTION →VISIBLE TO THE USER →AnalystReporting UIScoring modelWarehouse
Valid — passes avo check

x and y are 0–1 and clamp; kind tints the dot (user · component · commodity · build · buy) and movement draws a dashed arrow that far along the evolution axis — where the component is heading.

harvey — the rated comparison

Options across the top, criteria down the side, a filled circle for each judgement. A steering committee reads it faster than any table of numbers, because a column of nearly-full circles argues for itself.

```harveyeditable · live
renderedavo renders this
SECTION 01 · Comparison

Vendor fit

CriteriaKafkaSQSRECOMMENDEDRabbitMQ
Throughput×2sustained messages per second4 of 42 of 43 of 4
Operational burden×21 of 44 of 43 of 4
Team familiarity2 of 44 of 43 of 4
Weighted121615
poorexcellent
Valid — passes avo check

Ratings run 0–4, empty ball to full. A row shorter than columns reads as not assessed () rather than a zero — those are different claims. weight multiplies a row into the WEIGHTED footer, which is computed from the balls, so the column you mark with recommend and the arithmetic can be seen to agree. Use benchmark when the cells are measured numbers.

scqa — the executive summary, in Minto order

Situation, complication, question, answer: the four moves that make an opening slide argue instead of describe.

```scqaeditable · live
renderedavo renders this
SECTION 01 · Summary
1
Situation

We process 12k orders a day across three regions.

2
Complication

p95 checkout crossed 2s in March and conversion fell 3.1pp.

3
Question

Where does the next quarter of platform work go?

Answer

Move payment capture off the request path — it returns 1.8s of the 2.4s.

  • Capture is 74% of p95 and is fully async-able
  • No schema change, so it ships inside one quarter
Valid — passes avo check

Every field is optional, but the order is fixed — keeping it is the block's job. The first three render as a numbered ladder; answer is the recommendation and takes the filled card, with because as the support under it. Pair it with a lede on the block: on a slide that line pins under the action title as the supporting sentence.

scenarios — base, upside and downside

The table a plan is defended with. Cases go in columns, so reading across a driver row shows how much of the outcome hangs on that one assumption.

```scenarioseditable · live
renderedavo renders this
SECTION 01 · Scenarios

Three ways next year goes

DriverDownsideBaseBASE CASEUpside
Capture moved asyncQ4 slipQ3Q3
Conversion recovery+0.8pp+2.1pp+3.4pp
Volume growth5%8%15%
FY27 revenue$18M$24M$31M
Valid — passes avo check

tone is pos | neg | base, and the base case is badged because every other column is read relative to it. values are positional against drivers; a case that omits one renders · — silent about that driver, which is not the same as claiming no change. outcome gets its own emphasised row.