@connextar/house 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -584,6 +584,15 @@ runbook — is [`docs/ReleaseProcess.md`](docs/ReleaseProcess.md), shipped in th
584
584
  package. Each app's own `docs/operations/ReleaseProcess.md` links to it and adds
585
585
  only what is its own: its public API, its trigger documents, its history note.
586
586
 
587
+ Beside it, [`docs/RoutineOperations.md`](docs/RoutineOperations.md) is the method
588
+ for the recurring checks that keep an app ready, aligned and compliant — security
589
+ rounds, release gates, bills, backups, the privacy policy against the code — each
590
+ with when it last ran and when it's next due. An app copies
591
+ [`docs/templates/RoutineOperations.md`](docs/templates/RoutineOperations.md) to its
592
+ own `docs/operations/RoutineOperations.md`: a short summary of the method, then its
593
+ own register and run log. Its `AGENTS.md` tells every agent to read the Next due
594
+ column first.
595
+
587
596
  ### `@connextar/house/changelog`
588
597
 
589
598
  `<Changelog releases={CHANGELOG} />` — the body of a `/changelog` page. Each
@@ -2079,7 +2088,10 @@ Then, per module the app takes up:
2079
2088
  §7: the old entries become numbered releases once, `lib/release.test.ts` guards
2080
2089
  them from then on, and the app's own `docs/operations/ReleaseProcess.md` says
2081
2090
  only what is its own.
2082
- 5. **Gates, then the pages.** `npm run check`, `npm test`, `npm run build`, and
2091
+ 5. **Routine operations** follow [`docs/RoutineOperations.md`](docs/RoutineOperations.md):
2092
+ copy the template to `docs/operations/RoutineOperations.md`, fill the register
2093
+ from its §5, and add its §6 pointer to `AGENTS.md`.
2094
+ 6. **Gates, then the pages.** `npm run check`, `npm test`, `npm run build`, and
2083
2095
  grep the built CSS for a class that only the package uses — the one check that
2084
2096
  proves step 1.
2085
2097
 
