Say which subscription the launchpad pill's gate is about
"Not already paying" means the VIEWER's own seat — the same question the Plans & billing page answers when it decides whether to offer them one. Worth stating, ...
Say in the class contract that the gate can fall open
The header promised "a blocked app's endpoints all 403" without qualification, which is now true only while the entitlement tables can be read. The exception is...
Correct the note on the removed Create My Free Org rights
ab740dd3 claimed CREATE_FREE_ORG_WIDGET and its four policy children "never existed in RoleRightType.java at all". That is wrong. They were ids 288-292, and I r...
Design and implementation plan for the org launch and Getting Started wizard
Restores two commits dropped by a concurrent 'git reset --mixed origin/main' in this shared checkout; the files themselves survived in the working tree.
Record that Organization.YEAR_EST is optional and may be cleared
The column was always nullable and both server paths already handled null — CreateOrganizationPayloadParser maps an empty or unparseable value to null, and patc...
Plans for BL2 (the KAMO_NATIVE invoice) and SW8 (in-home contract compliance)
Check in the useUserInfo shared-store handoff
The "no .md in repos" rule is retired. This handoff doc had been kept local-only; it belongs next to the code it describes.
The FreeSWITCH crash was mod_kazoo's default config, not the event profile
The stub kazoo.conf.xml 2600Hz ship has no definitions, event-handlers or fetch-handlers sections. mod_kazoo says as much and then faults in its own config thre...
Record four more KamoPBX bring-up traps
- Community mod_kazoo (FreeSWITCH v1.10.11) connects to ecallmgr, reports "Connected", and then never answers a gen_server:call. Resolved by taking 2600Hz's...
The bug-report association holds video too
SYSTEM_BUG_SCREENSHOT now carries screen recordings alongside screenshots. The constant keeps its name and its id — id 17 is written into assoc_id on every row ...
The Traefik per-IP limit will 429 a QHIN invisibly
Comment only, in the file somebody opens when a partner complains. Traefik rate-limits per source IP across the whole api.* host, and a QHIN sits behind a sing...
Resolve the Kamailio question — SIP registration works end to end
Section 16 recommended a purpose-built config on stock Kamailio and recorded that "2600hz/kamailio does not exist". Both are corrected by evidence. Two further...
Close out SW6b
Eight departures. The one that mattered was in SW6a: PUT /{uid} accepted totals and sign-off verbatim, which made both of this plan's central rules decorative u...
Record what is running and the traps that cost a build each
Nine failure modes discovered the hard way, each of which would otherwise be rediscovered: the gitignored vendor tree, make re-fetching over it, ripgrep honouri...
Say why the transaction guard stops at ehr/
The two rules generalise and both shapes exist elsewhere in this service, so the obvious next move is to widen the scan — and doing that would fail the build on...
Say why the overload's @Transactional is inert on the afterCommit path
Prompted by a peer session finding a @Transactional(REQUIRES_NEW) Spring never advised — protected, and self-invoked, so the record of a failed query rolled bac...
Bootstrap script and operational README
bootstrap.sh creates the master account, promotes it to reseller and writes the non-secret platform configuration. Idempotent: a second run detects the existing...
Plan SW6b, making the six tabs persist
Labour and parts become ServiceJobLine rows on the job, not ServiceLineItem rows: OrderLineItem.order is optional=false, so a ServiceLineItem cannot exist witho...
2600Hz ships a patched Kamailio (spec 16)
kazoo-configs-kamailio does not run on stock Kamailio. bflags and import_files are both absent from kamailio/kamailio's own src/core/cfg.lex, and both are rejec...
The NAT is in place; a closed port means no listener
The router forwards for 5060/5061 TCP+UDP and 20001-29999/UDP to 192.168.4.36 are confirmed. My gate reported PHASE 0 BLOCKED against them while Kamailio was cr...
Close out SW6a
Nine departures. The plan's Spring claim was measured false, its sketched test was near-tautological, and its ServiceTrade-labels-are-new claim was wrong — ther...
Stop telling implementers to run git commit --allow-empty
--allow-empty PERMITS an empty result, it does not force one. With no pathspec it still commits the index, and these checkouts always have another session's wor...
Stop telling implementers to run git commit --allow-empty
--allow-empty PERMITS an empty result, it does not force one. With no pathspec it still commits the index, and these checkouts always have another session's wor...
Correct four SW6a claims, one measured false
A plain @Autowired List of an interface with no implementations does NOT resolve to an empty list — it throws UnsatisfiedDependencyException. Measured, not reas...
Correct three SW6a claims, one of them measured false
An earlier draft said a plain @Autowired List of an interface with no implementations resolves to an empty list. It throws UnsatisfiedDependencyException — meas...
FreePBX is deprecated (Decision 4 revised)
No migration and no permanent coexistence. KamoPBX stays on k3m1 whose host netns is empty, so it needs none of FreePBX's ports and no shutdown is required. Des...
Plan SW6a, and split SW6 into three
The spec calls SW6 'wire the finished UI', which assumed a backend existed to wire to. ServiceJob, ServiceVisit and ServiceLineItem's new columns have zero runt...
KamoPBX implementation plans (programme + 9 phases)
Decomposed into one plan per phase; a single plan would not produce working software until the end. Full bite-sized TDD detail: Phase 0 infrastructure gate ...
Record KamoPBX decisions — KAZOO confirmed, k3m1 placement, ACDc, Tier 3 rebrand
Six open questions answered: 1. KAZOO is the route; hardware owned, so cost framing removed entirely. 2. One node/cluster now, three later — CouchDB q=8 from da...
Close out SW5
Six departures. The sharpest: the task-book proxy could not be copied from the quotes proxy, which exports PATCH and no PUT — a verbatim copy would have made ev...
BaseLosController's unauthorized()/forbidden() do exist
A task brief told an implementer those helpers were invented and did not exist. requireOrgId genuinely does not; those two do, declared protected static on Base...
Record the enum-ordering trap the PBX rollout hit
Seeding a catalog row whose pricing_model is a new enum value makes that row unreadable to any service still on an older shared-lib, and getCatalog loads every ...
Restore SW4's close-out, lost to a stale working-tree edit
The previous commit edited the on-disk copy of this plan, which predated the Shipped section — that section was appended to a scratchpad copy and landed from th...
Applying DDL opens a 40001 window — watch it, do not restart
Bumping a catalog version leaves pooled JDBC connections holding the old one and the next query through each fails SQLState 40001, which Hibernate does not retr...
Close out SW4
Nine departures. The two that matter most: this plan's own Self-Review asserted a type was consistent across three places, and it was consistent and wrong; and ...
QuoteConversionResult.orderUid is a String, not a UUID
Order extends BaseEntity, whose id is a Long — only Quote, QuoteOption and QuoteLineItem extend BaseUuidEntity. The plan declared UUID and its own Self-Review a...
SW4's dictionary keys land in the dictionary repo
Task 6a's file list named kamo-internal/messages/en.json, which is gitignored and cannot be committed. The step's prose was right; the list was not.
Plan SW5, the flat-rate task book
The spec's premise that no line carries a labour duration went stale hours ago — SW3 landed labourMinutes and taskCode on ServiceLineItem, and the javadoc on ta...
Plan per-mailbox billing and the personal-mailbox backend
Plans B and C of 3. Self-review closed five gaps: nothing set mail_cost_mode, nothing server-side stopped a billing group buying mail add-ons, the invoice mailb...
Correct the spec — StorageAutoExpandSweep already exists
The spec claimed no server-driven-quantity reconciler existed to reuse and listed the storage auto-expand columns as dead. Both false: the sweep reads them nigh...
Design per-mailbox e-mail billing and add-on gating
Bills e-mail by the mailbox rather than the seat, gates provider choice on the add-on that covers it, and attributes each mailbox to the billing group that shou...
Define SW4's behaviour for a market-less quote
Task 1 made create() read marketUid but did not backfill, so every quote that exists today still has a null market. The converter must fall back to PurchaseLine...
SW4's billing choice is per-org configuration
Owner's call, and the right one: a maintenance contractor bills each period, a capital-equipment installer bills the term up front. Either hard-coded choice cha...
Plan SW4, quote to order conversion
Five defects, not the spec's three. The converter deliberately does NOT mint a Commitment: processOrderPaid returns immediately when one exists, so hand-creatin...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
