Skip to content

feat(parity): wave 5, competitor source reads at tags, sources and 50 demand rows - #661

Merged
rubenvdlinde merged 13 commits into
developmentfrom
parity/wave5-competitor-source-read
Sep 26, 2026
Merged

rubenvdlinde merged 13 commits into
developmentfrom
parity/wave5-competitor-source-read

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Wave 5 for planninq's parity matrix. The four open-source competitor columns were driven in round 4 two weeks ago. This PR adds a source read of every row at a release tag for each of them, a fresh public-docs read of Jira, a sources object on every competitor, and 50 demand rows mined from feature requests, changelogs, a roadmap and a TenderNed tender. Nothing was re-driven and no lab was booted. The diff is openspec/parity/capabilities.json only; no page, test or code changed, so the product's suites are unaffected and were not run.

Read against development at 575c574, which equals ls-remote. The own-column reader read the tree at eb04087, which differs from 575c574 only by this branch's matrix commits.

How each competitor was read

  • Nextcloud Deck: source read at v1.19.0 (2aa6446) on 2026-09-26. v1.19.0 is the Nextcloud 35 line and matches the workspace server 35.0.1. It was driven at 1.18.4 on Nextcloud 34, so the grade stays driven with the note "source read at v1.19.0, driven at 1.18.4 on NC 34". A cell resting on the Nextcloud server is partial with "provided by the Nextcloud server" in its evidence.
  • OpenProject: source read at v17.8.0 (2d1ae9c), the latest release, on 2026-09-26. It was driven at 16.6.10, so the grade stays driven with "source read at v17.8.0, driven at 16.6.10". Enterprise-token features are partial, citing the gate. The system entry carries a roadmapNote taken from openproject.org/roadmap, which lists quarters, not versions. The note is not used as ratings.
  • Plane: source read at v1.4.2 (5f7d927), the driven tag, so the grade stays driven. The round-4 code census had been read at 2f895b8, not at the tag, so every cite was re-derived in the tag tree. Stubs that always return disabled are not credited: the filter exclusion, an undefined bulk route, an unopened bulk-delete modal, milestones and the duplicate-issue hook.
  • Kanboard: source read at v1.2.54 (9ce6a5e), the driven tag, so the grade stays driven. Third-party plugins give partial at most.
  • Jira Software Data Center 11: closed source, re-read on 2026-09-26 from public Atlassian docs, release notes, the Atlassian roadmap and the public tracker jira.atlassian.com. No trial account, no login, no browser. Plugin rule, as everywhere in wave 5: a capability that needs a named Marketplace app is partial, citing the app and its Data Center 11 build, never yes. The 13 Sep reading used no for the same cases.

Every source-read cell keeps the round-4 drive evidence and adds "source read at : path:line" beside it. Every path:line was checked to exist in the tag tree by a pack checker before folding. A rating moved only where the code contradicts the drive.

column y/p/n/u before (148) after, same 148 new rows (50) after, all 198 cells changed on the 148
planninq 36/30/81/1 36/30/81/1 5/6/39/0 41/36/120/1 0
nextcloud-deck 59/24/65/0 57/27/64/0 3/7/40/0 60/34/104/0 3
openproject 94/31/23/0 93/33/22/0 18/15/17/0 111/48/39/0 2
plane 58/29/60/1 59/29/60/0 8/8/34/0 67/37/94/0 3
kanboard 68/37/43/0 67/39/42/0 5/9/36/0 72/48/78/0 2
jira 84/33/28/3 86/37/25/0 10/23/17/0 96/60/42/0 8
system grade before readOn before grade after readOn after source read
nextcloud-deck driven 2026-09-13 driven 2026-09-13 v1.19.0 2aa6446
openproject driven 2026-09-12 driven 2026-09-12 v17.8.0 2d1ae9c
plane driven 2026-09-12 driven 2026-09-12 v1.4.2 5f7d927
kanboard driven 2026-09-13 driven 2026-09-13 v1.2.54 9ce6a5e
jira docs-only 2026-09-13 docs-only 2026-09-26 none (closed)

Planninq's own column on the 148 existing rows is unchanged. On the new rows it reads 5 yes, 6 partial and 39 no from its code.