@@ -0,0 +1,148 @@
1
+ # Routine Operations
2
+
3
+ > The method every Connextar app uses to keep its recurring checks in one place: what each one is for, how often it runs, how to run it, when it last ran and what it found, and when it's next due. Scheduled checks get lost in day-to-day work; a register that every task starts by reading is what stops that. Shared by the cohort and shipped inside `@connextar/house`, beside [ReleaseProcess.md](ReleaseProcess.md); each app keeps a `docs/operations/RoutineOperations.md` that holds its own register and run log.
4
+
5
+ _First written for AltEd on 2026-10-16 (its v0.116.0) and generalised for the cohort the same day._
6
+
7
+ ---
8
+
9
+ ## 0. What each app's own document says
10
+
11
+ This document is the method. An app's `docs/operations/RoutineOperations.md` links here and holds three things nobody else can write:
12
+
13
+ 1. **Its register** — one row for every routine the app has (§2), manual and automated.
14
+ 2. **Its run log** — one line for every run (§3, step 5), newest first.
15
+ 3. **Its standing go-aheads** — any routine the owner has said may read or write production without asking each time, recorded on that routine's row.
16
+
17
+ Every app's file has the same three parts, so a reference like "Part 2" means the same thing in each:
18
+
19
+ - **Part 1 — The method:** a link here and the four rules an agent needs without leaving the file (read Next due first; never write to production without a yes; how a run is recorded; new routines start Proposed, retired ones are paused), with the status keys.
20
+ - **Part 2 — the register:** 2.1 manual routines, 2.2 automated routines, 2.3 paused.
21
+ - **Part 3 — Run log.**
22
+
23
+ Start it from [templates/RoutineOperations.md](templates/RoutineOperations.md): copy it to `docs/operations/RoutineOperations.md`, put the app's name in the title, and fill the register (§5 lists the rows most apps start with). The template links the app's own `docs/operations/ReleaseProcess.md`; an app without one links the shared [ReleaseProcess.md](https://github.com/Connextar/cx-house/blob/main/docs/ReleaseProcess.md) instead. Then add the pointer in §6 to the app's `AGENTS.md`.
24
+
25
+ Part 1 is a summary, not a copy. If the method needs to change, change it here, so every app changes with it, and change the template's Part 1 if one of the four rules moved.
26
+
27
+ ---
28
+
29
+ ## 1. What a routine is
30
+
31
+ A **routine** is any check or chore that has to happen again and again, on a calendar or on a trigger, whether or not anything is broken. It belongs on the register if forgetting it would cost something: a security gap, a wrong price, a bill, a broken promise in the privacy policy, a stale document.
32
+
33
+ There are two kinds:
34
+
35
+ - **Manual:** a person or an agent runs it and records the result. Security rounds, a pricing or usage baseline, the month's bill check.
36
+ - **Automated:** the app runs it by itself on a schedule. Scheduled jobs and crons. The register still lists these, because someone has to look at whether they're running.
37
+
38
+ ---
39
+
40
+ ## 2. The register
41
+
42
+ Every routine has one row, with:
43
+
44
+ | Field | What it holds |
45
+ | ------------ | ----------------------------------------------------------------------------------------------------------- |
46
+ | **ID** | `OPS-nn`. Never reused, so the run log can point at it. |
47
+ | **Routine** | Its name, in plain words. |
48
+ | **Why** | What goes wrong if it's skipped. |
49
+ | **When** | A calendar cadence ("monthly, mid-month") or a trigger ("after every 5 feature tranches", "every release"). |
50
+ | **How** | The command or runbook, and anything it must never do (for example, write to production). |
51
+ | **Record** | Where the full result goes: a document, a dashboard. |
52
+ | **Last run** | Date, version and a one-line result, or "Not recorded". |
53
+ | **Next due** | A date, or the trigger that makes it due. |
54
+ | **Status** | One of the keys below. |
55
+
56
+ ### Status keys
57
+
58
+ | Status | Meaning |
59
+ | -------------- | --------------------------------------------------------------- |
60
+ | ✅ On schedule | Ran when due; next run not yet due. |
61
+ | 🟨 Due | Due now, or due by the next release. |
62
+ | 🟥 Overdue | Past its date or trigger and not run. |
63
+ | ⏰ Scheduled | A run is booked, for example a scheduled task (§4). |
64
+ | 🤖 Automated | The app runs it itself; the row is about watching it. |
65
+ | ⚪ Proposed | Suggested, not yet agreed by the owner. Not counted as overdue. |
66
+ | 🧊 Paused | Deliberately off, with the date and reason recorded. |
67
+
68
+ ### How the register is laid out
69
+
70
+ - **2.1 Manual routines** — the full table, every field above.
71
+ - **2.2 Automated routines** — a shorter table (ID, job, what it does, when, status), headed by a sentence saying where to watch them: the app's job-health page, its operational summary email, its host's cron dashboard. Say how often to look (at least weekly) and when to look sooner.
72
+ - **2.3 Paused** — ID, routine, why paused, since.
73
+
74
+ ---
75
+
76
+ ## 3. Running a routine
77
+
78
+ 1. **Check it's due.** At the start of any piece of work, read the register's **Next due** column. A 🟨 Due or 🟥 Overdue routine runs before new feature work, or the owner says why not.
79
+ 2. **Run it exactly as its How column says.** If the How has gone stale, fix the How first.
80
+ 3. **Never write to production as part of a routine** unless its How says so and the owner has said yes for this run. Reads against production need the owner's go-ahead too, unless the row records a standing one.
81
+ 4. **Record the full result where its Record column says.**
82
+ 5. **Add a line to the run log:** date, ID, who ran it, the result in a sentence, and any follow-up.
83
+ 6. **Update the row:** Last run, Next due, Status.
84
+ 7. **Act on findings** by the rules of the routine's own record. For a security round: Critical and High get fixed before anything else.
85
+ 8. **Release if a status document changed**, following [ReleaseProcess.md](ReleaseProcess.md).
86
+
87
+ ---
88
+
89
+ ## 4. Adding, changing, retiring and booking
90
+
91
+ ### Adding or changing a routine
92
+
93
+ - Add a row with the next free ID. A new routine starts ⚪ Proposed until the owner agrees its cadence.
94
+ - When something new needs regular attention (a new paid service, a new scheduled job, a new legal promise), add it to the register **in the same change set that creates it**.
95
+ - A change to a routine's cadence or How is a change to its row, with a run-log line if it follows from a run.
96
+
97
+ ### Retiring a routine
98
+
99
+ Set it to 🧊 Paused and move it to the Paused table (2.3), with the date and the reason. Don't delete it: the run log still points at it, and IDs are never reused.
100
+
101
+ ### Booking runs
102
+
103
+ A routine with a calendar cadence should have its next run booked, not just remembered. Book it as a scheduled task in Claude, or as a calendar reminder for a person, name the booking on the row's **Next due** ("2026-11-15 09:00, scheduled task `app-pricing-baseline`"), and set the row to ⏰ Scheduled.
104
+
105
+ Whatever runs it follows this document: record, log, update the row. A booked run that touches production says so in its own instructions, and leaves its result uncommitted for review.
106
+
107
+ ---
108
+
109
+ ## 5. Rows most apps start with
110
+
111
+ Copy the ones that apply into the new register, as ⚪ Proposed until the owner agrees each cadence, and make each How the app's real command. One that doesn't apply yet (no payments, no AI) is left out; one that applies but is off for now goes in the Paused table with the reason.
112
+
113
+ | Routine | Typical When | Typical How |
114
+ | ---------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
115
+ | Security and QA audit round | After every 5 feature tranches (the delivery workflow's cadence). | The delivery workflow's audit round: the full test suite, typecheck and lint, the build, `npm audit --audit-level=moderate`. |
116
+ | Documentation pruning round | After every 10 feature iterations. | Dedupe and restructure the status documents; never drop open work. |
117
+ | Release gates | Every release. | The app's check, test, build and release-guard commands, each read by its exit status ([ReleaseProcess.md](ReleaseProcess.md)). |
118
+ | Browser sweep, including phone width | With each security round, and with any change to shared layout. | The app's end-to-end and accessibility suites. |
119
+ | Privacy policy against what the app does | With each security round, and with any change to analytics, email or AI. | Read the policy's promises against the code: what's recorded, where, for how long, by which providers. |
120
+ | Hosting, database and provider bills | Monthly, when the invoices arrive. | Compare with last month; explain any jump before it compounds. |
121
+ | AI and third-party prices | Monthly, if the app prices anything from a provider's cost. | Compare the app's stored prices and exchange rates with the providers' published ones; change them only with the owner. |
122
+ | Payments, end to end | After any change to checkout or webhooks, and once a quarter. | One real purchase of each kind, then a refund; check every record and message the customer should get. |
123
+ | Backups and a restore drill | Quarterly. | Restore into a branch or a scratch database and check it opens. A backup nobody has restored is a hope, not a backup. |
124
+ | Dependency and shared-package currency | Monthly, or when `@connextar/house` releases. | `npm outdated`; take up the house package's new version by its README; note anything held back and why. |
125
+ | Watching the scheduled jobs | Weekly (automated rows). | The app's job-health page or summary email: every job ran, none is failing, none is running far more often than it should. |
126
+
127
+ If continuous integration is switched off, add it to the Paused table with the reason, and make the release gates and the browser sweep the routines that stand in for it.
128
+
129
+ ---
130
+
131
+ ## 6. The pointer in `AGENTS.md`
132
+
133
+ Add this section to the app's `AGENTS.md`, so every agent reads the register before it starts. Replace the bracketed list with the kinds of check in the app's own register, so an agent knows what it's looking for:
134
+
135
+ ```markdown
136
+ ## Routine operations
137
+
138
+ - **`docs/operations/RoutineOperations.md` is the register of recurring checks** —
139
+ [security rounds, pruning, release gates, the browser sweep, bills, privacy] —
140
+ with when each last ran and when it's next due. At the start of a task, read its
141
+ **Next due** column: a routine that is due or overdue runs before new feature
142
+ work, or the owner says why not.
143
+ - After running one, record it as the shared method says (`@connextar/house`'s
144
+ [`docs/RoutineOperations.md`](https://github.com/Connextar/cx-house/blob/main/docs/RoutineOperations.md)):
145
+ the full result in its record, a line in the run log, and the row's Last run /
146
+ Next due / Status. Add a row in the same change set as anything new that needs
147
+ regular attention.
148
+ ```
@@ -0,0 +1,62 @@
1
+ <!--
2
+ Copy to docs/operations/RoutineOperations.md and replace "App name".
3
+ The ReleaseProcess.md links assume the app has docs/operations/ReleaseProcess.md.
4
+ If it doesn't, point them at the shared one instead:
5
+ https://github.com/Connextar/cx-house/blob/main/docs/ReleaseProcess.md
6
+ Delete this comment once the file is filled in.
7
+ -->
8
+
9
+ # App name — Routine Operations
10
+
11
+ > The recurring checks that keep App name ready, aligned and compliant: what each one is for, how often it runs, how to run it, when it last ran and what it found, and when it's next due. One place to look, so nothing scheduled gets lost in day-to-day work. Sits beside [ReleaseProcess.md](ReleaseProcess.md); [`AGENTS.md`](../../AGENTS.md) points here.
12
+
13
+ _Last updated: YYYY-MM-DD — first version._
14
+
15
+ This file follows the cohort's method in `@connextar/house`, [`docs/RoutineOperations.md`](https://github.com/Connextar/cx-house/blob/main/docs/RoutineOperations.md). It holds App name's own register (Part 2) and run log (Part 3).
16
+
17
+ ---
18
+
19
+ ## Part 1 — The method
20
+
21
+ The method — what a routine is, the register's fields, the status keys, how to run, add, retire and book a routine — is the shared [`docs/RoutineOperations.md`](https://github.com/Connextar/cx-house/blob/main/docs/RoutineOperations.md). Change it there, not here. In short:
22
+
23
+ - **At the start of a task, read Part 2's Next due column.** A 🟨 Due or 🟥 Overdue routine runs before new feature work, or the owner says why not.
24
+ - **Run it as its How says; never write to production** unless the How says so and the owner has said yes for this run. Reads against production need a go-ahead too, unless the row records a standing one.
25
+ - **Record it:** the full result in its Record, a line in the run log (Part 3), and the row's Last run, Next due and Status. Release if a status document changed ([ReleaseProcess.md](ReleaseProcess.md)).
26
+ - **New routines start ⚪ Proposed**, in the same change set as whatever needs them; retired ones go to 🧊 Paused, never deleted.
27
+
28
+ Status keys: ✅ On schedule · 🟨 Due · 🟥 Overdue · ⏰ Scheduled · 🤖 Automated · ⚪ Proposed · 🧊 Paused.
29
+
30
+ ---
31
+
32
+ ## Part 2 — App name's register
33
+
34
+ ### 2.1 Manual routines
35
+
36
+ | ID | Routine | Why | When | How | Record | Last run | Next due | Status |
37
+ | ------ | ------- | --- | ---- | --- | ------ | -------- | -------- | ------ |
38
+ | OPS-01 | | | | | | | | |
39
+
40
+ ### 2.2 Automated routines
41
+
42
+ The app runs these itself. The routine here is **watching** them: say where (a job-health page, a summary email, the host's cron dashboard), how often to look, and when to look sooner.
43
+
44
+ | ID | Job | What it does | When | Status |
45
+ | --- | --- | ------------ | ---- | ------ |
46
+ | | | | | |
47
+
48
+ ### 2.3 Paused
49
+
50
+ | ID | Routine | Why paused | Since |
51
+ | --- | ------- | ---------- | ----- |
52
+ | | | | |
53
+
54
+ ---
55
+
56
+ ## Part 3 — Run log
57
+
58
+ Newest first. One line a run: date · ID · who · result · follow-up.
59
+
60
+ | Date | ID | Who | Result | Follow-up |
61
+ | ---- | --- | --- | ------ | --------- |
62
+ | | | | | |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@connextar/house",
3
- "version": "0.15.0",
3
+ "version": "0.15.2",
4
4
  "description": "The pieces every app we build needs and none of them should own a copy of.",
5
5
  "license": "MIT",
6
6
  "repository": {