Read the checked-in skill for the task at hand. Installation is optional for reading these files; see Work with AI for native skill discovery.
| Task | Guidance |
|---|---|
| Run, write, or debug Playwright E2E tests | e2e-pr-check |
| Diagnose failed, stuck, or missing CI checks | ci-triage |
| Change server Java or investigate an architecture violation | server-arch-gates |
| Change a database schema or fix a failing changeset | liquibase-migration |
| Change Angular application or TUM UI code | client-conventions |
| Write or debug JUnit or Vitest tests | write-tests |
| Set up, build, or troubleshoot the local application | local-setup |
Read the relevant guideline for a rule-governed change. Keep procedures in the matching skill. When changing a convention, update its skill and supporting documentation in the same change.
These are Artemis-specific rules. The linked guidelines give reasons and exceptions; the skills give procedures.
- Transactions belong in repositories, not services or controllers. Do not use
@Transactional,TransactionTemplateorPlatformTransactionManagerthere. server development - Do not keep
EntityManagerorEntityManagerFactoryfields in production code. Use Spring Data repositories; raw JDBC access is limited tocore.config. server development - Do not use
FetchType.EAGERfor@OneToOne,@OneToManyor@ManyToMany. Explicitly set@OneToOneto LAZY; do not growFIELDS_ALLOWED_TO_FETCH_EAGERLY. database - Do not fetch a lazy configuration through its parent entity, even with
@EntityGraphorJOIN FETCH. A dependent configuration keeps the parent's key; the parent has no inverse@OneToOnefield. Read it through its own repository. database - Do not add
@Lobor Hibernate second-level@Cache. Use Spring caching only with explicit eviction. database · caching - Cross-node state goes through
DistributedDataProvider, never direct Hazelcast or Redis access. UsegetExpiringMap(name, ttl)for entries with a lifetime. distributed data - Specify a locale for Java case conversion, including in tests. Use
Locale.ROOTfor machine values; keepLocale.ENGLISHonly where the same login convention already applies. server development - Jackson 3 uses
tools.jackson; annotations remaincom.fasterxml.jackson.annotation. Inject the configuredJsonMapperin Spring beans; see the REST API guideline for other contexts.
- Use signal APIs.
@Input,@Output,@ViewChild,@ViewChildren,@ContentChildand@ContentChildrenare banned in application and test support code;ngOnChangesis banned. client development - Use
@if,@forand@switch, not structural directives. client development - In production client TypeScript, do not copy objects with spread,
Object.assignorstructuredClone; use the repository's deep-clone helpers. Array spread and object rest are allowed. client development - Use TUM UI and Tailwind. Do not add Bootstrap or ng-bootstrap. If TUM UI lacks a reusable feature, extend it; use PrimeNG only if that cannot reasonably be done in the same change, and explain the fallback in the PR. TUM UI
- Use semantic colour tokens, not primitive colours, Bootstrap classes or hand-written PrimeNG root classes. client theming
- Remove unreachable code, even when its only user is its own test. Required checks run on every
PR:
python3 supporting_scripts/check_dead_code.pyandpnpm run dead-code:client. dead code - Use client and server, not "frontend" or "backend". Use provider for a swappable distributed-data implementation and adapter for its glue. This also applies to commit messages and PR text. terminology
- The server uses Spring Boot 4.1 and Java 25; the client uses Angular 22. Use the Gradle wrapper,
Node 24, and the pnpm version pinned in
package.json(corepack enable). Exact versions live ingradle.properties,pnpm-workspace.yaml, andpackage.json. - Server features live under
src/main/java/de/tum/cit/aet/artemis/; the Angular application is undersrc/main/webapp/app/. Keep reusable TUM UI components inpackages/tum-ui, with no imports from the Artemis application. Client tests are co-located; server tests are insrc/test/java, Playwright tests insrc/test/playwright. src/main/webapp/app/openapi/is generated client code. Change the API source/generation input rather than hand-editing generated output.- Before starting or stopping local services, identify the environment and who owns it. The E2E runners can kill processes on ports 8080, 9000 and 7921. Reuse a suitable running environment; do not stop unrelated services or run mutating tests against production.
- User-facing documentation belongs in
documentation/docs/, grouped by audience. Tool-local READMEs stay beside their tools. Do not create a top-leveldocs/directory. - When writing documentation, follow the documentation guideline. Register new pages in the matching sidebar and link them from related pages.
- Do not commit plans, design specs or scratch notes. Keep working notes in the issue or PR; maintained documentation belongs on the documentation site.
- For Playwright locators, use
data-testidfirst; never use styling classes. See E2E testing andwrite-tests. - Do not edit
src/main/webappduring an E2E run; hot reload can invalidate the test. pnpm run vitest:run -- <path>runs the whole suite. Usepnpm exec vitest run <path>for one file. See write-tests for the other test commands.
- Target
develop; rebase to reduce noise. FollowCONTRIBUTING.mdand the guidelines indocumentation/docs/developer/guidelines/. Use.github/PULL_REQUEST_TEMPLATE.md, including the problem and solution, linked issue when applicable, checks run, screenshots for UI changes and documentation updates when relevant. - PR titles use a backticked module followed by a colon, e.g.
`Development`: Improve documentation. Allowed modules and the exact pattern are in.github/workflows/validate-pr-title.yml. Do not infer the format from squash-merge subjects, which omit the backticks. - Commit subjects are concise and imperative, without backticks; wrap bodies near 72 characters.