Skip to main content

CMS FAQ Management Extension — Delivery Review v2.0

Extension: FAQ Management (Epic 193) Source Version Reviewed: v1.0.0.57 Compiled Version in Sandbox: v1.0.0.73 Vendor: Sataware Technologies LLC Solution Design Date: December 16, 2025 Original Review Date: March 6, 2026 (v1.1 — symbol extraction only) Updated Review Date: March 19, 2026 (v2.0 — full source code review) Prepared by: Phil McCaffrey, ERP Specialist Organization: Bestway (USA) Inc.


Executive Summary

This is an updated Delivery Review of the CMS FAQ Management extension (Epic 193), replacing the v1.1 review dated March 6, 2026. The original review was conducted via symbol extraction from the compiled .app binary because source code had not been delivered. On March 19, 2026, Sataware provided source code at version 1.0.0.57 — 16 revisions behind the v1.0.0.73 binary in the sandbox. This updated review is based on a full reading of every delivered source file.

The updated review confirms and expands the original findings. The source code reveals implementation details that were not visible through symbol extraction alone — including hardcoded credentials, a double-execution defect in the Job Queue integration, and the complete absence of incremental sync logic.

The Epic defines 7 user stories with 26 acceptance criteria. The Solution Design (dated 12/16/25) specifies 6 tables in scope, 5 required fields per fault master table (20 total), 3 synchronization modes, and 6 deliverables. The delivered source implements 1 of 20 required fields, satisfies 5 of 26 acceptance criteria, and delivers 2 of 6 deliverables.

This document recommends that Bestway: (1) do not deploy this extension to production, (2) require delivery of v1.0.0.73 source code, (3) revoke the hardcoded FAQ API credentials immediately, and (4) determine whether to require Sataware to remediate or to bring the extension in-house for completion.


1. Background

The CMS 1.0 Fault Detail Sync initiative (Epic 193) was established to synchronize fault-related master data from the external FAQ API into Microsoft Dynamics 365 Business Central. The goal is to ensure BC uses only valid, active fault codes for new transactions while preserving historical Service Orders and posted data.

Sataware Technologies LLC was engaged to design and implement the extension. The Solution Design document (dated 12/16/25) was authored by Sataware, reviewed by Bestway, and explicitly approved by Phil McCaffrey on December 16:

"This updated Solution Design appears to address and satisfy all of the acceptance criteria laid out. We are good to move forward from our side."

The Solution Design is the authoritative reference for evaluating what was delivered. This review also evaluates against the Epic's 7 user stories and 26 acceptance criteria, which the Solution Design was written to satisfy.

1.1. What Changed Since v1.1

Aspectv1.1 Review (Mar 6)v2.0 Review (Mar 19)
Source availableNo — symbol extraction from .appYes — v1.0.0.57 source files
Assessment basisObject names, field names, IDsFull code reading of all 17 AL files
Deliverables marked "Unknown"2 (automated sync, notification)0 — all now assessed with evidence
Security findingsNone (not visible via symbols)2 critical (hardcoded credentials)
Data integrity findingsNone (not visible via symbols)3 (double execution, delete-reinsert, no transaction control)

1.2. Source Code Version Gap

ArtifactVersionDate
Source code delivered1.0.0.57File dates: Jan 27 – Feb 24, 2026
Compiled .app in sandbox1.0.0.73Mar 6, 2026
Gap16 revisionsSource for versions 58–73 not provided

Any findings based on v1.0.0.57 source may have been addressed — or worsened — in the 16 subsequent revisions. All assessments in this document are based on the source code Sataware provided and represent the best available evidence.

1.3. Project Timeline

DateEvent
Dec 2, 2025Initial effort estimate shared by Sataware (~84 hours at $28/hr)
Dec 5, 2025Bestway approves first 5 hours for Requirement Review and Solution Design
Dec 9, 2025First draft of Solution Design delivered by Sataware
Dec 10, 2025Bestway requests changes: automated sync, full rebuild approach, email notifications
Dec 12, 2025Bestway confirms automated sync was always in scope; Rob Chowdhury approves additional hours
Dec 16, 2025Updated Solution Design delivered and approved (~134 hours total)
Dec 23, 2025Sataware reports build errors (missing IWX/Innovia dependencies)
Feb 9, 2026Sataware says corrections complete; demo call scheduled
Feb 12, 2026Sataware submits Invoice #466051
Feb 26, 2026Rob Chowdhury: testing not done; waiting for source code in repo
Feb 28, 2026v1.0.0.58 installs successfully in sandbox
Mar 1–3, 2026Versions 59–61 fail to install (BestwayUSA dependency mismatch)
Mar 5, 2026v1.0.0.73 uploaded; source code withheld pending invoice payment
Mar 5, 2026Bestway validates .app via symbol extraction; significant gaps identified
Mar 6, 2026Delivery Review v1.1 published; review call scheduled for March 9
Mar 19, 2026Sataware delivers source code (v1.0.0.57 in zip); this review (v2.0)

