addedInput schema / properties / blueprint
Added value: +{
+ "additionalProperties": false,
+ "description": "The app's blueprint: what it is for, the data it keeps, its journeys and promises, and the sites it talks to. Required.",
+ "properties": {
+ "data": {
+ "additionalProperties": false,
+ "description": "The data the app keeps on the phone.",
+ "properties": {
+ "keeps": {
+ "description": "Each storage key and what it holds.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "key": {
+ "type": "string"
+ },
+ "what": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "key",
+ "what"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "version": {
+ "description": "Raise it when the saved shape changes, and migrate the old shape on load.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "version",
+ "keeps"
+ ],
+ "type": "object"
+ },
+ "design": {
+ "additionalProperties": false,
+ "properties": {
+ "notes": {
+ "type": "string"
+ },
+ "palette": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [],
+ "type": "object"
+ },
+ "icon": {
+ "description": "The app's home-screen icon, one of these names; without one the icon shows the app's first letter.",
+ "enum": [
+ "activity",
+ "alarm-clock",
+ "apple",
+ "baby",
+ "backpack",
+ "badge-check",
+ "banknote",
+ "bath",
+ "battery",
+ "bed",
+ "bell",
+ "bike",
+ "book",
+ "book-open",
+ "bookmark",
+ "brain",
+ "briefcase",
+ "brush",
+ "bus",
+ "cake",
+ "calculator",
+ "calendar",
+ "calendar-check",
+ "camera",
+ "car",
+ "carrot",
+ "cat",
+ "chart-line",
+ "chart-pie",
+ "chef-hat",
+ "circle-check",
+ "clipboard-list",
+ "clock",
+ "cloud",
+ "cloud-rain",
+ "cloud-sun",
+ "coffee",
+ "coins",
+ "compass",
+ "cookie",
+ "credit-card",
+ "dog",
+ "dollar-sign",
+ "droplet",
+ "dumbbell",
+ "egg",
+ "file-text",
+ "film",
+ "fish",
+ "flag",
+ "flame",
+ "flower",
+ "footprints",
+ "frown",
+ "gamepad-2",
+ "gift",
+ "glass-water",
+ "globe",
+ "graduation-cap",
+ "guitar",
+ "hammer",
+ "hand-heart",
+ "headphones",
+ "heart",
+ "heart-pulse",
+ "hospital",
+ "house",
+ "key",
+ "laptop",
+ "laugh",
+ "leaf",
+ "lightbulb",
+ "list-checks",
+ "list-todo",
+ "luggage",
+ "map",
+ "map-pin",
+ "medal",
+ "meh",
+ "message-circle",
+ "mic",
+ "moon",
+ "mountain",
+ "music",
+ "notebook-pen",
+ "package",
+ "palette",
+ "paw-print",
+ "pen-line",
+ "phone",
+ "piggy-bank",
+ "pill",
+ "pizza",
+ "plane",
+ "puzzle",
+ "receipt",
+ "repeat",
+ "rocket",
+ "salad",
+ "scale",
+ "school",
+ "shirt",
+ "shopping-bag",
+ "shopping-basket",
+ "shopping-cart",
+ "shower-head",
+ "smile",
+ "snowflake",
+ "sofa",
+ "sparkles",
+ "sprout",
+ "star",
+ "stethoscope",
+ "sun",
+ "sunrise",
+ "syringe",
+ "target",
+ "tent",
+ "thermometer",
+ "timer",
+ "train-front",
+ "tree-pine",
+ "trophy",
+ "umbrella",
+ "users",
+ "utensils",
+ "wallet",
+ "watch",
+ "weight",
+ "wine"
+ ],
+ "type": "string"
+ },
+ "journeys": {
+ "description": "What the person does, step by step. Every step is proved by a test.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "description": "J-1, J-2, …",
+ "type": "string"
+ },
+ "steps": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "description": "J-1.1, J-1.2, … within journey J-1",
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "text"
+ ],
+ "type": "object"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "title": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "title",
+ "steps"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "network": {
+ "description": "The sites the app talks to, at most 5; every other site is blocked.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "site": {
+ "description": "A bare website name, like api.open-meteo.com",
+ "type": "string"
+ },
+ "why": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "site",
+ "why"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "promises": {
+ "description": "What always holds. Every promise is proved by a test.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "description": "P-1, P-2, …",
+ "type": "string"
+ },
+ "kind": {
+ "const": "data",
+ "description": "\"data\" for a promise about saved data.",
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "text"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "purpose": {
+ "description": "What the app is for, in a sentence.",
+ "type": "string"
+ },
+ "screens": {
+ "description": "Each screen and what it shows.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "says": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "says"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "v": {
+ "const": 1,
+ "type": "number"
+ }
+ },
+ "required": [
+ "v",
+ "purpose",
+ "screens",
+ "data",
+ "journeys",
+ "promises"
+ ],
+ "type": "object"
+}
addedInput schema / properties / tests
Added value: +{
+ "description": "The tests that prove every journey step and promise. Required.",
+ "items": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "Runs its steps on the app, opened fresh.",
+ "properties": {
+ "id": {
+ "description": "T-1, T-2, …",
+ "type": "string"
+ },
+ "kind": {
+ "const": "behaviour",
+ "type": "string"
+ },
+ "proves": {
+ "description": "The journey step and promise ids this test proves.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "steps": {
+ "items": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "Finds what to tap by its text, label or role (and name): give at least one of text, label or role.",
+ "properties": {
+ "do": {
+ "const": "tap",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "type",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do",
+ "label",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "select",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do",
+ "label",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "reload",
+ "type": "string"
+ }
+ },
+ "required": [
+ "do"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "wait",
+ "type": "string"
+ },
+ "ms": {
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "do",
+ "ms"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expect": {
+ "enum": [
+ "see",
+ "notSee"
+ ],
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "text"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expect": {
+ "enum": [
+ "checked",
+ "notChecked"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "label"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "equals": {
+ "minimum": 0,
+ "type": "integer"
+ },
+ "expect": {
+ "const": "count",
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "equals"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "equals": {
+ "type": "string"
+ },
+ "expect": {
+ "const": "value",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "label",
+ "equals"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "title": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "title",
+ "proves",
+ "steps"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "Proves saved data survives: setup, then check.",
+ "properties": {
+ "check": {
+ "description": "After a reload, checks the data still shows. On an update these run in the new version.",
+ "items": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "Finds what to tap by its text, label or role (and name): give at least one of text, label or role.",
+ "properties": {
+ "do": {
+ "const": "tap",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "type",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do",
+ "label",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "select",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do",
+ "label",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "reload",
+ "type": "string"
+ }
+ },
+ "required": [
+ "do"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "wait",
+ "type": "string"
+ },
+ "ms": {
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "do",
+ "ms"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expect": {
+ "enum": [
+ "see",
+ "notSee"
+ ],
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "text"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expect": {
+ "enum": [
+ "checked",
+ "notChecked"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "label"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "equals": {
+ "minimum": 0,
+ "type": "integer"
+ },
+ "expect": {
+ "const": "count",
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "equals"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "equals": {
+ "type": "string"
+ },
+ "expect": {
+ "const": "value",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "label",
+ "equals"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "id": {
+ "description": "T-1, T-2, …",
+ "type": "string"
+ },
+ "kind": {
+ "const": "data",
+ "type": "string"
+ },
+ "proves": {
+ "description": "The promise ids about saved data this test proves.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "setup": {
+ "description": "Saves data. On an update these run in the version before.",
+ "items": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "Finds what to tap by its text, label or role (and name): give at least one of text, label or role.",
+ "properties": {
+ "do": {
+ "const": "tap",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "type",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do",
+ "label",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "select",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "do",
+ "label",
+ "value"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "reload",
+ "type": "string"
+ }
+ },
+ "required": [
+ "do"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "do": {
+ "const": "wait",
+ "type": "string"
+ },
+ "ms": {
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "do",
+ "ms"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expect": {
+ "enum": [
+ "see",
+ "notSee"
+ ],
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "text"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expect": {
+ "enum": [
+ "checked",
+ "notChecked"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "label"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "equals": {
+ "minimum": 0,
+ "type": "integer"
+ },
+ "expect": {
+ "const": "count",
+ "type": "string"
+ },
+ "role": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "equals"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "equals": {
+ "type": "string"
+ },
+ "expect": {
+ "const": "value",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "expect",
+ "label",
+ "equals"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "title": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "title",
+ "proves",
+ "kind",
+ "setup",
+ "check"
+ ],
+ "type": "object"
+ }
+ ]
+ },
+ "type": "array"
+}