Every rating change on a cell that existed before (18)

  • brd-keyboard-move jira: unknown to yes. docs read 2026-09-26: https://jira.atlassian.com/browse/JRASERVER-73305 bug 'The issues can not be moved from one column to another using keyboard', Closed, Done, fix version 9.5.0 (via the tracker REST API); https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html does not name the keys (read ...
  • tsk-checklist jira: no to partial. docs read 2026-09-26, contradicts the drive: 2026-09-13 rated no with checklists named as Marketplace apps; under this lane's rule a capability that needs a paid Marketplace app is partial, and Checklists for Jira by HeroCoders ships a Jira 11 Data Center build https://jira.atlassian.com/browse/JRASERVER-47605 'To-do lists ...
  • pln-calendar-view jira: no to partial. docs read 2026-09-26, contradicts the drive: 2026-09-13 rated no because a calendar is a Marketplace app; the Marketplace now lists Atlassian's own free, Data Center compatible Jira Calendar Plugin 8.0.0, so by the Marketplace rule it is partial https://marketplace.atlassian.com/apps/293/jira-calendar-plugin?hosting=datacenter ...
  • tim-timesheet jira: no to partial. docs read 2026-09-26, contradicts the drive: 2026-09-13 rated no with timesheets named as Marketplace apps; under this lane's rule a capability that needs a paid Marketplace app is partial, and Timesheets by Tempo ships a Jira 11 Data Center build https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', ...
  • tim-approval jira: no to partial. docs read 2026-09-26, contradicts the drive: 2026-09-13 rated no (approval is Jira Service Management, no timesheet object); under this lane's rule a paid Marketplace app makes it partial, and Timesheets by Tempo offers timesheet approval on Jira 11 Data Center ...
  • prt-leave-aware jira: unknown to no. docs read 2026-09-26: https://jira.atlassian.com/browse/JSWSERVER-25072 'Individual capacity planning is not available in the new experience ... including team member availability', Not Being Considered, 104 votes; JSWSERVER-1333 per-assignee non-working days, Gathering Interest, 203 votes; ...
  • prt-placeholder jira: unknown to partial. docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html 'Teams in Advanced Roadmaps act as a label to designate which team will eventually pick up the work ... then assign them to individuals'; 'Private teams only exist within your plan': a team stands in before a ...
  • plt-i18n jira: partial to yes. docs read 2026-09-26, contradicts the drive: 2026-09-13 said Dutch is not listed on the translating page; the choosing a default language page lists Dutch and English among the default languages Jira ships with https://confluence.atlassian.com/adminjiraserver/choosing-a-default-language-938847001.html 'When Jira is first ...
  • prj-status-filter kanboard: yes to partial. source read at v1.2.54, contradicts the drive: the drive recorded a status filter on the project list citing ProjectStatusFilter; the code at v1.2.54 never mounts that filter, the list can only be sorted by status and searched by name app/Controller/ProjectListController.php:27-31 the project list takes only a name search; ...
  • pln-reminder-lead-time kanboard: no to partial. source read at v1.2.54, contradicts the drive: the drive searched the overdue command options and config constants and found no lead time; the code ships a project manager set days-ahead parameter on an automatic action that can be chained to an email action, a workaround rather than a reminder setting ...
  • tsk-bulk nextcloud-deck: no to partial. source read at v1.19.0, contradicts the drive: the drive recorded no bulk change; the list menu changes the archive and done state of every card in a list at once, though no chosen set and no bulk assignee or label src/components/board/Stack.vue:54 'Archive all cards' and :311-316 archives every card in the list; :66 'Set cards ...
  • col-presence nextcloud-deck: yes to partial. source read at v1.19.0, contradicts the drive: the drive credited presence from the session model; the code shows it only when the separate notify_push app is installed, the same condition that holds col-live-updates at partial src/components/Controls.vue:32-33 SessionList 'Currently present people' shows only when ...
  • int-import-other nextcloud-deck: yes to partial. source read at v1.19.0, contradicts the drive: the drive credited Trello import from the menu; at v1.19.0 the Import board menu sends every file as DeckJson, so Trello comes in only through occ or the API and Jira and spreadsheets not at all Trello only, and outside the UI: lib/Service/Importer/Systems/TrelloJsonService.php and ...
  • prj-default-columns openproject: yes to partial. source read at v17.8.0, contradicts the drive: the drive read the docs as a Status board arriving with several status lists; the code creates one list (the default status), and a ready-made column set only comes from copying a template's boards modules/boards/app/controllers/boards/boards_controller.rb:120-129 board types ...
  • col-live-updates openproject: no to partial. source read at v17.8.0, contradicts the drive: the drive recorded that the work package page does not update when someone else edits it; the code polls the activity tab and refreshes the open work package's fields when another user changed it, while boards and lists still need a reload ...
  • tsk-checklist plane: no to partial. source read at v1.4.2, contradicts the drive: The drive recorded no checklist; the description editor ships a to-do list block with tickable items, so a checklist inside a task exists as rich text. packages/editor/src/core/extensions/extensions.ts:95 TaskList and TaskItem in the core editor, offered as 'To-do list' in ...
  • int-mobile plane: unknown to no. source read at v1.4.2, contradicts the drive: The drive left this unknown; the tree ships no mobile client and the vendor's mobile page says the app does not support the Community edition, so it is no for v1.4.2 Community. no mobile client in the v1.4.2 tree: searched apps/web, apps/space, packages/i18n/src/locales/en and ...
  • plt-guest-access plane: partial to yes. source read at v1.4.2, contradicts the drive: The drive left open whether a workspace guest sees public-to-workspace projects; the code filters a guest's project list to projects they are a member of and bars self-join, so a guest reaches one project only. apps/web/core/components/workspace/invite-modal/fields.tsx:94-99 invite ...

