{
 "version": "1.2.0",
 "updated": "2026-08-11",
 "preamble": [
  "This file is the matcher. It is not documentation of the matcher — the code reads its weights, filters, penalties and thresholds out of this file at runtime, so if this page and the behaviour ever disagree, that is a bug rather than a stale document.",
  "Everything here is a judgement. The weights below are a defensible allocation of attention across five things that matter; they are not a finding, and equal-ish weighting is a choice rather than a result. The tool positions they operate on are one person's coding of each product's default configuration, argued from the research and open to disagreement.",
  "Nothing here measures anything. The numbers exist so the reasoning can be inspected and argued with, which is why they live on this page and never next to a tool name."
 ],
 "goalMap": {
  "note": "Which user-stated goals each mechanism is theorised to serve. Theory, not measurement — a mechanism appearing against a goal means the literature offers a reason it might help, not evidence that it does.",
  "mechanisms": {
   "friction": [
    "focus",
    "calm"
   ],
   "self_monitoring": [
    "focus"
   ],
   "access_control": [
    "focus",
    "sleep",
    "presence",
    "practice"
   ],
   "self_regulation": [
    "focus"
   ],
   "knowledge_building": [
    "focus",
    "calm"
   ],
   "mediation": [
    "presence"
   ],
   "exposure_limitation": [
    "calm",
    "reading",
    "presence"
   ]
  },
  "unmappedGoals": {
   "other": "Free text. Never scored, never transmitted. It appears in the result's framing and in the generated prompt only."
  }
 },
 "filters": {
  "note": "Hard filters run first and in this order. A tool excluded here is not scored at all.",
  "order": [
   "platform",
   "price",
   "harm",
   "surface",
   "exitFloor"
  ],
  "platform": {
   "rule": "The tool must run on at least one platform the user named. Physical objects carry platforms:[\"physical\"] and match only when the user said their physical space.",
   "relaxable": true
  },
  "harm": {
   "rule": "The tool must address the user's PRIMARY harm to be one of the three primary matches. A tool addressing only the secondary harm is eligible for the alternates list and is capped there — it can never occupy a primary slot.",
   "secondaryHarmMaxRank": 4,
   "relaxable": true
  },
  "surface": {
   "rule": "A tool carrying a surfaces array is offered only when it covers one of the surfaces the user named, and is excluded entirely when the surface question was never asked.",
   "why": "Without this gate, uBlock Origin, Stylus, News Feed Eradicator and Unhook hold near-identical positions and shadow one another. The persona sweep found Unhook unreachable in every persona before the gate existed. SocialLite is Instagram-specific and gated the same way.",
   "relaxable": false
  },
  "exitFloor": {
   "rule": "Applied ONLY when the user said a limit should be impossible to undo until it expires — not whenever autonomy is low. Excludes tools whose cost of exit is below 25.",
   "threshold": 25,
   "triggerAnswer": "exit_pref = locked",
   "relaxable": true
  },
  "price": {
   "rule": "The tool's price band must be one the reader said they would accept. Bands only — never a specific figure — and every recommendation shows its band.",
   "why": "Price is a fact about a product, not a judgement about it, so it filters rather than scores. It is also the only thing separating some otherwise near-identical tools: without it, a donation-funded tool with no paid tier is indistinguishable from one with a paid unlock, and loses every tie to whichever has more published evidence.",
   "relaxable": true,
   "bandOrder": [
    "free",
    "free_tier",
    "under_10",
    "10_to_50",
    "over_50",
    "hardware_plus_sub"
   ]
  }
 },
 "shortfall": {
  "minimumPrimaryMatches": 3,
  "relaxationOrder": [
   "harm",
   "price",
   "exitFloor",
   "platform"
  ],
  "rule": "If fewer than three tools survive the filters, relax in this order and tell the user exactly what was relaxed. Never widen silently.",
  "declaredGapRule": "Relaxation is for NARROW results, not absent ones. When a harm x platform cell is a declared gap, or when the harm has no researched tool at all, the honest notice leads and the filters are not relaxed past the declared position.",
  "expectedTrigger": "The exit floor. Across a 288-persona sweep, almost every shortfall traced to it, because most software in this category is a few taps from off. Only a handful of options — a timer lockbox, SelfControl, Cold Turkey, a second device, a drawer — clear a real exit floor."
 },
 "weights": {
  "note": "Weighted mean of absolute differences, subtracted from 100. Tier 2 tools are scored on a reduced set because their judgement axes are null; scoring them on the full rubric would mean inventing the missing numbers, which would launder unresearched tools into the authority of researched ones. See the changelog for why capacity building sits outside the autonomy composite.",
  "tier1": {
   "locus": {
    "weight": 0.2,
    "label": "Environment or willpower",
    "compare": "user.locus vs tool.locus"
   },
   "act": {
    "weight": 0.15,
    "label": "Deliberate or set-and-forget",
    "compare": "user.act vs tool.act"
   },
   "autonomyComposite": {
    "weight": 0.2,
    "label": "How much of the decision you keep",
    "compare": "the slider, against each of four sub-axes, averaged"
   },
   "capacity": {
    "weight": 0.1,
    "label": "Whether it leaves you anything",
    "compare": "the tool's capacity-building score, on its own",
    "note": "Not a difference from anything the reader said — a straight preference for tools that build something you keep over tools that only hold while they are running. Scored as the gap from 100, so a tool that teaches nothing loses the full weight. This is the axis the research treats as deciding whether an effect survives uninstalling, and it is the one an average over five sub-scores was hiding."
   },
   "exit": {
    "weight": 0.15,
    "label": "How hard it is to undo",
    "compare": "user.exit_tol vs 100 - tool.exit"
   },
   "goal": {
    "weight": 0.2,
    "label": "What you said you wanted back",
    "compare": "your goals vs the goals this mechanism is theorised to serve"
   }
  },
  "tier2": {
   "locus": {
    "weight": 0.3,
    "label": "Environment or willpower",
    "compare": "user.locus vs tool.locus"
   },
   "act": {
    "weight": 0.25,
    "label": "Deliberate or set-and-forget",
    "compare": "user.act vs tool.act"
   },
   "exit": {
    "weight": 0.2,
    "label": "How hard it is to undo",
    "compare": "user.exit_tol vs 100 - tool.exit"
   },
   "goal": {
    "weight": 0.25,
    "label": "What you said you wanted back",
    "compare": "your goals vs the goals this mechanism is theorised to serve"
   }
  }
 },
 "autonomyComposite": {
  "note": "Scored as the MEAN OF THE PER-AXIS DISTANCES, not as the distance to an average. That distinction is the whole of version 1.1 and it matters more than any weight on this page.",
  "formula": "mean( |auto - U|, |nego - U|, |(100 - author) - U| )   where U is the slider",
  "terms": [
   {
    "key": "auto",
    "label": "Autonomy support",
    "invert": false
   },
   {
    "key": "nego",
    "label": "Negotiability",
    "invert": false
   },
   {
    "key": "author",
    "label": "Company authorship",
    "invert": true
   }
  ],
  "removed": "Capacity building was part of this average in version 1.0 and now carries its own term. Cost of exit was part of it in 1.1 and was also being scored standalone at 0.15, which made it the heaviest single consideration in the rubric — heavier than the composite it was inside. It now appears once, as its own term. See the changelog.",
  "caveat": "Equal weighting across the four is a defensible choice and not a finding.",
  "tier2": "Not computed. Tier 2 tools have null judgement axes and carry no autonomy-composite term and no capacity term.",
  "whyNotAnAverage": "Averaging the four sub-scores first and then measuring the distance lets a tool cancel a bad column against a good one. Halo is the clearest case: aligned, its four sub-scores are 60, 30, 85 and 70 — barely negotiable, but cheap enough to walk away from. Averaged, that becomes 61, which sits 11 points from a reader in the middle of the slider and reads as a good match. Taking the distances first gives 21, which is what it actually is. The arithmetic was quietly rewarding inconsistency, and the tools it rewarded were the ones with no clear position at all. Tools that are consistent are unaffected: one sec scores 40 either way.",
  "summaryValue": "A single composite number is still shown on each tool's page and on this one, because it is a useful summary of where a product sits. It is not what the matcher scores on. Where the four sub-scores disagree with each other, the summary is the least informative thing about the tool, and the tool's own page lists all four."
 },
 "evidenceAdjustment": {
  "maxPoints": 8,
  "formula": "fit += (evid / 100) * 8",
  "appliesTo": "tier 1 only",
  "note": "Deliberately small. Evidence should break ties, not overwhelm fit — the best-evidenced tool in the category is a poor recommendation for someone whose stated preferences it contradicts. The adjustment is shown separately in every rationale so a reader can see how little it moved things."
 },
 "failurePenalties": {
  "note": "From what the user said happened last time. These are the sharpest signal in the instrument, and every penalty applied is shown to the user with its reason.",
  "rules": [
   {
    "answer": "bypassed",
    "answerLabel": "I found ways around it",
    "points": -15,
    "condition": "tool.exit < 20",
    "shown": "Ranked lower because you said you found ways around limits before, and this one is easy to switch off."
   },
   {
    "answer": "nagged",
    "answerLabel": "It nagged me until I stopped noticing",
    "points": -20,
    "condition": "tool's primary mechanism is a repeated prompt with no escalation",
    "conditionImpl": "mechanisms include friction or self_regulation, and tool.nego >= 80, and tool.exit < 20",
    "shown": "Ranked lower because you said prompts stopped registering, and this one works by prompting you each time."
   },
   {
    "answer": "uninstalled",
    "answerLabel": "I uninstalled it",
    "points": -15,
    "condition": "tool.comp < 30 and tool.act > 60",
    "shown": "Ranked lower because you said you uninstalled something before, and this one asks a lot of you each time without building much you keep.",
    "currentlyUnreachable": true,
    "unreachableNote": "No tool in the current data satisfies this condition, so the rule never fires. It is not a coding error in the matcher — it is a question about the tool coding. The intended target is the high-willpower-demand, low-capacity-building combination, and the two nearest tools sit just outside it: Forest at capacity 30 and activeness 85, and Brick at capacity 35 and activeness 90. Either the threshold is a point or two too tight, or those two tools are coded a point or two too generously on capacity building. That is a research judgement, so the rule is declared unreachable here and left alone rather than tuned until it fires. integrity.test.mjs asserts this declaration against the data in both directions, so whichever way it is resolved, the flag cannot be forgotten."
   },
   {
    "answer": "attenuated",
    "answerLabel": "It worked and then stopped",
    "points": -10,
    "condition": "tool.dur < 35",
    "shown": "Ranked lower because you said something worked and then stopped, and durability is this one's weakest column.",
    "alsoSurfaces": "reboundNote"
   }
  ],
  "nullHandling": "Where a Tier 2 tool has a null judgement axis a penalty depends on, the axis is treated as 50 — neither penalised nor credited on a number that was never coded."
 },
 "presentation": {
  "primaryMatches": 3,
  "alternates": 3,
  "nearMissDisclosures": 2,
  "neverShowScore": "The adjusted fit is never displayed as a number. The evidence adjustment can push it above 100, and more importantly a figure like '87% match' claims a precision this rubric does not have. Rank order plus the contributing reasons in words; the numbers stay here where they can be inspected in context.",
  "tierTieBreak": {
   "margin": 5,
   "rule": "A Tier 1 tool outranks a Tier 2 tool whenever it sits within 5 points below it. Implemented as a stable promotion pass over the score-sorted list rather than as a score bonus, so the margin means exactly what it says.",
   "why": "Researched and catalogued are different kinds of claim, and where they are close to indistinguishable on fit, the one someone actually looked into goes first."
  },
  "deterministicTieBreak": "Exact score ties resolve by tool id, alphabetically. Identical answers always produce identical output.",
  "tier2SecondLine": "positioned on where it sits structurally; not assessed for how much it supports your autonomy.",
  "purchaseDemotion": {
   "trigger": "the employer note",
   "rule": "When someone describes a boundary problem imposed by an employer or client, anything costing money is ranked below the free and configuration-only options. Paid tools still appear — they are partial mitigation and not nothing — but they never lead.",
   "why": "A boundary problem imposed by someone else is not solvable by a product, and leading with a purchase invites a person to spend money on a problem their employer created. Do not recommend a purchase to someone describing a labour problem.",
   "paidBands": [
    "under_10",
    "10_to_50",
    "over_50",
    "hardware_plus_sub"
   ],
   "shown": "Ranked below the free options because you said the pressure is coming from your employer, and this one costs money to solve a problem you didn’t create."
  }
 },
 "coverage": {
  "note": "Checked constants. The integrity tests enumerate all 24 harm x platform cells; every cell must either reach the threshold or be declared here, AND a cell declared here that becomes covered fails the test too — so the honesty notices cannot go stale after someone adds a tool.",
  "threshold": 3,
  "harms": [
   "time_displacement",
   "interference",
   "boundary",
   "exposure"
  ],
  "platforms": [
   "ios",
   "android",
   "macos",
   "windows",
   "linux",
   "physical"
  ],
  "declaredThinCells": [
   {
    "harm": "boundary",
    "platform": "linux",
    "count": 2,
    "accepted": "Two options rather than three. Accepted and disclosed rather than padded."
   }
  ],
  "harmsWithNoTier1Tool": [
   "boundary"
  ],
  "harmsWithNoTier1ToolNotice": "Nothing in this category has been built or tested specifically for this. The four harms aren't equally served — this is the one the market has largely skipped, and everything below is a general-purpose tool or a configuration change repurposed for it.",
  "boundaryRouting": "Configuration rather than purchase: notification schedules, OS focus modes, a separate work profile or device, a second device left at home. If the pressure is coming from an employer, the employer note leads and the tools follow it."
 },
 "userVector": {
  "note": "How the answers become the five numbers the rubric compares against. All 0-100.",
  "locus": {
   "question": "locus",
   "from": "locus question",
   "map": {
    "surroundings": 85,
    "both": 50,
    "deciding": 20,
    "neither": 60,
    "never": 50
   },
   "note": "Neither-has-worked maps to 60 rather than 50: where willpower approaches have failed, environmental ones are the better next bet."
  },
  "act": {
   "question": "act",
   "from": "act question",
   "map": {
    "deliberate": 80,
    "setforget": 15,
    "dunno": 55
   },
   "note": "Don't-know routes toward the interruptive middle, which is the class with the strongest evidence behind it. The result page says that is why."
  },
  "autonomy": {
   "question": "autonomy",
   "from": "autonomy slider, verbatim"
  },
  "exit_tol": {
   "question": "exit_pref",
   "from": "exit preference if asked",
   "map": {
    "seconds": 15,
    "minutes": 45,
    "person": 80,
    "locked": 95
   },
   "fallback": "the autonomy slider value — wanting to stay in charge implies tolerating an easy exit"
  },
  "severity": {
   "question": "severity",
   "from": "the two severity items, summed",
   "range": [
    0,
    6
   ],
   "signpostAt": 4,
   "note": "Adds a signposting block above the matches. It does not withhold recommendations."
  },
  "budget": {
   "question": "budget",
   "from": "the budget question — the set of price bands it allows",
   "note": "A filter rather than a number. The strictest answer admits only tools that are free with no paid tier at all."
  }
 },
 "unsureHandling": "An unsure or none-of-these answer must never produce a worse recommendation than a guess. Unsure on the harm question routes to a disambiguating follow-up built from concrete scenarios rather than categories. Unsure elsewhere widens the match: the midpoint of the axis, no penalty, no filter.",
 "changelog": [
  {
   "version": "1.2.0",
   "change": "Cost of exit is counted once instead of twice: it has been removed from the autonomy composite and keeps only its own standalone term. The composite is now the mean of three per-axis distances rather than four.",
   "why": "It carried its own term at 0.15 and was also one of four sub-axes inside the autonomy composite, worth roughly 0.05 there. Its effective weight was about 0.20 — the heaviest single consideration in the rubric, heavier than the composite it was part of. That systematically favoured tools with a middling cost of exit and penalised a one-tap-off tool twice for the same property. It was declared as a known issue rather than fixed, because the composite had already had two changes and a third needed to be a deliberate decision rather than a tidy-up.",
   "effect": "Removed from the composite, which is now the mean of three per-axis distances — autonomy support, negotiability, and company authorship inverted. The standalone exit term is unchanged at 0.15. Nothing else moved."
  },
  {
   "version": "1.1.0",
   "change": "The autonomy term is now the mean of the per-axis distances rather than the distance to an average; capacity building was pulled out of that average and given its own term; and a price filter was added.",
   "why": "Version 1.0 had a defect that a sweep over 6,480 profiles made obvious: one tool took the top slot for 85% of iPhone profiles. Not because it fitted them, but because averaging five sub-scores put it 6 points from the midpoint of the heaviest-weighted axis, and most people leave that slider near the middle. Its composite of 44 was the mean of three poor sub-scores and two better ones — the average concealed exactly the thing a reader would want to know. Meanwhile the two tools built around supporting the reader's own judgement sat at 82 and 86 and were reachable only by someone who slid the control most of the way over. A nearest-neighbour rubric rewards the centroid, and the centroid is not the same thing as the good answer.",
   "effect": "Three changes. (1) The autonomy term takes the distance on each of four sub-axes and averages those, so a tool can no longer cancel a bad column against a good one — see autonomyComposite.whyNotAnAverage for the arithmetic. (2) Capacity building — whether anything is left behind when the tool is gone — now carries its own weight of 0.10, taken out of the autonomy composite's 0.30, which drops to 0.20. (3) Price filters on a stated band. All still judgements, and still not findings, but the arithmetic no longer rewards having no clear position.",
   "alsoWhy": "Price was not scored at all in 1.0, which left two near-identical tools separated only by the evidence adjustment — so the one with a published trial won every time and the one that is free with no paid tier was never reachable. Price is now a hard filter on a stated band. It is a fact about a product rather than a judgement about it, which is why it filters rather than scores."
  }
 ],
 "mechanisms": {
  "note": "What each mechanism class is theorised to do, which problems it is aimed at, and where it typically sits. Used to explain which KIND of intervention fits before any product is named — matching the intervention to the harm is the organising idea, and a reader who understands the class can evaluate a tool this site has never heard of. Positions are typical rather than definitional; individual tools vary and their own pages give their actual coding. Each class also carries a 'distinguishes' line saying what separates it from its nearest neighbour, because two of these classes sit at almost the same position on the axes and the honest thing to tell a reader is that they cannot be cleanly separated.",
  "classes": {
   "friction": {
    "label": "interruptive friction",
    "does": "Puts a short delay, or a prompt, between the reach and the thing reached for. Does not remove the option — changes the cost of taking it without deciding to.",
    "harms": [
     "time_displacement",
     "interference"
    ],
    "typical": {
     "locus": 45,
     "act": 75,
     "comp": 60
    },
    "evidence": "The strongest in this category. One randomised evaluation in a peer-reviewed venue, measured over weeks. What that study could NOT separate is the delay from the reflective prompt — it was not designed to, and one of its authors has said so.",
    "suits": "Someone who wants to stay in charge and does not mind acting each time.",
    "distinguishes": "Nearly indistinguishable from supported self-regulation, and that is not a gap in this page: the delay and the prompt that comes with it have never been separated experimentally. The one randomised study in this area was not designed to tell them apart, and one of its authors has said so. Treat any claim that the reflective prompt is the active part as unsupported."
   },
   "access_control": {
    "label": "access control",
    "does": "Makes the thing unavailable — blocked, absent, or behind a lock — for a period you set in advance.",
    "harms": [
     "time_displacement",
     "interference",
     "boundary",
     "exposure"
    ],
    "typical": {
     "locus": 85,
     "act": 20,
     "comp": 25
    },
    "evidence": "No published trial of any specific product in this set. The mechanism is the best-understood one outside this literature, and the most common thing on the market.",
    "suits": "Someone who wants the decision made in advance, and who is not relying on the tool to teach them anything.",
    "distinguishes": "Distinguished from friction by removing the option rather than pricing it. That is the trade: more reliable while it runs, and it teaches nothing, so nothing survives switching it off."
   },
   "self_regulation": {
    "label": "supported self-regulation",
    "does": "Prompts a decision rather than making one — asks what you came for, and lets you answer.",
    "harms": [
     "time_displacement",
     "interference"
    ],
    "typical": {
     "locus": 45,
     "act": 75,
     "comp": 65
    },
    "evidence": "Shares the interruptive-friction evidence base. Whether anything survives removing the tool is unresolved: one study found the behaviour rebounded when the friction was taken away.",
    "suits": "Someone who wants to keep the decision and wants to get better at making it.",
    "distinguishes": "Nearly indistinguishable from interruptive friction — the difference is meant to be that this asks you to decide rather than just making you wait. Whether that difference does any work is unknown: the one randomised study could not separate the delay from the prompt, and was not built to."
   },
   "exposure_limitation": {
    "label": "exposure reduction",
    "does": "Removes a specific thing from a specific place — a feed, a recommendation rail, a counter — and leaves the rest working.",
    "harms": [
     "exposure"
    ],
    "typical": {
     "locus": 90,
     "act": 10,
     "comp": 15
    },
    "evidence": "No published trial of the specific tools. It is the most precisely targeted mechanism here, and the only one aimed at what you see rather than how long you look.",
    "suits": "Someone who can name the surface. This is usually a filter rule rather than a product.",
    "distinguishes": "Distinguished from access control by leaving the thing usable. You keep the messages and lose the feed, which is why it needs you to name the surface."
   },
   "self_monitoring": {
    "label": "self-monitoring",
    "does": "Shows you what you did. Counts, timers, weekly summaries.",
    "harms": [
     "time_displacement",
     "interference"
    ],
    "typical": {
     "locus": 40,
     "act": 30,
     "comp": 40
    },
    "evidence": "Weak on its own. Awareness is not the binding constraint for most people, and this is the mechanism most likely to be noticed for a fortnight and then not seen.",
    "suits": "Someone who genuinely does not know where the time goes, as a first step rather than the intervention.",
    "distinguishes": "Distinguished from everything else by not intervening at all. It only tells you what happened, which is why it is weak on its own."
   },
   "knowledge_building": {
    "label": "capacity building",
    "does": "Aims to leave you able to do it without the tool.",
    "harms": [
     "time_displacement",
     "interference",
     "exposure"
    ],
    "typical": {
     "locus": 30,
     "act": 70,
     "comp": 80
    },
    "evidence": "The least tested and the most claimed. Treat any product asserting it with suspicion — the durability studies that would support it mostly do not exist.",
    "suits": "Someone who wants the tool to become unnecessary. Note that almost nothing on the market credibly does this.",
    "distinguishes": "Distinguished by what it aims at: not this week's usage but your ability to manage it unaided. Almost nothing on the market credibly does this, and several products claim it."
   },
   "mediation": {
    "label": "social mediation",
    "does": "Puts another person in the loop — a shared limit, a visible commitment, someone who holds the key.",
    "harms": [
     "time_displacement",
     "boundary"
    ],
    "typical": {
     "locus": 70,
     "act": 50,
     "comp": 45
    },
    "evidence": "Barely represented in this market and barely studied in it. The strongest cost-of-exit options are of this shape.",
    "suits": "Someone who wants a limit that genuinely holds and has somebody to ask.",
    "unrepresented": true,
    "unrepresentedNote": "Nothing in this database implements it. That is a checked constant, not an oversight: a limit that somebody else holds is the only shape that reliably delivers a real cost of exit, and essentially no commercial product in this market offers it. The class is described here so a reader can recognise it and arrange it themselves — give the passphrase to a housemate — but it is never offered as a matched class, because there would be nothing behind it.",
    "distinguishes": "Distinguished by involving somebody else, which is the only reliable way to get a cost of exit you cannot simply decide to pay."
   }
  },
  "unrepresentedRule": "A class marked unrepresented is never offered as a matched intervention. It is named only where it addresses the reader's problem, as a gap in the market rather than a recommendation. integrity.test.mjs checks the flag against the tool data in both directions, so a class that gains an implementation loses the flag and a class that loses its last implementation gains one."
 },
 "knownIssues": [],
 "kinds": {
  "note": "What sort of thing each entry is. This decides which sections a page shows, because the same block of questions is not appropriate to all of them: asking who funds a drawer, or what an OS setting's privacy policy permits, is a category error, and applying one structure to every entry produced several.",
  "classes": {
   "vendor": {
    "label": "a product a company sells",
    "structureHeading": "the company, structurally",
    "structureFields": [
     "ownership",
     "funding",
     "dataPolicy"
    ],
    "showEnforcement": true,
    "blurb": "There is a company behind it with an owner, a funding position and a privacy policy. Those are the facts to know, and this site states them dated and sourced without inferring what the company might do.",
    "subjectNoun": "product"
   },
   "open_source": {
    "label": "an open-source project",
    "structureHeading": "the project, structurally",
    "structureFields": [
     "project",
     "funding",
     "dataPolicy"
    ],
    "showEnforcement": true,
    "blurb": "Not a company. The questions worth asking are who maintains it, under what licence, and what happens if they stop — and you can read what it does, which is a stronger guarantee than a policy.",
    "subjectNoun": "project"
   },
   "os_feature": {
    "label": "already on your device",
    "structureHeading": "who makes it, and what that means",
    "structureFields": [
     "maker"
    ],
    "showEnforcement": true,
    "blurb": "Built into something you already use, so it adds no new party to your data. It is also made by a company with a commercial interest in your attention, which is worth holding alongside that.",
    "subjectNoun": "setting"
   },
   "recipe": {
    "label": "a recipe you set up yourself",
    "subjectNoun": "recipe",
    "structureHeading": "what it involves",
    "structureFields": [
     "dataPolicy"
    ],
    "showEnforcement": false,
    "blurb": "Not a product. A configuration assembled from features already on the device, so there is no owner and no funding position to report — the question worth asking is whether any third party gets involved, and whether a new permission is granted."
   },
   "category": {
    "label": "a class of thing, not one product",
    "structureHeading": "no single maker",
    "structureFields": [
     "whatToCheck"
    ],
    "showEnforcement": false,
    "blurb": "Many makers rather than one, so there is no company to ask about — and the structural facts have to be checked for whichever you pick.",
    "subjectNoun": "kind of product"
   },
   "practice": {
    "label": "no product at all",
    "structureHeading": null,
    "structureFields": [],
    "showEnforcement": false,
    "blurb": "Nothing to own, fund, or have a privacy policy. Nobody profits from whether you keep doing it and nobody can change the terms later, which is the main thing to know about it.",
    "subjectNoun": "arrangement"
   }
  },
  "rule": "An entry whose kind declares no structureHeading renders no structural section at all, rather than rendering one full of not-applicables. Every entry that is set up rather than installed carries howTo steps instead, and every entry a recipe builds links to that recipe. Each kind also carries a subjectNoun, so copy about it reads correctly: a drawer has no 'default configuration' and no 'published trial of this product'.",
  "permissionTiers": {
   "note": "Mobile recipes carry a permission tier. It is the load-bearing safety fact about them, and the reason the mobile route can be offered at all.",
   "1": "OS-native. No new permission is granted to anything.",
   "2": "A third-party app with Usage Access only. Offered, with the trade stated.",
   "3": "Requires an Accessibility Service. NEVER recommended — it is permission to read and act on everything on screen, and the standard vehicle for Android credential theft."
  }
 },
 "resolvedIssues": [
  {
   "id": "exit-double-counted",
   "wasIssue": "Cost of exit was counted twice: once as its own term at 0.15, and again inside the autonomy composite at roughly 0.05, making it the heaviest single consideration in the rubric.",
   "resolvedIn": "1.2.0",
   "how": "Removed from the composite. The standalone term is unchanged."
  }
 ]
}