2. Requirements Inventory

2.1. Epic 193 — User Stories and Acceptance Criteria

The Epic defines 7 user stories with 26 acceptance criteria total.

StoryTitleAcceptance Criteria
Story 1Build FAQ API Client3: Authentication, data fetch, update retrieval
Story 2Add Support for Sync Job with FAQ API Fields3: Fields added (6 fields × 6 tables), tables updated, mapping logic
Story 3Create BC Job to Fetch Updates Periodically3: Schedulable job, incremental fetch, configurable
Story 4Generate New BC Codes for Synced Entries2: Unique code generation, FAQ-to-BC mapping
Story 5Update BC to Show Only Active Records2: UI filtering, validation logic
Story 6Generate Email Notifications2: Change summary, configurable recipients
Story 7Update CSM Quality Report Submission3: Failure code logging, Service Item ID, fault detail logging

Required fields per Story 2 acceptance criteria:

FieldTypePurpose
FAQ IDIntLinks BC record to FAQ API entity
ActiveBooleanControls record availability
Created in FAQTimestampTracks when record was created in FAQ system
Updated in FAQTimestampChange detection for incremental sync
Created in BCTimestampTracks when record was synced into BC
Updated in BCTimestampTracks last BC-side update

Tables that must receive these fields (per Story 2):

  1. 5915 — Fault Area
  2. 5916 — Symptom Code
  3. 5918 — Fault Code
  4. 5919 — Resolution Code
  5. 5920 — Fault/Resol. Code Relations
  6. 50113 — Fault Area/Symptom Code Relationship

Total required field implementations: 36 (6 fields × 6 tables).

2.2. Solution Design — Deliverables

#DeliverableSource
D1Updated BC extension logic to support FAQ API synchronizationSection 4
D2One-time full rebuild synchronization capabilitySection 4, 7.1
D3Automated incremental synchronization capabilitySection 4, 7.2
D4Stakeholder notification summary for detected changesSection 4, 7.3
D5Final source code deliverySection 4, 11
D6Supporting technical documentationSection 4, 11

2.3. Solution Design — Core Design Principles (Section 6)

  1. No deletion of records once used in posted transactions
  2. Inactive records retained for historical reference
  3. Only active values available for new transactions
  4. Synchronization logic must be safe to re-run
  5. Existing extension boundaries must be respected

2.4. Solution Design — Data Safety Commitments (Section 9)

  1. No modification of posted documents
  2. Inactive handling ensures backward compatibility
  3. Partial updates are avoided
  4. Repeat executions do not create duplicate or invalid data

3. Delivery Analysis — Source Code Evidence

This section evaluates each requirement area against the actual source code. Every claim is backed by a specific file and line reference.

3.1. Table Extensions Delivered

BC TableTable IDExtension?Fields AddedEpic Required (6 per table)
Fault Area5915Yes (50076)Status (Option: true/false)1 of 6
Symptom Code5916NONE0 of 6
Fault Code5918NONE0 of 6
Resolution Code5919NONE0 of 6
Fault/Resol. Relationship5920Yes (65500)Status (Option), Source (Text)1 of 6 (Status only; Source not in spec)
Fault Area/Symptom Rel.50113NONE0 of 6

Result: 2 of 36 required field implementations delivered (Status on Fault Area and Status on Fault/Resol. Relationship). Missing: FAQ ID, Active, Created in FAQ, Updated in FAQ, Created in BC, Updated in BC — on all 6 tables.

Note: The Fault Area Status field uses Option type with "true"/"false" members (Field ID 50000 in PageExt/FaultAreasExt.PageExt.al, line 24). The Epic specifies an "Active (Boolean)" field. The delivered Option type with "true"/"false" does not align with the Active/Inactive semantic — "true" and "false" are not user-friendly labels and don't match any standard BC pattern.

3.2. API Client (Story 1)

