Skip to content

Release: merge development into beta - #1830

Open
github-actions[bot] wants to merge 42 commits into
betafrom
development
Open

github-actions[bot] wants to merge 42 commits into
betafrom
development

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

github-actions Bot and others added 30 commits October 8, 2026 01:19
…0261008011951

chore(sync): carry beta back into development
docs(openspec): link sign-in rows to integriq's broker configuration change
…new boards

Every row with a board now points at canvas part 2 (QAAxpcsFKBCvDUGbQbwtCa).
44 of the 57 new boards (learner, guardian with the child switcher,
coordinator, team lead, counsellor, compliance) are mapped onto the rows
they deliver; 34 rows that had no board get one. The remaining null
reasons point at the missing-boards list for the design session.
docs(openspec): link capabilities to the split design canvas and its new boards
Decision 99: eight rows for learniq boards on canvas part 2 that no row
covered, rated from code; quiet hours specced as
notification-quiet-hours-through-openregister.
Decision 100: ass-review-proctoring-flags reopened as specified, specced
as proctoring-flag-review-page.
docs(openspec): rows and specs for capabilities the design canvas draws
…w and the week on Rooster (#1756)

* wip(portal): the pupil reads her own timetable (site-pupil-portal-design T1, T2, T5b)

* test(portal): pin the pupil's timetable in the manifest shape and the Dutch labels

* fix(portal): the timetable column reads Subject, not a schema name

* fix(portal): the timetable page is ordered by StudentPortalPages, so the provider stays under phpmd's class length
A learner holds an update right on their own active proctoring-session
(native test mode appends flags from their browser), so they could set
reviewDecision on their own flags and allow them.

ProctoringFlagReviewGuard is a pre-write veto on create and update of
proctoring-session (proctoring-flag-review-page D2). Flags are matched on
flagId against the stored ones: outside instructors and compliance-officers
a caller may only append pending flags; staff may move a pending flag to
allowed or annulled once; nobody removes or rewrites a stored flag.
reviewedBy and reviewedAt are set by the server for a new decision and
restored from storage for every other flag, whatever the body sends.
Admin and system writes are not checked. The rules live in the pure
OCA\Learniq\Proctoring\FlagReview.

Ticks tasks 1.1 and 1.2 of proctoring-flag-review-page.
…rammes and school days (#1766)

* wip(portal): the pupil reads her own timetable (site-pupil-portal-design T1, T2, T5b)

* test(portal): pin the pupil's timetable in the manifest shape and the Dutch labels

* fix(portal): the timetable column reads Subject, not a schema name

* feat(portal): a guardian and a pupil may write to the teachers of the pupil's current groups (portal-message-contacts)

* chore(portal): split the contact ordering and name the provider's coupling for phpmd

* wip(portal): the school's public index of courses, programmes and school days; the example portals place the catalogue (portal-public-index)

* feat(portal): the public index in one part per kind, phpcs and phpmd clean

* fix(portal): the course kind reads Training course in code, not a schema name

* fix(portal): the timetable page is ordered by StudentPortalPages, so the provider stays under phpmd's class length

* refactor(portal): the student audience's collections live in StudentPortalCollections, so the provider stays under phpmd's class length
Unrelated events, a write another listener already stopped, an unresolvable
schema, flags that are not a list, a flag without a decision, and a stored
flag without an id that must come back exactly as stored. Closes the 12
statements the pgsql cell's coverage guard found uncovered.
…cked in (#1834)

Admin requests send their credentials without a challenge, text checks count
only visible matches, the sign-in clicks the declared Nextcloud button,
signed-in pages open at /mijn/learniq/<page>, and PORTAL_DESIGN_EXTERNAL_STUB=1
uses a long-lived stub broker. Fixes defects 1-5 of portal proof run 1.
Grades show subject, date and grade instead of field keys, the BPV hours page
is in the menu as "BPV en uren", and a week sent back reads "Teruggestuurd".
Fixes defects 10, 12 and 13 of portal proof run 1.
…count, and the install guide names every step (#1836)

* docs(install): the steps a fresh school portal install needs after the loads

maintenance:repair and cron after the loads, the portal's organisation, the
DigiD and eHerkenning issuer, and portal accounts for pupils, students and
participants. Covers defects 15 and 16 of portal proof run 1.

* feat(portal): the example-set load gives its declared learners their portal account

Noor (vo), Milan and Aylin (mbo) and Tom (training) get an active nextcloud
account on their portal through portaliq's provision event (#1381) and then
the learnerRef claim. A complete account is kept without asking portaliq, so a
second load writes nothing; without the portal's organisation the account
waits, and an older portaliq is asked nothing. The install guide drops the
operator step.

* refactor(portal): split the portal-account step into small methods (phpmd complexity)
…rdian overview holds only what the board shows (#1839)

* wip(portal): the four portal declarations follow their boards

One Contact column in the footer, one page title, the hero shows its heading
beside the search box, the home's right column, the content page's side list
at the top, Kies je richting, the academy's certificate heading and links.

* fix(portal): the guardian overview holds only what the board shows

Greeting, what is still to do, the children, news and this month; the
calendar covers the month and a booked conversation reads as words with the
teacher under it. OpenSpec change school-portals-match-their-boards.

* fix(portal): undo a second run of the declaration script that duplicated widgets

* fix(portal): notice banners, plain heroes and boxed tables, and the page title stays a level-1 heading

FIX-P's requests: nlBanner kind notice with a lead, a link and band; variant
plain on every school hero; the content page's table boxed under its own
heading and the side list under an accent line. portaliq #1368 drops the shell
title when a page opens with a level-1 nlHeading, so the declarations keep it.

* feat(portal): each child's card says where the child is today

The children cards declare a derived status from the guardian's own absence
reports: a report covering today reads "Ziek gemeld", another school day
"Op school", a weekend nothing. No schema field; portaliq renders the lookup
once it reads the key (requested from FIX-P).
…f-only

fix(security): only staff decide a proctoring flag
#1820 archived wizard-drops-the-removal-step and moved per-set removal
to the admin page, so 17 @SPEC tags pointed at a requirement and two
scenarios that no longer exist in openspec/specs/example-sets/spec.md
(gate 46, spec-anchor-existence).

- the loaded-set list, per-set removal and remove-example-set-<id>
  now cite "An administrator removes a loaded example set on the admin page"
- removalSteps() and its test cite "The removal step never runs by itself"
- "Removing one of two loaded sets" becomes "Removing the company set"

Comment lines only. Gate 46: 17 -> 0.
fix(spec): repoint example-sets @SPEC tags to anchors that exist
…board words are tested in Dutch (#1854)

Each school portal declares residentMenu.leaveOut [cases, tasks, access]
(portaliq #1394): no MijnMenu board shows them. A test proves the child-card
chip (Ziek gemeld, Op school), BPV en uren, Teruggestuurd, the grade columns
and the conversation tile arrive in Dutch through PortalLabelTranslator.
…oornveen's hero marks its photo (#1856)

training.json moves the course-day list into the hero's aside (portaliq #1397),
filling itself from the portal's catalogue with the authored days as a
fallback; mbo.json declares asideImage with the board's words, as no photo
ships with the design. The board checks look for the aside.
* chore(issues): add the fleet issue templates

* chore(issues): add the fleet issue templates

* chore(issues): add the fleet issue templates

* chore(issues): add the fleet issue templates
…0261008125844

chore(sync): carry beta back into development
…1863)

* feat(example-sets): a load moves every date to the week it runs in

DemoDates moves ISO dates, date-times (wall-clock kept), ISO weeks and Dutch
date phrases by the whole weeks from Monday 5 October 2026 to the load's
Monday. ExampleSetDates remembers each set's offset; a load in another week
moves the existing objects and the portal's pages and news first, a load in
the same week writes nothing. OpenSpec demo-dates-follow-the-load-week.

* test(e2e): the board checks hold in any week, and read the notice strips and link columns

dated() turns a board text with dates into a pattern for any week, as the
load moves every date to its own week. The banners read lead and text, the
po and vo homes end on nlLinkColumns, and the academy's expiry reads any
number of weeks. DemoDates also moves a range with a weekday inside it.

* test(e2e): Linda's board check opens the F-gassen booking before reading its participants

* test(e2e): the theme check reads a button outside the hero's joined search box

* test(e2e): the theme check reads a button outside the hero's joined search box
…r gets her accounts through the load (#1864)

The issuer recipe carries loaClaim and loaMap, without which a guardian sees
nothing. The manual install uses the app id learniq, npm ci, the portaliq and
thematiq builds and appstoreenabled=false; the register wizard, OpenConnector
as a requirement and occ app:repair scholiq are gone. The guide names the
repair's maintenance window and how to find the portal ids and the
organisation uuid. Petra Bakker (mbo) gets a Nextcloud and a trainer portal
account through the load (portaliq #1381).
…ildren, and the participant reads his next day once (#1865)

No child switcher on the overview; the task card leaves out a round where a
child already has a time; event descriptions under the tiles; one absence page
for both children. De Wilgenboom's search finds its news, Vaartveld's menu has
no BPV page, Tom's next course day shows once with Daarna after it.
OpenSpec guardian-and-participant-pages-follow-the-boards.
…nd the homes follow their boards (#1866)

* fix(portal): the placement reads in words with its hours, and a booking lists its participants as the board

The student's placement labels every field and its states, shows the hours bar
under Waar sta je? and names each step's day once. An opened booking lists its
participants with the certificate line and the details pill; the certificates
group per certificate. OpenSpec placement-and-bookings-follow-the-boards.

* fix(portal): placement steps as bars, academy course rows with weekdays, kind and a link, and the homes as their boards

The placement's steps draw as bars. Course rows in the public index read
"Donderdag · 1 dag · certificaat" and link to the course list; places left
have no source. The lead news items mark their photo with the board's words,
Esdoornveen's Voor leerbedrijven is a card of links, and the academy aside
drops its portal workaround (portaliq #1402).

* chore(l10n): place the new words apart from another open branch's
rubenvdlinde and others added 12 commits October 8, 2026 15:22
chore(parity): normalise features in the capability matrix
…rse date, placement agreements and work process progress (#1871)

* feat(example-sets): the board data the schemas lacked: places per course date, placement agreements and work process progress

Additive: cohort.capacity, four optional placement fields and a new
werkproces-progress schema (register 0.40.0). The generators seed the
academy's capacities, Milan's agreements and his six work processes. The
public index says how many places are left; the placement page shows the
agreements and the work processes. OpenSpec board-data-the-schemas-lacked.

* fix(register): werkproces-progress tenant_id is a uuid like its siblings; the cohort version pin moves to 0.3.0

* feat(portal): the child's name on each absence report, the next placement step as a card, the supervisors, and Daarna after the next course day

Uses portaliq round 5 (#1407, #1408, #1409). The steps provider gives the
current step its visit's day and narrative. Supervisors come from two
student-scoped collections joined through her own placements. The guardian's
task title stays the round's name: a round names groups, not a child.
Ten loose specs go under their feature and five engineering specs into a new
internalSpecs list. Ten rows the new learniq boards show link to them
(LqInstellingen, LqInstallatie, LqKoppelingen, LqCfVrijstellingen,
LqCfTrainingVastleggen). specScreens places five specs on those boards and gives
nine specs with no UI by nature their reason.
chore(parity): every spec under a feature, every capability on a screen
…the student's own estimate per work process (#1874)

- conference-invitation (register 0.41.0): one row per invited child per
  conference round, open while the child has no time in an open round,
  booked once it has one, closed otherwise. ConferenceInvitations writes
  only new or changed rows; ConferenceInvitationSync runs it inline after a
  round or a child's time moves; BackfillConferenceInvitations syncs the
  open rounds. The po generator seeds both open rounds (59 rows, Vera's
  booked, Sami's open).
- Guardian: parentConferenceInvitations through the child join; the
  overview task reads it with the childName lookup and the title sentence
  "Kies een tijd voor het oudergesprek van {childName}", and opens
  parentPickATime with the invitation and both booking forms. titleTemplate
  is translated.
- Student: fillInSelfAssessment ("Nu invullen"), an update of only
  selfAssessment on her own werkproces-progress rows; the
  studentSelfAssessment page; the "Volgende stap" card's button
  "Zelfbeoordeling afmaken" opens it with the placement.
- NotificationRecipientGroupsAreDeclaredTest no longer compares a read
  rule array as a group name (the PHP warning in the full suite).

OpenSpec: guardian-tasks-per-child-and-self-assessment
Links 71 rows that carried a placeholder reason to the 31 new learniq boards
(some rows to two boards), gives att-learner-submits-an-excuse its real reason
(absence is reported in the portaliq portal), and adds seven specScreens
entries: six specs on their boards, i18n-locale-parity with a no-UI reason.
chore(parity): every capability on a screen, second pass
* docs(openspec): changes for the school portal screens

Thirteen new spec-only changes for what the school boards on
identity.conduction.nl/screens show that no learniq spec or open change
covers, and portal-public-index extended with the test schedule and the
school-day categories the editor boards read.

* docs(openspec): record the decisions on invoices and exam registration
…ory week (#1880)

The vo set gave H4b lessons only on Monday 5 and Tuesday 6 October, so
"Je rooster vandaag" was empty from Wednesday on after the load moved the
week (proof run 3). The generator now writes the rest of the week in the
shape of the Monday, last, so no existing uuid moves.

OpenSpec: vo-timetable-every-school-day
Portaliq stores jwt_signing_secret as a sensitive app value, so the
legacy IConfig::getAppValue() returns the encrypted value. The verifier
HMAC-checked every X-Portal-Subject assertion against that ciphertext,
and every portal action answered 401.

The verifier now depends on IAppConfig instead of IConfig and reads
getValueString('portaliq', 'jwt_signing_secret', '', lazy: false), which
decrypts it. Adds a regression test that fails on the old read path.

This branch has not been deployed

No deployments
Sign up for free to 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.

1 participant