From 3369b9a81c3665a34ce54dc66a63f341c2eb6f21 Mon Sep 17 00:00:00 2001 From: Wanja Krah Date: Tue, 3 Nov 2026 15:34:31 +0100 Subject: [PATCH 1/3] Record S6 production and NAS recovery acceptance [skip ci] --- docs/production-deployment.md | 22 +++ docs/s6-validation.md | 156 ++++++++++++++++-- ...6_deployment-gitea-action-to-production.md | 50 +++--- 3 files changed, 188 insertions(+), 40 deletions(-) rename specs/{in_progress => in_review}/S6_deployment-gitea-action-to-production.md (83%) diff --git a/docs/production-deployment.md b/docs/production-deployment.md index 6e8187a..0af1984 100644 --- a/docs/production-deployment.md +++ b/docs/production-deployment.md @@ -90,6 +90,28 @@ Docker-locatie en `DOCKER_CONFIG` in. Gebruik een eigen `docker-auth`-submap. Alleen de frontend bindt aan de private IPv4; de backend krijgt geen hostpoort. De Docker-projectnaam is vast `agiledancers-production`. +### DSM-firewall + +De bevestigde productieomgeving gebruikt frontendpoort **8088** op +`192.168.2.28` en Docker-subnet **172.18.0.0/16**. Maak in +**Configuratiescherm → Beveiliging → Firewall → Regels bewerken** toestaan-regels +op **Alle interfaces**, boven eventuele weigerregels: + +| Poort | Protocol | Bron | Actie | +| --- | --- | --- | --- | +| 8088 | TCP | `192.168.2.0`, masker `255.255.255.0` | Toestaan | +| 8080 | TCP | `172.18.0.0`, masker `255.255.0.0` | Toestaan | + +De eerste regel geeft LAN-clients toegang; de tweede laat de frontend de backend +bereiken. Voeg voor bestaande VPN-clients zo nodig hun eigen bron-subnet toe +aan de frontendregel. Er wordt geen backendpoort op de NAS gepubliceerd en de +firewall blijft aan. Controleer bij het opnieuw aanmaken van het Docker-netwerk +het werkelijke subnet met `docker network inspect` en pas de regel aan als dat +subnet wijzigt. Gewone deployments vervangen containers en behouden het netwerk. + +De tijdelijke S6-acceptatieregel voor `172.20.0.0/16` mag na de geïsoleerde tests +weg; dat testnetwerk en de testcontainers zijn opgeruimd. + Als Docker sudo vereist, laat een beheerder met `visudo` een afzonderlijke sudoers-regel installeren en valideren, met het gecontroleerde Docker-pad: diff --git a/docs/s6-validation.md b/docs/s6-validation.md index ca98216..88696f0 100644 --- a/docs/s6-validation.md +++ b/docs/s6-validation.md @@ -1,8 +1,9 @@ # S6 implementation and operational evidence -Status: IN_PROGRESS. Repository implementation and local validation do not yet -establish an operational Synology deployment. No production release tags have -been created by this implementation session. +Status: IN_REVIEW. Production `v1.0.0` is running on the Synology at +. Main publication, the real Gitea deployment and the +isolated NAS recovery/rollback acceptance checks passed. The evidence below +distinguishes real production actions from deliberately isolated fault tests. ## Confirmed environment @@ -88,9 +89,129 @@ Image publication is skipped for the feature branch. The subsequent evidence-only commit intentionally uses the accepted `[skip ci]` marker; implementation code is unchanged from this successful run. -Main build/publication and dispatched production/recovery evidence remain to be -collected after review and the protected merge. Review PR: -[S6 #12](http://192.168.2.28:3000/wanjakrah/agiledancers/pulls/12). +Implementation [PR #12](http://192.168.2.28:3000/wanjakrah/agiledancers/pulls/12) +was reviewed and merged through the protected main branch. Production and +post-merge acceptance evidence follow. + +## Production deployment and native workflow guards + +The main SHA is `b0d6592761cf3ceab6e1ffbf9ca50548584a0096`. + +| Evidence | Gitea run | Result | +| --- | --- | --- | +| Main build/test/publication | [#37](http://192.168.2.28:3000/wanjakrah/agiledancers/actions/runs/37), API ID 38 | Success | +| First manual `new` / `patch` release | [#38](http://192.168.2.28:3000/wanjakrah/agiledancers/actions/runs/38), API ID 39 | Success; production `v1.0.0` | +| Deliberate duplicate new release for the same SHA | [#39](http://192.168.2.28:3000/wanjakrah/agiledancers/actions/runs/39), API ID 40 | Expected rejection, production unchanged | +| Manual deployment from a temporary validation branch | [#40](http://192.168.2.28:3000/wanjakrah/agiledancers/actions/runs/40), API ID 41 | Expected skip, production unchanged | + +The original feature branch had been deleted after merge; its attempted dispatch +returned 404 and is not counted as branch-guard evidence. The actual skipped run +used `validation/s6-deploy-guard`, based on the existing documentation-only +`60496de` commit. That temporary branch was removed after verification. + +The real annotated Git tag `v1.0.0` has tag-object SHA +`0b8df86a9de1729395baad35584e4accead29c44` and points directly to the main SHA above. +Gitea tag protection rule ID **1**, pattern `v*`, allows only `wanjakrah` (the +account owning the dedicated release token) to create/delete release tags. +The helper never moves or deletes them; this does not remove the trusted +maintainer's administrative ability to manage tags. + +Production image digests, using the NAS-local `127.0.0.1:3000/wanjakrah/` registry: + +| Component | Deployed digest | +| --- | --- | +| Backend | `sha256:1d6f5e35bb58341bfa7b6ed0b88e5bdebced60666ca289d5511613f35d9ee92e` | +| Frontend | `sha256:843a1ffcdbe708573ca55f51a04adee0d158f255f067225a20c6d41b382ce295` | + +Both running containers report `v1.0.0` and the selected main SHA. Backend +readiness, frontend and proxied API checks passed in the workflow. A subsequent +read-only GET from the mini-pc to `http://192.168.2.28:8088/api/dance-schools` +returned HTTP success and `[]`. The successful state is recorded under +`releases/release-39-3b481acf-396d-41d6-96a6-6b7ef8710f18/`, with no pending +journal or deployment lock. As this is the first production release, its previous +successful production release is correctly `null`. + +### Firewall and diagnostics + +The initial readiness wait exposed an active DSM firewall blocking frontend-to- +backend traffic. The maintainer added these **All interfaces** allow rules above +deny rules: TCP **8088** from `192.168.2.0/24`, and TCP **8080** from the actual +production Docker subnet **172.18.0.0/16**. The same first deployment then passed; +there was no extra production version or forced bypass of readiness checks. + +Downloaded and opened the actual workflow diagnostic ZIPs: + +- `deployment-39-20261103135841995564629`: two files; recorded outcome `success`. +- `deployment-40-20261103141439174434089`: two files; recorded outcome `rejected`. + +Both workflows request fourteen-day artifact retention, within the previously +confirmed server retention limits. The ZIPs and run-view metadata are retained +locally in `ci/artifacts/deployment/live-workflows/`. The older Gitea artifact +list API limitation documented under S4 was avoided by downloading the actual +run-page artifact archives. + +## Isolated real NAS failure and rollback acceptance + +**Twelve checks passed against real NAS Docker containers**, using the production +`Release` coordinator and remote shell script. They used only project +`agiledancers-s6-acceptance`, loopback endpoint `127.0.0.1:18089` and network +`172.20.0.0/16`. State/configuration was isolated under +`/volume1/docker/agiledancers-s6-acceptance`, with `-first` and `-recovery` sibling +directories for first-release and failed-recovery cases. + +The adapter changed only the project/network/configuration namespace and injected +controlled faults. **Release tags and main-head selections in this test adapter +were virtual**: no additional real Git tags were created. Build verification and +image pulls used real Gitea/registry responses for verified main SHAs `b1544357...` +and `b0d65927...`. The missing-image case also used verified main SHA `c965f9b4...`. +Fault cases used a ten-second readiness window and healthy cases sixty seconds; +the production workflow retains its normal five-minute replacement bound. + +1. A healthy initial isolated release passed the real container/readiness checks. +2. A distinct candidate whose backend deliberately exited with status 23 failed; + the real previous image pair was restored, the attempt remained failed, and + its virtual version remained allocated. +3. Retrying the same version/SHA with a healthy configuration succeeded without + allocating another version. +4. Manual rollback restored the distinct previous SHA without another version; + a second rollback restored the newer successful release. +5. Retry of an older version after rollback was rejected by the high-watermark. +6. A real missing registry image was rejected before version allocation or + replacement. +7. An unverified SHA was rejected using real Gitea build metadata. +8. Duplicate and stale releases were rejected while running containers stayed + unchanged. +9. A competing NAS lock owner excluded a second release attempt. +10. An injected lost state-commit response retained the real pending journal and + lock, blocked the next attempt and was resolved with explicit manual recovery. +11. A real failed first release retained its journal/lock; manual stop/archive + recovery left no fabricated successful state. +12. Both a candidate and its recovery configuration were deliberately broken; + automatic recovery failed visibly and retained its journal/lock. Repairing + the retained previous configuration and following manual recovery restored + the recorded previous SHA. + +Raw program, logs and `results.json` are retained in +`ci/artifacts/deployment/nas-acceptance/`. The test stack's containers and Docker +network were removed. Test state/history remains for inspection. Final independent +verification confirmed that production still ran the original `v1.0.0` SHA, +without a pending journal or lock, and that no acceptance containers/network +remained. The maintainer was told the temporary firewall rule for `172.20.0.0/16` +can be removed; the two production rules must remain. + +These isolated tests prove the NAS replacement/recovery behavior, not a second +successful production release. Native Gitea rollback against a populated +production predecessor can be exercised after a normal subsequent release; +the same coordinator's actual distinct-version rollback is demonstrated above. + +## Data boundary + +The maintainer explicitly accepted redeployment data loss for the launching- +partner phase until S16 and confirmed the operator-communication policy during +refinement. The workflow and runbook display that limitation. No messages were +sent to the partner on the maintainer's behalf. S16 is not implemented, so saved- +data preservation and migration compatibility remain conditional S16 acceptance, +not a durability claim for this release. ## Required operational acceptance @@ -99,24 +220,25 @@ collected after review and the protected merge. Review PR: - [x] Verify pinned SSH hostkey, key-only automation and separate registry pull credential. Release-token read access is verified; actual tag-writing acceptance awaits the first release. -- [ ] Verify release-tag creation/protection with the dedicated token. -- [ ] Merge workflows through the protected-branch process and identify the +- [x] Verify release-tag creation/protection with the dedicated token. +- [x] Merge workflows through the protected-branch process and identify the successful main build/publication run and SHA. -- [ ] Demonstrate release form, first release tag and real Synology access; +- [x] Demonstrate release form, first release tag and real Synology access; record workflow URL, version, SHA and both deployed digests. -- [ ] Demonstrate rejected unverified/missing-image release and branch exclusion +- [x] Demonstrate rejected unverified/missing-image release and branch exclusion without modifying production. -- [ ] Demonstrate duplicate/stale/concurrent release protection, retained tags +- [x] Demonstrate duplicate/stale/concurrent release protection, retained versions after failure and exact-SHA retry without another version. -- [ ] Demonstrate failed candidate recovery while the workflow reports failure, +- [x] Demonstrate failed candidate recovery while the coordinator reports failure, with downloadable diagnostics. -- [ ] Demonstrate manual rollback without a new version and retained image pairs. -- [ ] Exercise first-release/recovery failure and interruption/manual recovery +- [x] Demonstrate manual rollback without a new version and retained image pairs. +- [x] Exercise first-release/recovery failure and interruption/manual recovery using isolated acceptance resources where appropriate. -- [ ] Confirm fourteen-day artifact retention. -- [ ] Confirm operator communication of the accepted pre-S16 data-loss policy. +- [x] Confirm fourteen-day artifact retention configuration and artifact downloads. +- [x] Confirm the maintainer's accepted pre-S16 data-loss/communication policy. - [ ] Once S16 applies, verify data preservation and migration compatibility - during deployment and rollback (conditional on S16 implementation). + during deployment and rollback (deferred until S16 implementation, not a + blocker for the explicitly accepted pre-S16 release). Identify isolated acceptance resources explicitly. Simulated tests are not real production evidence. diff --git a/specs/in_progress/S6_deployment-gitea-action-to-production.md b/specs/in_review/S6_deployment-gitea-action-to-production.md similarity index 83% rename from specs/in_progress/S6_deployment-gitea-action-to-production.md rename to specs/in_review/S6_deployment-gitea-action-to-production.md index b6779b6..a401792 100644 --- a/specs/in_progress/S6_deployment-gitea-action-to-production.md +++ b/specs/in_review/S6_deployment-gitea-action-to-production.md @@ -1,6 +1,6 @@ # S6 — Manual versioned production deployment through Gitea -Status: IN_PROGRESS +Status: IN_REVIEW Agreed after the grill-me interview; shared understanding confirmed. @@ -141,44 +141,48 @@ does not restore lost data. ## Acceptance criteria -- [ ] Successful main builds still automatically verify and publish matching SHA +- [x] Successful main builds still automatically verify and publish matching SHA images; publishing does not automatically change production. -- [ ] Gitea's manual workflow form provides new/retry mode and the appropriate +- [x] Gitea's manual workflow form provides new/retry mode and the appropriate release-type or existing-tag inputs; invalid combinations fail clearly. -- [ ] The first release and subsequent patch/minor/major releases allocate the +- [x] The first release and subsequent patch/minor/major releases allocate the agreed versions and immutable annotated remote Git tags on verified SHAs. -- [ ] Duplicate new releases, tag conflicts, concurrent attempts, stale main +- [x] Duplicate new releases, tag conflicts, concurrent attempts, stale main snapshots and older pending deployments cannot overwrite release identity or replace a newer successful release. -- [ ] An unverified release or missing image is rejected before production changes; +- [x] An unverified release or missing image is rejected before production changes; branch builds cannot deploy production. -- [ ] A real Synology deployment serves the frontend and proxied API over the +- [x] A real Synology deployment serves the frontend and proxied API over the private endpoint, with both containers running the selected image pair. -- [ ] Readiness, frontend, proxied read-only API and image-identity checks establish +- [x] Readiness, frontend, proxied read-only API and image-identity checks establish success within five minutes or trigger recovery. -- [ ] A deliberately failed release restores the previous successful version, +- [x] A deliberately failed release restores the previous successful version, while the workflow reports failure. Failed first deployment and failed recovery produce actionable diagnostics and manual recovery instructions. -- [ ] A failed release can be retried with its existing tag/SHA without allocating +- [x] A failed release can be retried with its existing tag/SHA without allocating another version or superseding a newer successful release. -- [ ] Manual rollback demonstrably restores the previous successful release with +- [x] Manual rollback demonstrably restores the previous successful release with no new version, and required retained images are available. -- [ ] The temporary pre-S16 data-loss policy is visible in workflow documentation +- [x] The temporary pre-S16 data-loss policy is visible in workflow documentation and the runbook. Once S16 applies, demonstrate saved data surviving both deployment and rollback, including the migration compatibility requirement. -- [ ] Server setup and operational recovery documentation are usable; diagnostics + The latter is conditional S16 acceptance and is not applicable yet. +- [x] Server setup and operational recovery documentation are usable; diagnostics and release outcomes are retained for fourteen days without secrets. -## Implementation handoff +## Implementation and evidence -This specification records the confirmed design. Implementing workflows, release -automation, Compose configuration, Synology provisioning and collecting actual -deployment/recovery evidence are subsequent work. Configuration alone does not +This specification records the confirmed design. The evidence combines automated +behavior tests, real Gitea production release/guard runs and isolated real NAS +fault tests. Their distinct scopes and the virtual-tag boundary of the isolated +tests are documented in `docs/s6-validation.md`. Configuration alone does not complete S6. -Implementation is in progress on `feature/S6_deployment`: workflows, Compose, -release/retry/rollback helpers, failure-path tests and provisioning/runbook are -provided. The dedicated NAS account, registry login and Gitea deployment secrets -are provisioned. Real image preparation passed without a release or container -replacement. See `docs/s6-validation.md`; workflow execution and production -deployment/recovery evidence remain required after the protected main merge. +Implementation PR #12 is merged. Production `v1.0.0` runs at +`http://192.168.2.28:8088` following a successful main build and real manual Gitea +deployment. Native duplicate/branch guards and downloadable artifacts were +verified. Twelve isolated real NAS checks cover recovery, retry, distinct-version +rollback, failure guards and manual recovery; they use separate state/containers +and virtual test tags, without changing production. The test resources have been +removed. See `docs/s6-validation.md` for run links, digests, evidence boundaries +and the conditional S16 data-persistence acceptance. S6 is ready for review. -- 2.49.1 From 95aa8c630284328edd58a7a266ac519caaeb44b2 Mon Sep 17 00:00:00 2001 From: Wanja Krah Date: Tue, 3 Nov 2026 16:12:30 +0100 Subject: [PATCH 2/3] testfile --- .../dansschool-30-groepen-260-dansers.json | 2140 +++++++++++++++++ 1 file changed, 2140 insertions(+) create mode 100644 testdata/dansschool-30-groepen-260-dansers.json diff --git a/testdata/dansschool-30-groepen-260-dansers.json b/testdata/dansschool-30-groepen-260-dansers.json new file mode 100644 index 0000000..6e1cdb1 --- /dev/null +++ b/testdata/dansschool-30-groepen-260-dansers.json @@ -0,0 +1,2140 @@ +{ + "formatVersion": 3, + "key": "88508fb8-3ae0-545f-b40c-4c63bfc4dbdf", + "name": "Dansstudio Horizon — fictieve testschool", + "dancers": [ + { + "id": "d001", + "name": "Lisa van der Meer", + "birthDate": "2021-08-10" + }, + { + "id": "d002", + "name": "Luna Jansen", + "birthDate": "2023-03-23" + }, + { + "id": "d003", + "name": "Joris El Amrani", + "birthDate": "2023-07-23" + }, + { + "id": "d004", + "name": "Siem Postma", + "birthDate": "2022-04-02" + }, + { + "id": "d005", + "name": "Tim Kok", + "birthDate": "2021-07-03" + }, + { + "id": "d006", + "name": "Yara Vermeer", + "birthDate": "2021-09-10" + }, + { + "id": "d007", + "name": "Iris Meijer", + "birthDate": "2021-12-15" + }, + { + "id": "d008", + "name": "Ruben Martens", + "birthDate": "2022-06-17" + }, + { + "id": "d009", + "name": "Jamie Visser", + "birthDate": "2022-11-18" + }, + { + "id": "d010", + "name": "Lynn Kowalski", + "birthDate": "2023-06-17" + }, + { + "id": "d011", + "name": "Alex Kaya", + "birthDate": "2021-12-09" + }, + { + "id": "d012", + "name": "Jesse de Vries", + "birthDate": "2023-03-01" + }, + { + "id": "d013", + "name": "Ilse Hoekstra", + "birthDate": "2021-06-06" + }, + { + "id": "d014", + "name": "Noor Aydin", + "birthDate": "2023-09-10" + }, + { + "id": "d015", + "name": "Joep de Groot", + "birthDate": "2021-01-18" + }, + { + "id": "d016", + "name": "James Mulder", + "birthDate": "2022-07-11" + }, + { + "id": "d017", + "name": "Sanne van Rijn", + "birthDate": "2023-11-02" + }, + { + "id": "d018", + "name": "Fatima Willems", + "birthDate": "2021-03-23" + }, + { + "id": "d019", + "name": "Max van Dijk", + "birthDate": "2020-11-05" + }, + { + "id": "d020", + "name": "Hannah Kok", + "birthDate": "2023-05-03" + }, + { + "id": "d021", + "name": "Kiki van den Berg", + "birthDate": "2022-01-19" + }, + { + "id": "d022", + "name": "Pien Vos", + "birthDate": "2021-04-28" + }, + { + "id": "d023", + "name": "Sanne de Jong", + "birthDate": "2021-10-18" + }, + { + "id": "d024", + "name": "Benjamin van Beek", + "birthDate": "2023-07-25" + }, + { + "id": "d025", + "name": "Otis Kaya", + "birthDate": "2021-10-02" + }, + { + "id": "d026", + "name": "Luna Smits", + "birthDate": "2023-10-28" + }, + { + "id": "d027", + "name": "Bas van der Pol", + "birthDate": "2023-07-04" + }, + { + "id": "d028", + "name": "Daniël Vos", + "birthDate": "2022-01-03" + }, + { + "id": "d029", + "name": "Lynn Aydin", + "birthDate": "2021-06-04" + }, + { + "id": "d030", + "name": "Finn Hendriks", + "birthDate": "2022-05-14" + }, + { + "id": "d031", + "name": "Nova Santos", + "birthDate": "2021-12-14" + }, + { + "id": "d032", + "name": "Charlotte Kowalski", + "birthDate": "2022-12-08" + }, + { + "id": "d033", + "name": "Pien Dekker", + "birthDate": "2023-10-12" + }, + { + "id": "d034", + "name": "Joris de Groot", + "birthDate": "2020-12-09" + }, + { + "id": "d035", + "name": "Raf Dekker", + "birthDate": "2023-08-14" + }, + { + "id": "d036", + "name": "Kiki Wolters", + "birthDate": "2020-04-27" + }, + { + "id": "d037", + "name": "Casey Peters", + "birthDate": "2020-03-10" + }, + { + "id": "d038", + "name": "Sara Schouten", + "birthDate": "2020-03-21" + }, + { + "id": "d039", + "name": "Anna Kaya", + "birthDate": "2017-12-08" + }, + { + "id": "d040", + "name": "James Dekker", + "birthDate": "2020-07-27" + }, + { + "id": "d041", + "name": "Gijs Vermeer", + "birthDate": "2018-08-16" + }, + { + "id": "d042", + "name": "Otis Dekker", + "birthDate": "2018-07-17" + }, + { + "id": "d043", + "name": "Robin van Leeuwen", + "birthDate": "2018-11-26" + }, + { + "id": "d044", + "name": "Daan Kramer", + "birthDate": "2020-09-25" + }, + { + "id": "d045", + "name": "Eva Fernandes", + "birthDate": "2018-04-25" + }, + { + "id": "d046", + "name": "Roos de Jong", + "birthDate": "2018-11-21" + }, + { + "id": "d047", + "name": "Thomas de Boer", + "birthDate": "2020-04-14" + }, + { + "id": "d048", + "name": "Milan Peters", + "birthDate": "2020-03-15" + }, + { + "id": "d049", + "name": "Iris Verhoeven", + "birthDate": "2019-10-07" + }, + { + "id": "d050", + "name": "Pien Jacobs", + "birthDate": "2019-04-13" + }, + { + "id": "d051", + "name": "Sander van Beek", + "birthDate": "2020-01-21" + }, + { + "id": "d052", + "name": "Bram van Leeuwen", + "birthDate": "2018-04-24" + }, + { + "id": "d053", + "name": "Nina Verhoeven", + "birthDate": "2020-11-01" + }, + { + "id": "d054", + "name": "Eva Nguyen", + "birthDate": "2020-10-25" + }, + { + "id": "d055", + "name": "Lars van der Meer", + "birthDate": "2018-11-14" + }, + { + "id": "d056", + "name": "Amir Fernandes", + "birthDate": "2019-01-18" + }, + { + "id": "d057", + "name": "Lynn Brouwer", + "birthDate": "2018-11-20" + }, + { + "id": "d058", + "name": "Daan Bakker", + "birthDate": "2020-07-25" + }, + { + "id": "d059", + "name": "Julia van Loon", + "birthDate": "2018-05-14" + }, + { + "id": "d060", + "name": "Julian Santos", + "birthDate": "2019-12-22" + }, + { + "id": "d061", + "name": "Mees Smit", + "birthDate": "2020-09-19" + }, + { + "id": "d062", + "name": "Lina van Houten", + "birthDate": "2020-10-14" + }, + { + "id": "d063", + "name": "Mila van Vliet", + "birthDate": "2019-10-12" + }, + { + "id": "d064", + "name": "David Nowak", + "birthDate": "2018-01-21" + }, + { + "id": "d065", + "name": "Raf Mulder", + "birthDate": "2018-11-09" + }, + { + "id": "d066", + "name": "Ayla Kramer", + "birthDate": "2020-09-17" + }, + { + "id": "d067", + "name": "Vera Yilmaz", + "birthDate": "2018-07-18" + }, + { + "id": "d068", + "name": "Liam Kuiper", + "birthDate": "2020-03-26" + }, + { + "id": "d069", + "name": "Finn Visser", + "birthDate": "2018-04-06" + }, + { + "id": "d070", + "name": "Benjamin Wolters", + "birthDate": "2019-06-23" + }, + { + "id": "d071", + "name": "Jamie Aydin", + "birthDate": "2020-08-01" + }, + { + "id": "d072", + "name": "David Aydin", + "birthDate": "2019-08-13" + }, + { + "id": "d073", + "name": "Jade Mulder", + "birthDate": "2020-10-18" + }, + { + "id": "d074", + "name": "Aïsha Jacobs", + "birthDate": "2020-08-06" + }, + { + "id": "d075", + "name": "Otis de Vries", + "birthDate": "2018-07-16" + }, + { + "id": "d076", + "name": "Luna Peters", + "birthDate": "2020-09-20" + }, + { + "id": "d077", + "name": "Boaz Demir", + "birthDate": "2020-02-19" + }, + { + "id": "d078", + "name": "Noah Meijer", + "birthDate": "2019-09-24" + }, + { + "id": "d079", + "name": "Jens Aydin", + "birthDate": "2019-11-20" + }, + { + "id": "d080", + "name": "Naomi Aydin", + "birthDate": "2020-03-05" + }, + { + "id": "d081", + "name": "Siem van der Linden", + "birthDate": "2016-06-07" + }, + { + "id": "d082", + "name": "Joris van Dijk", + "birthDate": "2013-11-14" + }, + { + "id": "d083", + "name": "Sam Hendriks", + "birthDate": "2016-10-13" + }, + { + "id": "d084", + "name": "Elin de Wit", + "birthDate": "2016-01-13" + }, + { + "id": "d085", + "name": "Mees Vos", + "birthDate": "2017-04-11" + }, + { + "id": "d086", + "name": "Emma Hassan", + "birthDate": "2017-07-03" + }, + { + "id": "d087", + "name": "David van Vliet", + "birthDate": "2014-01-08" + }, + { + "id": "d088", + "name": "Suze van Rijn", + "birthDate": "2016-06-22" + }, + { + "id": "d089", + "name": "Nina Mulder", + "birthDate": "2015-12-08" + }, + { + "id": "d090", + "name": "Roos Fernandes", + "birthDate": "2014-01-02" + }, + { + "id": "d091", + "name": "Anna Aydin", + "birthDate": "2016-10-14" + }, + { + "id": "d092", + "name": "Casey van Loon", + "birthDate": "2014-09-14" + }, + { + "id": "d093", + "name": "Hannah Hoekstra", + "birthDate": "2017-09-12" + }, + { + "id": "d094", + "name": "Zayn Jacobs", + "birthDate": "2014-05-18" + }, + { + "id": "d095", + "name": "Suze Wolters", + "birthDate": "2014-03-15" + }, + { + "id": "d096", + "name": "Abel Brouwer", + "birthDate": "2014-09-13" + }, + { + "id": "d097", + "name": "Noor Kuiper", + "birthDate": "2016-02-26" + }, + { + "id": "d098", + "name": "Hugo van Leeuwen", + "birthDate": "2014-02-06" + }, + { + "id": "d099", + "name": "Lina van Loon", + "birthDate": "2016-07-22" + }, + { + "id": "d100", + "name": "Lars Santos", + "birthDate": "2016-03-13" + }, + { + "id": "d101", + "name": "Morris van den Berg", + "birthDate": "2015-06-10" + }, + { + "id": "d102", + "name": "Lucas Santos", + "birthDate": "2015-09-04" + }, + { + "id": "d103", + "name": "Nienke El Idrissi", + "birthDate": "2015-11-11" + }, + { + "id": "d104", + "name": "Raf Santos", + "birthDate": "2016-04-05" + }, + { + "id": "d105", + "name": "Casey van der Linden", + "birthDate": "2015-12-21" + }, + { + "id": "d106", + "name": "Isa Jacobs", + "birthDate": "2016-01-26" + }, + { + "id": "d107", + "name": "Levi Yilmaz", + "birthDate": "2014-12-26" + }, + { + "id": "d108", + "name": "Noor Hassan", + "birthDate": "2016-03-25" + }, + { + "id": "d109", + "name": "Joris Smit", + "birthDate": "2014-11-06" + }, + { + "id": "d110", + "name": "Milan Kowalski", + "birthDate": "2016-11-21" + }, + { + "id": "d111", + "name": "Merel Vos", + "birthDate": "2016-11-09" + }, + { + "id": "d112", + "name": "Puck Kok", + "birthDate": "2015-04-20" + }, + { + "id": "d113", + "name": "Lars van Dam", + "birthDate": "2014-02-26" + }, + { + "id": "d114", + "name": "Sem Schouten", + "birthDate": "2014-09-05" + }, + { + "id": "d115", + "name": "Jens Verhoeven", + "birthDate": "2014-02-18" + }, + { + "id": "d116", + "name": "Otis de Bruin", + "birthDate": "2017-03-06" + }, + { + "id": "d117", + "name": "Evi van Beek", + "birthDate": "2016-12-27" + }, + { + "id": "d118", + "name": "Thijs de Groot", + "birthDate": "2015-08-15" + }, + { + "id": "d119", + "name": "Mees Willems", + "birthDate": "2017-07-19" + }, + { + "id": "d120", + "name": "Gijs de Groot", + "birthDate": "2015-07-13" + }, + { + "id": "d121", + "name": "Youssef van den Berg", + "birthDate": "2014-01-06" + }, + { + "id": "d122", + "name": "Suze Santos", + "birthDate": "2014-10-07" + }, + { + "id": "d123", + "name": "Zayn Peters", + "birthDate": "2015-10-12" + }, + { + "id": "d124", + "name": "Milan van der Meer", + "birthDate": "2015-07-17" + }, + { + "id": "d125", + "name": "Elise Kramer", + "birthDate": "2017-01-27" + }, + { + "id": "d126", + "name": "Elise Martens", + "birthDate": "2015-03-19" + }, + { + "id": "d127", + "name": "Femke Dekker", + "birthDate": "2014-01-22" + }, + { + "id": "d128", + "name": "Nova Jansen", + "birthDate": "2015-07-18" + }, + { + "id": "d129", + "name": "Sem van der Meer", + "birthDate": "2017-01-10" + }, + { + "id": "d130", + "name": "Jesse Kok", + "birthDate": "2014-09-13" + }, + { + "id": "d131", + "name": "Noud Jacobs", + "birthDate": "2010-11-05" + }, + { + "id": "d132", + "name": "Luna Visser", + "birthDate": "2012-11-01" + }, + { + "id": "d133", + "name": "Evi van Dijk", + "birthDate": "2013-01-25" + }, + { + "id": "d134", + "name": "Luuk Bakker", + "birthDate": "2012-08-03" + }, + { + "id": "d135", + "name": "Lucas Jacobs", + "birthDate": "2010-07-11" + }, + { + "id": "d136", + "name": "Esmee Bos", + "birthDate": "2011-09-21" + }, + { + "id": "d137", + "name": "Romy Vos", + "birthDate": "2010-03-11" + }, + { + "id": "d138", + "name": "Jesse Chen", + "birthDate": "2009-11-27" + }, + { + "id": "d139", + "name": "Maud Kaya", + "birthDate": "2013-02-27" + }, + { + "id": "d140", + "name": "Jasmijn Kowalski", + "birthDate": "2011-09-18" + }, + { + "id": "d141", + "name": "Noor van Houten", + "birthDate": "2012-08-12" + }, + { + "id": "d142", + "name": "Zoë El Amrani", + "birthDate": "2010-01-18" + }, + { + "id": "d143", + "name": "Youssef Prins", + "birthDate": "2011-01-23" + }, + { + "id": "d144", + "name": "Julia de Vries", + "birthDate": "2012-01-16" + }, + { + "id": "d145", + "name": "Deniz Jansen", + "birthDate": "2012-06-27" + }, + { + "id": "d146", + "name": "Noah de Vries", + "birthDate": "2011-04-23" + }, + { + "id": "d147", + "name": "Morris Jacobs", + "birthDate": "2010-07-23" + }, + { + "id": "d148", + "name": "Amber Hassan", + "birthDate": "2011-01-27" + }, + { + "id": "d149", + "name": "Daniël de Jong", + "birthDate": "2011-08-17" + }, + { + "id": "d150", + "name": "Alex El Amrani", + "birthDate": "2012-04-25" + }, + { + "id": "d151", + "name": "Jamie de Jong", + "birthDate": "2010-12-23" + }, + { + "id": "d152", + "name": "Lars Meijer", + "birthDate": "2012-06-10" + }, + { + "id": "d153", + "name": "Wout Hendriks", + "birthDate": "2011-11-13" + }, + { + "id": "d154", + "name": "Kim Jacobs", + "birthDate": "2012-02-09" + }, + { + "id": "d155", + "name": "Suze van Dijk", + "birthDate": "2012-04-14" + }, + { + "id": "d156", + "name": "Daan Fernandes", + "birthDate": "2010-02-01" + }, + { + "id": "d157", + "name": "Sophie El Idrissi", + "birthDate": "2013-10-02" + }, + { + "id": "d158", + "name": "Elise Dijkstra", + "birthDate": "2010-06-28" + }, + { + "id": "d159", + "name": "Lina Brouwer", + "birthDate": "2011-04-10" + }, + { + "id": "d160", + "name": "Vera Hassan", + "birthDate": "2011-01-21" + }, + { + "id": "d161", + "name": "Tim Smit", + "birthDate": "2010-03-09" + }, + { + "id": "d162", + "name": "Olivia El Idrissi", + "birthDate": "2013-01-24" + }, + { + "id": "d163", + "name": "Fatima Postma", + "birthDate": "2011-05-11" + }, + { + "id": "d164", + "name": "Noud Brouwer", + "birthDate": "2013-06-18" + }, + { + "id": "d165", + "name": "Wout El Amrani", + "birthDate": "2013-03-03" + }, + { + "id": "d166", + "name": "Ruben Postma", + "birthDate": "2012-02-19" + }, + { + "id": "d167", + "name": "Malou Chen", + "birthDate": "2010-01-21" + }, + { + "id": "d168", + "name": "Olivia Dijkstra", + "birthDate": "2012-07-15" + }, + { + "id": "d169", + "name": "Boaz van der Linden", + "birthDate": "2011-08-23" + }, + { + "id": "d170", + "name": "Naomi de Boer", + "birthDate": "2012-11-24" + }, + { + "id": "d171", + "name": "Maud Brouwer", + "birthDate": "2010-08-16" + }, + { + "id": "d172", + "name": "Noah Kramer", + "birthDate": "2010-06-28" + }, + { + "id": "d173", + "name": "Fien Nowak", + "birthDate": "2011-07-10" + }, + { + "id": "d174", + "name": "Elise Mulder", + "birthDate": "2011-10-11" + }, + { + "id": "d175", + "name": "Olivier Martens", + "birthDate": "2012-01-21" + }, + { + "id": "d176", + "name": "Naomi Dekker", + "birthDate": "2013-02-26" + }, + { + "id": "d177", + "name": "Amir van Leeuwen", + "birthDate": "2011-10-07" + }, + { + "id": "d178", + "name": "Jade Postma", + "birthDate": "2012-06-13" + }, + { + "id": "d179", + "name": "Daniël Hassan", + "birthDate": "2010-10-10" + }, + { + "id": "d180", + "name": "Liam van Eijk", + "birthDate": "2012-04-21" + }, + { + "id": "d181", + "name": "Amira van der Meer", + "birthDate": "2009-07-18" + }, + { + "id": "d182", + "name": "Evi Kok", + "birthDate": "2005-10-11" + }, + { + "id": "d183", + "name": "Hannah van Houten", + "birthDate": "2009-08-27" + }, + { + "id": "d184", + "name": "Thijs Demir", + "birthDate": "2006-02-23" + }, + { + "id": "d185", + "name": "Malou van Dam", + "birthDate": "2002-06-19" + }, + { + "id": "d186", + "name": "Sarah Kowalski", + "birthDate": "2005-06-26" + }, + { + "id": "d187", + "name": "Stijn Nguyen", + "birthDate": "2008-10-03" + }, + { + "id": "d188", + "name": "Tim Schouten", + "birthDate": "2005-08-02" + }, + { + "id": "d189", + "name": "Morris Vos", + "birthDate": "2008-09-09" + }, + { + "id": "d190", + "name": "Malou Martens", + "birthDate": "2002-06-10" + }, + { + "id": "d191", + "name": "Nova Hendriks", + "birthDate": "2007-08-06" + }, + { + "id": "d192", + "name": "Fatima Demir", + "birthDate": "2008-01-09" + }, + { + "id": "d193", + "name": "Julian Demir", + "birthDate": "2002-06-12" + }, + { + "id": "d194", + "name": "Fleur Schouten", + "birthDate": "2008-05-28" + }, + { + "id": "d195", + "name": "Deniz Nguyen", + "birthDate": "2003-08-15" + }, + { + "id": "d196", + "name": "Sanne Brouwer", + "birthDate": "2006-05-26" + }, + { + "id": "d197", + "name": "Raf Hoekstra", + "birthDate": "2009-07-15" + }, + { + "id": "d198", + "name": "Fien van Houten", + "birthDate": "2006-07-06" + }, + { + "id": "d199", + "name": "Maud de Wit", + "birthDate": "2004-03-01" + }, + { + "id": "d200", + "name": "Otis de Boer", + "birthDate": "2007-12-25" + }, + { + "id": "d201", + "name": "Bram Fernandes", + "birthDate": "2008-01-22" + }, + { + "id": "d202", + "name": "Lieke van Beek", + "birthDate": "2009-03-19" + }, + { + "id": "d203", + "name": "Maud van Rijn", + "birthDate": "2007-11-03" + }, + { + "id": "d204", + "name": "Julian Postma", + "birthDate": "2006-09-11" + }, + { + "id": "d205", + "name": "Thomas Hassan", + "birthDate": "2005-10-02" + }, + { + "id": "d206", + "name": "Sophie van der Linden", + "birthDate": "2007-09-26" + }, + { + "id": "d207", + "name": "Amira de Wit", + "birthDate": "2009-07-10" + }, + { + "id": "d208", + "name": "Ilyas Mulder", + "birthDate": "2005-06-14" + }, + { + "id": "d209", + "name": "Youssef Verhoeven", + "birthDate": "2008-03-03" + }, + { + "id": "d210", + "name": "Roos van der Linden", + "birthDate": "2003-09-23" + }, + { + "id": "d211", + "name": "Thijs El Idrissi", + "birthDate": "2005-04-23" + }, + { + "id": "d212", + "name": "Emma Verhoeven", + "birthDate": "2009-03-10" + }, + { + "id": "d213", + "name": "Amir van Houten", + "birthDate": "2005-05-13" + }, + { + "id": "d214", + "name": "Bram Vermeer", + "birthDate": "2009-06-25" + }, + { + "id": "d215", + "name": "Daniël Yilmaz", + "birthDate": "2005-11-02" + }, + { + "id": "d216", + "name": "Stijn van Beek", + "birthDate": "2007-03-19" + }, + { + "id": "d217", + "name": "Hugo de Jong", + "birthDate": "2005-08-05" + }, + { + "id": "d218", + "name": "Luuk Peters", + "birthDate": "2002-06-15" + }, + { + "id": "d219", + "name": "Iris Vos", + "birthDate": "2008-03-18" + }, + { + "id": "d220", + "name": "Wout van Houten", + "birthDate": "2006-01-02" + }, + { + "id": "d221", + "name": "Boaz Martens", + "birthDate": "2004-04-23" + }, + { + "id": "d222", + "name": "Moos van den Berg", + "birthDate": "2003-08-24" + }, + { + "id": "d223", + "name": "Lieke Jansen", + "birthDate": "2004-10-07" + }, + { + "id": "d224", + "name": "Abel Vermeer", + "birthDate": "2004-01-05" + }, + { + "id": "d225", + "name": "Cas de Bruin", + "birthDate": "2002-02-26" + }, + { + "id": "d226", + "name": "Sven van Dam", + "birthDate": "1972-03-25" + }, + { + "id": "d227", + "name": "Lina van Eijk", + "birthDate": "1981-08-27" + }, + { + "id": "d228", + "name": "Ruben de Bruin", + "birthDate": "1981-10-02" + }, + { + "id": "d229", + "name": "Raf Nguyen", + "birthDate": "1994-04-15" + }, + { + "id": "d230", + "name": "Wout Dekker", + "birthDate": "1965-03-03" + }, + { + "id": "d231", + "name": "Ayla Nowak", + "birthDate": "1967-02-12" + }, + { + "id": "d232", + "name": "Hannah Martens", + "birthDate": "1992-05-23" + }, + { + "id": "d233", + "name": "Anna Hoekstra", + "birthDate": "1970-10-10" + }, + { + "id": "d234", + "name": "Dex Kramer", + "birthDate": "1985-06-18" + }, + { + "id": "d235", + "name": "Deniz Schouten", + "birthDate": "1967-10-16" + }, + { + "id": "d236", + "name": "Lisa Meijer", + "birthDate": "1982-08-21" + }, + { + "id": "d237", + "name": "Emma van Dam", + "birthDate": "1963-01-17" + }, + { + "id": "d238", + "name": "Moos de Bruin", + "birthDate": "1962-09-12" + }, + { + "id": "d239", + "name": "Thijs Kowalski", + "birthDate": "1975-06-19" + }, + { + "id": "d240", + "name": "Yara Meijer", + "birthDate": "2000-09-02" + }, + { + "id": "d241", + "name": "Moos Jansen", + "birthDate": "1989-10-25" + }, + { + "id": "d242", + "name": "Pien Peters", + "birthDate": "1990-04-08" + }, + { + "id": "d243", + "name": "Dex Kuiper", + "birthDate": "1993-04-05" + }, + { + "id": "d244", + "name": "Cato Vos", + "birthDate": "2001-05-26" + }, + { + "id": "d245", + "name": "Fien Aydin", + "birthDate": "1977-08-09" + }, + { + "id": "d246", + "name": "Sara van der Meer", + "birthDate": "1973-01-10" + }, + { + "id": "d247", + "name": "Naomi Fernandes", + "birthDate": "1966-09-23" + }, + { + "id": "d248", + "name": "Fien Chen", + "birthDate": "1982-12-09" + }, + { + "id": "d249", + "name": "Nova Martens", + "birthDate": "1967-12-07" + }, + { + "id": "d250", + "name": "Jade van Houten", + "birthDate": "1963-01-20" + }, + { + "id": "d251", + "name": "Malou Kowalski", + "birthDate": "1978-06-07" + }, + { + "id": "d252", + "name": "Malou Brouwer", + "birthDate": "1981-11-10" + }, + { + "id": "d253", + "name": "Max Kok", + "birthDate": "1969-02-06" + }, + { + "id": "d254", + "name": "Vera Prins", + "birthDate": "1993-12-05" + }, + { + "id": "d255", + "name": "Nienke Nowak", + "birthDate": "1964-06-17" + }, + { + "id": "d256", + "name": "Sanne Hoekstra", + "birthDate": "1994-11-16" + }, + { + "id": "d257", + "name": "Maud van Dijk", + "birthDate": "1977-03-17" + }, + { + "id": "d258", + "name": "Lisa Mulder", + "birthDate": "1971-04-05" + }, + { + "id": "d259", + "name": "Tim Hendriks", + "birthDate": "2001-02-16" + }, + { + "id": "d260", + "name": "Lars Hendriks", + "birthDate": "1974-08-03" + } + ], + "coaches": [ + { + "id": "c01", + "name": "Linde van der Wal" + }, + { + "id": "c02", + "name": "Demi van der Heijden" + }, + { + "id": "c03", + "name": "Rachid El Mansouri" + }, + { + "id": "c04", + "name": "Floor van der Poel" + }, + { + "id": "c05", + "name": "Maaike de Graaf" + }, + { + "id": "c06", + "name": "Tobias van Zanten" + }, + { + "id": "c07", + "name": "Nadia Benali" + }, + { + "id": "c08", + "name": "Stefan van Es" + }, + { + "id": "c09", + "name": "Charlotte van Ginkel" + }, + { + "id": "c10", + "name": "Jamal de Ruiter" + } + ], + "groups": [ + { + "id": "g01", + "category": "Mini Ballet", + "type": "PRE_SCHOOLER", + "startAge": 3, + "endAge": 5, + "styles": [ + "CLASSIC" + ], + "dancerIds": [ + "d001", + "d005", + "d013", + "d015", + "d019", + "d024", + "d028", + "d034" + ], + "coachId": "c01" + }, + { + "id": "g02", + "category": "Kleuterdans Jazz", + "type": "PRE_SCHOOLER", + "startAge": 3, + "endAge": 5, + "styles": [ + "JAZZ" + ], + "dancerIds": [ + "d004", + "d007", + "d012", + "d017", + "d022", + "d026", + "d031", + "d032" + ], + "coachId": "c02" + }, + { + "id": "g03", + "category": "Mini Hiphop", + "type": "PRE_SCHOOLER", + "startAge": 3, + "endAge": 5, + "styles": [ + "HIPHOP" + ], + "dancerIds": [ + "d003", + "d009", + "d010", + "d014", + "d021", + "d027", + "d030", + "d035" + ], + "coachId": "c03" + }, + { + "id": "g04", + "category": "Danskriebels Modern", + "type": "PRE_SCHOOLER", + "startAge": 3, + "endAge": 5, + "styles": [ + "MODERN" + ], + "dancerIds": [ + "d001", + "d006", + "d010", + "d013", + "d020", + "d025", + "d028", + "d035" + ], + "coachId": "c04" + }, + { + "id": "g05", + "category": "Kleuter Showmix", + "type": "PRE_SCHOOLER", + "startAge": 3, + "endAge": 5, + "styles": [ + "JAZZ", + "MODERN" + ], + "dancerIds": [ + "d002", + "d008", + "d011", + "d016", + "d018", + "d023", + "d029", + "d033" + ], + "coachId": "c05" + }, + { + "id": "g06", + "category": "Ballet Kids", + "type": "REGULAR", + "startAge": 6, + "endAge": 8, + "styles": [ + "CLASSIC" + ], + "dancerIds": [ + "d039", + "d042", + "d045", + "d047", + "d052", + "d055", + "d060", + "d065", + "d069", + "d070", + "d075" + ], + "coachId": "c06" + }, + { + "id": "g07", + "category": "Hiphop Kids", + "type": "REGULAR", + "startAge": 6, + "endAge": 8, + "styles": [ + "HIPHOP" + ], + "dancerIds": [ + "d036", + "d041", + "d044", + "d049", + "d051", + "d054", + "d058", + "d063", + "d066", + "d072", + "d076", + "d079" + ], + "coachId": "c07" + }, + { + "id": "g08", + "category": "Jazz Kids", + "type": "REGULAR", + "startAge": 6, + "endAge": 8, + "styles": [ + "JAZZ" + ], + "dancerIds": [ + "d037", + "d042", + "d046", + "d047", + "d050", + "d053", + "d058", + "d062", + "d066", + "d073", + "d077", + "d080" + ], + "coachId": "c08" + }, + { + "id": "g09", + "category": "Streetdance Kids", + "type": "REGULAR", + "startAge": 6, + "endAge": 8, + "styles": [ + "STREETDANCE" + ], + "dancerIds": [ + "d039", + "d040", + "d045", + "d049", + "d052", + "d057", + "d059", + "d066", + "d067", + "d070", + "d078" + ], + "coachId": "c09" + }, + { + "id": "g10", + "category": "Breakdance Kids", + "type": "REGULAR", + "startAge": 6, + "endAge": 8, + "styles": [ + "BREAKDANCE" + ], + "dancerIds": [ + "d038", + "d042", + "d043", + "d048", + "d053", + "d056", + "d061", + "d064", + "d068", + "d071", + "d074" + ], + "coachId": "c10" + }, + { + "id": "g11", + "category": "Ballet Junior", + "type": "REGULAR", + "startAge": 9, + "endAge": 12, + "styles": [ + "CLASSIC" + ], + "dancerIds": [ + "d081", + "d084", + "d089", + "d093", + "d097", + "d102", + "d105", + "d106", + "d112", + "d116", + "d118", + "d121", + "d127", + "d129", + "d130" + ], + "coachId": "c01" + }, + { + "id": "g12", + "category": "Hiphop Junior", + "type": "REGULAR", + "startAge": 9, + "endAge": 12, + "styles": [ + "HIPHOP" + ], + "dancerIds": [ + "d082", + "d085", + "d091", + "d094", + "d095", + "d102", + "d105", + "d107", + "d112", + "d114", + "d118", + "d122", + "d124", + "d130" + ], + "coachId": "c02" + }, + { + "id": "g13", + "category": "Jazz Junior", + "type": "REGULAR", + "startAge": 9, + "endAge": 12, + "styles": [ + "JAZZ" + ], + "dancerIds": [ + "d083", + "d088", + "d092", + "d094", + "d096", + "d101", + "d105", + "d106", + "d111", + "d115", + "d116", + "d120", + "d126", + "d128" + ], + "coachId": "c03" + }, + { + "id": "g14", + "category": "Modern Junior", + "type": "REGULAR", + "startAge": 9, + "endAge": 12, + "styles": [ + "MODERN" + ], + "dancerIds": [ + "d082", + "d086", + "d090", + "d092", + "d098", + "d099", + "d103", + "d107", + "d110", + "d116", + "d117", + "d119", + "d123", + "d128" + ], + "coachId": "c04" + }, + { + "id": "g15", + "category": "Breakdance Junior", + "type": "REGULAR", + "startAge": 9, + "endAge": 12, + "styles": [ + "BREAKDANCE" + ], + "dancerIds": [ + "d083", + "d087", + "d090", + "d092", + "d094", + "d100", + "d104", + "d108", + "d109", + "d113", + "d116", + "d118", + "d125", + "d127" + ], + "coachId": "c05" + }, + { + "id": "g16", + "category": "Ballet Teens", + "type": "REGULAR", + "startAge": 13, + "endAge": 16, + "styles": [ + "CLASSIC" + ], + "dancerIds": [ + "d133", + "d136", + "d140", + "d141", + "d145", + "d147", + "d149", + "d151", + "d153", + "d156", + "d161", + "d163", + "d164", + "d167", + "d171", + "d175", + "d179" + ], + "coachId": "c06" + }, + { + "id": "g17", + "category": "Hiphop Teens", + "type": "REGULAR", + "startAge": 13, + "endAge": 16, + "styles": [ + "HIPHOP" + ], + "dancerIds": [ + "d132", + "d134", + "d138", + "d141", + "d144", + "d147", + "d148", + "d149", + "d152", + "d157", + "d160", + "d161", + "d165", + "d167", + "d172", + "d173", + "d177" + ], + "coachId": "c07" + }, + { + "id": "g18", + "category": "Jazz Teens Selectie", + "type": "SELECTION", + "startAge": 13, + "endAge": 16, + "styles": [ + "JAZZ" + ], + "dancerIds": [ + "d133", + "d134", + "d139", + "d141", + "d144", + "d147", + "d148", + "d149", + "d154", + "d156", + "d158", + "d161", + "d165", + "d167", + "d173", + "d175", + "d177" + ], + "coachId": "c08" + }, + { + "id": "g19", + "category": "Modern Teens", + "type": "REGULAR", + "startAge": 13, + "endAge": 16, + "styles": [ + "MODERN" + ], + "dancerIds": [ + "d131", + "d134", + "d137", + "d142", + "d143", + "d147", + "d148", + "d152", + "d155", + "d158", + "d159", + "d161", + "d166", + "d169", + "d170", + "d176", + "d180" + ], + "coachId": "c09" + }, + { + "id": "g20", + "category": "Streetdance Teens", + "type": "REGULAR", + "startAge": 13, + "endAge": 16, + "styles": [ + "STREETDANCE" + ], + "dancerIds": [ + "d133", + "d135", + "d138", + "d141", + "d146", + "d147", + "d148", + "d150", + "d153", + "d155", + "d158", + "d162", + "d165", + "d168", + "d170", + "d174", + "d178" + ], + "coachId": "c10" + }, + { + "id": "g21", + "category": "Klassiek Vooropleiding", + "type": "PRE_EDUCATION", + "startAge": 17, + "endAge": 24, + "styles": [ + "CLASSIC" + ], + "dancerIds": [ + "d183", + "d188", + "d189", + "d191", + "d192", + "d194", + "d197", + "d204", + "d205", + "d209", + "d211", + "d213", + "d216", + "d217", + "d219", + "d222", + "d223" + ], + "coachId": "c01" + }, + { + "id": "g22", + "category": "Hiphop Selectie", + "type": "SELECTION", + "startAge": 17, + "endAge": 24, + "styles": [ + "HIPHOP" + ], + "dancerIds": [ + "d184", + "d185", + "d188", + "d190", + "d192", + "d196", + "d199", + "d200", + "d204", + "d208", + "d211", + "d212", + "d213", + "d218", + "d220", + "d221", + "d223" + ], + "coachId": "c02" + }, + { + "id": "g23", + "category": "Modern Vooropleiding", + "type": "PRE_EDUCATION", + "startAge": 17, + "endAge": 24, + "styles": [ + "MODERN" + ], + "dancerIds": [ + "d182", + "d187", + "d189", + "d190", + "d192", + "d196", + "d198", + "d201", + "d204", + "d206", + "d211", + "d213", + "d214", + "d216", + "d218", + "d222", + "d223" + ], + "coachId": "c03" + }, + { + "id": "g24", + "category": "Jazz Showteam", + "type": "SHOW_CASE", + "startAge": 17, + "endAge": 24, + "styles": [ + "JAZZ", + "MODERN" + ], + "dancerIds": [ + "d181", + "d187", + "d188", + "d191", + "d193", + "d195", + "d200", + "d202", + "d204", + "d207", + "d210", + "d212", + "d213", + "d216", + "d218", + "d222", + "d223", + "d224" + ], + "coachId": "c04" + }, + { + "id": "g25", + "category": "Breakdance Selectie", + "type": "SELECTION", + "startAge": 17, + "endAge": 24, + "styles": [ + "BREAKDANCE" + ], + "dancerIds": [ + "d183", + "d186", + "d189", + "d190", + "d192", + "d196", + "d199", + "d203", + "d204", + "d205", + "d209", + "d213", + "d215", + "d216", + "d218", + "d222", + "d223", + "d225" + ], + "coachId": "c05" + }, + { + "id": "g26", + "category": "Ballet Volwassenen", + "type": "REGULAR", + "startAge": 25, + "endAge": 65, + "styles": [ + "CLASSIC" + ], + "dancerIds": [ + "d227", + "d229", + "d232", + "d238", + "d240", + "d243", + "d250", + "d253", + "d256", + "d258", + "d260" + ], + "coachId": "c06" + }, + { + "id": "g27", + "category": "Hiphop Volwassenen", + "type": "REGULAR", + "startAge": 25, + "endAge": 65, + "styles": [ + "HIPHOP" + ], + "dancerIds": [ + "d226", + "d231", + "d234", + "d239", + "d242", + "d245", + "d248", + "d252", + "d254", + "d258", + "d260" + ], + "coachId": "c07" + }, + { + "id": "g28", + "category": "Modern Volwassenen", + "type": "REGULAR", + "startAge": 25, + "endAge": 65, + "styles": [ + "MODERN" + ], + "dancerIds": [ + "d226", + "d229", + "d234", + "d236", + "d241", + "d244", + "d249", + "d252", + "d254", + "d258", + "d260" + ], + "coachId": "c08" + }, + { + "id": "g29", + "category": "Jazz Volwassenen", + "type": "REGULAR", + "startAge": 25, + "endAge": 65, + "styles": [ + "JAZZ" + ], + "dancerIds": [ + "d227", + "d229", + "d234", + "d235", + "d242", + "d246", + "d247", + "d254", + "d257", + "d259", + "d260" + ], + "coachId": "c09" + }, + { + "id": "g30", + "category": "Streetdance Showteam", + "type": "SHOW_CASE", + "startAge": 25, + "endAge": 65, + "styles": [ + "STREETDANCE", + "HIPHOP" + ], + "dancerIds": [ + "d228", + "d230", + "d233", + "d237", + "d242", + "d245", + "d251", + "d254", + "d255", + "d258", + "d260" + ], + "coachId": "c10" + } + ], + "shows": [] +} -- 2.49.1 From 95430691e45acef6d64b8585055ea133b00f5a08 Mon Sep 17 00:00:00 2001 From: Wanja Krah Date: Tue, 3 Nov 2026 16:13:38 +0100 Subject: [PATCH 3/3] updated spec status --- .../S18_new-rules-for-plotting-dance-groups-in-show.md | 2 +- .../S6_deployment-gitea-action-to-production.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename specs/{in_review => implemented}/S18_new-rules-for-plotting-dance-groups-in-show.md (99%) rename specs/{in_review => implemented}/S6_deployment-gitea-action-to-production.md (99%) diff --git a/specs/in_review/S18_new-rules-for-plotting-dance-groups-in-show.md b/specs/implemented/S18_new-rules-for-plotting-dance-groups-in-show.md similarity index 99% rename from specs/in_review/S18_new-rules-for-plotting-dance-groups-in-show.md rename to specs/implemented/S18_new-rules-for-plotting-dance-groups-in-show.md index 899702d..e07d738 100644 --- a/specs/in_review/S18_new-rules-for-plotting-dance-groups-in-show.md +++ b/specs/implemented/S18_new-rules-for-plotting-dance-groups-in-show.md @@ -1,6 +1,6 @@ # S18 — Scheduling dance groups across a show -Status: IN_REVIEW +Status: IMPLEMENTED As a dance school manager, I want OR-Tools to schedule groups and order performances using participation, diff --git a/specs/in_review/S6_deployment-gitea-action-to-production.md b/specs/implemented/S6_deployment-gitea-action-to-production.md similarity index 99% rename from specs/in_review/S6_deployment-gitea-action-to-production.md rename to specs/implemented/S6_deployment-gitea-action-to-production.md index a401792..20a1e39 100644 --- a/specs/in_review/S6_deployment-gitea-action-to-production.md +++ b/specs/implemented/S6_deployment-gitea-action-to-production.md @@ -1,6 +1,6 @@ # S6 — Manual versioned production deployment through Gitea -Status: IN_REVIEW +Status: IMPLEMENTED Agreed after the grill-me interview; shared understanding confirmed. -- 2.49.1