Repository navigation
Release: merge development into beta - #1210
github-actions[bot] wants to merge 31 commits into
Conversation
…0261007125751 chore(sync): carry beta back into development
…1) (#1181) * test(mobile): offline reading and accessibility audits on Android and iOS (tasks 3.4, 3.1) OfflineReadingTest syncs, cuts the network and proves the server is out of reach, unlocks offline, reads an item from the store with the last-synced note, finds every edit refused, and syncs again once the network is back. AccessibilityAuditTest runs the Accessibility Test Framework through Compose's enableAccessibilityChecks on the main screens (API 34); AccessibilityAuditUITests runs performAccessibilityAudit on the same screens on iOS. Both collect every finding and fail once at the end with the list. * build(mobile): name every shared-core test in the CI log The Mobile jobs showed only the Gradle tasks. Ticking a task against CI needs the test that ran, so the jvm, Android and iOS simulator tests now log each test with its result. * test(mobile): the offline test reads the store file without its key (task 1.6) After the sync, the SQLCipher file and its journal hold no SQLite header and none of the demo vault's names, logins or addresses, and plain SQLite refuses to read it. * docs(parity): clients-10 is building, with the merged mobile PRs and the preview release parity_verify --strict: no finding but the unknown-cells census. * build(mobile): checksums for the jars the Android test classpath selects guava 31.0.1-android, checker-qual 3.22.1 and j2objc-annotations 1.3 win on the androidTest classpath (the existing guava entries are the jre variant). Their sha256 was checked against Maven Central's published sha1. The other binaries of the accessibility test closure are listed too, so a version that wins resolution is never missing. * fix(mobile): the accessibility audit's findings on Android and iOS (task 3.1) Android: the auto-lock radio rows were 24 dp touch targets; they are 48 dp. iOS: Keepiq's own tint and secondary text colour pass WCAG AA (the system blue is 4.0:1 on white), section headers use it, the generator's refresh button takes taps on 44 pt, a Send row is one element, the code countdown grows with Dynamic Type, and a long value wraps instead of clipping. Three audit kinds are excluded with their reason in A11yExclusions: clipping on single-line text fields, the item's own login or address as a label, and SwiftUI text styles reported as partially unsupported. * fix(mobile): the remaining iOS audit findings (task 3.1) A darker red for destructive list buttons (the system red is 3.6:1 on white), the code countdown in Keepiq's tint with primary text, a field row that puts its buttons under a long value at the accessibility text sizes, and a generated value that wraps. The audit no longer counts contrast on a disabled control (WCAG 1.4.3 exempts inactive components) or on text that iOS 26 fades under a bar on purpose (the scroll edge effect). * fix(mobile): last iOS audit findings: explicit tint on Edit and Move, plain countdown label, no disabled Send password field The one-time code gets its own list section, so its refresh does not re-lay out the address. The audit leaves out a contrast finding it cannot tie to an element only while a list row sits under a bar. * test(mobile): measure contrast from the screenshot before counting an iOS audit finding The audit flags the Edit button although its pixels are Keepiq's tint on white (7.1:1), the same as the Move button that passes. A contrast finding is now left out only when the measured ratio is 4.5:1 or more. The audit also holds the one-time code still, since a countdown redrawing during the pass made it report the address as clipped. * fix(mobile): let a long address wrap at its slashes and dots on iOS A value without spaces could only be cut off at large text sizes; the audit reported the address on the one-time code screen as clipped. A zero-width space after each slash, dot and @ gives it break points, while VoiceOver and Copy keep the value as it is. Drops the held countdown, which did not change the finding. * docs(openspec): tick the clients-mobile-apps tasks CI now covers, split out the manual device checks
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-07 15:01 UTC
Download the full PDF report from the workflow artifacts.
…ived changes Step 1: clients-15 gets openspec/changes/clients-vault-event-flow-triggers. Step 2: twelve unbuilt rows pointed at changes that were archived on 2026-10-04; their links now name the archive path.
…delivered it Step 3: 132 built rows had no link. 59 now name the archived change that delivered them, 71 name the main spec (several changes shaped it), and two (clients-16 theming, clients-17 walkthrough) were never specified.
…none Step 4: extension generator, extension sends, extension vault, extension offline snapshot and the metadata-only AI assistant tools were specified and built but had no capability row. Competitor cells are unknown.
Step 5: 152 rows name their board(s) on canvas 5NkFW28vZUUij43xzxHg5a; 48 rows have no board, with the reason (backend, a Nextcloud or integriq surface, or not designed yet).
…links docs(openspec): specs for unbuilt capabilities, capability-to-spec links
…4 October Ten rows are built on development and read built; apps-22 (registry publication owed) and clients-01 (store listings owed) read building. audit-15 stays partial with sharper evidence: no alert for failed unlocks or admin changes.
clients-17 was built without a spec. The new main spec describes the manifest tour, the lock-state gate and the per-user completion preference as they are on development. clients-16 stays spec none: theming comes from Nextcloud theming or thematiq.
docs(openspec): re-rated rows and specs for unspecified built capabilities
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-07 21:25 UTC
Download the full PDF report from the workflow artifacts.
Archives client-side-key-generator and standalone-app-shell; the latter removes every apphost-adoption requirement, so that capability is retired.
docs(openspec): archive pass, changes the code has delivered
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-07 22:52 UTC
Download the full PDF report from the workflow artifacts.
…new boards Every row with a Keepiq board now points at canvas part 2 (QAAxpcsFKBCvDUGbQbwtCa); clients-15 keeps part 1 for pipelinq's flow boards. Five of the six new boards are mapped (KqRondleiding gives clients-17 its first board); KqMeldingen is a catalogue of empty states with no capability of its own.
docs(openspec): link capabilities to the split design canvas and its new boards
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-08 05:56 UTC
Download the full PDF report from the workflow artifacts.
* 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
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-08 12:27 UTC
Download the full PDF report from the workflow artifacts.
…0261008125803 chore(sync): carry beta back into development
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-08 13:20 UTC
Download the full PDF report from the workflow artifacts.
chore(parity): normalise features in the capability matrix
chore(parity): every spec under a feature, every capability on a screen
chore(parity): link the placeholder rows to their new keepiq boards
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ 177/177 · 20 skipped | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-08 16:00 UTC
Download the full PDF report from the workflow artifacts.
…#1243) Ruben decided on 2026-10-09 that connection certificates live in keepiq and integriq shows their expiry with a renew link. Modifies integration-boundary with one named exception (notAfter and a renew link, organisation broker credentials minted by integriq only) and lets a minted certificate carry its expiry. Spec only.
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ 177/177 · 20 skipped | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-09 22:36 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Newman | ✅ 177/177 · 20 skipped | ||||
| Playwright | ⏭️ not run for this diff — no file in this diff matches the code globs, and none carries a source extension — the heavy tier has nothing to decide about it. | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-12 09:56 UTC
Download the full PDF report from the workflow artifacts.
A folder delete with a resolution plan moved or purged the folder's direct secrets before it applied the subfolder actions, so a `keep` that clashed with a name one level up answered 409 after the secrets were already gone (keepiq#1248). - Every subfolder action and every kept name is checked before the first write. - The writes of a cascade or plan delete commit in one transaction. - A kept subfolder named like the deleted folder is no longer refused with a 409, since the only folder with its name is the one being deleted.
…t files cannot honour The folder-delete scenario now names the exception for attachment files already purged inside the transaction, which a rollback cannot restore. Thread: #1250 (comment) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Wilco Louwerse <wilco@louwerse.com>
fix(review): #1250 review findings, round 1
fix(secrets): make folder delete all-or-nothing
Quality Report — ConductionNL/keepiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 114/114 | |||
| npm | ✅ | ✅ 660/660 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ✅ 2136/2136 · 3 skipped (8 legs, 2018–2136 tests per leg) | ||||
| Newman | ✅ 177/177 · 20 skipped | ||||
| Playwright | ✅ 99/99 · 6 skipped | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-10-12 13:29 UTC
Download the full PDF report from the workflow artifacts.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.