One federated platform behind a single RiverSync ID: customers monitor their converged micro data centers, partners service them under maintenance agreements, RiverSync users run device operations and the business, and RiverSync field engineers execute on-site service.
The requirements split in two: this Product Requirement Document (SPEC-PRD) plus the cross-cutting Federation and Maintenance specs define the platform-wide model; the App requirements set (SPEC-APP) carries one document per app, each inheriting the platform. The data model (SPEC-ERD), Domain-Driven Design (SPEC-DDD) and process workflows (SPEC-PWF) are derived from them. On any conflict, the platform wins — log the discrepancy in both revision histories when found.
| Document | Id | Status |
|---|---|---|
| Product requirements — SPEC-PRD | ||
| Platform — this document | SPEC-PRD | v0.32 · living |
| Federation — identity, roles & access across all six apps | SPEC-PRD-FED | v0.4 · living |
| Maintenance — the per-device maintenance agreement product across its surfaces | SPEC-PRD-MNT | v0.3 · draft |
| App requirements — SPEC-APP (one per app, inherits the platform) | ||
| App requirements master — the set index & inheritance rules | SPEC-APP | v0.1 · living |
| Account — org & identity management per tenant | SPEC-APP-ACC | v0.6 · actively prototyped |
| Portal — customer device monitoring | SPEC-APP-PTL | v0.4 · draft |
| Partners — partner service workspace | SPEC-APP-PAR | v0.2 · draft |
| Pipeline — RiverSync sales | SPEC-APP-PIP | v0.2 · draft |
| Admin — RiverSync platform console | SPEC-APP-ADM | v0.1 · draft |
| Field — RiverSync on-site service (mobile/tablet) | SPEC-APP-FLD | v0.1 · prototyped |
| Derived specifications | ||
| Data model — entity relationships — derived structural spec: master + app drill-downs under erd/ | SPEC-ERD | v0.13 · derived |
| Domain-Driven Design — domain context — derived: bounded contexts & services, BFFs + gateway, endpoint & event catalog under domain/ | SPEC-DDD | v0.8 · derived |
| Data workflows — entity lifecycle — derived: create/update/retire/archive state machines per bounded context under dwf/ | SPEC-DWF | v0.1 · derived |
| Process workflows — behaviour — derived: swimlane processes (actors, steps, events) under pwf/ | SPEC-PWF | v0.8 · derived |
Six web apps share one shell and one session. Each carries a canonical badge identity (hue, icon, label) defined in DS v2.
| App | Domain | Audience | Purpose |
|---|---|---|---|
| Account | account.riversync.com | Customer & partner orgs | Organization management — users, departments, sites, roles, partners, billing |
| Portal | portal.riversync.com | Customer orgs | Device monitoring — telemetry, health, alerts, agreements, service |
| Partners | partner.riversync.com | Partner orgs | Service workload across covered customers |
| Pipeline | pipeline.riversync.com | RiverSync users | Quotes and sales pipeline |
| Admin | admin.riversync.com | RiverSync users | Tenants, provisioning, plans, platform health |
| Field | field.riversync.com | RiverSync users (engineers) | On-site service — dispatch, device check-in, preventive maintenance, incident resolution, sign-off (mobile/tablet, offline) |
Three tenant types: riversync (RiverSync users) · customer · partner.
One organization can hold the partner and customer roles at once (e.g. Nera services customer devices and runs RiverSync units of their own).
The riversync tenant manages no organization — unlike customer and partner tenants, it has no org profile, users-and-sites administration of its own in the Account portal. It carries the tenant's user accounts only; staff work in the Admin and Operations consoles and act inside customer tenants via audited view-as sessions.
Foundation: identity is built on Microsoft ASP.NET Core Identity 10 (Entity Framework Core stores, Guid keys) — accounts, roles, the user-role join, external logins, claims and tokens are the framework's AspNet* tables; RiverSync extends them with tenancy, the per-application role grant and the permission model (never replaces them). The base↔extension mapping is SPEC-PRD-FED §9 (FED-17); the schema is the master ERD (DM-32, DM-33).
A user account belongs to exactly one tenant — never several.
One email address may hold a separate account per tenant. Sign-in offers an account chooser when an email resolves to more than one account.
Identity providers: Google · Microsoft · LinkedIn · email & password. Org-level SSO: Microsoft Entra ID.
Sessions are federated — one RiverSync ID moves between every app the account is entitled to without re-authentication.
Every user holds a role per application (e.g. Account: Member, Portal: Administrator).
Partner and riversync apps are membership-gated: Partners requires a partner-tenant account; Pipeline, Admin and Field require a riversync-tenant account (Field additionally to the engineer role). Gated apps never appear in the product switcher of an unentitled account.
Access surfaces: User detail → Application access · Users list "Apps" column · Roles page (role definitions) · Permissions page (per-application matrix).
The riversync tenant's Account portal carries no organization management — no organization overview, departments, sites, partners, billing or invoices (TEN-3). Its users are managed like any tenant's — the standard Users, Roles and Permissions surfaces behind the tenant's overview landing; user accounts carry nothing staff-special.
Default role set of the riversync tenant: admin · support · sales · accounting · engineer — ordinary roles in the standard role model, owned by the tenant exactly as customer and partner role sets are.
Removed in v0.13. There is no separate multi-role riversync mechanic — riversync accounts follow the standard model (AUTH-1): one role per application. admin is the tenant's fixed full-permission role, the customer-Owner analogue.
Roles are configurable on the standard Roles and Permissions pages — the same surfaces every tenant uses — over the riversync tenant's own permission catalog (tenants & provisioning, support & service, sales, billing & accounting, device operations, user management). The admin column is fixed: always every permission.
A customer can be linked to many partners at once. A link exists because that partner sold the customer devices or holds an active maintenance agreement on at least one of them. Agreements are per device — a partner link aggregates every device that partner covers.
Each device carries its own agreement period. Every device renews on its own schedule; at renewal the customer can move that device to a different partner, whose access starts with the new period.
The customer controls each partner's access scope — telemetry, service tickets, sites & visit info, invoices & agreements, optionally limited by region — and can change or revoke it at any time, effective immediately.
Every partner action lands in the customer's audit log, attributed to the partner organization.
Maintenance agreement tiers: Silver (8×5, next business day) · Gold (24×7, next day). Reseller program tiers (reseller subtype only — see PRT-14…17): Authorized · Gold · Platinum.
RiverSync is the manufacturer and platform owner, never a partner. Factory telemetry and engineer dispatch are on by default for every device — RiverSync does not appear in a customer's partner list and this access is not customer-managed, though every action is still audited.
The customer manages each link through a partner detail page — Devices (every covered device with its own agreement, tier and renewal), Access (scope controls) and Activity (the partner's audited actions). The partner list itself stays light: organization, partner tier, scope, status.
No self-links. An organization never appears in its own partner list — a tenant holding both partner and customer roles (e.g. Nera) keeps them separate, and a partner link can only exist between two different tenants.
Partner channel — distributors & resellers. Partner organizations split into two commercial subtypes. The service-agreement model above (PRT-1…8) is unchanged and independent — either subtype can hold maintenance agreements.
Every partner organization is exactly one subtype, platform-wide: distributor or reseller. The subtype lives on the partner profile beside the program tier and is set by RiverSync users — never self-selected, never both at once.
Resellers source through distributors under registered distribution agreements. The reseller ↔ distributor relationship must be registered on the platform to count; a reseller can hold several at once (e.g. per region or product line), and only distributors holding an active agreement are selectable when the reseller registers a deal. Never between the same organization.
The channel is decided per deal. A reseller-registered deal routes through exactly one distributor — chosen by the reseller from its registered distributors, or allocated by RiverSync — or goes direct to RiverSync under a per-deal exception granted by staff case by case (no standing direct flag per partner). RiverSync can overrule and reallocate any deal to another distributor as it sees fit; every channel change is audited.
A partner's other tenant roles are never disclosed to a customer. When a customer views a linked partner — partner list, partner detail, audit log, invitations — the surface shows only the partnership itself: organization name, program tier, access scope, status, covered devices and the partner's audited actions. The fact that the same organization also holds a customer (or any other) tenant role — as Nera does — is never surfaced to the customer. Each tenant relationship is visible only inside its own context: dual-role membership is disclosed only to the organization's own members and to RiverSync.
A distributor sees the whole pipeline of the resellers it handles — every registered deal and its stage — but deal value and quote details are masked on deals not channeled through it (direct deals and deals routed via another distributor). Partners get this funnel inside the Partners app; the Pipeline app stays staff-only (AUTH-2) and shows the full channel chain on every deal.
Reseller program tiers. The program ladder (PRT-5) is a reseller construct only; it gates what a reseller can do, qualifies on a balanced scorecard, and is granted by RiverSync. A distributor carries no tier.
The program tier is a reseller-only attribute. Authorized · Gold · Platinum (ordered Authorized < Gold < Platinum) live on the partner profile and apply only when the subtype is reseller. A distributor carries no tier — it is a distinct partnership RiverSync grants directly and reviews on channel performance, not a rank on this ladder. Tier is RiverSync-set, never self-selected.
A reseller's tier gates its capabilities in the Partners app, resolved by one tier→entitlements map: concurrent registered-deal cap (Authorized 5 · Gold 20 · Platinum unlimited), pricing level on quotes (list · −8% · −15%), deal-registration protection window (30 · 60 · 90 days), RiverSync lead sharing (Gold and above), direct-from-RiverSync exception eligibility (none · by request · Platinum streamlined), co-marketing (assets · MDF · full) and early / beta hardware access (Platinum). The channel-and-agreement model (PRT-1…12) is unaffected by tier.
Tier qualification is a balanced scorecard RiverSync reviews and grants. Three pillars — certifications (certified engineers on staff), revenue (trailing-12-month closed-deal volume) and service quality (customer satisfaction, on-time SLA). A reseller is eligible only when every pillar meets the next level's thresholds; RiverSync reviews eligible resellers at a quarterly channel review and grants the tier, recorded as a tier-review with a grant · hold · downgrade decision. The reseller sees its progress only — it never sets its own level; benefits unlock the day the tier is granted, and the tier never changes without a recorded review.
RiverSync may convert a reseller into a distributor — a manual, RiverSync-initiated subtype change, typically for a strong Platinum reseller with the logistics, volume and regional coverage to supply others. On conversion the organization's program tier is cleared (a distributor holds no tier, PRT-14), its open reseller-attributed deals are reconciled under RiverSync supervision, and RiverSync registers the distribution agreements (PRT-10) that make it a distributor. The change is audited and never self-initiated; the organization keeps any separate customer-tenant role it holds.
The device model is a catalogued product, not a label. Every RiverSync device is one model in a product family; the model determines the shape of the telemetry the device emits. The nevera line adds a configure-to-order dimension: a model names the chassis, and the unit is configured from a catalog of modules under compatibility and capacity rules (PRO-7…11). This section makes device → product → telemetry structure an explicit chain. Consolidated cross-app view: SPEC-PRD-PRO (Products PRD). Detail: SPEC-ERD-PRO, the classification workflow; realizes Initiative 015 + discovery epics 078–080.
RiverSync products are organized into families, each with a product class: frigo and koelkast are edge micro data centers; nevera is the modular micro data center line — a separate, newer line. A family is a product line, not a single unit.
Each family holds one or more models — Frigo 20 · Frigo 30, Koelkast 20 · Koelkast 30, nevera-30 · nevera-40. The model is a catalog entity, not a free-text field — every device and every quote line references a model, so a device's product identity is unambiguous and reportable. For frigo / koelkast the model number is the unit's usable rack height (20U / 30U) with paired fixed capacity; for nevera the model names the chassis form factor (30U / 40U) and the makeup is the configuration beneath it (PRO-7).
Devices across the fleet emit telemetry in several distinct shapes. The platform maintains a telemetry-schema registry of these shapes: refrigeration is the established 60-field schema (family #1); the others were discovered from the live fleet (a fixed-width 15-digit form, a dashed four-segment form, and an unknown bucket). Each product model declares the schema family it speaks.
Every device is classified: its IoT-Hub identity resolves to exactly one schema family + version, with a confidence score. This resolution is the single join that makes a device's telemetry readable and storable in the right shape — the model declares the expected schema, the classification is ground truth.
Classification never guesses silently. A low-confidence match goes to a needs-review queue for a RiverSync user to confirm or correct; an unrecognized shape is quarantined, not dropped — so no device's data is lost just because its family is not yet modeled.
Telemetry is stored per family in a typed store with a JSONB escape hatch for rare fields; the time-series data lives outside the relational model (it shares the PTL-1 boundary). A new family or a schema version is additive — registered, never destructive to existing data.
The nevera line is configure-to-order. A unit is a chassis (30U or 40U) populated with modules chosen from a compatible catalog. The catalog models, beneath the model, a module catalog and configuration rules, and a device records its as-built module loadout, not only its model. frigo and koelkast remain fixed-configuration models; configurability is a nevera-introduced capability of the catalog.
Modules are catalog entities. Two kinds: controller modules — CM1V (master, required) and slaves CS1V · CS1F · CS2F · CSVF, each with a compressor mix and a rack constraint — and cooling modules — six SKUs across inverter (2500V · 3500V) and fixed (1500F · 2000F · 2500F · 3500F), each with rated capacity (W / BTU), coils and power draw. Every module is a priced, serial-tracked catalog item; quote lines and the device loadout reference its SKU, never free text.
Configuration rules are catalogued and enforced at quote time and at provisioning: a master controller (CM1V) is required; per-chassis cooling-module ceiling (30U: max 2; 40U: max 3); redundancy class (30U: N+1; 40U: N+2); max 2 inverter modules either chassis; CS2F and CSVF are 40U-only; capacity envelope base 2,500 W, max 5,000 W (30U) / 7,500 W (40U) — the RiverSync-confirmed system maxima. An invalid combination is rejected, not silently accepted.
Pay-as-you-grow: the loadout is mutable across the unit's life. Cooling and controller modules are added or swapped in the field as demand grows, within the chassis ceiling. The platform tracks installed vs maximum capacity (headroom); every loadout change is an audited event that may originate as a Pipeline expansion quote and complete as a Field install visit. The chassis (model) is fixed for the unit's life; the configuration is not.
Telemetry reflects the loadout. A nevera is a multi-controller system — each cooling module has its own controller, a master (CM1V) synchronizing slaves — so the telemetry a device emits scales with its installed modules (N controllers under one device identity). Classification (PRO-4) still resolves the device to one schema family + version; the modular composition is read within that family, not as a separate family.
frigo and koelkast are fixed-configuration edge micro data centers. Each unit is a single sealed enclosure whose cooling capacity is set by its model — no module catalog, no loadout, no field expansion. They are the non-modular counterpoint to nevera (PRO-7): a device record carries only model + serial, never an installed-module list.
Model numbers encode usable rack height; the family axis is the compressor. Frigo / Koelkast 20 = 20U · 2,500 W, 30 = 30U · 3,500 W — same capacity points in both families. frigo and koelkast differ by compressor type: frigo = fixed-speed screw, koelkast = inverter variable-speed (load-modulating). Catalog stores UsableRackUnits, CoolingCapacityWatts, CompressorType per model.
Both edge families speak the refrigeration telemetry schema (family #1, the established 60-field shape — PRO-3), each a single-controller system. The koelkast inverter reports variable compressor speed / modulation the frigo fixed-speed screw does not exercise — within the refrigeration family, never a separate family.
Service is keyed to the model and differs by compressor. With no loadout to track, a frigo / koelkast Field visit is a service visit, never a configuration-change visit (contrast PRO-10); wear parts and compressor-service procedures differ between the fixed-speed screw (frigo) and inverter (koelkast) lines.
Only 2nd-generation frigo / koelkast models are supported online. Frigo 20 / 30 and Koelkast 20 / 30 are the supported catalog; the 1st-generation capacity-named units (frigo 2500 / 3500, koelkast 4500 / 5500) are legacy and unsupported — they do not onboard, classify, sell or report on the platform (a 1st-generation identity is out of scope, not a quarantine case).
The funnel begins before the deal. A centralized contact graph of the people and companies we deal with feeds a lead, which we qualify into an opportunity and confirm into the deal that §5's channel and the provisioning saga already carry. This section models the prospect-to-deal front of the funnel — the CRM. Detail: SPEC-DDD-SAL, SPEC-ERD-PIP; surfaced in SPEC-APP-PIP (RiverSync) and SPEC-APP-PAR (referral & shared leads).
Centralized contact management — the relationship graph. We keep one record of every person and company we deal with: a Contact of kind organization (a legal entity) or person (a human). Organizations form a group-of-companies hierarchy (parent ⇄ subsidiaries); a person has an employer organization and a manager (the reporting line); and a general relationship graph captures the wider network (influences, introduced-by, advises). The graph is queryable top-down so we can deep-dive a prospect and drive the sale.
The contact graph is distinct from tenancy. It records prospects and the wider buying network — parties that need no login and are not billed — and is never merged with the operational Tenant / Organization / ApplicationUser model. A contact bridges to that model only on conversion: an organization contact may link to a customer Tenant, a person contact to a user account. An unconverted prospect lives wholly in the graph.
The lead is the single inbound front door. Every net-new inquiry enters as a Lead raised off a contact, owned by a RiverSync sales user; we qualify it, then either convert it (SAL-5) or disqualify it. A renewal or direct opportunity RiverSync opens itself is the only exception.
Leads carry their source. One of six: online registration form, telephone, showroom walk-in, trade show, social network, or partner referral. Trade-show and social leads may attach to a marketing Campaign for attribution; deeper marketing automation is out of scope — we model attribution, not a marketing suite.
A lead converts to an opportunity, not straight to a deal. Conversion resolves the customer — matching an existing customer organization or creating one (joining hands with customer onboarding) — and opens an Opportunity. It is one-way and recorded; the lead is never re-opened.
The opportunity is where the deal is shaped. It holds one or more variants — quantified configurations (models, quantities, maintenance tier) we compare — and the customer-validated variant is confirmed into a Deal, which carries §5's channel and proceeds to quote and close. The deal is the committed, quotable commitment; the exploratory, multi-option work lives on the opportunity.
RiverSync can share a lead or opportunity to a partner. Assigning it hands follow-up to that partner — gated by the partner's program tier (lead sharing, PRT-15); the partner works it in the Partners app and, on a win, registers the deal through its channel (PRT-11). This reuses the existing tier benefit, not a new mechanism.
Every touch is logged on one activity timeline. Emails, calls, visits, surveys, meetings and notes are logged as activities against the contact and, where relevant, the funnel stage. A contact's timeline blends these human-logged touches with the journey's own milestones (lead captured … deal won) into one navigable, bird's-eye history — distinct from the immutable audit trail and from support messaging.
One unified communications inbox feeds the funnel. Every inbound and outbound message we exchange with a contact — across the web contact form, email (sales@riversync.com), and the social channels LINE, Instagram, Facebook and LinkedIn, plus logged phone calls — is centralized in one threaded inbox, organized into the folders Inbox · Draft · Sent · Archived · Junk · Deleted. A conversation is one thread on one channel, anchored to the contact it came from and optionally to a funnel record (lead / opportunity / deal / quote); sending or receiving a message also writes an activity (SAL-8) so the blended timeline stays the single bird's-eye history. This is the sales communications layer — distinct from customer↔support messaging — and lets a sales user move straight from a message to the relationship and its activity.
Used consistently across every prototype.
| Organization | Tenant roles | Agreement example |
|---|---|---|
| Sanyodenki (Thailand) Co., Ltd.sanyodenki.co.th · THB invoicing | Customer | 24 devices across Thai regions |
| Nera (Thailand) Ltd. | Partner (Gold · reseller) + customer | Partner of record — 18 devices, each under its own agreement (Gold/Silver mix); registers deals through Huawei (Southern) or VST ECS (Central), occasional staff-approved direct deals |
| Huawei Technologies (Thailand) Co., Ltd. | Partner (distributor) | Takes over 6 Southern Thailand devices from Nera at their renewals (Silver agreements); distributes Nera's Southern-region deals |
| VST ECS (Thailand) Co., Ltd. | Partner (distributor) | Nera's second distribution agreement — Central-region deals; no service agreements |
| MegaWarehouse (Thailand) Co., Ltd.megawarehouse.co.th | Partner (distributor) | Pure distribution — Nera's Northern-region channel; no service agreements; the distributor persona in the Account prototype's Partner-type tweak |
| RiverSync Co., Ltd. | riversync (RiverSync users) | Platform owner — full access by default; never a partner link, no organization of its own |
How records are created, retired and retained — the platform-wide invariants behind the data-workflow set (SPEC-DWF). Each entity's full state machine, with its events, lives there; these are the rules every lifecycle obeys.
Soft-delete by default. Audited business records are retired by a terminal status (closed · expired · decommissioned · cleared · lost) and retained for audit and history; hard delete is reserved for non-audited config and the audit trail's retention purge, and is blocked while a row is still referenced.
Every state change is an audited, event-bearing transition. Create, update and retire each emit a past-tense domain event the audit trail consumes; a terminal state may still reopen or renew through an explicit, recorded transition — never a silent edit of history.
Write authority follows ownership. Derived records (the partner link and its access grant) are written only by their owning service from events, never by API; offline field captures are insert-only from the Field app and immutable once a visit is signed off.
Reference and config catalogs are curated, not destructively deleted. Type catalogs, the maintenance-tier and product catalogs, plans and the permission catalog are admin-managed; a row still in use is re-pointed or deactivated rather than deleted, and cross-boundary cleanup is event-driven, never cascaded.
| Version | Date | Changes |
|---|---|---|
| 0.1 | Jun 2026 | Tenancy types, five applications, per-app roles, membership gating |
| 0.2 | 12 Jun 2026 | One account ↔ one tenant; account chooser at sign-in; riversync tenant manages no organization |
| 0.3 | 12 Jun 2026 | Partner links & coverage: agreement-driven links, coverage moves at renewal, customer-controlled scope |
| 0.4 | 12 Jun 2026 | RiverSync is platform owner, not a partner — full default access, removed from partner lists; partner list shows tier only |
| 0.5 | 12 Jun 2026 | Maintenance agreements are per device; partner detail page with Devices · Access · Activity tabs |
| 0.6 | 12 Jun 2026 | riversync-tenant Account portal: staff users only (no org pages); staff roles admin · support · sales · accounting · engineer, multi-role, admin supersedes |
| 0.7 | 12 Jun 2026 | Staff Roles & Permissions surface — configurable permission matrix per staff role, admin fixed |
| 0.8 | 12 Jun 2026 | PRD set established: per-app PRDs (Account · Portal · Partners · Pipeline · Admin) under prd/, cross-linked; governance — master wins on conflict |
| 0.9 | 12 Jun 2026 | PRT-8: no self-links — an organization never appears in its own partner list |
| 0.10 | 12 Jun 2026 | SPEC-ERD added to the PRD set — derived entity-relationship spec (5 domains, DM-conditions); no requirement changes |
| Version | Date | Changes |
|---|---|---|
| 0.11 | 12 Jun 2026 | Partner channel model — PRT-9…12: subtypes (distributor · reseller, staff-set), registered distribution agreements (several per reseller), per-deal channel with RiverSync overrule + case-by-case direct exceptions, masked distributor funnel visibility; VST ECS added to reference organizations; SPEC-DDD (domain & services set) joined the PRD set |
| 0.12 | 13 Jun 2026 | Vocabulary — "fleet" → "devices" platform-wide: Portal is device monitoring, staff permission domain renamed device operations (AUTH-7), reference-org wording updated; SPEC-ERD v0.7 and SPEC-DDD v0.3 follow (Devices & partner coverage domain · Devices & telemetry service, /devices prefix); no model or requirement-structure changes |
| 0.13 | 13 Jun 2026 | riversync-tenant users are managed like any tenant's — AUTH-4…7 reworked: standard Users · Roles · Permissions surfaces, the five roles become ordinary configurable roles (admin fixed-full, the Owner analogue), the multi-role union mechanic retired (AUTH-6 removed); "staff management" permission domain renamed user management. SPEC-ERD v0.8 and SPEC-DDD v0.4 follow (StaffRoleGrant dropped) |
| 0.14 | 13 Jun 2026 | Reference data — MegaWarehouse (Thailand) Co., Ltd. joins as a Platinum · distributor partner tenant (Nera's Northern-region distribution channel, no service coverage); the Account prototype's Tweaks gain a Partner type switch — reseller (Nera) · distributor (MegaWarehouse) |
| 0.15 | 13 Jun 2026 | SPEC-PRD-FED (Federation) joins the PRD set — cross-app consolidation of identity, entitlement, roles, permissions, cross-tenant access and visibility mandates (FED-1…16) with the canonical demo persona set; elaborates TEN-/ID-/AUTH-/PRT- without changing them. SPEC-ERD v0.9 follows (FED traceability rows) |
| Version | Date | Changes |
|---|---|---|
| 0.17 | 13 Jun 2026 | PRT-13 — partner-role confidentiality: a customer never sees that a linked partner also holds a customer (or any other) tenant role; customer-facing partner surfaces show only the partnership. "Also a customer" badge removed from Customer Partner Detail; Federation visibility mandate + ERD DM-26 follow |
| 0.18 | 14 Jun 2026 | Field joins as the sixth app — field.riversync.com, RiverSync-only on-site service for field engineers (mobile/tablet, offline-first): dispatch, device check-in, preventive-maintenance runbooks, on-site incident resolution, parts, evidence and customer sign-off. Membership-gated to the engineer role (AUTH-2); new SPEC-APP-FLD (FLD-1…10). ERD follows (SPEC-ERD v0.12 — Visit extended + VisitTask/PartUsed/VisitEvidence/VisitSignoff/MaintenancePlan, DM-27…31), Domain follows (SPEC-DDD v0.5 — eighth service SVC-FLD, Visit moved Support → Field, SVC-14), Workflow follows (SPEC-PWF v0.5 — Field visit in Service operations); mobile prototype built |
| 0.16 | 13 Jun 2026 | Vocabulary — "staff" → user platform-wide: RiverSync-tenant accounts are users like any tenant’s. "RiverSync users" for the people, "RiverSync" as the adjective (console, only, -granted). Role-scope tokens become riversync:* (was staff:*); ERD fields ViewAsSession.RiverSyncUser · Deal.OwnerUser, and Application.Gating = open · partner · riversync. SPEC-ERD and SPEC-DDD follow; no requirement-structure changes. Customer site-location headcount and partner-org people keep the ordinary word |
| 0.19 | 14 Jun 2026 | Identity foundation named: ASP.NET Core Identity 10. §3 grounds accounts, roles, the user-role join, external logins, claims & tokens on the framework's seven AspNet* tables (Guid keys), extended not replaced; cross-references SPEC-PRD-FED §9 / FED-17. Cascades: SPEC-ERD v0.13 (ApplicationUser/ApplicationRole/ApplicationUserRole on IdentityUser/IdentityRole/IdentityUserRole<Guid>, UserLogin/UserClaim/UserToken/RoleClaim base tables, DM-32, DM-33), SPEC-PRD-FED v0.4, SPEC-DDD. No requirement-structure changes |
| 0.20 | 15 Jun 2026 | Coverage → Agreement domain context. "Agreement" is now the umbrella domain — the maintenance agreement is the agreement; coverage is the scope an agreement covers. §5 "Partner links & agreements"; entities Maintenance → MaintenanceAgreement, DeviceMaintenance → DeviceAgreement. Cascaded to SPEC-ERD v0.15, SPEC-DDD (SVC-AGR · /agreement), SPEC-PWF-AGR and the doc/app menus. No requirement-structure changes |
| 0.21 | 15 Jun 2026 | Account app menu Site Locations → Sites, and the backing entity SiteLocation → OrganizationSite (spelled-out naming — the customer's site facility). AUTH-4 and the Account navigation wording follow. Cascaded to SPEC-ERD v0.16, SPEC-DDD v0.9 / Federation Domain v0.3, SPEC-PWF v0.6, SPEC-APP-ACC v0.5 and SPEC-PRD-FED v0.5. No requirement-structure changes |
| 0.22 | 16 Jun 2026 | Entity OrganizationUnit → OrganizationDepartment (spelled-out, domain-context naming) — the customer's reporting-structure node, mirroring the Account app surface Departments. The EntityType catalog still labels each node (company · division · department · team). Cascaded to SPEC-ERD v0.17, SPEC-DDD (Federation catalog + structure routes → /structure/departments) and SPEC-APP-ACC v0.6. No requirement-structure or cardinality changes |
| 0.23 | 27 Jun 2026 | Products & devices section added (PRO-1…6) — the device model becomes a catalogued product. Families (frigo · koelkast · nevera, nevera a separate newer line), models as catalog entities referenced by every device and quote line, a telemetry-schema registry (refrigeration is family #1, the rest discovered from the live fleet), per-device classification (deviceId → family + version, confidence) with needs-review / quarantine, and per-family typed storage (time-series outside the relational model, PTL-1). New §6; Reference orgs → §7, Open questions → §8, Revision history → §9. Cascaded to SPEC-ERD v0.21 (ProductFamily · ProductModel · TelemetrySchemaFamily · DeviceSchemaAssignment, DM-35–38, Product Catalog drill-down SPEC-ERD-PRO), SPEC-DDD (Devices service owns the catalog + registry, SVC-15/16, new events), SPEC-PWF (Device classification workflow SPEC-PWF-DCL). Realizes Initiative 015 + epics 078–080. |
| 0.24 | 27 Jun 2026 | Authoritative product classification (PRO-1, PRO-2). Families carry a class — frigo & koelkast are edge micro data centers, nevera is the modular micro data center line; models set to frigo-20 · frigo-30 · koelkast-20 · koelkast-30 · nevera-30 · nevera-40 (replaces the earlier illustrative numbers). Cascaded to SPEC-ERD v0.22 (catalog hints, DM-35, Product Catalog v0.2). ⚠ frigo’s second model taken as frigo-30 pending confirmation (source listed “frigo-20” twice). |
| 0.25 | 27 Jun 2026 | Documentation taxonomy — PRD split into Platform + App, Domain → DDD. The requirements set is now two families: this Product Requirement Document (SPEC-PRD — master + Federation SPEC-PRD-FED + Maintenance SPEC-PRD-MNT) and App requirements (SPEC-APP — Account/Portal/Partners/Pipeline/Admin/Field, ids SPEC-APP-ACC … -FLD; was PRD-ACC …). The Domain & services set is renamed Domain-Driven Design (SPEC-DDD, was SPEC-DOM) to foreground bounded-context → app surfacing. Requirement-line prefixes (TEN-/ID-/AUTH-/PRT-/ACC-/PTL-/PAR-/PIP-/ADM-/FLD-/FED-) are unchanged; folders (docs/prd/, docs/domain/) and internal nav keys kept stable. One registry edit in docs-nav.js; cascaded to every doc header, footer and cross-reference. |
| 0.26 | 27 Jun 2026 | Data lifecycle requirements (LIF-1…4) + the SPEC-DWF data-workflow set. Added §8 Data lifecycle — soft-delete / retention, audited event-bearing transitions, ownership-bound write authority, curated reference catalogs. These ground the new Data workflows family (SPEC-DWF — master + eight bounded-context drill-downs mapping each entity lifecycle, create/update/retire/archive, to its events, DM/SVC rules and PWF processes). No model change; lifecycles trace to existing entities & rules. |
| 0.27 | 27 Jun 2026 | Products promoted to its own cross-cutting PRD. The §6 product & telemetry-taxonomy requirements (PRO-1…6) now also have a consolidated cross-app document, SPEC-PRD-PRO (Products PRD) — alongside Federation and Maintenance — adding the one-model-several-surfaces app touchpoints (Admin curates · Pipeline sells · Portal/Field read) and product-specific open questions. Master §6 stays canonical and now cross-references it; registered once in docs-nav.js (prd.products, related ↔ erd.products / domain.devices / workflow.deviceclassification). No requirement-structure change. |
| 0.28 | 27 Jun 2026 | nevera modular product model (PRO-7…11), from datasheet v3.0. §6 now models the nevera line as configure-to-order: a chassis (30U / 40U) populated with catalogued controller (CM1V master + CS1V/CS1F/CS2F/CSVF) and cooling (2500V/3500V/2500F/2000F/1500F · 1500F) modules under configuration rules (per-chassis module & inverter ceilings, N+1 / N+2 redundancy, 40U-only modules, capacity envelope), with a mutable, field-expandable loadout (pay-as-you-grow) and loadout-scaled telemetry. PRO-2 amended (nevera model = chassis form factor). Cross-app view SPEC-PRD-PRO v0.2 updated in lockstep; the SPEC-ERD-PRO / SVC-DVC module-entity cascade (ProductModule · ConfigurationRule · DeviceModuleLoadout) is logged ⚠ pending. Spec-sheet vs marketing capacity discrepancy flagged. |
| 0.29 | 27 Jun 2026 | frigo & koelkast edge lines documented (PRO-12…15). §6 now states the two edge micro data center lines as fixed-configuration sealed enclosures: capacity-named models (frigo 2500 / 3500, koelkast 4500 / 5500), single-controller refrigeration-schema telemetry, model-banded service — the non-modular counterpoint to nevera. PRO-2 amended to capacity naming; legacy -20 / -30 codes superseded (ERD/Portal sweep logged in SPEC-PRD-PRO v0.3 §8). No datasheet for these lines — spec envelope pending. Cross-app view SPEC-PRD-PRO v0.3 updated in lockstep. |
| 0.30 | 27 Jun 2026 | frigo & koelkast generation correction (PRO-13/14/15 revised, PRO-16 added). Supported models are the 2nd-generation Frigo 20 / 30 · Koelkast 20 / 30 (number = usable rack U: 20U·2,500 W, 30U·3,500 W); the family axis is the compressor (frigo fixed-speed screw · koelkast inverter variable-speed), not a capacity band. 1st-generation capacity-named units (2500/3500/4500/5500) are legacy & unsupported online (PRO-16). Reverts v0.29 capacity-naming; restores 20/30 as canonical (PRO-2 + ERD catalog). Cross-app view SPEC-PRD-PRO v0.4 in lockstep. |
| 0.31 | 27 Jun 2026 | nevera confirmed cooling maxima. System cooling max set to the RiverSync-confirmed figures — nevera-30 5,000 W (30U usable) · nevera-40 7,500 W (40U usable) — superseding the datasheet spec-sheet table (7,000 / 10,500 W); PRO-9 capacity envelope updated. Cross-app view SPEC-PRD-PRO v0.5 in lockstep; system-max-vs-module-sum reconciliation logged there. |
| 0.32 | 28 Jun 2026 | Reseller program tiers (PRT-14…17) — tier becomes a reseller-only, capability-gating, RiverSync-granted construct. PRT-14 scopes Authorized · Gold · Platinum to the reseller subtype only (a distributor carries no tier); PRT-15 makes tier gate Partners-app capability (deal cap, pricing −8/−15%, protection window, lead sharing, direct-exception eligibility, MDF, early access); PRT-16 defines the balanced qualification scorecard (certifications · revenue · service quality) reviewed and granted by RiverSync (the reseller sees progress only); PRT-17 defines the RiverSync-initiated reseller→distributor conversion (clears the tier, registers distribution agreements). PRT-5 amended. Distributor tiers retired in the reference orgs (Huawei/VST ECS/MegaWarehouse now plain distributors — supersedes the CLAUDE.md demo-data tags). Cascaded to SPEC-ERD (PartnerProfile gains TierGrantedAt · TierReviewState, new PartnerTierReview, DM-39…42), SPEC-DDD (Sales — tier registry/resolution + partner.tier-changed / partner.subtype-changed events), SPEC-DWF (PartnerProfile tier & subtype lifecycle), SPEC-PWF (Tier progression + Reseller→distributor conversion processes), SPEC-APP-PAR (PAR-8/9) and SPEC-APP-PIP (tier review/grant + conversion). Partners prototype gates the live UI by tier. |
| 0.33 | 28 Jun 2026 | Sales — contacts, leads, opportunities & the activity timeline (SAL-1…8), new §7. Models the CRM front of the funnel: a centralized Contact graph (organization · person; group/employer/manager hierarchies + ContactRelationship edges) kept distinct from tenancy with a conversion bridge (SAL-1/2); the Lead as the single inbound front door with six sources (online-form · telephone · showroom · trade-show · social · partner) (SAL-3/4); its conversion to an Opportunity whose variants are compared and one confirmed into a Deal (SAL-5/6); partner lead sharing reusing the tier benefit (SAL-7, PRT-15); and the blended Activity timeline (SAL-8). Reference orgs → §8, Data lifecycle → §9, Open questions → §10, Revision history → §11. New requirement prefix SAL-. Cascaded to SPEC-ERD (Contact · ContactRelationship · Campaign · Lead · Opportunity · OpportunityVariant · Activity + Deal.SourceOpportunity, DM-43…52, Pipeline ERD diagram), SPEC-DDD (Sales owns the CRM + lead/opportunity/activity, SVC-18, contact.* / lead.* / opportunity.* / activity.* events, /sales/contacts·leads·opportunities·activities routes), SPEC-APP-PIP (PIP-9…14) and SPEC-APP-PAR (PAR-10/11). SPEC-DWF / SPEC-PWF lifecycle + lead-to-opportunity process to follow. |
| 0.34 | 28 Jun 2026 | Unified sales communications inbox (SAL-9 added). One threaded inbox centralizing every contact touchpoint across web form · email (sales@riversync.com) · LINE · Instagram · Facebook · LinkedIn · phone, foldered Inbox · Draft · Sent · Archived · Junk · Deleted; a conversation is one channel thread anchored to a contact and optionally a funnel record, and each message also writes an Activity (SAL-8) so the blended timeline stays the single history. Distinct from customer↔support messaging. Cascaded to SPEC-ERD (Conversation · Message, DM-53/54), SPEC-APP-PIP (PIP-15, §2 Communications nav group built), SPEC-DDD (Sales owns Conversation/Message; message.received / message.sent / conversation.foldered events; /sales/conversations routes). New entity-lifecycle requirements LIF-1 referenced for soft-delete of junk/deleted. |