Acceptance CriterionStatusEvidence
API client supports authenticationPartially implementedGetAccessToken() exists (Codeunit 65500, line 13) but uses hardcoded credentials instead of the API Setup table
Can fetch data from FAQ APIImplementedGetStandardFormat() fetches from /api/1.0/standardFormat endpoint (line 48)
Can retrieve updates from FAQ APINOT implementedNo incremental fetch logic exists. GetStandardFormat() always fetches the full dataset. No "last modified" or "since" parameter is sent to the API

Detailed assessment: The API client authenticates and fetches data, but it always performs a full fetch. There is no mechanism to request only records changed since the last sync — the /standardFormat endpoint is called with no date filter, no offset, and no pagination. The "retrieve updates" criterion requires differential fetching, which is absent.

3.3. Sync Job Fields (Story 2)

Status: 2 of 36 fields delivered. See Section 3.1 above.

The mapping logic in ProcessStandardFormatResponse (Codeunit 65500, lines 61–234) maps:

  • csMainCategoryId / csMainCategoryName → Fault Area Code / Description
  • csSubCategoryId / csSubCategoryName → Symptom Code / Description
  • itemPartId / itemPartName → Fault Code (keyed by Fault Area + Symptom + Code)
  • issueTypeId / issueTypeName → Resolution Code / Description

The mapping itself is functional for the four fault master tables. However, the FAQ API integer IDs (csMainCategoryId, etc.) are used as the BC Code values directly — they are not persisted in a separate FAQ ID field. This means the BC Code field serves double duty as both the display code and the API identifier, which violates the Solution Design's requirement (Section 7.1) that "FAQ API identifiers will be persisted as the primary reference."

3.4. Periodic Job (Story 3)

Acceptance CriterionStatusEvidence
Job can be scheduled and run periodicallyImplementedJob Queue scheduling via ScheduleMyCodeunit action (Page 65504, line 1005); supports Daily and Weekly options
Job fetches only updated records since last syncNOT implementedGetStandardFormat() always fetches all records. No incremental logic exists. No "last sync" timestamp is sent to the API
Scheduling is configurableImplementedDaily/Weekly options with time selection on the FAQ Management page

Detailed assessment: The Job Queue scheduling works correctly for daily and weekly cadences. However, the job runs a full sync every time — it fetches the entire dataset from the FAQ API and upserts all records. This is a full rebuild on every execution, not an incremental sync. The Solution Design (Section 7.2) specifies "Detection of changes between API data and BC cache" and "Mark records Inactive when removed from the API" — neither behavior exists.

Additionally, the Job Queue integration has a critical defect: the OnAfterInsert trigger on Job Queue Log Entry (TableExt/JobQueueLogEntryExt.TableExt.al, line 7) fires after the Job Queue has already executed the codeunit, causing the sync to run twice per scheduled execution. See the Code Quality Review for full analysis.

3.5. Code Generation (Story 4)

Acceptance CriterionStatusEvidence
Code generation logic ensures uniquenessNOT implementedNo code generation exists. FAQ API integer IDs are used directly as BC Code values
Code maps correctly to FAQ API IDPartiallyThe API ID is the Code — there is no separate mapping

Detailed assessment: The Epic specifies "generate unique 3–4 character codes for new entries created via sync." The delivered code uses the FAQ API's integer IDs (e.g., "7", "44", "56", "184") as the BC Code field values directly. No 3–4 character code generation algorithm exists. The ServiceItemGroupCodeBuffer table (50001) maps FAQ IDs to Service Item Group codes, but this is a manual mapping table — not an automated code generator.

3.6. Active Record Filtering (Story 5)

Acceptance CriterionStatusEvidence
UI filters out inactive recordsPartially implementedFaultAreasExt (PageExt 50001, line 16) and Faultcoderelationextpage (PageExt 65501, line 42) both filter to Status = "True" on page open
Validation logic respects Active flagPartially implementedServiceSubformFilterExt (PageExt 50000, line 15) filters Fault Area lookup by Status = "True" on the Fault/Resol. Relationship table

Detailed assessment: The UI filtering works on the two tables that have Status fields (Fault Area and Fault/Resol. Relationship). However, because Symptom Code, Fault Code, and Resolution Code have no Status fields, those tables cannot be filtered — all records (including any that should be inactive) remain available for selection. The filtering is structurally incomplete because it depends on table extensions that were never created.

