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...
Record what the chat switcher column left undone
Ordered by what would hurt most if left alone. The first entry is the one worth from MediaService's, which was not looked at — five of the switcher's six bucket...
Close out SW3
Thirteen departures from plan. The two that mattered most: OrderLineItem .discountType should never have been a String, and exporting the DDL before applying it...
Correct SW3's ServiceJob imports and pin the PROCUREMENT trap
Task 2 imported dao.beans.account.Account and dao.beans.organization .Organization. The real packages are accounts and orgs — it would not have compiled. Task ...
Correct the SW3 plan's policy-template claim
Task 6 pointed at RetailInventoryPolicy as the implemented member of the policy family to copy an injection shape from. It is never instantiated and never injec...
Plan SW3, the Service Work domain core
ServiceJob 1..N ServiceVisit as a sibling of FulfillmentOrder, a filled ServiceLineItem, the four classification axes, and a status machine that throws instead ...
Close out SW2
Four tasks, five departures from plan. The sharpest: the plan's own restrictionMask snippet filtered out null dayOfWeek, which means 'every day' — it would have...
Correct two errors in the SW2 plan
The rsync recipe used a bare 'rsync -a', which preserves mtimes — a file restored to an earlier version arrives older than the .class already compiled from a la...
Plan SW2, the three calendar repairs
Research corrected the spec on one point: recurrence is not dead at both ends. The UI renders on the calendar page today and silently discards what the member e...
Notification-spine follow-ups, triaged
Deferred items from the 33-task plan, all raised by review and all non-blocking. The whole-branch review's four must-fix findings were fixed and are not listed....
Take the softphone measurements instead of waiting for them
38 calls in the entire history of PHONE_CALL_LOG, 26 in the last 30 days. The drop-then-redial fingerprint finds 4 pairs, all provisioning test calls from April...
Plan Service Work's first rights and the commerce permission gap
Corrects two spec assumptions against real code: no RoleRightType uses **************** (all 36 commerce rights use POS, and the editors filter on exact equalit...
Mark the line window executed
All eight tasks shipped across four repos, with the four deliberate deviations recorded — most importantly that Task 6's call surface was written fresh rather t...
Keep the decision record — 18 rulings and what each costs if wrong
The plan records what shipped; this records why it differs from the plan. Three rulings were themselves corrected by a later review (the Stripe write count went...
The KamoDesktop link is single-use now
The comment claimed a reload re-submits ?data= and restores the session. It no longer does: the link is spent the moment the tab opens it, so it is worthless af...
Stop the plan instructing the money-path bug it was corrected on
Task 8 Step 4 still told the reader to key update/cancel/detach/del with "the current intent in the key". That is the Critical defect the final review reversed:...
Answer the softphone spec's biggest open question
Verified live on the cluster: every FreePBX AOR is max_contacts=1 with remove_existing=yes. That value was set nowhere in any Kamo repo, which is why it had gon...
Mark the softphone guardrails plan executed
Real commit SHAs in place of the placeholder, and 47 steps ticked. A finished plan showing all-unchecked boxes misreads as abandoned work.
Implementation plans for the softphone line window
Two plans, because the spec covers two subsystems and the first ships working software on its own. The guardrails plan is seven tasks that need no new browsing...
Design the softphone line window
A call cannot be moved into a window after it starts — an RTCPeerConnection and its MediaStream are not transferable between browsing contexts, and there is no ...
Commit the Dispatch/Service Work program design and its evidence corpus
Both program specs and all 56 research files were untracked and existed only on one disk, while HANDOFF.md tells the next session to read them first. Also reco...
Plan webhook hardening and idempotency across BillingService, shared-library and APIService
Ten tasks, TDD throughout, with the severity restated to what was actually verified: the Stripe fail-open is latent (the secret is present in prod, 38 bytes) an...
Implementation plan for quiet hexheads and the notification spine
33 tasks across five phases whose order is load-bearing: the schema must be run before any service maps a column, the library published before the services buil...
Design for quiet hexheads and the per-surface notification spine
A minimized chat window re-opens itself on every arriving message. The hexhead should absorb it instead — count, thump, stay put — and only a conversation with ...
Design the website brand scan
Where the /network/create Website field turns into logo, colour and background suggestions on the three branding steps. Records two things that are easy to get...
Correct what the KamoDesktop SSO token's lifetime actually is
The comment called the link "short-lived, single-use" and "5-minute", which is what caused the token expiry to be set as if it were a URL redemption window. It ...
Record that Java field order does not control DDL key order
The composite-key assertion passed while ddl-auto actually built PRIMARY KEY (logical_id, resource_type, tenant_id) — Hibernate emits @EmbeddedId columns ALPHAB...
Je, unaona nini kuhusu usafiri?
Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.