FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

FINERACT-2757: modular design developer documentation - #6315

Merged
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation
Aug 24, 2026
Merged

FINERACT-2757: modular design developer documentation#6315
vidakovic merged 5 commits into
apache:developfrom
mansi75:FINERACT-2757-modular-design-developer-documentation

Conversation

@mansi75

Copy link
Copy Markdown
Contributor

Description

This PR adds developer documentation and supporting architecture analysis for cross-feature boundary violations in Apache Fineract as part of FINERACT-2757.

The documentation provides a measured view of dependencies between Fineract features and packages and explains how those dependencies can be progressively reduced as Fineract moves towards stronger module boundaries and an event-driven architecture.

Instead of relying only on package naming conventions or manual analysis, the architecture metrics are generated from compiled bytecode through the Gradle build. The analysis produces both a package-level view, which acts as the ground truth without making feature-grouping assumptions, and a feature-level view that makes the dependency structure easier to understand and document.

The documentation also distinguishes between different forms of coupling — compile-time, database, infrastructure, and runtime/transactional coupling — so that removing a Java dependency is not incorrectly treated as removing the underlying domain or data relationship.

Changes in this PR:

  • Add fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc containing the cross-feature boundary violation analysis and developer guidance.
  • Add a reproducible architecture metrics pipeline based on io.github.usekylis.java-architecture-metrics.
  • Run the architecture analysis as a single aggregate scan across Java modules so cross-module dependencies are retained.
  • Generate both package-level and feature-level architecture reports.
  • Add a feature classifier for producing the higher-level feature dependency view.
  • Add tools/archmetrics_to_vega.py for transforming generated architecture metrics into documentation data and Vega-Lite visualisations.
  • Add Vega-Lite visualisations for:
    • Abstractness vs Instability.
    • Distance from the Main Sequence.
    • Cross-feature dependency matrix.
  • Add fineract-doc/src/docs/en/chapters/architecture/generated-package-overview.adoc, providing a generated section for each measured package and a consistent location for future architectural analysis.
  • Add worked case studies covering different levels of cross-feature coupling and possible remediation approaches.
  • Add guidance for deciding which feature dependencies are appropriate candidates for decoupling.
  • Add documentation describing how cleaned module boundaries can be protected from regression.

The architecture metrics, generated documentation, and diagram data can be regenerated using:

./gradlew architectureMetricsReport

This PR primarily adds developer documentation and architecture-analysis tooling. There are no REST API, database schema, or externally visible behavioural changes.

Related JIRA: https://issues.apache.org/jira/browse/FINERACT-2757

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made. — N/A: this PR adds developer documentation and architecture-analysis/build tooling rather than application behaviour. The generated architecture reports and documentation are produced through the Gradle architecture metrics task.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes — N/A: no API changes.
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

CopilotAI lite review requested due to automatic review settings August 24, 2026 07:26

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a reproducible architecture-metrics pipeline (generated from compiled bytecode via Gradle) and accompanying developer documentation/visualisations to analyze and explain cross-feature boundary violations as part of FINERACT-2757.

Changes:

  • Introduces Gradle-based architecture metrics reporting (package-level and feature-level), plus tasks to regenerate documentation artifacts.
  • Adds a Python transformer to turn the generated metrics JSON into Vega-Lite specs and an AsciiDoc “skeleton” reference.
  • Adds extensive architecture documentation and commits the generated Vega-Lite diagram specifications used by the docs.

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
tools/archmetrics_to_vega.pyNew CLI tool to transform architecture metrics JSON into Vega-Lite specs and generate AsciiDoc skeleton sections.
fineract-doc/src/docs/en/diagrams/main-sequence.vl.jsonAdds a generated Vega-Lite spec for abstractness vs instability visualisation.
fineract-doc/src/docs/en/diagrams/distance-ranking.vl.jsonAdds a generated Vega-Lite spec for distance ranking visualisation.
fineract-doc/src/docs/en/diagrams/cross-feature-matrix.vl.jsonAdds a generated Vega-Lite spec for the cross-feature dependency matrix.
fineract-doc/src/docs/en/chapters/architecture/index.adocWires the new cross-feature boundary violations chapter into the architecture docs index.
fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adocAdds the new detailed chapter describing CFVs, measurements, case studies, and regeneration guidance.
build.gradleAdds and configures the java-architecture-metrics plugin plus aggregate/reporting/regen tasks to produce reports and docs artifacts.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadtools/archmetrics_to_vega.py Outdated
@mansi75mansi75 changed the title Fineract 2757 modular design developer documentationFineract 2757: modular design developer documentationAug 24, 2026
@mansi75mansi75 changed the title Fineract 2757: modular design developer documentationFINERACT-2757: modular design developer documentationAug 24, 2026
@mansi75
mansi75force-pushed the FINERACT-2757-modular-design-developer-documentation branch from 7c842d6 to bfe89cbCompareAugust 24, 2026 11:29

@vidakovicvidakovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@vidakovic
vidakovic merged commit 901bf96 into apache:developAug 24, 2026
91 checks passed
@meonkeys

Copy link
Copy Markdown
Contributor

Why do all the text lines in fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc wrap at ~85 characters? We use :hardbreaks: so each newline in the source forces a "carriage return", breaking automatic right margin during rendering for everything in the "Cross-Feature Boundary Violations" chapter.

Please take a look at fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc vs. fineract-doc/src/docs/en/chapters/architecture/cross-feature-boundary-violations.adoc... we want all the asciidoc to use long lines and to let Asciidoctor handle line wrapping in PDF output and the browser to handle line wrapping in HTML output. Or we need to stop using :hardbreaks:, but I'm guessing that's more work.

:hardbreaks: is configured in fineract-doc/src/docs/en/config.adoc and documented in Hard Line Breaks.

See FINERACT-2795

meonkeys added a commit to apache/fineract-site that referenced this pull request Aug 31, 2026
docs built with `./gradlew asciidoctor` from apache/fineract@ef8ae79
change made with `fineract-site docs`
Rebuilt so soon after 8120910 because I noticed that build was missing a couple Vega-Lite diagrams... I built locally and ignored these messages:
> Task :fineract-doc:asciidoctor
Failed to generate image: Could not find the 'vg2svg' executable in PATH; add it to the PATH or specify its location using the 'vg2svg' document attribute :: ../../../build/generated/diagrams/main-sequence.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/main-sequence.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/distance-ranking.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/distance-ranking.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
Failed to generate image: no implicit conversion of nil into String :: ../../../build/generated/diagrams/cross-feature-matrix.vl.json :: /home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams//home/adamm/git/apache/fineract/fineract-doc/build/generated/diagrams/cross-feature-matrix.vl.json:0 (uri:classloader:/gems/asciidoctor-2.0.18/lib/asciidoctor/parser.rb:build_block)
And under "Abstractness against instability, with the main sequence" I missed the raw JSON with "Failed to generate image: Could not find the 'vl2vg' executable in PATH; add it to the PATH or specify its location using the 'vl2vg' document attribute".
Note: Today I also wrote apache/fineract#6315 (comment) and filed https://issues.apache.org/jira/browse/FINERACT-2795 .
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@mansi75@meonkeys@vidakovic