The Service Item Worksheet Subform variant (PageExt 50005, line 44) has the Service Item Group Code filter commented out, which means it shows all active fault areas across all product categories rather than filtering by the specific service item group.

3.7. Email Notifications (Story 6)

Acceptance CriterionStatusEvidence
Email includes list of changes syncedImplementedSendReportByEmail() and SendReportByEmailJQ() (Page 65504) generate HTML email bodies with active record counts, newly activated records, and modified record counts
Email sent to configured stakeholdersImplementedEmail Recipient Setup table (65550) with lookup page (65551) allows configuring recipients; emails sent via BC's Email codeunit

Detailed assessment: Email notifications are functionally implemented. Two variants exist — a manual sync version (SendReportByEmail) and a Job Queue version (SendReportByEmailJQ). Both generate styled HTML reports and send to configured recipients.

The JQ variant tracks "newly activated" records by comparing SystemModifiedAt against the last sync timestamp from the FAQ Sync Log table (50012). This is a reasonable approach for detecting changes since the last sync, though it relies on system timestamps rather than explicit sync audit fields.

Note: The email body has a colspan mismatch (11 column header, colspan="8" fallback), and the double-execution defect means the JQ email may report incorrect counts.

3.8. CSM Quality Report Logging (Story 7)

Acceptance CriterionStatusEvidence
Log includes failure codeNOT implementedNo logging code exists for CSM Quality Report submissions
Log includes Service Item ID from PSINOT implementedNo reference to Posted Service Invoices in the source
Log includes Fault Area, Symptom, Fault, ResolutionNOT implementedNo verbose logging exists

Detailed assessment: Story 7 is entirely unimplemented. There is no code that references CSM Quality Reports, Posted Service Invoices, or any logging enhancement. This story does not appear to have been addressed at all.

3.9. Solution Design — Synchronization Approaches

3.9.1. One-Time Full Rebuild Sync (Section 7.1)

RequirementStatusEvidence
All existing records marked InactivePartiallyReport 65501 sets Status = "false" on Fault/Resol. Relationship records only. Symptom Code, Fault Code, and Resolution Code have no Status field to mark
Complete import from FAQ APIImplementedGetStandardFormat() fetches and upserts all records
FAQ API identifiers persisted as primary referenceNOT implementedAPI integer IDs used as BC Code values — no separate FAQ ID field
No legacy-to-API mapping logicCompliantNo mapping logic exists
Historical and posted data unchangedAppears compliantNo code touches posted documents

3.9.2. Automated Incremental Sync (Section 7.2)

RequirementStatusEvidence
Periodic unattended executionImplementedJob Queue scheduling exists
Detection of changes between API data and BC cacheNOT implementedFull dataset fetched every time; no change detection
Insert new recordsImplementedUpsert logic in ProcessStandardFormatResponse
Update modified recordsImplementedDescription updates detected and applied
Mark records Inactive when removed from the APINOT implementedNo logic to detect API-side removals
Maintain sync state across executionsPartiallyFAQ Sync Log table tracks sync timestamps, but no per-record sync state

3.9.3. Stakeholder Notification (Section 7.3)

RequirementStatusEvidence
Configurable recipient listImplementedEmail Recipient Setup table and page
Summary of newly added recordsImplementedInsert count tracked and included in email
Summary of updated recordsImplementedModify count tracked and included in email
Summary of records marked InactiveNOT implementedNo logic to mark records Inactive exists, so no summary is possible

4. Gap Analysis — Updated

4.1. Story-Level Completion

StoryAcceptance CriteriaSatisfiedPartiallyNot Implemented
Story 1: API Client3111
Story 2: Sync Fields3012
Story 3: Periodic Job3201
Story 4: Code Generation2002
Story 5: Active Filtering2020
Story 6: Email Notifications2200
Story 7: CSM Logging3003
Total18549

4.2. Deliverable Status — Updated

Deliverablev1.1 Statusv2.0 Status (with source)
D1: BC extension logic for FAQ syncPartially deliveredPartially delivered — core upsert works but missing 34 of 36 fields, no incremental logic, no inactive marking
D2: One-time full rebuild syncExecuted but unverifiablePartially delivered — Report 65501 marks Fault/Resol. records as false, but 4 of 6 tables have no Status field to mark
D3: Automated incremental syncUnknownNOT delivered — every scheduled run is a full sync; no change detection, no API-side removal detection
D4: Stakeholder notificationUnknownDelivered — email notifications work with configurable recipients and styled HTML reports
D5: Final source code deliveryNOT deliveredPartially delivered — v1.0.0.57 source provided but 16 revisions behind the deployed binary
D6: Supporting technical documentationNOT deliveredNOT delivered — no documentation of any kind

