The business decisions a design document can never hold, answered once.
Part of the Konjo design language.
Some of what a screen needs is not a design decision. Whether a promotion can be undone, who is alerted when an incident is filed, what a removal cascades to — no amount of design documentation contains those, and a design system that invented them would be lying confidently on the screens where being wrong matters most.
So they live here, as given inputs. An agent building one of these screens reads the answer rather than asking for it.
How to use this file. If the fact you need is below, it is decided — build to it. If it is in Not yet decided, or it is not here at all, that is a blocker: name the missing fact and stop, per the skill's §1. Do not write a plausible sentence. A consequence line invented to satisfy a rule is worse than no consequence line.
How to add to it. A new fact is answered by the founder, not derived. Add the row, say which screens depend on it, and note any schema or RPC work the answer implies — several of these do, and that work is a follow-up rather than something to build silently.
Promotions
The screen: an instructor records that a student has been promoted. It is permanent, it changes the student's rank everywhere, and it issues a certificate.
| Fact | Decision |
|---|---|
| Can it be corrected? | Yes — a head instructor or owner can correct or void a promotion at any time. |
| What happens to the original? | It stays in the student's history as an amended entry. The record is honest about having been changed; nothing silently disappears. |
| Is the student re-notified? | Only if their actual rank changed. Correcting a typo in the notes does not ping them again. |
| Who may record one? | Any instructor (dojo_instructors) for colour-belt ranks. Black belt and above requires head-instructor approval — this mirrors requiresHeadInstructorApproval in src/constants/beltRanks.ts and the approve_verification_request RPC, so the screen and the database agree. |
| Who is notified? | The student, and the head instructor / owner. |
| Does it post publicly? | No. It does not go to the dojo's Social feed. A promotion is between the student and their dojo's leadership unless the student chooses to share it. |
| Who can read the record? | The student and the dojo's instructors. |
| May it skip ranks? | Yes, with a typed reason. The picker defaults to the next rank up; any higher rank is selectable but requires a reason (a transfer from another school, a long-time practitioner placed at their real rank). The reason is stored on the promotion. |
| May it move someone down the ladder? | Not as a promotion. Lowering a rank is a correction, not a promotion, and lives behind the separate correct-or-void action in the first row. So the picker offers no rank below the current one, and — per sheet-picker — those rows state why. |
| May it be back-dated? | Yes, freely. The test was Saturday and it is being entered on Monday; a dojo onboarding onto Konjo is typing in years of paper history. No lower bound. |
| May it be future-dated? | No. A promotion is a thing that happened, not a thing that is scheduled. The date field's maximumDate is today and it has no minimumDate. Future-dating would make "current rank" time-dependent, so every screen showing a belt would have to ask as of when. |
| Does it attach to a test event? | Optionally. Studio's bulk finalize sets the reference for everyone in the batch; the single-student path leaves it unset unless a test is chosen. Both paths write the same promotion record, so a spot promotion and a paper-history import do not need an invented test event. |
| Where does time at rank come from? | The most recent promotion record. |
| What shows for a student who trained elsewhere first? | Unknown — never a number derived from their join date. For a transfer, time-at-this-dojo is a different fact wearing the same label, and it would be printed directly above the button that promotes them. content-format already holds that Unknown is legitimate when unknown-ness is the fact. |
The screen's opening line, under the title, saying what kind of thing this is before the person starts:
Permanent. A head instructor can correct it later.
It states only what is decided above. It is not a short version of the consequence line — that sentence names who is affected and who is notified, and a truncated paraphrase of it above the fold is consequence copy without the consequence.
What the consequence line may say, now that these are decided. The template is the sanctioned text; the worked example is only an illustration of it.
{Student}'s rank changes everywhere and a certificate is issued.{Student}and the head instructor are notified. A head instructor can correct this later.
Worked, once a student is chosen:
Ana Torres's rank changes everywhere and a certificate is issued. Ana Torres and the head instructor are notified. A head instructor can correct this later.
Before a student is chosen — the field-empty state — the neutral form, which is what the screen shows rather than showing nothing:
The student's rank changes everywhere and a certificate is issued. They and the head instructor are notified. A head instructor can correct this later.
Never a pronoun the app has to guess. Konjo does not hold anyone's pronouns, so a consequence line that says "she" is inventing a fact about a person on the screen that makes a permanent record. Repeat the name, or use the neutral form.
Test notes — the write-once rule
A promotion is usually recorded from a testing form the instructor filled in during the test. Some of what they wrote is for the student; some is candid and is not.
The instructor types it once. Notes are entered as separate lines, and each line carries a share control.
- Every line starts private. Nothing reaches the student unless it is explicitly marked.
- A share control on each line marks it for the student. One pass of typing, no retyping, no duplicate field.
- A running count sits above the submit: "2 of 6 notes will be sent to Ana." The instructor sees exactly what she will read before committing.
- The count is the confirmation. There is no separate review step — mid-class, that is one screen too many.
The reason for the default: an instructor writing quickly between rounds may phrase something bluntly without meaning harm. Private-by-default means the failure mode is forgetting to share something kind, which is recoverable, rather than sending something that stings, which is not.
Implies follow-up work: per-line note audience and promotion amendment history are both schema changes. Neither is built by the design work.
Incident reports
The screen: an instructor files a record of an injury, a safety concern, or a conduct issue. It is a legal record.
| Fact | Decision |
|---|---|
| Who is alerted? | The owner and head instructor. |
| Is the student notified? | Never. |
| Can the student see it? | Never. It is staff-only. |
| Can it be corrected? | Yes, by amendment. The filer or a head instructor adds an amendment. |
| Is the original changed? | No. The original text is never overwritten. Both the original and every amendment are visible, with timestamps. |
| What severity levels exist? | Three: Note, Concern, Serious. Note — worth recording, no action expected (a scraped knee). Concern — someone should follow up (repeated behaviour, a parent complaint). Serious — an injury needing medical attention, or anything that could become a liability. |
| Does severity change what happens? | Yes. Serious alerts the owner immediately and can never be deleted, only resolved. Note and Concern follow the ordinary amendment model above. |
| Is severity pre-selected? | No. The field opens with nothing chosen. destructive forbids defaulting a judgement field, and how bad an incident was is exactly that. |
The amendment model is deliberate: a record nobody can fix is a record people stop filing, and an incomplete safety log is worse than an imperfect one.
Copy that follows from this: the form may state "Staff only. Students are never notified and never see this" before the tap, and confirm with "Report filed. The owner and head instructor were alerted."
Removing someone from a dojo
| Fact | Decision |
|---|---|
| Who may remove? | Head instructor and owner only. Assistant instructors can record attendance and promotions, but ending a membership is an ownership-level act. |
| What ends? | Their membership. They lose access to this dojo's roster and content. |
| What stays with the dojo? | Their attendance, promotions and records. The dojo keeps its own history. |
| What stays with the person? | Their Konjo account and personal training log. They can join another dojo. |
| Is it reversible? | Yes — by re-adding them. |
| Is the person notified? | No. No email, no push, no in-app message. Their app stops showing the dojo's classes and content and falls back to the plain no-dojo state. |
Removal is almost always the end of a conversation that already happened in person. An automated "You have been removed from Sunrise Dojo" is a cruel way to hear it, and it fires just as readily on an admin cleanup or a mistake — where it cannot be recalled.
But silence has to be stated, not implied. The person doing the removing must know the student will not be told, because otherwise they assume the app handled it and say nothing themselves.
What the consequence line may say — singular, then the plural form a roster's bulk action needs. Both are templates; the names are illustrations:
Removes
{Student}from{Dojo}. Their attendance and promotions stay with the dojo. Their Konjo account is not deleted, and they can be re-added.{Student}is not notified.
Removes
{N}students from{Dojo}. Their attendance and promotions stay with the dojo. Their Konjo accounts are not deleted, and they can be re-added. They are not notified.
Worked: "Removes Ana Torres from Sunrise Dojo. Their attendance and promotions stay with the dojo. Their Konjo account is not deleted, and they can be re-added. Ana Torres is not notified."
The notification clause goes last, after the reversibility clause. It is the one fact the remover is most likely to assume wrongly, and the end of the sentence is where it is read.
Merging two families
The front desk finds two household records that are really one family — the same family entered
once at the desk and once by a parent — and joins them. The screen is
/families/suggestions/[candidateId], and the same act is reachable from a family's own page.
| Fact | Decision |
|---|---|
| What does merging two families do? | Everything moves into the family staff chose to keep: every person, parent link, card, charge, payment and credit. |
| What happens to the cards? | Both stay on file, and each keeps paying only for what it was set up to pay for. Staff choose which one becomes the family's default — only between cards that are a household default today. Each card keeps charging under the Stripe customer it was saved with. |
| What happens to the other family? | Archived, not deleted. Its own history stays on it, and it is still reachable by link, greyed and tagged. |
| Who is told? | Each cardholder whose card covers everyone gets an email, because "everyone" just grew. Nobody else is notified. |
| Can it be undone? | Not in Studio. Every merge is recorded in family_merges with a manifest of every row it moved, so Konjo can separate the families again. |
| Who may do it? | family.manage — front desk, head instructor and owner. A merge that moves cards or payment history also needs member.billing.manage, which a head instructor does not hold. |
The consequence line, word for word:
Merging moves every person, parent link, card, charge, payment and credit into the family you keep. Every saved card stays on file and keeps paying only for what it was set up to pay for. A cardholder whose card now covers more people gets an email. The other family is archived, not deleted. You cannot undo a merge in Studio — Konjo can separate the families again if it was a mistake.
Removing a check-in
The kiosk is a tablet a queue of people tap in turn, so the wrong name gets picked. The
correction lives on the session roster at /attendance/classes/[scheduleId].
| Fact | Decision |
|---|---|
| Who may remove? | Anyone who can take a check-in — owner, head instructor, front desk (attendance.manage). Not an ownership-level act: the desk that recorded it is the desk that noticed. |
| What is deleted? | The attendance record for that session, and nothing else on any other date. |
| What comes back? | A class-pack credit, if the check-in burned one, returned to the pack it came from. A booking the check-in flipped to attended goes back to booked, so the member reads as booked-but-didn't-attend. |
| What happens to the member's own training log? | The entry the check-in wrote is removed — unless the member has already written on it (a note, a reflection, a photo, or the techniques they drilled). Then it stays: it is their record of their evening, not the desk's. |
| Does it change their attendance rate or risk score? | Yes, immediately. Both are computed from attendance every time a screen asks, so the next read is already right. |
| Is the member notified? | No. No email, no push, no in-app message. |
| Is it reversible? | No — but the removal is kept in Audit history (who, when, which class, and what it returned), and the member can simply be checked in again. |
What the consequence line may say:
Removing a check-in deletes the attendance record, returns a class-pack credit if one was used, and takes the class off the member's own training log. It can't be undone — the removal is kept in Audit history.
The credit clause is not decoration. It is the only part of a removal that touches money the member paid, and the desk will not go looking for it.
Waivers
| Fact | Decision |
|---|---|
| Who can read a signed waiver? | The signer — or the parent who signed for a minor — and the owner and head instructor. |
| What do other instructors see? | Signed or unsigned status only, never the contents. |
| Can the signer retrieve their copy? | Yes, always. |
A waiver often carries medical information. The status is what an instructor needs at the door; the contents are not.
Money — refunds and revokes
The screen: staff issue a refund against a payment, or revoke something that was granted.
| Fact | Decision |
|---|---|
| Is a refund reversible? | No. It is a real movement at the payment processor and cannot be un-issued. No refund UI may imply otherwise — no undo toast, no armed-then-disarming control, no "you can change this later". |
| What corrects a mistaken refund? | A new charge, which is its own decision with its own confirmation. Never an "undo". |
| Is the member notified? | Yes, automatically — a receipt, the same as for a payment. A refund landing in someone's bank with no explanation generates a phone call the dojo did not want. |
| What stays on the record? | Everything, permanently: the amount, the timestamp, who issued it, and the reason. A refund is never deleted from a payment's history. |
| Who may issue one? | Head instructor and owner. Same bar as removing someone — it moves money out of the business. |
This is the strictest row in this file, and the reason is arithmetic rather than taste: every other permanent action here is permanent in Konjo's database, where a determined engineer could in principle repair it. A refund is permanent at Stripe. The UI is the last place it can be stopped.
Leads
The screen: the Leads board — prospects moving through stages toward becoming members.
| Fact | Decision |
|---|---|
| What are the stages? | Fixed platform-wide: New, Contacted, Trial scheduled, Trial completed, Converted, Lost. A dojo cannot add, remove or reorder them. This is what lets the board's layout, its phone treatment and cross-dojo reporting all be designed once. |
| Is a stage move recorded? | Yes — who moved it, when, and from which stage to which. |
| Is a stage move reversible? | Yes. Undo restores the previous stage. This is the fact that makes a drag legitimate at all: direct-manipulation makes reversibility the test of whether something may be a gesture rather than a button. |
| What is "Lost"? | An archive. The lead is retained indefinitely — the history is worth keeping and people come back — but it leaves the active board and can be restored to an earlier stage. It is not a working column: on a phone, a permanently-filling column would consume the horizontal space the board can least afford. |
| Where did a lead come from? | A closed list of sources, so it can be counted and charted. |
| Is "booked in app" one of those sources? | No — it is a separate flag. Someone can find the dojo on Instagram and book themselves through Konjo; both are true, and one field cannot hold both. |
| What is a trial? | A single dated appointment, not a window. |
| What does an expiring trial mean? | Its date has passed and nobody has marked it attended or no-show. It is then overdue, and it becomes a follow-up someone is holding. |
| Does a trial ever auto-convert or auto-lapse? | Never. A human decides. The machine may flag and chase; it does not conclude. |
| Does a new lead carry a clock? | Yes. A lead untouched past the dojo's response window goes overdue, the same as an overdue trial. Default 24 hours, settable per dojo. |
| Why a clock at all? | Without one, "3 new leads" is a neutral count and belongs nowhere in particular. With one it is a queue with a deadline, which is what earns it a place on Studio Home. |
Converting a lead to a member
"Convert to member" is not a one-click action. It opens a wizard the front desk works through while the person is standing there.
| Fact | Decision |
|---|---|
| Who picks the plan, price and start date? | The front desk, inside the wizard. Not the new member. A price agreed in person must not be re-openable by the person who agreed to it on their way out the door. |
| Who takes payment? | The front desk, in person, most of the time — they key the card while the member is at the counter. This is the normal path, not the exception. |
| Then what is the link we send? | App onboarding, not payment collection. It exists so the new member installs Konjo, sets up their account, and — if they want — adds alternate payment methods. Treating it as the payment step misreads how a dojo actually closes a sale. |
| What are they before they finish it? | A member, flagged incomplete. They are in the roster immediately and can be checked into tonight's class. The flag is visible on their row and says what is missing. |
| Why not hold them out of the roster? | Because they are about to walk onto the mat. A person the dojo has taken money from and cannot check in is a worse failure than an untidy roster. |
| What if they never finish? | The flag ages into a follow-up task with a resend action on it — the same shape as the retention follow-ups, so a named person is holding it. |
| Does an unfinished signup ever revert to a lead? | No. They are a member; the sale closed. Reverting would orphan their attendance, their waiver and anything else already attached. |
Implies follow-up work: the wizard itself does not exist. Neither does the open/claimable class list implied by sub requests. Both are features with their own plans — this file holds what they must mean, not permission to build them inside something else.
Editing the belt ladder
The screen: Studio's belt ladder (/style) → Edit ladder. Someone is renaming a rank,
adding one, dropping one, or changing the order they come in.
The one-line version: a rank keeps its identity through a rename and a move, so moving one silently rewrites what every member at it, every promotion record naming it and every belt test targeting it means — which is why a save that moves a rank in use asks twice, and why a save that lands on a ladder someone else already changed is refused rather than merged.
| Fact | Decision |
|---|---|
| What identifies a rank? | Its slug, minted once from the name it was created with and never changed again. A rename changes the label people read; it does not mint a new rank, and nobody moves. |
| What does moving a rank do? | It changes the rank's position, keeping everyone at it. Every member at that rank, every promotion record naming it and every belt test targeting it now sits at a different rung — nothing is rewritten, so the records quietly mean something else. This is why it asks. |
| When does a reorder ask twice? | When it moves ranks that are in use — held by a member, named in a promotion record, or targeted by a test requirement. Reordering a ladder nobody has climbed goes through on one press, because there is nothing to warn about. |
| Is "adding a rank above" a reorder? | No. Inserting or dropping rows shifts everything below them by one index, but no two existing ranks swap places, so nobody's ladder changed. Only two kept ranks crossing over counts. |
| Can a rank in use be removed? | No. The save is refused, naming the rank and why — members hold it, test requirements target it, or curriculum is gated on it. There is no remap, so a removal is never offered as a choice a person can push through. |
| What happens to someone at a rank that IS removed? | Nothing moves them. That is exactly why removal is refused while anyone is there. |
| What if two people edit the ladder at once? | The second save is refused, not merged and not silently applied on top. The editor keeps its rows and offers to reload; nothing has been written at that point. |
| Does saving the ladder tell students? | No. Nothing is sent, no notification, no push. What students see changes when the curriculum is published (above), which is a separate, deliberate act. |
| Who may edit it? | An app admin, or a head instructor / dojo admin of the dojo that owns the style, holding curriculum.manage. A dojo on somebody else's approved style cannot edit that ladder at all. |
| How many ranks may a ladder have? | 2 to 40. Below two is not a ladder; above forty is a list nobody reads. |
Publishing curriculum
The screen: Studio's belt ladder (/style) → Publish to students. The owner has changed
what the dojo teaches — a new technique, a different belt test — and is telling the school.
The one-line version: publishing curriculum tells every current member and instructor once, in-app (push rides the master toggle); it cannot be unsent; every version is kept and tests reference the version they were prepared on.
| Fact | Decision |
|---|---|
| Do curriculum edits wait for a publish? | No. Every edit is live for the dojo the moment it saves. Publishing is the telling, not the gate — nothing on the mat changes when the button is pressed. |
| Who is told? | Everyone on the roster and every instructor at the dojo, minus the person who published. One in-app notification each, once per publication. |
| Are guardians told separately? | No. A managed child's account gets the row like any other roster member; there is no second notice to a linked adult. |
| Push or in-app? | Both — the in-app row always, and a push that rides the master push toggle. It is not one of the four switchable categories in Notifications below. |
| Can it be unsent? | No. The notifications are sent inside the same transaction that writes the publication, and there is no recall. A mistake is corrected by publishing again with a note that says so. |
| Can a publication be edited or deleted? | No. The row is immutable — a database trigger refuses both. The note an owner typed is the note their students read, permanently. |
| What does publishing again do? | Writes the next numbered version and sends a second notice to everyone. Publishing an unchanged curriculum is legal and sometimes the point (the week before a test); the screen says plainly when nothing has changed since the last version. |
| Is a note required? | Yes. Students read that line, and it is the only thing that tells v4 from v5 a year later. |
| What is kept? | Every version, forever: its number, the note, who published it, when, how many people it reached, and a full snapshot of what the dojo taught at that moment. |
| What is version 1? | For every dojo that existed when versioning shipped, a baseline the database wrote — "what your dojo already used". Nobody published it and nobody was notified by it. A dojo opened afterwards has no baseline, so its version 1 is a real publication somebody pressed a button for. A screen telling the two apart must check who published it, not the number. |
| Who may publish? | Anyone who may change the dojo's curriculum: an app admin, a holder of the curriculum.manage capability, or a head instructor / dojo admin. The RPC refuses everyone else, whatever the screen shows. |
| Who can read a version afterwards? | Anyone who can read that dojo's curriculum: roster members and instructors. A member of another school gets nothing. |
| What does a belt test reference? | The version the candidate was prepared on, recorded on the test. Changing the curriculum afterwards never rewrites what someone was graded against. |
Reviewing a style update
The screen: Studio's belt ladder (/style) → Update available → Review curriculum update
(/style/review/[versionId]). A style board has published a new version of the curriculum, and
somebody at the school decides what their dojo does about it.
The one-line version: a board update changes nothing at a school until somebody with the curriculum permission accepts it; accepting it still tells no student anything — that is publishing.
| Fact | Decision |
|---|---|
| Does a board publishing change what a school teaches? | No. It creates one pending review per adopting school and one staff task on the curriculum reviewer's desk. Nothing the school teaches moves until somebody answers. |
| Who is asked? | One person: the dojo owner, else the head instructor, else the legacy head/admin instructor row. Every one of them can actually answer it. If a school has nobody who could, the review is still recorded and the next fan-out retries the task. |
| Who may answer it? | Anyone holding curriculum.manage at that dojo (owner, head instructor, app admin) — not only the person the task was handed to. Everyone else is told nothing at all, including whether a review exists. |
| Is anybody notified? | A staff task, and nothing else. No student notification, no push, no Studio bell — a Studio notification is a task (founder decision 09). |
| What does accepting do? | Moves the dojo's accepted version to the new one, writes down every decision taken, and closes the task. It does not publish, and no member hears anything. |
| What happens to a change the school had already made itself? | It is kept by default and never overwritten silently. Where the school and the board moved the same thing apart, the database refuses the whole save until each of those carries an explicit answer. |
| What does "keep mine" do? | Writes a standing override for that one thing. It survives future board updates until somebody takes the board's version back on purpose. Where the board adds something the school does not want, keeping means "we do not teach that". |
| What does "take theirs" do? | Retires any standing override for that thing, so the school follows the style again. The old value is not recoverable from this screen — it is re-typed on the belt ladder like any other curriculum edit. |
| Can accepting be undone? | No. The accepted version moves and the review settles. What it changed can be changed again from the belt ladder; the review itself is a record. |
| What about a test that is already prepared? | Never rewritten. A belt test records the curriculum version it was prepared on and keeps it. |
| What does "not now" do? | Closes the task with an optional reason, leaves the accepted version exactly where it was, and changes nothing the school teaches. The next version the board publishes asks again. |
| What if a school skipped a version or two? | Accepting the newest one answers the older ones too — the comparison was taken against what the school accepted, so nothing is missed — and their tasks close as "Answered by version N". |
| Can a board publish an identical version? | No. It is refused. Putting a task on fourteen desks for nothing is not a release. |
Studio Home
The screen: the owner's dashboard.
| Fact | Decision |
|---|---|
| Who assigns a sub for a class? | A head instructor or the owner. |
| Does the assigned instructor accept? | No — they are told, not asked. A class with a maybe attached to it is not covered, and the whole point of the feature is knowing the class is covered. |
| Is an assignment reversible? | Yes, up until the class starts. |
| Can an instructor take an open class themselves? | Yes. An uncovered class is claimable without waiting to be assigned — the fastest path to cover is often the person who was free anyway. |
| Who is notified? | The requesting instructor (their class is covered) and the assigned instructor (they are teaching it). |
| What counts as "at risk"? | A student who has not attended for longer than the dojo's threshold. Default 21 days, settable per dojo. |
| Why per dojo? | A dojo running two classes a week and one running daily classes do not mean the same thing by "quiet". studio/metrics already holds that "it depends on the dojo" is what makes something a product fact rather than a design choice. |
| What does the Birthdays card show? | Day and month only. "Maya turns 9 on Thursday." Never a birth year, never a full date of birth. |
| Who can see it? | Any staff account. Knowing it is a student's birthday is the entire point, and the person most likely to greet them at the door is the front desk. |
| Where does the full date of birth live? | On the member record, behind the same permission as other personal details. The card is a reminder, not a data view. |
| Does the card know the greeting already went out? | Yes, and it says so — otherwise the automated message and a human one arrive together. |
| Does Today list classes that already happened? | Yes — all of today, with finished ones marked done and showing whether attendance was recorded. The count reads "six classes, four done". |
| Why not only what is upcoming? | Because an owner checking at 3pm most needs to see that the 10am has no attendance recorded, which is precisely what an upcoming-only card hides. |
| Does an instructor see a different Home? | The same Home, with fewer blocks. The money band, the business panel and analytics are not rendered for them. Same layout, same order — one screen to design, one ordering rule. |
The alert slot's ranking
When an uncovered class, a serious incident, a past-due payment and an unsigned waiver are all live on the same morning, the alert slot shows the first of these that applies:
- An uncovered class — starting today with nobody to teach it
- A serious incident — filed and unresolved
- A past-due payment
- An unsigned waiver
The order is by how soon it hurts and how badly it keeps. A class starting in two hours with no instructor is unrecoverable by evening; a past-due payment is exactly the same problem tomorrow, and the day after.
The order is the same for every dojo. It is not configurable. A slot whose selection rule varies by installation is a slot nobody can learn to trust — and this is the one element on the page whose whole value is that the owner believes it.
When a screen is empty
Every not-yet-set-up state needs to tell two situations apart: nothing has happened yet and you never turned this on. Getting it backwards prints a false statement about the business.
Each feature declares its own setup condition. There is no global "onboarding complete" flag — a dojo with billing live and no waiver templates is neither set up nor not.
| Feature | It is "set up" when |
|---|---|
| Billing | A payment processor is connected |
| Leads | The dojo's public page is published |
| Waivers | At least one waiver template exists |
| Schedule | At least one recurring class exists |
| Shop | The print provider is connected and at least one product is published |
Set up, nothing yet → "No leads yet." Not set up → "Publish your dojo page to start collecting leads," with the button that does it. The second is the more common state for a new dojo and the more useful sentence, which is why guessing wrong is expensive.
Adding a feature means adding its row here. A feature with no row has no legitimate not-yet-set-up state, and its empty screen must say only what it knows.
Direct messages
The screen: general person-to-person messaging — any two adult Konjo accounts, across dojos. Messages is the index-list inbox; a conversation is a thread of bubbles. One producer writes into the same pipes automatically: when a second instructor grades the same technique differently from the last recorded grade, Konjo sends a message from the newer assessor to the one they disagree with.
| Fact | Decision |
|---|---|
| Who can message whom? | Any adult account, across dojos — this is not a per-dojo tool. Managed (child) accounts are excluded entirely; a guardian messages as themselves, never as the child. |
| Who is notified? | The recipient only, never the sender. One push per unread burst per conversation — five messages while the recipient is away is one notification, not five. The automatic disagreement message notifies the same way. |
| What does the push say? | The sender's name and that a message arrived — never a preview of the body. The automatic message can name a student and a grade; that is not something a lock screen may show. |
| Can a message be edited? | No. |
| Can a message be deleted? | The sender may soft-delete their own human messages, any time. It becomes "Message removed" in the thread for both people at once. The text is kept for 30 days, out of the thread and reachable only by an app admin handling a report, then permanently cleared. Automatic messages can never be deleted — they are the record of a documented disagreement. |
| How long are messages kept? | Indefinitely. If a sender's account is later deleted, their messages stay in the thread under a "Deleted account" sender rather than disappearing — deleting the row would erase the other participant's own history of the conversation. |
| What does blocking do? | Silent and two-way. Neither person can send to, or find, the other again; an existing thread stays readable to both. The blocked person is never told — a refused send reads the same generic line ("This person isn't accepting messages") whether the cause is a block, a suspension, or a managed account, so being blocked can't be inferred from the error. Blocking does not remove an existing follow. |
| Who can read a conversation? | The two participants, and no one else at their dojo. A dojo owner or head instructor reads nothing — a DM is not staff business, even between two people who train at the same school. An app admin may read a reported message with five messages of surrounding context, and every such read is logged. |
| Does messaging someone reveal anything about you? | Yes. Starting a conversation makes your profile card (name, avatar, belt, dojo, bio) visible to the other person — the same visibility a follow in either direction already grants. A thread with an invisible sender would be unusable, so profile visibility widens for the pair. |
| What rate limits apply? | 30 messages a minute, 500 a day, and 20 new conversations a day, per sender. Hitting one refuses the send with a plain reason. |
What the consequence copy may say — the block confirmation, the one destructive action on these screens:
Blocks
{Name}. Neither of you will be able to message the other, and they won't be told. Your existing conversation stays visible to both of you.
Worked: "Blocks Riley Okafor. Neither of you will be able to message the other, and they won't be told. Your existing conversation stays visible to both of you."
Notifications
Five push categories, each individually switchable in Settings:
| Category | Covers |
|---|---|
| Rank & promotions | You were promoted; your certificate is ready; your rank was corrected or a promotion voided. For a head instructor or owner: a member at your dojo changed rank — the leadership half of Who is notified? in Promotions above. Both sides ride one toggle, because the category is about rank and not about which end of it you are standing on. |
| Coaching feedback | An instructor reviewed your video or left feedback. |
| Events & classes | A class you are enrolled in is soon, cancelled or changed; a test or camp you registered for. |
| Social & community | Replies, mentions, and dojo announcements. |
| Direct messages | Someone sent you a message, including the automatic disagreement message described in Direct messages above. Its own toggle, not folded into Social & community — a DM is a one-to-one conversation someone chose to open, not a community broadcast, and the two should be silenceable independently. In Settings it is its own row, "Direct messages", beside the other social rows (comments, mentions, dojo announcements); the Settings screen is a flat list of toggles with no section to file it under. |
Turning a category off turns it off. There is no "important" override. The settings screen uses the same words the notifications do — see notifications.
Not yet decided
These are blockers, not blanks. If your screen needs one, say which and stop.
| Open fact | Which screens it blocks |
|---|---|
What does a student's rank mean in a dojo that is not Cuong Nhu? users.belt_rank is a nineteen-value enum whose values are Cuong Nhu's ladder. user_style_ranks.rank_slug holds the same student's rank on whatever ladder their dojo actually teaches. The two disagree the moment a dojo is not Cuong Nhu — ATA's orange and camo are not values the enum can hold. Which is the source of truth, and what happens to the other? |
Every rank picker, the promotion form, broadcast audience targeting (min_belt_rank / max_belt_rank), and anything that draws a belt. It is why two rank pickers still exist: RankPicker takes the dojo's ladder as data and is correct, and BeltRankPicker hardcodes the nineteen and is what everything actually calls. The migration cannot start until this is answered. |
This section was full once
Twenty-one open facts were answered in a single sitting, and everything above the line came out of it. That is worth saying plainly, because a nearly-empty "not yet decided" section invites two wrong conclusions: that the questions were unimportant, or that the mechanism is finished.
Neither. The mechanism is the design skill's §1 rule — name the missing fact and stop — and its value is measured in the sentences it prevented, not in how long this list is. The row above got here the same way all twenty-one did: something needed building, the fact was not available, and the work stopped instead of inventing it.
Keep adding rows.
Why this file exists
A blind test of the promotion screen once produced a specification roughly a third of which was invention wearing the design system's vocabulary. The most dangerous line in it was a consequence sentence asserting what "remove from dojo" does — fluent, confident, and written from nothing, directly above the button that makes the record permanent.
The design system cannot prevent that by being more thorough, because the missing information was never design information. It prevents it by holding the answers here, and by stopping when the answer is absent. See governance.