Added documentation, restructured solution

This commit is contained in:
2026-10-30 10:57:35 +02:00
parent 58f8006ab2
commit 4fa379f74e
29 changed files with 203 additions and 20 deletions
+163
View File
@@ -0,0 +1,163 @@
<mxfile host="Electron">
<diagram name="Page-1" id="lj056Mnt25KX5hBf4p9v">
<mxGraphModel dx="1063" dy="686" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="900" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="G6m14uD4gVQkRd8Mz5xj-42" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" value="" vertex="1">
<mxGeometry height="700" width="952" x="340" y="130" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#008a00;fontColor=#ffffff;strokeColor=#005700;" value="&lt;b style=&quot;color: rgb(255, 255, 255);&quot;&gt;Persistance&lt;/b&gt;" vertex="1">
<mxGeometry height="70" width="650" x="475" y="730" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PostgresSQL" vertex="1">
<mxGeometry height="45" width="120" x="500" y="742.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Redis" vertex="1">
<mxGeometry height="45" width="120" x="740" y="742.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Garage S3" vertex="1">
<mxGeometry height="45" width="120" x="980" y="742.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-5" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#e51400;fontColor=#ffffff;strokeColor=#B20000;" value="&lt;span style=&quot;color: rgb(255, 255, 255);&quot;&gt;&lt;b&gt;Enterprise Integration Elements&lt;/b&gt;&lt;/span&gt;" vertex="1">
<mxGeometry height="70" width="650" x="475" y="580" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-7" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Skoruba Identity API" vertex="1">
<mxGeometry height="45" width="120" x="500" y="592.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-8" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Skoruba STS" vertex="1">
<mxGeometry height="45" width="120" x="658" y="592.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-10" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Email" vertex="1">
<mxGeometry height="45" width="120" x="815" y="592.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-55" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="G6m14uD4gVQkRd8Mz5xj-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-56" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-57" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-58" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-11" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Quartz Scheduler" vertex="1">
<mxGeometry height="45" width="120" x="980" y="592.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-12" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#fa6800;fontColor=#000000;strokeColor=#C73500;" value="&lt;b style=&quot;color: rgb(255, 255, 255);&quot;&gt;Integration &amp;amp; Services&lt;/b&gt;" vertex="1">
<mxGeometry height="70" width="650" x="475" y="440" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-51" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-52" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-53" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.538;entryY=0.073;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-8">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-61" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0.333;entryY=0.167;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-62" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-13" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PFM API" vertex="1">
<mxGeometry height="45" width="62" x="500" y="452.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-14" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM MCP" vertex="1">
<mxGeometry height="45" width="72" x="580" y="452.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-15" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="" vertex="1">
<mxGeometry height="45" width="284" x="816" y="452.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-16" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Governance" vertex="1">
<mxGeometry height="20" width="80" x="830" y="465" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-17" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Evidence" vertex="1">
<mxGeometry height="20" width="62" x="918" y="465" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-18" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Grants" vertex="1">
<mxGeometry height="20" width="42" x="988" y="465" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-19" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Projects" vertex="1">
<mxGeometry height="20" width="52" x="1038" y="465" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-20" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" value="&lt;b&gt;Presentation&lt;/b&gt;" vertex="1">
<mxGeometry height="70" width="650" x="475" y="300" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-49" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-21" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-13">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-21" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PFM Console (Web)" vertex="1">
<mxGeometry height="45" width="120" x="500" y="312.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-48" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-22" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-26">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-50" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-22" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-13">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-22" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PFM Partner (Web)" vertex="1">
<mxGeometry height="45" width="120" x="640" y="312.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-23" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM Console Mobile" vertex="1">
<mxGeometry height="45" width="130" x="830" y="312.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-24" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM Partner Mobile" vertex="1">
<mxGeometry height="45" width="120" x="980" y="312.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-26" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Khongisa CDN" vertex="1">
<mxGeometry height="45" width="102" x="668" y="452.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-34" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" value="&lt;span style=&quot;color: rgb(255, 255, 255);&quot;&gt;&lt;b&gt;Consumers / Users&lt;/b&gt;&lt;/span&gt;" vertex="1">
<mxGeometry height="70" width="650" x="475" y="160" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-25" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="3rd Party AI" vertex="1">
<mxGeometry height="45" width="80" x="1020" y="172.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-37" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM AI" vertex="1">
<mxGeometry height="45" width="62" x="950" y="172.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-46" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-38" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.33;exitY=0.996;exitDx=0;exitDy=0;entryX=0.333;entryY=0.167;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-21">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-38" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Private Funding Organisations" vertex="1">
<mxGeometry height="45" width="180" x="500" y="172.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-47" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-39" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-22">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-39" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Funding Applicants" vertex="1">
<mxGeometry height="45" width="120" x="690" y="172.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-40" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="Data Aggregators" vertex="1">
<mxGeometry height="45" width="110" x="820" y="172.5" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-41" edge="1" parent="1" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;fillColor=#1ba1e2;strokeColor=#006EAF;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;" value="">
<mxGeometry height="100" relative="1" width="100" as="geometry">
<mxPoint x="430" y="800" as="sourcePoint" />
<mxPoint x="430" y="160" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-44" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;rotation=-90;fontSize=15;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;" value="Interaction / Integration / Data Flow" vertex="1">
<mxGeometry height="30" width="450" x="170" y="465" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-63" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="340" y="550" as="sourcePoint" />
<mxPoint x="1290" y="550" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-64" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Public" vertex="1">
<mxGeometry height="30" width="102" x="1190" y="510" as="geometry" />
</mxCell>
<mxCell id="G6m14uD4gVQkRd8Mz5xj-65" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Private" vertex="1">
<mxGeometry height="30" width="102" x="1190" y="570" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
@@ -3,6 +3,7 @@
> **Document Version**: 2.0 > **Document Version**: 2.0
> **Target Runtimes**: .NET 10.0 (C# 13) | React 19 / TypeScript 5.8 / Vite > **Target Runtimes**: .NET 10.0 (C# 13) | React 19 / TypeScript 5.8 / Vite
> **Scope**: System Architecture, Security Topology, RBAC Enforcement, and Maker-Checker Pattern > **Scope**: System Architecture, Security Topology, RBAC Enforcement, and Maker-Checker Pattern
> **Technology Partner & Technical Authorship**: **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, architecture, and maintenance of the Post-Fund Management (PFM) Platform. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**.
--- ---
@@ -328,7 +329,7 @@ The background job runner powers four essential operational workloads:
The PFM platform integrates the **Model Context Protocol (MCP)** standard (v2.3.0) to expose domain capabilities both internally and externally while preventing token exhaustion and eliminating network call overhead: The PFM platform integrates the **Model Context Protocol (MCP)** standard (v2.3.0) to expose domain capabilities both internally and externally while preventing token exhaustion and eliminating network call overhead:
1. **Dual Realisation Pattern**: 1. **Dual Realisation Pattern**:
* **In-App MCP (`PostFundManagement.Api`)**: Internal features, handlers, and workflows obtain in-process access to MCP tooling via `IInAppMcpClient`. Calls are executed directly against scoped services with zero network latency, zero serialization overhead, and no external web requests. * **In-App MCP (`PostFundManagement.Api` & `PostFundManagement.Jobs`)**: Internal features, background jobs, and workflows obtain in-process access to MCP tooling via `IInAppMcpClient`. Calls are executed directly against scoped services with zero network latency, zero serialization overhead, and no external web requests.
* **External MCP Server (`PostFundManagement.Mcp`)**: A dedicated standalone presentation host exposes the exact same tools over standard external transports (HTTP/SSE at `/mcp` and command-line Stdio via `--stdio`) for external LLMs, agentic workbenches, and client IDEs. * **External MCP Server (`PostFundManagement.Mcp`)**: A dedicated standalone presentation host exposes the exact same tools over standard external transports (HTTP/SSE at `/mcp` and command-line Stdio via `--stdio`) for external LLMs, agentic workbenches, and client IDEs.
2. **Application.Services Proxying Pattern**: 2. **Application.Services Proxying Pattern**:
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Before

Width:  |  Height:  |  Size: 2.8 MiB

After

Width:  |  Height:  |  Size: 2.8 MiB

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 2.7 MiB

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
# PostFundManagement (PFM) Platform — Operational Processes & Governance (Processes.md) # PostFundManagement (PFM) Platform — Operational Processes & Governance (Processes.md)
> **Document Context**: Authoritative operational manual and process specification for the PFM Platform. Derived from the PFM SRS v2.0 and governing all lifecycle transitions, workflow gates, RBAC controls, and Maker-Checker segregation of duties. > **Document Context**: Authoritative operational manual and process specification for the PFM Platform. Derived from the PFM SRS v2.0 and governed by **Lite Charms (PTY) Ltd** (official technology partner and author of every technical implementation, architecture, and maintenance of the system, with **Ifri Technologies** operating within Lite Charms (PTY) Ltd).
--- ---

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 281 KiB

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 260 KiB

Before

Width:  |  Height:  |  Size: 269 KiB

After

Width:  |  Height:  |  Size: 269 KiB

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Before

Width:  |  Height:  |  Size: 637 KiB

After

Width:  |  Height:  |  Size: 637 KiB

+4 -2
View File
@@ -2,6 +2,8 @@
> **Document Context**: This document serves as the primary system specification, technical architectural guide, and development roadmap for the **Post-Fund Management, Performance & Impact Management Platform (PFM)**. It is directly derived from the **PFM System Requirements Specification (SRS) v2.0** (authored by S. Phiri, 13 August 2026) and reflects the actual technical implementation and project layout in this repository. > **Document Context**: This document serves as the primary system specification, technical architectural guide, and development roadmap for the **Post-Fund Management, Performance & Impact Management Platform (PFM)**. It is directly derived from the **PFM System Requirements Specification (SRS) v2.0** (authored by S. Phiri, 13 August 2026) and reflects the actual technical implementation and project layout in this repository.
> >
> **Technology Partner & Technical Authorship**: **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, system architecture, and maintenance of the Post-Fund Management (PFM) Platform. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**.
>
> **Role for Gemini / Antigravity**: Use this file as your authoritative blueprint when extending, debugging, testing, or implementing any features, endpoints, domain models, or UI components across the PFM solution. > **Role for Gemini / Antigravity**: Use this file as your authoritative blueprint when extending, debugging, testing, or implementing any features, endpoints, domain models, or UI components across the PFM solution.
--- ---
@@ -194,8 +196,8 @@ The platform establishes a dual-channel Model Context Protocol (MCP) architectur
* `CommunicationsMcpTools`: Proxies `ICommunicationsService` (Notifications M25, Onboarding Invites M03). * `CommunicationsMcpTools`: Proxies `ICommunicationsService` (Notifications M25, Onboarding Invites M03).
* `UsersMcpTools`: Proxies `IUserService` (Identity accounts, RBAC roles, security claims). * `UsersMcpTools`: Proxies `IUserService` (Identity accounts, RBAC roles, security claims).
2. **In-App MCP Consumer in `PostFundManagement.Api` (Zero Web Hops)**: 2. **In-App MCP Consumer in `PostFundManagement.Api` & `PostFundManagement.Jobs` (Zero Web Hops)**:
- `PostFundManagement.Api` accesses tools in-process via `IInAppMcpClient` registered by `AddApplicationMcpTools()`. - Both `PostFundManagement.Api` and `PostFundManagement.Jobs` access tools in-process via `IInAppMcpClient` registered by `AddApplicationMcpTools()`.
- Resolves and executes tool methods directly against scoped domain services without issuing HTTP network calls to an external MCP server. - Resolves and executes tool methods directly against scoped domain services without issuing HTTP network calls to an external MCP server.
- Provides optional in-process protocol compatibility via `CreateProtocolClientAsync()` using duplex in-memory streams. - Provides optional in-process protocol compatibility via `CreateProtocolClientAsync()` using duplex in-memory streams.
- *Design Boundary*: No autonomous AI agents are defined in the solution at this time; the tooling layer and in-app consumer interfaces provide the underlying foundation for future agentic orchestration. - *Design Boundary*: No autonomous AI agents are defined in the solution at this time; the tooling layer and in-app consumer interfaces provide the underlying foundation for future agentic orchestration.
+10 -6
View File
@@ -1,13 +1,17 @@
PROPRIETARY LICENSE PROPRIETARY LICENSE
Copyright (c) 2026 IFRI TECHNOLOGIES (PTY) Ltd. All rights reserved. Copyright (c) 2026 Lite Charms (PTY) Ltd / Ifri Technologies. All rights reserved.
This software and its associated documentation (the "Software") are the This software and its associated documentation (the "Software") are the proprietary
proprietary property of IFRI TECHNOLOGIES (PTY) Ltd. property of Lite Charms (PTY) Ltd.
The Software is provided for internal use only. Unauthorized copying, Ifri Technologies is an entity within Lite Charms (PTY) Ltd.
distribution, modification, or use of this file via any medium is Lite Charms (PTY) Ltd is the technology partner and author of every technical
strictly prohibited. implementation and maintenance of the system.
The Software is provided for internal and authorized partner use only.
Unauthorized copying, distribution, modification, reverse engineering,
or use of this file via any medium is strictly prohibited.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+1
View File
@@ -11,6 +11,7 @@ builder.Services.AddFeatureManagement();
builder.Services.AddSharedServices(); builder.Services.AddSharedServices();
builder.Services.AddHostedService<JobsWorker>(); builder.Services.AddHostedService<JobsWorker>();
builder.Services.AddRegisterServicesWithCaching(builder.Configuration); builder.Services.AddRegisterServicesWithCaching(builder.Configuration);
builder.Services.AddApplicationMcpTools();
builder.Services.AddEndpointAndServiceCaching(builder.Configuration); builder.Services.AddEndpointAndServiceCaching(builder.Configuration);
builder.Services.AddTransient<ITenantContextService, HeadlessTenantContextService>(); builder.Services.AddTransient<ITenantContextService, HeadlessTenantContextService>();
builder.Services.AddSkorubaApiService(builder.Configuration); builder.Services.AddSkorubaApiService(builder.Configuration);
+19 -8
View File
@@ -2,6 +2,8 @@
An enterprise system designed to manage the entire post-funding grant and project lifecycle. PFM provides end-to-end oversight across strategic portfolios, programme allocation, project execution tracking, financial disbursements, monitoring & evaluation (M&E), and candidate notifications. An enterprise system designed to manage the entire post-funding grant and project lifecycle. PFM provides end-to-end oversight across strategic portfolios, programme allocation, project execution tracking, financial disbursements, monitoring & evaluation (M&E), and candidate notifications.
> **Technology Partner & Technical Authorship**: **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, system architecture, and maintenance of the Post-Fund Management (PFM) Platform. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**.
--- ---
## 🏛️ System Architecture & Domain Model ## 🏛️ System Architecture & Domain Model
@@ -43,7 +45,7 @@ The application follows a modular, hierarchical architecture where high-level fu
### **6. Model Context Protocol (MCP) — In-App & External Tooling** ### **6. Model Context Protocol (MCP) — In-App & External Tooling**
* **Central Tool Definitions (`PostFundManagement.Application/Mcp`)**: Tools proxy core domain services organized by business domain (`Grants`, `Projects`, `Execution`, `Governance`, `Evidence`, `Communications`, `Users`). * **Central Tool Definitions (`PostFundManagement.Application/Mcp`)**: Tools proxy core domain services organized by business domain (`Grants`, `Projects`, `Execution`, `Governance`, `Evidence`, `Communications`, `Users`).
* **In-App MCP (`PostFundManagement.Api`)**: The API has direct in-process access to tooling via `IInAppMcpClient` without making external web or HTTP calls. * **In-App MCP (`PostFundManagement.Api` & `PostFundManagement.Jobs`)**: Both the API and Jobs background worker hosts have direct in-process access to tooling via `IInAppMcpClient` without making external web or HTTP calls.
* **External MCP Server (`PostFundManagement.Mcp`)**: Dedicated .NET 10 host serving MCP tools over HTTP/SSE (`/mcp`) and Stdio (`--stdio`) for external agents, Claude Desktop, and IDEs. * **External MCP Server (`PostFundManagement.Mcp`)**: Dedicated .NET 10 host serving MCP tools over HTTP/SSE (`/mcp`) and Stdio (`--stdio`) for external agents, Claude Desktop, and IDEs.
* **Token Optimization**: Standardized `McpToolResult` models minimize prompt token overhead. * **Token Optimization**: Standardized `McpToolResult` models minimize prompt token overhead.
* **Agent Status**: Tooling infrastructure is established; agent definitions are deferred to future milestones. * **Agent Status**: Tooling infrastructure is established; agent definitions are deferred to future milestones.
@@ -78,6 +80,7 @@ The application follows a modular, hierarchical architecture where high-level fu
* **Frontend Portals**: * **Frontend Portals**:
* `PostFundManagement.ConsoleUI`: Internal Staff & Portfolio Administration Portal (React 19 + TypeScript + Vite + Tailwind CSS) * `PostFundManagement.ConsoleUI`: Internal Staff & Portfolio Administration Portal (React 19 + TypeScript + Vite + Tailwind CSS)
* `PostFundManagement.PartnerUI`: External Recipient & Grantee Portal (React 19 + TypeScript + Vite + WebGL OGL) * `PostFundManagement.PartnerUI`: External Recipient & Grantee Portal (React 19 + TypeScript + Vite + WebGL OGL)
* `PostFundManagement.ShowcaseUI`: Public-Facing Product & Experience Showcase Portal (React 19 + TypeScript + Vite + Tailwind CSS)
* **Database**: PostgreSQL 14+ with Npgsql & EF Core 10 * **Database**: PostgreSQL 14+ with Npgsql & EF Core 10
* **Security & Authentication**: Duende IdentityServer / OIDC PKCE + Claim-Based RBAC * **Security & Authentication**: Duende IdentityServer / OIDC PKCE + Claim-Based RBAC
* **Governance Patterns**: Maker-Checker Pattern (Dual Authorization & Segregation of Duties) * **Governance Patterns**: Maker-Checker Pattern (Dual Authorization & Segregation of Duties)
@@ -113,8 +116,8 @@ To eliminate conflicts of interest, record creators ("Makers") cannot approve ("
$$\text{Can Approve} = \text{Has 'update' permission} \land (\text{Current User ID} \neq \text{Record Creator ID})$$ $$\text{Can Approve} = \text{Has 'update' permission} \land (\text{Current User ID} \neq \text{Record Creator ID})$$
For in-depth architectural and operational specifications, see: For in-depth architectural and operational specifications, see:
* [Architecture.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Architecture.md) * [Architecture.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Documentation/Architecture.md)
* [Processes.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Processes.md) * [Processes.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Documentation/Processes.md)
* [GEMINI.md](file:///c:/Users/Admin/source/repos/PostFundManagement/GEMINI.md) * [GEMINI.md](file:///c:/Users/Admin/source/repos/PostFundManagement/GEMINI.md)
--- ---
@@ -125,14 +128,19 @@ For in-depth architectural and operational specifications, see:
PostFundManagement/ PostFundManagement/
├── PostFundManagement.Domain/ # Core Domain Entities, Enums, Value Objects & Abstractions (IEvent) ├── PostFundManagement.Domain/ # Core Domain Entities, Enums, Value Objects & Abstractions (IEvent)
├── PostFundManagement.Infrastructure/ # EF Core 10, PostgreSQL (Npgsql), Migrations, Data Protection ├── PostFundManagement.Infrastructure/ # EF Core 10, PostgreSQL (Npgsql), Migrations, Data Protection
├── PostFundManagement.Application/ # CQRS Handlers, Mediator, DTOs, Validations, S3, Email, Job Orchestrator ├── PostFundManagement.Application/ # CQRS Handlers, Mediator, DTOs, Validations, S3, Email, Quartz, Mcp Tools
├── PostFundManagement.Api/ # ASP.NET Core Minimal APIs / Carter, Auth (OIDC), Swagger/Scalar, Versioning ├── PostFundManagement.Api/ # ASP.NET Core Minimal APIs / Carter, Auth (OIDC), Swagger/Scalar, In-App MCP Consumer
├── PostFundManagement.Mcp/ # Dedicated Model Context Protocol (MCP) Server Host (HTTP/SSE & Stdio Transports)
├── PostFundManagement.Jobs/ # Dedicated Quartz.NET Background Worker Host (Recurring & Event-Driven Jobs) ├── PostFundManagement.Jobs/ # Dedicated Quartz.NET Background Worker Host (Recurring & Event-Driven Jobs)
├── PostFundManagement.Tests/ # Unit & Integration Test Suite (xUnit, Coverlet) ├── PostFundManagement.Tests/ # Unit & Integration Test Suite (xUnit, Coverlet)
├── PostFundManagement.ConsoleUI/ # Internal Staff & Admin Web Portal (React 19 + Vite + Tailwind 4) ├── PostFundManagement.ConsoleUI/ # Internal Staff & Admin Web Portal (React 19 + Vite + Tailwind 4)
├── PostFundManagement.PartnerUI/ # External Grantee / Recipient Portal (React 19 + Vite + WebGL OGL) ├── PostFundManagement.PartnerUI/ # External Grantee / Recipient Portal (React 19 + Vite + WebGL OGL)
├── Architecture.md # System Architecture, Security, RBAC, Caching & Quartz Spec ├── PostFundManagement.ShowcaseUI/ # Public-Facing Product Experience Showcase Portal (React 19 + Vite + Tailwind 4)
├── Processes.md # Operational Grant Lifecycle, Maker-Checker & Background Workflows ├── Documentation/ # System Architecture, Operational Manuals, Marketing & Screenshots
│ ├── Architecture.md # System Architecture, Security, RBAC, Caching, MCP & Quartz Spec
│ ├── Processes.md # Operational Grant Lifecycle, Maker-Checker & Background Workflows
│ ├── Marketing/ # Campaign Decks & Marketing Posters
│ └── Screenshots/ # Backoffice (ConsoleUI) & Partner Portal Screenshots
├── GEMINI.md # Master Technical & Architecture Roadmap (SRS v2.0 Alignment) ├── GEMINI.md # Master Technical & Architecture Roadmap (SRS v2.0 Alignment)
└── docker-compose.yml # Container orchestration for API and Frontends └── docker-compose.yml # Container orchestration for API and Frontends
``` ```
@@ -179,6 +187,9 @@ yarn install
yarn dev yarn dev
``` ```
## 📄 License ## 📄 License & Legal Notice
Internal Proprietary Software — All rights reserved. Internal Proprietary Software — All rights reserved.
Copyright (c) 2026 **Lite Charms (PTY) Ltd** / **Ifri Technologies**.
This software and its associated documentation are the proprietary property of **Lite Charms (PTY) Ltd**. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**. **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, system architecture, and maintenance of the Post-Fund Management (PFM) Platform. Unauthorized copying, distribution, or modification via any medium is strictly prohibited.