4.3. Required Fields Gap

FieldEpic SpecTables RequiredTables DeliveredGap
FAQ ID (Int)Story 2606 missing
Active (Boolean)Story 260 (Status Option on 2 tables is not equivalent)6 missing
Created in FAQ (Timestamp)Story 2606 missing
Updated in FAQ (Timestamp)Story 2606 missing
Created in BC (Timestamp)Story 2606 missing
Updated in BC (Timestamp)Story 2606 missing
Total36036 missing

Note: While the Fault Area and Fault/Resol. Relationship tables have a "Status" Option field, this is not equivalent to the "Active (Boolean)" field specified in the Epic. The Option type uses "true"/"false" members rather than a Boolean, and the semantic meaning (Active/Inactive vs. true/false) differs. Additionally, none of the six specified fields (FAQ ID, Active, Created in FAQ, Updated in FAQ, Created in BC, Updated in BC) are present on any table.

4.4. Missing Capabilities Summary

  1. Incremental sync does not exist. Every run is a full sync. There is no way to fetch only changed records, no way to detect API-side removals, and no per-record sync state to track what changed.

  2. Inactive marking is incomplete. Only 2 of 6 tables have a Status field. The 4 tables without Status cannot participate in the active/inactive lifecycle.

  3. Code generation does not exist. FAQ API integer IDs are used directly as BC Code values. No 3–4 character code generation algorithm was implemented.

  4. CSM Quality Report logging is entirely missing. Story 7 has zero implementation.

  5. FAQ API identifiers are not persisted separately. The Solution Design's requirement to persist FAQ API identifiers as the primary reference is not met — the API ID is the Code field, with no separate FAQ ID.


5. Vendor Response and Assessment

This section is unchanged from Delivery Review v1.1.

On March 5, 2026, Ashok Marimuthu (CEO, Sataware Technologies LLC) responded to the gap analysis:

"Based on our earlier discussions and the demos conducted during development, the implementation focused on adding the Status field to the Fault/Resolution table to support the inactive handling behavior required for synchronization. During those discussions, the approach was to manage the active/inactive validation through the Fault Resolution codes, since that table is the one referenced for UI validation in the service order workflow."

"From a design perspective, adding the same set of additional columns across all tables would introduce additional complexity and potential issues within the existing extension structure."

5.1. Assessment — Updated

  1. 5.1.1. The Solution Design lists all six tables in scope (Section 3). The Epic lists all six tables with six required fields each (Story 2). Both were authored or reviewed by Sataware. Neither limits scope to the Fault/Resolution table.

  2. 5.1.2. The "complexity" argument is contradicted by the effort estimate. ~134 hours at $28/hr was approved for the full scope. If only 2 tables were being extended, the effort estimate is disproportionate to the delivery.

  3. 5.1.3. The source code now confirms that the implementation gaps are not just missing fields — entire capabilities (incremental sync, code generation, CSM logging) are absent.

  4. 5.1.4. Verbal discussions do not override written, approved specifications. The Solution Design states its purpose is to "clearly define the approved scope, execution behavior, and boundaries for implementation" (Section 1).


6. Effort vs. Delivery Assessment

MetricAgreedDelivered
Estimated effort134 hours ($3,752)Invoice #466051 submitted for full amount
User stories74 partially addressed, 1 fully addressed, 2 not addressed
Acceptance criteria18 (Stories 1–6) + 3 (Story 7) = 21 total5 fully satisfied, 4 partially, 9 not implemented (excl. Story 7)
Required field implementations36 (6 fields × 6 tables)0 of the specified fields; 2 Status fields added (not matching spec)
Table extensions6 tables2 tables
Deliverables61 fully delivered (notifications), 2 partially delivered, 3 not delivered
Core capabilities3 (rebuild, incremental, notification)1 partially delivered (rebuild runs but incomplete schema), 1 delivered (notification), 1 not delivered (incremental)

7. Recommendations — Updated

7.1. Immediate Actions

  1. 7.1.1. Do not deploy to production. The security vulnerabilities documented in the companion Code Quality Review (hardcoded API credentials, hardcoded admin password) and the data integrity defects (double execution, delete-and-reinsert risk) make this extension unsafe for production use.

  2. 7.1.2. Revoke the FAQ API credentials (BWUFAQ / BWUFAQ123) immediately. These are now in source control and must be considered compromised.

  3. 7.1.3. Request the v1.0.0.73 source code. The 16-revision gap means this review may not reflect the current state. Bestway needs the matching source for any path forward.