The four Jira changes on pln-calendar-view, tsk-checklist, tim-timesheet and tim-approval follow the plugin rule. Jira itself did not change.

Sources per system

  • nextcloud-deck: present: docs, sourceRepo, featurePage, featureRequests, issueTracker, changelog, apiReference, marketplace, pricing, securityDocs, demoInstance, community, caseStudies, partnerDirectory, trainingCurriculum, jobPostings. Null: roadmap (no public Deck roadmap: gh api repos/nextcloud/deck/milestones?state=open returned none, and github.com/nextcloud/roadmap is a 404); accessibilityStatement (none found: nextcloud.com/accessibility/, nextcloud.com/accessibility-statement/ and the server user manual accessibility page all return ...); reviews (the G2 Nextcloud review page answers 403 to automated fetches and was not confirmed; app store ratings sit on the marketplace page); videos (no Deck-specific video page found; only the generic youtube.com/@nextcloud channel, which is not about Deck); tenders (searched the intelligence database tenders (name and description) for 'nextcloud deck' on 2026-09-26: no tender names Deck).
  • openproject: present: docs, sourceRepo, featurePage, featureRequests, issueTracker, roadmap, changelog, apiReference, pricing, accessibilityStatement, securityDocs, demoInstance, community, reviews, videos, caseStudies, trainingCurriculum, jobPostings, tenders. Null: marketplace (no plugin or app marketplace: extensions ship as bundled modules in the repo (modules/); the nearest listing is the Nextcloud app store ...); partnerDirectory (no partner directory found: /partners/, /partner/, /partners-program/ and /become-a-partner/ on openproject.org return 404, and the ...).
  • plane: present: docs, sourceRepo, featurePage, featureRequests, issueTracker, changelog, apiReference, marketplace, pricing, securityDocs, community, videos, caseStudies, partnerDirectory, jobPostings. Null: roadmap (https://plane.so/roadmap returns 404 and the plane.so homepage links no roadmap; the repo README names none); accessibilityStatement (https://plane.so/accessibility returns 404 and the homepage footer links no accessibility statement); demoInstance (https://plane.so/demo returns 404; app.plane.so is a cloud sign-up, not a shared demo); reviews (https://www.g2.com/products/plane/reviews and https://www.capterra.com/p/10013155/Plane/ both answer 403 to a scripted fetch, so neither ...); trainingCurriculum (https://plane.so/academy and https://plane.so/webinars return 404; docs.plane.so is reference documentation, not a course); tenders (searched the intelligence database tenders (name and description) for 'makeplane' and 'plane' next to project on 2026-09-26: no tender ...).
  • kanboard: present: docs, sourceRepo, featurePage, featureRequests, issueTracker, changelog, apiReference, marketplace, securityDocs, community, reviews. Null: roadmap (no roadmap on kanboard.org or docs.kanboard.org; the repo has no GitHub projects (gh api repos/kanboard/kanboard/projects: 404) and no ...); pricing (Kanboard is free MIT software with no paid tier or hosted plan; kanboard.org has no pricing page); accessibilityStatement (no accessibility statement on kanboard.org, docs.kanboard.org or in the repo tree); demoInstance (no official demo; https://kanboard.org/demo returns 404 and the site links none); videos (no official video channel linked from kanboard.org or the docs); caseStudies (none published on kanboard.org or the docs; a single maintainer open source project); partnerDirectory (no partner or integrator programme on kanboard.org); trainingCurriculum (none beyond the user guide at https://docs.kanboard.org/v1/user/); jobPostings (no organisation behind the project that hires; nothing on kanboard.org or GitHub); tenders (searched the intelligence database tenders (name and description) for 'kanboard' on 2026-09-26: none).
  • jira: present: docs, featurePage, featureRequests, issueTracker, roadmap, changelog, apiReference, marketplace, pricing, accessibilityStatement, securityDocs, community, reviews, videos, caseStudies, partnerDirectory, trainingCurriculum, jobPostings, tenders. Null: sourceRepo (closed source: Jira Software Data Center source is not published); demoInstance (no public demo; https://www.atlassian.com/migration says new customers can no longer buy or quote Data Center since 30 March 2026, and the ...).
    • tenders: 112 tenders across eight sources name Jira or Atlassian (intelligence database, searched name and description on 2026-09-26); the Dutch product tenders: TenderNed 358912 and 371447 (Universiteit van Amsterdam, Jira and Confluence cloud migration), 388283 and 413726 (Nederlands Instituut Publieke Veiligheid, Atlassian licences), 393539 (Luchtverkeersleiding Nederland, Atlassian and GitLab management), 411960 and ...

Demand rows added (50)

Origins: 10 tender, 25 featureRequest, 14 changelog, 1 roadmap. Each row carries origin and originUrl. The ten tender rows come from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (363 requirements in the intelligence database); the requirement numbers are in each row's note.

Deduplication decisions:

  • Deck's tsk-custom-fields was dropped as a duplicate of the pending row.
  • OpenProject's prj-risk-log merged into the tender row prj-risk-register.
  • tsk-readable-key merges OpenProject and Kanboard.
  • col-comment-images merges Deck and Kanboard.
  • plt-2fa merges Plane and Kanboard.
  • plt-ai-assist merges Plane and the OpenProject roadmap.
  • col-edit-conflict merges Kanboard and Jira.

Ratings below are in the order pq / deck / op / plane / kb / jira.

Planninq leads the field on none of the new rows. The 39 no include ten rows where a schema field, a manifest note or a placeholder view nearly credited planninq: tsk-readable-key, tsk-all-day-due, prt-portfolio-finance, bkl-sprint-goal, bkl-planning-poker, bkl-intake-triage, tsk-review-approval, tsk-merge, pln-phase-gate-document and pln-calendar-writeback. Each names the declaration in built.evidence and stays no under the rule that a declaration is a claim. Three platform-provided yes cells carry their provider and owner: plt-2fa and plt-security-insights (nextcloud/server), and plt-outbound-guard (ConductionNL/openregister).

Defects for the issues lane (code readings, each needs a live check)

  • brd-column-count: src/views/ProjectBoard.vue:118 the count span is aria-hidden, and the column's aria-label at :109 is the column name only, so a screen-reader user never hears the count.
  • col-group-mention: src/views/TaskDetail.vue:129-137 has no @mention handler, so mentions notify nobody. This is the same defect as tsk-mentions, already known.
  • plt-rtl: l10n/ has no ar, he or fa catalogue, and src/views/ProjectTimeline.vue:101 positions bars with a physical left offset, so the Gantt would not mirror.
  • tsk-merge: src/components/TaskDependencies.vue is mounted by no view. Already recorded on pln-dependencies.
  • The own-column reader named nine live-check candidates in total. The four above are the ones written into built.defects on disk; the rest are in the reader's report to the coordinator.

Verifier

Before (148 rows), report profile:

parity-verify: openspec/parity/capabilities.json
  148 rated rows, 9 pending, 6 systems

system-without-sources  (5)
    system 'nextcloud-deck' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'openproject' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'plane' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'kanboard' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for
    system 'jira' has no sources object, so nobody can tell which of its docs, roadmap, changelog and tenders were looked for

unknown-cells  (1)
    5 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[brd-keyboard-move] jira, capabilities[prt-leave-aware] jira, capabilities[prt-placeholder] jira, capabilities[int-mobile] plane, capabilities[plt-accessibility] planninq

6 finding(s) in 2 check(s)
report-only: pass --strict to fail on these

Before, --strict:

parity-verify: openspec/parity/capabilities.json
  148 rated rows, 9 pending, 6 systems

unknown-cells  (1)
    5 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[brd-keyboard-move] jira, capabilities[prt-leave-aware] jira, capabilities[prt-placeholder] jira, capabilities[int-mobile] plane, capabilities[plt-accessibility] planninq

1 finding(s) in 1 check(s)

After (198 rows), report profile:

parity-verify: openspec/parity/capabilities.json
  198 rated rows, 9 pending, 6 systems

unknown-cells  (1)
    1 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[plt-accessibility] planninq

1 finding(s) in 1 check(s)
report-only: pass --strict to fail on these

After, --strict (exits 1 only on the unknown census, as before):

parity-verify: openspec/parity/capabilities.json
  198 rated rows, 9 pending, 6 systems

unknown-cells  (1)
    1 cells rate unknown. That is legitimate, and it is listed so it cannot hide: capabilities[plt-accessibility] planninq

1 finding(s) in 1 check(s)

system-without-sources went from 5 to 0. The unknown census went from 5 cells to 1 (planninq's own plt-accessibility, unchanged).

Images pulled

None. No lab was booted, because the four open-source columns were driven two weeks ago and this wave adds source reads only.

Inherited, not fixed here

  • Ten inherited double-dash separators in existing notes were rewritten as commas (first commit), per the parity-verify dash rule.
  • pln-due-reminder and prt-task-status name provider: openregister while built.owner says ConductionNL/planninq. These predate this PR and belong to the next corrections pass.

Where the method was harder

  • An account session limit killed both first readers mid-run. Packs written every six rows meant both restarted append-only from the first missing id with nothing lost.
  • The input rows carry planninq's note, and readers were told not to treat it as competitor evidence. The fold takes only a reader's cite.
  • The drive corpus and the tag disagree for Plane (the census was read at 2f895b8), and the drive and tag versions differ for Deck (NC 34 vs 35) and OpenProject (16.6 vs 17.8). Each system entry records sourceRead {tag, commit, readOn} next to the drive date, because the grade enum has no value for a source read.
  • The OpenProject roadmap is by quarter, not version, so "flips in 17.9 or 18.0" could not be stated. The note records quarters and statuses instead.
  • Jira needs a ruling to rate consistently: without the plugin rule, the same capability read no on 13 Sep and partial today.
  • The proposer's own rating of each demand row came from the demand files, while the other columns came from back-fill readers. Eight Jira proposer cites carried the URL only in originUrl and were fixed before folding.

🤖 Generated with Claude Code

…s recorded, three drive contradictions re-rated
…s recorded, three drive contradictions re-rated
…nboard and Plane feature requests and changelogs, deduplicated with the tender rows
@rubenvdlinde
rubenvdlinde merged commit f78e24c into development Sep 26, 2026
30 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/planninq @ ec3d6e3

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
check-manifest ✅
check-l10n-js ✅
check-schema-l10n ✅
composer ✅ ✅ 107/107
npm ✅ ✅ 646/646
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 ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it on any branch from the Actions tab, or locally with npx playwright test.
Hydra gates ✅

Quality workflow — 2026-09-26 22:11 UTC

Download the full PDF report from the workflow artifacts.

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