Purpose of this file: Guide AI agents (and human contributors) working on this codebase with the context, conventions, constraints, and patterns needed to make safe and consistent changes. Update this file whenever a significant architectural decision is made or project conventions change.
The governance model for this project follows a strict top-down traceability chain:
PRD (docs/prd.md)
└── Features (.github/ISSUE_TEMPLATE/feature.yml)
└── Stories (.github/ISSUE_TEMPLATE/story.yml)
└── Tasks (.github/ISSUE_TEMPLATE/task.yml)
└── Implementation (code, PRs)
- PRD defines product vision, user personas, and business objectives.
- Features group related Stories under a named, user-visible capability. A Feature references one or more requirement IDs and describes the high-level scope.
- Stories describe user-facing workflows derived from a Feature. Each Story references a parent Feature and one or more requirement IDs.
- Tasks are concrete technical work items derived from a Story.
- Implementation traces back through Tasks → Stories → Features → Requirements → PRD.
All requirements must follow the domain-based ID structure:
<DOMAIN>-<TYPE>-<NN>
Where:
- DOMAIN --- functional area (e.g.
API,PROJECT,SAMPLE,MEASUREMENT,DATA,FAIR,CARE,QUALITY,LAB,AUTH,USER,COMM) - TYPE --- requirement type:
R= Functional requirement (system capability)NFR= Non-functional requirement (quality attribute)C= Constraint (solution boundary)
- NN --- sequential number per domain and type (e.g.
01,02,03)
API-R-01
API-NFR-01
API-C-01
SAMPLE-R-02
FAIR-NFR-01
LAB-C-01
- IDs must be stable and must never be renumbered.
- IDs must not encode sprint numbers, versions, or document order.
- One requirement may be referenced by multiple stories.
- A story may reference multiple requirement IDs when a single user workflow spans multiple requirements. If a story spans more than two domains, consider splitting it.
- Constraints (
C) influence architecture and must not be referenced in Stories. ReferenceC-<NN>IDs only in Task Technical Notes. - The sequential number
<NN>must be zero-padded to exactly two digits (e.g.,01,02,10). IDs without zero-padding are invalid (e.g.,1,010).
Features are identified using a short, human-readable slug:
FEAT-<SLUG>
Where:
- SLUG --- a concise, uppercase, hyphen-separated identifier describing the user-visible capability (e.g.,
FEAT-SAMPLE-REGISTRATION,FEAT-FAIR-EXPORT,FEAT-USER-AUTH).
FEAT-SAMPLE-REGISTRATION
FEAT-FAIR-EXPORT
FEAT-USER-AUTH
FEAT-MEASUREMENT-UPLOAD
- Feature slugs must be unique across the project.
- Feature slugs must be stable; do not rename a Feature once Stories reference it.
- A Feature must reference at least one requirement ID (
R-<NN>orNFR-<NN>). - Constraints (
C-<NN>) must not be used as the sole reference in a Feature — they may appear in Feature notes but Features must cite at least oneRorNFRID. - One Feature may group multiple Stories across different domains, provided the Stories share a coherent user-visible purpose.
All requirements must be documented in docs/requirements.md.
Each requirement must contain:
- ID
- Statement --- clear, capability-level description
- Rationale --- why this requirement exists (strategic, regulatory, stakeholder-driven)
- Source (optional but recommended) --- link to:
- PRD section
- FAIR / CARE principle
- Regulatory document
- Stakeholder request
- ADR
API-R-01 The system shall provide authenticated API access to project metadata.
Rationale:
Enables integration with partner laboratories and automated analysis pipelines.
Source:
PRD §2.3 Partner Integration
When creating issues, use the correct template for the scenario.
Use when creating issues for a named, user-visible capability that groups multiple related Stories.
Required fields:
- Feature ID
- A unique
FEAT-<SLUG>identifier (e.g.,FEAT-SAMPLE-REGISTRATION)
- A unique
- Requirement IDs
- At least one
R-<NN>orNFR-<NN>reference
- At least one
- Description
- High-level summary of the user-visible capability
- Scope / Boundaries
- What is in scope and what is explicitly out of scope for this Feature
Rules:
- A Feature must be created before any Story references it.
- A Feature slug must be unique and stable — do not rename it once Stories reference it.
- Features must not reference Constraint IDs (
C-<NN>) as their sole requirement references. - One Feature may span multiple domains if the user-visible capability is coherent.
Use when creating issues for user-facing functionality derived from the PRD or requirements.
Required fields:
- Parent Feature
- Link to the parent Feature issue (e.g.
#101)
- Link to the parent Feature issue (e.g.
- Requirement IDs
- At least one
R-<NN>reference - May include related
NFR-<NN>
- At least one
- User Story Written as: > As a
<role>, I want<goal>, so that<benefit>. - Acceptance Criteria One or more testable conditions in Given / When / Then format.
Rules:
- Stories describe value and workflow context.
- Stories must reference a parent Feature. Create the Feature first if one does not exist.
- Stories must not introduce new system capabilities not covered by an existing requirement.
- If new capability is needed, update
docs/requirements.mdfirst. A change introduces new capability if it enables a user or system to perform an action that was not previously possible, or if it changes the externally observable behavior of an existing capability in a way not described by any existing requirement.
Use when creating issues for concrete technical implementation work derived from, and linked to, a story.
Required fields:
- Parent Story
- Link to the parent story issue (e.g.
#123)
- Link to the parent story issue (e.g.
- Requirement IDs
- At least one
R-<NN>orNFR-<NN>reference
- At least one
- Description
- What needs to be implemented
- Technical Notes (optional)
- Design hints
- Constraints (
C-<NN>) - Related ADRs
Rules:
- Tasks must not redefine acceptance criteria.
- Tasks must not expand requirement scope.
- A Feature must be created before any Story references it. Create the Feature first.
- A Story must always reference a parent Feature. Never create a Story without a parent Feature issue.
- A Task must always be preceded by a Story. Create the Story first, then create the Task referencing it.
- Never create a Task without a parent Story issue.
- If no parent Feature exists for a piece of work (e.g., when acting on a direct implementation request), create the Feature first, then the Story, then the Task.
- A single Story may have multiple Tasks; a Task must not span multiple Stories.
- Every Story must reference at least one functional requirement ID (
R-<NN>). - Every Story must reference a parent Feature issue.
- Every Task must reference:
- A parent Story
- At least one requirement ID
- Every PR must:
- Reference the issue it implements
- List the requirement IDs addressed
- If implementation changes behavior:
- Update the corresponding requirement
- Or explicitly justify why no requirement update is needed
When editing requirements:
- Use a Pull Request.
- Include a changelog entry in the PR description summarizing:
- Added / Modified / Removed requirement IDs
- Reason for change
- Stakeholder or source reference (if applicable)
Agent rule — requirement changes require human approval: Before modifying docs/requirements.md, an agent must: (1) pause and confirm the change with a human reviewer (see Section 12); (2) create a dedicated PR for the requirement change alone — do not bundle requirement changes with implementation changes; (3) include the mandatory changelog entry in the PR description per the rules above.
When editing or retiring a Feature:
- Use a Pull Request.
- Include a changelog entry in the PR description summarizing:
- Added / Modified / Retired Feature IDs
- Reason for change
- Impact on dependent Stories (list affected Story issues)
Agent rule — Feature slug changes require human approval: A Feature slug must never be renamed once Stories reference it. Before retiring or splitting a Feature, an agent must: (1) pause and confirm with a human reviewer; (2) list all Story issues that reference the Feature in the PR description; (3) update Story issues to reference the replacement Feature if applicable.
Data Manager is a web-based, multi-omics research data management platform developed by QBiC (Quantitative Biology Center) at the University of Tübingen. It enables FAIR-compliant (Findable, Accessible, Interoperable, Reusable) data access for the biomedical life sciences.
Version: 1.11.0
License: AGPL-3.0-or-later
Repository: https://github.com/qbicsoftware/data-manager-app
DOI: 10.5281/zenodo.10371779
- Multi-user project management for omics research (NGS, proteomics, etc.)
- Experimental design: experiments, experimental groups, variables, confounding variables
- Sample registration and batch management (with OpenBIS integration)
- Measurement metadata management (NGS + proteomics)
- Raw data file tracking and download
- FAIR data export (RO-Crate format support)
- User identity management: local credentials, ORCID OAuth2 login
- Role-based access control (Spring Security ACL)
- Financial/offer tracking (purchase offers linked to projects)
- Notifications, announcements, email confirmations, password reset
- Background job processing (JobRunr)
- Ontology/terminology lookup (TIB Terminology Service, OpenBIS vocabularies)
- Organisation lookup (ROR API)
- Personal access tokens for API use
| Layer | Technology |
|---|---|
| Language | Java 21 (primary), Groovy 4.x (Groovy sources + Spock tests) |
| Build | Maven (multi-module, Maven Wrapper mvnw) |
| Framework | Spring Boot 3.5.x |
| UI Framework | Vaadin 24.9 (server-side Java + Flow; CSS theme: datamanager) |
| Frontend build | Vite (via Vaadin Maven plugin) |
| Security | Spring Security, Spring Security ACL, OAuth2 client (ORCID) |
| Persistence | Spring Data JPA + Hibernate; MariaDB/MySQL driver |
| Messaging | Apache ActiveMQ Artemis (JMS, pub-sub) |
| Background Jobs | JobRunr 7.x (with its own dashboard on port 8000) |
| Caching | EHCache 3 (via JCache/JSR-107) |
| Distributed Lock | ShedLock |
| File Processing | Apache POI (XLSX/XLS), docx4j (DOCX), Apache Commons IO |
| Testing | Spock Framework 2.4 (Groovy), JUnit 5, Spring Boot Test |
| Code Quality | SonarCloud, Google Java Style (GoogleStyle.xml) |
| Security Tooling | sigstore/cosign (artifact signing), CycloneDX SBOM, PGP verify |
| Secret Storage | Custom PKCS12 keystore vault (AES encryption) |
| External Services | OpenBIS (data repository), TIB Terminology Service, ORCID API, ROR API |
This is a Maven multi-module project. The root pom.xml declares all modules:
data-manager-app/
├── datamanager-bom/ # Bill of Materials — all dependency versions live here
├── datamanager-app/ # ⭐ Deployable Spring Boot + Vaadin application (runnable JAR)
│ ├── frontend/ # CSS themes (themes/datamanager/), JavaScript, Vite config
│ └── src/main/java/life/qbic/datamanager/
│ ├── views/ # Vaadin @Route views (UI layer)
│ │ ├── projects/ # Project, experiment, sample, measurement, rawdata views
│ │ ├── account/ # User profile, personal access tokens
│ │ ├── login/ # Login, password reset
│ │ ├── register/ # User registration, ORCID registration, email confirmation
│ │ ├── general/ # Shared dialog, grid, upload, download, notification components
│ │ └── navigation/ # Side navigation component
│ ├── security/ # Spring Security config, OIDC user details
│ ├── files/ # File parsing (XLSX, TSV), export, download logic
│ ├── configuration/ # Spring @Configuration beans
│ └── exceptionhandling/ # Vaadin error/not-found pages
├── domain-concept/ # Core DDD building blocks: DomainEvent, EventStore, Dispatcher
├── application-commons/ # Shared Result/Error types, common utilities
├── logging/ # QBiC logging facade (wraps SLF4J/Logback)
├── broadcasting/ # Integration event infrastructure (Artemis/JMS)
├── identity/ # Identity bounded context — domain layer
│ └── src/main/java/life/qbic/identity/
│ ├── domain/ # User aggregate, token model, domain events, policies
│ └── application/ # User registration, password reset, token services
├── identity-api/ # Identity context — shared API interfaces (anti-corruption)
├── identity-infrastructure/ # Identity JPA repositories, token store
├── project-management/ # Project management bounded context — domain + application layer
│ └── src/main/java/life/qbic/projectmanagement/
│ ├── domain/model/ # Project, Experiment, Sample, Measurement, Batch aggregates
│ ├── domain/service/ # Domain services
│ ├── application/ # Application services (AsyncProjectService, measurement, sample…)
│ └── application/api/ # AsyncProjectService API + FAIR/RO-Crate support
├── project-management-infrastructure/ # JPA repos, OpenBIS connector, Artemis consumer, template generation
├── finances/ # Finances bounded context — Offer domain model
├── finances-api/ # Finances API interfaces
├── finances-infrastructure/ # Finances JPA repositories
├── subscription-api/ # Subscription/notification API interfaces
└── subscription-provider/ # Email subscription provider (SMTP via Spring Mail)
Key architectural principle: Domain-Driven Design (DDD) with explicit bounded contexts
(identity, project-management, finances). Each context has a domain layer, an application layer (use-case services, orchestration), and an infrastructure
layer (JPA, external connectors). The datamanager-app module is the composition root.
- Java 21 (Zulu/OpenJDK)
- Maven (or use the included
./mvnwwrapper) - A running MariaDB or MySQL database
- A running Apache ActiveMQ Artemis broker
- An SMTP server for email
- A PKCS12 keystore for the vault (see
README.mdfor setup) - An OpenBIS instance for measurement data integration
# Build and run in development mode (mocks OpenBIS/TIB)
./mvnw spring-boot:run -pl datamanager-app -Pdevelopment
# Run all tests
./mvnw clean verify
# Production build (includes Vaadin frontend bundling)
./mvnw clean package -Pproduction
# Run the production JAR
java -jar datamanager-app/target/datamanager-app-1.11.0.jar| Profile | Purpose |
|---|---|
development |
Mocks external integrations (OpenBIS, TIB). Fastest for local dev. |
production |
Full Vaadin frontend build; no mocks. Required for deployment. |
sigcheck |
Enables PGP signature verification + CycloneDX SBOM generation. |
it |
Runs integration tests (starts/stops Spring Boot around test phase). |
DATAMANAGEMENT_DB_URL,
DATAMANAGEMENT_DB_USER_NAME,
DATAMANAGEMENT_DB_USER_PW
FINANCE_DB_URL,
FINANCE_DB_USER_NAME,
FINANCE_DB_USER_PW
MAIL_HOST, MAIL_PORT,
MAIL_USERNAME,
MAIL_PASSWORD
ARTEMIS_MODE,
ARTEMIS_BROKER_URL,
ARTEMIS_USER,
ARTEMIS_PASSWORD
DATAMANAGER_VAULT_KEY,
DATAMANAGER_VAULT_PATH,
DATAMANAGER_VAULT_ENTRY_PASSWORD
See README.md and datamanager-app/src/main/resources/application.properties for the full
reference, including ORCID OAuth, OpenBIS, TIB, and ROR configuration.
- Google Java Style Guide — the
GoogleStyle.xml(IntelliJ) and.prettierrc.jsenforce formatting. Always run the formatter before committing. - Package root:
life.qbic - Language: Java 21 for all production code. Groovy (4.x) is acceptable for tests only (Spock).
- Aggregates live in
domain/model/packages. They emit domain events extendingDomainEvent(fromdomain-concept). - Application services orchestrate domain objects and live in
application/. They must not depend on infrastructure (JPA, HTTP) directly — use interfaces/ports. - Infrastructure implementations belong in the corresponding
*-infrastructuremodule. - Do not bypass bounded context APIs — the
identity-apiandfinances-apimodules provide the contracts. Other contexts must talk through these, not directly to the domain model.
Follow the guidelines in ExceptionHandling.md. Specifically:
- Never swallow exceptions silently (no empty catch blocks, no
printStackTrace()without logging). - Never log-and-rethrow the same exception — this pollutes logs.
- Do not use exceptions as control flow. Return
Resulttypes (fromapplication-commons) for expected failure paths. - Throw early, handle late — prefer failing fast before mutating state.
- Checked exceptions should be wrapped in unchecked exceptions at infrastructure boundaries; do not leak implementation details to callers.
- Vaadin global exception handlers (
UiExceptionHandler,ErrorPage,ExceptionErrorPage) are the safety net — they must never be removed.
Follow the patterns in service_api.md:
- Use
Mono<T>/Flux<T>(Project Reactor) forAsyncProjectServiceoperations. - Request/response objects carry a
requestId(correlation ID) and the resource identifier. - Partial updates are supported — provide the smallest meaningful information unit.
- Deletions pass both the parent resource ID and the sub-resource ID.
- Unit tests: Spock
*Spec.groovyfiles insrc/test/groovy. Prefer Spock for new tests. - Integration tests:
*IT.javaor*IT.groovy, run under theitMaven profile. - Test classes match exactly
**/*Spec.classor**/*Test.class(configured inmaven-surefire-plugin). - Do not use
@SpringBootTestfor pure domain/application layer unit tests — keep them fast and framework-free.
- Views are server-side Java classes annotated with
@Route. - Custom reusable dialog components follow the
AppDialog/StepperDialogpattern documented indatamanager-app/front-end-components.md. - CSS theme files live in
frontend/themes/datamanager/components/. - Vaadin components must not be used in domain or application layer classes.
- The UI design system lives in a separate repository: https://github.com/qbicsoftware/data-manager-app-design-system
- Local username/password — users register via
/register, confirm via email token. - ORCID OAuth2 — users can log in or link their ORCID via
/register/oidc. - Application access tokens — stored encrypted in the vault; used for programmatic API access.
- Domain events are dispatched via
DomainEventDispatcher(in-process) within a bounded context. - Cross-context integration events are published/consumed via ActiveMQ Artemis (JMS pub-sub).
The Artemis topic for identity events is configured under
qbic.broadcasting.identity.topic. - The
broadcastingmodule provides the integration event infrastructure.
- The
syncpackage inproject-managementhandles background synchronisation of measurement data from external repositories. - ShedLock prevents duplicate execution in multi-instance deployments.
- JobRunr is used for scheduled background jobs (dashboard on port 8000 by default).
- Sample and measurement metadata can be bulk-uploaded as XLSX or TSV files.
- The
files/parsing/package handles parsing;files/structure/defines the expected schemas. - Downloads are served via
DownloadProvider(Vaadin stream resource pattern).
- Projects can be exported as RO-Crate bundles (see
docs/fair/research-objects.md). - The
ROCreateBuilderandRoCrateFactoryinproject-management-infrastructureproduce crate metadata. Thero-crate-javalibrary (1.1.1) is used.
- Main branches:
development(integration) →main(production/releases). - Feature branches: named
feature/* - Bug fix branches: named
fix/*orhotfix/* - Chore/docs/refactor branches: named
chore/*,docs/*,ci/*,refactor/* - Labels are applied automatically by
.github/labeler.yml. - Releases are created via the
create-release.ymlworkflow (manual trigger with a semantic version tag). This bumps POM versions across all modules, builds the production JAR, publishes to QBiC Nexus, generates SLSA provenance, and opens a version-bump PR againstmain. - Snapshot builds are published from
developmentvianexus-publish-snapshots.yml. - All artifacts are signed with sigstore/cosign (OIDC-based). Verify with:
cosign verify-blob --bundle <artifact>.jar.sigstore.json \ --certificate-oidc-issuer https://token.actions.githubusercontent.com \ --certificate-identity '<workflow-url>@refs/heads/development' \ <artifact>.jar
| Workflow | Trigger | What it does |
|---|---|---|
build_package.yml |
Push to any branch | mvn package build check |
run_tests.yml |
Push to any branch | mvn clean verify (unit tests) |
sonarcloud.yml |
Push/PR to development, main |
SonarCloud static analysis |
codeql-analysis.yml |
Scheduled / PR | CodeQL security scan |
nexus-publish-snapshots.yml |
Push to development |
Publish SNAPSHOT to QBiC Nexus |
create-release.yml |
Manual (workflow_dispatch) |
Full release build + publish + sign |
test-version-commit.yml |
Various | Version consistency tests |
label-pull-requests.yml |
PR opened/edited | Auto-label PRs |
label_new_issues.yml |
Issue opened | Auto-label issues |
inactive_issue_handling.yml |
Scheduled | Close stale issues |
SonarCloud dashboard: https://sonarcloud.io/project/overview?id=qbicsoftware_data-manager-app
Quality gate thresholds are enforced on PRs to development and main.
- Engine: MariaDB / MySQL (utf8mb4_unicode_ci)
- Schema: Defined in
sql/complete-schema.sql(DDL only — apply manually or via migration tool). - Default data:
sql/insert-default-values.sql(roles, permissions, ACL class entries). - DDL auto-update is controlled via
DATAMANAGEMENT_DB_DDL_AUTO/FINANCE_DB_DDL_AUTO(default:none— do not rely on Hibernate to manage schema in production). - There are two separate datasources:
data-management(main app data) andfinance(offers/purchases). Each has its own JPA entity manager. - Spring Security ACL tables (
acl_class,acl_sid,acl_object_identity,acl_entry) are present in the schema. Do not drop or modify these without understanding ACL implications. - Key SQL views:
project_overview,project_measurements,project_userinfo,v_ngs_measurement_sample_json,v_pxp_measurement_sample_json.
- Do not commit secrets. All secrets are injected via environment variables or the PKCS12 vault. Never hardcode credentials, tokens, or passwords.
- The vault requires a password with entropy > 100 bits (enforced at startup).
- Do not downgrade Spring Security, Spring Boot, or Vaadin versions without careful review — this
project has explicit PGP signature verification on transitive dependencies (
sigcheckprofile). - Stack traces must never be exposed to end users — the
UiExceptionHandlerand Vaadin error pages are the safety net. Do not remove or weaken them. - Personal access tokens are stored encrypted in the database. The encryption key comes from the vault.
- ORCID OAuth client credentials (
ORCID_CLIENT_ID,ORCID_CLIENT_SECRET) must be kept secret.
When working on this codebase, an AI agent should:
- Check
docs/requirements.mdto confirm the change is covered by an existing requirement. If the change introduces new system capability not covered by any existing requirement, updatedocs/requirements.mdfirst (see "Requirements and Issue Governance"). Ifdocs/requirements.mddoes not exist, do not create it — pause and notify a human reviewer. Then confirm a parent Feature issue exists before creating any Story or Task. - Identify the bounded context the change belongs to (
identity,project-management,finances, or cross-cutting). - Identify the layer (
domain,application,infrastructure,views/UI). - Check
ExceptionHandling.mdandservice_api.mdfor patterns relevant to the change. - Read existing tests in the same module before writing new code.
- Before creating a Story, confirm a parent Feature issue exists. If none exists, create the Feature first using
.github/ISSUE_TEMPLATE/feature.yml. - A Feature must reference at least one
R-<NN>orNFR-<NN>requirement ID. - Do not create a Feature whose sole requirement reference is a Constraint (
C-<NN>). - A Feature slug (
FEAT-<SLUG>) must be unique and must not be changed once Stories reference it. - If you are unsure whether a new Feature is needed or an existing Feature should be extended, pause and ask a human reviewer.
- New domain concepts go in
domain/model/of the relevant bounded context. - Emit
DomainEventsubclasses for significant state changes. - New aggregates need a corresponding JPA entity in the
*-infrastructuremodule and a repository interface in thedomain/repository/package (implemented in infrastructure). - Add Spock specs in
src/test/groovy/...matching the package of the class under test.
- New views need a
@Routeclass inviews/insidedatamanager-app. - Consult
front-end-components.mdfor dialog and component composition patterns. - Add the route to the side navigation if it should be accessible from the project navigation
(
ProjectSideNavigationComponent). - Do not import domain model classes directly in views — go through
applicationlayer services.
- New external service clients belong in the relevant
*-infrastructuremodule. - Add a configuration property block in
application.propertiesfollowing the existing naming convention (e.g.,qbic.external-service.<name>.<property>). - Mock the integration for the
developmentMaven profile so local dev does not require the external system.
- All third-party dependency versions must be declared in
datamanager-bom/pom.xml. - Do not add
<version>tags to dependencies in child modules — they must inherit from the BOM. - Check PGP signatures exist for new dependencies if adding them under the
sigcheckprofile.
An agent should pause and request human review/approval before:
- Adding or removing Maven modules.
- Changing or dropping database schema elements (tables, columns, views, constraints).
- Modifying Spring Security configuration (
SecurityConfiguration.java, ACL setup). - Changing the vault/keystore configuration or encryption logic.
- Bumping major versions of Vaadin, Spring Boot, or Spring Security.
- Adding new OAuth2 provider configurations.
- Modifying the release or snapshot CI workflows.
- Making changes that affect FAIR data export (RO-Crate output format).
- Changing the Artemis messaging topic names or JMS consumer configuration.
- Adding, modifying, or removing any entry in
docs/requirements.md. - Implementing a change that introduces new system capability not covered by an existing requirement.
- Retiring or renaming a Feature slug once Stories reference it.
- Splitting a Feature into multiple Features when Stories already reference the original Feature.
| File / Path | Purpose |
|---|---|
docs/requirements.md |
Authoritative requirement registry — all R/NFR/C requirements documented here; must be updated before new capabilities are implemented |
docs/requirements-guide.md |
Authoring conventions for creating, editing, and retiring requirements |
README.md |
Setup, configuration reference, how to run |
ExceptionHandling.md |
Exception handling conventions (read before touching error handling) |
service_api.md |
Service API design patterns (Mono/Flux, request/response shapes) |
datamanager-app/front-end-components.md |
UI component composition patterns |
docs/fair/research-objects.md |
FAIR/RO-Crate integration notes |
docs/processes/ |
Sequence diagrams (sample registration process) |
sql/complete-schema.sql |
Full database DDL |
sql/insert-default-values.sql |
Seed data (roles, permissions, ACL classes) |
datamanager-app/src/main/resources/application.properties |
Full application configuration with env var mappings |
datamanager-bom/pom.xml |
All dependency version pins |
.github/labeler.yml |
PR/branch labeling rules |
.github/ISSUE_TEMPLATE/feature.yml |
Issue template for named, user-visible capabilities (features) |
.github/ISSUE_TEMPLATE/story.yml |
Issue template for user-facing functionality (user stories) |
.github/ISSUE_TEMPLATE/task.yml |
Issue template for concrete technical implementation tasks |
.github/release.yml |
Release changelog categories |
GoogleStyle.xml |
IntelliJ Google Java Style formatter config |