7.2. Path Forward — Decision Required

Bestway must decide between two paths:

Option A: Require Sataware to remediate.

  • Pro: Vendor accountability; they built it, they should deliver what was agreed.
  • Con: Track record suggests limited responsiveness (5 source code requests over 8 days). The quality of the existing code raises questions about whether remediation will meet Bestway's standards.
  • Requirement: Concrete remediation plan with dates, milestones, and acceptance criteria for each story.

Option B: Bring the extension in-house for completion.

  • Pro: Full control over quality, timeline, and architecture. Bestway has the BC development capability and standards infrastructure to deliver this correctly.
  • Con: Additional internal effort. Sataware's code would need to be substantially rewritten to meet Bestway's extension standards (naming, structure, telemetry, testing, documentation).
  • Consideration: Invoice reconciliation — the delivered extension does not satisfy the agreed scope.

7.3. Discussion Points for Sataware

  1. 7.3.1. Source code gap: Provide the v1.0.0.73 source code immediately.
  2. 7.3.2. Scope acknowledgment: Does Sataware acknowledge the 21 acceptance criteria from the Epic and the 36 field implementations required by Story 2?
  3. 7.3.3. Incremental sync: Was automated incremental sync (Section 7.2) ever implemented? If so, where is the code? If not, why was it included in the effort estimate?
  4. 7.3.4. Code generation: Was Story 4 (unique 3–4 character codes) ever implemented?
  5. 7.3.5. CSM logging: Was Story 7 (CSM Quality Report verbose logging) ever started?
  6. 7.3.6. Invoice reconciliation: Given that 9 of 18 acceptance criteria are not implemented and 2 of 6 deliverables are not delivered, how should Invoice #466051 be reconciled?
  7. 7.3.7. Security: Why are API credentials hardcoded in source when the API Setup table exists?

Appendix A: Acceptance Criteria — Detailed Status

Story#Acceptance CriterionStatusEvidence
11API client supports authentication with FAQ APIPartialAuth works but uses hardcoded credentials (line 24)
12Can fetch data from FAQ APIYesGetStandardFormat() fetches /api/1.0/standardFormat
13Can retrieve updates from FAQ APINoNo incremental fetch — full dataset every time
21Fields added to BC tables (6 fields × 6 tables)No0 of 36 specified fields. 2 non-matching Status fields added
22Tables updated (6 specified)Partial2 of 6 tables have extensions
23Mapping logic between FAQ API and BC tablesPartialMapping exists for 4 tables; missing for 2 relationship tables
31Job can be scheduled and run periodicallyYesDaily/Weekly Job Queue scheduling
32Job fetches only updated records since last syncNoFull dataset fetched every run
33Scheduling is configurableYesTime and frequency options on management page
41Code generation ensures uniquenessNoNo code generation — API integer IDs used directly
42Code maps correctly to FAQ API IDNoAPI ID is the Code — no separate mapping
51UI filters out inactive recordsPartialWorks on 2 tables with Status; 4 tables have no Status
52Validation logic respects Active flagPartialService Order Subform lookup filters by Status on Fault/Resol. Rel.
61Email includes list of changes syncedYesHTML email with active/inactive counts, change details
62Email sent to configured stakeholdersYesEmail Recipient Setup with user lookup
71Log includes failure codeNoStory 7 entirely unimplemented
72Log includes Service Item ID from PSINoStory 7 entirely unimplemented
73Log includes Fault Area, Symptom, Fault, ResolutionNoStory 7 entirely unimplemented

Appendix B: Reference Documents

DocumentDateLocation
Solution DesignDec 16, 2025V1_CSM_1_0_Fault_Detail_Sync_Solution_Design.pdf
FAQ API to BC MappingDec 2025FAQ API to BC Mapping.png
Epic 193 RequirementsNov 2025Epic - Sync Business Central with FAQ API.docx
Delivery Review v1.1Mar 6, 2026CMS FAQ Management - Delivery Review v1.1.docx
Code Quality Review v1.0Mar 19, 2026CMS FAQ Management - Code Quality Review v1.0.docx
This Delivery Review v2.0Mar 19, 2026CMS FAQ Management - Delivery Review v2.0.docx