From 1ea0b35b0fbb7321f9abba6909c7b0d6fd0e6b1c Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 17:03:42 +0200 Subject: [PATCH 01/13] chore(parity): rewrite ten inherited double-dash separators as commas --- openspec/parity/capabilities.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 430df0ce..b69795ed 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -346,7 +346,7 @@ "providerHow": "read-from-code", "feature": "projects", "featureConfidence": "high", - "note": "archiving works and removes the project from the active list. There is no restore/unarchive action anywhere in src/ (no button, no store action) -- an archived project can only be reopened by filtering the list to Archived and there is nothing there to bring it back to active from the UI." + "note": "archiving works and removes the project from the active list. There is no restore/unarchive action anywhere in src/ (no button, no store action), an archived project can only be reopened by filtering the list to Archived and there is nothing there to bring it back to active from the UI." }, { "id": "prj-delete", @@ -766,7 +766,7 @@ "providerHow": "read-from-code", "feature": "kanban-board", "featureConfidence": "high", - "note": "columns are the fixed task-status enum (open/in_progress/blocked/done/cancelled, src/utils/taskHelpers.js:252), not the project's own configurable `column` records -- see prj-default-columns/brd-columns-edit." + "note": "columns are the fixed task-status enum (open/in_progress/blocked/done/cancelled, src/utils/taskHelpers.js:252), not the project's own configurable `column` records, see prj-default-columns/brd-columns-edit." }, { "id": "brd-drag-drop", @@ -848,7 +848,7 @@ "built": { "state": "built", "evidence": "`wipLimit` is written on `column` objects at project creation (src/store/projects.js:106-110 getDefaultColumns, e.g. 3/2), but src/views/ProjectBoard.vue never fetches the `column` schema at all (only COLUMN_SCHEMA writes/deletes exist in src/store/projects.js:28,138-139,476,564,566) and there is no wipLimit reference anywhere in src/ (grep confirmed zero matches outside the store's own write path).", - "reachedOn": "nothing reaches it -- the board has no per-column WIP badge", + "reachedOn": "nothing reaches it, the board has no per-column WIP badge", "owner": "ConductionNL/planninq", "defects": [ "src/views/ProjectBoard.vue: no WIP-limit badge or read of the `column` schema's wipLimit field" @@ -948,7 +948,7 @@ "providerHow": "read-from-code", "feature": "kanban-board", "featureConfidence": "high", - "note": "only label filtering exists. Grep for assignee/priority filter UI on the board found nothing -- task.assignedTo and task.priority are displayed on the card (TaskCard.vue) but not filterable." + "note": "only label filtering exists. Grep for assignee/priority filter UI on the board found nothing, task.assignedTo and task.priority are displayed on the card (TaskCard.vue) but not filterable." }, { "id": "brd-list-toggle", @@ -970,7 +970,7 @@ }, "built": { "state": "building", - "evidence": "src/views/ProjectBacklog.vue:24-30 renders NcEmptyContent 'Backlog view coming soon' / 'Task management will be available in a future update.' -- an explicit placeholder, not a working list view.", + "evidence": "src/views/ProjectBacklog.vue:24-30 renders NcEmptyContent 'Backlog view coming soon' / 'Task management will be available in a future update.', an explicit placeholder, not a working list view.", "reachedOn": "ProjectBacklog page /projects/:id/backlog (placeholder only)", "owner": "ConductionNL/planninq" }, @@ -1061,7 +1061,7 @@ }, "built": { "state": "none", - "evidence": "no add-card/add-task control exists on src/views/ProjectBoard.vue. Wider check: there is no task-creation code path anywhere in the app -- no createTask action in src/store/projects.js (only fetchTasks/updateTaskStatus/updateTask), no POST to the task schema anywhere in src/, and src/views/ProjectBacklog.vue:24-30 is an explicit placeholder pending future task CRUD.", + "evidence": "no add-card/add-task control exists on src/views/ProjectBoard.vue. Wider check: there is no task-creation code path anywhere in the app, no createTask action in src/store/projects.js (only fetchTasks/updateTaskStatus/updateTask), no POST to the task schema anywhere in src/, and src/views/ProjectBacklog.vue:24-30 is an explicit placeholder pending future task CRUD.", "reachedOn": "nothing reaches it", "owner": "ConductionNL/planninq", "defects": [ @@ -1891,11 +1891,11 @@ }, "built": { "state": "built", - "evidence": "The dependency schema declares a non-blocking 'type' enum (blocks/relates/duplicates/clones/splits/causes, lib/Settings/planninq_register.json dependency.properties.type), but src/store/dependencies.js:81-100 createEdge() only ever POSTs {blocker, blocked} with no type, so the server always defaults to 'blocks'. Worse, the only component that could create any edge, src/components/TaskDependencies.vue, is never imported by any other file in src/ (grep across src/ finds it only in its own file) -- it is not mounted on TaskDetail or anywhere else, so even blocking dependencies have no reachable UI.", + "evidence": "The dependency schema declares a non-blocking 'type' enum (blocks/relates/duplicates/clones/splits/causes, lib/Settings/planninq_register.json dependency.properties.type), but src/store/dependencies.js:81-100 createEdge() only ever POSTs {blocker, blocked} with no type, so the server always defaults to 'blocks'. Worse, the only component that could create any edge, src/components/TaskDependencies.vue, is never imported by any other file in src/ (grep across src/ finds it only in its own file), it is not mounted on TaskDetail or anywhere else, so even blocking dependencies have no reachable UI.", "reachedOn": "nothing reaches it (TaskDependencies.vue is an orphan component)", "owner": "ConductionNL/planninq", "defects": [ - "src/components/TaskDependencies.vue is never imported/mounted by any view or component in src/ -- a full dependency-editing UI with no caller", + "src/components/TaskDependencies.vue is never imported/mounted by any view or component in src/, a full dependency-editing UI with no caller", "src/components/BlockedBadge.vue is likewise never imported/mounted anywhere in src/", "src/store/dependencies.js:81 createEdge() has no `type` parameter, so even if wired up it could never create the non-blocking 'relates'/'duplicates'/etc edges the schema declares" ] @@ -2215,7 +2215,7 @@ }, "built": { "state": "built", - "evidence": "The only 'roadmap' page in the app, FeaturesRoadmap (src/manifest.json, route /features-roadmap, type 'roadmap'), is the app's OWN development roadmap: its _note says it is 'Rendered by the shared CnFeaturesAndRoadmapView, which reads the committed docs/features.json and OpenRegister's GitHub proxy' -- it shows Planninq's own GitHub feature/issue roadmap, not a roadmap of the user's epics, projects or releases.", + "evidence": "The only 'roadmap' page in the app, FeaturesRoadmap (src/manifest.json, route /features-roadmap, type 'roadmap'), is the app's OWN development roadmap: its _note says it is 'Rendered by the shared CnFeaturesAndRoadmapView, which reads the committed docs/features.json and OpenRegister's GitHub proxy', it shows Planninq's own GitHub feature/issue roadmap, not a roadmap of the user's epics, projects or releases.", "reachedOn": "FeaturesRoadmap page /features-roadmap, but it is the product's own roadmap, not a user-data roadmap", "owner": "ConductionNL/planninq" }, @@ -4650,7 +4650,7 @@ "providerHow": "read-from-code", "feature": "projects", "featureConfidence": "medium", - "note": "a schema exists with no screen, no store, no controller at all -- not even a display. Kept pending per the reading method." + "note": "a schema exists with no screen, no store, no controller at all, not even a display. Kept pending per the reading method." }, { "id": "tsk-types", From 63750ad908fad1d1f39f54c164c74cb2aaefa596 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 17:06:56 +0200 Subject: [PATCH 02/13] feat(parity): add ten tender demand rows from TenderNed 365739, every cell unknown until read --- openspec/parity/capabilities.json | 234 ++++++++++++++++++++++++++++-- 1 file changed, 222 insertions(+), 12 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index b69795ed..f3a157cb 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -173,7 +173,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add board' ; source: lib/Db/Board.php:33-51 a board has title, owner, colour, settings; no short key and no description field", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add board' ; source: lib/Db/Board.php:33-51 a board has title, owner, colour, settings; no short key and no description field ; source read at v1.19.0: lib/Db/Board.php:34-53 a board has title, owner, teamId, colour, archived, settings and no key or description; src/components/navigation/AppNavigationAddBoard.vue:19 'Board name' is the only input; lib/Service/BoardService.php:188 create(title, userId, color); searched lib/Db/Board.php for 'description', 'key', 'identifier': none", "kanboard": "corpus: kanboard/round4/journeys.md 1 'createProject Vergunningen with identifier VERG' ; source: app/Model/ProjectModel.php:129 getByIdentifier, project description on the Edit project form", "openproject": "corpus: openproject/round4/menu-tree.md 'Projects' global module and 'Project settings > Information'; corpus: openproject/round4/M1-column.md 11.23 project attributes; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md (name, identifier, description) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'you must provide: a name ... a key ... and designate a project lead', description added after creation; corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'", @@ -206,7 +206,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings ... group limit for board creation (admin)' ; source: lib/Service/PermissionService.php:345-363 canCreate reads groupLimit", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings ... group limit for board creation (admin)' ; source: lib/Service/PermissionService.php:345-363 canCreate reads groupLimit ; source read at v1.19.0: src/components/DeckAppSettings.vue:26-37 admin section 'Limit board creation to some groups' (multi-select of groups); lib/Service/ConfigService.php:209 stores groupLimit; lib/Service/PermissionService.php:368-383 canCreate allows only members of the listed groups", "kanboard": "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions')", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Creating and configuring a project is done by an administrator'; restricted to admins, but no documented grant to a chosen non-admin group", @@ -236,7 +236,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'sharing with users, groups, teams and remote users, each with edit, share and manage' ; journeys.md 1 ACL for jdevries", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'sharing with users, groups, teams and remote users, each with edit, share and manage' ; journeys.md 1 ACL for jdevries ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:7 NcSelectUsers picker to add a user, group, team or remote user, :64 'Delete' removes the share; lib/Service/BoardService.php:419 addAcl and :541 deleteAcl, routes appinfo/routes.php:28-30", "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer)' ; menu-tree.md 'Permissions'", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Members'; corpus: openproject/round4/M1-column.md 11.19 'memberships in app/models/member.rb'", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' (Managing project roles, 2022-10-07); corpus: jira-data-center/round4/M1-column.md 13.4 Managing project role membership", @@ -267,7 +267,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'Acl: participant of type user, group, remote or team, with edit, share, manage' lib/Db/Acl.php:27-35 ; journeys.md 5 edit-only collaborator refused 403 on ACL change", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'Acl: participant of type user, group, remote or team, with edit, share, manage' lib/Db/Acl.php:27-35 ; journeys.md 5 edit-only collaborator refused 403 on ACL change ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:39-58 per share 'Can edit', 'Can share', 'Can manage', 'Owner' (transfer); lib/Db/Acl.php:31-34 PERMISSION_READ, EDIT, SHARE, MANAGE; lib/Service/PermissionService.php:131-132 owner or ACL grants manage and share", "kanboard": "corpus: kanboard/round4/usability.md 'three project roles and custom ones with column restrictions' ; journeys.md 5 custom role Toetser", "openproject": "corpus: openproject/round4/M1-column.md 13.1 'app/models/role.rb:31 with nine subtypes ... Permissions are rows ... against a catalogue declared in code'; corpus: openproject/round4/M1-column.md 13.16 roles and permissions matrix", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 global permissions and project roles; corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission ... Assignable user Permission' (Managing project permissions)", @@ -297,7 +297,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "source: appinfo/routes.php:26 board#leave, lib/Service/BoardService.php:515 leave() ('Board owner cannot leave board'), src/components/navigation/AppNavigationBoard.vue:157 'Leave board' menu entry", + "nextcloud-deck": "source: appinfo/routes.php:26 board#leave, lib/Service/BoardService.php:515 leave() ('Board owner cannot leave board'), src/components/navigation/AppNavigationBoard.vue:157 'Leave board' menu entry ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:151-157 'Leave board' action; appinfo/routes.php:26 board#leave; lib/Service/BoardService.php:569-571 leave() refuses only the owner ('Board owner cannot leave board')", "kanboard": "source: grep -rniE 'leave' app/Controller returns 0 hits; membership is removed by a project manager under Permissions (corpus: kanboard/round4/menu-tree.md 'Permissions')", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'leave_project' finds only app/components/header/projects/node_component.html.erb:37, an 'x-circle' button that links to home_path (navigates away from the current project); removing a member needs manage_members; corpus: openproject/round4/M1-column.md 11.19 memberships administered, no self-removal found", "jira": "corpus: jira-data-center/round4/M1-column.md 13.4 'project roles have specific members for each project' edited on the Managing project role membership page by a project or Jira admin; no self-leave documented", @@ -327,7 +327,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards ...)' ; source: lib/Controller/BoardController.php:54 update(..., bool archived)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards ...)' ; source: lib/Controller/BoardController.php:54 update(..., bool archived) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:62-68 'Archive board' and :54-60 'Unarchive board' actions calling archiveBoard/unarchiveBoard (:364-370); lib/Controller/BoardController.php:54 update(id, title, color, archived)", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only", @@ -360,7 +360,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'deletedAt on cards, stacks, boards and attachments; trashRetentionHours' ; journeys.md 6 trash purge", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'deletedAt on cards, stacks, boards and attachments; trashRetentionHours' ; journeys.md 6 trash purge ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:144-148 'Delete board' with an undo (:8-15); lib/Service/BoardService.php:288-296 delete() sets deletedAt (manage permission), :318 deleteUndo; lib/Cron/DeleteCron.php:63-69 purges after the trash retention; lib/Db/BoardMapper.php:519-531 deleting a board deletes its ACL, stacks and their cards", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Remove' under Configure this project", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Copy project, Delete project'", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy'", @@ -390,7 +390,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards and Shared under each)' ; source: src/components/navigation/AppNavigation.vue:28 route /board/archived", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards and Shared under each)' ; source: src/components/navigation/AppNavigation.vue:28 route /board/archived ; source read at v1.19.0: src/components/navigation/AppNavigation.vue:19 'All boards', :28-31 'Archived boards' (/board/archived), :37-40 'Shared with you'; src/router.js:63-72 boards.archived and boards.shared routes; lib/Controller/BoardController.php:54 archived flag on the board", "kanboard": "source: app/Filter/ProjectStatusFilter.php status filter on the project list, app/Template/project_list/sort_menu.php:11 sort by Status ; corpus: kanboard/round4/menu-tree.md 'Projects management'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:117-135 filters 'Active projects', 'Archived projects', 'Project status - On track / Off track / At risk' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'A Jira project can only belong to one category'; 'An archived project will no longer appear in Jira' (archived projects page); no project status field to filter on", @@ -420,7 +420,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: lib/Service/BoardService.php:188-217 create() inserts default labels only and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board alone ; corpus: nextcloud-deck/round4/journeys.md 1 four lists added by hand", + "nextcloud-deck": "source: lib/Service/BoardService.php:188-217 create() inserts default labels only and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board alone ; corpus: nextcloud-deck/round4/journeys.md 1 four lists added by hand ; source read at v1.19.0: lib/Service/BoardService.php:188-217 create() inserts four default labels ('Finished', 'To review', 'Action needed', 'Later') and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board only; searched BoardService create for 'Stack', 'stackMapper->insert': none", "kanboard": "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'In an Action board each list represents a value of an attribute ... the Status board includes a list for the status New and a list for the status In Progress' (columns generated from statuses); Boards free (corpus: openproject/round4/menu-tree.md global 'Boards', not EE) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types')", @@ -454,7 +454,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' in Db/ return 0", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' in Db/ return 0 ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'billing', 'hourly', 'fixed price': none; lib/Db/Board.php:34-53 holds no commercial field", "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal' 26 hits 'none is a payment', 'currencies is a rate table for the task score' ; no budget or billing field on a project", "openproject": "corpus: openproject/round4/menu-tree.md project 'Budgets'; docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:11 'create and manage a project budget ... planned unit costs as well as labor costs'; no fixed-price or hourly billing term field (project attributes could hold it, corpus: openproject/round4/M1-column.md 11.23) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'the integrations page lists test management, source control and collaboration tools and nothing financial'; no budget or billing term on a project; only a custom field on issues (corpus: jira-data-center/round4/M1-column.md 2.2)", @@ -487,7 +487,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' (nearest: remote ACL type 6, code-census.md federation row)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' (nearest: remote ACL type 6, code-census.md federation row) ; source read at v1.19.0: the only non-account readers are federated users: lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE and lib/Controller/BoardOcsController.php:37-38 PublicPage read serves a federation token, not a portal; searched src/router.js for 'public', 'portal', 'share/': none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'There is no customer or citizen interface' (nearest: a project-viewer account or the public read-only board)", "openproject": "corpus: openproject/round4/M1-column.md 6.7 'there is no citizen portal'; nearest is per-item sharing, Enterprise gated (corpus: openproject/round4/M1-column.md 3.19 work_package_sharing)", "jira": "corpus: jira-data-center/round4/M1-column.md 6.7 'The customer portal is JSM DC, a separate licence'; 3.19 'a partner needs an account and a licence'", @@ -517,7 +517,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'template beyond the import config schema' ; nearest is Clone board (prj-copy)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'template beyond the import config schema' ; nearest is Clone board (prj-copy) ; source read at v1.19.0: searched lib/ and src/ for 'template' as a board feature: only psalm @template tags and lib/Provider/DeckProvider.php:94 SearchTemplate; nearest is clone board clone at appinfo/routes.php:31 and import at appinfo/routes.php:34", "kanboard": "source: app/Template/project_creation/create.php:23 'Create from another project' with components chosen, app/Model/ProjectDuplicationModel.php:43-55 swimlanes, board columns, categories, roles, actions, tags, filters, tasks ; corpus: kanboard/round4/menu-tree.md 'Duplicate'", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project templates'; corpus: openproject/round4/M1-column.md 3.10 'applying a project template (app/models/project.rb:110)'; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-templates (copies work packages, boards, wiki, members); no labels object exists (categories copy) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes' (schemes only, no tasks or labels copied)", @@ -4619,6 +4619,216 @@ "feature": "platform", "featureConfidence": "medium", "note": "There is no invite-a-guest flow; the guest must already exist as a Nextcloud user (Guests app). Labels (:1072) and dependency edges (:1118) stay readable to every authenticated user, guests included. The member picker only returns users to admins and subadmins (see defect), so an ordinary project owner may not be able to add anyone." + }, + { + "id": "prj-risk-register", + "area": "projects", + "name": "Keep a risk register per project that scores each risk on likelihood and impact and records its countermeasures.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4003, 4004, 64441 (risk table scored on likelihood and impact, format adjustable per portfolio).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prj-project-logs", + "area": "projects", + "name": "Keep logs per project for actions, issues, lessons learned and meetings.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4012 (logboeken voor acties, issues, leerpunten, bijeenkomsten), 64437.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prt-portfolio-finance", + "area": "portfolio", + "name": "See budget, spend, commitments and forecast totalled across all projects of a portfolio.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 3998, 3999, 4000 (financial tables per cost category and phase, totals at portfolio level).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "int-finance-import", + "area": "integration", + "name": "Import actual spend and commitments from the finance system into each project by its project number.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4001, 4023, 4127 (automated link with the financial system, project number as key).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "tim-non-project", + "area": "time", + "name": "Log time on non-project activities, such as training, leave and sickness, next to project work in the same timesheet.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4008, 4009, 64440 (weekly timesheets with non-project activities, sickness and leave).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "pln-phase-gate-document", + "area": "planning", + "name": "Close a project phase only once the document that concludes it has been uploaded.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4130, wish (faseafsluiting afhankelijk van het uploaden van een fasedocument).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "int-import-msproject", + "area": "integration", + "name": "Import a Gantt plan made in Microsoft Project.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4132, wish (GANTT-diagrammen van aannemers vanuit MS-project importeren).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "int-archive-to-case", + "area": "integration", + "name": "Hand a project's documents and metadata over unchanged to the case management system for the record.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4054, 4126 (bestanden en metadata voor dossiervorming ongewijzigd overzetten naar het zaaksysteem).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "plt-destruction-list", + "area": "platform", + "name": "Generate a destruction list from a retention period, destroy the listed records and keep proof of the destruction.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4059 to 4063 (vernietigingslijsten, vernietiging en bewijs van vernietiging).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prt-status-grotik", + "area": "portfolio", + "name": "Report each project's status on money, organisation, time, information, quality and risk, and roll it up to the portfolio.", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4020, 4129, 24322, 64437 (GROTIK status per project, aggregated per portfolio).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" } ], "pending": [ From 3dd78bf1436aaa60cfc4d7bbed6f56fba92189a2 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 22:53:47 +0200 Subject: [PATCH 03/13] feat(parity): fold deck packs 1-6 and openproject pack 1 from the source read --- openspec/parity/capabilities.json | 60 +++++++++++++++---------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index f3a157cb..9784e319 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -175,7 +175,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add board' ; source: lib/Db/Board.php:33-51 a board has title, owner, colour, settings; no short key and no description field ; source read at v1.19.0: lib/Db/Board.php:34-53 a board has title, owner, teamId, colour, archived, settings and no key or description; src/components/navigation/AppNavigationAddBoard.vue:19 'Board name' is the only input; lib/Service/BoardService.php:188 create(title, userId, color); searched lib/Db/Board.php for 'description', 'key', 'identifier': none", "kanboard": "corpus: kanboard/round4/journeys.md 1 'createProject Vergunningen with identifier VERG' ; source: app/Model/ProjectModel.php:129 getByIdentifier, project description on the Edit project form", - "openproject": "corpus: openproject/round4/menu-tree.md 'Projects' global module and 'Project settings > Information'; corpus: openproject/round4/M1-column.md 11.23 project attributes; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md (name, identifier, description) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md 'Projects' global module and 'Project settings > Information'; corpus: openproject/round4/M1-column.md 11.23 project attributes; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md (name, identifier, description) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/new_component.html.erb:32 project create form; app/forms/projects/settings/editable_identifier_form.rb:36 'identifier' field (the short key); app/forms/projects/settings/description_form.rb:35 description field; app/controllers/projects_controller.rb:113 create; app/contracts/projects/base_contract.rb:36-38 name, identifier, description attributes", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'you must provide: a name ... a key ... and designate a project lead', description added after creation; corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'", "plane": "corpus: plane/round4/journeys.md 'Create a workspace, create a project, create a work item' ; code-census.md §2 'project.py:76 identifier = models.CharField(max_length=12)', unique per workspace via ProjectIdentifier ; source: apps/web/core/components/project/card.tsx:285 renders project.description" }, @@ -208,7 +208,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings ... group limit for board creation (admin)' ; source: lib/Service/PermissionService.php:345-363 canCreate reads groupLimit ; source read at v1.19.0: src/components/DeckAppSettings.vue:26-37 admin section 'Limit board creation to some groups' (multi-select of groups); lib/Service/ConfigService.php:209 stores groupLimit; lib/Service/PermissionService.php:368-383 canCreate allows only members of the listed groups", "kanboard": "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch", - "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions')", + "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions') ; source read at v17.8.0: config/initializers/permissions.rb:34-39 add_project is a global permission; app/contracts/projects/create_contract.rb:67 create checks user.allowed_globally?(:add_project); app/models/global_role.rb:31 global roles; app/controllers/groups_controller.rb:184 a group has a 'global_roles' tab, so a chosen group can hold the right", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Creating and configuring a project is done by an administrator'; restricted to admins, but no documented grant to a chosen non-admin group", "plane": "source: apps/api/plane/app/views/project/base.py:257 create is @allow_permission([ROLE.ADMIN, ROLE.MEMBER], level=\"WORKSPACE\"), so guests are excluded, but there is no setting to restrict creation to admins or chosen groups (corpus: plane/round4/code-census.md §5 three fixed roles 20/15/5, no groups)" }, @@ -238,7 +238,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'sharing with users, groups, teams and remote users, each with edit, share and manage' ; journeys.md 1 ACL for jdevries ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:7 NcSelectUsers picker to add a user, group, team or remote user, :64 'Delete' removes the share; lib/Service/BoardService.php:419 addAcl and :541 deleteAcl, routes appinfo/routes.php:28-30", "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer)' ; menu-tree.md 'Permissions'", - "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Members'; corpus: openproject/round4/M1-column.md 11.19 'memberships in app/models/member.rb'", + "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Members'; corpus: openproject/round4/M1-column.md 11.19 'memberships in app/models/member.rb' ; source read at v17.8.0: config/initializers/permissions.rb:208-216 manage_members covers members index, create, destroy and autocomplete_for_member; app/controllers/members_controller.rb:42 create, :87 destroy_by_principal", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' (Managing project roles, 2022-10-07); corpus: jira-data-center/round4/M1-column.md 13.4 Managing project role membership", "plane": "corpus: plane/round4/menu-tree.md 'Settings: General, Members, ...' ; code-census.md §5 'ProjectMember.role', ProjectMemberInvite (project.py:192)" }, @@ -269,7 +269,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'Acl: participant of type user, group, remote or team, with edit, share, manage' lib/Db/Acl.php:27-35 ; journeys.md 5 edit-only collaborator refused 403 on ACL change ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:39-58 per share 'Can edit', 'Can share', 'Can manage', 'Owner' (transfer); lib/Db/Acl.php:31-34 PERMISSION_READ, EDIT, SHARE, MANAGE; lib/Service/PermissionService.php:131-132 owner or ACL grants manage and share", "kanboard": "corpus: kanboard/round4/usability.md 'three project roles and custom ones with column restrictions' ; journeys.md 5 custom role Toetser", - "openproject": "corpus: openproject/round4/M1-column.md 13.1 'app/models/role.rb:31 with nine subtypes ... Permissions are rows ... against a catalogue declared in code'; corpus: openproject/round4/M1-column.md 13.16 roles and permissions matrix", + "openproject": "corpus: openproject/round4/M1-column.md 13.1 'app/models/role.rb:31 with nine subtypes ... Permissions are rows ... against a catalogue declared in code'; corpus: openproject/round4/M1-column.md 13.16 roles and permissions matrix ; source read at v17.8.0: app/models/role.rb:31-41 Role with builtin kinds; config/routes.rb:709 admin roles resources; config/initializers/permissions.rb:208 permissions are declared per role in code; app/controllers/members_controller.rb:71 update a member's roles", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 global permissions and project roles; corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission ... Assignable user Permission' (Managing project permissions)", "plane": "corpus: plane/round4/code-census.md §5 'ROLE_CHOICES = ((20, \"Admin\"), (15, \"Member\"), (5, \"Guest\"))' project.py:21 ; three fixed roles, no custom role" }, @@ -299,7 +299,7 @@ "evidence": { "nextcloud-deck": "source: appinfo/routes.php:26 board#leave, lib/Service/BoardService.php:515 leave() ('Board owner cannot leave board'), src/components/navigation/AppNavigationBoard.vue:157 'Leave board' menu entry ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:151-157 'Leave board' action; appinfo/routes.php:26 board#leave; lib/Service/BoardService.php:569-571 leave() refuses only the owner ('Board owner cannot leave board')", "kanboard": "source: grep -rniE 'leave' app/Controller returns 0 hits; membership is removed by a project manager under Permissions (corpus: kanboard/round4/menu-tree.md 'Permissions')", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'leave_project' finds only app/components/header/projects/node_component.html.erb:37, an 'x-circle' button that links to home_path (navigates away from the current project); removing a member needs manage_members; corpus: openproject/round4/M1-column.md 11.19 memberships administered, no self-removal found", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'leave_project' finds only app/components/header/projects/node_component.html.erb:37, an 'x-circle' button that links to home_path (navigates away from the current project); removing a member needs manage_members; corpus: openproject/round4/M1-column.md 11.19 memberships administered, no self-removal found ; source read at v17.8.0: config/locales/en.yml:2890 'Leave project' is only app/components/header/projects/node_component.html.erb:33-37, an x-circle linking to home_path (navigates away); app/contracts/members/delete_from_project_contract.rb:32 removing any member needs manage_members; searched app/contracts/members for a self-removal exception: none", "jira": "corpus: jira-data-center/round4/M1-column.md 13.4 'project roles have specific members for each project' edited on the Managing project role membership page by a project or Jira admin; no self-leave documented", "plane": "source: apps/api/plane/app/urls/project.py:88-89 'projects//members/leave/' ProjectMemberViewSet leave ; corpus silent on leaving" }, @@ -329,7 +329,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards ...)' ; source: lib/Controller/BoardController.php:54 update(..., bool archived) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:62-68 'Archive board' and :54-60 'Unarchive board' actions calling archiveBoard/unarchiveBoard (:364-370); lib/Controller/BoardController.php:54 update(id, title, color, archived)", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:141-148 'Archive' item needs archive_project; :153-161 'Unarchive' item (admin only); app/controllers/projects/archive_controller.rb:38-43 create archives, destroy unarchives; config/routes.rb:447", "jira": "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only", "plane": "corpus: plane/round4/menu-tree.md workspace 'Archives' ; source: apps/api/plane/db/models/project.py:114 archived_at, apps/api/plane/app/urls/project.py:123-125 ProjectArchiveUnarchiveEndpoint (archive and unarchive)" }, @@ -546,7 +546,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.9 'card#clone and board#clone (appinfo/routes.php:31)' ; source: src/components/navigation/BoardCloneModal.vue options with cards, assignments, labels, due dates", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.9 'card#clone and board#clone (appinfo/routes.php:31)' ; source: src/components/navigation/BoardCloneModal.vue options with cards, assignments, labels, due dates ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:52 'Clone board' opens src/components/navigation/BoardCloneModal.vue:9-32 'Clone cards', 'Clone assignments', 'Clone labels', 'Clone due dates', 'Move all cards to the first list'; lib/Service/BoardService.php:607 clone() and :767 cloneCards; appinfo/routes.php:31 board#clone", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source: app/Model/ProjectDuplicationModel.php:90 duplicate()", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings > Copy project'; corpus: openproject/round4/M1-column.md 2.9 copy service carries watchers, attachments", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Create with shared configuration ... use that project's schemes' is the only reuse; corpus: jira-data-center/round4/M1-column.md 11.2 issues move only with the whole-instance XML backup or a project import", @@ -575,7 +575,7 @@ "kanboard": "partial", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'typed fields ... there is no schema' ; source: lib/Db/Board.php fields", + "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'typed fields ... there is no schema' ; source: lib/Db/Board.php fields ; source read at v1.19.0: lib/Db/Board.php:34-53 fixed columns only; searched lib/ and src/ for 'custom field', 'customField', 'custom_field': none", "kanboard": "corpus: kanboard/round4/code-census.md 'metadata without a screen: project_has_metadata' ; open-core.md 'MetaMagik for typed custom fields' is a third-party plugin", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields'", "jira": "corpus: jira-data-center/round4/M1-column.md 11.23 projects have categories only; custom field contexts are 'a combination of projects and issue types where that field can be used' (2.2): fields live on issues, not projects", @@ -604,7 +604,7 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "source: lib/Db/Board.php has no parent field ; corpus: nextcloud-deck/round4/menu-tree.md a flat list of boards", + "nextcloud-deck": "source: lib/Db/Board.php has no parent field ; corpus: nextcloud-deck/round4/menu-tree.md a flat list of boards ; source read at v1.19.0: lib/Db/Board.php:34-53 no parent field; searched lib/Db and src/ for 'parentId', 'parent_id', 'subboard': only a comment reply parentId in src/services/CommentApi.js:27", "kanboard": "source: grep -niE 'parent' app/Model/ProjectModel.php returns 0 hits; corpus: kanboard/round4/menu-tree.md flat project list", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy'; corpus: jira-data-center/round4/M1-column.md 11.21 Advanced Roadmaps hierarchy 'Standard issue types are placed above the epic level (commonly Initiative ...)' groups issues, not projects", @@ -633,7 +633,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Open details for the board's sidebar with sharing, tags, deleted items and the activity stream' ; no description or progress on a board (lib/Db/Board.php)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Open details for the board's sidebar with sharing, tags, deleted items and the activity stream' ; no description or progress on a board (lib/Db/Board.php) ; source read at v1.19.0: src/components/board/BoardSidebar.vue:11-42 the board details sidebar has tabs 'Sharing' (members), 'Tags', 'Deleted items', 'Activity' and no description or progress; lib/Db/Board.php:34-53 no description field; src/router.js:94 /board/:id/details", "kanboard": "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews", "jira": "docs: project 'Summary' / project page is not in the corpus; corpus: jira-data-center/round4/M1-column.md 10.2 dashboards with gadgets can be built per project ('multiple dashboards for different projects'); no built-in overview with members and progress documented", @@ -663,7 +663,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/promoted row 11.26 in _round4/compare/promoted-rows-batch6.md 'no knowledge base; the platform's Collectives is a store app'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/promoted row 11.26 in _round4/compare/promoted-rows-batch6.md 'no knowledge base; the platform's Collectives is a store app' ; source read at v1.19.0: searched lib/ and src/ for 'wiki', 'collectives', 'page': no knowledge pages; nearest is file attachments on a card and the related resources panel in src/components/board/SharingTabSidebar.vue:82 NcRelatedResourcesPanel", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 11.26 'grep knowledge|faq|wiki returns 0. The nearest thing is a project file'", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Wiki'; corpus: openproject/round4/M1-column.md 9.1 wiki pages searchable (wiki_page.rb:52)", "jira": "corpus: jira-data-center/round4/M1-column.md 1.9 'Integrating with Confluence Give your team the ability to share, discuss and work with Jira application issues in Confluence': wiki is a separate product (Confluence)", @@ -692,7 +692,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 1 'then the group vergunningen with edit' ; code-census.md Acl participant type group or team", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 1 'then the group vergunningen with edit' ; code-census.md Acl participant type group or team ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:30-31 shares shown as '(Group)' and '(Team)'; lib/Db/Acl.php:37 PERMISSION_TYPE_GROUP and :39 PERMISSION_TYPE_CIRCLE; lib/Service/BoardService.php:419 addAcl(boardId, type, participant, ...)", "kanboard": "corpus: kanboard/round4/journeys.md 5 'createGroup Bouwtoezicht, addGroupMember carol, addProjectGroup(project-member): carol read the task'", "openproject": "corpus: openproject/round4/M1-column.md 13.6 'a Group can be given a membership, so group-based visibility works'", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects'", @@ -721,7 +721,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' ; M1-column.md 1.1 no PublicPage on a card route", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' ; M1-column.md 1.1 no PublicPage on a card route ; source read at v1.19.0: searched src/router.js and appinfo/routes.php for a public board or link share route: none; lib/Controller/BoardOcsController.php:37-38 PublicPage read serves federated remote boards, see lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE, which requires an account on another server", "kanboard": "corpus: kanboard/round4/journeys.md 6 'Enable public access ... the read-only board ... answered 200 without a session' ; menu-tree.md Public", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:105 'Make a project public'; corpus: openproject/round4/M1-column.md 4.21 'a public project, which exposes the whole project to anonymous users' (read-only follows the Anonymous role's permissions) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 4.21 'you need to allow anonymous users to browse, search, and create issues in that project' (Allowing anonymous access to your project); browse without create is the read-only variant", @@ -750,7 +750,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'Deck is a kanban board inside Nextcloud: boards with columns, cards' ; menu-tree.md 'The board, as it opens'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'Deck is a kanban board inside Nextcloud: boards with columns, cards' ; menu-tree.md 'The board, as it opens' ; source read at v1.19.0: src/components/board/Board.vue:61-75 stacks rendered as draggable columns, src/components/board/Stack.vue:104-122 cards inside each stack; lib/Db/Stack.php:28-35 a stack has title, board, order and isDoneColumn; appinfo/routes.php:37-43 stack routes", "kanboard": "corpus: kanboard/round4/usability.md 'Kanboard is a Kanban board with a task behind every card' ; menu-tree.md 'Overview · Board · List'", "openproject": "corpus: openproject/round4/menu-tree.md global 'Boards' and project 'Work packages list, plus Gantt, board and calendar views'; boards_view is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md); docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:11 'OpenProject Agile boards ... Boards consist of lists (columns) and cards (work packages)' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Click Create a Kanban board'", @@ -780,7 +780,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'a stack is a column you drag a card into' (open-core.md 2.7 row) ; M1-column.md 2.6 'one card at a time is dragged'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'a stack is a column you drag a card into' (open-core.md 2.7 row) ; M1-column.md 2.6 'one card at a time is dragged' ; source read at v1.19.0: src/components/board/Stack.vue:104-114 vue-smooth-dnd Container with @drop onDropCard (:277); appinfo/routes.php:52 card#reorder moves a card to another stack and order", "kanboard": "corpus: kanboard/round4/usability.md 'the board, its columns and swimlanes' ; journeys.md 1 moveTaskPosition (the API behind the drag)", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list or to a new list. Remember: Moving cards to another list in an Action board will update their attributes, e.g. status' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints section (cards moved between columns); corpus: jira-data-center/round4/M1-column.md 3.18 'you can drag and drop them'; board drag is the documented move", @@ -810,7 +810,7 @@ "kanboard": "partial", "jira": "unknown", "evidence": { - "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue:113-123 arrow keys move focus between cards, src/components/cards/CardItem.vue:283 'KeyM' opens the card menu with Move card (corpus: nextcloud-deck/round4/menu-tree.md 'The action menu: Mark as done, Move card')", + "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue:113-123 arrow keys move focus between cards, src/components/cards/CardItem.vue:283 'KeyM' opens the card menu with Move card (corpus: nextcloud-deck/round4/menu-tree.md 'The action menu: Mark as done, Move card') ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:118-129 arrow keys move focus between cards; src/components/cards/CardItem.vue:306-307 'KeyM' opens the card menu; src/components/cards/CardMenuEntries.vue:53-57 'Move/copy card' opens src/CardMoveDialog.vue:6-18 'Select a board', 'Select a list'", "kanboard": "source: app/Template/task/sidebar.php:86 'Move position' dialog on the task page is a keyboard-usable form; app/Template/config/keyboard_shortcuts.php lists no card focus or move key on the board", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniE 'keydown|keyboard|hotkey' frontend/src/app/features/boards returns only board-list-container.component.html:46 '(keydown.enter)=addList(board)'; cards move through WorkPackageCardDragAndDropService (drag only). The card's status can be changed from the card itself (agile-boards README:156 'update a work package's status directly in the card'), which is keyboard reachable on a Status board only", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html only says app-specific shortcuts appear in the in-product dialog (Shift + /); the board shortcut list is not in the documentation and no instance was available", @@ -839,7 +839,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: lib/Db/Stack.php carries title, order, isDoneColumn and no limit; corpus: nextcloud-deck/round4/code-census.md 'Stack with order and isDoneColumn'", + "nextcloud-deck": "source: lib/Db/Stack.php carries title, order, isDoneColumn and no limit; corpus: nextcloud-deck/round4/code-census.md 'Stack with order and isDoneColumn' ; source read at v1.19.0: lib/Db/Stack.php:28-35 title, boardId, order, isDoneColumn and no limit; searched lib/ and src/ for 'wip', 'limit' on stacks, 'max_cards': none. 1.19.0 only shows a card count beside the list title, CHANGELOG.md:10 and src/components/board/Stack.vue:18", "kanboard": "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded'", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'wip.limit|work.in.progress|max_cards|card_limit' over app, modules and frontend/src hits only GitLab merge-request 'work in progress' handling (modules/gitlab_integration/...upsert_merge_request.rb); agile-boards README documents no list limit", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints)", @@ -872,7 +872,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add list ... each with Add card and an Actions menu (rename, reorder, mark as done column, delete)'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add list ... each with Add card and an Actions menu (rename, reorder, mark as done column, delete)' ; source read at v1.19.0: src/components/Controls.vue:39-56 'Add list', src/components/board/Stack.vue:43 'Edit list title', :69 'Delete list'; src/components/board/Board.vue:61-67 lists are draggable with @drop onDropStack; appinfo/routes.php:38-41 stack create, update, reorder, delete", "kanboard": "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header'", @@ -902,7 +902,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'mark as done column' ; source: lib/Service/CardService.php:454-455 a card moved into the done column gets setDone", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'mark as done column' ; source: lib/Service/CardService.php:454-455 a card moved into the done column gets setDone ; source read at v1.19.0: src/components/board/Stack.vue:66 list menu 'Set cards as \"done\"'; lib/Db/Stack.php:35 isDoneColumn; lib/Service/CardService.php:454-462 a card moved into the done list gets setDone, leaving it clears done; appinfo/routes.php:158 stack_ocs#setDoneStack", "kanboard": "corpus: kanboard/round4/journeys.md 2 'createAction(project 1, task.move.column, TaskCloseColumn, column_id 4) ... is_active 0' : done is an automatic action per project, not a column flag", "openproject": "Status board columns are statuses and a status carries is_closed (corpus: openproject/round4/M1-column.md 2.7 'app/models/status.rb:31 ... is_closed (used at work_package.rb:105)'); the column itself is not marked done, closure comes from the status it maps to, and Basic board columns change nothing (agile-boards README:55)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses'", @@ -932,7 +932,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md filter 'title: description: list: tag: assigned: date:' ; a card has no priority (open-core.md 'a card is title, description, date, labels, assignees')", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md filter 'title: description: list: tag: assigned: date:' ; a card has no priority (open-core.md 'a card is title, description, date, labels, assignees') ; source read at v1.19.0: src/components/Controls.vue:104 'Filter by tag', :115 'Filter by assigned user', :139 'Filter by status', :172 'Filter by due date', :65-74 board filter text field; lib/Db/Card.php has no priority field, searched lib/Db and src/ for 'priority': none, so assignee and label yes, priority no", "kanboard": "corpus: kanboard/round4/usability.md 'one query language with twenty-five attributes runs the board' ; source: app/Filter/TaskPriorityFilter.php, assignee and tag filters in app/Filter/", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/features/boards/board/board-filter/board-filter.component.html '' with board-filters.service.ts building ApiV3 filters (assignee, type, priority, any work package filter corpus: openproject/round4/M1-column.md 9.2) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board'; default 'Only My Issues' and 'Recently Updated', each a JQL (assignee, labels, priority)", @@ -962,7 +962,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: src/components/Controls.vue view modes are 'Kanban view' and 'Gantt view' only (viewMode values kanban, gantt), plus 'Toggle compact mode'; corpus: nextcloud-deck/round4/menu-tree.md says 'the view modes (board and list)', which the tag's source does not bear out; the nearest list is 'Upcoming cards' across boards (menu-tree.md)", + "nextcloud-deck": "source: src/components/Controls.vue view modes are 'Kanban view' and 'Gantt view' only (viewMode values kanban, gantt), plus 'Toggle compact mode'; corpus: nextcloud-deck/round4/menu-tree.md says 'the view modes (board and list)', which the tag's source does not bear out; the nearest list is 'Upcoming cards' across boards (menu-tree.md) ; source read at v1.19.0: src/components/Controls.vue:235-249 view modes 'Kanban view' and 'Gantt view', :261 'Toggle compact mode'; src/components/board/Board.vue:52 GanttView when viewMode is gantt; searched src/ for a list or table view mode: none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Overview · Board · List'", "openproject": "corpus: openproject/round4/menu-tree.md 'Work packages list, plus Gantt, board and calendar views' over the same work packages", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'base your board on an existing Saved Filter'; the same filter opens as a list in the issue navigator (corpus: jira-data-center/round4/M1-column.md 9.3, 9.5 column chooser)", @@ -992,7 +992,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels, the due badge, assignee avatars' ; source: src/components/cards/CardBadges.vue has no dependency or blocked badge", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels, the due badge, assignee avatars' ; source: src/components/cards/CardBadges.vue has no dependency or blocked badge ; source read at v1.19.0: src/components/cards/CardItem.vue:50-54 labels on the card, src/components/cards/CardBadges.vue:9 due date badge, :24 checklist, :33 attachments, :40 assignee avatars; searched CardBadges.vue for 'depend', 'blocked': none, so no blocked state", "kanboard": "source: app/Template/board/task_footer.php:24-28 tags, :62-74 due date, :135 priority, app/Template/board/task_private.php:29 assignee; blocked shows only as a link count icon (:89-90) with a tooltip ; corpus: kanboard/round4/menu-tree.md board screenshot", "openproject": "Cards show type, subject, assignee avatar and dates, with highlighting by priority or type (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/.../highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'|'none'|'inline'); labels do not exist (corpus: openproject/round4/M1-column.md 2.8) and there is no blocked marker on a card (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards', 'Days in column shows dots on each card'; assignee avatar, flags and labels as a card field; blocked shown by the flag or a query colour ('One color per JQL query')", @@ -1021,7 +1021,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md Card and Stack carry an order ; source: appinfo/routes.php card#reorder", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md Card and Stack carry an order ; source: appinfo/routes.php card#reorder ; source read at v1.19.0: src/components/board/Stack.vue:104-114 drag within a list calls onDropCard; lib/Service/CardService.php:436 reorder(id, stackId, order); appinfo/routes.php:52 card#reorder", "kanboard": "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column)", @@ -1053,7 +1053,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'each with Add card'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'each with Add card' ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' in each list, :128-135 inline 'Card name' input; src/components/KeyboardShortcuts.vue:106-107 'KeyN' new card; appinfo/routes.php:47 card#create", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: inline create is documented on the backlog, not per board column; board cards come from the Create dialog (corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen'); not verified in a running instance", @@ -1086,7 +1086,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source read at v1.19.0: src/router.js:55-60 /board route renders Boards with the ALL filter; src/components/boards/Boards.vue:9 'Search boards', :16-23 a table of every board with 'Board name' and 'Members'; src/components/navigation/AppNavigation.vue:19 'All boards'; appinfo/routes.php:20 board#index", "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Dashboard' ; source: app/Template/config/keyboard_shortcuts.php 'Open board switcher'", "openproject": "corpus: openproject/round4/menu-tree.md global module 'Boards' in the top-left grid lists boards across projects", "jira": "docs: Jira Software 'View all boards' from the Boards menu; docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html boards span 'one or more projects'", @@ -1116,7 +1116,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "no WIP limit to enforce (brd-wip-limits) ; source: lib/Db/Stack.php", + "nextcloud-deck": "no WIP limit to enforce (brd-wip-limits) ; source: lib/Db/Stack.php ; source read at v1.19.0: no limit to enforce: lib/Db/Stack.php:28-35 has no limit field; lib/Service/CardService.php:436 reorder checks permission and archive state, searched it for 'limit', 'max': none", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 9.14 'task_limit ... and, verified live, does not refuse the move'", "openproject": "no WIP limit exists (see brd-wip-limits grep), so nothing blocks a move", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints are informational: violations only colour the column red or yellow and do not prevent issues being moved into it", @@ -1145,7 +1145,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md the board is lists as columns only ; source: grep -rniF 'swimlane' lib returns 0 hits", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md the board is lists as columns only ; source: grep -rniF 'swimlane' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'swimlane', 'lane', 'groupBy': none; src/components/board/Board.vue:61-75 renders stacks as a single row of columns", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Swimlanes' ; code-census.md 'swimlanes SwimlaneModel' : swimlanes are named lanes a user places tasks in, not grouped automatically by assignee, priority or epic", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'swimlane' over the tree returns nothing; agile-boards README documents Basic and Action boards only", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane", @@ -1174,7 +1174,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' (personal and shared saved searches)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' (personal and shared saved searches) ; source read at v1.19.0: searched lib/ and src/ for 'savedFilter', 'saveFilter', 'saved filter': none; src/components/Controls.vue:104-229 filter state lives in the page only, with 'Clear filter' at :229", "kanboard": "corpus: kanboard/round4/journeys.md 5 'a custom filter Deze week te doen was saved as shared' ; code-census.md 'custom_filters.is_shared'", "openproject": "A board is itself a saved query and work package queries can be saved and shared (corpus: openproject/round4/M1-column.md 9.3, 9.4 'a query is public or private'); board filter state is saved with the board, no separate named filter set per board", "jira": "corpus: jira-data-center/round4/M1-column.md 9.4 'Filters ... can be shared with other users, user groups, projects, and project roles'; docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters are saved per board for 'anyone else using this board'", @@ -1203,7 +1203,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels' ; M1-column.md 2.8 'labels per board with a colour' : labels are coloured chips, the card itself is not coloured by category", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels' ; M1-column.md 2.8 'labels per board with a colour' : labels are coloured chips, the card itself is not coloured by category ; source read at v1.19.0: per-card colour exists, which the drive evidence missed: src/components/cards/CardMenuEntries.vue:7-13 'Change card color' picker, src/components/cards/CardItem.vue:203 renders it, lib/Db/Card.php:75 color, lib/Service/CardService.php:292-294; the colour is set by hand, not derived from a label, type or category, so partial stands", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query'", @@ -1232,7 +1232,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: lib/Service/CardService.php:454-460 entering the done column marks the card done and leaving it clears done; no other action ; corpus: nextcloud-deck/round4/M1-column.md 3.9 'no'", + "nextcloud-deck": "source: lib/Service/CardService.php:454-460 entering the done column marks the card done and leaving it clears done; no other action ; corpus: nextcloud-deck/round4/M1-column.md 3.9 'no' ; source read at v1.19.0: lib/Service/CardService.php:454-462 entering a done list marks the card done and leaving it clears done, set from src/components/board/Stack.vue:66; searched lib/ for other stack-entry side effects, 'rule', 'automation': none", "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'Moving work packages (cards) between two lists will update them automatically' (status, assignee, version boards set that attribute); arbitrary actions on entry need custom actions, which are button-triggered and Enterprise gated (corpus: openproject/round4/M1-column.md 3.9) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation on 'issue transitioned' whose actions are 'editing issues, sending notifications, creating sub-tasks' and workflow post functions such as 'Assign to Current User' (3.8); a column maps to statuses (docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html)", From 8178f37c729f2cff2452047020281b2e3b4b6ca9 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:07:04 +0200 Subject: [PATCH 04/13] feat(parity): Deck source read at v1.19.0 across all 148 rows, sources recorded, three drive contradictions re-rated --- openspec/parity/capabilities.json | 469 ++++++++++++++++-------------- 1 file changed, 256 insertions(+), 213 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 9784e319..fd8434bc 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -24,7 +24,50 @@ "readOn": "2026-09-13", "columnAddedOn": "2026-09-26", "evidenceGrade": "driven", - "unknownReason": "Graded driven at the round-4 drive of 2026-09-13. Cells whose evidence starts with source were read from the tagged source at v1.18.4, not driven. In four places the source contradicts round-4: Deck ships a Gantt view with drag to reschedule, its view modes are kanban and gantt rather than board and list, BoardExportModal exports CSV, and ACardEvent implements IWebhookCompatibleEvent." + "unknownReason": "Graded driven at the round-4 drive of 2026-09-13 on 1.18.4 (Nextcloud 34). Every row was also read from source at v1.19.0 on 2026-09-26, the release for Nextcloud 35: source read at v1.19.0, driven at 1.18.4 on NC 34. Three ratings moved where the code contradicts the drive (tsk-bulk, col-presence, int-import-other).", + "sources": { + "docs": "https://deck.readthedocs.io/en/latest/", + "sourceRepo": { + "url": "https://github.com/nextcloud/deck", + "tag": "v1.19.0", + "commit": "2aa64468aee7575318a588040075415a09f33642" + }, + "featurePage": "https://nextcloud.com/groupware/", + "featureRequests": "https://github.com/nextcloud/deck/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement+sort%3Areactions-%2B1-desc", + "issueTracker": { + "url": "https://github.com/nextcloud/deck/issues", + "featureLabel": "enhancement" + }, + "roadmap": null, + "changelog": "https://github.com/nextcloud/deck/blob/main/CHANGELOG.md", + "apiReference": "https://deck.readthedocs.io/en/latest/API/", + "marketplace": "https://apps.nextcloud.com/apps/deck", + "pricing": "https://nextcloud.com/pricing/", + "accessibilityStatement": null, + "securityDocs": "https://github.com/nextcloud/deck/blob/main/SECURITY.md", + "demoInstance": "https://try.nextcloud.com/", + "community": "https://help.nextcloud.com/c/apps/deck", + "reviews": null, + "videos": null, + "caseStudies": "https://nextcloud.com/customers/", + "partnerDirectory": "https://nextcloud.com/partners/", + "trainingCurriculum": "https://nextcloud.com/training/", + "jobPostings": "https://nextcloud.com/jobs/", + "tenders": null, + "nullReasons": { + "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 404", + "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" + } + }, + "sourceRead": { + "tag": "v1.19.0", + "commit": "2aa64468aee7575318a588040075415a09f33642", + "readOn": "2026-09-26" + }, + "readHow": "Driven at 1.18.4 on Nextcloud 34 in round 4 (2026-09-13); source read at v1.19.0 (2aa6446, min-version 35, the line matching the workspace server 35.0.1) on 2026-09-26 across all rows, with path:line beside the drive evidence. The grade stays driven with the note: source read at v1.19.0, driven at 1.18.4 on NC 34." }, { "key": "openproject", @@ -362,7 +405,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'deletedAt on cards, stacks, boards and attachments; trashRetentionHours' ; journeys.md 6 trash purge ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:144-148 'Delete board' with an undo (:8-15); lib/Service/BoardService.php:288-296 delete() sets deletedAt (manage permission), :318 deleteUndo; lib/Cron/DeleteCron.php:63-69 purges after the trash retention; lib/Db/BoardMapper.php:519-531 deleting a board deletes its ACL, stacks and their cards", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Remove' under Configure this project", - "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Copy project, Delete project'", + "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Copy project, Delete project' ; source read at v17.8.0: app/components/projects/row_actions_component.rb:202-211 'Delete' row action (admin only) opens confirm_destroy; app/controllers/projects_controller.rb:153-165 destroy schedules deletion; app/services/projects/delete_service.rb:54-58 before_perform deletes members, work packages and storages, and descendants (:39)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy'", "plane": "corpus: plane/round4/code-census.md §2 soft delete via deleted_at, hard delete nightly by bgtasks/deletion_task.hard_delete ; source: apps/api/plane/bgtasks/deletion_task.py:18 soft_delete_related_objects cascades to the project's rows" }, @@ -392,7 +435,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards and Shared under each)' ; source: src/components/navigation/AppNavigation.vue:28 route /board/archived ; source read at v1.19.0: src/components/navigation/AppNavigation.vue:19 'All boards', :28-31 'Archived boards' (/board/archived), :37-40 'Shared with you'; src/router.js:63-72 boards.archived and boards.shared routes; lib/Controller/BoardController.php:54 archived flag on the board", "kanboard": "source: app/Filter/ProjectStatusFilter.php status filter on the project list, app/Template/project_list/sort_menu.php:11 sort by Status ; corpus: kanboard/round4/menu-tree.md 'Projects management'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:117-135 filters 'Active projects', 'Archived projects', 'Project status - On track / Off track / At risk' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:117-135 filters 'Active projects', 'Archived projects', 'Project status - On track / Off track / At risk' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/menus/projects/menu.rb:87 'Archived projects' static list for admins; app/models/project_queries/static.rb:101-102 archived list filters active = false; app/models/queries/projects/filters/active_filter.rb:31 active filter; app/models/queries/projects/filters/project_status_filter.rb:35 status filter over app/models/project.rb:218-225 on_track, at_risk, off_track, not_started, finished, discontinued", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'A Jira project can only belong to one category'; 'An archived project will no longer appear in Jira' (archived projects page); no project status field to filter on", "plane": "source: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects' ; corpus: plane/round4/menu-tree.md 'Archives'" }, @@ -415,14 +458,14 @@ "origin": "own-code", "planninq": "no", "nextcloud-deck": "no", - "openproject": "yes", + "openproject": "partial", "plane": "yes", "kanboard": "yes", "jira": "yes", "evidence": { "nextcloud-deck": "source: lib/Service/BoardService.php:188-217 create() inserts default labels only and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board alone ; corpus: nextcloud-deck/round4/journeys.md 1 four lists added by hand ; source read at v1.19.0: lib/Service/BoardService.php:188-217 create() inserts four default labels ('Finished', 'To review', 'Action needed', 'Later') and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board only; searched BoardService create for 'Stack', 'stackMapper->insert': none", "kanboard": "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'In an Action board each list represents a value of an attribute ... the Status board includes a list for the status New and a list for the status In Progress' (columns generated from statuses); Boards free (corpus: openproject/round4/menu-tree.md global 'Boards', not EE) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'In an Action board each list represents a value of an attribute ... the Status board includes a list for the status New and a list for the status In Progress' (columns generated from statuses); Boards free (corpus: openproject/round4/menu-tree.md global 'Boards', not EE) (cited source paths checked present at the released v17.8.0 tag.) ; 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 basic, status, assignee, version, subproject, subtasks; modules/boards/app/services/boards/status_board_create_service.rb:11-17 a new Status board gets one list, Status.default; app/services/projects/copy/boards_dependent_service.rb:32-38 only a template or copy carries a prepared board set; a new blank project has no board", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types')", "plane": "corpus: plane/round4/code-census.md §2 'DEFAULT_STATES at state.py:24-62 seeds five plus triage'; states are the board columns" }, @@ -456,7 +499,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' in Db/ return 0 ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'billing', 'hourly', 'fixed price': none; lib/Db/Board.php:34-53 holds no commercial field", "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal' 26 hits 'none is a payment', 'currencies is a rate table for the task score' ; no budget or billing field on a project", - "openproject": "corpus: openproject/round4/menu-tree.md project 'Budgets'; docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:11 'create and manage a project budget ... planned unit costs as well as labor costs'; no fixed-price or hourly billing term field (project attributes could hold it, corpus: openproject/round4/M1-column.md 11.23) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md project 'Budgets'; docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:11 'create and manage a project budget ... planned unit costs as well as labor costs'; no fixed-price or hourly billing term field (project attributes could hold it, corpus: openproject/round4/M1-column.md 11.23) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31 budgets resources; modules/budgets/app/models/budget.rb:59 subject, fixed_date required; :108 budget = base_amount + material + labor; :138 base_amount; searched app and modules for 'fixed_price', 'fixed.price', 'billing_type': none, so no delivery or billing term field", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'the integrations page lists test management, source control and collaboration tools and nothing financial'; no budget or billing term on a project; only a custom field on issues (corpus: jira-data-center/round4/M1-column.md 2.2)", "plane": "corpus: plane/round4/code-census.md §2 fixed field list and 'no custom fields on any object'; no budget or billing field on Project (project.py:68-117); 'no Time tracking' (menu-tree.md)" }, @@ -489,7 +532,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' (nearest: remote ACL type 6, code-census.md federation row) ; source read at v1.19.0: the only non-account readers are federated users: lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE and lib/Controller/BoardOcsController.php:37-38 PublicPage read serves a federation token, not a portal; searched src/router.js for 'public', 'portal', 'share/': none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'There is no customer or citizen interface' (nearest: a project-viewer account or the public read-only board)", - "openproject": "corpus: openproject/round4/M1-column.md 6.7 'there is no citizen portal'; nearest is per-item sharing, Enterprise gated (corpus: openproject/round4/M1-column.md 3.19 work_package_sharing)", + "openproject": "corpus: openproject/round4/M1-column.md 6.7 'there is no citizen portal'; nearest is per-item sharing, Enterprise gated (corpus: openproject/round4/M1-column.md 3.19 work_package_sharing) ; source read at v17.8.0: searched app, modules/*/app and config/locales/en.yml for 'portal': only a UI modal portal element, app/views/layouts/base.html.erb:63; nearest is per work package sharing, app/models/sharing_strategies/work_package_strategy.rb:109 gated on :work_package_sharing", "jira": "corpus: jira-data-center/round4/M1-column.md 6.7 'The customer portal is JSM DC, a separate licence'; 3.19 'a partner needs an account and a licence'", "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when guest_view_all_features is false a guest sees only items they own or are assigned'; an outsider needs a Plane login in the main app, there is no separate portal" }, @@ -519,7 +562,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'template beyond the import config schema' ; nearest is Clone board (prj-copy) ; source read at v1.19.0: searched lib/ and src/ for 'template' as a board feature: only psalm @template tags and lib/Provider/DeckProvider.php:94 SearchTemplate; nearest is clone board clone at appinfo/routes.php:31 and import at appinfo/routes.php:34", "kanboard": "source: app/Template/project_creation/create.php:23 'Create from another project' with components chosen, app/Model/ProjectDuplicationModel.php:43-55 swimlanes, board columns, categories, roles, actions, tags, filters, tasks ; corpus: kanboard/round4/menu-tree.md 'Duplicate'", - "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project templates'; corpus: openproject/round4/M1-column.md 3.10 'applying a project template (app/models/project.rb:110)'; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-templates (copies work packages, boards, wiki, members); no labels object exists (categories copy) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project templates'; corpus: openproject/round4/M1-column.md 3.10 'applying a project template (app/models/project.rb:110)'; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-templates (copies work packages, boards, wiki, members); no labels object exists (categories copy) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/template_select_component.html.erb:39 template picker on new project; app/controllers/projects_controller.rb:106-115 new/create from template; app/controllers/projects/templated_controller.rb:35-41 mark a project as template; app/services/projects/copy/boards_dependent_service.rb:32, app/services/projects/copy/work_packages_dependent_service.rb:32 and the categories dependent service copy boards, categories, work packages", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes' (schemes only, no tasks or labels copied)", "plane": "corpus: plane/round4/open-core.md 'Project Templates' listed under Business ; code-census.md §1 'Templates: absent from the backend', create-project-modal.tsx:29 templateId threaded to a no-op provider. Paid tier only, absent from Community" }, @@ -548,7 +591,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.9 'card#clone and board#clone (appinfo/routes.php:31)' ; source: src/components/navigation/BoardCloneModal.vue options with cards, assignments, labels, due dates ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:52 'Clone board' opens src/components/navigation/BoardCloneModal.vue:9-32 'Clone cards', 'Clone assignments', 'Clone labels', 'Clone due dates', 'Move all cards to the first list'; lib/Service/BoardService.php:607 clone() and :767 cloneCards; appinfo/routes.php:31 board#clone", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source: app/Model/ProjectDuplicationModel.php:90 duplicate()", - "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings > Copy project'; corpus: openproject/round4/M1-column.md 2.9 copy service carries watchers, attachments", + "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings > Copy project'; corpus: openproject/round4/M1-column.md 2.9 copy service carries watchers, attachments ; source read at v17.8.0: app/components/projects/row_actions_component.rb:165-166 'Copy' row action needs copy_projects; config/initializers/permissions.rb:261-263 copy_projects permission; app/controllers/projects_controller.rb:131-140 copy enqueues Projects::EnqueueCopyService with chosen dependencies; app/services/projects/copy/work_packages_dependent_service.rb:118-127 relations are copied too", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Create with shared configuration ... use that project's schemes' is the only reuse; corpus: jira-data-center/round4/M1-column.md 11.2 issues move only with the whole-instance XML backup or a project import", "plane": "corpus: plane/round4/menu-tree.md has no copy action ; source: grep -niE 'duplicate|clone|copy' apps/api/plane/app/urls/project.py returns only the licence header line" }, @@ -577,7 +620,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'typed fields ... there is no schema' ; source: lib/Db/Board.php fields ; source read at v1.19.0: lib/Db/Board.php:34-53 fixed columns only; searched lib/ and src/ for 'custom field', 'customField', 'custom_field': none", "kanboard": "corpus: kanboard/round4/code-census.md 'metadata without a screen: project_has_metadata' ; open-core.md 'MetaMagik for typed custom fields' is a third-party plugin", - "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields'", + "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields' ; source read at v17.8.0: config/routes.rb:789 admin project_custom_fields resources; config/initializers/menus.rb:777 project settings 'Project attributes'; app/models/project_custom_field.rb:58-66 visibility with admin_only fields; config/locales/en.yml:3575 'Project attributes'", "jira": "corpus: jira-data-center/round4/M1-column.md 11.23 projects have categories only; custom field contexts are 'a combination of projects and issue types where that field can be used' (2.2): fields live on issues, not projects", "plane": "corpus: plane/round4/code-census.md §2 'the community edition has no custom fields on any object'; menu-tree.md 'no Custom fields or properties anywhere'" }, @@ -606,7 +649,7 @@ "evidence": { "nextcloud-deck": "source: lib/Db/Board.php has no parent field ; corpus: nextcloud-deck/round4/menu-tree.md a flat list of boards ; source read at v1.19.0: lib/Db/Board.php:34-53 no parent field; searched lib/Db and src/ for 'parentId', 'parent_id', 'subboard': only a comment reply parentId in src/services/CommentApi.js:27", "kanboard": "source: grep -niE 'parent' app/Model/ProjectModel.php returns 0 hits; corpus: kanboard/round4/menu-tree.md flat project list", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:64-65 'New subproject' needs add_subprojects; app/contracts/projects/base_contract.rb:45-46 parent attribute validated as assignable; app/contracts/projects/create_contract.rb:43-44 portfolio and program workspaces need the :portfolio_management Enterprise token, plain subprojects do not", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy'; corpus: jira-data-center/round4/M1-column.md 11.21 Advanced Roadmaps hierarchy 'Standard issue types are placed above the epic level (commonly Initiative ...)' groups issues, not projects", "plane": "corpus: plane/round4/code-census.md §2 Project model lists no parent; 'teamspace' grep 0 hits (Teamspaces are Pro) ; source: grep -n parent apps/api/plane/db/models/project.py shows no parent project FK" }, @@ -635,7 +678,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Open details for the board's sidebar with sharing, tags, deleted items and the activity stream' ; no description or progress on a board (lib/Db/Board.php) ; source read at v1.19.0: src/components/board/BoardSidebar.vue:11-42 the board details sidebar has tabs 'Sharing' (members), 'Tags', 'Deleted items', 'Activity' and no description or progress; lib/Db/Board.php:34-53 no description field; src/router.js:94 /board/:id/details", "kanboard": "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity", - "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews", + "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews ; source read at v17.8.0: modules/overviews/config/routes.rb:6-7 project overview at the project root; modules/overviews/lib/overviews/grid_registration.rb:16 'project_description', :26 'project_status', :46 'members' default widgets; modules/overviews/app/components/overviews/overview_grid_component.rb renders them", "jira": "docs: project 'Summary' / project page is not in the corpus; corpus: jira-data-center/round4/M1-column.md 10.2 dashboards with gadgets can be built per project ('multiple dashboards for different projects'); no built-in overview with members and progress documented", "plane": "source: no overview route under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ (archives, cycles, intake, issues, modules, pages, views only); the project card shows description and member count (apps/web/core/components/project/card.tsx:285-292). Project updates are a paid string never emitted (corpus: plane/round4/code-census.md opening section, is_project_updates_enabled 0 hits)" }, @@ -665,7 +708,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/promoted row 11.26 in _round4/compare/promoted-rows-batch6.md 'no knowledge base; the platform's Collectives is a store app' ; source read at v1.19.0: searched lib/ and src/ for 'wiki', 'collectives', 'page': no knowledge pages; nearest is file attachments on a card and the related resources panel in src/components/board/SharingTabSidebar.vue:82 NcRelatedResourcesPanel", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 11.26 'grep knowledge|faq|wiki returns 0. The nearest thing is a project file'", - "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Wiki'; corpus: openproject/round4/M1-column.md 9.1 wiki pages searchable (wiki_page.rb:52)", + "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Wiki'; corpus: openproject/round4/M1-column.md 9.1 wiki pages searchable (wiki_page.rb:52) ; source read at v17.8.0: lib/redmine/menu_manager/wiki_menu_helper.rb:30-34 builds the project Wiki menu when the module is on; config/routes.rb:496-500 project wiki resources with new page; app/models/wiki_page.rb:31, :52 wiki pages are searchable", "jira": "corpus: jira-data-center/round4/M1-column.md 1.9 'Integrating with Confluence Give your team the ability to share, discuss and work with Jira application issues in Confluence': wiki is a separate product (Confluence)", "plane": "corpus: plane/round4/menu-tree.md 'Pages the only feature toggle that defaults on' ; code-census.md §4 Page with versioning, linked to projects via ProjectPage. 'Wikis' as a distinct object and 'Nested Pages' are paid (open-core.md)" }, @@ -694,7 +737,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 1 'then the group vergunningen with edit' ; code-census.md Acl participant type group or team ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:30-31 shares shown as '(Group)' and '(Team)'; lib/Db/Acl.php:37 PERMISSION_TYPE_GROUP and :39 PERMISSION_TYPE_CIRCLE; lib/Service/BoardService.php:419 addAcl(boardId, type, participant, ...)", "kanboard": "corpus: kanboard/round4/journeys.md 5 'createGroup Bouwtoezicht, addGroupMember carol, addProjectGroup(project-member): carol read the task'", - "openproject": "corpus: openproject/round4/M1-column.md 13.6 'a Group can be given a membership, so group-based visibility works'", + "openproject": "corpus: openproject/round4/M1-column.md 13.6 'a Group can be given a membership, so group-based visibility works' ; source read at v17.8.0: app/models/member.rb:40 a member is any principal; app/models/group.rb:31 Group < Principal; app/services/members/create_service.rb:49-55 adding a Group as member creates inherited memberships for its users; config/initializers/menus.rb:752 project Members page", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects'", "plane": "corpus: plane/round4/code-census.md §5 membership is per user, 'teamspace' grep 0 hits; M1-column.md 2.5 'assignees are individual users'. Teamspaces are a Pro string (open-core.md)" }, @@ -723,7 +766,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' ; M1-column.md 1.1 no PublicPage on a card route ; source read at v1.19.0: searched src/router.js and appinfo/routes.php for a public board or link share route: none; lib/Controller/BoardOcsController.php:37-38 PublicPage read serves federated remote boards, see lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE, which requires an account on another server", "kanboard": "corpus: kanboard/round4/journeys.md 6 'Enable public access ... the read-only board ... answered 200 without a session' ; menu-tree.md Public", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:105 'Make a project public'; corpus: openproject/round4/M1-column.md 4.21 'a public project, which exposes the whole project to anonymous users' (read-only follows the Anonymous role's permissions) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:105 'Make a project public'; corpus: openproject/round4/M1-column.md 4.21 'a public project, which exposes the whole project to anonymous users' (read-only follows the Anonymous role's permissions) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:177-178 'Make public' row action needs edit_project; app/models/project.rb:202 public_projects scope; :228 visible? is true for a public project to any user including anonymous, whose rights come from the Anonymous role, app/models/anonymous_user.rb:34", "jira": "corpus: jira-data-center/round4/M1-column.md 4.21 'you need to allow anonymous users to browse, search, and create issues in that project' (Allowing anonymous access to your project); browse without create is the read-only variant", "plane": "corpus: plane/round4/code-census.md §6 'DeployBoard publishes an entity behind a random anchor', TYPE_CHOICES include project, view, page; space viewsets set AllowAny (space/views/project.py:20) ; journeys.md siblings of intake 'got past authentication'" }, @@ -752,7 +795,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'Deck is a kanban board inside Nextcloud: boards with columns, cards' ; menu-tree.md 'The board, as it opens' ; source read at v1.19.0: src/components/board/Board.vue:61-75 stacks rendered as draggable columns, src/components/board/Stack.vue:104-122 cards inside each stack; lib/Db/Stack.php:28-35 a stack has title, board, order and isDoneColumn; appinfo/routes.php:37-43 stack routes", "kanboard": "corpus: kanboard/round4/usability.md 'Kanboard is a Kanban board with a task behind every card' ; menu-tree.md 'Overview · Board · List'", - "openproject": "corpus: openproject/round4/menu-tree.md global 'Boards' and project 'Work packages list, plus Gantt, board and calendar views'; boards_view is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md); docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:11 'OpenProject Agile boards ... Boards consist of lists (columns) and cards (work packages)' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md global 'Boards' and project 'Work packages list, plus Gantt, board and calendar views'; boards_view is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md); docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:11 'OpenProject Agile boards ... Boards consist of lists (columns) and cards (work packages)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/config/routes.rb:2-13 global and project boards; modules/boards/app/controllers/boards/boards_controller.rb:120-129 basic and action board types; frontend/src/app/features/boards/board/board-list/board-list.component.html:22 a list per query; searched modules/boards for 'enterprise', 'allows_to': none, action boards free since 17.3", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Click Create a Kanban board'", "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in a spreadsheet, board, calendar or gantt layout. That path is fast, clean and well made'" }, @@ -782,7 +825,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'a stack is a column you drag a card into' (open-core.md 2.7 row) ; M1-column.md 2.6 'one card at a time is dragged' ; source read at v1.19.0: src/components/board/Stack.vue:104-114 vue-smooth-dnd Container with @drop onDropCard (:277); appinfo/routes.php:52 card#reorder moves a card to another stack and order", "kanboard": "corpus: kanboard/round4/usability.md 'the board, its columns and swimlanes' ; journeys.md 1 moveTaskPosition (the API behind the drag)", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list or to a new list. Remember: Moving cards to another list in an Action board will update their attributes, e.g. status' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list or to a new list. Remember: Moving cards to another list in an Action board will update their attributes, e.g. status' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-card-view.component.ts:265 handleDrop; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165 cross-list drop; frontend/src/app/features/boards/board/board-actions/board-action.service.ts:280 assignToWorkPackage writes the list's attribute (status, assignee, version) to the moved card", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints section (cards moved between columns); corpus: jira-data-center/round4/M1-column.md 3.18 'you can drag and drop them'; board drag is the documented move", "plane": "corpus: plane/round4/journeys.md board layout driven ; source: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable() from pragmatic-drag-and-drop; the workflow gate is the no-op hook (code-census.md opening section, use-workflow-drag-n-drop.ts:10-23), so every drop is accepted" }, @@ -812,7 +855,7 @@ "evidence": { "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue:113-123 arrow keys move focus between cards, src/components/cards/CardItem.vue:283 'KeyM' opens the card menu with Move card (corpus: nextcloud-deck/round4/menu-tree.md 'The action menu: Mark as done, Move card') ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:118-129 arrow keys move focus between cards; src/components/cards/CardItem.vue:306-307 'KeyM' opens the card menu; src/components/cards/CardMenuEntries.vue:53-57 'Move/copy card' opens src/CardMoveDialog.vue:6-18 'Select a board', 'Select a list'", "kanboard": "source: app/Template/task/sidebar.php:86 'Move position' dialog on the task page is a keyboard-usable form; app/Template/config/keyboard_shortcuts.php lists no card focus or move key on the board", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniE 'keydown|keyboard|hotkey' frontend/src/app/features/boards returns only board-list-container.component.html:46 '(keydown.enter)=addList(board)'; cards move through WorkPackageCardDragAndDropService (drag only). The card's status can be changed from the card itself (agile-boards README:156 'update a work package's status directly in the card'), which is keyboard reachable on a Status board only", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniE 'keydown|keyboard|hotkey' frontend/src/app/features/boards returns only board-list-container.component.html:46 '(keydown.enter)=addList(board)'; cards move through WorkPackageCardDragAndDropService (drag only). The card's status can be changed from the card itself (agile-boards README:156 'update a work package's status directly in the card'), which is keyboard reachable on a Status board only ; source read at v17.8.0: searched frontend/src/app/features/boards and frontend/src/app/shared/directives/sortable-lists for 'keydown', 'keyboard', 'ArrowUp': only frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:46-47 Enter or Space on 'Add list'; cards move by drag only", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html only says app-specific shortcuts appear in the in-product dialog (Shift + /); the board shortcut list is not in the documentation and no instance was available", "plane": "source: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:216 shortcut \"s\" opens the state menu for the focused work item in the command palette, so a state (column) change works from the keyboard once the item is open; no keyboard move on the board itself found (kanban/block.tsx is pointer drag only). Not driven in round 4" }, @@ -841,7 +884,7 @@ "evidence": { "nextcloud-deck": "source: lib/Db/Stack.php carries title, order, isDoneColumn and no limit; corpus: nextcloud-deck/round4/code-census.md 'Stack with order and isDoneColumn' ; source read at v1.19.0: lib/Db/Stack.php:28-35 title, boardId, order, isDoneColumn and no limit; searched lib/ and src/ for 'wip', 'limit' on stacks, 'max_cards': none. 1.19.0 only shows a card count beside the list title, CHANGELOG.md:10 and src/components/board/Stack.vue:18", "kanboard": "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded'", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'wip.limit|work.in.progress|max_cards|card_limit' over app, modules and frontend/src hits only GitLab merge-request 'work in progress' handling (modules/gitlab_integration/...upsert_merge_request.rb); agile-boards README documents no list limit", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'wip.limit|work.in.progress|max_cards|card_limit' over app, modules and frontend/src hits only GitLab merge-request 'work in progress' handling (modules/gitlab_integration/...upsert_merge_request.rb); agile-boards README documents no list limit ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'wip_limit', 'wip.limit', 'max_cards', 'card_limit': none; a list is a saved query with a name only, frontend/src/app/features/boards/board/board-list/board-list.component.html:22", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints)", "plane": "source: grep -rniE 'wip|max_issues|column_limit|issue_limit' --include=*.py apps/api returns only an unrelated test comment; corpus: plane/round4/code-census.md §2 State fields are name, description, color, slug, sequence, is_triage, default (no limit)" }, @@ -874,7 +917,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add list ... each with Add card and an Actions menu (rename, reorder, mark as done column, delete)' ; source read at v1.19.0: src/components/Controls.vue:39-56 'Add list', src/components/board/Stack.vue:43 'Edit list title', :69 'Delete list'; src/components/board/Board.vue:61-67 lists are draggable with @drop onDropStack; appinfo/routes.php:38-41 stack create, update, reorder, delete", "kanboard": "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:45-50 'Add list'; :7-10 drag lists to reorder (moveList); frontend/src/app/features/boards/board/board-list/board-list.component.html:22-25 rename a list inline; frontend/src/app/features/boards/board/board-list/board-list-menu.component.ts:66 'Delete list'", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header'", "plane": "corpus: plane/round4/menu-tree.md 'Settings ... States' ; code-census.md §2 State per project with name, color, sequence; 'Groups are not user-definable' (six fixed groups), so columns within groups are free" }, @@ -904,7 +947,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'mark as done column' ; source: lib/Service/CardService.php:454-455 a card moved into the done column gets setDone ; source read at v1.19.0: src/components/board/Stack.vue:66 list menu 'Set cards as \"done\"'; lib/Db/Stack.php:35 isDoneColumn; lib/Service/CardService.php:454-462 a card moved into the done list gets setDone, leaving it clears done; appinfo/routes.php:158 stack_ocs#setDoneStack", "kanboard": "corpus: kanboard/round4/journeys.md 2 'createAction(project 1, task.move.column, TaskCloseColumn, column_id 4) ... is_active 0' : done is an automatic action per project, not a column flag", - "openproject": "Status board columns are statuses and a status carries is_closed (corpus: openproject/round4/M1-column.md 2.7 'app/models/status.rb:31 ... is_closed (used at work_package.rb:105)'); the column itself is not marked done, closure comes from the status it maps to, and Basic board columns change nothing (agile-boards README:55)", + "openproject": "Status board columns are statuses and a status carries is_closed (corpus: openproject/round4/M1-column.md 2.7 'app/models/status.rb:31 ... is_closed (used at work_package.rb:105)'); the column itself is not marked done, closure comes from the status it maps to, and Basic board columns change nothing (agile-boards README:55) ; source read at v17.8.0: app/models/work_package.rb:276 closed? comes from status.is_closed?; modules/boards/app/services/boards/status_board_create_service.rb:11-12 a Status board list is a status_id filter, so a list counts as done only through its status; searched frontend/src/app/features/boards for a done or closed flag on a list: none", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses'", "plane": "corpus: plane/round4/code-census.md §2 'A state change to a completed group state sets Issue.completed_at (issue.py:236-249)'; the completed group is fixed rather than chosen, but any state placed in it counts as done" }, @@ -934,7 +977,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md filter 'title: description: list: tag: assigned: date:' ; a card has no priority (open-core.md 'a card is title, description, date, labels, assignees') ; source read at v1.19.0: src/components/Controls.vue:104 'Filter by tag', :115 'Filter by assigned user', :139 'Filter by status', :172 'Filter by due date', :65-74 board filter text field; lib/Db/Card.php has no priority field, searched lib/Db and src/ for 'priority': none, so assignee and label yes, priority no", "kanboard": "corpus: kanboard/round4/usability.md 'one query language with twenty-five attributes runs the board' ; source: app/Filter/TaskPriorityFilter.php, assignee and tag filters in app/Filter/", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/features/boards/board/board-filter/board-filter.component.html '' with board-filters.service.ts building ApiV3 filters (assignee, type, priority, any work package filter corpus: openproject/round4/M1-column.md 9.2) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/features/boards/board/board-filter/board-filter.component.html '' with board-filters.service.ts building ApiV3 filters (assignee, type, priority, any work package filter corpus: openproject/round4/M1-column.md 9.2) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filter.component.html:1 '' the full work package filter set (assignee, type, priority, ...); frontend/src/app/features/boards/board/board-filter/board-filters.service.ts builds the ApiV3 filters saved on the board", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board'; default 'Only My Issues' and 'Recently Updated', each a JQL (assignee, labels, priority)", "plane": "corpus: plane/round4/usability.md 'Layouts, filtering, the command palette ... are all good' ; code-census.md §9 IssueView filters; source: packages/constants/src/issue/filter.ts 'issues' page filters include assignees, labels, priority" }, @@ -964,7 +1007,7 @@ "evidence": { "nextcloud-deck": "source: src/components/Controls.vue view modes are 'Kanban view' and 'Gantt view' only (viewMode values kanban, gantt), plus 'Toggle compact mode'; corpus: nextcloud-deck/round4/menu-tree.md says 'the view modes (board and list)', which the tag's source does not bear out; the nearest list is 'Upcoming cards' across boards (menu-tree.md) ; source read at v1.19.0: src/components/Controls.vue:235-249 view modes 'Kanban view' and 'Gantt view', :261 'Toggle compact mode'; src/components/board/Board.vue:52 GanttView when viewMode is gantt; searched src/ for a list or table view mode: none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Overview · Board · List'", - "openproject": "corpus: openproject/round4/menu-tree.md 'Work packages list, plus Gantt, board and calendar views' over the same work packages", + "openproject": "corpus: openproject/round4/menu-tree.md 'Work packages list, plus Gantt, board and calendar views' over the same work packages ; source read at v17.8.0: frontend/src/app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive.ts:79 card view and :99 list view of the same query; frontend/src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service.ts:35-36 'list'|'card'; a board's lists are work package queries over the same records", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'base your board on an existing Saved Filter'; the same filter opens as a list in the issue navigator (corpus: jira-data-center/round4/M1-column.md 9.3, 9.5 column chooser)", "plane": "corpus: plane/round4/menu-tree.md 'spreadsheet, board, calendar, gantt and list layouts'" }, @@ -994,7 +1037,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels, the due badge, assignee avatars' ; source: src/components/cards/CardBadges.vue has no dependency or blocked badge ; source read at v1.19.0: src/components/cards/CardItem.vue:50-54 labels on the card, src/components/cards/CardBadges.vue:9 due date badge, :24 checklist, :33 attachments, :40 assignee avatars; searched CardBadges.vue for 'depend', 'blocked': none, so no blocked state", "kanboard": "source: app/Template/board/task_footer.php:24-28 tags, :62-74 due date, :135 priority, app/Template/board/task_private.php:29 assignee; blocked shows only as a link count icon (:89-90) with a tooltip ; corpus: kanboard/round4/menu-tree.md board screenshot", - "openproject": "Cards show type, subject, assignee avatar and dates, with highlighting by priority or type (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/.../highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'|'none'|'inline'); labels do not exist (corpus: openproject/round4/M1-column.md 2.8) and there is no blocked marker on a card (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "Cards show type, subject, assignee avatar and dates, with highlighting by priority or type (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/.../highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'|'none'|'inline'); labels do not exist (corpus: openproject/round4/M1-column.md 2.8) and there is no blocked marker on a card (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html:121 'dueDate', :134 status button, :159-160 assignee avatar, :104-106 type; frontend/src/app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const.ts:31 priority or type highlight; searched that card template for 'blocked', 'blocks': none, and no label object exists", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards', 'Days in column shows dots on each card'; assignee avatar, flags and labels as a card field; blocked shown by the flag or a query colour ('One color per JQL query')", "plane": "source: packages/constants/src/issue/common.ts ISSUE_DISPLAY_PROPERTIES keys key, assignee, start_date, due_date, labels, priority, state, sub_issue_count, attachment_count, link, estimate, modules, cycle: no blocked indicator; grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits ; corpus: plane/round4/code-census.md §9 display_properties" }, @@ -1023,7 +1066,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md Card and Stack carry an order ; source: appinfo/routes.php card#reorder ; source read at v1.19.0: src/components/board/Stack.vue:104-114 drag within a list calls onDropCard; lib/Service/CardService.php:436 reorder(id, stackId, order); appinfo/routes.php:52 card#reorder", "kanboard": "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:161-175 same-list drop is a pure reorder; lib/api/v3/queries/order/query_order_api.rb:34, :73 PATCH the manual order; app/models/ordered_work_package.rb:31-35 stored position", "jira": "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column)", "plane": "corpus: plane/round4/code-census.md §2 'sort_order float (:158)' on Issue ; source: kanban/block.tsx:206 drag within a group reorders by sort_order under manual ordering" }, @@ -1055,7 +1098,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'each with Add card' ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' in each list, :128-135 inline 'Card name' input; src/components/KeyboardShortcuts.vue:106-107 'KeyN' new card; appinfo/routes.php:47 card#create", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/add-card-dropdown/add-card-dropdown-menu.directive.ts:61 'Add new card' and :69 'Add existing'; config/locales/js-en.yml:189 'Add new card'; frontend/src/app/features/boards/board/board-list/board-inline-create.service.ts creates the card inside the list's query", "jira": "docs: inline create is documented on the backlog, not per board column; board cards come from the Create dialog (corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen'); not verified in a running instance", "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot per column ; corpus: plane/round4/menu-tree.md 'New work item' global create" }, @@ -1088,7 +1131,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source read at v1.19.0: src/router.js:55-60 /board route renders Boards with the ALL filter; src/components/boards/Boards.vue:9 'Search boards', :16-23 a table of every board with 'Board name' and 'Members'; src/components/navigation/AppNavigation.vue:19 'All boards'; appinfo/routes.php:20 board#index", "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Dashboard' ; source: app/Template/config/keyboard_shortcuts.php 'Open board switcher'", - "openproject": "corpus: openproject/round4/menu-tree.md global module 'Boards' in the top-left grid lists boards across projects", + "openproject": "corpus: openproject/round4/menu-tree.md global module 'Boards' in the top-left grid lists boards across projects ; source read at v17.8.0: modules/boards/config/routes.rb:2-5 global boards index; modules/boards/lib/open_project/boards/engine.rb:63-80 top and global menu 'Boards'; modules/boards/app/controllers/boards/boards_controller.rb:76-81 without a project it lists boards of every project allowed :show_board_views; modules/boards/app/views/boards/boards/index.html.erb:48 table of them", "jira": "docs: Jira Software 'View all boards' from the Boards menu; docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html boards span 'one or more projects'", "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) offers spreadsheet and list layouts only; profile_issues offers kanban of your own items grouped by state or project. No page with every project's board ; corpus: plane/round4/menu-tree.md 'Workspace: Projects, Views, Analytics, Archives'" }, @@ -1118,7 +1161,7 @@ "evidence": { "nextcloud-deck": "no WIP limit to enforce (brd-wip-limits) ; source: lib/Db/Stack.php ; source read at v1.19.0: no limit to enforce: lib/Db/Stack.php:28-35 has no limit field; lib/Service/CardService.php:436 reorder checks permission and archive state, searched it for 'limit', 'max': none", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 9.14 'task_limit ... and, verified live, does not refuse the move'", - "openproject": "no WIP limit exists (see brd-wip-limits grep), so nothing blocks a move", + "openproject": "no WIP limit exists (see brd-wip-limits grep), so nothing blocks a move ; source read at v17.8.0: no limit to enforce: searched app, lib, modules and frontend/src for 'wip_limit', 'max_cards', 'card_limit': none; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165-171 a cross-list drop has no capacity check", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints are informational: violations only colour the column red or yellow and do not prevent issues being moved into it", "plane": "no WIP limit exists (see brd-wip-limits); the drop gate is the hollow shim use-workflow-drag-n-drop.ts:10-23 'isWorkflowDropDisabled: false' (corpus: plane/round4/open-core.md shims table)" }, @@ -1147,7 +1190,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md the board is lists as columns only ; source: grep -rniF 'swimlane' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'swimlane', 'lane', 'groupBy': none; src/components/board/Board.vue:61-75 renders stacks as a single row of columns", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Swimlanes' ; code-census.md 'swimlanes SwimlaneModel' : swimlanes are named lanes a user places tasks in, not grouped automatically by assignee, priority or epic", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'swimlane' over the tree returns nothing; agile-boards README documents Basic and Action boards only", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'swimlane' over the tree returns nothing; agile-boards README documents Basic and Action boards only ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'swimlane' (case-insensitive): none; board lists are laid out in one horizontal row, frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:9 cdkDropListOrientation horizontal", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane", "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx ; packages/constants/src/issue/filter.ts:237 sub_group_by options state, priority, cycle, module, labels, assignees, created_by. No epic swimlane because epics are unreachable (corpus: plane/round4/journeys.md epics 404)" }, @@ -1176,7 +1219,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' (personal and shared saved searches) ; source read at v1.19.0: searched lib/ and src/ for 'savedFilter', 'saveFilter', 'saved filter': none; src/components/Controls.vue:104-229 filter state lives in the page only, with 'Clear filter' at :229", "kanboard": "corpus: kanboard/round4/journeys.md 5 'a custom filter Deze week te doen was saved as shared' ; code-census.md 'custom_filters.is_shared'", - "openproject": "A board is itself a saved query and work package queries can be saved and shared (corpus: openproject/round4/M1-column.md 9.3, 9.4 'a query is public or private'); board filter state is saved with the board, no separate named filter set per board", + "openproject": "A board is itself a saved query and work package queries can be saved and shared (corpus: openproject/round4/M1-column.md 9.3, 9.4 'a query is public or private'); board filter state is saved with the board, no separate named filter set per board ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filters.service.ts keeps one filter set saved with the board; app/contracts/queries/base_contract.rb:37 public flag and :62, :79 manage_public_queries for shared work package queries; searched frontend/src/app/features/boards for a named saved filter per board: none", "jira": "corpus: jira-data-center/round4/M1-column.md 9.4 'Filters ... can be shared with other users, user groups, projects, and project roles'; docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters are saved per board for 'anyone else using this board'", "plane": "corpus: plane/round4/code-census.md §9 'a saved view can be shared (access = 1, the default) and it does carry its column set' ; menu-tree.md 'Views saved views'" }, @@ -1205,7 +1248,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels' ; M1-column.md 2.8 'labels per board with a colour' : labels are coloured chips, the card itself is not coloured by category ; source read at v1.19.0: per-card colour exists, which the drive evidence missed: src/components/cards/CardMenuEntries.vue:7-13 'Change card color' picker, src/components/cards/CardItem.vue:203 renders it, lib/Db/Card.php:75 color, lib/Service/CardService.php:292-294; the colour is set by hand, not derived from a label, type or category, so partial stands", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/configuration-modal/tabs/highlighting-tab.component.html:13 'entire card by' with :26 type and :29 priority options; app/contracts/queries/base_contract.rb:42 highlighting_mode saved; searched app and lib for an Enterprise gate on highlighting: none, attribute highlighting released to Community in 17.1", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query'", "plane": "corpus: plane/round4/code-census.md §2 labels and states carry color; source: ISSUE_DISPLAY_PROPERTIES shows label and state chips on the card, no setting colours the whole card by label or type (no types exist, journeys.md)" }, @@ -1234,7 +1277,7 @@ "evidence": { "nextcloud-deck": "source: lib/Service/CardService.php:454-460 entering the done column marks the card done and leaving it clears done; no other action ; corpus: nextcloud-deck/round4/M1-column.md 3.9 'no' ; source read at v1.19.0: lib/Service/CardService.php:454-462 entering a done list marks the card done and leaving it clears done, set from src/components/board/Stack.vue:66; searched lib/ for other stack-entry side effects, 'rule', 'automation': none", "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'Moving work packages (cards) between two lists will update them automatically' (status, assignee, version boards set that attribute); arbitrary actions on entry need custom actions, which are button-triggered and Enterprise gated (corpus: openproject/round4/M1-column.md 3.9) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'Moving work packages (cards) between two lists will update them automatically' (status, assignee, version boards set that attribute); arbitrary actions on entry need custom actions, which are button-triggered and Enterprise gated (corpus: openproject/round4/M1-column.md 3.9) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-actions/board-action.service.ts:279-290 moving a card writes the list's one attribute (status, assignee, version, subproject, parent); app/controllers/custom_actions_controller.rb:34 richer multi-field custom actions are Enterprise gated and triggered by a button, not by entering a list", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation on 'issue transitioned' whose actions are 'editing issues, sending notifications, creating sub-tasks' and workflow post functions such as 'Assign to Current User' (3.8); a column maps to statuses (docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html)", "plane": "corpus: plane/round4/code-census.md §3 'The only automation engine in CE is two integer settings and one nightly job' (archive_in, close_in); 'Trigger And Action' (Pro) and 'Workflows + Approvals' (Business) are paid strings absent from Community (open-core.md)" }, @@ -1261,9 +1304,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Upcoming cards cards assigned to me across boards, by due date' is a list, not a board", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Upcoming cards cards assigned to me across boards, by due date' is a list, not a board ; source read at v1.19.0: src/components/overview/Overview.vue:57-83 the Upcoming view groups my assigned cards from all boards into fixed due-date columns (Overdue, Today, Tomorrow, Next 7 days, Later, No due) with no drag between them; src/stores/overview.js:26 and lib/Controller/OverviewApiController.php:29 upcomingCards; no board that holds cards of several boards", "kanboard": "corpus: kanboard/round4/menu-tree.md a board belongs to one project; Dashboard lists tasks across projects but no shared board", - "openproject": "Action boards include a subproject board (docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards, create-subproject-board image) and boards are per project; no board over unrelated projects documented (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "Action boards include a subproject board (docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards, create-subproject-board image) and boards are per project; no board over unrelated projects documented (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/app/models/boards/grid.rb:33 a board belongs_to one project; modules/boards/app/services/boards/subproject_board_create_service.rb:4-9 a Subproject board, lists per child project; frontend/src/app/features/boards/board/board-actions/subproject/subproject-action.service.ts:43 'onlySubproject' filter; searched modules/boards for a board over unrelated projects: none", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects' and 'base your board on an existing Saved Filter'", "plane": "source: packages/constants/src/issue/filter.ts my_issues layouts spreadsheet and list only (used by apps/web/core/components/workspace/views/form.tsx:148); profile_issues has kanban grouped by project for one person's items. Cross-project work is list-shaped, not a shared board" }, @@ -1290,9 +1333,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'A card becomes a case' ; menu-tree.md card action menu 'Delete' ; done or open is the status (code-census.md Card done, archived)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'A card becomes a case' ; menu-tree.md card action menu 'Delete' ; done or open is the status (code-census.md Card done, archived) ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' and :135 'Card name'; src/components/card/CardSidebar.vue:231-238 title edit; src/components/card/Description.vue description; src/components/cards/CardMenuEntries.vue:49 'Mark as done', :78 'Delete card'; lib/Controller/CardController.php:49 create, :67 update, :83 delete, :106 done", "kanboard": "corpus: kanboard/round4/menu-tree.md task 'Edit the task ... Open this task / Close this task · Remove' ; journeys.md 1 createTask", - "openproject": "corpus: openproject/round4/journeys.md 'Creating a work package, giving it a start date and a duration ... is the best-supported path'; corpus: openproject/round4/M1-column.md 1.2 work package create form; 2.17 delete service", + "openproject": "corpus: openproject/round4/journeys.md 'Creating a work package, giving it a start date and a duration ... is the best-supported path'; corpus: openproject/round4/M1-column.md 1.2 work package create form; 2.17 delete service ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-new/wp-new-full-view.component.ts:35 create view; config/initializers/permissions.rb:324 add_work_packages, :333 edit_work_packages, :436 delete_work_packages; app/services/work_packages/create_service.rb, update_service.rb and delete_service.rb do the writes; app/models/work_package.rb:59 status", "jira": "corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen to open the Create issue dialog box'; 2.17 'Delete issues Permission'; statuses 2.7", "plane": "corpus: plane/round4/journeys.md 'create a work item, give it a state, a priority, assignees, labels, a start date and a target date' ; code-census.md §2 Issue fields" }, @@ -1320,9 +1363,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.4 'assignUser and unassignUser per card ... Verified live'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.4 'assignUser and unassignUser per card ... Verified live' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:17-18 'Assign a user to this card…' mounted from src/components/card/CardSidebarTabDetails.vue:15-19; lib/Controller/CardController.php:126 assignUser, lib/Service/AssignmentService.php:48", "kanboard": "corpus: kanboard/round4/M1-column.md 2.4 'yes' ; journeys.md 5 ; source: app/Model/TaskCreationModel.php:67 owner_id", - "openproject": "corpus: openproject/round4/M1-column.md 2.4 'assigned_to and a separate responsible, both Principal (app/models/work_package.rb:57-81)'", + "openproject": "corpus: openproject/round4/M1-column.md 2.4 'assigned_to and a separate responsible, both Principal (app/models/work_package.rb:57-81)' ; source read at v17.8.0: app/models/work_package.rb:61 assigned_to (a Principal); lib/api/v3/work_packages/schema/work_package_schema_representer.rb:451-453 available assignees feed the assignee picker; lib/api/v3/work_packages/work_packages_api.rb:99 AvailableAssigneesAPI", "jira": "corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission to assign issues to users'", "plane": "corpus: plane/round4/M1-column.md 2.4 'Issue.assignees M2M (issue.py:149) ... editable from the work item peek and the spreadsheet layout'" }, @@ -1349,9 +1392,9 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'jdevries and the group as assignees' ; code-census.md 'Assignment: user, group, team, remote'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'jdevries and the group as assignees' ; code-census.md 'Assignment: user, group, team, remote' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:14 :multiple=\"true\", :6 'Assign to users/groups/team'; lib/Db/Assignment.php:17-20 user, group, circle and remote assignees", "kanboard": "source: a task has one owner_id (app/Model/TaskCreationModel.php:67); corpus: kanboard/round4/M1-column.md 2.5 'partial' (group only through a project, not per task)", - "openproject": "corpus: openproject/round4/M1-column.md 2.5 'the two people fields are assigned_to and responsible and both are single-valued'; a Group can hold the assignment (one principal)", + "openproject": "corpus: openproject/round4/M1-column.md 2.5 'the two people fields are assigned_to and responsible and both are single-valued'; a Group can hold the assignment (one principal) ; source read at v17.8.0: app/models/work_package.rb:61-62 assigned_to and responsible are single belongs_to; searched app/models and lib/api/v3/work_packages for 'assignees' as a list and 'multi assign': only the available assignees picker; a group can be the one assignee", "jira": "corpus: jira-data-center/round4/M1-column.md 2.5 the assignee must be a single user (JRASERVER-5921 'Assign an issue to a group' closed as duplicate); 5.1 a 'User picker (multiple users)' custom field can list several people, which is not the assignee", "plane": "corpus: plane/round4/code-census.md §2 'assignees M2M (:149)'; journeys.md 'assignees' plural set in the driven journey" }, @@ -1378,9 +1421,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'a card is title, description, date, labels, assignees; there is no schema' ; source: lib/Db/Card.php has no priority", + "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'a card is title, description, date, labels, assignees; there is no schema' ; source: lib/Db/Card.php has no priority ; source read at v1.19.0: lib/Db/Card.php:73-96 card fields hold no priority; searched lib/ and src/ for 'priority': only lib/Activity/Filter.php:47 and lib/Activity/SettingBase.php:55 (activity sort order), nothing on a card", "kanboard": "source: app/Filter/TaskPriorityFilter.php, app/Template/board/task_footer.php:135 renderPriority, app/Action/TaskAssignColorPriority.php ; corpus: kanboard/round4/M1-column.md 2.6 bulk 'change ... priority'", - "openproject": "corpus: openproject/round4/M1-column.md 8.2 'IssuePriority as a separate administered vocabulary'; 3.9 custom action kinds include priority", + "openproject": "corpus: openproject/round4/M1-column.md 8.2 'IssuePriority as a separate administered vocabulary'; 3.9 custom action kinds include priority ; source read at v17.8.0: app/models/work_package.rb:64 belongs_to priority IssuePriority; app/models/issue_priority.rb:31; config/routes.rb:771 admin work_package_priorities; config/initializers/menus.rb:421-422 'Priorities' admin page", "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'priority is a separate list'; 1.11 issue collector standard fields include 'Priority'", "plane": "corpus: plane/round4/code-census.md §2 'priority from PRIORITY_CHOICES urgent/high/medium/low/none'" }, @@ -1407,9 +1450,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'the date:overdue filter listed the card' ; code-census.md 'duedate, three colour thresholds, one overdue job'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'the date:overdue filter listed the card' ; code-census.md 'duedate, three colour thresholds, one overdue job' ; source read at v1.19.0: src/components/card/DueDateSelector.vue:13 'Set a due date', :187-206 quick picks; src/components/cards/badges/DueDate.vue:67 overdue state on the card badge; src/components/overview/Overview.vue:59 'Overdue' column; lib/Db/Card.php:106 DUEDATE_OVERDUE", "kanboard": "corpus: kanboard/round4/M1-column.md 8.2 'yes' ; _round4/compare/promoted-rows-batch7.md 8.14 'the list and the board colour the date (task-date-overdue)'", - "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package'; 8.2 'due date filters and a late indicator on the work package table'", + "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package'; 8.2 'due date filters and a late indicator on the work package table' ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:129 due_date attribute; app/models/work_package.rb:285-287 overdue? when due_date is past and not closed; frontend/src/app/shared/components/fields/display/field-types/date-display-field.module.ts:63 overdue highlight class", "jira": "corpus: jira-data-center/round4/M1-column.md 3.6 'To schedule an issue, populate its Due date field'; 8.2 'overdue Find issues that were due before today'", "plane": "corpus: plane/round4/M1-column.md 3.6 'Issue.target_date settable, sortable and filterable' and 8.2 'overdue styling is computed client side from target_date'" }, @@ -1437,9 +1480,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'a start date, a due date' ; code-census.md Card 'startdate'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'a start date, a due date' ; code-census.md Card 'startdate' ; source read at v1.19.0: src/components/card/StartDateSelector.vue:6 'Assign a start date to this card…', :12 'Set a start date', mounted at src/components/card/CardSidebarTabDetails.vue:21-23, :176 updateCardStartDate; lib/Db/Card.php:91 startdate; lib/Controller/CardController.php:67 update takes startdate", "kanboard": "source: app/Model/TaskCreationModel.php:64 date_started ; app/Action/TaskMoveColumnOnStartDate.php ; corpus: kanboard/round4/menu-tree.md 'the task's 26 detail fields'", - "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package, distinct from start_date and duration'; corpus: openproject/round4/journeys.md duration derivation", + "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package, distinct from start_date and duration'; corpus: openproject/round4/journeys.md duration derivation ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:122-126 start_date attribute, validated against the soonest start; config/routes.rb:1007 work package pages whose date picker is served by app/controllers/work_packages/date_picker_controller.rb", "jira": "corpus: jira-data-center/round4/M1-column.md 8.3 'plans schedule on target start and target end dates' (Configure your Advanced Roadmaps plan settings)", "plane": "corpus: plane/round4/code-census.md §2 'start_date and target_date DateFields (:147-148)'" }, @@ -1466,9 +1509,9 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.8 'labels per board with a colour ... Verified live: label Kap on card 6'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.8 'labels per board with a colour ... Verified live: label Kap on card 6' ; source read at v1.19.0: src/components/card/TagSelector.vue:15-16 'Assign a tag to this card…', 'Select or create a tag…', mounted at src/components/card/CardSidebarTabDetails.vue:8-13, :187 addLabelToCard; lib/Controller/CardController.php:116 assignLabel, lib/Service/CardService.php:618", "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTag spoed and setTaskTags' ; source: app/Template/board/task_footer.php:28 tag colour", - "openproject": "corpus: openproject/round4/M1-column.md 2.8 'no tag object on a work package. Nearest are app/models/category.rb:31 (project-scoped, single-valued) and a list custom field'", + "openproject": "corpus: openproject/round4/M1-column.md 2.8 'no tag object on a work package. Nearest are app/models/category.rb:31 (project-scoped, single-valued) and a list custom field' ; source read at v17.8.0: searched app/models for 'tag', 'taggable', 'label_ids': no tag object on a work package; nearest app/models/category.rb:31-33 a project-scoped Category, and app/models/work_package.rb holds one category per work package", "jira": "corpus: jira-data-center/round4/M1-column.md 2.8 'Labels is a system field ... Allows adding labels to issues'; labels carry no colour of their own (card colours are per type, priority, assignee or query: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html)", "plane": "corpus: plane/round4/M1-column.md 2.8 'label.py:11 workspace-scoped with an optional project, a self-FK parent, color and sort_order'" }, @@ -1499,9 +1542,9 @@ "kanboard": "yes", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md board sidebar 'tags' ; source: lib/Service/LabelService.php:87 delete, lib/Db/LabelMapper.php:62 deleteLabelAssignments removes it from every card", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md board sidebar 'tags' ; source: lib/Service/LabelService.php:87 delete, lib/Db/LabelMapper.php:62 deleteLabelAssignments removes it from every card ; source read at v1.19.0: src/components/board/TagsTabSidebar.vue:45 'Edit', :50 'Delete', :81 'Add a new tag'; lib/Service/LabelService.php:87 delete checks manage permission; lib/Db/LabelMapper.php:60-64 delete first removes the label from every card (deleteLabelAssignments)", "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'Tags management' and project 'Tags' ; source: app/Schema/Sqlite.php:305 task_has_tags FOREIGN KEY(tag_id) ON DELETE CASCADE", - "openproject": "no label object (corpus: openproject/round4/M1-column.md 2.8); categories are administered per project (category.rb) but are single-valued and not labels", + "openproject": "no label object (corpus: openproject/round4/M1-column.md 2.8); categories are administered per project (category.rb) but are single-valued and not labels ; source read at v17.8.0: no label set to administer: nearest is config/routes.rb:576 per project categories and app/controllers/categories_controller.rb:64-73 deleting a category reassigns or clears it on its work packages, but a category is single-valued and uncoloured, so not labels", "jira": "docs: https://confluence.atlassian.com/display/JIRAKB/Delete+a+label+in+Jira 'To completely delete a label from a Jira instance, it must simply be removed from all the issues where it is used' via bulk 'Change Labels'; labels are free text with no managed set", "plane": "corpus: plane/round4/menu-tree.md 'Settings ... Labels' ; source: apps/api/plane/db/models/issue.py:543-545 IssueLabel label FK on_delete=CASCADE, and bgtasks/deletion_task.py:18 soft_delete_related_objects cascades a soft delete to IssueLabel rows" }, @@ -1528,9 +1571,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card action menu '... and the share link' ; card route /board//card/", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card action menu '... and the share link' ; card route /board//card/ ; source read at v1.19.0: src/router.js:114 route /board/:id/card/:cardId/:tabId? opens the card; src/components/card/CardSidebar.vue:31 'Open in bigger view'; src/components/cards/CardMenuEntries.vue:18 'Card details'; lib/Service/CardService.php:671 getCardUrl builds the shareable link; searched src for 'Copy link', 'clipboard': none, so the link is the address bar URL", "kanboard": "corpus: kanboard/round4/menu-tree.md 'A task, as it opens' (TaskViewController page with its own URL)", - "openproject": "every work package has its own URL /work_packages/ and the full view; corpus: openproject/round4/M1-column.md 2.1 'every work package has an instance-wide integer id'", + "openproject": "every work package has its own URL /work_packages/ and the full view; corpus: openproject/round4/M1-column.md 2.1 'every work package has an instance-wide integer id' ; source read at v17.8.0: config/routes.rb:1007 /work_packages/:id show; app/controllers/work_packages_controller.rb:72 show; frontend/src/app/features/work-packages/routing/work-packages-routes.ts:30 WorkPackagesFullViewComponent the full page view", "jira": "corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'; 2.21 'You can easily keep your team informed by sharing issues with them via email'", "plane": "corpus: plane/round4/open-core.md 'apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx' ; source: quick-action-dropdowns/helper.tsx:107 copyUrlToClipboard(generateWorkItemLink) 'Copy work item link'" }, @@ -1557,9 +1600,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search ... Verified live' ; M1-column.md 9.1 'Dorpsstraat found the card'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search ... Verified live' ; M1-column.md 9.1 'Dorpsstraat found the card' ; source read at v1.19.0: src/components/Controls.vue:65-72 board search field with 'Clear search'; lib/AppInfo/Application.php:136-137 registers DeckProvider and CardCommentProvider for unified search; lib/Search/DeckProvider.php:38 search, lib/Service/SearchService.php:35 searchCards", "kanboard": "corpus: kanboard/round4/M1-column.md 9.1 'the header search box (SearchController::index) runs the same query language across every project'", - "openproject": "corpus: openproject/round4/M1-column.md 9.1 'app/controllers/search_controller.rb over eight registered searchables: work packages ...'", + "openproject": "corpus: openproject/round4/M1-column.md 9.1 'app/controllers/search_controller.rb over eight registered searchables: work packages ...' ; source read at v17.8.0: config/routes.rb:326 search; app/controllers/search_controller.rb:141 search_types from lib/redmine/search.rb:43; app/models/work_package.rb:152 acts_as_searchable over subject and description; frontend/src/app/core/global_search/global-search-work-packages.component.ts the header search results", "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'start typing to search through all your issues and projects'; 4.17 'the text field allows you to search all text fields'", "plane": "corpus: plane/round4/code-census.md §9 'Issues [\"name\", \"sequence_id\", \"project__identifier\"]' and 'Descriptions are not searched ... Nor are comments'; title and key only" }, @@ -1580,15 +1623,15 @@ "name": "Change the status, assignee or labels of several tasks at once.", "origin": "own-code", "planninq": "no", - "nextcloud-deck": "no", + "nextcloud-deck": "partial", "openproject": "yes", "plane": "no", "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.6 'no multi-select on a board ... grep bulk|batch lib/Controller returns 0 hits'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.6 'no multi-select on a board ... grep bulk|batch lib/Controller returns 0 hits' ; 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 as \"done\"' with src/stores/stack.js:122-127 marking every open card in the list done; no selection of several cards: searched src/ for 'multiSelect', 'selectedCards', 'bulk': none", "kanboard": "corpus: kanboard/round4/M1-column.md 2.6 'TaskBulkController, TaskBulkChangePropertyController ... change assignee, category, color, priority, or move a set of tasks'", - "openproject": "corpus: openproject/round4/M1-column.md 2.6 'bulk edit, move, copy and delete on a work package selection'", + "openproject": "corpus: openproject/round4/M1-column.md 2.6 'bulk edit, move, copy and delete on a work package selection' ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts:60-72 'Bulk edit', 'Bulk move', 'Bulk duplicate' on a selection; config/routes.rb:999 work_packages bulk edit, update, destroy; app/controllers/work_packages/bulk_controller.rb", "jira": "corpus: jira-data-center/round4/M1-column.md 2.6 'You can do this by performing a bulk change operation' with edit, move, delete, watch and transition", "plane": "corpus: plane/round4/open-core.md 'use-bulk-operation-status.ts:7 ... export const useBulkOperationStatus = () => false;' ; M1-column.md 2.6 no. 'Full Time Tracking + Bulk Ops' is a Pro string, absent from Community" }, @@ -1615,9 +1658,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.1 'comments on a card through the platform's comments app ... Verified live'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.1 'comments on a card through the platform's comments app ... Verified live' ; source read at v1.19.0: src/components/card/CardSidebar.vue:63-68 'Comments' tab mounts CardSidebarTabComments; src/components/card/CommentForm.vue:8 NcRichContenteditable, :91 1000 character limit; lib/Service/CommentService.php:97 create over the platform comments manager; appinfo/routes.php:171-174 comments API", "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown with edit and delete ... Verified live'", - "openproject": "corpus: openproject/round4/M1-column.md 6.1 'a comment is a journal with notes ... written by app/services/journals/create_service.rb'", + "openproject": "corpus: openproject/round4/M1-column.md 6.1 'a comment is a journal with notes ... written by app/services/journals/create_service.rb' ; source read at v17.8.0: app/components/work_packages/activities_tab/journals/new_component.html.erb:24 'type to comment' and :32 submit comment; config/initializers/permissions.rb:359 add_work_package_comments; app/services/journals/create_service.rb:86 create_journal with notes", "jira": "corpus: jira-data-center/round4/M1-column.md 6.1 'You can add and manage comments in the issue view'", "plane": "corpus: plane/round4/M1-column.md 6.1 'IssueComment with comment_json, comment_html ... parent threading'" }, @@ -1644,9 +1687,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.10 'an attachment of type file is a Files node' ; journeys.md 3 'The attachment turns out to be a file' ; menu-tree.md Attachments '(upload, or attach a file from Files)'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.10 'an attachment of type file is a Files node' ; journeys.md 3 'The attachment turns out to be a file' ; menu-tree.md Attachments '(upload, or attach a file from Files)' ; source read at v1.19.0: src/components/card/AttachmentList.vue:10 'Upload new files', :13 'Share from Files' opening the platform file picker at :230-231, :65 'Show in Files'; lib/Service/FilesAppService.php:39 attachment of type file backed by a Files share; appinfo/routes.php:66 attachment#create", "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskFile with a base64 blob, read back with its path under tasks/3/' ; M1-column.md 4.23 'no' : files upload into Kanboard's own store, there is no organisation file store to pick from", - "openproject": "corpus: openproject/round4/M1-column.md 1.10 'modules/storages/app/models/storages/file_link.rb:35-40 links a remote Nextcloud, OneDrive or SharePoint file to a work package'; 4.23 'Nextcloud is free, the other two are Enterprise gated'", + "openproject": "corpus: openproject/round4/M1-column.md 1.10 'modules/storages/app/models/storages/file_link.rb:35-40 links a remote Nextcloud, OneDrive or SharePoint file to a work package'; 4.23 'Nextcloud is free, the other two are Enterprise gated' ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component.ts Files tab with the storage file picker; modules/storages/app/models/storages/file_link.rb:35-39 a file link on a WorkPackage; modules/storages/lib/open_project/storages/engine.rb:198 manage_file_links; modules/storages/app/models/storages/storage.rb:93 Nextcloud needs no token, one_drive_storage.rb and sharepoint_storage.rb gate on :one_drive_sharepoint_file_storage", "jira": "corpus: jira-data-center/round4/M1-column.md 1.10 'Jira is not hosted in a platform with files or chat of its own; attachments are Jira's'; 4.22 upload by drag and drop, so files are uploaded copies, not links into a file store", "plane": "corpus: plane/round4/code-census.md §4 FileAsset ISSUE_ATTACHMENT uploaded presigned to S3 ; M1-column.md 4.22 drag and drop upload. Files are uploaded copies; there is no link to an organisation file store (M1-column.md 4.23 'no file manager')" }, @@ -1673,9 +1716,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.9 'the activity tab on the card, with the 39 subjects ... Verified live' ; 2.16 description before and after", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.9 'the activity tab on the card, with the 39 subjects ... Verified live' ; 2.16 description before and after ; source read at v1.19.0: src/components/card/CardSidebar.vue:74-78 'Activity' tab, src/components/card/CardSidebarTabActivity.vue:7-12 activity list filtered to object deck_card; lib/Activity/ActivityManager.php:68-94 card subjects (title, description, due date, stack, assign, label, attachment), :412 description before and after (platform activity)", "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 'an Activity stream tab and a Transitions tab ... with author and time' ; 2.16 'The previous value of a field is not kept'", - "openproject": "corpus: openproject/round4/M1-column.md 10.9 'the Activity tab, rendering journals with ten detail kinds and 14 typed causes'", + "openproject": "corpus: openproject/round4/M1-column.md 10.9 'the Activity tab, rendering journals with ten detail kinds and 14 typed causes' ; source read at v17.8.0: app/components/work_packages/activities_tab/journals/item_component.html.erb:2-7 one entry per journal with its changes; app/components/work_packages/activities_tab/journals/filter_and_sorting_component.rb filter to changes only; app/services/journals/create_service.rb:45 journals written on every save", "jira": "corpus: jira-data-center/round4/M1-column.md 10.9 'The History tab of an issue records ... changes to an issue field'", "plane": "corpus: plane/round4/M1-column.md 10.9 'the activity feed on the work item, from IssueActivity with actor, verb, field, old and new value'" }, @@ -1702,9 +1745,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.10 'No sub-cards and no hierarchy; a checklist in the description is the nearest child'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.10 'No sub-cards and no hierarchy; a checklist in the description is the nearest child' ; source read at v1.19.0: lib/Db/Card.php:73-96 no parent field; searched lib/Db and src/ for 'subtask', 'parentId', 'parent_id', 'childCard': only src/services/CommentApi.js:27 (comment replies); the nearest child is the markdown checklist, src/components/cards/CardBadges.vue:23-25", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a sub-task' ; M1-column.md 3.3 'subtasks ... with a status of todo, in progress or done, an assignee and a time estimate'", - "openproject": "corpus: openproject/round4/M1-column.md 2.10 'hierarchy is a separate closure table, WorkPackageHierarchy'", + "openproject": "corpus: openproject/round4/M1-column.md 2.10 'hierarchy is a separate closure table, WorkPackageHierarchy' ; source read at v17.8.0: config/locales/js-en.yml:790 'Add child', :792 'Create new child'; app/contracts/work_packages/base_contract.rb:91 parent_id; app/models/work_package.rb:179 has_closure_tree; app/controllers/work_package_hierarchy_relations_controller.rb", "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'Sub-tasks are generally used to split up a parent issue into a number of tasks' (one level only)", "plane": "corpus: plane/round4/code-census.md §2 'Issue.parent gives sub-issues; the endpoint is apps/api/plane/app/urls/issue.py:105'" }, @@ -1734,9 +1777,9 @@ "kanboard": "yes", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.3 'a markdown task list in the description renders as checkboxes with a progress badge on the card ... Verified live: card 22'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.3 'a markdown task list in the description renders as checkboxes with a progress badge on the card ... Verified live: card 22' ; source read at v1.19.0: src/components/card/Description.vue:70 and :85 markdown-it-task-checkbox renders '- [ ]' items as clickable checkboxes; src/components/cards/CardBadges.vue:23-25 'Todo items' badge with checked/total, :75-78 counts; stored in the card description, lib/Db/Card.php:74", "kanboard": "corpus: kanboard/round4/M1-column.md 3.3 'subtasks are a checklist on a task' ; source: app/Template/board/task_footer.php:98-99 completion percentage on the card", - "openproject": "corpus: openproject/round4/M1-column.md 3.3 'ls app/models | grep -i checklist returns nothing. Nearest is a child work package per item'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): the bundled CKEditor (frontend/src/vendor/ckeditor/ckeditor.js) carries todoList and todoListChecked, so a description can hold ticked checkboxes as text (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/M1-column.md 3.3 'ls app/models | grep -i checklist returns nothing. Nearest is a child work package per item'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): the bundled CKEditor (frontend/src/vendor/ckeditor/ckeditor.js) carries todoList and todoListChecked, so a description can hold ticked checkboxes as text (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM 'tasklist' extension and lib/open_project/text_formatting/filters/task_list_filter.rb:31 render ticked boxes in a description; searched app/models for 'checklist': none, so no checklist object with progress", "jira": "corpus: jira-data-center/round4/M1-column.md 3.3 'no checklist object ... JRASERVER-47605 (To-do lists (checkbox) for description field on tickets), Gathering Interest, 1028 votes'; checklists are Marketplace apps", "plane": "corpus: plane/round4/code-census.md §3 'No checklist model. Sub-tasks are ordinary issues with parent set'" }, @@ -1763,9 +1806,9 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'recurr|repeat' 0 hits ; M1-column.md 1.8 'no'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'recurr|repeat' 0 hits ; M1-column.md 1.8 'no' ; source read at v1.19.0: searched lib/ and src/ for 'recurr', 'repeat', 'rrule': only CSS background-repeat, src/components/cards/CardCover.vue:86, and SVG animation; lib/Db/Card.php:73-96 no schedule field", "kanboard": "corpus: kanboard/round4/M1-column.md 1.8 'recurrence_* ... RecurringTaskSubscriber clones it on close ... Verified live' ; journeys.md 3", - "openproject": "corpus: openproject/round4/M1-column.md 1.8 'grep -rn recurring.*work_package ... returns nothing. Recurrence exists only for meetings'", + "openproject": "corpus: openproject/round4/M1-column.md 1.8 'grep -rn recurring.*work_package ... returns nothing. Recurrence exists only for meetings' ; source read at v17.8.0: searched app/models and app/services for 'recurr': only meetings, app/models/project.rb:108 recurring_meetings and modules/meeting/app/models/recurring_meeting.rb:31; nothing for work packages", "jira": "corpus: jira-data-center/round4/M1-column.md 1.8 Automation 'scheduled trigger' with actions 'creating sub-tasks' and creating issues (rated yes there for planned cases); a rule an admin writes, not a repeat setting on the task", "plane": "corpus: plane/round4/code-census.md §1 'Recurring issues: absent', grep recurring returns one celery comment ; source: grep -rli recurr apps/web/core hits only license/modal upsell files" }, @@ -1792,9 +1835,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'cards with a title, a markdown description' ; menu-tree.md 'the markdown description with checkboxes'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'cards with a title, a markdown description' ; menu-tree.md 'the markdown description with checkboxes' ; source read at v1.19.0: src/components/card/Description.vue:47-53 VueEasymde markdown editor, :69-87 markdown-it renders headings, lists, task checkboxes and links, :120 uses the Text app editor when installed, :45 'Write a description …'; lib/Db/Card.php:74 description", "kanboard": "source: app/Helper/TextHelper.php:5,43 Markdown transformation of descriptions and comments ; corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/wysiwyg/README.md:27 'The CKEditor5 build in OpenProject supports basic text styles, such as bold and italic formatting, headings' and :63 Markdown '#, ##, ###' (GFM tables :50) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/wysiwyg/README.md:27 'The CKEditor5 build in OpenProject supports basic text styles, such as bold and italic formatting, headings' and :63 Markdown '#, ##, ###' (GFM tables :50) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts the CKEditor 5 field on descriptions and comments; lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM with table, autolink and tasklist, so text is stored as Markdown", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html Visual mode 'gives you a What You See Is What You Get (WYSIWYG) experience' and 'you can still enter wiki markup syntax'", "plane": "corpus: plane/round4/code-census.md §2 description_json / description_html; usability.md driven editor ; source: packages/editor rich text editor with markdown copy (i18n 'Copy markdown')" }, @@ -1821,9 +1864,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Comments (the platform's comments with mentions)' ; code-census.md notification kinds 'card-comment-mentioned'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Comments (the platform's comments with mentions)' ; code-census.md notification kinds 'card-comment-mentioned' ; source read at v1.19.0: src/components/card/CommentForm.vue:8-12 NcRichContenteditable with member autocomplete at :81-82; lib/Listeners/CommentEventListener.php:65 calls lib/Notification/NotificationHelper.php:178-204 sendMention, notifying each mentioned board member", "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies (comment.user.mention, UserMentionJob)'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'you will be notified about important changes ... new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'you will be notified about important changes ... new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/notifications/create_from_model_service.rb:33 parses '' and :41 group mentions from the saved text; app/models/notification.rb:33 reason 'mentioned'; frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts sets up the editor that inserts the mention", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html notification types include 'mentions'; @mention in comments generates an email to the mentioned user (Configuring email notifications, corpus: jira-data-center/round4/M1-column.md 6.8)", "plane": "corpus: plane/round4/code-census.md §6 'IssueMention (issue.py:323)' and UserNotificationPreference 'mention' boolean ; source: apps/api/plane/bgtasks/notification_task.py:84-111 mentions become subscribers and are notified" }, @@ -1854,9 +1897,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.13 'card#reorder moves a card to another stack or board; the UI offers Move card'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.13 'card#reorder moves a card to another stack or board; the UI offers Move card' ; source read at v1.19.0: src/components/cards/CardMenuEntries.vue:57 'Move/copy card'; src/CardMoveDialog.vue:9 'Select a board', :18 'Select a list', :26 'Move card', :104-107 moveCard; lib/Service/CardService.php:436-440 reorder to a stack on another board after edit checks on both", "kanboard": "corpus: kanboard/round4/menu-tree.md task actions 'Move to project' ; 'Duplicate to project'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/work-packages/duplicate-move-delete/README.md:5 'How to duplicate, move to another project or delete a work package'; corpus: openproject/round4/M1-column.md 2.6 bulk move (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/work-packages/duplicate-move-delete/README.md:5 'How to duplicate, move to another project or delete a work package'; corpus: openproject/round4/M1-column.md 2.6 bulk move (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts:66-68 'Move' action; config/routes.rb:1016-1021 work package move routes; app/controllers/work_packages/moves_controller.rb:47 create, :143-144 target project must be allowed_target_projects_on_move", "jira": "corpus: jira-data-center/round4/M1-column.md 2.13 'The Move issue wizard allows you to choose any other project in your Jira instance to move your selected issue to'", "plane": "source: apps/api/plane/app/serializers/issue.py:100 project_id read_only=True; apps/web/core/components/issues/issue-modal/form.tsx:368 project select disabled={!!data?.id || !!data?.sourceIssueId}; 'move_to_project' exists only for workspace drafts (workspace-draft/draft-issue-block.tsx:83)" }, @@ -1883,9 +1926,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "the only card-to-card link is a dependency (corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 2.26 'one typed link, card dependencies ... No declared types beyond it'); a card link pasted in a description renders through the reference provider (code-census.md 'reference (4)')", + "nextcloud-deck": "the only card-to-card link is a dependency (corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 2.26 'one typed link, card dependencies ... No declared types beyond it'); a card link pasted in a description renders through the reference provider (code-census.md 'reference (4)') ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards' is the only typed card link; src/components/card/CardSidebarTabDetails.vue:34-38 NcCollectionList relates a card to other resources but only when the platform projects feature is on (:92 projects_enabled); lib/AppInfo/Application.php:45 CardReferenceProvider previews a pasted card link", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 2.26 'links holds label pairs with opposite_id (11 shipped: relates to, blocks / is blocked by ...)'", - "openproject": "corpus: openproject/round4/M1-column.md 2.10 'Relations are app/models/relation.rb:31 with eleven typed entries' (relates to among them)", + "openproject": "corpus: openproject/round4/M1-column.md 2.10 'Relations are app/models/relation.rb:31 with eleven typed entries' (relates to among them) ; source read at v17.8.0: app/models/relation.rb:35 TYPE_RELATES and :55-57 'related to' among the typed relations, non-scheduling; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; config/locales/en.yml:3609 'related to'", "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may relate to another. An issue may duplicate another. An issue may block another'", "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices 'duplicate, relates_to, blocked_by, ...'" }, @@ -1917,9 +1960,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.5 'no mail intake: grep imap|mailbox|message_id lib returns 0 hits'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.5 'no mail intake: grep imap|mailbox|message_id lib returns 0 hits' ; source read at v1.19.0: searched lib/ for 'imap', 'mailbox', 'message_id', 'IMailer': only mail wording in lib/Activity/SettingBase.php, lib/Activity/SettingChanges.php and lib/Service/AttachmentService.php, no mail intake; appinfo/routes.php:47 cards are created only through the web and API routes", "kanboard": "corpus: kanboard/round4/M1-column.md 1.5 'no' ; open-core.md 'Mailgun, Postmark, Sendgrid | 1.5, mail in | nothing' (third-party plugins only)", - "openproject": "corpus: openproject/round4/M1-column.md 1.5 'the work package handler creates at handlers/work_package.rb:73 ... Transports are IMAP, POP3 and Gmail'", + "openproject": "corpus: openproject/round4/M1-column.md 1.5 'the work package handler creates at handlers/work_package.rb:73 ... Transports are IMAP, POP3 and Gmail' ; source read at v17.8.0: app/services/incoming_emails/handlers/work_package.rb:56 default creates a new work package, :73-76 receive_new_work_package; config/initializers/menus.rb:595 admin 'Incoming emails' settings", "jira": "corpus: jira-data-center/round4/M1-column.md 1.5 'Jira can receive emails from licensed users to create issues or add comments'", "plane": "corpus: plane/round4/code-census.md §1 'Email intake: absent', grep email.?intake|mailbox|imap 0 hits; SourceType has one value IN_APP" }, @@ -1946,9 +1989,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source: grep -rniF 'backlog' lib returns 0 hits", + "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source: grep -rniF 'backlog' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'backlog': none; lib/Db/Card.php:77 every card belongs to a stack, so every card sits on the board; src/router.js:79 a board is the only card container", "kanboard": "source: app/Model/BoardModel.php:23 default columns 'Backlog', 'Ready', 'Work in progress', 'Done' : the backlog is the first column on the board, not a separate list ; corpus: kanboard/round4/journeys.md 5 column restriction 'Backlog'", - "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:14 'record and prioritize work packages in sprints and the backlog' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:14 'record and prioritize work packages in sprints and the backlog' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:65 project backlog page and :73 backlog buckets; modules/backlogs/app/components/backlogs/inbox_component.rb:32 'Backlog inbox', modules/backlogs/config/locales/en.yml:53, of unplanned work packages; modules/backlogs/app/controllers/backlogs/backlog_controller.rb:40 show", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'The Kanban backlog shows issues in both Backlog and Selected for Development sections' and team members can 'focus on your work-in-progress on the Kanban board, without the distraction of items in planning'", "plane": "corpus: plane/round4/code-census.md §2 state groups 'backlog, unstarted, started, completed, cancelled, triage'; the backlog is a state group shown as board columns unless filtered out, not a separate list apart from the board. Intake (off by default) is a triage queue, not a backlog (menu-tree.md)" }, @@ -1975,9 +2018,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board'", + "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source read at v1.19.0: no backlog to move from: searched lib/ and src/ for 'backlog': none; lib/Db/Card.php:77 a card always carries a stackId, so it is on the board from creation", "kanboard": "moving a task out of the Backlog column is a column move (corpus: kanboard/round4/journeys.md 1 moveTaskPosition); no separate backlog to plan from", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:234 'Your sprint is set in motion by clicking the Start sprint button ... it will open the sprint board'; basic boards add an existing work package as a card (agile-boards README:139) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:234 'Your sprint is set in motion by clicking the Start sprint button ... it will open the sprint board'; basic boards add an existing work package as a card (agile-boards README:139) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:105-107 move and move_to_sprint_dialog; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:71 move to sprint, :97-103 move via Backlogs::WorkPackages::UpdateService; modules/backlogs/app/services/backlogs/sprints/start_service.rb:66 starting the sprint builds its board, which shows the moved work package", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board'", "plane": "corpus: plane/round4/code-census.md §2 State group; moving a work item from a backlog-group state to an unstarted or started state is an ordinary state change (drag or state menu)" }, @@ -2004,9 +2047,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; the board filter (menu-tree.md) filters columns, there is no backlog list", + "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; the board filter (menu-tree.md) filters columns, there is no backlog list ; source read at v1.19.0: no backlog list: searched lib/ and src/ for 'backlog': none; the only filter is the board filter in src/components/Controls.vue:65-72, which filters the columns, and searched Controls.vue for 'sort': only the label list at :394", "kanboard": "corpus: kanboard/round4/menu-tree.md 'List' view with the filter dropdown and query language (usability.md 'runs the board, the list, the saved filters'), sortable; not a backlog of its own", - "openproject": "docs: opf/openproject v17.8.0 docs/user-guide/backlogs-scrum/README.md:103 'The all backlog buckets button is a multi-select dropdown that allows you to filter for buckets within your backlog' and :239 all sprints filter, so released 17.8 filters containers, not the work packages in them; work package filters for backlogs arrive in 17.9.0 (docs/release-notes/17-9-0 release_date 2026-09-30, not yet released on 2026-09-26, present only in the 18.0-dev tree); ordering is by drag (round-4 drive on 16.6.10)", + "openproject": "docs: opf/openproject v17.8.0 docs/user-guide/backlogs-scrum/README.md:103 'The all backlog buckets button is a multi-select dropdown that allows you to filter for buckets within your backlog' and :239 all sprints filter, so released 17.8 filters containers, not the work packages in them; work package filters for backlogs arrive in 17.9.0 (docs/release-notes/17-9-0 release_date 2026-09-30, not yet released on 2026-09-26, present only in the 18.0-dev tree); ordering is by drag (round-4 drive on 16.6.10) ; source read at v17.8.0: modules/backlogs/app/controllers/backlogs/backlog_filters.rb:32-39 the backlog filter holds only bucket_ids, sprint_ids and show_all; modules/backlogs/app/components/backlogs/backlog_filter_select_panel_component.rb:60 buckets plus inbox picker; order is the dragged position only, modules/backlogs/app/models/sprint.rb:97 order_by_position", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters apply on 'a Scrum board or Kanban board' including its backlog; order is Rank (docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'the issues you're creating and ranking for your team')", "plane": "corpus: plane/round4/code-census.md §9 IssueView filters and display_filters ; usability.md 'Layouts, filtering ... are all good'" }, @@ -2033,9 +2076,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board'", + "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source read at v1.19.0: no backlog to rank: searched lib/ and src/ for 'backlog': none; ordering exists only inside a board list, lib/Service/CardService.php:436 reorder", "kanboard": "tasks are ordered by drag within the Backlog column (corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position); no ranked backlog list", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:170 'You can prioritize work packages within the Inbox backlog, a backlog bucket, or a sprint by dragging and dropping them' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:170 'You can prioritize work packages within the Inbox backlog, a backlog bucket, or a sprint by dragging and dropping them' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/app/components/backlogs/work_package_card_list_component.rb:41-59 drag_and_drop on the card list; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:97-110 move stores the new position, same-list moves reorder", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'an optimized list view of the issues you're creating and ranking for your team'", "plane": "corpus: plane/round4/code-census.md §2 Issue 'sort_order float (:158)'; list and board support manual drag ordering (kanban/block.tsx:206 draggable)" }, @@ -2062,9 +2105,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "source: grep -rniF 'sprint' lib returns 0 hits ; corpus: nextcloud-deck/round4/usability.md no iteration object", + "nextcloud-deck": "source: grep -rniF 'sprint' lib returns 0 hits ; corpus: nextcloud-deck/round4/usability.md no iteration object ; source read at v1.19.0: searched lib/, src/ and appinfo/ for 'sprint', 'iteration': only sprintf in lib/Service/BoardService.php:242; lib/Db has Board, Stack, Card, Label, Acl, Assignment, Attachment, Session and no iteration entity", "kanboard": "source: grep -rniF 'sprint' app --include=*.php outside Locale returns no sprint model ; corpus: kanboard/round4/code-census.md objects table has no iteration", - "openproject": "corpus: openproject/round4/menu-tree.md 'Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:59 'Each sprint is displayed in a dedicated container showing ... start and end dates'; multiple active sprints are Enterprise gated (open-core.md multiple_active_sprints) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md 'Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:59 'Each sprint is displayed in a dedicated container showing ... start and end dates'; multiple active sprints are Enterprise gated (open-core.md multiple_active_sprints) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:84-94 sprints with new, start, finish; modules/backlogs/app/models/sprint.rb:75-77 start_date and finish_date required when active, finish after start; modules/backlogs/app/contracts/backlogs/projects/backlog_settings_contract.rb:96 several active sprints need the :multiple_active_sprints token", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/estimate-in-story-points-938845204.html 'Velocity is then worked out based on how many points the team can complete in each sprint'; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Sprint Report'", "plane": "corpus: plane/round4/menu-tree.md 'Cycles time boxes, off by default' ; code-census.md §3 'Cycle is a time box: start_date and end_date'" }, @@ -2091,9 +2134,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "no sprints (bkl-sprints)", + "nextcloud-deck": "no sprints (bkl-sprints) ; source read at v1.19.0: no sprints, see bkl-sprints: searched lib/ and src/ for 'sprint', 'iteration': none beyond lib/Service/BoardService.php:242 sprintf", "kanboard": "no sprints (bkl-sprints)", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:265 'Sprint board' among the sprint menu items; :234 'Clicking it will open the sprint board' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:265 'Sprint board' among the sprint menu items; :234 'Clicking it will open the sprint board' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/locales/en.yml:179 'Sprint board'; modules/backlogs/config/routes.rb:112 sprint taskboard; modules/backlogs/app/controllers/backlogs/taskboard_controller.rb:35-38 redirects to the sprint's board; modules/boards/app/services/boards/sprint_task_board_create_service.rb:65-76 one list per status of the sprint's work", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards in your Backlog and Active sprints' (the Active sprints board is the current sprint); docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart: Tracks the total work remaining' per sprint", "plane": "corpus: plane/round4/code-census.md §3 CycleIssue membership ; source: apps/web/core/components/issues/issue-layouts/roots/cycle-layout-root.tsx renders the cycle's items in the same layouts, board included. The cross-project 'Active Cycles' page is an upsell (open-core.md shims table, active-cycles/page.tsx:13)" }, @@ -2120,9 +2163,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "no sprints and no points ; corpus: nextcloud-deck/round4/M1-column.md 10.1 'no' KPI dashboards", + "nextcloud-deck": "no sprints and no points ; corpus: nextcloud-deck/round4/M1-column.md 10.1 'no' KPI dashboards ; source read at v1.19.0: searched lib/ and src/ for 'velocity', 'story point', 'estimate': only lib/UserMigration/DeckMigrator.php:64 getEstimatedExportSize; lib/Db/Card.php:73-96 no points or estimate field", "kanboard": "no sprints; corpus: kanboard/round4/menu-tree.md Analytics lists 'Task distribution · User repartition · Cumulative flow diagram · Burndown chart · Average time into each column · Lead and cycle time · Estimated vs actual time', no velocity", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'velocity' modules/backlogs returns only spec files; the backlogs-scrum README documents burndown and sprint board, no velocity chart", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'velocity' modules/backlogs returns only spec files; the backlogs-scrum README documents burndown and sprint board, no velocity chart ; source read at v17.8.0: modules/backlogs/app/components/backlogs/sprint_component.html.erb:63-64 a 'velocity' CSS class holds only the current sprint's story point total; modules/backlogs/app/components/backlogs/sprint_reports/widgets has burndown_chart and goal only; searched modules/backlogs non-spec code for 'velocity': no chart over past sprints", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Velocity Chart: Tracks the amount of work completed from sprint to sprint'", "plane": "source: grep -rli velocity apps/web/core apps/api packages/constants hits only apps/api/plane/settings/openapi.py prose; no velocity chart across cycles. Corpus silent" }, @@ -2149,9 +2192,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no' process analytics ; no chart in the app (menu-tree.md)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no' process analytics ; no chart in the app (menu-tree.md) ; source read at v1.19.0: searched lib/ and src/ for 'burndown', 'burnup', 'chart': no chart component; the only chart-like view is the Gantt, src/components/board/GanttView.vue:63 frappe-gantt, which plots dates, not remaining work", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Burndown chart' : a project burndown over the complexity score by date range, not bound to a sprint", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:266 'Burndown chart'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/backlogs/app/models/burndown.rb (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:266 'Burndown chart'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/backlogs/app/models/burndown.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:113 sprint burndown_chart; modules/backlogs/app/controllers/backlogs/burndown_chart_controller.rb:35 show; modules/backlogs/app/models/burndown.rb:31-32 Burndown built per sprint; modules/backlogs/config/locales/en.yml:144-147 burndown chart page strings", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart', 'Burnup Chart', 'Release Burndown', 'Epic Burndown'", "plane": "source: apps/web/core/components/cycles/analytics-sidebar/sidebar-chart.tsx:15 ProgressChart and apps/web/core/components/core/sidebar/progress-chart.tsx:23-45 'current' versus 'ideal' series, i18n 'Burndown chart' ; corpus: plane/round4/code-census.md §3 Cycle.progress_snapshot. Burndown comparison across cycles is the Active Cycles upsell" }, @@ -2178,9 +2221,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "source: grep -rniE 'milestone|release|version' lib/Db returns no version object ; corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones", + "nextcloud-deck": "source: grep -rniE 'milestone|release|version' lib/Db returns no version object ; corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones ; source read at v1.19.0: searched lib/ and src/ for 'milestone', 'release', 'fixVersion': no version object; lib/Db/Card.php:73-96 and lib/Db/Board.php carry no release field", "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' : a task can be linked to a milestone task; no version or release object", - "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Versions'; corpus: openproject/round4/M1-column.md 9.1 and 11.10 version custom field; docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Product roadmap release planning' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Versions'; corpus: openproject/round4/M1-column.md 9.1 and 11.10 version custom field; docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Product roadmap release planning' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:478 project versions new, create; app/models/work_package_version.rb:31-35 a work package links to versions with kind target, several target versions allowed since 17.8; config/initializers/menus.rb:793 project settings 'Versions'", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report', 'Release Burndown'; docs: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'a release can start Relative to previous release date' (corpus 8.8)", "plane": "corpus: plane/round4/code-census.md §3 'Module is a scope grouping: start_date / target_date, status from ModuleStatus ... Membership is ModuleIssue'; no version object as such, a module with a target date stands in for a release" }, @@ -2207,9 +2250,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "no epics or versions over time ; corpus: nextcloud-deck/round4/menu-tree.md five navigation entries, none a roadmap", + "nextcloud-deck": "no epics or versions over time ; corpus: nextcloud-deck/round4/menu-tree.md five navigation entries, none a roadmap ; source read at v1.19.0: searched lib/ and src/ for 'roadmap', 'milestone': none, and 'epic' hits only NcDateTimePickerNative and getFilePickerBuilder, e.g. src/components/card/DueDateSelector.vue:10; src/router.js:29-153 has no roadmap route", "kanboard": "corpus: kanboard/round4/menu-tree.md project menu has no roadmap or timeline; the Gantt is not in core (code-census.md objects table)", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Find out about the Product Roadmap and Release planning in OpenProject'; corpus: openproject/round4/menu-tree.md global 'Gantt charts' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Find out about the Product Roadmap and Release planning in OpenProject'; corpus: openproject/round4/menu-tree.md global 'Gantt charts' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:713-716 project 'Roadmap' menu when versions exist; config/routes.rb:484-487 /roadmap is versions#index; app/controllers/versions_controller.rb:39 index lists versions with their work packages and progress", "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 Releases in Advanced Roadmaps and 3.14 'Modify a view in Advanced Roadmaps'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (timeline of epics and releases, Advanced Roadmaps bundled in the Jira Software DC documentation set)", "plane": "source: apps/web/core/components/modules/modules-list-view.tsx:52 and modules/gantt-chart/modules-list-layout.tsx draw a project's modules on a timeline; epics are unreachable (corpus: plane/round4/journeys.md) and there is no cross-project roadmap" }, @@ -2236,9 +2279,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "source: src/components/Controls.vue:236-237 'Gantt view' view mode beside 'Kanban view', src/components/board/Board.vue:49 GanttView, src/components/board/GanttView.vue:63 frappe-gantt over start and due dates (tag v1.18.4). The round-4 menu-tree.md lists 'the view modes (board and list)' and missed the Gantt mode", + "nextcloud-deck": "source: src/components/Controls.vue:236-237 'Gantt view' view mode beside 'Kanban view', src/components/board/Board.vue:49 GanttView, src/components/board/GanttView.vue:63 frappe-gantt over start and due dates (tag v1.18.4). The round-4 menu-tree.md lists 'the view modes (board and list)' and missed the Gantt mode ; source read at v1.19.0: src/components/Controls.vue:242 'Kanban view' and :244-249 'Gantt view' toggle; src/components/board/Board.vue:49 mounts GanttView; src/components/board/GanttView.vue:63 frappe-gantt, :196-198 Days, Weeks, Months zoom, :303-328 bars from card start and due dates", "kanboard": "source: the only 'gantt' in app/ is a comment in app/Analytic/AverageLeadCycleTimeAnalytic.php:91; the Gantt is a plugin ; corpus: kanboard/round4/menu-tree.md 'Overview · Board · List'", - "openproject": "corpus: openproject/round4/menu-tree.md global 'Gantt charts' and project work package 'Gantt' view", + "openproject": "corpus: openproject/round4/menu-tree.md global 'Gantt charts' and project work package 'Gantt' view ; source read at v17.8.0: modules/gantt/config/routes.rb:3-10 project and global Gantt; modules/gantt/lib/open_project/gantt/engine.rb:41 gantt project module; frontend/src/app/features/work-packages/components/wp-table/timeline/wp-timeline.ts the timeline beside the table", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (Advanced Roadmaps timeline); corpus: jira-data-center/round4/M1-column.md 8.3 plans schedule on target start and end dates", "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in ... gantt layout'" }, @@ -2266,9 +2309,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'dependent cards' ; _round4/compare/promoted-rows-batch6.md 2.26 'card dependencies (card_api#assignDependentCard, appinfo/routes.php:111, table oc_deck_dependent_cards)'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'dependent cards' ; _round4/compare/promoted-rows-batch6.md 2.26 'card dependencies (card_api#assignDependentCard, appinfo/routes.php:111, table oc_deck_dependent_cards)' ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards', :56 'Add dependent card', mounted at src/components/card/CardSidebarTabDetails.vue:29-32; lib/Controller/CardController.php:136 assignDependentCard, lib/Service/CardService.php:688, lib/Db/CardMapper.php:673 table deck_dependent_cards", "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskLink(3, 2, link 2 \"blocks\") and getAllTaskLinks(2) returned the same link as \"is blocked by\" from the other side'", - "openproject": "corpus: openproject/round4/M1-column.md 2.10 relation.rb eleven typed entries; 8.9 'a follows relation with lag ... moves a successor'; blocks/blocked by among them", + "openproject": "corpus: openproject/round4/M1-column.md 2.10 relation.rb eleven typed entries; 8.9 'a follows relation with lag ... moves a successor'; blocks/blocked by among them ; source read at v17.8.0: app/models/relation.rb:36-39 precedes, follows, blocks, blocked types; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; app/contracts/relations/base_contract.rb:39-43 relation validation", "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may block another' (Linking issues); docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (corpus 8.8)", "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices includes blocked_by with pair 'blocking' (issue.py:272-290)" }, @@ -2300,9 +2343,9 @@ "kanboard": "partial", "jira": "no", "evidence": { - "nextcloud-deck": "source: lib/Db/CardMapper.php:674 addDependency skips a duplicate (hasDependency); lib/Service/CardService.php:688-707 checks permissions and archive state only, so a self or circular dependency is not refused", + "nextcloud-deck": "source: lib/Db/CardMapper.php:674 addDependency skips a duplicate (hasDependency); lib/Service/CardService.php:688-707 checks permissions and archive state only, so a self or circular dependency is not refused ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:152-154 the picker leaves out the card itself, cards already linked and cards of other boards; lib/Db/CardMapper.php:673-676 server skips a duplicate; lib/Service/CardService.php:688-702 checks permission and archive state only, searched it for 'cycle', 'circular': none, so a loop A to B to A is accepted", "kanboard": "source: app/Validator/TaskLinkValidator.php:29 'A task cannot be linked to itself'; no duplicate or cycle check in the validator ; corpus: kanboard/round4/journeys.md 4", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/en.yml:555 'circular_dependency: This relation would create a circular dependency.' and :851 'The relationship creates a circle of relationships'; corpus: openproject/round4/M1-column.md 2.10 relations normalised by 'before_validation :reverse_if_needed' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/en.yml:555 'circular_dependency: This relation would create a circular dependency.' and :851 'The relationship creates a circle of relationships'; corpus: openproject/round4/M1-column.md 2.10 relations normalised by 'before_validation :reverse_if_needed' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/relations/base_contract.rb:67-68 adds 'circular_dependency' when :99-100 the target is not in WorkPackage.relatable; app/models/work_packages/scopes/relatable.rb:178 relatable excludes cycles; app/models/relation.rb:137 uniqueness of to per from blocks duplicates; config/locales/en.yml:505 'This relation would create a circular dependency.'", "jira": "docs: https://jira.atlassian.com/browse/JRA-10068 'Posibility of creation circular references', Closed, Won't Fix: 'It is posible to create circular dependancies or duplicates on issues'; Advanced Roadmaps only flags the conflict (docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'The badges on either end will turn red if there are conflicting dates')", "plane": "source: apps/api/plane/db/models/issue.py:306-312 UniqueConstraint on (issue, related_issue) blocks duplicates, and apps/api/plane/app/views/issue/relation.py:229-245 bulk_create(ignore_conflicts=True) drops them silently; no self or circular check in relation.py create. Corpus silent" }, @@ -2333,9 +2376,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "source: src/components/cards/CardBadges.vue shows no dependency badge; src/components/card/DependentCardsSelector.vue lists dependencies with their done state inside the card only", + "nextcloud-deck": "source: src/components/cards/CardBadges.vue shows no dependency badge; src/components/card/DependentCardsSelector.vue lists dependencies with their done state inside the card only ; source read at v1.19.0: searched src/components/cards/CardBadges.vue and src/components/cards/CardItem.vue for 'depend', 'block': no badge on the board card; src/components/card/DependentCardsSelector.vue:13-32 lists each dependency with its done state, struck through when done, inside the card only", "kanboard": "source: app/Template/board/task_footer.php:89-90 a link count icon with a tooltip listing the links, not a blocked state ; corpus: kanboard/round4/journeys.md 4 search 'link:\"is blocked by\"' finds them", - "openproject": "relations are listed on the work package and drawn in the Gantt (corpus: openproject/round4/M1-column.md 2.10), but no card or list badge marks a task blocked by unfinished work; agile-boards README documents no blocked marker", + "openproject": "relations are listed on the work package and drawn in the Gantt (corpus: openproject/round4/M1-column.md 2.10), but no card or list badge marks a task blocked by unfinished work; agile-boards README documents no blocked marker ; source read at v17.8.0: app/models/queries/work_packages/filter/blocked_filter.rb:33 a list filter for 'blocked by' exists; frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html has no blocked marker (searched it for 'blocked', 'blocks': none); relations display in the table became Community in 17.8", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html numbered badges on the schedule bar that 'turn red if there are conflicting dates' (timeline only); on the board a blocked state is a manual flag or a query colour (https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per JQL query')", "plane": "source: grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits; ISSUE_DISPLAY_PROPERTIES (packages/constants/src/issue/common.ts) has no blocked property. Relations show only on the work item page" }, @@ -2367,9 +2410,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "source: src/components/board/GanttView.vue:297-325 cardToGanttTask passes id, name, start, end, progress and no dependencies to frappe-gantt, so dependent cards are not drawn", + "nextcloud-deck": "source: src/components/board/GanttView.vue:297-325 cardToGanttTask passes id, name, start, end, progress and no dependencies to frappe-gantt, so dependent cards are not drawn ; source read at v1.19.0: src/components/board/GanttView.vue:303-328 cardToGanttTask passes id, name, start, end, progress and class with no dependencies field; searched GanttView.vue for 'dependencies': none, so frappe-gantt draws no arrows", "kanboard": "no timeline in core (pln-gantt)", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'To add dependencies between work packages, you can set them as predecessor or successor in the Gantt chart' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'To add dependencies between work packages, you can set them as predecessor or successor in the Gantt chart' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive.ts:39-43 draws TimelineRelationElement lines from WorkPackageRelationsService; app/models/relation.rb:36-37 precedes and follows", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar based on dependency type'", "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx:26 declares enableDependency and the ChartDraggable body (:30-39) never destructures or uses it; no dependency path component in the tree. A hollow shim like those in corpus: plane/round4/open-core.md" }, @@ -2400,9 +2443,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'has reached its due date' : the ScheduledNotifications job notifies at the due date, not ahead of it ; _round4/compare/promoted-rows-batch6.md 8.14 'notifies once, marking notified'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'has reached its due date' : the ScheduledNotifications job notifies at the due date, not ahead of it ; _round4/compare/promoted-rows-batch6.md 8.14 'notifies once, marking notified' ; source read at v1.19.0: lib/Cron/ScheduledNotifications.php:33-39 notifies on cards from lib/Db/CardMapper.php:358-367 findOverdue, where duedate is before NOW(), once per card via notified; lib/Notification/NotificationHelper.php:88-95 subject 'card-overdue', so the notice comes when the due date passes, never ahead of it", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 8.14 'the daily cron fires task.overdue and mails the assignee' (after the date, not before) ; source: app/Console/TaskOverdueNotificationCommand.php:18-22", - "openproject": "corpus: openproject/round4/M1-column.md 8.6 'date alerts are exactly this feature and they are Enterprise gated ... both return early without the token'; 8.4 'app/models/reminder.rb:31' manual reminders are free", + "openproject": "corpus: openproject/round4/M1-column.md 8.6 'date alerts are exactly this feature and they are Enterprise gated ... both return early without the token'; 8.4 'app/models/reminder.rb:31' manual reminders are free ; source read at v17.8.0: app/workers/notifications/schedule_date_alerts_notifications_job.rb:38 and app/workers/notifications/create_date_alerts_notifications_job.rb:41 automatic due alerts return early without the :date_alerts token; app/models/reminder.rb:31 and config/routes.rb:1076-1077 manual per work package reminders are free", "jira": "corpus: jira-data-center/round4/M1-column.md 8.4 'a scheduled rule can send out a reminder to the assignee'; 8.6 'a filter subscription on duedate < now() mails on a schedule'; nothing fires before the due date without a rule", "plane": "corpus: plane/round4/journeys.md 'A due date that notifies nobody. target_date is a sortable, filterable column, and nothing in the scheduler reads it' ; code-census.md §8 'Reminder or due-date job: absent'" }, @@ -2430,9 +2473,9 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "source: lib/Cron/ScheduledNotifications.php:34 fires on due date; ConfigService reads calendar, trashRetentionHours and groupLimit only (corpus: nextcloud-deck/round4/open-core.md)", + "nextcloud-deck": "source: lib/Cron/ScheduledNotifications.php:34 fires on due date; ConfigService reads calendar, trashRetentionHours and groupLimit only (corpus: nextcloud-deck/round4/open-core.md) ; source read at v1.19.0: lib/Db/CardMapper.php:362 the only trigger is duedate < NOW(); lib/Service/ConfigService.php:77-256 app values are federationEnabled, calendar, cardIdBadge, groupLimit and trashRetentionHours, no reminder offset; searched lib/ for 'leadTime', 'reminder', 'before': none", "kanboard": "source: app/Console/TaskOverdueNotificationCommand.php options show, group, manager; no days-ahead setting ; corpus: kanboard/round4/code-census.md 90 config constants, none a lead time", - "openproject": "corpus: openproject/round4/M1-column.md 8.6 date alerts carry a per-user duration (code-census #7 'the contract rejects a write that sets a date alert duration' without the token): per user, not admin, and Enterprise gated", + "openproject": "corpus: openproject/round4/M1-column.md 8.6 date alerts carry a per-user duration (code-census #7 'the contract rejects a write that sets a date alert duration' without the token): per user, not admin, and Enterprise gated ; source read at v17.8.0: app/contracts/user_preferences/params_contract.rb:37 DATE_ALERT_DURATIONS nil, 0, 1, 3, 7 days chosen per user, and :34-35 enterprise_action :date_alerts on any write that sets them; app/components/my/notifications/show_page_component.html.erb:61-64 per user setting with Enterprise banner; searched app/views/admin and app/components/admin for a date alert lead time: none", "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 a rule writes '{{now.plusDays(3).toBusinessDay()}}'; an admin builds the lead time into a scheduled automation rule (8.4, 8.6); no setting", "plane": "corpus: plane/round4/code-census.md §8 'A due date in Plane CE never notifies anybody', so there is no lead time to set" }, @@ -2460,9 +2503,9 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'the notify-due choice per user' ; code-census.md 'notify-due per user per board' (lib/Notification/NotificationHelper.php:66)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'the notify-due choice per user' ; code-census.md 'notify-due per user per board' (lib/Notification/NotificationHelper.php:66) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:83 'Turn off due date reminders', :102-130 'Due date reminders' all, assigned or 'No notifications' per board; lib/Service/ConfigService.php:22-25 and :191 per-user notify-due values; lib/Notification/NotificationHelper.php:66-70 skips users set to off", "kanboard": "source: app/Template/user_view/notifications.php:9 notification_types checkboxes per user, with the assignee/creator filter (promoted-rows-batch7.md 13.18 'by the user's own filter')", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md in-app and email notification settings per user; the automatic due alerts to opt out of are Enterprise gated (corpus: openproject/round4/M1-column.md 8.6), so on the free build there is nothing automatic to turn off (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md in-app and email notification settings per user; the automatic due alerts to opt out of are Enterprise gated (corpus: openproject/round4/M1-column.md 8.6), so on the free build there is nothing automatic to turn off (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/my/notifications/show_page_component.html.erb:42 the date alert toggles render only when date_alerts_available?, else :64 an Enterprise banner; app/menus/notifications/menu.rb:142 same gate; general notification settings are free", "jira": "corpus: jira-data-center/round4/M1-column.md 8.6 filter subscriptions are created 'for yourself and/or other users'; a rule-sent reminder has no per-user opt-out documented", "plane": "corpus: plane/round4/code-census.md §8 no due reminder exists; UserNotificationPreference (notification.py:104-108) has property_change, state_change, comment, mention, issue_completed and nothing for due dates" }, @@ -2490,9 +2533,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "source: src/components/board/GanttView.vue:275 dragging a bar calls updateTaskDate, :373-377 dispatches updateCardDates with the new startdate and duedate ; not in the round-4 drive (menu-tree.md)", + "nextcloud-deck": "source: src/components/board/GanttView.vue:275 dragging a bar calls updateTaskDate, :373-377 dispatches updateCardDates with the new startdate and duedate ; not in the round-4 drive (menu-tree.md) ; source read at v1.19.0: src/components/board/GanttView.vue:369 bars editable when the user can edit, :371-372 on_date_change keeps the drag, :276-279 commits it through updateTaskDate, :379-384 dispatches updateCardDates with the new startdate and duedate; lib/Controller/CardController.php:67 update", "kanboard": "no timeline in core (pln-gantt)", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/README.md (gantt-chart.gif, create-new-element-gantt-chart.gif) drag bars to change dates; corpus: openproject/round4/journeys.md duration derivation on edit (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/README.md (gantt-chart.gif, create-new-element-gantt-chart.gif) drag bars to change dates; corpus: openproject/round4/journeys.md duration derivation on edit (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-mouse-handler.ts:63-97 mousedown on a bar starts a drag that shifts or resizes the dates; the change is saved through the work package update service", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'adjust the dates by clicking and dragging the ends of the schedule bar'", "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx LeftResizable, RightResizable and onMouseDown handleBlockDrag(e, \"move\"); chart/timeline-drag-helper.tsx ; corpus: plane/round4/menu-tree.md gantt layout" }, @@ -2520,9 +2563,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/pending-rows-batch6.md 3.21 'a dependent card is a link; nothing moves a date'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/pending-rows-batch6.md 3.21 'a dependent card is a link; nothing moves a date' ; source read at v1.19.0: lib/Service/CardService.php:688-702 adding a dependency stores a link and fires activity, no date is touched; src/components/board/GanttView.vue:379-384 a drag updates only the dragged card; searched lib/ for 'reschedule', 'shift' on dependent cards: none", "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 3.21 'a link moves no date: TaskLinkModel writes two rows and fires an event'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'there is an automatic scheduling mode and a manual scheduling mode (default) (new in release 15.4) ... determine how work packages behave when the dates of related work packages change'; corpus: openproject/round4/M1-column.md 8.9 set_schedule_service.rb (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'there is an automatic scheduling mode and a manual scheduling mode (default) (new in release 15.4) ... determine how work packages behave when the dates of related work packages change'; corpus: openproject/round4/M1-column.md 8.9 set_schedule_service.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/work_packages/date_picker/dialog_content_component.html.erb:10-16 manual or automatic scheduling in the date picker; app/contracts/work_packages/base_contract.rb:116 schedule_manually; app/services/work_packages/set_schedule_service.rb:31-41 reschedules followers when start or due date changes, called from app/services/work_packages/set_attributes_service.rb:322", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'The Auto-scheduler constructs a plan using issue details based on your plan settings', considering dependencies, capacity and estimates", "plane": "source: gantt-chart/blocks/block.tsx:32 updateBlockDates(IBlockUpdateDependencyData[]) is a seam, but dependency handling is dropped in draggable.tsx (see pln-deps-on-timeline) and relation.py create changes no dates; corpus: plane/round4/code-census.md §8 'No other module computes a date'" }, @@ -2549,9 +2592,9 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "source: grep -rniF 'critical' lib returns only the Trello importer; the Gantt (GanttView.vue) computes no path", + "nextcloud-deck": "source: grep -rniF 'critical' lib returns only the Trello importer; the Gantt (GanttView.vue) computes no path ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'critical': none; src/components/board/GanttView.vue:303-328 bars carry no dependency or slack data to compute a path", "kanboard": "no timeline in core ; source: grep -rniF 'critical path' app returns 0 hits", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'Is there a critical path feature? Unfortunately, we don't have the critical path feature yet'", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'Is there a critical path feature? Unfortunately, we don't have the critical path feature yet' ; source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml) for 'critical path', 'critical_path': none; docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'we don't have the critical path feature yet'", "jira": "docs: Advanced Roadmaps pages read (dependencies, auto-schedule, releases) name no critical path; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html lists the factors it schedules on and none is a critical path", "plane": "source: grep -rliE 'critical.?path' over apps and packages (*.ts, *.tsx, *.py, *.json) returns nothing; corpus: plane/round4/code-census.md §8 no date arithmetic beyond relative filters" }, @@ -2578,9 +2621,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones ; source read at v1.19.0: searched lib/ and src/ for 'milestone': none; src/components/board/GanttView.vue:303-328 every bar is a card with a start and end, no zero-length milestone marker", "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' ; 8.8 'no' milestones with planned intervals: a milestone is a linked task, not a timeline marker", - "openproject": "corpus: openproject/round4/M1-column.md 8.8 'milestone is a built-in type forced to duration 1 (app/services/work_packages/set_attributes_service.rb:367-368)'", + "openproject": "corpus: openproject/round4/M1-column.md 8.8 'milestone is a built-in type forced to duration 1 (app/services/work_packages/set_attributes_service.rb:367-368)' ; source read at v17.8.0: app/models/type.rb:285-286 is_milestone per type; app/models/work_package.rb:290-291 milestone?; app/services/work_packages/set_attributes_service.rb:87-93 unify milestone dates to one day; drawn as a diamond on the Gantt timeline", "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 'milestones are releases in a plan' (Releases in Advanced Roadmaps); no milestone item type", "plane": "source: i18n 'Milestones ... Enable milestones' strings (packages/i18n/src/locales/en) have no caller outside locales (grep milestones_description returns only locale files), so milestones are a closed-build feature; modules draw on the module timeline as dated bars (corpus: plane/round4/M1-column.md 8.8 'Cycle and Module carry start and end dates ... a milestone in the planning sense')" }, @@ -2607,9 +2650,9 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "no plan to baseline ; source: grep -rniF 'baseline' lib returns 0 hits", + "nextcloud-deck": "no plan to baseline ; source: grep -rniF 'baseline' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'baseline': only CSS var(--default-grid-baseline), e.g. src/components/Controls.vue:539; lib/Db/Card.php:90-91 one duedate and one startdate, no saved plan", "kanboard": "no plan to baseline ; source: grep -rniF 'baseline' app returns 0 hits", - "openproject": "corpus: openproject/round4/open-core.md baseline_comparison Enterprise gated; 'Timestamp.allowed ... otherwise selects only those that are one_day_ago? or newer', so the free build compares against yesterday at most", + "openproject": "corpus: openproject/round4/open-core.md baseline_comparison Enterprise gated; 'Timestamp.allowed ... otherwise selects only those that are one_day_ago? or newer', so the free build compares against yesterday at most ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-baseline/baseline the Baseline dropdown on the table; app/models/timestamp.rb:108-111 without the :baseline_comparison token only timestamps from yesterday onward are allowed, so the free build compares against yesterday at most", "jira": "corpus: jira-data-center/round4/M1-column.md 2.16 'No as-at view of the whole issue'; Advanced Roadmaps pages read have no baseline", "plane": "source: grep -rliE 'baseline' apps/api --include=*.py returns only two test docstrings (tests/contract/api/test_projects.py:109, test_workspace_user_preference_app.py:69), no baseline model; corpus: plane/round4/code-census.md §8 date fields list has no baseline" }, @@ -2636,9 +2679,9 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 8.11 'nothing knows a working day' and 8.12 'no calendar of holidays anywhere in Deck'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 8.11 'nothing knows a working day' and 8.12 'no calendar of holidays anywhere in Deck' ; source read at v1.19.0: searched lib/ and src/ for 'holiday', 'workday', 'working day': none; 'weekend' is only the due date quick pick at src/components/card/DueDateSelector.vue:178 and Gantt shading colours at src/components/board/GanttView.vue:530", "kanboard": "corpus: kanboard/round4/code-census.md empty grep 'working.?day|business.?day|holiday' ; promoted-rows-batch7.md 8.11 'and it was measured'", - "openproject": "corpus: openproject/round4/journeys.md 'The derived date cannot land on a weekend or an administered holiday: ... 0 non-working results in 1675 computations'; /admin/settings/working_days_and_hours", + "openproject": "corpus: openproject/round4/journeys.md 'The derived date cannot land on a weekend or an administered holiday: ... 0 non-working results in 1675 computations'; /admin/settings/working_days_and_hours ; source read at v17.8.0: config/routes.rb:885 admin working days and hours settings; app/models/non_working_day.rb holidays; app/services/work_packages/shared/days.rb:38 duration uses WorkingDays unless ignore_non_working_days", "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 'working days exist only for board reports (Configuring working days)' and the JQL clock counts calendar days; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html does not mention absences or non-working days", "plane": "corpus: plane/round4/code-census.md §8 'grep holiday|business_day|working_day|bizdays returns 0 hits'; 'A month is thirty days'" }, @@ -2666,9 +2709,9 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Calendar. With the bridge on, every board is a CalDAV calendar ... so the Calendar app and a phone show the deadlines. Verified live' : the calendar view is the platform Calendar app, not inside Deck", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Calendar. With the bridge on, every board is a CalDAV calendar ... so the Calendar app and a phone show the deadlines. Verified live' : the calendar view is the platform Calendar app, not inside Deck ; source read at v1.19.0: appinfo/info.xml:93 registers lib/DAV/CalendarPlugin.php, lib/DAV/Calendar.php:207 one VTODO calendar per board, lib/Db/Card.php:140 a card becomes a VTODO, shown by the platform Calendar app; src/components/DeckAppSettings.vue:22-23 'Show boards in calendar/tasks'; src/router.js:29-153 no calendar view inside Deck", "kanboard": "corpus: kanboard/round4/usability.md 'no calendar' ; menu-tree.md 'Overview · Board · List' (the calendar view is a plugin)", - "openproject": "corpus: openproject/round4/menu-tree.md project 'Calendars'; docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'How to create, use and subscribe to a calendar' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md project 'Calendars'; docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'How to create, use and subscribe to a calendar' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/calendar/config/routes.rb:2-6 project calendars; modules/calendar/lib/open_project/calendar/engine.rb:29 calendar_view module; frontend/src/app/features/calendar/calendar-entry.component.ts the calendar page", "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 'the Marketplace calendars (Event Calendar for Jira ...) display, they do not book': a calendar view is a Marketplace app; Team Calendars is a Confluence product", "plane": "corpus: plane/round4/menu-tree.md 'calendar ... layouts' ; code-census.md §12 'There is a calendar layout for issues in the web app'" }, @@ -2695,9 +2738,9 @@ "kanboard": "partial", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'every card with a due date a VTODO in it ... Verified live with a REPORT on the board's calendar' ; open-core.md caveat: API-set time zones republished as UTC", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'every card with a due date a VTODO in it ... Verified live with a REPORT on the board's calendar' ; open-core.md caveat: API-set time zones republished as UTC ; source read at v1.19.0: appinfo/info.xml:93 lib/DAV/CalendarPlugin.php platform CalDAV plugin; lib/DAV/Calendar.php:207 VTODO calendar per board; lib/Db/Card.php:138-160 DUE, DTSTART and STATUS from the card; lib/DAV/CalendarObject.php:58-59 objects are read-only to CalDAV clients; src/components/DeckAppSettings.vue:22-23 per-user switch", "kanboard": "corpus: kanboard/round4/journeys.md 6 'the iCal feed (text/calendar, one VEVENT per dated task)' behind a public token ; source: app/Template/user_view/share.php:9 per-user iCal feed : read-only subscription, not CalDAV", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'Subscribe to a calendar: OpenProject allows you to subscribe to and access any of your calendars using an external client that supports the iCalendar format'; corpus: openproject/round4/menu-tree.md admin 'Calendar subscriptions' (iCal feed, read-only, counts as the generic capability) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'Subscribe to a calendar: OpenProject allows you to subscribe to and access any of your calendars using an external client that supports the iCalendar format'; corpus: openproject/round4/menu-tree.md admin 'Calendar subscriptions' (iCal feed, read-only, counts as the generic capability) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/calendar/config/routes.rb:17 per calendar '/ical' feed; modules/calendar/app/controllers/calendar/ical_controller.rb:35 show; config/locales/js-en.yml:396 'use the URL (iCalendar) to subscribe to this calendar in an external client'; config/initializers/menus.rb:526-529 admin 'Calendar subscriptions'; a read-only iCal subscription, not two-way CalDAV", "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 dates on an issue are due dates; no iCal or CalDAV feed in the 983 pages the corpus read (1.9 integrations page covers Confluence only)", "plane": "corpus: plane/round4/code-census.md §12 'iCal / calendar feed: absent ... no feed a calendar client can subscribe to, and no CalDAV'" }, @@ -2724,9 +2767,9 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "source: src/components/board/Board.vue:49 the Gantt view is per board; nothing combines boards on one timeline (the platform Calendar shows several board calendars, menu-tree.md Calendar, which is not a timeline)", + "nextcloud-deck": "source: src/components/board/Board.vue:49 the Gantt view is per board; nothing combines boards on one timeline (the platform Calendar shows several board calendars, menu-tree.md Calendar, which is not a timeline) ; source read at v1.19.0: src/components/board/GanttView.vue:205-209 the timeline is built from this.stacks of the open board only; src/components/board/Board.vue:49 it is a view mode of one board; src/components/overview/Overview.vue:57-83 the cross-board view is due-date columns, not a timeline", "kanboard": "no timeline in core (pln-gantt)", - "openproject": "corpus: openproject/round4/menu-tree.md global module 'Gantt charts' across projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart OpenProject-overarching-project-planning.png (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md global module 'Gantt charts' across projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart OpenProject-overarching-project-planning.png (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/gantt/config/routes.rb:16-24 global Gantt outside any project; modules/gantt/lib/open_project/gantt/engine.rb:60 global menu item; app/components/projects/index_page_header_component.rb:64-66 'Open as Gantt' from the project list via app/services/projects/gantt_query_generator_service.rb", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; Advanced Roadmaps plans take several projects and boards as sources (corpus: jira-data-center/round4/M1-column.md 8.8 plan releases across a plan)", "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) layouts are spreadsheet and list only, no gantt; the gantt is per project. Corpus silent" }, @@ -2754,9 +2797,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md Analytics 'Estimated vs actual time'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md:6 'estimated time, remaining time, work'; corpus: openproject/round4/M1-column.md 3.15 derived progress values (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md:6 'estimated time, remaining time, work'; corpus: openproject/round4/M1-column.md 3.15 derived progress values (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:77 estimated_hours (Work), :80 derived_estimated_hours, :83 remaining_hours; app/models/work_package.rb:646 duration strings parsed on write; shown as Work and Remaining work on the work package", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'When work is first logged against the issue, the Time Spent is subtracted from the Original Estimate'", "plane": "source: packages/constants/src/estimates.ts:122-140 the 'time' (hours) estimate system is is_ee: true, and apps/web/core/components/estimates/create/helper.tsx:10-18 isEstimateSystemEnabled returns false for anything but POINTS and CATEGORIES; corpus: plane/round4/code-census.md §10 'Time tracking and worklogs: absent'. Time estimates are a paid-build feature, absent from Community" }, @@ -2783,9 +2826,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; lib/Db has no time entry entity", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Model/TaskCreationModel.php:67 time_spent on the task form, app/Model/SubtaskTimeTrackingModel.php:245 updateSubtaskTimeSpent", - "openproject": "corpus: openproject/round4/menu-tree.md project 'Time and costs'; docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md 'Log time'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/menu-tree.md project 'Time and costs'; docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md 'Log time'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/js-en.yml:168 'Log time'; modules/costs/app/components/time_entries/entry_dialog_component.rb the log time dialog; modules/costs/config/routes.rb:32 time_entries create, update, destroy; modules/costs/lib/costs/engine.rb:48-54 log_own_time and log_time permissions", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html work logs with 'Edit Own Work Logs' and 'Delete Own Work Logs' permissions", "plane": "corpus: plane/round4/code-census.md §10 'There is no worklog table, no timer, no duration field, no UI'; menu-tree.md 'no Time tracking'. 'Full Time Tracking' is a Pro string (open-core.md)" }, @@ -2812,9 +2855,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no duration field to type into: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; the only time inputs are date pickers, src/components/card/DueDateSelector.vue:10", "kanboard": "source: time fields are decimal hours rendered as '%sh spent' (app/Template/subtask/timer.php:3,9); no parsing of '1h 30m' found (grep -rniE '[0-9]h ?[0-9]+m' app/Core/DateParser.php returns nothing)", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/duration_converter.rb:147 'ChronicDuration.parse(duration_string' and modules/costs/app/helpers/costs/number_helper.rb:79 falls back to DurationConverter.parse for hours strings, so '1h 30m' parses (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/duration_converter.rb:147 'ChronicDuration.parse(duration_string' and modules/costs/app/helpers/costs/number_helper.rb:79 falls back to DurationConverter.parse for hours strings, so '1h 30m' parses (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/app/components/time_entries/days_and_hours_form.rb:73-79 visible hours_display field with hidden hours; frontend/src/stimulus/controllers/dynamic/time-entry.controller.ts:166-171 parses it with durationStringToSeconds, so '1h 30m' works; app/services/duration_converter.rb:78, :140 server parse with ChronicDuration", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can specify additional time units after a time value X, such as Xw, Xd, Xh, or Xm'", "plane": "corpus: plane/round4/code-census.md §8 'no duration type' and §10 no duration field" }, @@ -2841,9 +2884,9 @@ "kanboard": "partial", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; src/router.js:29-153 no timesheet route", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Template/user_view/timesheet.php:5-23 'Subtask timesheet' per user with Start, End and Time spent, sortable by start, not grouped by date", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/my-time-tracking/README.md 'The My time tracking module offers a clear overview of your personal time entries' in 'a calendar or list view'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/config/routes.rb:59 '/time-tracking/(:mode-:view_mode)(/:date)' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/my-time-tracking/README.md 'The My time tracking module offers a clear overview of your personal time entries' in 'a calendar or list view'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/config/routes.rb:59 '/time-tracking/(:mode-:view_mode)(/:date)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/config/routes.rb:50-56 /time-tracking by day, week, workweek or month in list or calendar view; modules/costs/app/controllers/my/time_tracking_controller.rb:45 index; modules/costs/app/components/my/time_tracking/list_stats_component.rb:51 totals per period", "jira": "docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'; timesheets are the Marketplace apps Tempo Timesheets and Timesheet Reports and Gadgets, not the product", "plane": "corpus: plane/round4/code-census.md §10 'The paid strings \"Full Time Tracking + Bulk Ops\", \"Historical timesheets\" ... are absent'" }, @@ -2871,9 +2914,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: neither logged time nor an estimate exists: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time · Estimated vs actual time per column' ; source: app/Template/subtask/timer.php:2-9 spent/estimated on the subtask", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md work and remaining work; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/work_packages/scopes/include_spent_time.rb (spent time beside work on the work package) Note: include_spent_time.rb is in the 18.0-dev tree only; the progress-tracking docs cited are present at v17.8.0, and spent time beside work predates the drive.", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md work and remaining work; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/work_packages/scopes/include_spent_time.rb (spent time beside work on the work package) Note: include_spent_time.rb is in the 18.0-dev tree only; the progress-tracking docs cited are present at v17.8.0, and spent time beside work predates the drive. ; source read at v17.8.0: lib/api/v3/work_packages/work_package_representer.rb:458 spent_time property beside estimated and remaining hours; app/contracts/work_packages/base_contract.rb:77-83 estimated_hours and remaining_hours; both shown as Spent time and Work in the work package details", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html Time Spent against Original Estimate and Remaining Estimate; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html Time Tracking Report shows 'Original Estimate, Estimated Time Remaining, Time Spent, and Accuracy'", "plane": "corpus: plane/round4/code-census.md §10 no worklog; estimates are points or categories only (helper.tsx:10-18)" }, @@ -2901,9 +2944,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no time entry to correct: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", "kanboard": "source: app/Template/task/time_tracking_details.php:5 'editable' => false : timer entries cannot be edited or removed; only the task and subtask time_spent totals are editable in their forms", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:22-23 'Edit logged time', 'Delete time entries' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:22-23 'Edit logged time', 'Delete time entries' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/app/controllers/time_entries_controller.rb:101 update and :125 destroy; modules/costs/config/routes.rb:32 time_entries update, destroy; modules/costs/lib/costs/engine.rb:61 edit_own_time_entries and :66 edit_time_entries", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can edit your own work log entries if you have been granted the Edit Own Work Logs permission' and 'delete your own work log entries'", "plane": "corpus: plane/round4/code-census.md §10 no time entries exist to correct" }, @@ -2931,9 +2974,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; src/router.js:29-153 no report route", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time' per project and the per-user 'Time tracking' page (app/Template/user_view/sidebar.php:19); no report of time per person across projects", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md time and cost reports grouped by user, project and more (corpus: openproject/round4/M1-column.md 10.4 'the reporting module is a real pivot engine over cost and time') (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md time and cost reports grouped by user, project and more (corpus: openproject/round4/M1-column.md 10.4 'the reporting module is a real pivot engine over cost and time') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/reporting/config/routes.rb:31 cost_reports; modules/reporting/app/models/cost_query/group_by/user_id.rb and project_id.rb group time by person and project, with spent_on, week, tmonth and more beside them", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Time Tracking Report' per version and 'User Workload Report: Shows how much work a user has been allocated'; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'", "plane": "corpus: plane/round4/code-census.md §10 'Dashboards: absent', no worklogs; Analytics is 'a two-dimensional count' of work items (menu-tree.md)" }, @@ -2964,9 +3007,9 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; the row is specific to the fleet's HR app", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; the row is specific to the fleet's HR app ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'humaniq', 'payroll': none; the row names the fleet's HR app, which Deck does not know", "kanboard": "the row is specific to the fleet's HR app; Kanboard stores time in its own subtask_time_tracking table only (corpus: kanboard/round4/code-census.md objects table)", - "openproject": "no HR app integration; time entries live in the costs module only (source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb); corpus: openproject/round4/M1-column.md section 12 (Integrations) lists no HR system", + "openproject": "no HR app integration; time entries live in the costs module only (source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb); corpus: openproject/round4/M1-column.md section 12 (Integrations) lists no HR system ; source read at v17.8.0: modules/costs/app/models/time_entry.rb:47-56 time entries live in OpenProject's own costs module; searched app, lib and modules (rb) for 'payroll': none, and no HR system integration exists", "jira": "corpus: jira-data-center/round4/M1-column.md 12.5 and 12.12 integrations list test management, source control and collaboration tools; no HR or payroll hand-off", "plane": "corpus: plane/round4/code-census.md §10 no hours recorded at all, and no HR integration (§12)" }, @@ -2994,9 +3037,9 @@ "kanboard": "yes", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; 'timer' in src/ is only the drag autoscroll interval at src/components/board/Stack.vue:365-391", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md task sidebar 'Time tracking' ; source: app/Model/SubtaskTimeTrackingModel.php:143 toggleTimer", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:54 'Starting with OpenProject 13.0, you can also track time in real time using the start/stop time tracking button'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/controllers/my/timer_controller.rb (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:54 'Starting with OpenProject 13.0, you can also track time in real time using the start/stop time tracking button'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/controllers/my/timer_controller.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-timer-button/wp-timer-button.component.ts:82 'Stop' and :99-100 stop via TimeEntryTimerService; frontend/src/app/shared/components/time_entries/timer/timer-account-menu.component.ts running timer in the account menu; modules/costs/app/models/time_entry.rb:47 ongoing time entries; modules/costs/config/routes.rb:49 /timer", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html documents logging entered durations only; timers are Marketplace apps", "plane": "corpus: plane/round4/code-census.md §10 'no timer'" }, @@ -3023,9 +3066,9 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'approv': none", "kanboard": "source: grep -rniE 'approv' app/Model returns no timesheet approval ; corpus: kanboard/round4/code-census.md objects table", - "openproject": "corpus: openproject/round4/M1-column.md 3.13 'grep -rliI approval|approve app/models modules/*/app/models returns nothing'", + "openproject": "corpus: openproject/round4/M1-column.md 3.13 'grep -rliI approval|approve app/models modules/*/app/models returns nothing' ; source read at v17.8.0: searched app/models, modules/*/app/models, modules/costs and modules/reporting for 'approv': none; modules/costs/config/routes.rb:32 time entries have create, update, destroy only, no submit or approve", "jira": "corpus: jira-data-center/round4/M1-column.md 3.13 'the approval step is JSM DC'; no timesheet object to approve (tim-timesheet)", "plane": "corpus: plane/round4/code-census.md §3 'Approvals: absent' and §10 no timesheets" }, @@ -3052,9 +3095,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no time entries to export: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; the board export at src/components/navigation/BoardExportModal.vue:12-18 writes cards, not time", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Exports' ; source: app/Export/SubtaskExport.php:57-64 CSV with 'Time estimated', 'Time spent' per subtask; no export of individual time entries", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md:93 'To export reports for time and costs to Excel you can open or create a report in the Time and costs module' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md:93 'To export reports for time and costs to Excel you can open or create a report in the Time and costs module' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/reporting/app/controllers/cost_reports_controller.rb:78-85 the time and costs report answers format.xls and format.pdf exports; modules/reporting/config/routes.rb:31 cost_reports; modules/xls_export provides the spreadsheet writer", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'Export > CSV (All fields)' carries the issue's time spent fields (corpus: jira-data-center/round4/M1-column.md 10.3), not individual work logs; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'", "plane": "corpus: plane/round4/code-census.md §10 'exporter.py:31 lists (\"issue_worklogs\", \"Issue Worklogs\") ... but grep issue_worklogs finds no producer'" }, @@ -3081,9 +3124,9 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps", + "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'billable', 'invoice', 'hourlyRate': none", "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal returns 26 hits and none is a payment' ; no invoicing hand-off", - "openproject": "cost reports compute cash value from rates (docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md 'Labor, Cash value'), but no invoice object or accounting hand-off exists (corpus: openproject/round4/M1-column.md 12.12 'no payment integration')", + "openproject": "cost reports compute cash value from rates (docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md 'Labor, Cash value'), but no invoice object or accounting hand-off exists (corpus: openproject/round4/M1-column.md 12.12 'no payment integration') ; source read at v17.8.0: searched app, lib and modules (rb) for 'invoice': none; modules/reporting/app/controllers/cost_reports_controller.rb:84-85 time leaves only as an XLS or PDF report, with no billing or accounting hand-off", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'no payment provider ... nothing financial'", "plane": "corpus: plane/round4/code-census.md §10 no billable time; §5 no customer entity" }, @@ -3111,9 +3154,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/)", + "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload', 'hours': only date picker defaults and Gantt 'Hours' zoom, src/components/board/GanttView.vue:195; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'User repartition' (tasks per assignee per project) ; source: app/Controller/ProjectUserOverviewController.php manager view of users across projects : counts, not allocation", - "openproject": "corpus: openproject/round4/open-core.md resource_management and team_planner_view Enterprise gated; corpus: openproject/round4/code-census.md #22 'absent, 403 on every controller in the module, except the planners index'; docs: opf/openproject HEAD 27a58131 docs/user-guide/resource-management/README.md 'allocate work to users and monitor team capacity'. Free build: assignee grouping in work package queries only (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/open-core.md resource_management and team_planner_view Enterprise gated; corpus: openproject/round4/code-census.md #22 'absent, 403 on every controller in the module, except the planners index'; docs: opf/openproject HEAD 27a58131 docs/user-guide/resource-management/README.md 'allocate work to users and monitor team capacity'. Free build: assignee grouping in work package queries only (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/resource_management/config/routes.rb:41 resource planners and :114 staffing; modules/resource_management/app/services/resource_allocations/availability.rb:111 capacity per user; modules/resource_management/app/controllers/resource_management/base_controller.rb:41-43 every action behind the :resource_management Enterprise token; modules/team_planner/app/controllers/team_planner/team_planner_controller.rb:14 team planner likewise gated", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report: Shows how much work a user has been allocated, and how long it should take'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps team capacity per sprint in hours or story points", "plane": "corpus: plane/round4/code-census.md §10 no time or allocation data; menu-tree.md 'no Dashboards, no Reports beyond a two-dimensional Analytics count'" }, @@ -3144,9 +3187,9 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/)", + "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload', 'hours': only date picker defaults and Gantt 'Hours' zoom, src/components/board/GanttView.vue:195; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours; the board sidebar tabs are sharing, tags, deleted items and activity, src/components/board/BoardSidebar.vue", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Task distribution · User repartition' per project : task counts per column and per user, no capacity", - "openproject": "project capacity is the resource planner (Enterprise gated, corpus: openproject/round4/code-census.md #22); free build shows work and remaining work totals per project query (corpus: openproject/round4/M1-column.md 3.15 progress values)", + "openproject": "project capacity is the resource planner (Enterprise gated, corpus: openproject/round4/code-census.md #22); free build shows work and remaining work totals per project query (corpus: openproject/round4/M1-column.md 3.15 progress values) ; source read at v17.8.0: modules/resource_management/config/locales/en.yml:98 'available, scheduled' capacity summary and :129 'start planning capacity for this project'; modules/resource_management/lib/open_project/resource_management/engine.rb:120-124 project menu entry needs the resource_management token; free build shows only Work and Remaining work sums, app/contracts/work_packages/base_contract.rb:80", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Workload Report'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps 'If you set the capacity at 40 hours, the sprint's capacity will be 80 hours' (per team, not per project)", "plane": "corpus: plane/round4/code-census.md §10 no allocation or hours model; project analytics are work item counts (project_analytics.py:44,97)" }, @@ -3174,9 +3217,9 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards' is a navigation list with no state or progress", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards' is a navigation list with no state or progress ; source read at v1.19.0: src/components/boards/Boards.vue:9-23 'All boards' is a table of 'Board name' and 'Members' only, with no status, progress or due counts per board; src/router.js:55-60; searched src/ for 'portfolio', 'progress' on boards: none", "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Projects management' ; source: app/Template/project_user_overview/ manager overview of projects, users and open tasks; no portfolio health view", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:44 'create a multi-project status dashboard if you include your own project attributes or project life cycle phases' and project status filters (:129); portfolio and program workspaces are Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:44 'create a multi-project status dashboard if you include your own project attributes or project life cycle phases' and project status filters (:129); portfolio and program workspaces are Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/queries/projects/filters/project_status_filter.rb:35 project status on the free projects list with custom project attribute columns; app/components/projects/index_page_header_component.rb:64-66 open all as one Gantt; config/initializers/menus.rb:34-44 the separate Portfolios module needs :portfolio_management", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html issue sources 'determine which projects, boards, and filters you want to import', a plan holds up to 100 projects (Advanced Roadmaps, bundled)", "plane": "corpus: plane/round4/menu-tree.md workspace 'Projects', 'Analytics'; code-census.md §10 AnalyticsEndpoint and AdvanceAnalyticsChartEndpoint 'a two-dimensional count, not a report builder'. A workspace-level count across projects, no portfolio health view" }, @@ -3204,9 +3247,9 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow' ; 'Upcoming cards cards assigned to me across boards'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow' ; 'Upcoming cards cards assigned to me across boards' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers dashboard widgets DeckWidgetUpcoming, DeckWidgetToday, DeckWidgetTomorrow, lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards'; inside Deck src/router.js:36-38 /upcoming renders src/components/overview/Overview.vue:57-83 my cards by due date", "kanboard": "corpus: kanboard/round4/M1-column.md 10.2 'the dashboard is fixed: projects, my tasks, my subtasks, calendar, activity (DashboardController)'", - "openproject": "corpus: openproject/round4/menu-tree.md 'My page personal dashboard, grid of widgets'; corpus: openproject/round4/M1-column.md 10.2 'modules/my_page/, the same grid machinery per user'", + "openproject": "corpus: openproject/round4/menu-tree.md 'My page personal dashboard, grid of widgets'; corpus: openproject/round4/M1-column.md 10.2 'modules/my_page/, the same grid machinery per user' ; source read at v17.8.0: modules/my_page/config/routes.rb:3 /my/page; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' and :87 'work_packages_created' default widgets on a per user grid", "jira": "corpus: jira-data-center/round4/M1-column.md 10.2 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on'", "plane": "corpus: plane/round4/journeys.md 'Manage widgets ... exactly three toggles: Quicklinks, Recents, Your stickies' and 'there is no dashboard route'; menu-tree.md 'Your work' gives the personal item list" }, @@ -3237,7 +3280,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.5 'Upcoming cards (/upcoming/) lists cards assigned to me across boards'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.5 'Upcoming cards (/upcoming/) lists cards assigned to me across boards' ; source read at v1.19.0: src/router.js:36-38 /upcoming; src/components/overview/Overview.vue:111 'Upcoming cards', :57-83 due-date columns; lib/Controller/OverviewApiController.php:29 upcomingCards, lib/Service/OverviewService.php:26-41 cards assigned to me or unassigned across all my boards", "kanboard": "corpus: kanboard/round4/M1-column.md 3.5 'the dashboard shows \"My tasks\" and \"My subtasks\"'", "openproject": "corpus: openproject/round4/M1-column.md 3.5 'default queries ship and modules/my_page/ renders personal ones'; global 'Work packages' module across projects (corpus: openproject/round4/menu-tree.md)", "jira": "corpus: jira-data-center/round4/M1-column.md 3.5 'predefined system filters for common queries, such as My Open Issues'", @@ -3267,7 +3310,7 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'The date:overdue filter listed the card' ; M1-column.md 10.1 'no dashboards of counts' : a filter, not a report; no blocked state", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'The date:overdue filter listed the card' ; M1-column.md 10.1 'no dashboards of counts' : a filter, not a report; no blocked state ; source read at v1.19.0: src/components/overview/Overview.vue:59 'Overdue' column and lib/Service/OverviewService.php:50-52 overdue bucket for my cards; src/components/Controls.vue:172-225 'Filter by due date' with 'Overdue' on a board; no counts and no blocked state, searched src/ for 'blocked': none", "kanboard": "corpus: kanboard/round4/menu-tree.md board filter 'due today, due tomorrow, due yesterday, closed, open' and Analytics 'Task distribution' ; no blocked count", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/models/queries/work_packages/filter/blocked_filter.rb (relation 'blocked by'), due_date_filter.rb, status open/closed filters; saved as a query and shown in a widget (corpus: openproject/round4/M1-column.md 10.10) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'Find all overdue issues: duedate < now() and resolution is empty' and gadgets over filters (10.10); blocked is not a state or a documented JQL field in DC, only a link on each issue", @@ -3301,7 +3344,7 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/)", + "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload': none; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours", "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; time estimates exist per task (promoted-rows-batch7.md 10.11) but nothing sets them against availability", "openproject": "user working hours and time off are recorded (docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md:11 'define your working schedule, plan future schedule changes, and manage your time off'), but the planner that sets workload against them is resource management, Enterprise gated (corpus: openproject/round4/code-census.md #22) Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10).", "jira": "docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps capacity is set per team per sprint in hours ('If you set the capacity at 40 hours'); per-person hours against availability are not in the 11.3 page", @@ -3331,7 +3374,7 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/)", + "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload': none; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours, so nothing to warn against", "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday')", "openproject": "only inside the Enterprise resource planner (corpus: openproject/round4/code-census.md #22); nothing on the free build warns about an over-planned person", "jira": "docs: docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps and https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'the Auto-scheduler will assign tasks to sprints based on the size of an issue, team capacity, and sprint length': capacity per team and sprint, no per-person warning documented", @@ -3360,7 +3403,7 @@ "kanboard": "no", "jira": "unknown", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 13.17 'no out of office; the platform's user_status shows a status and follows nobody'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 13.17 'no out of office; the platform's user_status shows a status and follows nobody' ; source read at v1.19.0: searched lib/ and src/ for 'absence', 'out of office', 'user_status', 'working hours': none; 'leave' is only leaving a board, lib/Controller/BoardController.php:69", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 13.17 'grep out.?of.?office|substitut|delegat|absence returns 0'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md time off and individual working hours per user (free); instance working days drive scheduling (corpus: openproject/round4/M1-column.md section 8); using personal time off in planning is resource management, Enterprise gated Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10).", "jira": "not checked: absences appear in the old standalone Advanced Roadmaps 3.29 docs (Configuring the availability of team members) but not in the Jira Software 11.3 Advanced Roadmaps pages read (Teams, Capacity and velocity, Auto-schedule)", @@ -3390,7 +3433,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'cost': none; lib/Db/Board.php holds title, owner, colour, archive and settings, no money field", "kanboard": "corpus: kanboard/round4/code-census.md 'payment|stripe|ideal returns 26 hits and none is a payment' ; no budget field on a project", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:15 'If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'nothing financial'; no budget object in Jira Software", @@ -3420,7 +3463,7 @@ "kanboard": "no", "jira": "unknown", "evidence": { - "nextcloud-deck": "source: lib/Db/Assignment.php:17-20 assignee types user, group, team, remote; no placeholder role", + "nextcloud-deck": "source: lib/Db/Assignment.php:17-20 assignee types user, group, team, remote; no placeholder role ; source read at v1.19.0: lib/Db/Assignment.php:17-20 assignee types are user, group, circle and remote, each a real account or team; searched lib/ and src/ for 'placeholder role', 'role': no unnamed role assignee", "kanboard": "source: a task has one owner_id, a user (app/Model/TaskCreationModel.php:67); no placeholder role", "openproject": "corpus: openproject/round4/open-core.md placeholder_users Enterprise gated; corpus: openproject/round4/code-census.md #18 'absent from the UI and refused server side, for creation only'", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html does not address members who are not Jira users; virtual members existed in the standalone Portfolio product and were not confirmed for DC 11", @@ -3449,7 +3492,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no analytics'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no analytics' ; source read at v1.19.0: searched lib/ and src/ for 'cumulative', 'flow diagram', 'chart': none; lib/Db/Stack.php:28-35 keeps no history of card counts per list", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Cumulative flow diagram' ; M1-column.md 10.4 'from project_daily_column_stats'", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'cumulative.flow|cycle.time|lead.time' over app, modules and frontend/src returns nothing", "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'the Cumulative Flow Diagram is an area chart that shows the various statuses of work items'", @@ -3478,7 +3521,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no duration is stored beyond createdAt, lastModified and done'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no duration is stored beyond createdAt, lastModified and done' ; source read at v1.19.0: lib/Db/Card.php:81 createdAt and :89 done timestamps exist, but searched lib/ and src/ for 'cycle time', 'lead time', 'cycleTime', 'leadTime': no report computes them", "kanboard": "corpus: kanboard/round4/M1-column.md 10.4 'lead and cycle time per task and averaged (TaskAnalyticModel::getLeadTime, getCycleTime)'", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): same grep, no cycle or lead time report; corpus: openproject/round4/M1-column.md 10.4 'There is no cycle time, no heatmap and no phase duration analysis'", "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'The Control Chart shows the cycle time and lead time for your product, version, or sprint'", @@ -3508,7 +3551,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: src/components/navigation/BoardExportModal.vue:12-18 'Export as JSON' and 'Export as CSV' on a board (tag v1.18.4) ; corpus: nextcloud-deck/round4/M1-column.md 10.3 said 'no CSV or XLSX; occ deck:export writes JSON', which the UI export contradicts", + "nextcloud-deck": "source: src/components/navigation/BoardExportModal.vue:12-18 'Export as JSON' and 'Export as CSV' on a board (tag v1.18.4) ; corpus: nextcloud-deck/round4/M1-column.md 10.3 said 'no CSV or XLSX; occ deck:export writes JSON', which the UI export contradicts ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:76 'Export board' opens src/components/navigation/BoardExportModal.vue:12 'Export as JSON', :18 'Export as CSV'; src/services/BoardApi.js:239-243 writes a .csv file of the cards; lib/Controller/BoardController.php:140 export, lib/Service/BoardService.php:716; no PDF", "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 'Exports on the project menu: tasks, subtasks, transitions and daily summaries as CSV with a date range'", "openproject": "corpus: openproject/round4/M1-column.md 10.3 'CSV and PDF registered at config/initializers/export_formats.rb:33-34, XLS added by modules/xls_export'", "jira": "corpus: jira-data-center/round4/M1-column.md 10.3 'Export > CSV (All fields)'; other formats 'XML, Word and Printable', no XLSX or PDF", @@ -3538,7 +3581,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' saved searches ; 10.1 'no'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' saved searches ; 10.1 'no' ; source read at v1.19.0: searched lib/ and src/ for 'savedQuery', 'saved search', 'report': none; src/components/Controls.vue:172-229 the board filter is not saved; lib/Search/FilterStringParser.php parses one-off search filters only", "kanboard": "corpus: kanboard/round4/journeys.md 5 shared custom filter saved ; code-census.md 'saved searches custom_filters.is_shared' : a saved query, no report builder", "openproject": "corpus: openproject/round4/M1-column.md 9.3 personal saved queries, 10.1 widgets, 10.4 cost report pivot engine", "jira": "corpus: jira-data-center/round4/M1-column.md 9.3 saved filters, 10.1 gadgets 'Issue Statistics', 'Pie Chart', 10.10 'Filter Results'", @@ -3567,7 +3610,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow (lib/Dashboard/), on the Nextcloud dashboard'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow (lib/Dashboard/), on the Nextcloud dashboard' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers three platform dashboard widgets; lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards', lib/Dashboard/DeckWidgetToday.php:38 'Cards due today', lib/Dashboard/DeckWidgetTomorrow.php:38 'Cards due tomorrow'; src/views/DashboardUpcoming.vue renders them", "kanboard": "not a Nextcloud app; corpus: kanboard/round4/code-census.md empty grep 'widget' ; M1-column.md 9.12 'no' platform integration", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard' (OpenProject Integration app for Nextcloud); notifications, not a task list (cited source paths checked present at the released v17.8.0 tag.)", "jira": "not a Nextcloud product and no Nextcloud app from Atlassian; its own dashboard is prt-dashboard (corpus: jira-data-center/round4/M1-column.md 10.2); corpus: jira-data-center/round4/M1-column.md 1.9 integrations page covers Confluence only", @@ -3597,7 +3640,7 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card 'Activity (the platform's stream filtered to the card)' ; code-census.md 'activity subjects 39' ; M1-column.md 10.9 'Verified live on card 6'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card 'Activity (the platform's stream filtered to the card)' ; code-census.md 'activity subjects 39' ; M1-column.md 10.9 'Verified live on card 6' ; source read at v1.19.0: appinfo/info.xml:67-79 registers activity settings, filter and provider; lib/Activity/ActivityManager.php:53-94 board, list, card, label, attachment and comment subjects; src/components/card/CardSidebarTabActivity.vue:7-12 and src/components/board/BoardSidebar.vue:42 'Activity' tabs (platform activity)", "kanboard": "not a Nextcloud app; its own project activity stream (corpus: kanboard/round4/menu-tree.md project 'Activity', task 'Activity stream' ; code-census.md 'event log project_activities')", "openproject": "own activity module per project (docs: opf/openproject HEAD 27a58131 docs/user-guide/activity; corpus: openproject/round4/M1-column.md 10.5 'the activity view aggregates them per project'); the Nextcloud integration offers dashboard, search and link preview (docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22-25), no Nextcloud activity stream entries (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 5.4 'Your user profile also displays recent work in the Activity Stream' (own activity stream, not a host platform's)", @@ -3627,7 +3670,7 @@ "kanboard": "partial", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.20 'push board changes to open clients when the notify_push app is installed ... without it the client polls. Not driven'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.20 'push board changes to open clients when the notify_push app is installed ... without it the client polls. Not driven' ; source read at v1.19.0: src/sessions.js:40-60 listens for deck_board_update and deck_card_update from the notify_push app and reloads the open board; lib/NotifyPushEvents.php:13-14; without notify_push nothing refreshes: searched src/ for 'setInterval', 'polling': only session keep-alive at src/sessions.js:125 and a clock at src/main.js:65", "kanboard": "corpus: kanboard/round4/M1-column.md 2.20 'the board polls: BoardAjaxController::check ... every board_private_refresh_interval seconds (10 by default) ... the task page does not refresh'", "openproject": "corpus: openproject/round4/M1-column.md 2.20 'The work package page does not update when someone else edits it'", "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 'JSWSERVER-4452 (Agile board should refresh automatically whenever someone moves a card ...), Gathering Interest, 246 votes'", @@ -3657,7 +3700,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md notification kinds 'card-assigned' ; M1-column.md 6.8 'four notifications reached jdevries ... two assignments'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md notification kinds 'card-assigned' ; M1-column.md 6.8 'four notifications reached jdevries ... two assignments' ; source read at v1.19.0: lib/Service/AssignmentService.php:77-78 assigning another user calls lib/Notification/NotificationHelper.php:107-121 sendCardAssigned with subject 'card-assigned', rendered by lib/Notification/Notifier.php; UI trigger src/components/card/AssignmentSelector.vue:17", "kanboard": "corpus: kanboard/round4/M1-column.md 6.8 web notifications with the assignee filter ; source: app/Subscriber/NotificationSubscriber.php task events to app/Notification/ (web, mail)", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:18 'Be notified of activities on some or all of the work packages in which you are participating (as assignee, responsible or watcher)' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur' (corpus: jira-data-center/round4/M1-column.md 8.6); Issue Assigned is a notification scheme event", @@ -3687,7 +3730,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: lib/Activity/SettingComment.php:20-28 'A comment was created on a card' activity setting, delivered by the platform's stream, mail or push per user ; corpus: nextcloud-deck/round4/code-census.md 'card-comment-mentioned' notification for mentions", + "nextcloud-deck": "source: lib/Activity/SettingComment.php:20-28 'A comment was created on a card' activity setting, delivered by the platform's stream, mail or push per user ; corpus: nextcloud-deck/round4/code-census.md 'card-comment-mentioned' notification for mentions ; source read at v1.19.0: lib/Listeners/CommentEventListener.php:41-44 and :56-59 a new comment triggers the card_comment_create activity; lib/Activity/SettingComment.php:28 'A comment was created on a card' setting delivered by the platform stream or mail; direct notification only for mentions, lib/Notification/NotificationHelper.php:178", "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies' and 6.8 notifications to assignee or creator ; source: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE => handleEvent, app/Template/notification/comment_create.php", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:27-29 participants are notified of all activities by default; docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html events 'when an issue is created or completed, or when any issue fields are updated' (corpus: jira-data-center/round4/M1-column.md 8.6), comments included; push notifications for watched issues and mentions (Push notifications page)", @@ -3717,7 +3760,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.6 'platform: the notification (8.4) is mailed when the user's notification settings say so; Deck sends no mail itself' ; source: lib/Activity/SettingBase.php activity mail choices", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.6 'platform: the notification (8.4) is mailed when the user's notification settings say so; Deck sends no mail itself' ; source: lib/Activity/SettingBase.php activity mail choices ; source read at v1.19.0: lib/Activity/SettingBase.php:79-89 each Deck activity type can be mailed by the platform, off by default; appinfo/info.xml:69-71 SettingChanges, SettingDescription, SettingComment; searched lib/ for 'IMailer': none, Deck sends no mail itself (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 8.6 'the overdue command sends e-mail' ; code-census.md notifications 'app/Notification/ (web, mail, webhook, activity stream)'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/notification-and-email/README.md:23-25 'Email reminders ... configure the email reminders which you receive' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur'", @@ -3741,13 +3784,13 @@ "name": "See who else is looking at the same board or task.", "origin": "competitor-derived", "planninq": "no", - "nextcloud-deck": "yes", + "nextcloud-deck": "partial", "openproject": "no", "plane": "no", "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'live presence: Session per user per board, events for notify_push' ; corpus: _round4/compare/findings-batch6.md '2.31 ... Deck yes by its sessions'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'live presence: Session per user per board, events for notify_push' ; corpus: _round4/compare/findings-batch6.md '2.31 ... Deck yes by its sessions' ; 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 isNotifyPushEnabled; src/sessions.js:76-82 createSession returns a dummy without notify_push; appinfo/routes.php:183-185 session create, sync, close", "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 2.31 'no' (does the product show who else has the case open right now)", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rliE 'presence|currently viewing|also editing' over app, lib and frontend/src/app matches only Ruby presence checks in services (user_preferences/update_service.rb, journals/create_service.rb); no viewer indicator", "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 the issue pages 'say nothing about refresh', and no presence indicator appears in the issue or board documentation read", @@ -3776,7 +3819,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.12 'the smart picker (lib/Reference/CreateCardReferenceProvider.php) creates a card from inside Talk and pastes its link ... not driven' ; open-core.md 'It does not reach ... Talk's inbox' : no conversation per card", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.12 'the smart picker (lib/Reference/CreateCardReferenceProvider.php) creates a card from inside Talk and pastes its link ... not driven' ; open-core.md 'It does not reach ... Talk's inbox' : no conversation per card ; source read at v1.19.0: src/init-talk.js:24-25 registers a Talk message action 'Create a card' from a chat message, loaded in Talk by lib/Listeners/BeforeTemplateRenderedListener.php:45-46; lib/Reference/CreateCardReferenceProvider.php:36 'Create a new deck card' smart picker; searched lib/ and src/ for a per-card conversation: none", "kanboard": "corpus: kanboard/round4/M1-column.md 6.12 'no chat ... Slack and Mattermost are directory plugins'", "openproject": "no chat integration (corpus: openproject/round4/M1-column.md 6.12 'no chat integration'); the Nextcloud app gives Talk only a link preview (col-link-preview)", "jira": "corpus: jira-data-center/round4/M1-column.md 6.12 'no chat capture ... Jira Server for Slack is a Marketplace plugin, not the product'", @@ -3806,7 +3849,7 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "source: lib/AppInfo/Application.php:144-146 CardReferenceProvider, BoardReferenceProvider, CommentReferenceProvider render rich previews of pasted links in Talk and Text ; corpus: nextcloud-deck/round4/code-census.md 'reference (4)'", + "nextcloud-deck": "source: lib/AppInfo/Application.php:144-146 CardReferenceProvider, BoardReferenceProvider, CommentReferenceProvider render rich previews of pasted links in Talk and Text ; corpus: nextcloud-deck/round4/code-census.md 'reference (4)' ; source read at v1.19.0: lib/AppInfo/Application.php:145-147 registers CardReferenceProvider, BoardReferenceProvider and CommentReferenceProvider; src/views/CardReferenceWidget.vue and src/views/BoardReferenceWidget.vue render the previews in Talk and Text (platform reference API)", "kanboard": "source: grep -rniE 'oembed|og:|unfurl' app/Template/layout.php returns nothing; no preview of a task link elsewhere ; corpus: kanboard/round4/code-census.md empty grep 'widget'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:220-222 'Starting with OpenProject Nextcloud Integration App 2.4 a work package link preview will be shown if you use Nextcloud Talk or Text apps' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 'Gadgets You can embed a Confluence activity stream ... in Jira's dashboard' and application links to Confluence (1.9): previews live in Confluence, a separate product; no chat unfurl in the product", @@ -3836,7 +3879,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search. Cards and boards under search-deck-card-board, comments under search-deck-comment ... Verified live' ; M1-column.md 9.12 'yes'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search. Cards and boards under search-deck-card-board, comments under search-deck-comment ... Verified live' ; M1-column.md 9.12 'yes' ; source read at v1.19.0: lib/AppInfo/Application.php:136-137 registers DeckProvider and CardCommentProvider; lib/Search/DeckProvider.php:31 'search-deck-card-board', :42-50 boards and cards; lib/Search/CardCommentProvider.php:35 'search-deck-comment' (platform unified search)", "kanboard": "corpus: kanboard/round4/M1-column.md 9.12 'no platform search to join' ; 9.1 'the header search box ... across every project the user can see' : its own global search finds tasks, not projects", "openproject": "corpus: openproject/round4/M1-column.md 9.1 global quick search over eight searchables including work packages and projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets allows you to search OpenProject work packages via the universal search bar in Nextcloud' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'The Search box is located at the top right of your screen ... start typing to search through all your issues and projects'", @@ -3866,7 +3909,7 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "generic only: lib/AppInfo/Application.php:212-213 registers Nextcloud collaboration ResourceProvider and ResourceProviderCard, so a board or card can be linked to other resources; nothing specific to the fleet's case management app", + "nextcloud-deck": "generic only: lib/AppInfo/Application.php:212-213 registers Nextcloud collaboration ResourceProvider and ResourceProviderCard, so a board or card can be linked to other resources; nothing specific to the fleet's case management app ; source read at v1.19.0: generic only: lib/AppInfo/Application.php:213-214 registers collaboration ResourceProvider and ResourceProviderCard, shown by src/components/card/CardSidebarTabDetails.vue:34-38 NcCollectionList when the platform projects feature is on; searched lib/ and src/ for 'procest', 'dossiq', 'zaak': none", "kanboard": "generic only: corpus: kanboard/round4/journeys.md 4 'createExternalTaskLink to a web link' ; menu-tree.md 'Add external link' ; journeys.md 1 a task 'reference' of Z-2026-0001", "openproject": "no case management integration; a generic 'link' custom field format exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/initializers/custom_field_format.rb:41 formats.register('link')), so a URL to an external record can be stored per work package or project (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'Issue linking allows you to create an association between two existing issues on either the same or different Jira servers' (corpus: jira-data-center/round4/M1-column.md 2.10); web links and a 'URL field' (corpus: jira-data-center/round4/M1-column.md 5.13) hold an external reference, no case app integration", @@ -3896,7 +3939,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "fleet-specific; Deck creates a card from Talk or Text (CreateCardReferenceProvider) but no board from another app's record (corpus: nextcloud-deck/round4/M1-column.md 1.9)", + "nextcloud-deck": "fleet-specific; Deck creates a card from Talk or Text (CreateCardReferenceProvider) but no board from another app's record (corpus: nextcloud-deck/round4/M1-column.md 1.9) ; source read at v1.19.0: searched lib/ and src/ for 'procest', 'dossiq', 'zaak': none; a card, not a board, can be made from Talk or Text, lib/Reference/CreateCardReferenceProvider.php:36 and src/init-talk.js:24", "kanboard": "fleet-specific; no create-from-record integration (corpus: kanboard/round4/M1-column.md 1.3 'no')", "openproject": "no case object or case app connector (corpus: openproject/round4/M1-column.md section 12 all Dutch case APIs 'no'); projects are created from templates only", "jira": "corpus: jira-data-center/round4/M1-column.md 12.1 'No ZGW'; no case system integration to start a project from", @@ -3926,7 +3969,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "fleet-specific; corpus: nextcloud-deck/round4/M1-column.md 5.4 'no' contact 360 and open-core.md 'Contacts has no link from a card'", + "nextcloud-deck": "fleet-specific; corpus: nextcloud-deck/round4/M1-column.md 5.4 'no' contact 360 and open-core.md 'Contacts has no link from a card' ; source read at v1.19.0: searched lib/ and src/ for 'pipelinq', 'crm', 'contact': no client link; lib/Db/Board.php:35-54 a board has no client or contact field", "kanboard": "fleet-specific; corpus: kanboard/round4/M1-column.md 5.2 'no' contact registry", "openproject": "no CRM integration; corpus: openproject/round4/M1-column.md 5.2 'no contact record'", "jira": "corpus: jira-data-center/round4/M1-column.md 5.2 'Customers and organizations are JSM DC records'; no CRM client page integration", @@ -3959,7 +4002,7 @@ "kanboard": "no", "jira": "partial", "evidence": { - "nextcloud-deck": "source: lib/AppInfo/Application.php:189 DeckTeamResourceProvider lists a team's boards on the Team page, :144-145 board and card reference widgets in Text and Talk ; corpus: nextcloud-deck/round4/code-census.md 'team resource'", + "nextcloud-deck": "source: lib/AppInfo/Application.php:189 DeckTeamResourceProvider lists a team's boards on the Team page, :144-145 board and card reference widgets in Text and Talk ; corpus: nextcloud-deck/round4/code-census.md 'team resource' ; source read at v1.19.0: lib/AppInfo/Application.php:191 DeckTeamResourceProvider lists a team's boards on the platform Team page; :145-146 card and board reference widgets, src/views/BoardReferenceWidget.vue, embed a board or card in Text and Talk; no widget for another app's record", "kanboard": "standalone application with no embed surface ; corpus: kanboard/round4/code-census.md empty grep 'widget'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:161 'In the Details side panel, click on the OpenProject tab. This tab lets you link work packages in OpenProject to the current file, and will list all linked work packages' (work packages on a Nextcloud file, not projects on a record) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 Confluence and Jira embed each other's content through application links ('You can embed a Confluence activity stream or a Confluence page in Jira's dashboard'); another Atlassian product, not an arbitrary app's record page", @@ -3989,7 +4032,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.7 'a REST API at /index.php/apps/deck/api/v1.0 and v1.1 (84 routes ...) plus 24 OCS routes. Verified live'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.7 'a REST API at /index.php/apps/deck/api/v1.0 and v1.1 (84 routes ...) plus 24 OCS routes. Verified live' ; source read at v1.19.0: appinfo/routes.php:102-114 card_api routes under /api/v{apiVersion}/boards/.../cards, :139-141 OCS routes; lib/Controller/CardApiController.php and lib/Controller/BoardApiController.php; docs/API.md:7-53 the documented REST API", "kanboard": "corpus: kanboard/round4/code-census.md 'JSON-RPC procedure classes / methods 26 / 161' ; journeys.md 1 and 4 all over the API (JSON-RPC 2.0, not REST: M1-column.md 12.18)", "openproject": "corpus: openproject/round4/M1-column.md 1.7 'API v3 is a Grape API rooted at lib/api/v3/root.rb'; 12.18 OpenAPI description", "jira": "corpus: jira-data-center/round4/M1-column.md 1.7 'POST /api/2/issue Create an issue or sub-task from json'; 12.18 OpenAPI 3.0.1, 432 operations", @@ -4019,7 +4062,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'The Flow engine acts on files and knows no card event'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'The Flow engine acts on files and knows no card event' ; source read at v1.19.0: searched lib/ for 'WorkflowEngine', 'IEntity', 'IOperation': none, so Deck registers no flow entity or check; card events reach only webhooks, lib/Event/ACardEvent.php:16", "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move'", "openproject": "corpus: openproject/round4/M1-column.md 3.9 CustomAction 'is fired by a button a user presses, not by a transition' and authoring is Enterprise gated; webhooks are outbound only (6.11); no event-driven rules on the free build", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation 'You can choose from many triggers including issue transitioned, scheduled trigger, or issue created' (bundled in Data Center)", @@ -4049,7 +4092,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "source: lib/Event/ACardEvent.php:17 'abstract class ACardEvent extends Event implements IWebhookCompatibleEvent' (CardCreatedEvent, CardUpdatedEvent, CardDeletedEvent), so the platform's webhook_listeners can post card events once an admin registers a listener over OCS. corpus: nextcloud-deck/round4/M1-column.md 6.11 said 'registers no events with webhook_listeners'; the tag's source contradicts it; not driven", + "nextcloud-deck": "source: lib/Event/ACardEvent.php:17 'abstract class ACardEvent extends Event implements IWebhookCompatibleEvent' (CardCreatedEvent, CardUpdatedEvent, CardDeletedEvent), so the platform's webhook_listeners can post card events once an admin registers a listener over OCS. corpus: nextcloud-deck/round4/M1-column.md 6.11 said 'registers no events with webhook_listeners'; the tag's source contradicts it; not driven ; source read at v1.19.0: lib/Event/ACardEvent.php:16 card events implement the platform IWebhookCompatibleEvent, as do ACL events in lib/Event/AAclEvent.php:14, so the platform webhook_listeners app can post them once an admin registers a listener through its API; no webhook screen in Deck, searched src/ for 'webhook': none", "kanboard": "corpus: kanboard/round4/M1-column.md 6.11 'one webhook URL per instance with a token ... posted with event_name, event_data and event_author on every project event'", "openproject": "corpus: openproject/round4/M1-column.md 6.11 'modules/webhooks/app/models/webhooks/webhook.rb with an event.rb selection model and a log.rb'", "jira": "corpus: jira-data-center/round4/M1-column.md 6.11 'Webhooks are user-defined HTTP POST callbacks ... signed on request (HMAC)'", @@ -4079,7 +4122,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; M1-column.md 11.2 'occ deck:export and occ deck:import ... Verified live'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; M1-column.md 11.2 'occ deck:export and occ deck:import ... Verified live' ; source read at v1.19.0: src/components/navigation/AppNavigationImportBoard.vue:7 'Import board', :10 accepts a JSON file, :45 importBoard; lib/Controller/BoardController.php:147 import, :183 system DeckJson; lib/Command/BoardImport.php:33 occ deck:import", "kanboard": "source: app/Import/ holds TaskImport.php and UserImport.php (CSV) only; no Deck importer", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): importers are app/services/import/jira* only (grep -rniIl 'deck' app/services/import returns nothing); CSV work package import is marked 'available on our Dev branch' (docs/user-guide/work-packages/importing/README.md)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html names CSV, JSON and importers for TFS, Rally, VersionOne, YouTrack, Axosoft, BaseCamp and Excel; no Nextcloud Deck importer", @@ -4103,13 +4146,13 @@ "name": "Import projects from Jira, Trello or a spreadsheet.", "origin": "competitor-derived", "planninq": "partial", - "nextcloud-deck": "yes", + "nextcloud-deck": "partial", "openproject": "yes", "plane": "no", "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; code-census.md 'lib/Service/Importer/Systems/'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; code-census.md 'lib/Service/Importer/Systems/' ; 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 TrelloApiService.php reachable through lib/Command/BoardImport.php:33-40 occ deck:import --system and appinfo/routes.php:91-93 import API; the UI import is Deck JSON only, lib/Controller/BoardController.php:183; searched lib/Service/Importer for 'jira', 'csv': none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Import tasks' ; source: app/Import/TaskImport.php CSV tasks into an existing project; no Jira or Trello importer in core", "openproject": "docs: opf/openproject HEAD 27a58131 docs/installation-and-operations/jira-migration/README.md 'Step-by-step guide for migrating from Jira Data Center to OpenProject using the Jira Migrator'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/import/jiras/create_service.rb. Note: the migrator arrived behind a feature flag in 17.2 (release-notes/17-2-0:129-134), after the round-4 drive on 16.6.10; CSV import is dev-branch only Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10).", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file'", @@ -4139,7 +4182,7 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "source: grep -rniE 'github|gitlab|commit' lib returns only migration comments; no forge integration ; corpus: nextcloud-deck/round4/open-core.md host surfaces list", + "nextcloud-deck": "source: grep -rniE 'github|gitlab|commit' lib returns only migration comments; no forge integration ; corpus: nextcloud-deck/round4/open-core.md host surfaces list ; source read at v1.19.0: searched lib/ and src/ for 'github', 'gitlab', 'forge', 'commit': only a comment URL at lib/Service/SessionService.php:77 and a Vuex commit at src/components/Controls.vue:450; no forge integration", "kanboard": "source: grep -rniE 'github|gitlab|gogs|bitbucket' app/Action app/Controller returns 0 files; forge hooks are plugins (corpus: kanboard/round4/open-core.md 'a directory of 163 third-party plugins')", "openproject": "corpus: openproject/round4/M1-column.md 12.22 'the GitHub and GitLab modules receive inbound events (modules/github_integration/, modules/gitlab_integration/)'", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 'workflow triggers from development tools' ('Fisheye/Crucible, Bitbucket and GitHub', 8.9); 12.5 'Jira's Subversion integration lets you see Subversion commit information relevant to each issue'", @@ -4169,7 +4212,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "source: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients on the REST API ; not in the round-4 drive", + "nextcloud-deck": "source: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients on the REST API ; not in the round-4 drive ; source read at v1.19.0: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients built on the REST API at appinfo/routes.php:102-114; not Deck's own code", "kanboard": "source: app/Template/layout.php:5 viewport meta and ChangeLog:1028 'Improve layout on mobile/tablet devices' : a responsive web UI, no mobile app in the project", "openproject": "docs: opf/openproject HEAD 27a58131 docs/mobile-app-guide/README.md 'The OpenProject Mobile app (Beta) is available for iOS and Android. It is designed as a companion app'; beta, not in the round-4 drive The docs file is present at v17.8.0 (absent at v16.6.10); beta, so partial.", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push notifications 'on iOS and Android devices' for the Jira Data Center mobile app (corpus: jira-data-center/round4/M1-column.md 6.8 'the mobile app has one')", @@ -4199,7 +4242,7 @@ "kanboard": "no", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 3 'the file appeared as /Deck/bijlage-r4b6.txt ... in the uploader's Files' : one /Deck folder per uploader, not a shared folder per board", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 3 'the file appeared as /Deck/bijlage-r4b6.txt ... in the uploader's Files' : one /Deck folder per uploader, not a shared folder per board ; source read at v1.19.0: lib/Sharing/DeckShareProvider.php:50 DECK_FOLDER '/Deck' and lib/Service/ConfigService.php:244 attachment_folder '/Deck' per user: attachments land in each uploader's own /Deck folder and are shared to the board, no folder is made per board", "kanboard": "corpus: kanboard/round4/M1-column.md 4.23 'no' ; journeys.md 4 files stored under tasks/3/ in Kanboard's own store", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:27 'It is also possible to automatically create dedicated project folders'; corpus: openproject/round4/M1-column.md 4.23 'an automatically managed project folder (last_project_folder.rb)'; Nextcloud storage is free (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 4.23 'not hosted in a platform with a file manager'; attachments sit in the home directory or S3", @@ -4229,7 +4272,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 5 'pjanssen found nothing until added to the group' ; install.md 'a stranger reads the board -> HTTP 403'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 5 'pjanssen found nothing until added to the group' ; install.md 'a stranger reads the board -> HTTP 403' ; source read at v1.19.0: lib/Service/PermissionService.php:171-199 every read and write checks the board ACL and throws 'Permission denied'; lib/Db/Acl.php:31-39 read, edit, share, manage for user, group, remote, team; src/components/board/SharingTabSidebar.vue:39-52 'Can edit', 'Can share', 'Can manage'", "kanboard": "corpus: kanboard/round4/journeys.md 5 'carol, not a member, was refused on the project and on the task (403)' ; install.md refusal probe", "openproject": "corpus: openproject/round4/M1-column.md 9.7 'search is scoped through the project permission system (app/services/authorization/user_allowed_query.rb)'; 13.1 project roles", "jira": "corpus: jira-data-center/round4/M1-column.md 9.7 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues'", @@ -4262,7 +4305,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings default board on start · calendar bridge · group limit for board creation (admin)' and 'There is almost none' ; source: no lib/Settings admin page in the tag", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings default board on start · calendar bridge · group limit for board creation (admin)' and 'There is almost none' ; source: no lib/Settings admin page in the tag ; source read at v1.19.0: src/components/DeckAppSettings.vue:27 'Admin settings' shown to admins inside the app settings dialog, :32 'Limit board creation to some groups', :41 'Enable federation'; no platform admin settings page, appinfo/info.xml:67-72 declares only activity settings", "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'About · Application settings · Email settings · Project settings · Board settings ...' ; M1-column.md 11.24 'yes'", "openproject": "corpus: openproject/round4/menu-tree.md 'Administration' tree; corpus: openproject/round4/M1-column.md 11.24 'a large administration area over several hundred setting definitions'", "jira": "corpus: jira-data-center/round4/M1-column.md 11.24 instance configuration (CORS, banner, email templates); 11.15 'Configuring Jira application options'", @@ -4291,7 +4334,7 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md setup is occ app:install and occ config:app:set ; the app opens on a welcome board, no guided setup", + "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md setup is occ app:install and occ config:app:set ; the app opens on a welcome board, no guided setup ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29 and lib/Service/DefaultBoardService.php:37-46 on first run create a sample board, nothing more; searched lib/ and src/ for 'wizard', 'onboarding': none", "kanboard": "source: app/Schema/Sqlite.php:1564 seeds user admin with password admin; no setup wizard (corpus: kanboard/round4/install.md 'the first page rendered the moment the container was healthy')", "openproject": "corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database, so there is no setup wizard'; a first-login onboarding tour exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts, tours/gantt_tour.ts) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira application setup wizard will only display the first time after you install' (database, administrator, email, language, licence)", @@ -4321,7 +4364,7 @@ "kanboard": "no", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source: lib/Service/DefaultBoardService.php and lib/Service/fixtures/default-board.json create a sample board per user", + "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source: lib/Service/DefaultBoardService.php and lib/Service/fixtures/default-board.json create a sample board per user ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29-30 on a user's first visit creates 'Welcome to Nextcloud Deck!' from lib/Service/DefaultBoardService.php:66 createDefaultBoard and lib/Service/fixtures/default-board.json:5-16 sample lists and cards, translated at lib/Service/DefaultBoardService.php:78-83; one sample per user, not an admin loader", "kanboard": "no demo or sample data in core ; source: app/Schema/Sqlite.php seeds settings and the admin user only ; corpus: kanboard/round4/install.md", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data'", @@ -4356,7 +4399,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'translations in l10n/ 93' (nl among them: l10n/nl.js, nl.json)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'translations in l10n/ 93' (nl among them: l10n/nl.js, nl.json) ; source read at v1.19.0: l10n/nl.json holds 441 translated strings against 445 in l10n/en_GB.json; 93 languages in l10n/; strings go through t('deck', ...) in src/, e.g. src/components/DeckAppSettings.vue:7, and l10n->t in lib/, e.g. lib/Dashboard/DeckWidgetUpcoming.php:53", "kanboard": "corpus: kanboard/round4/code-census.md 'locales, app/Locale/ 38, nl_NL among them'", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/crowdin/nl.yml, js-nl.yml, nl.seeders.yml; corpus: openproject/round4/M1-column.md 11.13 'translations come from Crowdin' (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/translating-jira-938847004.html 'Jira ships with a number of translations in the most commonly-requested languages'; Dutch is not listed there, product strings come as language packs ('update these via the Universal Plugin Manager', corpus: jira-data-center/round4/M1-column.md 11.13)", @@ -4389,7 +4432,7 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue arrow-key card focus and N, F, X, Q shortcuts, src/components/cards/CardItem.vue:263-290 per-card keys, aria-labels on controls; not audited against WCAG AA in the round-4 drive (usability.md)", + "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue arrow-key card focus and N, F, X, Q shortcuts, src/components/cards/CardItem.vue:263-290 per-card keys, aria-labels on controls; not audited against WCAG AA in the round-4 drive (usability.md) ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:106-118 N, F, X, Q and arrow-key card navigation, listed in src/components/DeckAppSettings.vue:46-55; src/components/cards/CardItem.vue:12 tabindex and :30 aria-label; src/components/card/TagSelector.vue:15 aria labels on selects; not audited against WCAG AA, and the Gantt is a frappe-gantt SVG, src/components/board/GanttView.vue:63", "kanboard": "source: app/Template/config/keyboard_shortcuts.php shortcut list, app/Template/board/table_column.php:114 'ui-helper-hidden-accessible' screen-reader text; board cards have no keyboard move (brd-keyboard-move); not audited against WCAG AA in the round-4 drive", "openproject": "corpus: openproject/round4/usability.md 'Every page carries a Jump to content skip link, headings are structured ... form fields carry proper labels'; docs: opf/openproject HEAD 27a58131 docs/release-notes/17-2-0/README.md:85 widgets 'follow WCAG 2.1 AA guidelines for focus management' (partial scope); cards move by drag only (brd-keyboard-move) (cited source paths checked present at the released v17.8.0 tag.)", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html Jira applications 'audited ... to make sure they're compliant with Section 508 and WCAG 2.0 AA' (an older level, vendor statement, not driven)", @@ -4419,7 +4462,7 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 11.14 'platform: theming (enabled) sets logo, colours and name for the whole instance' ; the Vue client styles with platform CSS variables (e.g. var(--color-border) in src/components/board/GanttView.vue), so a token theme on the host would reach it; NL Design System tokens themselves are not shipped, not driven", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 11.14 'platform: theming (enabled) sets logo, colours and name for the whole instance' ; the Vue client styles with platform CSS variables (e.g. var(--color-border) in src/components/board/GanttView.vue), so a token theme on the host would reach it; NL Design System tokens themselves are not shipped, not driven ; source read at v1.19.0: Deck styles with the platform CSS variables, e.g. src/components/board/GanttView.vue:530-546 var(--color-background-hover), var(--color-primary-element), so platform theming carries through; searched lib/ and src/ for 'nldesign', 'theming': no own token support, and board and label colours are fixed hex values, lib/Service/BoardService.php:242", "kanboard": "corpus: kanboard/round4/M1-column.md 11.14 'partial: application_stylesheet takes custom CSS ... the logo and name are fixed' ; source: assets/css/light.min.css styles through CSS custom properties (179 var(--...) uses, e.g. --color-primary), so custom CSS could map tokens onto them; no NL Design System tokens shipped, not driven", "openproject": "corpus: openproject/round4/M1-column.md 11.14 'app/controllers/custom_styles_controller.rb:49 is the design and branding screen, Enterprise gated (define_custom_style). The free build sets a logo and nothing else'; no NL Design System tokens", "jira": "corpus: jira-data-center/round4/M1-column.md 11.14 'How to change your logo ... How to change Jira application colors'; colours and logo, no design-token theming or NL Design System support", @@ -4449,7 +4492,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md 'occ app:install deck -> deck 1.18.4 installed' on a throwaway Nextcloud", + "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md 'occ app:install deck -> deck 1.18.4 installed' on a throwaway Nextcloud ; source read at v1.19.0: appinfo/info.xml:41-45 a Nextcloud app on pgsql, sqlite or mysql, installed on the customer's own server; searched lib/ for outgoing vendor calls: only the optional Trello importer, lib/Service/Importer/Systems/TrelloApiService.php:10-22; note v1.19.0 requires Nextcloud 35 exactly, appinfo/info.xml:45", "kanboard": "corpus: kanboard/round4/install.md 'Kanboard ships one official image ... needs nothing beside it'", "openproject": "corpus: openproject/round4/install.md 'openproject/openproject:16 from Docker Hub ... against an external PostgreSQL'", "jira": "corpus: jira-data-center/round4/open-core.md 'On 30 March 2026 Atlassian stopped selling Data Center licences to new customers; on 28 March 2029 every Data Center product reaches end of life and turns read-only'; self-hosted for existing licence holders only", @@ -4479,7 +4522,7 @@ "kanboard": "yes", "jira": "no", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'Deck gates nothing and sells nothing. appinfo/info.xml says agpl'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'Deck gates nothing and sells nothing. appinfo/info.xml says agpl' ; source read at v1.19.0: appinfo/info.xml:24 licence agpl; LICENSE; searched lib/ and src/ for 'subscription', 'enterprise', 'license key': no feature gate", "kanboard": "corpus: kanboard/round4/open-core.md 'Kanboard is not open core. One MIT licence covers the product'", "openproject": "corpus: openproject/round4/open-core.md 'the core is GPL-3.0 ... and 32 named features are withheld behind a paid token'", "jira": "corpus: jira-data-center/round4/open-core.md 'Jira Software Data Center is closed source with one edition, priced by user tier'", @@ -4508,7 +4551,7 @@ "kanboard": "partial", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.9 'platform: admin_audit is shipped and disabled ... the Activity stream logs writes' ; code-census.md descriptionPrev before and after can be dropped (ActivityManager.php:414)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.9 'platform: admin_audit is shipped and disabled ... the Activity stream logs writes' ; code-census.md descriptionPrev before and after can be dropped (ActivityManager.php:414) ; source read at v1.19.0: lib/Activity/ActivityManager.php:53-94 every board, list, card and comment change is written to the platform activity table, which users cannot edit; :409-418 description before and after are dropped when the entry exceeds 4000 characters; searched lib/ for 'admin_audit', 'IAuditLogger': Deck feeds no audit log itself (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 activity stream and transitions with author and time, 13.9 'project_activities records writes only' ; no tamper protection on the table", "openproject": "corpus: openproject/round4/M1-column.md section 13 closing finding 'Setting, Role, Member, Workflow, CustomAction and EnterpriseToken changes are recorded nowhere ... What is recorded is destroys only, and it is purged after 60 days'; work package journals are thorough (10.9)", "jira": "corpus: jira-data-center/round4/M1-column.md 10.5 audit log with filters and CSV export, 10.9 issue History tab; corpus: jira-data-center/round4/open-core.md audit log 'limited by the retention period and the default cap of 10 million records'; 13.9 reads not recorded", @@ -4538,7 +4581,7 @@ "kanboard": "partial", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 12.7 'platform: user_ldap shipped and disabled ... SAML and OIDC as store apps (user_saml, user_oidc), not shipped with this image'", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 12.7 'platform: user_ldap shipped and disabled ... SAML and OIDC as store apps (user_saml, user_oidc), not shipped with this image' ; source read at v1.19.0: searched lib/ and src/ for 'saml', 'oidc', 'ldap', 'sso': none; sign-in is the platform's, Deck runs behind its session, lib/Service/PermissionService.php:171 checks the logged-in user; SSO depends on store apps user_saml or user_oidc (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 12.7 'LDAP ... and reverse-proxy header authentication in the core; grep saml|oidc|openid returns 0'", "openproject": "corpus: openproject/round4/M1-column.md 12.7 'both exist and both are Enterprise gated: modules/openid_connect/ and modules/auth_saml/ on the sso_auth_providers symbol'; free build has LDAP authentication", "jira": "corpus: jira-data-center/round4/M1-column.md 12.7 'Atlassian provides the SSO for Atlassian Data Center app ... Bundled with the Data Center licence, no extra subscription'", @@ -4568,7 +4611,7 @@ "kanboard": "yes", "jira": "yes", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 6 'occ deck:export admin wrote both boards as JSON with stacks, cards, labels and ACL' ; source: src/components/navigation/BoardExportModal.vue JSON and CSV export, lib/AppInfo/Application.php:191 registerUserMigrator(DeckMigrator)", + "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 6 'occ deck:export admin wrote both boards as JSON with stacks, cards, labels and ACL' ; source: src/components/navigation/BoardExportModal.vue JSON and CSV export, lib/AppInfo/Application.php:191 registerUserMigrator(DeckMigrator) ; source read at v1.19.0: src/components/navigation/BoardExportModal.vue:12-18 JSON and CSV per board; lib/Command/UserExport.php:39 occ deck:export for all of a user's boards; lib/AppInfo/Application.php:193 registers lib/UserMigration/DeckMigrator.php:71 export for the platform user migration", "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 CSV exports of tasks, subtasks, transitions and summaries ; 11.2 'the database can be downloaded whole'", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/controllers/admin/backups_controller.rb and config/routes.rb:1082 'resource :backups' (database and attachments backup from the admin UI); corpus: openproject/round4/M1-column.md 10.3 CSV, PDF, XLS exports (cited source paths checked present at the released v17.8.0 tag.)", "jira": "corpus: jira-data-center/round4/M1-column.md 11.2 'the whole-instance XML backup or a project import'; 10.3 CSV export; corpus: jira-data-center/round4/open-core.md data pipeline 'Data will be exported in CSV format'", @@ -4598,7 +4641,7 @@ "kanboard": "yes", "jira": "partial", "evidence": { - "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.3 per-board ACL and code-census.md 'remote ACL type 6' federation : an account shared on one board sees only that board, but a guest account needs the store Guests app, not shipped", + "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.3 per-board ACL and code-census.md 'remote ACL type 6' federation : an account shared on one board sees only that board, but a guest account needs the store Guests app, not shipped ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:90-94 share a single board with a user, group, team or remote account, :32 '(remote)'; lib/Federation/DeckFederationProvider.php:25-42 federated board shares; lib/Service/PermissionService.php:171-199 an account sees only boards shared with it; a guest account needs the store Guests app, searched lib/ and src/ for 'guest': only a docblock at lib/Collaboration/Resources/ResourceProvider.php:72, no guest flow", "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer): bob read the task (200) and was refused on updateTask' ; carol with no membership 403 ; journeys.md 6 public read-only board", "openproject": "corpus: openproject/round4/M1-column.md 13.1 membership per project with a role; the free build has no user seat limit (corpus: openproject/round4/open-core.md gates are features, not seats); per-work-package sharing is Enterprise gated (3.19)", "jira": "corpus: jira-data-center/round4/M1-column.md 3.19 'a partner needs an account and a licence' and is 'scoped per project by a role'; every guest takes a licensed seat", From 526e169dca1513fa3a3ac0b69e3b14644826490b Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:18:15 +0200 Subject: [PATCH 05/13] feat(parity): OpenProject source read at v17.8.0 across all 148 rows, sources and roadmap note recorded --- openspec/parity/capabilities.json | 395 +++++++++++++++++------------- 1 file changed, 219 insertions(+), 176 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index fd8434bc..b34bfa87 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -76,7 +76,50 @@ "readOn": "2026-09-12", "columnAddedOn": "2026-09-26", "evidenceGrade": "driven", - "unknownReason": "Graded driven at the round-4 drive of 2026-09-12 on 16.6.10, which produced the M1 column and the code census. The code was read from a second tree, the 18.0-dev head 27a58131, so cells are rated for what a buyer can install today, the released 17.x line up to v17.8.0: every yes or partial cell citing that head had its paths checked present at v17.8.0; features shipped in 17.x after the drive (the Jira migrator in 17.2, the schedule and availability page) say so in the evidence; backlog work package filters (17.9.0, due 2026-09-30) do not count; the mobile app is a beta and partial." + "unknownReason": "Graded driven at the round-4 drive of 2026-09-12 on 16.6.10. Every row was also read from source at v17.8.0 on 2026-09-26: source read at v17.8.0, driven at 16.6.10. Two ratings moved where the code contradicts the drive (prj-default-columns, col-live-updates); features shipped in 17.x after the drive say so in the evidence.", + "sources": { + "docs": "https://www.openproject.org/docs/", + "sourceRepo": { + "url": "https://github.com/opf/openproject", + "tag": "v17.8.0", + "commit": "2d1ae9c1f2de49d363e0ec2cea7d7f2991ed405a" + }, + "featurePage": "https://www.openproject.org/collaboration-software-features/", + "featureRequests": "https://community.openproject.org/projects/openproject/work_packages", + "issueTracker": { + "url": "https://community.openproject.org/projects/openproject/work_packages", + "featureLabel": "Feature (work package type id 6 on community.openproject.org; 2,628 open on 2026-09-26)" + }, + "roadmap": "https://www.openproject.org/roadmap/", + "changelog": "https://www.openproject.org/docs/release-notes/", + "apiReference": "https://www.openproject.org/docs/api/", + "marketplace": null, + "pricing": "https://www.openproject.org/pricing/", + "accessibilityStatement": "https://www.openproject.org/de/rechtliches/erklaerung-zur-digitalen-barrierefreiheit/", + "securityDocs": "https://www.openproject.org/docs/security-and-privacy/statement-on-security/", + "demoInstance": "https://start.openproject.com/", + "community": "https://community.openproject.org/", + "reviews": "https://www.openproject.org/reviews/", + "videos": "https://www.youtube.com/c/OpenProjectCommunity", + "caseStudies": "https://www.openproject.org/customers/", + "partnerDirectory": null, + "trainingCurriculum": "https://www.openproject.org/training-and-consulting/", + "jobPostings": "https://www.openproject.org/career/", + "tenders": [ + "ES-PLACSP-19162746 (2026-03-03, Spain, licence for the project management software OpenProject): https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=eoVg1LhDTjXECtSnloz%2BZQ%3D%3D" + ], + "nullReasons": { + "marketplace": "no plugin or app marketplace: extensions ship as bundled modules in the repo (modules/); the nearest listing is the Nextcloud app store entry apps.nextcloud.com/apps/integration_openproject, which belongs to Nextcloud, not to OpenProject", + "partnerDirectory": "no partner directory found: /partners/, /partner/, /partners-program/ and /become-a-partner/ on openproject.org return 404, and the homepage, customers and training pages link none" + } + }, + "sourceRead": { + "tag": "v17.8.0", + "commit": "2d1ae9c1f2de49d363e0ec2cea7d7f2991ed405a", + "readOn": "2026-09-26" + }, + "readHow": "Driven at 16.6.10 in round 4 (2026-09-12); source read at v17.8.0 (2d1ae9c, the latest release) on 2026-09-26 across all rows, with path:line beside the drive evidence. The grade stays driven with the note: source read at v17.8.0, driven at 16.6.10.", + "roadmapNote": "Not ratings. https://www.openproject.org/roadmap/ (read 2026-09-26) lists by quarter, not by version: 2026 Q3 search bar and filters within the backlog and sprints view (in test, bkl-sort-filter), timeline widget with milestones and sprints (in development); 2026 Q4 labels for work packages (in development, tsk-labels), cumulative flow diagram (in specification, prt-cumulative-flow), velocity charts (specified, bkl-velocity), burndown chart (in development) and burnup charts (specified, bkl-burndown), recurring tasks (new, tsk-recurring), trash bin for deleted work packages. Date alerts were not found as a roadmap item on that page. Each of these would move a current no or partial cell once released; they stay at today's rating until a release tag ships them." }, { "key": "plane", @@ -217,7 +260,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add board' ; source: lib/Db/Board.php:33-51 a board has title, owner, colour, settings; no short key and no description field ; source read at v1.19.0: lib/Db/Board.php:34-53 a board has title, owner, teamId, colour, archived, settings and no key or description; src/components/navigation/AppNavigationAddBoard.vue:19 'Board name' is the only input; lib/Service/BoardService.php:188 create(title, userId, color); searched lib/Db/Board.php for 'description', 'key', 'identifier': none", - "kanboard": "corpus: kanboard/round4/journeys.md 1 'createProject Vergunningen with identifier VERG' ; source: app/Model/ProjectModel.php:129 getByIdentifier, project description on the Edit project form", + "kanboard": "corpus: kanboard/round4/journeys.md 1 'createProject Vergunningen with identifier VERG' ; source: app/Model/ProjectModel.php:129 getByIdentifier, project description on the Edit project form ; source read at v1.2.54: app/Template/project_creation/create.php:13-15 'Identifier' field on the new project form; app/Template/project_edit/show.php:27-28 'Description' editor; app/Controller/ProjectCreationController.php:56 save; app/Model/ProjectModel.php:123 getByIdentifier", "openproject": "corpus: openproject/round4/menu-tree.md 'Projects' global module and 'Project settings > Information'; corpus: openproject/round4/M1-column.md 11.23 project attributes; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md (name, identifier, description) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/new_component.html.erb:32 project create form; app/forms/projects/settings/editable_identifier_form.rb:36 'identifier' field (the short key); app/forms/projects/settings/description_form.rb:35 description field; app/controllers/projects_controller.rb:113 create; app/contracts/projects/base_contract.rb:36-38 name, identifier, description attributes", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'you must provide: a name ... a key ... and designate a project lead', description added after creation; corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'", "plane": "corpus: plane/round4/journeys.md 'Create a workspace, create a project, create a work item' ; code-census.md §2 'project.py:76 identifier = models.CharField(max_length=12)', unique per workspace via ProjectIdentifier ; source: apps/web/core/components/project/card.tsx:285 renders project.description" @@ -250,7 +293,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings ... group limit for board creation (admin)' ; source: lib/Service/PermissionService.php:345-363 canCreate reads groupLimit ; source read at v1.19.0: src/components/DeckAppSettings.vue:26-37 admin section 'Limit board creation to some groups' (multi-select of groups); lib/Service/ConfigService.php:209 stores groupLimit; lib/Service/PermissionService.php:368-383 canCreate allows only members of the listed groups", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch ; source read at v1.2.54: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Template/config/project.php:21 'Disable personal projects' admin setting; app/Controller/ProjectCreationController.php:145 refuses personal projects when disabled; restriction is by application role, not by chosen group", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions') ; source read at v17.8.0: config/initializers/permissions.rb:34-39 add_project is a global permission; app/contracts/projects/create_contract.rb:67 create checks user.allowed_globally?(:add_project); app/models/global_role.rb:31 global roles; app/controllers/groups_controller.rb:184 a group has a 'global_roles' tab, so a chosen group can hold the right", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Creating and configuring a project is done by an administrator'; restricted to admins, but no documented grant to a chosen non-admin group", "plane": "source: apps/api/plane/app/views/project/base.py:257 create is @allow_permission([ROLE.ADMIN, ROLE.MEMBER], level=\"WORKSPACE\"), so guests are excluded, but there is no setting to restrict creation to admins or chosen groups (corpus: plane/round4/code-census.md §5 three fixed roles 20/15/5, no groups)" @@ -280,7 +323,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'sharing with users, groups, teams and remote users, each with edit, share and manage' ; journeys.md 1 ACL for jdevries ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:7 NcSelectUsers picker to add a user, group, team or remote user, :64 'Delete' removes the share; lib/Service/BoardService.php:419 addAcl and :541 deleteAcl, routes appinfo/routes.php:28-30", - "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer)' ; menu-tree.md 'Permissions'", + "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer)' ; menu-tree.md 'Permissions' ; source read at v1.2.54: app/Template/project_permission/users.php:36-54 add user form with a user autocomplete and role select, :26 'Remove'; app/Controller/ProjectPermissionController.php:67 addUser, :94 removeUser", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Members'; corpus: openproject/round4/M1-column.md 11.19 'memberships in app/models/member.rb' ; source read at v17.8.0: config/initializers/permissions.rb:208-216 manage_members covers members index, create, destroy and autocomplete_for_member; app/controllers/members_controller.rb:42 create, :87 destroy_by_principal", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' (Managing project roles, 2022-10-07); corpus: jira-data-center/round4/M1-column.md 13.4 Managing project role membership", "plane": "corpus: plane/round4/menu-tree.md 'Settings: General, Members, ...' ; code-census.md §5 'ProjectMember.role', ProjectMemberInvite (project.py:192)" @@ -311,7 +354,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'Acl: participant of type user, group, remote or team, with edit, share, manage' lib/Db/Acl.php:27-35 ; journeys.md 5 edit-only collaborator refused 403 on ACL change ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:39-58 per share 'Can edit', 'Can share', 'Can manage', 'Owner' (transfer); lib/Db/Acl.php:31-34 PERMISSION_READ, EDIT, SHARE, MANAGE; lib/Service/PermissionService.php:131-132 owner or ACL grants manage and share", - "kanboard": "corpus: kanboard/round4/usability.md 'three project roles and custom ones with column restrictions' ; journeys.md 5 custom role Toetser", + "kanboard": "corpus: kanboard/round4/usability.md 'three project roles and custom ones with column restrictions' ; journeys.md 5 custom role Toetser ; source read at v1.2.54: app/Core/Security/Role.php:18-20 project-manager, project-member, project-viewer; app/ServiceProvider/AuthenticationProvider.php:76-78 role hierarchy; app/Template/project_role/show.php:5 'Add a new custom role' with :21-27 project, drag and drop and column restrictions; app/Controller/ProjectRoleController.php:50 save", "openproject": "corpus: openproject/round4/M1-column.md 13.1 'app/models/role.rb:31 with nine subtypes ... Permissions are rows ... against a catalogue declared in code'; corpus: openproject/round4/M1-column.md 13.16 roles and permissions matrix ; source read at v17.8.0: app/models/role.rb:31-41 Role with builtin kinds; config/routes.rb:709 admin roles resources; config/initializers/permissions.rb:208 permissions are declared per role in code; app/controllers/members_controller.rb:71 update a member's roles", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 global permissions and project roles; corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission ... Assignable user Permission' (Managing project permissions)", "plane": "corpus: plane/round4/code-census.md §5 'ROLE_CHOICES = ((20, \"Admin\"), (15, \"Member\"), (5, \"Guest\"))' project.py:21 ; three fixed roles, no custom role" @@ -341,7 +384,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "source: appinfo/routes.php:26 board#leave, lib/Service/BoardService.php:515 leave() ('Board owner cannot leave board'), src/components/navigation/AppNavigationBoard.vue:157 'Leave board' menu entry ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:151-157 'Leave board' action; appinfo/routes.php:26 board#leave; lib/Service/BoardService.php:569-571 leave() refuses only the owner ('Board owner cannot leave board')", - "kanboard": "source: grep -rniE 'leave' app/Controller returns 0 hits; membership is removed by a project manager under Permissions (corpus: kanboard/round4/menu-tree.md 'Permissions')", + "kanboard": "source: grep -rniE 'leave' app/Controller returns 0 hits; membership is removed by a project manager under Permissions (corpus: kanboard/round4/menu-tree.md 'Permissions') ; source read at v1.2.54: searched app/Controller and app/Template for 'leave': none; membership removal is app/Controller/ProjectPermissionController.php:94 removeUser, gated to Role::PROJECT_MANAGER at app/ServiceProvider/AuthenticationProvider.php:100", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'leave_project' finds only app/components/header/projects/node_component.html.erb:37, an 'x-circle' button that links to home_path (navigates away from the current project); removing a member needs manage_members; corpus: openproject/round4/M1-column.md 11.19 memberships administered, no self-removal found ; source read at v17.8.0: config/locales/en.yml:2890 'Leave project' is only app/components/header/projects/node_component.html.erb:33-37, an x-circle linking to home_path (navigates away); app/contracts/members/delete_from_project_contract.rb:32 removing any member needs manage_members; searched app/contracts/members for a self-removal exception: none", "jira": "corpus: jira-data-center/round4/M1-column.md 13.4 'project roles have specific members for each project' edited on the Managing project role membership page by a project or Jira admin; no self-leave documented", "plane": "source: apps/api/plane/app/urls/project.py:88-89 'projects//members/leave/' ProjectMemberViewSet leave ; corpus silent on leaving" @@ -371,7 +414,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards ...)' ; source: lib/Controller/BoardController.php:54 update(..., bool archived) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:62-68 'Archive board' and :54-60 'Unarchive board' actions calling archiveBoard/unarchiveBoard (:364-370); lib/Controller/BoardController.php:54 update(id, title, color, archived)", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu ; source read at v1.2.54: app/Template/project/sidebar.php:59 'Close this project', :62 'Open this project'; app/Controller/ProjectStatusController.php:28 enable, :57 disable; app/Model/ProjectModel.php:539 enable, :555 disable; app/Template/project_list/project_icons.php:20 closed marker", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:141-148 'Archive' item needs archive_project; :153-161 'Unarchive' item (admin only); app/controllers/projects/archive_controller.rb:38-43 create archives, destroy unarchives; config/routes.rb:447", "jira": "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only", "plane": "corpus: plane/round4/menu-tree.md workspace 'Archives' ; source: apps/api/plane/db/models/project.py:114 archived_at, apps/api/plane/app/urls/project.py:123-125 ProjectArchiveUnarchiveEndpoint (archive and unarchive)" @@ -404,7 +447,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'deletedAt on cards, stacks, boards and attachments; trashRetentionHours' ; journeys.md 6 trash purge ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:144-148 'Delete board' with an undo (:8-15); lib/Service/BoardService.php:288-296 delete() sets deletedAt (manage permission), :318 deleteUndo; lib/Cron/DeleteCron.php:63-69 purges after the trash retention; lib/Db/BoardMapper.php:519-531 deleting a board deletes its ACL, stacks and their cards", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Remove' under Configure this project", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Remove' under Configure this project ; source read at v1.2.54: app/Template/project/sidebar.php:67 'Remove' under the project menu; app/Controller/ProjectStatusController.php:87 remove; app/Model/ProjectModel.php:499-517 removes project and task files then the project; app/Schema/Sqlite.php:1556 tasks FOREIGN KEY(project_id) ON DELETE CASCADE", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Copy project, Delete project' ; source read at v17.8.0: app/components/projects/row_actions_component.rb:202-211 'Delete' row action (admin only) opens confirm_destroy; app/controllers/projects_controller.rb:153-165 destroy schedules deletion; app/services/projects/delete_service.rb:54-58 before_perform deletes members, work packages and storages, and descendants (:39)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy'", "plane": "corpus: plane/round4/code-census.md §2 soft delete via deleted_at, hard delete nightly by bgtasks/deletion_task.hard_delete ; source: apps/api/plane/bgtasks/deletion_task.py:18 soft_delete_related_objects cascades to the project's rows" @@ -430,11 +473,11 @@ "nextcloud-deck": "yes", "openproject": "yes", "plane": "yes", - "kanboard": "yes", + "kanboard": "partial", "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards and Shared under each)' ; source: src/components/navigation/AppNavigation.vue:28 route /board/archived ; source read at v1.19.0: src/components/navigation/AppNavigation.vue:19 'All boards', :28-31 'Archived boards' (/board/archived), :37-40 'Shared with you'; src/router.js:63-72 boards.archived and boards.shared routes; lib/Controller/BoardController.php:54 archived flag on the board", - "kanboard": "source: app/Filter/ProjectStatusFilter.php status filter on the project list, app/Template/project_list/sort_menu.php:11 sort by Status ; corpus: kanboard/round4/menu-tree.md 'Projects management'", + "kanboard": "source: app/Filter/ProjectStatusFilter.php status filter on the project list, app/Template/project_list/sort_menu.php:11 sort by Status ; corpus: kanboard/round4/menu-tree.md 'Projects management' ; 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; app/Template/project_list/sort_menu.php:11 sort by 'Status' (is_active); app/Filter/ProjectStatusFilter.php:14 exists but grep of app/ for 'ProjectStatusFilter' finds no caller, so no page filters projects by status", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:117-135 filters 'Active projects', 'Archived projects', 'Project status - On track / Off track / At risk' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/menus/projects/menu.rb:87 'Archived projects' static list for admins; app/models/project_queries/static.rb:101-102 archived list filters active = false; app/models/queries/projects/filters/active_filter.rb:31 active filter; app/models/queries/projects/filters/project_status_filter.rb:35 status filter over app/models/project.rb:218-225 on_track, at_risk, off_track, not_started, finished, discontinued", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'A Jira project can only belong to one category'; 'An archived project will no longer appear in Jira' (archived projects page); no project status field to filter on", "plane": "source: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects' ; corpus: plane/round4/menu-tree.md 'Archives'" @@ -464,7 +507,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: lib/Service/BoardService.php:188-217 create() inserts default labels only and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board alone ; corpus: nextcloud-deck/round4/journeys.md 1 four lists added by hand ; source read at v1.19.0: lib/Service/BoardService.php:188-217 create() inserts four default labels ('Finished', 'To review', 'Action needed', 'Later') and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board only; searched BoardService create for 'Stack', 'stackMapper->insert': none", - "kanboard": "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings'", + "kanboard": "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings' ; source read at v1.2.54: app/Template/config/project.php:11-12 'Default columns for new projects (Comma-separated)'; app/Model/BoardModel.php:23 default Backlog, Ready, Work in progress, Done; :34 reads board_columns when a project is created", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'In an Action board each list represents a value of an attribute ... the Status board includes a list for the status New and a list for the status In Progress' (columns generated from statuses); Boards free (corpus: openproject/round4/menu-tree.md global 'Boards', not EE) (cited source paths checked present at the released v17.8.0 tag.) ; 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 basic, status, assignee, version, subproject, subtasks; modules/boards/app/services/boards/status_board_create_service.rb:11-17 a new Status board gets one list, Status.default; app/services/projects/copy/boards_dependent_service.rb:32-38 only a template or copy carries a prepared board set; a new blank project has no board", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types')", "plane": "corpus: plane/round4/code-census.md §2 'DEFAULT_STATES at state.py:24-62 seeds five plus triage'; states are the board columns" @@ -498,7 +541,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' in Db/ return 0 ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'billing', 'hourly', 'fixed price': none; lib/Db/Board.php:34-53 holds no commercial field", - "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal' 26 hits 'none is a payment', 'currencies is a rate table for the task score' ; no budget or billing field on a project", + "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal' 26 hits 'none is a payment', 'currencies is a rate table for the task score' ; no budget or billing field on a project ; source read at v1.2.54: searched app/ (outside Locale) for 'budget', 'hourly', 'billing', 'fixed price': none; app/Schema/Sqlite.php:1526-1530 projects table and later ALTERs add no money field", "openproject": "corpus: openproject/round4/menu-tree.md project 'Budgets'; docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:11 'create and manage a project budget ... planned unit costs as well as labor costs'; no fixed-price or hourly billing term field (project attributes could hold it, corpus: openproject/round4/M1-column.md 11.23) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31 budgets resources; modules/budgets/app/models/budget.rb:59 subject, fixed_date required; :108 budget = base_amount + material + labor; :138 base_amount; searched app and modules for 'fixed_price', 'fixed.price', 'billing_type': none, so no delivery or billing term field", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'the integrations page lists test management, source control and collaboration tools and nothing financial'; no budget or billing term on a project; only a custom field on issues (corpus: jira-data-center/round4/M1-column.md 2.2)", "plane": "corpus: plane/round4/code-census.md §2 fixed field list and 'no custom fields on any object'; no budget or billing field on Project (project.py:68-117); 'no Time tracking' (menu-tree.md)" @@ -531,7 +574,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' (nearest: remote ACL type 6, code-census.md federation row) ; source read at v1.19.0: the only non-account readers are federated users: lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE and lib/Controller/BoardOcsController.php:37-38 PublicPage read serves a federation token, not a portal; searched src/router.js for 'public', 'portal', 'share/': none", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'There is no customer or citizen interface' (nearest: a project-viewer account or the public read-only board)", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'There is no customer or citizen interface' (nearest: a project-viewer account or the public read-only board) ; source read at v1.2.54: searched app/Template and app/Controller for 'portal', 'contractor', 'customer', 'client': only mail and password reset hits; nearest is a project-viewer account, app/Core/Security/Role.php:20, or the public board, app/ServiceProvider/AuthenticationProvider.php:153 BoardViewController readonly", "openproject": "corpus: openproject/round4/M1-column.md 6.7 'there is no citizen portal'; nearest is per-item sharing, Enterprise gated (corpus: openproject/round4/M1-column.md 3.19 work_package_sharing) ; source read at v17.8.0: searched app, modules/*/app and config/locales/en.yml for 'portal': only a UI modal portal element, app/views/layouts/base.html.erb:63; nearest is per work package sharing, app/models/sharing_strategies/work_package_strategy.rb:109 gated on :work_package_sharing", "jira": "corpus: jira-data-center/round4/M1-column.md 6.7 'The customer portal is JSM DC, a separate licence'; 3.19 'a partner needs an account and a licence'", "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when guest_view_all_features is false a guest sees only items they own or are assigned'; an outsider needs a Plane login in the main app, there is no separate portal" @@ -561,7 +604,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'template beyond the import config schema' ; nearest is Clone board (prj-copy) ; source read at v1.19.0: searched lib/ and src/ for 'template' as a board feature: only psalm @template tags and lib/Provider/DeckProvider.php:94 SearchTemplate; nearest is clone board clone at appinfo/routes.php:31 and import at appinfo/routes.php:34", - "kanboard": "source: app/Template/project_creation/create.php:23 'Create from another project' with components chosen, app/Model/ProjectDuplicationModel.php:43-55 swimlanes, board columns, categories, roles, actions, tags, filters, tasks ; corpus: kanboard/round4/menu-tree.md 'Duplicate'", + "kanboard": "source: app/Template/project_creation/create.php:23 'Create from another project' with components chosen, app/Model/ProjectDuplicationModel.php:43-55 swimlanes, board columns, categories, roles, actions, tags, filters, tasks ; corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source read at v1.2.54: app/Template/project_creation/create.php:23-40 'Create from another project' with Categories, Tags, Actions, Custom filters, Tasks checkboxes; app/Model/ProjectDuplicationModel.php:43-57 swimlanes and board columns always copied, :102-118 loop", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project templates'; corpus: openproject/round4/M1-column.md 3.10 'applying a project template (app/models/project.rb:110)'; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-templates (copies work packages, boards, wiki, members); no labels object exists (categories copy) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/template_select_component.html.erb:39 template picker on new project; app/controllers/projects_controller.rb:106-115 new/create from template; app/controllers/projects/templated_controller.rb:35-41 mark a project as template; app/services/projects/copy/boards_dependent_service.rb:32, app/services/projects/copy/work_packages_dependent_service.rb:32 and the categories dependent service copy boards, categories, work packages", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes' (schemes only, no tasks or labels copied)", "plane": "corpus: plane/round4/open-core.md 'Project Templates' listed under Business ; code-census.md §1 'Templates: absent from the backend', create-project-modal.tsx:29 templateId threaded to a no-op provider. Paid tier only, absent from Community" @@ -590,7 +633,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.9 'card#clone and board#clone (appinfo/routes.php:31)' ; source: src/components/navigation/BoardCloneModal.vue options with cards, assignments, labels, due dates ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:52 'Clone board' opens src/components/navigation/BoardCloneModal.vue:9-32 'Clone cards', 'Clone assignments', 'Clone labels', 'Clone due dates', 'Move all cards to the first list'; lib/Service/BoardService.php:607 clone() and :767 cloneCards; appinfo/routes.php:31 board#clone", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source: app/Model/ProjectDuplicationModel.php:90 duplicate()", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source: app/Model/ProjectDuplicationModel.php:90 duplicate() ; source read at v1.2.54: app/Template/project/sidebar.php:52 'Duplicate'; app/Template/project_view/duplicate.php:26 Duplicate button; app/Controller/ProjectViewController.php:150 doDuplication; app/Model/ProjectDuplicationModel.php:90 duplicate", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings > Copy project'; corpus: openproject/round4/M1-column.md 2.9 copy service carries watchers, attachments ; source read at v17.8.0: app/components/projects/row_actions_component.rb:165-166 'Copy' row action needs copy_projects; config/initializers/permissions.rb:261-263 copy_projects permission; app/controllers/projects_controller.rb:131-140 copy enqueues Projects::EnqueueCopyService with chosen dependencies; app/services/projects/copy/work_packages_dependent_service.rb:118-127 relations are copied too", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Create with shared configuration ... use that project's schemes' is the only reuse; corpus: jira-data-center/round4/M1-column.md 11.2 issues move only with the whole-instance XML backup or a project import", "plane": "corpus: plane/round4/menu-tree.md has no copy action ; source: grep -niE 'duplicate|clone|copy' apps/api/plane/app/urls/project.py returns only the licence header line" @@ -619,7 +662,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'typed fields ... there is no schema' ; source: lib/Db/Board.php fields ; source read at v1.19.0: lib/Db/Board.php:34-53 fixed columns only; searched lib/ and src/ for 'custom field', 'customField', 'custom_field': none", - "kanboard": "corpus: kanboard/round4/code-census.md 'metadata without a screen: project_has_metadata' ; open-core.md 'MetaMagik for typed custom fields' is a third-party plugin", + "kanboard": "corpus: kanboard/round4/code-census.md 'metadata without a screen: project_has_metadata' ; open-core.md 'MetaMagik for typed custom fields' is a third-party plugin ; source read at v1.2.54: app/Api/Procedure/ProjectMetaDataProcedure.php:15 key-value project metadata over the API only; app/Controller/ProjectViewController.php:79 the only screen passes metadata to plugin integration forms, app/Template/project_view/integrations.php:12 'There is no integration registered'; typed custom fields are the third-party MetaMagik plugin", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields' ; source read at v17.8.0: config/routes.rb:789 admin project_custom_fields resources; config/initializers/menus.rb:777 project settings 'Project attributes'; app/models/project_custom_field.rb:58-66 visibility with admin_only fields; config/locales/en.yml:3575 'Project attributes'", "jira": "corpus: jira-data-center/round4/M1-column.md 11.23 projects have categories only; custom field contexts are 'a combination of projects and issue types where that field can be used' (2.2): fields live on issues, not projects", "plane": "corpus: plane/round4/code-census.md §2 'the community edition has no custom fields on any object'; menu-tree.md 'no Custom fields or properties anywhere'" @@ -648,7 +691,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "source: lib/Db/Board.php has no parent field ; corpus: nextcloud-deck/round4/menu-tree.md a flat list of boards ; source read at v1.19.0: lib/Db/Board.php:34-53 no parent field; searched lib/Db and src/ for 'parentId', 'parent_id', 'subboard': only a comment reply parentId in src/services/CommentApi.js:27", - "kanboard": "source: grep -niE 'parent' app/Model/ProjectModel.php returns 0 hits; corpus: kanboard/round4/menu-tree.md flat project list", + "kanboard": "source: grep -niE 'parent' app/Model/ProjectModel.php returns 0 hits; corpus: kanboard/round4/menu-tree.md flat project list ; source read at v1.2.54: searched app/Model/ProjectModel.php and app/Schema/Sqlite.php for 'parent' on projects: none; app/Schema/Sqlite.php:1526-1530 projects table has no parent column", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:64-65 'New subproject' needs add_subprojects; app/contracts/projects/base_contract.rb:45-46 parent attribute validated as assignable; app/contracts/projects/create_contract.rb:43-44 portfolio and program workspaces need the :portfolio_management Enterprise token, plain subprojects do not", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy'; corpus: jira-data-center/round4/M1-column.md 11.21 Advanced Roadmaps hierarchy 'Standard issue types are placed above the epic level (commonly Initiative ...)' groups issues, not projects", "plane": "corpus: plane/round4/code-census.md §2 Project model lists no parent; 'teamspace' grep 0 hits (Teamspaces are Pro) ; source: grep -n parent apps/api/plane/db/models/project.py shows no parent project FK" @@ -677,7 +720,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Open details for the board's sidebar with sharing, tags, deleted items and the activity stream' ; no description or progress on a board (lib/Db/Board.php) ; source read at v1.19.0: src/components/board/BoardSidebar.vue:11-42 the board details sidebar has tabs 'Sharing' (members), 'Tags', 'Deleted items', 'Activity' and no description or progress; lib/Db/Board.php:34-53 no description field; src/router.js:94 /board/:id/details", - "kanboard": "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity", + "kanboard": "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity ; source read at v1.2.54: app/Template/project_overview/show.php:3-8 column task counts, description, activity; app/Template/project_overview/information.php:10-15 members by role, :22-26 start and end date; app/Controller/ProjectOverviewController.php:16 show", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews ; source read at v17.8.0: modules/overviews/config/routes.rb:6-7 project overview at the project root; modules/overviews/lib/overviews/grid_registration.rb:16 'project_description', :26 'project_status', :46 'members' default widgets; modules/overviews/app/components/overviews/overview_grid_component.rb renders them", "jira": "docs: project 'Summary' / project page is not in the corpus; corpus: jira-data-center/round4/M1-column.md 10.2 dashboards with gadgets can be built per project ('multiple dashboards for different projects'); no built-in overview with members and progress documented", "plane": "source: no overview route under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ (archives, cycles, intake, issues, modules, pages, views only); the project card shows description and member count (apps/web/core/components/project/card.tsx:285-292). Project updates are a paid string never emitted (corpus: plane/round4/code-census.md opening section, is_project_updates_enabled 0 hits)" @@ -707,7 +750,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/promoted row 11.26 in _round4/compare/promoted-rows-batch6.md 'no knowledge base; the platform's Collectives is a store app' ; source read at v1.19.0: searched lib/ and src/ for 'wiki', 'collectives', 'page': no knowledge pages; nearest is file attachments on a card and the related resources panel in src/components/board/SharingTabSidebar.vue:82 NcRelatedResourcesPanel", - "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 11.26 'grep knowledge|faq|wiki returns 0. The nearest thing is a project file'", + "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 11.26 'grep knowledge|faq|wiki returns 0. The nearest thing is a project file' ; source read at v1.2.54: searched app/ (outside Locale) for 'wiki', 'knowledge': none; nearest are project attachments, app/Template/project_overview/attachments.php:6 'Upload a file'", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Wiki'; corpus: openproject/round4/M1-column.md 9.1 wiki pages searchable (wiki_page.rb:52) ; source read at v17.8.0: lib/redmine/menu_manager/wiki_menu_helper.rb:30-34 builds the project Wiki menu when the module is on; config/routes.rb:496-500 project wiki resources with new page; app/models/wiki_page.rb:31, :52 wiki pages are searchable", "jira": "corpus: jira-data-center/round4/M1-column.md 1.9 'Integrating with Confluence Give your team the ability to share, discuss and work with Jira application issues in Confluence': wiki is a separate product (Confluence)", "plane": "corpus: plane/round4/menu-tree.md 'Pages the only feature toggle that defaults on' ; code-census.md §4 Page with versioning, linked to projects via ProjectPage. 'Wikis' as a distinct object and 'Nested Pages' are paid (open-core.md)" @@ -736,7 +779,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 1 'then the group vergunningen with edit' ; code-census.md Acl participant type group or team ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:30-31 shares shown as '(Group)' and '(Team)'; lib/Db/Acl.php:37 PERMISSION_TYPE_GROUP and :39 PERMISSION_TYPE_CIRCLE; lib/Service/BoardService.php:419 addAcl(boardId, type, participant, ...)", - "kanboard": "corpus: kanboard/round4/journeys.md 5 'createGroup Bouwtoezicht, addGroupMember carol, addProjectGroup(project-member): carol read the task'", + "kanboard": "corpus: kanboard/round4/journeys.md 5 'createGroup Bouwtoezicht, addGroupMember carol, addProjectGroup(project-member): carol read the task' ; source read at v1.2.54: app/Template/project_permission/groups.php:38-48 add group form with group autocomplete, :29 remove; app/Controller/ProjectPermissionController.php:154-168 addGroup with a role", "openproject": "corpus: openproject/round4/M1-column.md 13.6 'a Group can be given a membership, so group-based visibility works' ; source read at v17.8.0: app/models/member.rb:40 a member is any principal; app/models/group.rb:31 Group < Principal; app/services/members/create_service.rb:49-55 adding a Group as member creates inherited memberships for its users; config/initializers/menus.rb:752 project Members page", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects'", "plane": "corpus: plane/round4/code-census.md §5 membership is per user, 'teamspace' grep 0 hits; M1-column.md 2.5 'assignees are individual users'. Teamspaces are a Pro string (open-core.md)" @@ -765,7 +808,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' ; M1-column.md 1.1 no PublicPage on a card route ; source read at v1.19.0: searched src/router.js and appinfo/routes.php for a public board or link share route: none; lib/Controller/BoardOcsController.php:37-38 PublicPage read serves federated remote boards, see lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE, which requires an account on another server", - "kanboard": "corpus: kanboard/round4/journeys.md 6 'Enable public access ... the read-only board ... answered 200 without a session' ; menu-tree.md Public", + "kanboard": "corpus: kanboard/round4/journeys.md 6 'Enable public access ... the read-only board ... answered 200 without a session' ; menu-tree.md Public ; source read at v1.2.54: app/Template/project_view/share.php:19 'Enable public access', :10 'Public link'; app/ServiceProvider/AuthenticationProvider.php:153 BoardViewController readonly open to Role::APP_PUBLIC; app/Controller/BoardViewController.php:22 readonly; app/Model/ProjectModel.php:571 enablePublicAccess", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:105 'Make a project public'; corpus: openproject/round4/M1-column.md 4.21 'a public project, which exposes the whole project to anonymous users' (read-only follows the Anonymous role's permissions) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:177-178 'Make public' row action needs edit_project; app/models/project.rb:202 public_projects scope; :228 visible? is true for a public project to any user including anonymous, whose rights come from the Anonymous role, app/models/anonymous_user.rb:34", "jira": "corpus: jira-data-center/round4/M1-column.md 4.21 'you need to allow anonymous users to browse, search, and create issues in that project' (Allowing anonymous access to your project); browse without create is the read-only variant", "plane": "corpus: plane/round4/code-census.md §6 'DeployBoard publishes an entity behind a random anchor', TYPE_CHOICES include project, view, page; space viewsets set AllowAny (space/views/project.py:20) ; journeys.md siblings of intake 'got past authentication'" @@ -794,7 +837,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'Deck is a kanban board inside Nextcloud: boards with columns, cards' ; menu-tree.md 'The board, as it opens' ; source read at v1.19.0: src/components/board/Board.vue:61-75 stacks rendered as draggable columns, src/components/board/Stack.vue:104-122 cards inside each stack; lib/Db/Stack.php:28-35 a stack has title, board, order and isDoneColumn; appinfo/routes.php:37-43 stack routes", - "kanboard": "corpus: kanboard/round4/usability.md 'Kanboard is a Kanban board with a task behind every card' ; menu-tree.md 'Overview · Board · List'", + "kanboard": "corpus: kanboard/round4/usability.md 'Kanboard is a Kanban board with a task behind every card' ; menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: app/Controller/BoardViewController.php:56 show; app/Template/board/table_container.php:14 the board with its save url; app/Template/board/table_column.php:12 columns with task counts", "openproject": "corpus: openproject/round4/menu-tree.md global 'Boards' and project 'Work packages list, plus Gantt, board and calendar views'; boards_view is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md); docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:11 'OpenProject Agile boards ... Boards consist of lists (columns) and cards (work packages)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/config/routes.rb:2-13 global and project boards; modules/boards/app/controllers/boards/boards_controller.rb:120-129 basic and action board types; frontend/src/app/features/boards/board/board-list/board-list.component.html:22 a list per query; searched modules/boards for 'enterprise', 'allows_to': none, action boards free since 17.3", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Click Create a Kanban board'", "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in a spreadsheet, board, calendar or gantt layout. That path is fast, clean and well made'" @@ -824,7 +867,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'a stack is a column you drag a card into' (open-core.md 2.7 row) ; M1-column.md 2.6 'one card at a time is dragged' ; source read at v1.19.0: src/components/board/Stack.vue:104-114 vue-smooth-dnd Container with @drop onDropCard (:277); appinfo/routes.php:52 card#reorder moves a card to another stack and order", - "kanboard": "corpus: kanboard/round4/usability.md 'the board, its columns and swimlanes' ; journeys.md 1 moveTaskPosition (the API behind the drag)", + "kanboard": "corpus: kanboard/round4/usability.md 'the board, its columns and swimlanes' ; journeys.md 1 moveTaskPosition (the API behind the drag) ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:19 sortable columns, :37 save on drop, :72 posts to the board save url; app/Template/board/table_container.php:14 data-save-url; app/Controller/BoardAjaxController.php:22 save", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list or to a new list. Remember: Moving cards to another list in an Action board will update their attributes, e.g. status' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-card-view.component.ts:265 handleDrop; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165 cross-list drop; frontend/src/app/features/boards/board/board-actions/board-action.service.ts:280 assignToWorkPackage writes the list's attribute (status, assignee, version) to the moved card", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints section (cards moved between columns); corpus: jira-data-center/round4/M1-column.md 3.18 'you can drag and drop them'; board drag is the documented move", "plane": "corpus: plane/round4/journeys.md board layout driven ; source: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable() from pragmatic-drag-and-drop; the workflow gate is the no-op hook (code-census.md opening section, use-workflow-drag-n-drop.ts:10-23), so every drop is accepted" @@ -854,7 +897,7 @@ "jira": "unknown", "evidence": { "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue:113-123 arrow keys move focus between cards, src/components/cards/CardItem.vue:283 'KeyM' opens the card menu with Move card (corpus: nextcloud-deck/round4/menu-tree.md 'The action menu: Mark as done, Move card') ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:118-129 arrow keys move focus between cards; src/components/cards/CardItem.vue:306-307 'KeyM' opens the card menu; src/components/cards/CardMenuEntries.vue:53-57 'Move/copy card' opens src/CardMoveDialog.vue:6-18 'Select a board', 'Select a list'", - "kanboard": "source: app/Template/task/sidebar.php:86 'Move position' dialog on the task page is a keyboard-usable form; app/Template/config/keyboard_shortcuts.php lists no card focus or move key on the board", + "kanboard": "source: app/Template/task/sidebar.php:86 'Move position' dialog on the task page is a keyboard-usable form; app/Template/config/keyboard_shortcuts.php lists no card focus or move key on the board ; source read at v1.2.54: app/Template/task/sidebar.php:86 'Move position' on the task page only; app/Template/task_move_position/show.php:7-15 swimlane, column and position selects; app/Controller/TaskMovePositionController.php:33 save; app/Template/config/keyboard_shortcuts.php:11-15 board keys are n, s, c only, no card focus or move key", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniE 'keydown|keyboard|hotkey' frontend/src/app/features/boards returns only board-list-container.component.html:46 '(keydown.enter)=addList(board)'; cards move through WorkPackageCardDragAndDropService (drag only). The card's status can be changed from the card itself (agile-boards README:156 'update a work package's status directly in the card'), which is keyboard reachable on a Status board only ; source read at v17.8.0: searched frontend/src/app/features/boards and frontend/src/app/shared/directives/sortable-lists for 'keydown', 'keyboard', 'ArrowUp': only frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:46-47 Enter or Space on 'Add list'; cards move by drag only", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html only says app-specific shortcuts appear in the in-product dialog (Shift + /); the board shortcut list is not in the documentation and no instance was available", "plane": "source: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:216 shortcut \"s\" opens the state menu for the focused work item in the command palette, so a state (column) change works from the keyboard once the item is open; no keyboard move on the board itself found (kanban/block.tsx is pointer drag only). Not driven in round 4" @@ -883,7 +926,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: lib/Db/Stack.php carries title, order, isDoneColumn and no limit; corpus: nextcloud-deck/round4/code-census.md 'Stack with order and isDoneColumn' ; source read at v1.19.0: lib/Db/Stack.php:28-35 title, boardId, order, isDoneColumn and no limit; searched lib/ and src/ for 'wip', 'limit' on stacks, 'max_cards': none. 1.19.0 only shows a card count beside the list title, CHANGELOG.md:10 and src/components/board/Stack.vue:18", - "kanboard": "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded'", + "kanboard": "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded' ; source read at v1.2.54: app/Template/column/index.php:19 'Task limit' column setting; app/Template/board/table_column.php:113-114 count over limit in the header; app/Template/board/table_tasks.php:6 board-task-list-limit class when the column is over its limit", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'wip.limit|work.in.progress|max_cards|card_limit' over app, modules and frontend/src hits only GitLab merge-request 'work in progress' handling (modules/gitlab_integration/...upsert_merge_request.rb); agile-boards README documents no list limit ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'wip_limit', 'wip.limit', 'max_cards', 'card_limit': none; a list is a saved query with a name only, frontend/src/app/features/boards/board/board-list/board-list.component.html:22", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints)", "plane": "source: grep -rniE 'wip|max_issues|column_limit|issue_limit' --include=*.py apps/api returns only an unrelated test comment; corpus: plane/round4/code-census.md §2 State fields are name, description, color, slug, sequence, is_triage, default (no limit)" @@ -916,7 +959,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add list ... each with Add card and an Actions menu (rename, reorder, mark as done column, delete)' ; source read at v1.19.0: src/components/Controls.vue:39-56 'Add list', src/components/board/Stack.vue:43 'Edit list title', :69 'Delete list'; src/components/board/Board.vue:61-67 lists are draggable with @drop onDropStack; appinfo/routes.php:38-41 stack create, update, reorder, delete", - "kanboard": "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns'", + "kanboard": "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns' ; source read at v1.2.54: app/Template/column/index.php:5 'Add a new column', :29 'Change column position' drag handle, :34 Edit, :38 Remove; app/Controller/ColumnController.php:60 save, :114 update, :151 move, :186 remove", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:45-50 'Add list'; :7-10 drag lists to reorder (moveList); frontend/src/app/features/boards/board/board-list/board-list.component.html:22-25 rename a list inline; frontend/src/app/features/boards/board/board-list/board-list-menu.component.ts:66 'Delete list'", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header'", "plane": "corpus: plane/round4/menu-tree.md 'Settings ... States' ; code-census.md §2 State per project with name, color, sequence; 'Groups are not user-definable' (six fixed groups), so columns within groups are free" @@ -946,7 +989,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'mark as done column' ; source: lib/Service/CardService.php:454-455 a card moved into the done column gets setDone ; source read at v1.19.0: src/components/board/Stack.vue:66 list menu 'Set cards as \"done\"'; lib/Db/Stack.php:35 isDoneColumn; lib/Service/CardService.php:454-462 a card moved into the done list gets setDone, leaving it clears done; appinfo/routes.php:158 stack_ocs#setDoneStack", - "kanboard": "corpus: kanboard/round4/journeys.md 2 'createAction(project 1, task.move.column, TaskCloseColumn, column_id 4) ... is_active 0' : done is an automatic action per project, not a column flag", + "kanboard": "corpus: kanboard/round4/journeys.md 2 'createAction(project 1, task.move.column, TaskCloseColumn, column_id 4) ... is_active 0' : done is an automatic action per project, not a column flag ; source read at v1.2.54: app/Action/TaskCloseColumn.php:13,76 an automatic action closes a task moved into a chosen column; searched app/Schema/Sqlite.php for 'is_done', 'done_column': no done flag on columns", "openproject": "Status board columns are statuses and a status carries is_closed (corpus: openproject/round4/M1-column.md 2.7 'app/models/status.rb:31 ... is_closed (used at work_package.rb:105)'); the column itself is not marked done, closure comes from the status it maps to, and Basic board columns change nothing (agile-boards README:55) ; source read at v17.8.0: app/models/work_package.rb:276 closed? comes from status.is_closed?; modules/boards/app/services/boards/status_board_create_service.rb:11-12 a Status board list is a status_id filter, so a list counts as done only through its status; searched frontend/src/app/features/boards for a done or closed flag on a list: none", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses'", "plane": "corpus: plane/round4/code-census.md §2 'A state change to a completed group state sets Issue.completed_at (issue.py:236-249)'; the completed group is fixed rather than chosen, but any state placed in it counts as done" @@ -976,7 +1019,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md filter 'title: description: list: tag: assigned: date:' ; a card has no priority (open-core.md 'a card is title, description, date, labels, assignees') ; source read at v1.19.0: src/components/Controls.vue:104 'Filter by tag', :115 'Filter by assigned user', :139 'Filter by status', :172 'Filter by due date', :65-74 board filter text field; lib/Db/Card.php has no priority field, searched lib/Db and src/ for 'priority': none, so assignee and label yes, priority no", - "kanboard": "corpus: kanboard/round4/usability.md 'one query language with twenty-five attributes runs the board' ; source: app/Filter/TaskPriorityFilter.php, assignee and tag filters in app/Filter/", + "kanboard": "corpus: kanboard/round4/usability.md 'one query language with twenty-five attributes runs the board' ; source: app/Filter/TaskPriorityFilter.php, assignee and tag filters in app/Filter/ ; source read at v1.2.54: app/Template/app/filters_helper.php:6-15 filter menu 'My tasks', 'Not assigned', 'Tasks due today'; app/ServiceProvider/FilterProvider.php:148 TaskAssigneeFilter, :156 TaskPriorityFilter, :223 TaskTagFilter in the board query lexer", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/features/boards/board/board-filter/board-filter.component.html '' with board-filters.service.ts building ApiV3 filters (assignee, type, priority, any work package filter corpus: openproject/round4/M1-column.md 9.2) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filter.component.html:1 '' the full work package filter set (assignee, type, priority, ...); frontend/src/app/features/boards/board/board-filter/board-filters.service.ts builds the ApiV3 filters saved on the board", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board'; default 'Only My Issues' and 'Recently Updated', each a JQL (assignee, labels, priority)", "plane": "corpus: plane/round4/usability.md 'Layouts, filtering, the command palette ... are all good' ; code-census.md §9 IssueView filters; source: packages/constants/src/issue/filter.ts 'issues' page filters include assignees, labels, priority" @@ -1006,7 +1049,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/Controls.vue view modes are 'Kanban view' and 'Gantt view' only (viewMode values kanban, gantt), plus 'Toggle compact mode'; corpus: nextcloud-deck/round4/menu-tree.md says 'the view modes (board and list)', which the tag's source does not bear out; the nearest list is 'Upcoming cards' across boards (menu-tree.md) ; source read at v1.19.0: src/components/Controls.vue:235-249 view modes 'Kanban view' and 'Gantt view', :261 'Toggle compact mode'; src/components/board/Board.vue:52 GanttView when viewMode is gantt; searched src/ for a list or table view mode: none", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Overview · Board · List'", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: app/Template/project_header/views.php:12 'Board', :18 'List' with the same search; app/Controller/TaskListController.php:21 show", "openproject": "corpus: openproject/round4/menu-tree.md 'Work packages list, plus Gantt, board and calendar views' over the same work packages ; source read at v17.8.0: frontend/src/app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive.ts:79 card view and :99 list view of the same query; frontend/src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service.ts:35-36 'list'|'card'; a board's lists are work package queries over the same records", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'base your board on an existing Saved Filter'; the same filter opens as a list in the issue navigator (corpus: jira-data-center/round4/M1-column.md 9.3, 9.5 column chooser)", "plane": "corpus: plane/round4/menu-tree.md 'spreadsheet, board, calendar, gantt and list layouts'" @@ -1036,7 +1079,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels, the due badge, assignee avatars' ; source: src/components/cards/CardBadges.vue has no dependency or blocked badge ; source read at v1.19.0: src/components/cards/CardItem.vue:50-54 labels on the card, src/components/cards/CardBadges.vue:9 due date badge, :24 checklist, :33 attachments, :40 assignee avatars; searched CardBadges.vue for 'depend', 'blocked': none, so no blocked state", - "kanboard": "source: app/Template/board/task_footer.php:24-28 tags, :62-74 due date, :135 priority, app/Template/board/task_private.php:29 assignee; blocked shows only as a link count icon (:89-90) with a tooltip ; corpus: kanboard/round4/menu-tree.md board screenshot", + "kanboard": "source: app/Template/board/task_footer.php:24-28 tags, :62-74 due date, :135 priority, app/Template/board/task_private.php:29 assignee; blocked shows only as a link count icon (:89-90) with a tooltip ; corpus: kanboard/round4/menu-tree.md board screenshot ; source read at v1.2.54: app/Template/board/task_footer.php:24-28 tags, :62-74 due date coloured when overdue, :89-90 link count icon with tooltip, :135 priority; app/Template/board/task_private.php:29-31 assignee initials; no blocked marker, only the link count", "openproject": "Cards show type, subject, assignee avatar and dates, with highlighting by priority or type (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/.../highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'|'none'|'inline'); labels do not exist (corpus: openproject/round4/M1-column.md 2.8) and there is no blocked marker on a card (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html:121 'dueDate', :134 status button, :159-160 assignee avatar, :104-106 type; frontend/src/app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const.ts:31 priority or type highlight; searched that card template for 'blocked', 'blocks': none, and no label object exists", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards', 'Days in column shows dots on each card'; assignee avatar, flags and labels as a card field; blocked shown by the flag or a query colour ('One color per JQL query')", "plane": "source: packages/constants/src/issue/common.ts ISSUE_DISPLAY_PROPERTIES keys key, assignee, start_date, due_date, labels, priority, state, sub_issue_count, attachment_count, link, estimate, modules, cycle: no blocked indicator; grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits ; corpus: plane/round4/code-census.md §9 display_properties" @@ -1065,7 +1108,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md Card and Stack carry an order ; source: appinfo/routes.php card#reorder ; source read at v1.19.0: src/components/board/Stack.vue:104-114 drag within a list calls onDropCard; lib/Service/CardService.php:436 reorder(id, stackId, order); appinfo/routes.php:52 card#reorder", - "kanboard": "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php", + "kanboard": "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:37 save sends the new position; app/Controller/BoardAjaxController.php:18-46 saves task positions from the drag and drop; app/Template/task_move_position/show.php:14-15 'Insert before this task', 'Insert after this task'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:161-175 same-list drop is a pure reorder; lib/api/v3/queries/order/query_order_api.rb:34, :73 PATCH the manual order; app/models/ordered_work_package.rb:31-35 stored position", "jira": "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column)", "plane": "corpus: plane/round4/code-census.md §2 'sort_order float (:158)' on Issue ; source: kanban/block.tsx:206 drag within a group reorders by sort_order under manual ordering" @@ -1097,7 +1140,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'each with Add card' ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' in each list, :128-135 inline 'Card name' input; src/components/KeyboardShortcuts.vue:106-107 'KeyN' new card; appinfo/routes.php:47 card#create", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column ; source read at v1.2.54: app/Template/board/table_column.php:19 per column add button; app/Helper/TaskHelper.php:325-334 getNewBoardTaskButton 'Add a new task' opening TaskCreationController in that column; app/Template/board/table_column.php:35 'Create tasks in bulk'; app/Controller/TaskCreationController.php:51 save", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/add-card-dropdown/add-card-dropdown-menu.directive.ts:61 'Add new card' and :69 'Add existing'; config/locales/js-en.yml:189 'Add new card'; frontend/src/app/features/boards/board/board-list/board-inline-create.service.ts creates the card inside the list's query", "jira": "docs: inline create is documented on the backlog, not per board column; board cards come from the Create dialog (corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen'); not verified in a running instance", "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot per column ; corpus: plane/round4/menu-tree.md 'New work item' global create" @@ -1130,7 +1173,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source read at v1.19.0: src/router.js:55-60 /board route renders Boards with the ALL filter; src/components/boards/Boards.vue:9 'Search boards', :16-23 a table of every board with 'Board name' and 'Members'; src/components/navigation/AppNavigation.vue:19 'All boards'; appinfo/routes.php:20 board#index", - "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Dashboard' ; source: app/Template/config/keyboard_shortcuts.php 'Open board switcher'", + "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Dashboard' ; source: app/Template/config/keyboard_shortcuts.php 'Open board switcher' ; source read at v1.2.54: app/Template/dashboard/overview.php:45-47 every project on the dashboard with open task counts per board column, linking to its board; app/Controller/DashboardController.php:18 show; app/Template/header.php:18 board selector; app/Template/config/keyboard_shortcuts.php:27 'Open board switcher'", "openproject": "corpus: openproject/round4/menu-tree.md global module 'Boards' in the top-left grid lists boards across projects ; source read at v17.8.0: modules/boards/config/routes.rb:2-5 global boards index; modules/boards/lib/open_project/boards/engine.rb:63-80 top and global menu 'Boards'; modules/boards/app/controllers/boards/boards_controller.rb:76-81 without a project it lists boards of every project allowed :show_board_views; modules/boards/app/views/boards/boards/index.html.erb:48 table of them", "jira": "docs: Jira Software 'View all boards' from the Boards menu; docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html boards span 'one or more projects'", "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) offers spreadsheet and list layouts only; profile_issues offers kanban of your own items grouped by state or project. No page with every project's board ; corpus: plane/round4/menu-tree.md 'Workspace: Projects, Views, Analytics, Archives'" @@ -1160,7 +1203,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "no WIP limit to enforce (brd-wip-limits) ; source: lib/Db/Stack.php ; source read at v1.19.0: no limit to enforce: lib/Db/Stack.php:28-35 has no limit field; lib/Service/CardService.php:436 reorder checks permission and archive state, searched it for 'limit', 'max': none", - "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 9.14 'task_limit ... and, verified live, does not refuse the move'", + "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 9.14 'task_limit ... and, verified live, does not refuse the move' ; source read at v1.2.54: searched app/Model, app/Controller, app/Validator and assets/js/src/BoardDragAndDrop.js for 'task_limit' and 'limit': only column storage, app/Model/ColumnModel.php:183-212; the limit only styles the column, app/Template/board/table_tasks.php:6 board-task-list-limit", "openproject": "no WIP limit exists (see brd-wip-limits grep), so nothing blocks a move ; source read at v17.8.0: no limit to enforce: searched app, lib, modules and frontend/src for 'wip_limit', 'max_cards', 'card_limit': none; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165-171 a cross-list drop has no capacity check", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints are informational: violations only colour the column red or yellow and do not prevent issues being moved into it", "plane": "no WIP limit exists (see brd-wip-limits); the drop gate is the hollow shim use-workflow-drag-n-drop.ts:10-23 'isWorkflowDropDisabled: false' (corpus: plane/round4/open-core.md shims table)" @@ -1189,7 +1232,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md the board is lists as columns only ; source: grep -rniF 'swimlane' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'swimlane', 'lane', 'groupBy': none; src/components/board/Board.vue:61-75 renders stacks as a single row of columns", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Swimlanes' ; code-census.md 'swimlanes SwimlaneModel' : swimlanes are named lanes a user places tasks in, not grouped automatically by assignee, priority or epic", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Swimlanes' ; code-census.md 'swimlanes SwimlaneModel' : swimlanes are named lanes a user places tasks in, not grouped automatically by assignee, priority or epic ; source read at v1.2.54: app/Template/swimlane/index.php:5 'Add a new swimlane'; app/Controller/SwimlaneController.php:57 save; app/Filter/TaskSwimlaneFilter.php:26 filter by swimlane; lanes are named and hand placed, nothing groups by assignee, priority or epic", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'swimlane' over the tree returns nothing; agile-boards README documents Basic and Action boards only ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'swimlane' (case-insensitive): none; board lists are laid out in one horizontal row, frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:9 cdkDropListOrientation horizontal", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane", "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx ; packages/constants/src/issue/filter.ts:237 sub_group_by options state, priority, cycle, module, labels, assignees, created_by. No epic swimlane because epics are unreachable (corpus: plane/round4/journeys.md epics 404)" @@ -1218,7 +1261,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' (personal and shared saved searches) ; source read at v1.19.0: searched lib/ and src/ for 'savedFilter', 'saveFilter', 'saved filter': none; src/components/Controls.vue:104-229 filter state lives in the page only, with 'Clear filter' at :229", - "kanboard": "corpus: kanboard/round4/journeys.md 5 'a custom filter Deze week te doen was saved as shared' ; code-census.md 'custom_filters.is_shared'", + "kanboard": "corpus: kanboard/round4/journeys.md 5 'a custom filter Deze week te doen was saved as shared' ; code-census.md 'custom_filters.is_shared' ; source read at v1.2.54: app/Template/custom_filter/create.php:14 'Share with all project members', :17 'Append filter'; app/Controller/CustomFilterController.php:57 save; app/ServiceProvider/AuthenticationProvider.php:95 open to project members", "openproject": "A board is itself a saved query and work package queries can be saved and shared (corpus: openproject/round4/M1-column.md 9.3, 9.4 'a query is public or private'); board filter state is saved with the board, no separate named filter set per board ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filters.service.ts keeps one filter set saved with the board; app/contracts/queries/base_contract.rb:37 public flag and :62, :79 manage_public_queries for shared work package queries; searched frontend/src/app/features/boards for a named saved filter per board: none", "jira": "corpus: jira-data-center/round4/M1-column.md 9.4 'Filters ... can be shared with other users, user groups, projects, and project roles'; docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters are saved per board for 'anyone else using this board'", "plane": "corpus: plane/round4/code-census.md §9 'a saved view can be shared (access = 1, the default) and it does carry its column set' ; menu-tree.md 'Views saved views'" @@ -1247,7 +1290,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels' ; M1-column.md 2.8 'labels per board with a colour' : labels are coloured chips, the card itself is not coloured by category ; source read at v1.19.0: per-card colour exists, which the drive evidence missed: src/components/cards/CardMenuEntries.vue:7-13 'Change card color' picker, src/components/cards/CardItem.vue:203 renders it, lib/Db/Card.php:75 color, lib/Service/CardService.php:292-294; the colour is set by hand, not derived from a label, type or category, so partial stands", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28 ; source read at v1.2.54: app/Template/task_creation/show.php:18 colour field; app/Template/board/task_private.php:5 card class color-id; app/Action/TaskAssignColorCategory.php:23 'Assign automatically a color based on a category'; app/Action/TaskAssignColorPriority.php:23; app/Template/board/task_footer.php:28 coloured tags", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/configuration-modal/tabs/highlighting-tab.component.html:13 'entire card by' with :26 type and :29 priority options; app/contracts/queries/base_contract.rb:42 highlighting_mode saved; searched app and lib for an Enterprise gate on highlighting: none, attribute highlighting released to Community in 17.1", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query'", "plane": "corpus: plane/round4/code-census.md §2 labels and states carry color; source: ISSUE_DISPLAY_PROPERTIES shows label and state chips on the card, no setting colours the whole card by label or type (no types exist, journeys.md)" @@ -1276,7 +1319,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: lib/Service/CardService.php:454-460 entering the done column marks the card done and leaving it clears done; no other action ; corpus: nextcloud-deck/round4/M1-column.md 3.9 'no' ; source read at v1.19.0: lib/Service/CardService.php:454-462 entering a done list marks the card done and leaving it clears done, set from src/components/board/Stack.vue:66; searched lib/ for other stack-entry side effects, 'rule', 'automation': none", - "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move'", + "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move' ; source read at v1.2.54: app/Template/action/index.php:5 'Add a new action'; app/Controller/ActionCreationController.php:102 save; app/Action/TaskAssignSpecificUser.php:36 on EVENT_MOVE_COLUMN, app/Action/TaskCloseColumn.php:35; app/Core/Action/ActionManager.php:126 attachEvents", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'Moving work packages (cards) between two lists will update them automatically' (status, assignee, version boards set that attribute); arbitrary actions on entry need custom actions, which are button-triggered and Enterprise gated (corpus: openproject/round4/M1-column.md 3.9) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-actions/board-action.service.ts:279-290 moving a card writes the list's one attribute (status, assignee, version, subproject, parent); app/controllers/custom_actions_controller.rb:34 richer multi-field custom actions are Enterprise gated and triggered by a button, not by entering a list", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation on 'issue transitioned' whose actions are 'editing issues, sending notifications, creating sub-tasks' and workflow post functions such as 'Assign to Current User' (3.8); a column maps to statuses (docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html)", "plane": "corpus: plane/round4/code-census.md §3 'The only automation engine in CE is two integer settings and one nightly job' (archive_in, close_in); 'Trigger And Action' (Pro) and 'Workflows + Approvals' (Business) are paid strings absent from Community (open-core.md)" @@ -1305,7 +1348,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Upcoming cards cards assigned to me across boards, by due date' is a list, not a board ; source read at v1.19.0: src/components/overview/Overview.vue:57-83 the Upcoming view groups my assigned cards from all boards into fixed due-date columns (Overdue, Today, Tomorrow, Next 7 days, Later, No due) with no drag between them; src/stores/overview.js:26 and lib/Controller/OverviewApiController.php:29 upcomingCards; no board that holds cards of several boards", - "kanboard": "corpus: kanboard/round4/menu-tree.md a board belongs to one project; Dashboard lists tasks across projects but no shared board", + "kanboard": "corpus: kanboard/round4/menu-tree.md a board belongs to one project; Dashboard lists tasks across projects but no shared board ; source read at v1.2.54: app/Controller/BoardViewController.php:56-69 show builds the board from one project, boardFormatter withProjectId; searched app/Controller for a multi-project board: none, the dashboard lists tasks across projects without a board", "openproject": "Action boards include a subproject board (docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards, create-subproject-board image) and boards are per project; no board over unrelated projects documented (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/app/models/boards/grid.rb:33 a board belongs_to one project; modules/boards/app/services/boards/subproject_board_create_service.rb:4-9 a Subproject board, lists per child project; frontend/src/app/features/boards/board/board-actions/subproject/subproject-action.service.ts:43 'onlySubproject' filter; searched modules/boards for a board over unrelated projects: none", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects' and 'base your board on an existing Saved Filter'", "plane": "source: packages/constants/src/issue/filter.ts my_issues layouts spreadsheet and list only (used by apps/web/core/components/workspace/views/form.tsx:148); profile_issues has kanban grouped by project for one person's items. Cross-project work is list-shaped, not a shared board" @@ -1334,7 +1377,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'A card becomes a case' ; menu-tree.md card action menu 'Delete' ; done or open is the status (code-census.md Card done, archived) ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' and :135 'Card name'; src/components/card/CardSidebar.vue:231-238 title edit; src/components/card/Description.vue description; src/components/cards/CardMenuEntries.vue:49 'Mark as done', :78 'Delete card'; lib/Controller/CardController.php:49 create, :67 update, :83 delete, :106 done", - "kanboard": "corpus: kanboard/round4/menu-tree.md task 'Edit the task ... Open this task / Close this task · Remove' ; journeys.md 1 createTask", + "kanboard": "corpus: kanboard/round4/menu-tree.md task 'Edit the task ... Open this task / Close this task · Remove' ; journeys.md 1 createTask ; source read at v1.2.54: app/Template/task/sidebar.php:36 'Edit the task', :92 'Close this task', :96 'Open this task', :102 'Remove'; app/Controller/TaskCreationController.php:51 save; app/Controller/TaskModificationController.php:83 edit; app/Controller/TaskSuppressionController.php:35 remove", "openproject": "corpus: openproject/round4/journeys.md 'Creating a work package, giving it a start date and a duration ... is the best-supported path'; corpus: openproject/round4/M1-column.md 1.2 work package create form; 2.17 delete service ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-new/wp-new-full-view.component.ts:35 create view; config/initializers/permissions.rb:324 add_work_packages, :333 edit_work_packages, :436 delete_work_packages; app/services/work_packages/create_service.rb, update_service.rb and delete_service.rb do the writes; app/models/work_package.rb:59 status", "jira": "corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen to open the Create issue dialog box'; 2.17 'Delete issues Permission'; statuses 2.7", "plane": "corpus: plane/round4/journeys.md 'create a work item, give it a state, a priority, assignees, labels, a start date and a target date' ; code-census.md §2 Issue fields" @@ -1364,7 +1407,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.4 'assignUser and unassignUser per card ... Verified live' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:17-18 'Assign a user to this card…' mounted from src/components/card/CardSidebarTabDetails.vue:15-19; lib/Controller/CardController.php:126 assignUser, lib/Service/AssignmentService.php:48", - "kanboard": "corpus: kanboard/round4/M1-column.md 2.4 'yes' ; journeys.md 5 ; source: app/Model/TaskCreationModel.php:67 owner_id", + "kanboard": "corpus: kanboard/round4/M1-column.md 2.4 'yes' ; journeys.md 5 ; source: app/Model/TaskCreationModel.php:67 owner_id ; source read at v1.2.54: app/Helper/TaskHelper.php:126-130 'Assignee' select with 'Assign to me'; app/Controller/TaskModificationController.php:17 assignToMe; app/Model/TaskCreationModel.php:67 owner_id", "openproject": "corpus: openproject/round4/M1-column.md 2.4 'assigned_to and a separate responsible, both Principal (app/models/work_package.rb:57-81)' ; source read at v17.8.0: app/models/work_package.rb:61 assigned_to (a Principal); lib/api/v3/work_packages/schema/work_package_schema_representer.rb:451-453 available assignees feed the assignee picker; lib/api/v3/work_packages/work_packages_api.rb:99 AvailableAssigneesAPI", "jira": "corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission to assign issues to users'", "plane": "corpus: plane/round4/M1-column.md 2.4 'Issue.assignees M2M (issue.py:149) ... editable from the work item peek and the spreadsheet layout'" @@ -1393,7 +1436,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'jdevries and the group as assignees' ; code-census.md 'Assignment: user, group, team, remote' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:14 :multiple=\"true\", :6 'Assign to users/groups/team'; lib/Db/Assignment.php:17-20 user, group, circle and remote assignees", - "kanboard": "source: a task has one owner_id (app/Model/TaskCreationModel.php:67); corpus: kanboard/round4/M1-column.md 2.5 'partial' (group only through a project, not per task)", + "kanboard": "source: a task has one owner_id (app/Model/TaskCreationModel.php:67); corpus: kanboard/round4/M1-column.md 2.5 'partial' (group only through a project, not per task) ; source read at v1.2.54: app/Helper/TaskHelper.php:127 a single owner_id select; app/Schema/Sqlite.php:1553 tasks.owner_id one column; searched app/Model and app/Schema for 'owner_ids', 'assignees': none; several assignees only through the third-party Group_assign plugin", "openproject": "corpus: openproject/round4/M1-column.md 2.5 'the two people fields are assigned_to and responsible and both are single-valued'; a Group can hold the assignment (one principal) ; source read at v17.8.0: app/models/work_package.rb:61-62 assigned_to and responsible are single belongs_to; searched app/models and lib/api/v3/work_packages for 'assignees' as a list and 'multi assign': only the available assignees picker; a group can be the one assignee", "jira": "corpus: jira-data-center/round4/M1-column.md 2.5 the assignee must be a single user (JRASERVER-5921 'Assign an issue to a group' closed as duplicate); 5.1 a 'User picker (multiple users)' custom field can list several people, which is not the assignee", "plane": "corpus: plane/round4/code-census.md §2 'assignees M2M (:149)'; journeys.md 'assignees' plural set in the driven journey" @@ -1422,7 +1465,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'a card is title, description, date, labels, assignees; there is no schema' ; source: lib/Db/Card.php has no priority ; source read at v1.19.0: lib/Db/Card.php:73-96 card fields hold no priority; searched lib/ and src/ for 'priority': only lib/Activity/Filter.php:47 and lib/Activity/SettingBase.php:55 (activity sort order), nothing on a card", - "kanboard": "source: app/Filter/TaskPriorityFilter.php, app/Template/board/task_footer.php:135 renderPriority, app/Action/TaskAssignColorPriority.php ; corpus: kanboard/round4/M1-column.md 2.6 bulk 'change ... priority'", + "kanboard": "source: app/Filter/TaskPriorityFilter.php, app/Template/board/task_footer.php:135 renderPriority, app/Action/TaskAssignColorPriority.php ; corpus: kanboard/round4/M1-column.md 2.6 bulk 'change ... priority' ; source read at v1.2.54: app/Helper/TaskHelper.php:174-179 'Priority' select over the project range; app/Template/board/task_footer.php:135 renderPriority on the card; app/Filter/TaskPriorityFilter.php; app/Action/TaskAssignColorPriority.php:23", "openproject": "corpus: openproject/round4/M1-column.md 8.2 'IssuePriority as a separate administered vocabulary'; 3.9 custom action kinds include priority ; source read at v17.8.0: app/models/work_package.rb:64 belongs_to priority IssuePriority; app/models/issue_priority.rb:31; config/routes.rb:771 admin work_package_priorities; config/initializers/menus.rb:421-422 'Priorities' admin page", "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'priority is a separate list'; 1.11 issue collector standard fields include 'Priority'", "plane": "corpus: plane/round4/code-census.md §2 'priority from PRIORITY_CHOICES urgent/high/medium/low/none'" @@ -1451,7 +1494,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'the date:overdue filter listed the card' ; code-census.md 'duedate, three colour thresholds, one overdue job' ; source read at v1.19.0: src/components/card/DueDateSelector.vue:13 'Set a due date', :187-206 quick picks; src/components/cards/badges/DueDate.vue:67 overdue state on the card badge; src/components/overview/Overview.vue:59 'Overdue' column; lib/Db/Card.php:106 DUEDATE_OVERDUE", - "kanboard": "corpus: kanboard/round4/M1-column.md 8.2 'yes' ; _round4/compare/promoted-rows-batch7.md 8.14 'the list and the board colour the date (task-date-overdue)'", + "kanboard": "corpus: kanboard/round4/M1-column.md 8.2 'yes' ; _round4/compare/promoted-rows-batch7.md 8.14 'the list and the board colour the date (task-date-overdue)' ; source read at v1.2.54: app/Helper/TaskHelper.php:235 'Due Date' field; app/Model/TaskCreationModel.php:63 date_due; app/Template/board/task_footer.php:62-66 task-date-overdue on the card; app/Template/task_list/task_icons.php:36 same in the list", "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package'; 8.2 'due date filters and a late indicator on the work package table' ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:129 due_date attribute; app/models/work_package.rb:285-287 overdue? when due_date is past and not closed; frontend/src/app/shared/components/fields/display/field-types/date-display-field.module.ts:63 overdue highlight class", "jira": "corpus: jira-data-center/round4/M1-column.md 3.6 'To schedule an issue, populate its Due date field'; 8.2 'overdue Find issues that were due before today'", "plane": "corpus: plane/round4/M1-column.md 3.6 'Issue.target_date settable, sortable and filterable' and 8.2 'overdue styling is computed client side from target_date'" @@ -1481,7 +1524,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'a start date, a due date' ; code-census.md Card 'startdate' ; source read at v1.19.0: src/components/card/StartDateSelector.vue:6 'Assign a start date to this card…', :12 'Set a start date', mounted at src/components/card/CardSidebarTabDetails.vue:21-23, :176 updateCardStartDate; lib/Db/Card.php:91 startdate; lib/Controller/CardController.php:67 update takes startdate", - "kanboard": "source: app/Model/TaskCreationModel.php:64 date_started ; app/Action/TaskMoveColumnOnStartDate.php ; corpus: kanboard/round4/menu-tree.md 'the task's 26 detail fields'", + "kanboard": "source: app/Model/TaskCreationModel.php:64 date_started ; app/Action/TaskMoveColumnOnStartDate.php ; corpus: kanboard/round4/menu-tree.md 'the task's 26 detail fields' ; source read at v1.2.54: app/Helper/TaskHelper.php:229 'Start Date' field; app/Model/TaskCreationModel.php:64 date_started; app/Action/TaskMoveColumnOnStartDate.php:23 move once the start date is reached", "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package, distinct from start_date and duration'; corpus: openproject/round4/journeys.md duration derivation ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:122-126 start_date attribute, validated against the soonest start; config/routes.rb:1007 work package pages whose date picker is served by app/controllers/work_packages/date_picker_controller.rb", "jira": "corpus: jira-data-center/round4/M1-column.md 8.3 'plans schedule on target start and target end dates' (Configure your Advanced Roadmaps plan settings)", "plane": "corpus: plane/round4/code-census.md §2 'start_date and target_date DateFields (:147-148)'" @@ -1510,7 +1553,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.8 'labels per board with a colour ... Verified live: label Kap on card 6' ; source read at v1.19.0: src/components/card/TagSelector.vue:15-16 'Assign a tag to this card…', 'Select or create a tag…', mounted at src/components/card/CardSidebarTabDetails.vue:8-13, :187 addLabelToCard; lib/Controller/CardController.php:116 assignLabel, lib/Service/CardService.php:618", - "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTag spoed and setTaskTags' ; source: app/Template/board/task_footer.php:28 tag colour", + "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTag spoed and setTaskTags' ; source: app/Template/board/task_footer.php:28 tag colour ; source read at v1.2.54: app/Helper/TaskHelper.php:90-95 'Tags' field on the task form; app/Model/TaskTagModel.php:100 save; app/Template/board/task_footer.php:28 tag colour on the card; app/Controller/ProjectTagController.php:39 save a project tag", "openproject": "corpus: openproject/round4/M1-column.md 2.8 'no tag object on a work package. Nearest are app/models/category.rb:31 (project-scoped, single-valued) and a list custom field' ; source read at v17.8.0: searched app/models for 'tag', 'taggable', 'label_ids': no tag object on a work package; nearest app/models/category.rb:31-33 a project-scoped Category, and app/models/work_package.rb holds one category per work package", "jira": "corpus: jira-data-center/round4/M1-column.md 2.8 'Labels is a system field ... Allows adding labels to issues'; labels carry no colour of their own (card colours are per type, priority, assignee or query: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html)", "plane": "corpus: plane/round4/M1-column.md 2.8 'label.py:11 workspace-scoped with an optional project, a self-FK parent, color and sort_order'" @@ -1543,7 +1586,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md board sidebar 'tags' ; source: lib/Service/LabelService.php:87 delete, lib/Db/LabelMapper.php:62 deleteLabelAssignments removes it from every card ; source read at v1.19.0: src/components/board/TagsTabSidebar.vue:45 'Edit', :50 'Delete', :81 'Add a new tag'; lib/Service/LabelService.php:87 delete checks manage permission; lib/Db/LabelMapper.php:60-64 delete first removes the label from every card (deleteLabelAssignments)", - "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'Tags management' and project 'Tags' ; source: app/Schema/Sqlite.php:305 task_has_tags FOREIGN KEY(tag_id) ON DELETE CASCADE", + "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'Tags management' and project 'Tags' ; source: app/Schema/Sqlite.php:305 task_has_tags FOREIGN KEY(tag_id) ON DELETE CASCADE ; source read at v1.2.54: app/Template/config/sidebar.php:19 'Tags management' for global tags; app/Controller/TagController.php:15 index; app/Controller/ProjectTagController.php:112 remove; app/Schema/Sqlite.php:301-305 task_has_tags FOREIGN KEY(tag_id) ON DELETE CASCADE", "openproject": "no label object (corpus: openproject/round4/M1-column.md 2.8); categories are administered per project (category.rb) but are single-valued and not labels ; source read at v17.8.0: no label set to administer: nearest is config/routes.rb:576 per project categories and app/controllers/categories_controller.rb:64-73 deleting a category reassigns or clears it on its work packages, but a category is single-valued and uncoloured, so not labels", "jira": "docs: https://confluence.atlassian.com/display/JIRAKB/Delete+a+label+in+Jira 'To completely delete a label from a Jira instance, it must simply be removed from all the issues where it is used' via bulk 'Change Labels'; labels are free text with no managed set", "plane": "corpus: plane/round4/menu-tree.md 'Settings ... Labels' ; source: apps/api/plane/db/models/issue.py:543-545 IssueLabel label FK on_delete=CASCADE, and bgtasks/deletion_task.py:18 soft_delete_related_objects cascades a soft delete to IssueLabel rows" @@ -1572,7 +1615,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card action menu '... and the share link' ; card route /board//card/ ; source read at v1.19.0: src/router.js:114 route /board/:id/card/:cardId/:tabId? opens the card; src/components/card/CardSidebar.vue:31 'Open in bigger view'; src/components/cards/CardMenuEntries.vue:18 'Card details'; lib/Service/CardService.php:671 getCardUrl builds the shareable link; searched src for 'Copy link', 'clipboard': none, so the link is the address bar URL", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'A task, as it opens' (TaskViewController page with its own URL)", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'A task, as it opens' (TaskViewController page with its own URL) ; source read at v1.2.54: app/ServiceProvider/RouteProvider.php:118-119 routes 'task/:task_id' and 't/:task_id' to TaskViewController show; app/Template/task/sidebar.php:36 task page actions", "openproject": "every work package has its own URL /work_packages/ and the full view; corpus: openproject/round4/M1-column.md 2.1 'every work package has an instance-wide integer id' ; source read at v17.8.0: config/routes.rb:1007 /work_packages/:id show; app/controllers/work_packages_controller.rb:72 show; frontend/src/app/features/work-packages/routing/work-packages-routes.ts:30 WorkPackagesFullViewComponent the full page view", "jira": "corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'; 2.21 'You can easily keep your team informed by sharing issues with them via email'", "plane": "corpus: plane/round4/open-core.md 'apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx' ; source: quick-action-dropdowns/helper.tsx:107 copyUrlToClipboard(generateWorkItemLink) 'Copy work item link'" @@ -1601,7 +1644,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search ... Verified live' ; M1-column.md 9.1 'Dorpsstraat found the card' ; source read at v1.19.0: src/components/Controls.vue:65-72 board search field with 'Clear search'; lib/AppInfo/Application.php:136-137 registers DeckProvider and CardCommentProvider for unified search; lib/Search/DeckProvider.php:38 search, lib/Service/SearchService.php:35 searchCards", - "kanboard": "corpus: kanboard/round4/M1-column.md 9.1 'the header search box (SearchController::index) runs the same query language across every project'", + "kanboard": "corpus: kanboard/round4/M1-column.md 9.1 'the header search box (SearchController::index) runs the same query language across every project' ; source read at v1.2.54: app/Template/dashboard/overview.php:5-9 search box posting to SearchController; app/Controller/SearchController.php:16 index; app/ServiceProvider/FilterProvider.php:227-231 TaskSearchFilter and TaskTitleFilter as the default text match", "openproject": "corpus: openproject/round4/M1-column.md 9.1 'app/controllers/search_controller.rb over eight registered searchables: work packages ...' ; source read at v17.8.0: config/routes.rb:326 search; app/controllers/search_controller.rb:141 search_types from lib/redmine/search.rb:43; app/models/work_package.rb:152 acts_as_searchable over subject and description; frontend/src/app/core/global_search/global-search-work-packages.component.ts the header search results", "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'start typing to search through all your issues and projects'; 4.17 'the text field allows you to search all text fields'", "plane": "corpus: plane/round4/code-census.md §9 'Issues [\"name\", \"sequence_id\", \"project__identifier\"]' and 'Descriptions are not searched ... Nor are comments'; title and key only" @@ -1630,7 +1673,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.6 'no multi-select on a board ... grep bulk|batch lib/Controller returns 0 hits' ; 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 as \"done\"' with src/stores/stack.js:122-127 marking every open card in the list done; no selection of several cards: searched src/ for 'multiSelect', 'selectedCards', 'bulk': none", - "kanboard": "corpus: kanboard/round4/M1-column.md 2.6 'TaskBulkController, TaskBulkChangePropertyController ... change assignee, category, color, priority, or move a set of tasks'", + "kanboard": "corpus: kanboard/round4/M1-column.md 2.6 'TaskBulkController, TaskBulkChangePropertyController ... change assignee, category, color, priority, or move a set of tasks' ; source read at v1.2.54: app/Template/task_list/header.php:20 'Move selected tasks to another column or swimlane', :23 'Edit tasks in bulk'; app/Template/task_bulk_change_property/show.php:25 assignee, :54 'Just add these tag(s)'; app/Template/board/table_column.php:41 'Close all tasks in this column and this swimlane'", "openproject": "corpus: openproject/round4/M1-column.md 2.6 'bulk edit, move, copy and delete on a work package selection' ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts:60-72 'Bulk edit', 'Bulk move', 'Bulk duplicate' on a selection; config/routes.rb:999 work_packages bulk edit, update, destroy; app/controllers/work_packages/bulk_controller.rb", "jira": "corpus: jira-data-center/round4/M1-column.md 2.6 'You can do this by performing a bulk change operation' with edit, move, delete, watch and transition", "plane": "corpus: plane/round4/open-core.md 'use-bulk-operation-status.ts:7 ... export const useBulkOperationStatus = () => false;' ; M1-column.md 2.6 no. 'Full Time Tracking + Bulk Ops' is a Pro string, absent from Community" @@ -1659,7 +1702,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.1 'comments on a card through the platform's comments app ... Verified live' ; source read at v1.19.0: src/components/card/CardSidebar.vue:63-68 'Comments' tab mounts CardSidebarTabComments; src/components/card/CommentForm.vue:8 NcRichContenteditable, :91 1000 character limit; lib/Service/CommentService.php:97 create over the platform comments manager; appinfo/routes.php:171-174 comments API", - "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown with edit and delete ... Verified live'", + "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown with edit and delete ... Verified live' ; source read at v1.2.54: app/Template/task/sidebar.php:56 'Add a comment'; app/Controller/CommentController.php:42 save, :97 update, :145 remove; app/Template/comment/show.php:54 edit and remove for the author or an admin", "openproject": "corpus: openproject/round4/M1-column.md 6.1 'a comment is a journal with notes ... written by app/services/journals/create_service.rb' ; source read at v17.8.0: app/components/work_packages/activities_tab/journals/new_component.html.erb:24 'type to comment' and :32 submit comment; config/initializers/permissions.rb:359 add_work_package_comments; app/services/journals/create_service.rb:86 create_journal with notes", "jira": "corpus: jira-data-center/round4/M1-column.md 6.1 'You can add and manage comments in the issue view'", "plane": "corpus: plane/round4/M1-column.md 6.1 'IssueComment with comment_json, comment_html ... parent threading'" @@ -1688,7 +1731,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.10 'an attachment of type file is a Files node' ; journeys.md 3 'The attachment turns out to be a file' ; menu-tree.md Attachments '(upload, or attach a file from Files)' ; source read at v1.19.0: src/components/card/AttachmentList.vue:10 'Upload new files', :13 'Share from Files' opening the platform file picker at :230-231, :65 'Show in Files'; lib/Service/FilesAppService.php:39 attachment of type file backed by a Files share; appinfo/routes.php:66 attachment#create", - "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskFile with a base64 blob, read back with its path under tasks/3/' ; M1-column.md 4.23 'no' : files upload into Kanboard's own store, there is no organisation file store to pick from", + "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskFile with a base64 blob, read back with its path under tasks/3/' ; M1-column.md 4.23 'no' : files upload into Kanboard's own store, there is no organisation file store to pick from ; source read at v1.2.54: app/Template/task/sidebar.php:61 'Attach a document', :64 'Add a screenshot'; app/Controller/TaskFileController.php:52 save; app/Model/TaskFileModel.php:59-61 stored under Kanboard's own 'tasks' prefix, app/Model/FileModel.php:284; searched app/ for a picker on an outside file store: none", "openproject": "corpus: openproject/round4/M1-column.md 1.10 'modules/storages/app/models/storages/file_link.rb:35-40 links a remote Nextcloud, OneDrive or SharePoint file to a work package'; 4.23 'Nextcloud is free, the other two are Enterprise gated' ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component.ts Files tab with the storage file picker; modules/storages/app/models/storages/file_link.rb:35-39 a file link on a WorkPackage; modules/storages/lib/open_project/storages/engine.rb:198 manage_file_links; modules/storages/app/models/storages/storage.rb:93 Nextcloud needs no token, one_drive_storage.rb and sharepoint_storage.rb gate on :one_drive_sharepoint_file_storage", "jira": "corpus: jira-data-center/round4/M1-column.md 1.10 'Jira is not hosted in a platform with files or chat of its own; attachments are Jira's'; 4.22 upload by drag and drop, so files are uploaded copies, not links into a file store", "plane": "corpus: plane/round4/code-census.md §4 FileAsset ISSUE_ATTACHMENT uploaded presigned to S3 ; M1-column.md 4.22 drag and drop upload. Files are uploaded copies; there is no link to an organisation file store (M1-column.md 4.23 'no file manager')" @@ -1717,7 +1760,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.9 'the activity tab on the card, with the 39 subjects ... Verified live' ; 2.16 description before and after ; source read at v1.19.0: src/components/card/CardSidebar.vue:74-78 'Activity' tab, src/components/card/CardSidebarTabActivity.vue:7-12 activity list filtered to object deck_card; lib/Activity/ActivityManager.php:68-94 card subjects (title, description, due date, stack, assign, label, attachment), :412 description before and after (platform activity)", - "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 'an Activity stream tab and a Transitions tab ... with author and time' ; 2.16 'The previous value of a field is not kept'", + "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 'an Activity stream tab and a Transitions tab ... with author and time' ; 2.16 'The previous value of a field is not kept' ; source read at v1.2.54: app/Template/task/sidebar.php:10 'Activity stream', :13 'Transitions'; app/Controller/ActivityController.php:50 task; app/Controller/TaskViewController.php:133-140 transitions from transitionModel getAllByTask; the previous value of an edited field is not kept", "openproject": "corpus: openproject/round4/M1-column.md 10.9 'the Activity tab, rendering journals with ten detail kinds and 14 typed causes' ; source read at v17.8.0: app/components/work_packages/activities_tab/journals/item_component.html.erb:2-7 one entry per journal with its changes; app/components/work_packages/activities_tab/journals/filter_and_sorting_component.rb filter to changes only; app/services/journals/create_service.rb:45 journals written on every save", "jira": "corpus: jira-data-center/round4/M1-column.md 10.9 'The History tab of an issue records ... changes to an issue field'", "plane": "corpus: plane/round4/M1-column.md 10.9 'the activity feed on the work item, from IssueActivity with actor, verb, field, old and new value'" @@ -1746,7 +1789,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.10 'No sub-cards and no hierarchy; a checklist in the description is the nearest child' ; source read at v1.19.0: lib/Db/Card.php:73-96 no parent field; searched lib/Db and src/ for 'subtask', 'parentId', 'parent_id', 'childCard': only src/services/CommentApi.js:27 (comment replies); the nearest child is the markdown checklist, src/components/cards/CardBadges.vue:23-25", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a sub-task' ; M1-column.md 3.3 'subtasks ... with a status of todo, in progress or done, an assignee and a time estimate'", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a sub-task' ; M1-column.md 3.3 'subtasks ... with a status of todo, in progress or done, an assignee and a time estimate' ; source read at v1.2.54: app/Template/task/sidebar.php:43 'Add a sub-task'; app/Template/subtask/create.php:19-20 assignee and time estimate; app/Controller/SubtaskController.php:65 save; app/Model/SubtaskModel.php:28-30 todo, in progress, done", "openproject": "corpus: openproject/round4/M1-column.md 2.10 'hierarchy is a separate closure table, WorkPackageHierarchy' ; source read at v17.8.0: config/locales/js-en.yml:790 'Add child', :792 'Create new child'; app/contracts/work_packages/base_contract.rb:91 parent_id; app/models/work_package.rb:179 has_closure_tree; app/controllers/work_package_hierarchy_relations_controller.rb", "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'Sub-tasks are generally used to split up a parent issue into a number of tasks' (one level only)", "plane": "corpus: plane/round4/code-census.md §2 'Issue.parent gives sub-issues; the endpoint is apps/api/plane/app/urls/issue.py:105'" @@ -1778,7 +1821,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.3 'a markdown task list in the description renders as checkboxes with a progress badge on the card ... Verified live: card 22' ; source read at v1.19.0: src/components/card/Description.vue:70 and :85 markdown-it-task-checkbox renders '- [ ]' items as clickable checkboxes; src/components/cards/CardBadges.vue:23-25 'Todo items' badge with checked/total, :75-78 counts; stored in the card description, lib/Db/Card.php:74", - "kanboard": "corpus: kanboard/round4/M1-column.md 3.3 'subtasks are a checklist on a task' ; source: app/Template/board/task_footer.php:98-99 completion percentage on the card", + "kanboard": "corpus: kanboard/round4/M1-column.md 3.3 'subtasks are a checklist on a task' ; source: app/Template/board/task_footer.php:98-99 completion percentage on the card ; source read at v1.2.54: app/Template/subtask/create.php:24 'Create another sub-task' for quick list entry; app/Controller/SubtaskStatusController.php:18 change toggles a subtask's status; app/Template/board/task_footer.php:98-99 completion percentage on the card", "openproject": "corpus: openproject/round4/M1-column.md 3.3 'ls app/models | grep -i checklist returns nothing. Nearest is a child work package per item'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): the bundled CKEditor (frontend/src/vendor/ckeditor/ckeditor.js) carries todoList and todoListChecked, so a description can hold ticked checkboxes as text (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM 'tasklist' extension and lib/open_project/text_formatting/filters/task_list_filter.rb:31 render ticked boxes in a description; searched app/models for 'checklist': none, so no checklist object with progress", "jira": "corpus: jira-data-center/round4/M1-column.md 3.3 'no checklist object ... JRASERVER-47605 (To-do lists (checkbox) for description field on tickets), Gathering Interest, 1028 votes'; checklists are Marketplace apps", "plane": "corpus: plane/round4/code-census.md §3 'No checklist model. Sub-tasks are ordinary issues with parent set'" @@ -1807,7 +1850,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'recurr|repeat' 0 hits ; M1-column.md 1.8 'no' ; source read at v1.19.0: searched lib/ and src/ for 'recurr', 'repeat', 'rrule': only CSS background-repeat, src/components/cards/CardCover.vue:86, and SVG animation; lib/Db/Card.php:73-96 no schedule field", - "kanboard": "corpus: kanboard/round4/M1-column.md 1.8 'recurrence_* ... RecurringTaskSubscriber clones it on close ... Verified live' ; journeys.md 3", + "kanboard": "corpus: kanboard/round4/M1-column.md 1.8 'recurrence_* ... RecurringTaskSubscriber clones it on close ... Verified live' ; journeys.md 3 ; source read at v1.2.54: app/Template/task/sidebar.php:39 'Edit recurrence'; app/Template/task_recurrence/edit.php:25-35 trigger, factor and timeframe for the next due date; app/Subscriber/RecurringTaskSubscriber.php:15,26 onClose duplicates; app/Model/TaskRecurrenceModel.php:81 duplicateRecurringTask", "openproject": "corpus: openproject/round4/M1-column.md 1.8 'grep -rn recurring.*work_package ... returns nothing. Recurrence exists only for meetings' ; source read at v17.8.0: searched app/models and app/services for 'recurr': only meetings, app/models/project.rb:108 recurring_meetings and modules/meeting/app/models/recurring_meeting.rb:31; nothing for work packages", "jira": "corpus: jira-data-center/round4/M1-column.md 1.8 Automation 'scheduled trigger' with actions 'creating sub-tasks' and creating issues (rated yes there for planned cases); a rule an admin writes, not a repeat setting on the task", "plane": "corpus: plane/round4/code-census.md §1 'Recurring issues: absent', grep recurring returns one celery comment ; source: grep -rli recurr apps/web/core hits only license/modal upsell files" @@ -1836,7 +1879,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'cards with a title, a markdown description' ; menu-tree.md 'the markdown description with checkboxes' ; source read at v1.19.0: src/components/card/Description.vue:47-53 VueEasymde markdown editor, :69-87 markdown-it renders headings, lists, task checkboxes and links, :120 uses the Text app editor when installed, :45 'Write a description …'; lib/Db/Card.php:74 description", - "kanboard": "source: app/Helper/TextHelper.php:5,43 Markdown transformation of descriptions and comments ; corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown'", + "kanboard": "source: app/Helper/TextHelper.php:5,43 Markdown transformation of descriptions and comments ; corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown' ; source read at v1.2.54: app/Helper/TaskHelper.php:63 description uses the textEditor; app/Helper/FormHelper.php:228 textEditor, assets/js/components/text-editor.js:79 editor with preview; app/Helper/TextHelper.php:43-49 Markdown rendering", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/wysiwyg/README.md:27 'The CKEditor5 build in OpenProject supports basic text styles, such as bold and italic formatting, headings' and :63 Markdown '#, ##, ###' (GFM tables :50) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts the CKEditor 5 field on descriptions and comments; lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM with table, autolink and tasklist, so text is stored as Markdown", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html Visual mode 'gives you a What You See Is What You Get (WYSIWYG) experience' and 'you can still enter wiki markup syntax'", "plane": "corpus: plane/round4/code-census.md §2 description_json / description_html; usability.md driven editor ; source: packages/editor rich text editor with markdown copy (i18n 'Copy markdown')" @@ -1865,7 +1908,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Comments (the platform's comments with mentions)' ; code-census.md notification kinds 'card-comment-mentioned' ; source read at v1.19.0: src/components/card/CommentForm.vue:8-12 NcRichContenteditable with member autocomplete at :81-82; lib/Listeners/CommentEventListener.php:65 calls lib/Notification/NotificationHelper.php:178-204 sendMention, notifying each mentioned board member", - "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies (comment.user.mention, UserMentionJob)'", + "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies (comment.user.mention, UserMentionJob)' ; source read at v1.2.54: app/Helper/FormHelper.php:250 '@' trigger suggests project users in the editor; app/Job/CommentEventJob.php:45-46 queues UserMentionJob; app/Model/CommentModel.php:31 comment.user.mention; app/Subscriber/NotificationSubscriber.php:34 notifies", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'you will be notified about important changes ... new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/notifications/create_from_model_service.rb:33 parses '' and :41 group mentions from the saved text; app/models/notification.rb:33 reason 'mentioned'; frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts sets up the editor that inserts the mention", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html notification types include 'mentions'; @mention in comments generates an email to the mentioned user (Configuring email notifications, corpus: jira-data-center/round4/M1-column.md 6.8)", "plane": "corpus: plane/round4/code-census.md §6 'IssueMention (issue.py:323)' and UserNotificationPreference 'mention' boolean ; source: apps/api/plane/bgtasks/notification_task.py:84-111 mentions become subscribers and are notified" @@ -1898,7 +1941,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.13 'card#reorder moves a card to another stack or board; the UI offers Move card' ; source read at v1.19.0: src/components/cards/CardMenuEntries.vue:57 'Move/copy card'; src/CardMoveDialog.vue:9 'Select a board', :18 'Select a list', :26 'Move card', :104-107 moveCard; lib/Service/CardService.php:436-440 reorder to a stack on another board after edit checks on both", - "kanboard": "corpus: kanboard/round4/menu-tree.md task actions 'Move to project' ; 'Duplicate to project'", + "kanboard": "corpus: kanboard/round4/menu-tree.md task actions 'Move to project' ; 'Duplicate to project' ; source read at v1.2.54: app/Template/task/sidebar.php:77 'Move to project', :72 'Duplicate to project'; app/Controller/TaskDuplicationController.php:47 move, :84 copy", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/work-packages/duplicate-move-delete/README.md:5 'How to duplicate, move to another project or delete a work package'; corpus: openproject/round4/M1-column.md 2.6 bulk move (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts:66-68 'Move' action; config/routes.rb:1016-1021 work package move routes; app/controllers/work_packages/moves_controller.rb:47 create, :143-144 target project must be allowed_target_projects_on_move", "jira": "corpus: jira-data-center/round4/M1-column.md 2.13 'The Move issue wizard allows you to choose any other project in your Jira instance to move your selected issue to'", "plane": "source: apps/api/plane/app/serializers/issue.py:100 project_id read_only=True; apps/web/core/components/issues/issue-modal/form.tsx:368 project select disabled={!!data?.id || !!data?.sourceIssueId}; 'move_to_project' exists only for workspace drafts (workspace-draft/draft-issue-block.tsx:83)" @@ -1927,7 +1970,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "the only card-to-card link is a dependency (corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 2.26 'one typed link, card dependencies ... No declared types beyond it'); a card link pasted in a description renders through the reference provider (code-census.md 'reference (4)') ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards' is the only typed card link; src/components/card/CardSidebarTabDetails.vue:34-38 NcCollectionList relates a card to other resources but only when the platform projects feature is on (:92 projects_enabled); lib/AppInfo/Application.php:45 CardReferenceProvider previews a pasted card link", - "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 2.26 'links holds label pairs with opposite_id (11 shipped: relates to, blocks / is blocked by ...)'", + "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 2.26 'links holds label pairs with opposite_id (11 shipped: relates to, blocks / is blocked by ...)' ; source read at v1.2.54: app/Template/task/sidebar.php:48 'Add internal link'; app/Template/task_internal_link/create.php:10-13 label and task; app/Schema/Sqlite.php:961 seeds 'relates to'; app/Controller/TaskInternalLinkController.php:48 save", "openproject": "corpus: openproject/round4/M1-column.md 2.10 'Relations are app/models/relation.rb:31 with eleven typed entries' (relates to among them) ; source read at v17.8.0: app/models/relation.rb:35 TYPE_RELATES and :55-57 'related to' among the typed relations, non-scheduling; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; config/locales/en.yml:3609 'related to'", "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may relate to another. An issue may duplicate another. An issue may block another'", "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices 'duplicate, relates_to, blocked_by, ...'" @@ -1961,7 +2004,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.5 'no mail intake: grep imap|mailbox|message_id lib returns 0 hits' ; source read at v1.19.0: searched lib/ for 'imap', 'mailbox', 'message_id', 'IMailer': only mail wording in lib/Activity/SettingBase.php, lib/Activity/SettingChanges.php and lib/Service/AttachmentService.php, no mail intake; appinfo/routes.php:47 cards are created only through the web and API routes", - "kanboard": "corpus: kanboard/round4/M1-column.md 1.5 'no' ; open-core.md 'Mailgun, Postmark, Sendgrid | 1.5, mail in | nothing' (third-party plugins only)", + "kanboard": "corpus: kanboard/round4/M1-column.md 1.5 'no' ; open-core.md 'Mailgun, Postmark, Sendgrid | 1.5, mail in | nothing' (third-party plugins only) ; source read at v1.2.54: searched app/ (outside Locale) for 'imap', 'inbound', 'receiveEmail', 'EmailHandler': none; mail in is the third-party Mailgun, Postmark and Sendgrid plugins", "openproject": "corpus: openproject/round4/M1-column.md 1.5 'the work package handler creates at handlers/work_package.rb:73 ... Transports are IMAP, POP3 and Gmail' ; source read at v17.8.0: app/services/incoming_emails/handlers/work_package.rb:56 default creates a new work package, :73-76 receive_new_work_package; config/initializers/menus.rb:595 admin 'Incoming emails' settings", "jira": "corpus: jira-data-center/round4/M1-column.md 1.5 'Jira can receive emails from licensed users to create issues or add comments'", "plane": "corpus: plane/round4/code-census.md §1 'Email intake: absent', grep email.?intake|mailbox|imap 0 hits; SourceType has one value IN_APP" @@ -1990,7 +2033,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source: grep -rniF 'backlog' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'backlog': none; lib/Db/Card.php:77 every card belongs to a stack, so every card sits on the board; src/router.js:79 a board is the only card container", - "kanboard": "source: app/Model/BoardModel.php:23 default columns 'Backlog', 'Ready', 'Work in progress', 'Done' : the backlog is the first column on the board, not a separate list ; corpus: kanboard/round4/journeys.md 5 column restriction 'Backlog'", + "kanboard": "source: app/Model/BoardModel.php:23 default columns 'Backlog', 'Ready', 'Work in progress', 'Done' : the backlog is the first column on the board, not a separate list ; corpus: kanboard/round4/journeys.md 5 column restriction 'Backlog' ; source read at v1.2.54: app/Model/BoardModel.php:23 default columns start with 'Backlog': the backlog is the first board column; searched app/Controller for a separate backlog view: none", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:14 'record and prioritize work packages in sprints and the backlog' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:65 project backlog page and :73 backlog buckets; modules/backlogs/app/components/backlogs/inbox_component.rb:32 'Backlog inbox', modules/backlogs/config/locales/en.yml:53, of unplanned work packages; modules/backlogs/app/controllers/backlogs/backlog_controller.rb:40 show", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'The Kanban backlog shows issues in both Backlog and Selected for Development sections' and team members can 'focus on your work-in-progress on the Kanban board, without the distraction of items in planning'", "plane": "corpus: plane/round4/code-census.md §2 state groups 'backlog, unstarted, started, completed, cancelled, triage'; the backlog is a state group shown as board columns unless filtered out, not a separate list apart from the board. Intake (off by default) is a triage queue, not a backlog (menu-tree.md)" @@ -2019,7 +2062,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source read at v1.19.0: no backlog to move from: searched lib/ and src/ for 'backlog': none; lib/Db/Card.php:77 a card always carries a stackId, so it is on the board from creation", - "kanboard": "moving a task out of the Backlog column is a column move (corpus: kanboard/round4/journeys.md 1 moveTaskPosition); no separate backlog to plan from", + "kanboard": "moving a task out of the Backlog column is a column move (corpus: kanboard/round4/journeys.md 1 moveTaskPosition); no separate backlog to plan from ; source read at v1.2.54: app/Model/BoardModel.php:23 Backlog is a board column; moving out of it is a column move, assets/js/src/BoardDragAndDrop.js:37 and app/Template/task_list/header.php:20 'Move selected tasks to another column or swimlane'; no separate backlog to plan from", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:234 'Your sprint is set in motion by clicking the Start sprint button ... it will open the sprint board'; basic boards add an existing work package as a card (agile-boards README:139) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:105-107 move and move_to_sprint_dialog; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:71 move to sprint, :97-103 move via Backlogs::WorkPackages::UpdateService; modules/backlogs/app/services/backlogs/sprints/start_service.rb:66 starting the sprint builds its board, which shows the moved work package", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board'", "plane": "corpus: plane/round4/code-census.md §2 State group; moving a work item from a backlog-group state to an unstarted or started state is an ordinary state change (drag or state menu)" @@ -2048,7 +2091,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; the board filter (menu-tree.md) filters columns, there is no backlog list ; source read at v1.19.0: no backlog list: searched lib/ and src/ for 'backlog': none; the only filter is the board filter in src/components/Controls.vue:65-72, which filters the columns, and searched Controls.vue for 'sort': only the label list at :394", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'List' view with the filter dropdown and query language (usability.md 'runs the board, the list, the saved filters'), sortable; not a backlog of its own", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'List' view with the filter dropdown and query language (usability.md 'runs the board, the list, the saved filters'), sortable; not a backlog of its own ; source read at v1.2.54: app/Template/task_list/sort_menu.php:5-20 List view sort by id, swimlane, column, category, position; app/Template/app/filters_helper.php:6-15 filter menu; the backlog is a column, reached with a column: query, app/Filter/TaskColumnFilter.php; not a backlog of its own", "openproject": "docs: opf/openproject v17.8.0 docs/user-guide/backlogs-scrum/README.md:103 'The all backlog buckets button is a multi-select dropdown that allows you to filter for buckets within your backlog' and :239 all sprints filter, so released 17.8 filters containers, not the work packages in them; work package filters for backlogs arrive in 17.9.0 (docs/release-notes/17-9-0 release_date 2026-09-30, not yet released on 2026-09-26, present only in the 18.0-dev tree); ordering is by drag (round-4 drive on 16.6.10) ; source read at v17.8.0: modules/backlogs/app/controllers/backlogs/backlog_filters.rb:32-39 the backlog filter holds only bucket_ids, sprint_ids and show_all; modules/backlogs/app/components/backlogs/backlog_filter_select_panel_component.rb:60 buckets plus inbox picker; order is the dragged position only, modules/backlogs/app/models/sprint.rb:97 order_by_position", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters apply on 'a Scrum board or Kanban board' including its backlog; order is Rank (docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'the issues you're creating and ranking for your team')", "plane": "corpus: plane/round4/code-census.md §9 IssueView filters and display_filters ; usability.md 'Layouts, filtering ... are all good'" @@ -2077,7 +2120,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source read at v1.19.0: no backlog to rank: searched lib/ and src/ for 'backlog': none; ordering exists only inside a board list, lib/Service/CardService.php:436 reorder", - "kanboard": "tasks are ordered by drag within the Backlog column (corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position); no ranked backlog list", + "kanboard": "tasks are ordered by drag within the Backlog column (corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position); no ranked backlog list ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:37 drag within the Backlog column saves a position; app/Controller/BoardAjaxController.php:18 save; app/Template/task_list/sort_menu.php:20 List sorts by 'Position' but cannot be dragged", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:170 'You can prioritize work packages within the Inbox backlog, a backlog bucket, or a sprint by dragging and dropping them' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/app/components/backlogs/work_package_card_list_component.rb:41-59 drag_and_drop on the card list; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:97-110 move stores the new position, same-list moves reorder", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'an optimized list view of the issues you're creating and ranking for your team'", "plane": "corpus: plane/round4/code-census.md §2 Issue 'sort_order float (:158)'; list and board support manual drag ordering (kanban/block.tsx:206 draggable)" @@ -2106,7 +2149,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: grep -rniF 'sprint' lib returns 0 hits ; corpus: nextcloud-deck/round4/usability.md no iteration object ; source read at v1.19.0: searched lib/, src/ and appinfo/ for 'sprint', 'iteration': only sprintf in lib/Service/BoardService.php:242; lib/Db has Board, Stack, Card, Label, Acl, Assignment, Attachment, Session and no iteration entity", - "kanboard": "source: grep -rniF 'sprint' app --include=*.php outside Locale returns no sprint model ; corpus: kanboard/round4/code-census.md objects table has no iteration", + "kanboard": "source: grep -rniF 'sprint' app --include=*.php outside Locale returns no sprint model ; corpus: kanboard/round4/code-census.md objects table has no iteration ; source read at v1.2.54: searched app/ (outside Locale) word-bounded for 'sprint', 'sprints', 'iteration', 'velocity': none; app/Schema/Sqlite.php has no sprint or iteration table", "openproject": "corpus: openproject/round4/menu-tree.md 'Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:59 'Each sprint is displayed in a dedicated container showing ... start and end dates'; multiple active sprints are Enterprise gated (open-core.md multiple_active_sprints) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:84-94 sprints with new, start, finish; modules/backlogs/app/models/sprint.rb:75-77 start_date and finish_date required when active, finish after start; modules/backlogs/app/contracts/backlogs/projects/backlog_settings_contract.rb:96 several active sprints need the :multiple_active_sprints token", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/estimate-in-story-points-938845204.html 'Velocity is then worked out based on how many points the team can complete in each sprint'; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Sprint Report'", "plane": "corpus: plane/round4/menu-tree.md 'Cycles time boxes, off by default' ; code-census.md §3 'Cycle is a time box: start_date and end_date'" @@ -2135,7 +2178,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no sprints (bkl-sprints) ; source read at v1.19.0: no sprints, see bkl-sprints: searched lib/ and src/ for 'sprint', 'iteration': none beyond lib/Service/BoardService.php:242 sprintf", - "kanboard": "no sprints (bkl-sprints)", + "kanboard": "no sprints (bkl-sprints) ; source read at v1.2.54: no sprint object, see bkl-sprints: word-bounded search of app/ for 'sprint' returns nothing; app/Controller/BoardViewController.php:56 the board is per project only", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:265 'Sprint board' among the sprint menu items; :234 'Clicking it will open the sprint board' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/locales/en.yml:179 'Sprint board'; modules/backlogs/config/routes.rb:112 sprint taskboard; modules/backlogs/app/controllers/backlogs/taskboard_controller.rb:35-38 redirects to the sprint's board; modules/boards/app/services/boards/sprint_task_board_create_service.rb:65-76 one list per status of the sprint's work", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards in your Backlog and Active sprints' (the Active sprints board is the current sprint); docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart: Tracks the total work remaining' per sprint", "plane": "corpus: plane/round4/code-census.md §3 CycleIssue membership ; source: apps/web/core/components/issues/issue-layouts/roots/cycle-layout-root.tsx renders the cycle's items in the same layouts, board included. The cross-project 'Active Cycles' page is an upsell (open-core.md shims table, active-cycles/page.tsx:13)" @@ -2164,7 +2207,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no sprints and no points ; corpus: nextcloud-deck/round4/M1-column.md 10.1 'no' KPI dashboards ; source read at v1.19.0: searched lib/ and src/ for 'velocity', 'story point', 'estimate': only lib/UserMigration/DeckMigrator.php:64 getEstimatedExportSize; lib/Db/Card.php:73-96 no points or estimate field", - "kanboard": "no sprints; corpus: kanboard/round4/menu-tree.md Analytics lists 'Task distribution · User repartition · Cumulative flow diagram · Burndown chart · Average time into each column · Lead and cycle time · Estimated vs actual time', no velocity", + "kanboard": "no sprints; corpus: kanboard/round4/menu-tree.md Analytics lists 'Task distribution · User repartition · Cumulative flow diagram · Burndown chart · Average time into each column · Lead and cycle time · Estimated vs actual time', no velocity ; source read at v1.2.54: app/Template/analytic/sidebar.php:4-25 the eight analytics are task distribution, user repartition, CFD, burndown, time in column, lead and cycle, estimated vs actual; word-bounded search of app/ for 'velocity': none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'velocity' modules/backlogs returns only spec files; the backlogs-scrum README documents burndown and sprint board, no velocity chart ; source read at v17.8.0: modules/backlogs/app/components/backlogs/sprint_component.html.erb:63-64 a 'velocity' CSS class holds only the current sprint's story point total; modules/backlogs/app/components/backlogs/sprint_reports/widgets has burndown_chart and goal only; searched modules/backlogs non-spec code for 'velocity': no chart over past sprints", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Velocity Chart: Tracks the amount of work completed from sprint to sprint'", "plane": "source: grep -rli velocity apps/web/core apps/api packages/constants hits only apps/api/plane/settings/openapi.py prose; no velocity chart across cycles. Corpus silent" @@ -2193,7 +2236,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no' process analytics ; no chart in the app (menu-tree.md) ; source read at v1.19.0: searched lib/ and src/ for 'burndown', 'burnup', 'chart': no chart component; the only chart-like view is the Gantt, src/components/board/GanttView.vue:63 frappe-gantt, which plots dates, not remaining work", - "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Burndown chart' : a project burndown over the complexity score by date range, not bound to a sprint", + "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Burndown chart' : a project burndown over the complexity score by date range, not bound to a sprint ; source read at v1.2.54: app/Template/analytic/sidebar.php:13 'Burndown chart'; app/Controller/AnalyticController.php:129-131 burndown over the task score; app/Template/analytic/burndown.php:21 a free date range, not a sprint", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:266 'Burndown chart'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/backlogs/app/models/burndown.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:113 sprint burndown_chart; modules/backlogs/app/controllers/backlogs/burndown_chart_controller.rb:35 show; modules/backlogs/app/models/burndown.rb:31-32 Burndown built per sprint; modules/backlogs/config/locales/en.yml:144-147 burndown chart page strings", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart', 'Burnup Chart', 'Release Burndown', 'Epic Burndown'", "plane": "source: apps/web/core/components/cycles/analytics-sidebar/sidebar-chart.tsx:15 ProgressChart and apps/web/core/components/core/sidebar/progress-chart.tsx:23-45 'current' versus 'ideal' series, i18n 'Burndown chart' ; corpus: plane/round4/code-census.md §3 Cycle.progress_snapshot. Burndown comparison across cycles is the Active Cycles upsell" @@ -2222,7 +2265,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: grep -rniE 'milestone|release|version' lib/Db returns no version object ; corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones ; source read at v1.19.0: searched lib/ and src/ for 'milestone', 'release', 'fixVersion': no version object; lib/Db/Card.php:73-96 and lib/Db/Board.php carry no release field", - "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' : a task can be linked to a milestone task; no version or release object", + "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' : a task can be linked to a milestone task; no version or release object ; source read at v1.2.54: app/Schema/Sqlite.php:968-969 link labels 'targets milestone' and 'is a milestone of' let a task point at a milestone task; word-bounded search of app/Controller and app/Template for 'release', 'version': only plugin and about screens", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Versions'; corpus: openproject/round4/M1-column.md 9.1 and 11.10 version custom field; docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Product roadmap release planning' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:478 project versions new, create; app/models/work_package_version.rb:31-35 a work package links to versions with kind target, several target versions allowed since 17.8; config/initializers/menus.rb:793 project settings 'Versions'", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report', 'Release Burndown'; docs: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'a release can start Relative to previous release date' (corpus 8.8)", "plane": "corpus: plane/round4/code-census.md §3 'Module is a scope grouping: start_date / target_date, status from ModuleStatus ... Membership is ModuleIssue'; no version object as such, a module with a target date stands in for a release" @@ -2251,7 +2294,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no epics or versions over time ; corpus: nextcloud-deck/round4/menu-tree.md five navigation entries, none a roadmap ; source read at v1.19.0: searched lib/ and src/ for 'roadmap', 'milestone': none, and 'epic' hits only NcDateTimePickerNative and getFilePickerBuilder, e.g. src/components/card/DueDateSelector.vue:10; src/router.js:29-153 has no roadmap route", - "kanboard": "corpus: kanboard/round4/menu-tree.md project menu has no roadmap or timeline; the Gantt is not in core (code-census.md objects table)", + "kanboard": "corpus: kanboard/round4/menu-tree.md project menu has no roadmap or timeline; the Gantt is not in core (code-census.md objects table) ; source read at v1.2.54: searched app/Controller and app/Template for 'roadmap', 'gantt', 'release': no roadmap screen; app/Template/project_header/views.php:6-18 views are Overview, Board, List", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Find out about the Product Roadmap and Release planning in OpenProject'; corpus: openproject/round4/menu-tree.md global 'Gantt charts' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:713-716 project 'Roadmap' menu when versions exist; config/routes.rb:484-487 /roadmap is versions#index; app/controllers/versions_controller.rb:39 index lists versions with their work packages and progress", "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 Releases in Advanced Roadmaps and 3.14 'Modify a view in Advanced Roadmaps'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (timeline of epics and releases, Advanced Roadmaps bundled in the Jira Software DC documentation set)", "plane": "source: apps/web/core/components/modules/modules-list-view.tsx:52 and modules/gantt-chart/modules-list-layout.tsx draw a project's modules on a timeline; epics are unreachable (corpus: plane/round4/journeys.md) and there is no cross-project roadmap" @@ -2280,7 +2323,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/Controls.vue:236-237 'Gantt view' view mode beside 'Kanban view', src/components/board/Board.vue:49 GanttView, src/components/board/GanttView.vue:63 frappe-gantt over start and due dates (tag v1.18.4). The round-4 menu-tree.md lists 'the view modes (board and list)' and missed the Gantt mode ; source read at v1.19.0: src/components/Controls.vue:242 'Kanban view' and :244-249 'Gantt view' toggle; src/components/board/Board.vue:49 mounts GanttView; src/components/board/GanttView.vue:63 frappe-gantt, :196-198 Days, Weeks, Months zoom, :303-328 bars from card start and due dates", - "kanboard": "source: the only 'gantt' in app/ is a comment in app/Analytic/AverageLeadCycleTimeAnalytic.php:91; the Gantt is a plugin ; corpus: kanboard/round4/menu-tree.md 'Overview · Board · List'", + "kanboard": "source: the only 'gantt' in app/ is a comment in app/Analytic/AverageLeadCycleTimeAnalytic.php:91; the Gantt is a plugin ; corpus: kanboard/round4/menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: searched app/ (outside Locale) for 'gantt': the only hit is a comment, app/Analytic/AverageLeadCycleTimeAnalytic.php:91; app/Template/project_header/views.php:6-18 no timeline view; the Gantt is a third-party plugin", "openproject": "corpus: openproject/round4/menu-tree.md global 'Gantt charts' and project work package 'Gantt' view ; source read at v17.8.0: modules/gantt/config/routes.rb:3-10 project and global Gantt; modules/gantt/lib/open_project/gantt/engine.rb:41 gantt project module; frontend/src/app/features/work-packages/components/wp-table/timeline/wp-timeline.ts the timeline beside the table", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (Advanced Roadmaps timeline); corpus: jira-data-center/round4/M1-column.md 8.3 plans schedule on target start and end dates", "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in ... gantt layout'" @@ -2310,7 +2353,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'dependent cards' ; _round4/compare/promoted-rows-batch6.md 2.26 'card dependencies (card_api#assignDependentCard, appinfo/routes.php:111, table oc_deck_dependent_cards)' ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards', :56 'Add dependent card', mounted at src/components/card/CardSidebarTabDetails.vue:29-32; lib/Controller/CardController.php:136 assignDependentCard, lib/Service/CardService.php:688, lib/Db/CardMapper.php:673 table deck_dependent_cards", - "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskLink(3, 2, link 2 \"blocks\") and getAllTaskLinks(2) returned the same link as \"is blocked by\" from the other side'", + "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskLink(3, 2, link 2 \"blocks\") and getAllTaskLinks(2) returned the same link as \"is blocked by\" from the other side' ; source read at v1.2.54: app/Schema/Sqlite.php:962-963 'blocks' and 'is blocked by' link pair; app/Template/task/sidebar.php:48 'Add internal link'; app/Model/TaskLinkModel.php:166 create writes both sides", "openproject": "corpus: openproject/round4/M1-column.md 2.10 relation.rb eleven typed entries; 8.9 'a follows relation with lag ... moves a successor'; blocks/blocked by among them ; source read at v17.8.0: app/models/relation.rb:36-39 precedes, follows, blocks, blocked types; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; app/contracts/relations/base_contract.rb:39-43 relation validation", "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may block another' (Linking issues); docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (corpus 8.8)", "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices includes blocked_by with pair 'blocking' (issue.py:272-290)" @@ -2344,7 +2387,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "source: lib/Db/CardMapper.php:674 addDependency skips a duplicate (hasDependency); lib/Service/CardService.php:688-707 checks permissions and archive state only, so a self or circular dependency is not refused ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:152-154 the picker leaves out the card itself, cards already linked and cards of other boards; lib/Db/CardMapper.php:673-676 server skips a duplicate; lib/Service/CardService.php:688-702 checks permission and archive state only, searched it for 'cycle', 'circular': none, so a loop A to B to A is accepted", - "kanboard": "source: app/Validator/TaskLinkValidator.php:29 'A task cannot be linked to itself'; no duplicate or cycle check in the validator ; corpus: kanboard/round4/journeys.md 4", + "kanboard": "source: app/Validator/TaskLinkValidator.php:29 'A task cannot be linked to itself'; no duplicate or cycle check in the validator ; corpus: kanboard/round4/journeys.md 4 ; source read at v1.2.54: app/Validator/TaskLinkValidator.php:29 'A task cannot be linked to itself'; app/Schema/Sqlite.php:958 unique index on link_id, task_id, opposite_task_id refuses the same link twice, app/Model/TaskLinkModel.php:174-176 then returns false; no cycle check anywhere in the validator or model", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/en.yml:555 'circular_dependency: This relation would create a circular dependency.' and :851 'The relationship creates a circle of relationships'; corpus: openproject/round4/M1-column.md 2.10 relations normalised by 'before_validation :reverse_if_needed' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/relations/base_contract.rb:67-68 adds 'circular_dependency' when :99-100 the target is not in WorkPackage.relatable; app/models/work_packages/scopes/relatable.rb:178 relatable excludes cycles; app/models/relation.rb:137 uniqueness of to per from blocks duplicates; config/locales/en.yml:505 'This relation would create a circular dependency.'", "jira": "docs: https://jira.atlassian.com/browse/JRA-10068 'Posibility of creation circular references', Closed, Won't Fix: 'It is posible to create circular dependancies or duplicates on issues'; Advanced Roadmaps only flags the conflict (docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'The badges on either end will turn red if there are conflicting dates')", "plane": "source: apps/api/plane/db/models/issue.py:306-312 UniqueConstraint on (issue, related_issue) blocks duplicates, and apps/api/plane/app/views/issue/relation.py:229-245 bulk_create(ignore_conflicts=True) drops them silently; no self or circular check in relation.py create. Corpus silent" @@ -2377,7 +2420,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "source: src/components/cards/CardBadges.vue shows no dependency badge; src/components/card/DependentCardsSelector.vue lists dependencies with their done state inside the card only ; source read at v1.19.0: searched src/components/cards/CardBadges.vue and src/components/cards/CardItem.vue for 'depend', 'block': no badge on the board card; src/components/card/DependentCardsSelector.vue:13-32 lists each dependency with its done state, struck through when done, inside the card only", - "kanboard": "source: app/Template/board/task_footer.php:89-90 a link count icon with a tooltip listing the links, not a blocked state ; corpus: kanboard/round4/journeys.md 4 search 'link:\"is blocked by\"' finds them", + "kanboard": "source: app/Template/board/task_footer.php:89-90 a link count icon with a tooltip listing the links, not a blocked state ; corpus: kanboard/round4/journeys.md 4 search 'link:\"is blocked by\"' finds them ; source read at v1.2.54: app/Template/board/task_footer.php:89-90 a link count icon whose tooltip lists the links, no blocked state; app/Filter/TaskLinkFilter.php lets a search find 'is blocked by' links; searched app/Template/board for 'blocked': none", "openproject": "relations are listed on the work package and drawn in the Gantt (corpus: openproject/round4/M1-column.md 2.10), but no card or list badge marks a task blocked by unfinished work; agile-boards README documents no blocked marker ; source read at v17.8.0: app/models/queries/work_packages/filter/blocked_filter.rb:33 a list filter for 'blocked by' exists; frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html has no blocked marker (searched it for 'blocked', 'blocks': none); relations display in the table became Community in 17.8", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html numbered badges on the schedule bar that 'turn red if there are conflicting dates' (timeline only); on the board a blocked state is a manual flag or a query colour (https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per JQL query')", "plane": "source: grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits; ISSUE_DISPLAY_PROPERTIES (packages/constants/src/issue/common.ts) has no blocked property. Relations show only on the work item page" @@ -2411,7 +2454,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/board/GanttView.vue:297-325 cardToGanttTask passes id, name, start, end, progress and no dependencies to frappe-gantt, so dependent cards are not drawn ; source read at v1.19.0: src/components/board/GanttView.vue:303-328 cardToGanttTask passes id, name, start, end, progress and class with no dependencies field; searched GanttView.vue for 'dependencies': none, so frappe-gantt draws no arrows", - "kanboard": "no timeline in core (pln-gantt)", + "kanboard": "no timeline in core (pln-gantt) ; source read at v1.2.54: no timeline in core: searched app/ for 'gantt', the only hit is a comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'To add dependencies between work packages, you can set them as predecessor or successor in the Gantt chart' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive.ts:39-43 draws TimelineRelationElement lines from WorkPackageRelationsService; app/models/relation.rb:36-37 precedes and follows", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar based on dependency type'", "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx:26 declares enableDependency and the ChartDraggable body (:30-39) never destructures or uses it; no dependency path component in the tree. A hollow shim like those in corpus: plane/round4/open-core.md" @@ -2444,7 +2487,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'has reached its due date' : the ScheduledNotifications job notifies at the due date, not ahead of it ; _round4/compare/promoted-rows-batch6.md 8.14 'notifies once, marking notified' ; source read at v1.19.0: lib/Cron/ScheduledNotifications.php:33-39 notifies on cards from lib/Db/CardMapper.php:358-367 findOverdue, where duedate is before NOW(), once per card via notified; lib/Notification/NotificationHelper.php:88-95 subject 'card-overdue', so the notice comes when the due date passes, never ahead of it", - "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 8.14 'the daily cron fires task.overdue and mails the assignee' (after the date, not before) ; source: app/Console/TaskOverdueNotificationCommand.php:18-22", + "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 8.14 'the daily cron fires task.overdue and mails the assignee' (after the date, not before) ; source: app/Console/TaskOverdueNotificationCommand.php:18-22 ; source read at v1.2.54: app/Console/TaskOverdueNotificationCommand.php:18-19 'notification:overdue-tasks' mails once the date has passed, :151-165 per user; ahead of the date only as a workaround, app/Action/TaskMoveColumnOnDueDate.php:22 moves a task N days before due, which notifies watchers of the move", "openproject": "corpus: openproject/round4/M1-column.md 8.6 'date alerts are exactly this feature and they are Enterprise gated ... both return early without the token'; 8.4 'app/models/reminder.rb:31' manual reminders are free ; source read at v17.8.0: app/workers/notifications/schedule_date_alerts_notifications_job.rb:38 and app/workers/notifications/create_date_alerts_notifications_job.rb:41 automatic due alerts return early without the :date_alerts token; app/models/reminder.rb:31 and config/routes.rb:1076-1077 manual per work package reminders are free", "jira": "corpus: jira-data-center/round4/M1-column.md 8.4 'a scheduled rule can send out a reminder to the assignee'; 8.6 'a filter subscription on duedate < now() mails on a schedule'; nothing fires before the due date without a rule", "plane": "corpus: plane/round4/journeys.md 'A due date that notifies nobody. target_date is a sortable, filterable column, and nothing in the scheduler reads it' ; code-census.md §8 'Reminder or due-date job: absent'" @@ -2470,11 +2513,11 @@ "nextcloud-deck": "no", "openproject": "partial", "plane": "no", - "kanboard": "no", + "kanboard": "partial", "jira": "partial", "evidence": { "nextcloud-deck": "source: lib/Cron/ScheduledNotifications.php:34 fires on due date; ConfigService reads calendar, trashRetentionHours and groupLimit only (corpus: nextcloud-deck/round4/open-core.md) ; source read at v1.19.0: lib/Db/CardMapper.php:362 the only trigger is duedate < NOW(); lib/Service/ConfigService.php:77-256 app values are federationEnabled, calendar, cardIdBadge, groupLimit and trashRetentionHours, no reminder offset; searched lib/ for 'leadTime', 'reminder', 'before': none", - "kanboard": "source: app/Console/TaskOverdueNotificationCommand.php options show, group, manager; no days-ahead setting ; corpus: kanboard/round4/code-census.md 90 config constants, none a lead time", + "kanboard": "source: app/Console/TaskOverdueNotificationCommand.php options show, group, manager; no days-ahead setting ; corpus: kanboard/round4/code-census.md 90 config constants, none a lead time ; 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 app/Action/TaskMoveColumnOnDueDate.php:22 'Move the task to another column when the due date is less than a certain number of days', :45 'Duration in days', :72-77 daily cron check; app/Action/TaskEmail.php:23,35 'Send a task by email to someone' on that move; registered at app/ServiceProvider/ActionProvider.php:108", "openproject": "corpus: openproject/round4/M1-column.md 8.6 date alerts carry a per-user duration (code-census #7 'the contract rejects a write that sets a date alert duration' without the token): per user, not admin, and Enterprise gated ; source read at v17.8.0: app/contracts/user_preferences/params_contract.rb:37 DATE_ALERT_DURATIONS nil, 0, 1, 3, 7 days chosen per user, and :34-35 enterprise_action :date_alerts on any write that sets them; app/components/my/notifications/show_page_component.html.erb:61-64 per user setting with Enterprise banner; searched app/views/admin and app/components/admin for a date alert lead time: none", "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 a rule writes '{{now.plusDays(3).toBusinessDay()}}'; an admin builds the lead time into a scheduled automation rule (8.4, 8.6); no setting", "plane": "corpus: plane/round4/code-census.md §8 'A due date in Plane CE never notifies anybody', so there is no lead time to set" @@ -2504,7 +2547,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'the notify-due choice per user' ; code-census.md 'notify-due per user per board' (lib/Notification/NotificationHelper.php:66) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:83 'Turn off due date reminders', :102-130 'Due date reminders' all, assigned or 'No notifications' per board; lib/Service/ConfigService.php:22-25 and :191 per-user notify-due values; lib/Notification/NotificationHelper.php:66-70 skips users set to off", - "kanboard": "source: app/Template/user_view/notifications.php:9 notification_types checkboxes per user, with the assignee/creator filter (promoted-rows-batch7.md 13.18 'by the user's own filter')", + "kanboard": "source: app/Template/user_view/notifications.php:9 notification_types checkboxes per user, with the assignee/creator filter (promoted-rows-batch7.md 13.18 'by the user's own filter') ; source read at v1.2.54: app/Template/user_view/notifications.php:9 notification methods, :12-13 'I want to receive notifications for:' filter, :17 per project; app/Console/TaskOverdueNotificationCommand.php:134,157 overdue mails only go to users with notifications on and passing their filter; the opt out is for all notifications, not reminders alone", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md in-app and email notification settings per user; the automatic due alerts to opt out of are Enterprise gated (corpus: openproject/round4/M1-column.md 8.6), so on the free build there is nothing automatic to turn off (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/my/notifications/show_page_component.html.erb:42 the date alert toggles render only when date_alerts_available?, else :64 an Enterprise banner; app/menus/notifications/menu.rb:142 same gate; general notification settings are free", "jira": "corpus: jira-data-center/round4/M1-column.md 8.6 filter subscriptions are created 'for yourself and/or other users'; a rule-sent reminder has no per-user opt-out documented", "plane": "corpus: plane/round4/code-census.md §8 no due reminder exists; UserNotificationPreference (notification.py:104-108) has property_change, state_change, comment, mention, issue_completed and nothing for due dates" @@ -2534,7 +2577,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/board/GanttView.vue:275 dragging a bar calls updateTaskDate, :373-377 dispatches updateCardDates with the new startdate and duedate ; not in the round-4 drive (menu-tree.md) ; source read at v1.19.0: src/components/board/GanttView.vue:369 bars editable when the user can edit, :371-372 on_date_change keeps the drag, :276-279 commits it through updateTaskDate, :379-384 dispatches updateCardDates with the new startdate and duedate; lib/Controller/CardController.php:67 update", - "kanboard": "no timeline in core (pln-gantt)", + "kanboard": "no timeline in core (pln-gantt) ; source read at v1.2.54: no timeline in core: searched app/ for 'gantt', only the comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91; drag to reschedule is the third-party Gantt plugin", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/README.md (gantt-chart.gif, create-new-element-gantt-chart.gif) drag bars to change dates; corpus: openproject/round4/journeys.md duration derivation on edit (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-mouse-handler.ts:63-97 mousedown on a bar starts a drag that shifts or resizes the dates; the change is saved through the work package update service", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'adjust the dates by clicking and dragging the ends of the schedule bar'", "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx LeftResizable, RightResizable and onMouseDown handleBlockDrag(e, \"move\"); chart/timeline-drag-helper.tsx ; corpus: plane/round4/menu-tree.md gantt layout" @@ -2564,7 +2607,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/pending-rows-batch6.md 3.21 'a dependent card is a link; nothing moves a date' ; source read at v1.19.0: lib/Service/CardService.php:688-702 adding a dependency stores a link and fires activity, no date is touched; src/components/board/GanttView.vue:379-384 a drag updates only the dragged card; searched lib/ for 'reschedule', 'shift' on dependent cards: none", - "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 3.21 'a link moves no date: TaskLinkModel writes two rows and fires an event'", + "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 3.21 'a link moves no date: TaskLinkModel writes two rows and fires an event' ; source read at v1.2.54: app/Model/TaskLinkModel.php:166-180 creating a link writes two rows and fires task_internal_link.create_update, no date change; searched app/Action for a link-driven date shift: none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'there is an automatic scheduling mode and a manual scheduling mode (default) (new in release 15.4) ... determine how work packages behave when the dates of related work packages change'; corpus: openproject/round4/M1-column.md 8.9 set_schedule_service.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/work_packages/date_picker/dialog_content_component.html.erb:10-16 manual or automatic scheduling in the date picker; app/contracts/work_packages/base_contract.rb:116 schedule_manually; app/services/work_packages/set_schedule_service.rb:31-41 reschedules followers when start or due date changes, called from app/services/work_packages/set_attributes_service.rb:322", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'The Auto-scheduler constructs a plan using issue details based on your plan settings', considering dependencies, capacity and estimates", "plane": "source: gantt-chart/blocks/block.tsx:32 updateBlockDates(IBlockUpdateDependencyData[]) is a seam, but dependency handling is dropped in draggable.tsx (see pln-deps-on-timeline) and relation.py create changes no dates; corpus: plane/round4/code-census.md §8 'No other module computes a date'" @@ -2593,7 +2636,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "source: grep -rniF 'critical' lib returns only the Trello importer; the Gantt (GanttView.vue) computes no path ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'critical': none; src/components/board/GanttView.vue:303-328 bars carry no dependency or slack data to compute a path", - "kanboard": "no timeline in core ; source: grep -rniF 'critical path' app returns 0 hits", + "kanboard": "no timeline in core ; source: grep -rniF 'critical path' app returns 0 hits ; source read at v1.2.54: searched app/ (outside Locale) for 'critical path', 'critical_path': none; no timeline in core, the only 'gantt' is a comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'Is there a critical path feature? Unfortunately, we don't have the critical path feature yet' ; source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml) for 'critical path', 'critical_path': none; docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'we don't have the critical path feature yet'", "jira": "docs: Advanced Roadmaps pages read (dependencies, auto-schedule, releases) name no critical path; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html lists the factors it schedules on and none is a critical path", "plane": "source: grep -rliE 'critical.?path' over apps and packages (*.ts, *.tsx, *.py, *.json) returns nothing; corpus: plane/round4/code-census.md §8 no date arithmetic beyond relative filters" @@ -2622,7 +2665,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones ; source read at v1.19.0: searched lib/ and src/ for 'milestone': none; src/components/board/GanttView.vue:303-328 every bar is a card with a start and end, no zero-length milestone marker", - "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' ; 8.8 'no' milestones with planned intervals: a milestone is a linked task, not a timeline marker", + "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' ; 8.8 'no' milestones with planned intervals: a milestone is a linked task, not a timeline marker ; source read at v1.2.54: app/Schema/Sqlite.php:968-969 'targets milestone' and 'is a milestone of' link labels; a milestone is an ordinary task linked from app/Template/task/sidebar.php:48 'Add internal link', with no timeline to place it on", "openproject": "corpus: openproject/round4/M1-column.md 8.8 'milestone is a built-in type forced to duration 1 (app/services/work_packages/set_attributes_service.rb:367-368)' ; source read at v17.8.0: app/models/type.rb:285-286 is_milestone per type; app/models/work_package.rb:290-291 milestone?; app/services/work_packages/set_attributes_service.rb:87-93 unify milestone dates to one day; drawn as a diamond on the Gantt timeline", "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 'milestones are releases in a plan' (Releases in Advanced Roadmaps); no milestone item type", "plane": "source: i18n 'Milestones ... Enable milestones' strings (packages/i18n/src/locales/en) have no caller outside locales (grep milestones_description returns only locale files), so milestones are a closed-build feature; modules draw on the module timeline as dated bars (corpus: plane/round4/M1-column.md 8.8 'Cycle and Module carry start and end dates ... a milestone in the planning sense')" @@ -2651,7 +2694,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "no plan to baseline ; source: grep -rniF 'baseline' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'baseline': only CSS var(--default-grid-baseline), e.g. src/components/Controls.vue:539; lib/Db/Card.php:90-91 one duedate and one startdate, no saved plan", - "kanboard": "no plan to baseline ; source: grep -rniF 'baseline' app returns 0 hits", + "kanboard": "no plan to baseline ; source: grep -rniF 'baseline' app returns 0 hits ; source read at v1.2.54: searched app/ (outside Locale) for 'baseline': none; no plan object to snapshot", "openproject": "corpus: openproject/round4/open-core.md baseline_comparison Enterprise gated; 'Timestamp.allowed ... otherwise selects only those that are one_day_ago? or newer', so the free build compares against yesterday at most ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-baseline/baseline the Baseline dropdown on the table; app/models/timestamp.rb:108-111 without the :baseline_comparison token only timestamps from yesterday onward are allowed, so the free build compares against yesterday at most", "jira": "corpus: jira-data-center/round4/M1-column.md 2.16 'No as-at view of the whole issue'; Advanced Roadmaps pages read have no baseline", "plane": "source: grep -rliE 'baseline' apps/api --include=*.py returns only two test docstrings (tests/contract/api/test_projects.py:109, test_workspace_user_preference_app.py:69), no baseline model; corpus: plane/round4/code-census.md §8 date fields list has no baseline" @@ -2680,7 +2723,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 8.11 'nothing knows a working day' and 8.12 'no calendar of holidays anywhere in Deck' ; source read at v1.19.0: searched lib/ and src/ for 'holiday', 'workday', 'working day': none; 'weekend' is only the due date quick pick at src/components/card/DueDateSelector.vue:178 and Gantt shading colours at src/components/board/GanttView.vue:530", - "kanboard": "corpus: kanboard/round4/code-census.md empty grep 'working.?day|business.?day|holiday' ; promoted-rows-batch7.md 8.11 'and it was measured'", + "kanboard": "corpus: kanboard/round4/code-census.md empty grep 'working.?day|business.?day|holiday' ; promoted-rows-batch7.md 8.11 'and it was measured' ; source read at v1.2.54: searched app/ (outside Locale) for 'working day', 'business day', 'holiday': none; app/Action/TaskMoveColumnOnDueDate.php:72 counts plain calendar days, duration times 86400", "openproject": "corpus: openproject/round4/journeys.md 'The derived date cannot land on a weekend or an administered holiday: ... 0 non-working results in 1675 computations'; /admin/settings/working_days_and_hours ; source read at v17.8.0: config/routes.rb:885 admin working days and hours settings; app/models/non_working_day.rb holidays; app/services/work_packages/shared/days.rb:38 duration uses WorkingDays unless ignore_non_working_days", "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 'working days exist only for board reports (Configuring working days)' and the JQL clock counts calendar days; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html does not mention absences or non-working days", "plane": "corpus: plane/round4/code-census.md §8 'grep holiday|business_day|working_day|bizdays returns 0 hits'; 'A month is thirty days'" @@ -2710,7 +2753,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Calendar. With the bridge on, every board is a CalDAV calendar ... so the Calendar app and a phone show the deadlines. Verified live' : the calendar view is the platform Calendar app, not inside Deck ; source read at v1.19.0: appinfo/info.xml:93 registers lib/DAV/CalendarPlugin.php, lib/DAV/Calendar.php:207 one VTODO calendar per board, lib/Db/Card.php:140 a card becomes a VTODO, shown by the platform Calendar app; src/components/DeckAppSettings.vue:22-23 'Show boards in calendar/tasks'; src/router.js:29-153 no calendar view inside Deck", - "kanboard": "corpus: kanboard/round4/usability.md 'no calendar' ; menu-tree.md 'Overview · Board · List' (the calendar view is a plugin)", + "kanboard": "corpus: kanboard/round4/usability.md 'no calendar' ; menu-tree.md 'Overview · Board · List' (the calendar view is a plugin) ; source read at v1.2.54: ChangeLog:1196 'Move calendar to external plugin'; app/ServiceProvider/AuthenticationProvider.php:87 still names CalendarController but no such file exists in app/Controller; app/Template/project_header/views.php:6-18 views are Overview, Board, List", "openproject": "corpus: openproject/round4/menu-tree.md project 'Calendars'; docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'How to create, use and subscribe to a calendar' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/calendar/config/routes.rb:2-6 project calendars; modules/calendar/lib/open_project/calendar/engine.rb:29 calendar_view module; frontend/src/app/features/calendar/calendar-entry.component.ts the calendar page", "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 'the Marketplace calendars (Event Calendar for Jira ...) display, they do not book': a calendar view is a Marketplace app; Team Calendars is a Confluence product", "plane": "corpus: plane/round4/menu-tree.md 'calendar ... layouts' ; code-census.md §12 'There is a calendar layout for issues in the web app'" @@ -2739,7 +2782,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'every card with a due date a VTODO in it ... Verified live with a REPORT on the board's calendar' ; open-core.md caveat: API-set time zones republished as UTC ; source read at v1.19.0: appinfo/info.xml:93 lib/DAV/CalendarPlugin.php platform CalDAV plugin; lib/DAV/Calendar.php:207 VTODO calendar per board; lib/Db/Card.php:138-160 DUE, DTSTART and STATUS from the card; lib/DAV/CalendarObject.php:58-59 objects are read-only to CalDAV clients; src/components/DeckAppSettings.vue:22-23 per-user switch", - "kanboard": "corpus: kanboard/round4/journeys.md 6 'the iCal feed (text/calendar, one VEVENT per dated task)' behind a public token ; source: app/Template/user_view/share.php:9 per-user iCal feed : read-only subscription, not CalDAV", + "kanboard": "corpus: kanboard/round4/journeys.md 6 'the iCal feed (text/calendar, one VEVENT per dated task)' behind a public token ; source: app/Template/user_view/share.php:9 per-user iCal feed : read-only subscription, not CalDAV ; source read at v1.2.54: app/Template/user_view/share.php:9 per user 'iCal feed', app/Template/project_view/share.php:12 per project feed; app/Controller/ICalendarController.php:22 user, :62 project, token based and read only; searched app/ for 'caldav': none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'Subscribe to a calendar: OpenProject allows you to subscribe to and access any of your calendars using an external client that supports the iCalendar format'; corpus: openproject/round4/menu-tree.md admin 'Calendar subscriptions' (iCal feed, read-only, counts as the generic capability) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/calendar/config/routes.rb:17 per calendar '/ical' feed; modules/calendar/app/controllers/calendar/ical_controller.rb:35 show; config/locales/js-en.yml:396 'use the URL (iCalendar) to subscribe to this calendar in an external client'; config/initializers/menus.rb:526-529 admin 'Calendar subscriptions'; a read-only iCal subscription, not two-way CalDAV", "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 dates on an issue are due dates; no iCal or CalDAV feed in the 983 pages the corpus read (1.9 integrations page covers Confluence only)", "plane": "corpus: plane/round4/code-census.md §12 'iCal / calendar feed: absent ... no feed a calendar client can subscribe to, and no CalDAV'" @@ -2768,7 +2811,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/board/Board.vue:49 the Gantt view is per board; nothing combines boards on one timeline (the platform Calendar shows several board calendars, menu-tree.md Calendar, which is not a timeline) ; source read at v1.19.0: src/components/board/GanttView.vue:205-209 the timeline is built from this.stacks of the open board only; src/components/board/Board.vue:49 it is a view mode of one board; src/components/overview/Overview.vue:57-83 the cross-board view is due-date columns, not a timeline", - "kanboard": "no timeline in core (pln-gantt)", + "kanboard": "no timeline in core (pln-gantt) ; source read at v1.2.54: no timeline in core: searched app/ for 'gantt', only the comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91", "openproject": "corpus: openproject/round4/menu-tree.md global module 'Gantt charts' across projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart OpenProject-overarching-project-planning.png (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/gantt/config/routes.rb:16-24 global Gantt outside any project; modules/gantt/lib/open_project/gantt/engine.rb:60 global menu item; app/components/projects/index_page_header_component.rb:64-66 'Open as Gantt' from the project list via app/services/projects/gantt_query_generator_service.rb", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; Advanced Roadmaps plans take several projects and boards as sources (corpus: jira-data-center/round4/M1-column.md 8.8 plan releases across a plan)", "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) layouts are spreadsheet and list only, no gantt; the gantt is per project. Corpus silent" @@ -2798,7 +2841,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", - "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md Analytics 'Estimated vs actual time'", + "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md Analytics 'Estimated vs actual time' ; source read at v1.2.54: app/Helper/TaskHelper.php:204-209 'Original estimate' on the task form; app/Template/subtask/create.php:20 subtask estimate; app/Template/subtask/timer.php:9 '%sh estimated'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md:6 'estimated time, remaining time, work'; corpus: openproject/round4/M1-column.md 3.15 derived progress values (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:77 estimated_hours (Work), :80 derived_estimated_hours, :83 remaining_hours; app/models/work_package.rb:646 duration strings parsed on write; shown as Work and Remaining work on the work package", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'When work is first logged against the issue, the Time Spent is subtracted from the Original Estimate'", "plane": "source: packages/constants/src/estimates.ts:122-140 the 'time' (hours) estimate system is is_ee: true, and apps/web/core/components/estimates/create/helper.tsx:10-18 isEstimateSystemEnabled returns false for anything but POINTS and CATEGORIES; corpus: plane/round4/code-census.md §10 'Time tracking and worklogs: absent'. Time estimates are a paid-build feature, absent from Community" @@ -2827,7 +2870,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; lib/Db has no time entry entity", - "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Model/TaskCreationModel.php:67 time_spent on the task form, app/Model/SubtaskTimeTrackingModel.php:245 updateSubtaskTimeSpent", + "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Model/TaskCreationModel.php:67 time_spent on the task form, app/Model/SubtaskTimeTrackingModel.php:245 updateSubtaskTimeSpent ; source read at v1.2.54: app/Template/task_modification/show.php:30 'Time spent' on the task edit form, app/Helper/TaskHelper.php:215-220; app/Template/subtask/edit.php:11 subtask time spent", "openproject": "corpus: openproject/round4/menu-tree.md project 'Time and costs'; docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md 'Log time'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/js-en.yml:168 'Log time'; modules/costs/app/components/time_entries/entry_dialog_component.rb the log time dialog; modules/costs/config/routes.rb:32 time_entries create, update, destroy; modules/costs/lib/costs/engine.rb:48-54 log_own_time and log_time permissions", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html work logs with 'Edit Own Work Logs' and 'Delete Own Work Logs' permissions", "plane": "corpus: plane/round4/code-census.md §10 'There is no worklog table, no timer, no duration field, no UI'; menu-tree.md 'no Time tracking'. 'Full Time Tracking' is a Pro string (open-core.md)" @@ -2856,7 +2899,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no duration field to type into: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; the only time inputs are date pickers, src/components/card/DueDateSelector.vue:10", - "kanboard": "source: time fields are decimal hours rendered as '%sh spent' (app/Template/subtask/timer.php:3,9); no parsing of '1h 30m' found (grep -rniE '[0-9]h ?[0-9]+m' app/Core/DateParser.php returns nothing)", + "kanboard": "source: time fields are decimal hours rendered as '%sh spent' (app/Template/subtask/timer.php:3,9); no parsing of '1h 30m' found (grep -rniE '[0-9]h ?[0-9]+m' app/Core/DateParser.php returns nothing) ; source read at v1.2.54: app/Helper/TaskHelper.php:209,220 time fields are numeric decimal hours, app/Helper/FormHelper.php:381 numeric; app/Template/subtask/timer.php:3 '%sh spent'; searched app/Core/DateParser.php for an 'h m' duration parser: none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/duration_converter.rb:147 'ChronicDuration.parse(duration_string' and modules/costs/app/helpers/costs/number_helper.rb:79 falls back to DurationConverter.parse for hours strings, so '1h 30m' parses (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/app/components/time_entries/days_and_hours_form.rb:73-79 visible hours_display field with hidden hours; frontend/src/stimulus/controllers/dynamic/time-entry.controller.ts:166-171 parses it with durationStringToSeconds, so '1h 30m' works; app/services/duration_converter.rb:78, :140 server parse with ChronicDuration", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can specify additional time units after a time value X, such as Xw, Xd, Xh, or Xm'", "plane": "corpus: plane/round4/code-census.md §8 'no duration type' and §10 no duration field" @@ -2885,7 +2928,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; src/router.js:29-153 no timesheet route", - "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Template/user_view/timesheet.php:5-23 'Subtask timesheet' per user with Start, End and Time spent, sortable by start, not grouped by date", + "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Template/user_view/timesheet.php:5-23 'Subtask timesheet' per user with Start, End and Time spent, sortable by start, not grouped by date ; source read at v1.2.54: app/Template/user_view/sidebar.php:19 'Time tracking'; app/Controller/UserViewController.php:57 timesheet; app/Template/user_view/timesheet.php:5-15 'Subtask timesheet' rows with task, subtask, start, end, time spent, sortable but not grouped by date", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/my-time-tracking/README.md 'The My time tracking module offers a clear overview of your personal time entries' in 'a calendar or list view'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/config/routes.rb:59 '/time-tracking/(:mode-:view_mode)(/:date)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/config/routes.rb:50-56 /time-tracking by day, week, workweek or month in list or calendar view; modules/costs/app/controllers/my/time_tracking_controller.rb:45 index; modules/costs/app/components/my/time_tracking/list_stats_component.rb:51 totals per period", "jira": "docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'; timesheets are the Marketplace apps Tempo Timesheets and Timesheet Reports and Gadgets, not the product", "plane": "corpus: plane/round4/code-census.md §10 'The paid strings \"Full Time Tracking + Bulk Ops\", \"Historical timesheets\" ... are absent'" @@ -2915,7 +2958,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: neither logged time nor an estimate exists: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", - "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time · Estimated vs actual time per column' ; source: app/Template/subtask/timer.php:2-9 spent/estimated on the subtask", + "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time · Estimated vs actual time per column' ; source: app/Template/subtask/timer.php:2-9 spent/estimated on the subtask ; source read at v1.2.54: app/Template/task/time_tracking_summary.php:8-10 'Estimate', 'Spent', 'Remaining' on the task's time tracking page, app/Controller/TaskViewController.php:108-120; app/Template/subtask/timer.php:3-9 spent over estimated; app/Controller/AnalyticController.php:43 timeComparison", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md work and remaining work; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/work_packages/scopes/include_spent_time.rb (spent time beside work on the work package) Note: include_spent_time.rb is in the 18.0-dev tree only; the progress-tracking docs cited are present at v17.8.0, and spent time beside work predates the drive. ; source read at v17.8.0: lib/api/v3/work_packages/work_package_representer.rb:458 spent_time property beside estimated and remaining hours; app/contracts/work_packages/base_contract.rb:77-83 estimated_hours and remaining_hours; both shown as Spent time and Work in the work package details", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html Time Spent against Original Estimate and Remaining Estimate; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html Time Tracking Report shows 'Original Estimate, Estimated Time Remaining, Time Spent, and Accuracy'", "plane": "corpus: plane/round4/code-census.md §10 no worklog; estimates are points or categories only (helper.tsx:10-18)" @@ -2945,7 +2988,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no time entry to correct: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", - "kanboard": "source: app/Template/task/time_tracking_details.php:5 'editable' => false : timer entries cannot be edited or removed; only the task and subtask time_spent totals are editable in their forms", + "kanboard": "source: app/Template/task/time_tracking_details.php:5 'editable' => false : timer entries cannot be edited or removed; only the task and subtask time_spent totals are editable in their forms ; source read at v1.2.54: app/Template/task/time_tracking_details.php:15-29 timer entries listed with user, start, end, time spent and no edit or remove link; only the totals are editable, app/Template/task_modification/show.php:30 and app/Template/subtask/edit.php:11", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:22-23 'Edit logged time', 'Delete time entries' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/app/controllers/time_entries_controller.rb:101 update and :125 destroy; modules/costs/config/routes.rb:32 time_entries update, destroy; modules/costs/lib/costs/engine.rb:61 edit_own_time_entries and :66 edit_time_entries", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can edit your own work log entries if you have been granted the Edit Own Work Logs permission' and 'delete your own work log entries'", "plane": "corpus: plane/round4/code-census.md §10 no time entries exist to correct" @@ -2975,7 +3018,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; src/router.js:29-153 no report route", - "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time' per project and the per-user 'Time tracking' page (app/Template/user_view/sidebar.php:19); no report of time per person across projects", + "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time' per project and the per-user 'Time tracking' page (app/Template/user_view/sidebar.php:19); no report of time per person across projects ; source read at v1.2.54: app/Template/analytic/sidebar.php:22 'Estimated vs actual time' per project, app/Controller/AnalyticController.php:43; app/Template/user_view/sidebar.php:19 per user 'Time tracking'; no report of time per person across projects", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md time and cost reports grouped by user, project and more (corpus: openproject/round4/M1-column.md 10.4 'the reporting module is a real pivot engine over cost and time') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/reporting/config/routes.rb:31 cost_reports; modules/reporting/app/models/cost_query/group_by/user_id.rb and project_id.rb group time by person and project, with spent_on, week, tmonth and more beside them", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Time Tracking Report' per version and 'User Workload Report: Shows how much work a user has been allocated'; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'", "plane": "corpus: plane/round4/code-census.md §10 'Dashboards: absent', no worklogs; Analytics is 'a two-dimensional count' of work items (menu-tree.md)" @@ -3008,7 +3051,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; the row is specific to the fleet's HR app ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'humaniq', 'payroll': none; the row names the fleet's HR app, which Deck does not know", - "kanboard": "the row is specific to the fleet's HR app; Kanboard stores time in its own subtask_time_tracking table only (corpus: kanboard/round4/code-census.md objects table)", + "kanboard": "the row is specific to the fleet's HR app; Kanboard stores time in its own subtask_time_tracking table only (corpus: kanboard/round4/code-census.md objects table) ; source read at v1.2.54: hours live only in Kanboard's own tables: app/Model/SubtaskTimeTrackingModel.php:245 updateSubtaskTimeSpent, :263 updateTaskTimeTracking; searched app/ for an HR or payroll hand-off: none", "openproject": "no HR app integration; time entries live in the costs module only (source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb); corpus: openproject/round4/M1-column.md section 12 (Integrations) lists no HR system ; source read at v17.8.0: modules/costs/app/models/time_entry.rb:47-56 time entries live in OpenProject's own costs module; searched app, lib and modules (rb) for 'payroll': none, and no HR system integration exists", "jira": "corpus: jira-data-center/round4/M1-column.md 12.5 and 12.12 integrations list test management, source control and collaboration tools; no HR or payroll hand-off", "plane": "corpus: plane/round4/code-census.md §10 no hours recorded at all, and no HR integration (§12)" @@ -3038,7 +3081,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; 'timer' in src/ is only the drag autoscroll interval at src/components/board/Stack.vue:365-391", - "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md task sidebar 'Time tracking' ; source: app/Model/SubtaskTimeTrackingModel.php:143 toggleTimer", + "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md task sidebar 'Time tracking' ; source: app/Model/SubtaskTimeTrackingModel.php:143 toggleTimer ; source read at v1.2.54: app/Template/subtask/timer.php:12-13 timer shown to the subtask's assignee; app/Helper/SubtaskHelper.php:80 renderTimer; app/Controller/SubtaskStatusController.php:44 timer, logStartTime and logEndTime", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:54 'Starting with OpenProject 13.0, you can also track time in real time using the start/stop time tracking button'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/controllers/my/timer_controller.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-timer-button/wp-timer-button.component.ts:82 'Stop' and :99-100 stop via TimeEntryTimerService; frontend/src/app/shared/components/time_entries/timer/timer-account-menu.component.ts running timer in the account menu; modules/costs/app/models/time_entry.rb:47 ongoing time entries; modules/costs/config/routes.rb:49 /timer", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html documents logging entered durations only; timers are Marketplace apps", "plane": "corpus: plane/round4/code-census.md §10 'no timer'" @@ -3067,7 +3110,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'approv': none", - "kanboard": "source: grep -rniE 'approv' app/Model returns no timesheet approval ; corpus: kanboard/round4/code-census.md objects table", + "kanboard": "source: grep -rniE 'approv' app/Model returns no timesheet approval ; corpus: kanboard/round4/code-census.md objects table ; source read at v1.2.54: searched app/Model and app/Controller for 'approv': none; app/Template/user_view/timesheet.php:5 the timesheet is a read-only list", "openproject": "corpus: openproject/round4/M1-column.md 3.13 'grep -rliI approval|approve app/models modules/*/app/models returns nothing' ; source read at v17.8.0: searched app/models, modules/*/app/models, modules/costs and modules/reporting for 'approv': none; modules/costs/config/routes.rb:32 time entries have create, update, destroy only, no submit or approve", "jira": "corpus: jira-data-center/round4/M1-column.md 3.13 'the approval step is JSM DC'; no timesheet object to approve (tim-timesheet)", "plane": "corpus: plane/round4/code-census.md §3 'Approvals: absent' and §10 no timesheets" @@ -3096,7 +3139,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no time entries to export: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; the board export at src/components/navigation/BoardExportModal.vue:12-18 writes cards, not time", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Exports' ; source: app/Export/SubtaskExport.php:57-64 CSV with 'Time estimated', 'Time spent' per subtask; no export of individual time entries", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Exports' ; source: app/Export/SubtaskExport.php:57-64 CSV with 'Time estimated', 'Time spent' per subtask; no export of individual time entries ; source read at v1.2.54: app/Template/project_header/dropdown.php:63 'Exports'; app/Export/SubtaskExport.php:57-64 CSV with 'Time estimated' and 'Time spent' per subtask; no export of the individual timer entries in app/Export", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md:93 'To export reports for time and costs to Excel you can open or create a report in the Time and costs module' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/reporting/app/controllers/cost_reports_controller.rb:78-85 the time and costs report answers format.xls and format.pdf exports; modules/reporting/config/routes.rb:31 cost_reports; modules/xls_export provides the spreadsheet writer", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'Export > CSV (All fields)' carries the issue's time spent fields (corpus: jira-data-center/round4/M1-column.md 10.3), not individual work logs; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'", "plane": "corpus: plane/round4/code-census.md §10 'exporter.py:31 lists (\"issue_worklogs\", \"Issue Worklogs\") ... but grep issue_worklogs finds no producer'" @@ -3125,7 +3168,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'billable', 'invoice', 'hourlyRate': none", - "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal returns 26 hits and none is a payment' ; no invoicing hand-off", + "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal returns 26 hits and none is a payment' ; no invoicing hand-off ; source read at v1.2.54: searched app/ (outside Locale) for 'invoice' and 'payment': none; app/Export holds only SubtaskExport.php, TaskExport.php, TransitionExport.php", "openproject": "cost reports compute cash value from rates (docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md 'Labor, Cash value'), but no invoice object or accounting hand-off exists (corpus: openproject/round4/M1-column.md 12.12 'no payment integration') ; source read at v17.8.0: searched app, lib and modules (rb) for 'invoice': none; modules/reporting/app/controllers/cost_reports_controller.rb:84-85 time leaves only as an XLS or PDF report, with no billing or accounting hand-off", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'no payment provider ... nothing financial'", "plane": "corpus: plane/round4/code-census.md §10 no billable time; §5 no customer entity" @@ -3155,7 +3198,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload', 'hours': only date picker defaults and Gantt 'Hours' zoom, src/components/board/GanttView.vue:195; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours", - "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'User repartition' (tasks per assignee per project) ; source: app/Controller/ProjectUserOverviewController.php manager view of users across projects : counts, not allocation", + "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'User repartition' (tasks per assignee per project) ; source: app/Controller/ProjectUserOverviewController.php manager view of users across projects : counts, not allocation ; source read at v1.2.54: app/Template/project_list/listing.php:18 'Users overview'; app/Controller/ProjectUserOverviewController.php:104 opens, :113 closed tasks per user across projects; app/Template/project_user_overview/sidebar.php:24-27; counts only, no allocation", "openproject": "corpus: openproject/round4/open-core.md resource_management and team_planner_view Enterprise gated; corpus: openproject/round4/code-census.md #22 'absent, 403 on every controller in the module, except the planners index'; docs: opf/openproject HEAD 27a58131 docs/user-guide/resource-management/README.md 'allocate work to users and monitor team capacity'. Free build: assignee grouping in work package queries only (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/resource_management/config/routes.rb:41 resource planners and :114 staffing; modules/resource_management/app/services/resource_allocations/availability.rb:111 capacity per user; modules/resource_management/app/controllers/resource_management/base_controller.rb:41-43 every action behind the :resource_management Enterprise token; modules/team_planner/app/controllers/team_planner/team_planner_controller.rb:14 team planner likewise gated", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report: Shows how much work a user has been allocated, and how long it should take'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps team capacity per sprint in hours or story points", "plane": "corpus: plane/round4/code-census.md §10 no time or allocation data; menu-tree.md 'no Dashboards, no Reports beyond a two-dimensional Analytics count'" @@ -3188,7 +3231,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload', 'hours': only date picker defaults and Gantt 'Hours' zoom, src/components/board/GanttView.vue:195; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours; the board sidebar tabs are sharing, tags, deleted items and activity, src/components/board/BoardSidebar.vue", - "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Task distribution · User repartition' per project : task counts per column and per user, no capacity", + "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Task distribution · User repartition' per project : task counts per column and per user, no capacity ; source read at v1.2.54: app/Controller/AnalyticController.php:87 taskDistribution, :103 userDistribution; app/Template/analytic/sidebar.php:4-7 'Task distribution', 'User repartition': task counts per column and per user, no capacity", "openproject": "project capacity is the resource planner (Enterprise gated, corpus: openproject/round4/code-census.md #22); free build shows work and remaining work totals per project query (corpus: openproject/round4/M1-column.md 3.15 progress values) ; source read at v17.8.0: modules/resource_management/config/locales/en.yml:98 'available, scheduled' capacity summary and :129 'start planning capacity for this project'; modules/resource_management/lib/open_project/resource_management/engine.rb:120-124 project menu entry needs the resource_management token; free build shows only Work and Remaining work sums, app/contracts/work_packages/base_contract.rb:80", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Workload Report'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps 'If you set the capacity at 40 hours, the sprint's capacity will be 80 hours' (per team, not per project)", "plane": "corpus: plane/round4/code-census.md §10 no allocation or hours model; project analytics are work item counts (project_analytics.py:44,97)" @@ -3218,7 +3261,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards' is a navigation list with no state or progress ; source read at v1.19.0: src/components/boards/Boards.vue:9-23 'All boards' is a table of 'Board name' and 'Members' only, with no status, progress or due counts per board; src/router.js:55-60; searched src/ for 'portfolio', 'progress' on boards: none", - "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Projects management' ; source: app/Template/project_user_overview/ manager overview of projects, users and open tasks; no portfolio health view", + "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Projects management' ; source: app/Template/project_user_overview/ manager overview of projects, users and open tasks; no portfolio health view ; source read at v1.2.54: app/Template/dashboard/overview.php:21-47 all projects with open tasks per column; app/Template/project_user_overview/sidebar.php:18-27 managers, members, open and closed tasks across projects; no health or status rollup", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:44 'create a multi-project status dashboard if you include your own project attributes or project life cycle phases' and project status filters (:129); portfolio and program workspaces are Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/queries/projects/filters/project_status_filter.rb:35 project status on the free projects list with custom project attribute columns; app/components/projects/index_page_header_component.rb:64-66 open all as one Gantt; config/initializers/menus.rb:34-44 the separate Portfolios module needs :portfolio_management", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html issue sources 'determine which projects, boards, and filters you want to import', a plan holds up to 100 projects (Advanced Roadmaps, bundled)", "plane": "corpus: plane/round4/menu-tree.md workspace 'Projects', 'Analytics'; code-census.md §10 AnalyticsEndpoint and AdvanceAnalyticsChartEndpoint 'a two-dimensional count, not a report builder'. A workspace-level count across projects, no portfolio health view" @@ -3248,7 +3291,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow' ; 'Upcoming cards cards assigned to me across boards' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers dashboard widgets DeckWidgetUpcoming, DeckWidgetToday, DeckWidgetTomorrow, lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards'; inside Deck src/router.js:36-38 /upcoming renders src/components/overview/Overview.vue:57-83 my cards by due date", - "kanboard": "corpus: kanboard/round4/M1-column.md 10.2 'the dashboard is fixed: projects, my tasks, my subtasks, calendar, activity (DashboardController)'", + "kanboard": "corpus: kanboard/round4/M1-column.md 10.2 'the dashboard is fixed: projects, my tasks, my subtasks, calendar, activity (DashboardController)' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:4-13 'Overview', 'My projects', 'My tasks', 'My subtasks'; app/Controller/DashboardController.php:18 show, :35 tasks, :51 subtasks; app/Template/dashboard/layout.php:18 'My activity stream'", "openproject": "corpus: openproject/round4/menu-tree.md 'My page personal dashboard, grid of widgets'; corpus: openproject/round4/M1-column.md 10.2 'modules/my_page/, the same grid machinery per user' ; source read at v17.8.0: modules/my_page/config/routes.rb:3 /my/page; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' and :87 'work_packages_created' default widgets on a per user grid", "jira": "corpus: jira-data-center/round4/M1-column.md 10.2 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on'", "plane": "corpus: plane/round4/journeys.md 'Manage widgets ... exactly three toggles: Quicklinks, Recents, Your stickies' and 'there is no dashboard route'; menu-tree.md 'Your work' gives the personal item list" @@ -3281,8 +3324,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.5 'Upcoming cards (/upcoming/) lists cards assigned to me across boards' ; source read at v1.19.0: src/router.js:36-38 /upcoming; src/components/overview/Overview.vue:111 'Upcoming cards', :57-83 due-date columns; lib/Controller/OverviewApiController.php:29 upcomingCards, lib/Service/OverviewService.php:26-41 cards assigned to me or unassigned across all my boards", - "kanboard": "corpus: kanboard/round4/M1-column.md 3.5 'the dashboard shows \"My tasks\" and \"My subtasks\"'", - "openproject": "corpus: openproject/round4/M1-column.md 3.5 'default queries ship and modules/my_page/ renders personal ones'; global 'Work packages' module across projects (corpus: openproject/round4/menu-tree.md)", + "kanboard": "corpus: kanboard/round4/M1-column.md 3.5 'the dashboard shows \"My tasks\" and \"My subtasks\"' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:10 'My tasks', :13 'My subtasks'; app/Controller/DashboardController.php:35-41 tasks via getDashboardPaginator for the user across projects; app/Template/dashboard/tasks.php:2", + "openproject": "corpus: openproject/round4/M1-column.md 3.5 'default queries ship and modules/my_page/ renders personal ones'; global 'Work packages' module across projects (corpus: openproject/round4/menu-tree.md) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:41 'assigned_to_me' among the default queries, built at :115; app/menus/work_packages/menu.rb:40-50 lists them in the global Work packages menu across all projects; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' widget", "jira": "corpus: jira-data-center/round4/M1-column.md 3.5 'predefined system filters for common queries, such as My Open Issues'", "plane": "corpus: plane/round4/menu-tree.md workspace 'Your work' ; M1-column.md 5.4 'a workspace member's profile page aggregates their assigned and created work items' ; source: filter.ts profile_issues list and kanban grouped by project" }, @@ -3311,8 +3354,8 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'The date:overdue filter listed the card' ; M1-column.md 10.1 'no dashboards of counts' : a filter, not a report; no blocked state ; source read at v1.19.0: src/components/overview/Overview.vue:59 'Overdue' column and lib/Service/OverviewService.php:50-52 overdue bucket for my cards; src/components/Controls.vue:172-225 'Filter by due date' with 'Overdue' on a board; no counts and no blocked state, searched src/ for 'blocked': none", - "kanboard": "corpus: kanboard/round4/menu-tree.md board filter 'due today, due tomorrow, due yesterday, closed, open' and Analytics 'Task distribution' ; no blocked count", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/models/queries/work_packages/filter/blocked_filter.rb (relation 'blocked by'), due_date_filter.rb, status open/closed filters; saved as a query and shown in a widget (corpus: openproject/round4/M1-column.md 10.10) (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "corpus: kanboard/round4/menu-tree.md board filter 'due today, due tomorrow, due yesterday, closed, open' and Analytics 'Task distribution' ; no blocked count ; source read at v1.2.54: app/Template/app/filters_helper.php:8-12 'Tasks due today', 'Tasks due yesterday', 'Closed tasks', 'Open tasks' as filters; app/Template/analytic/sidebar.php:4 'Task distribution' per column; no blocked count and no single status report", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/models/queries/work_packages/filter/blocked_filter.rb (relation 'blocked by'), due_date_filter.rb, status open/closed filters; saved as a query and shown in a widget (corpus: openproject/round4/M1-column.md 10.10) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:38 'overdue' default query; app/models/queries/work_packages/filter/blocked_filter.rb:33, due_date_filter.rb and status_filter.rb filters, saved as queries and shown as widgets or in app/menus/work_packages/menu.rb:40", "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'Find all overdue issues: duedate < now() and resolution is empty' and gadgets over filters (10.10); blocked is not a state or a documented JQL field in DC, only a link on each issue", "plane": "corpus: plane/round4/code-census.md §10 analytics chart 'x_axis (default PRIORITY) and an optional group_by' counts by state; M1-column.md 8.2 'The server holds no overdue state', and blocked is not a groupable dimension" }, @@ -3345,8 +3388,8 @@ "jira": "partial", "evidence": { "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload': none; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours", - "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; time estimates exist per task (promoted-rows-batch7.md 10.11) but nothing sets them against availability", - "openproject": "user working hours and time off are recorded (docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md:11 'define your working schedule, plan future schedule changes, and manage your time off'), but the planner that sets workload against them is resource management, Enterprise gated (corpus: openproject/round4/code-census.md #22) Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10).", + "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; time estimates exist per task (promoted-rows-batch7.md 10.11) but nothing sets them against availability ; source read at v1.2.54: searched app/ (outside Locale) for 'availability', 'capacity', 'vacation', 'absence', 'out of office': only a password reset comment; estimates exist per task, app/Helper/TaskHelper.php:208, but nothing sets a person's available hours", + "openproject": "user working hours and time off are recorded (docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md:11 'define your working schedule, plan future schedule changes, and manage your time off'), but the planner that sets workload against them is resource management, Enterprise gated (corpus: openproject/round4/code-census.md #22) Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/routes.rb:1120-1121 per user working hours and non working times, free, with config/initializers/menus.rb:277-279 'Schedule and availability'; modules/resource_management/app/services/resource_allocations/availability.rb:111 hours against availability only in the resource planner, gated at modules/resource_management/app/controllers/resource_management/base_controller.rb:41-43", "jira": "docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps capacity is set per team per sprint in hours ('If you set the capacity at 40 hours'); per-person hours against availability are not in the 11.3 page", "plane": "corpus: plane/round4/code-census.md §10 no hours logged and no availability model" }, @@ -3375,8 +3418,8 @@ "jira": "partial", "evidence": { "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload': none; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours, so nothing to warn against", - "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday')", - "openproject": "only inside the Enterprise resource planner (corpus: openproject/round4/code-census.md #22); nothing on the free build warns about an over-planned person", + "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; source read at v1.2.54: searched app/ (outside Locale) for 'capacity', 'availability': no capacity object to exceed; app/Controller/ProjectUserOverviewController.php:104 counts open tasks only", + "openproject": "only inside the Enterprise resource planner (corpus: openproject/round4/code-census.md #22); nothing on the free build warns about an over-planned person ; source read at v17.8.0: modules/resource_management/app/services/resource_allocations/availability.rb:52-53 overbooked?; modules/resource_management/config/locales/en.yml:237 'This user is over-allocated in the selected period.'; modules/resource_management/app/controllers/resource_management/work_package_timeline/events_controller.rb:41 marks overbooked allocations, all behind the resource_management token", "jira": "docs: docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps and https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'the Auto-scheduler will assign tasks to sprints based on the size of an issue, team capacity, and sprint length': capacity per team and sprint, no per-person warning documented", "plane": "corpus: plane/round4/code-census.md §10 no capacity data to warn on" }, @@ -3404,8 +3447,8 @@ "jira": "unknown", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 13.17 'no out of office; the platform's user_status shows a status and follows nobody' ; source read at v1.19.0: searched lib/ and src/ for 'absence', 'out of office', 'user_status', 'working hours': none; 'leave' is only leaving a board, lib/Controller/BoardController.php:69", - "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 13.17 'grep out.?of.?office|substitut|delegat|absence returns 0'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md time off and individual working hours per user (free); instance working days drive scheduling (corpus: openproject/round4/M1-column.md section 8); using personal time off in planning is resource management, Enterprise gated Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10).", + "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 13.17 'grep out.?of.?office|substitut|delegat|absence returns 0' ; source read at v1.2.54: searched app/ (outside Locale) for 'out of office', 'absence', 'vacation', 'holiday', 'working day': none", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md time off and individual working hours per user (free); instance working days drive scheduling (corpus: openproject/round4/M1-column.md section 8); using personal time off in planning is resource management, Enterprise gated Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/routes.rb:1121 user non working times (time off) and :1120 working hours, free; modules/resource_management/app/services/resource_allocations/working_time_calendar.rb:17-18 and :81 subtract UserNonWorkingTime and holidays from capacity, only inside the Enterprise resource planner; free scheduling uses app/services/work_packages/shared/days.rb:38 instance working days", "jira": "not checked: absences appear in the old standalone Advanced Roadmaps 3.29 docs (Configuring the availability of team members) but not in the Jira Software 11.3 Advanced Roadmaps pages read (Teams, Capacity and velocity, Auto-schedule)", "plane": "corpus: plane/round4/code-census.md §8 no working-day calendar ('holiday|working_day' 0 hits); M1-column.md 13.12 'out.of.office' grep returns nothing" }, @@ -3434,8 +3477,8 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'cost': none; lib/Db/Board.php holds title, owner, colour, archive and settings, no money field", - "kanboard": "corpus: kanboard/round4/code-census.md 'payment|stripe|ideal returns 26 hits and none is a payment' ; no budget field on a project", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:15 'If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget' (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "corpus: kanboard/round4/code-census.md 'payment|stripe|ideal returns 26 hits and none is a payment' ; no budget field on a project ; source read at v1.2.54: searched app/Model and app/Schema/Sqlite.php for 'budget', 'cost': none; app/Schema/Sqlite.php:1526-1530 projects table carries no money field", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:15 'If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31-37 budgets; modules/budgets/app/models/budget.rb:120-123 budget_ratio and :150-151 spent from material and labor; modules/budgets/app/views/budgets/show.html.erb:47-48 spent ratio bar and :79 'Spent'", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'nothing financial'; no budget object in Jira Software", "plane": "corpus: plane/round4/code-census.md §2 fixed fields and no custom fields; no budget or cost model in db/models" }, @@ -3464,8 +3507,8 @@ "jira": "unknown", "evidence": { "nextcloud-deck": "source: lib/Db/Assignment.php:17-20 assignee types user, group, team, remote; no placeholder role ; source read at v1.19.0: lib/Db/Assignment.php:17-20 assignee types are user, group, circle and remote, each a real account or team; searched lib/ and src/ for 'placeholder role', 'role': no unnamed role assignee", - "kanboard": "source: a task has one owner_id, a user (app/Model/TaskCreationModel.php:67); no placeholder role", - "openproject": "corpus: openproject/round4/open-core.md placeholder_users Enterprise gated; corpus: openproject/round4/code-census.md #18 'absent from the UI and refused server side, for creation only'", + "kanboard": "source: a task has one owner_id, a user (app/Model/TaskCreationModel.php:67); no placeholder role ; source read at v1.2.54: app/Helper/TaskHelper.php:126-127 the assignee select lists users only; app/Schema/Sqlite.php:1553 tasks.owner_id is a user id; searched app/Model for 'placeholder' roles on tasks: none", + "openproject": "corpus: openproject/round4/open-core.md placeholder_users Enterprise gated; corpus: openproject/round4/code-census.md #18 'absent from the UI and refused server side, for creation only' ; source read at v17.8.0: config/initializers/menus.rb:324-325 admin 'Placeholder users'; config/initializers/permissions.rb:106 placeholder_users actions; app/contracts/placeholder_users/create_contract.rb:34 creating one needs the :placeholder_users Enterprise token", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html does not address members who are not Jira users; virtual members existed in the standalone Portfolio product and were not confirmed for DC 11", "plane": "corpus: plane/round4/code-census.md §5 'Every actor in Plane is a User row with a login'; assignees are users only" }, @@ -3493,8 +3536,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no analytics' ; source read at v1.19.0: searched lib/ and src/ for 'cumulative', 'flow diagram', 'chart': none; lib/Db/Stack.php:28-35 keeps no history of card counts per list", - "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Cumulative flow diagram' ; M1-column.md 10.4 'from project_daily_column_stats'", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'cumulative.flow|cycle.time|lead.time' over app, modules and frontend/src returns nothing", + "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Cumulative flow diagram' ; M1-column.md 10.4 'from project_daily_column_stats' ; source read at v1.2.54: app/Template/analytic/sidebar.php:10 'Cumulative flow diagram'; app/Controller/AnalyticController.php:119 cfd; assets/js/components/chart-project-cumulative-flow.js renders it", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'cumulative.flow|cycle.time|lead.time' over app, modules and frontend/src returns nothing ; source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml, erb) for 'cumulative flow', 'cycle time', 'lead time', 'cycle_time', 'lead_time': none; modules/backlogs/app/components/backlogs/sprint_reports/widgets holds burndown and goal only", "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'the Cumulative Flow Diagram is an area chart that shows the various statuses of work items'", "plane": "corpus: plane/round4/code-census.md §10 analytics are two-dimensional counts; source: grep -rliE 'cumulative' in packages/i18n/src/locales/en returns nothing" }, @@ -3522,8 +3565,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no duration is stored beyond createdAt, lastModified and done' ; source read at v1.19.0: lib/Db/Card.php:81 createdAt and :89 done timestamps exist, but searched lib/ and src/ for 'cycle time', 'lead time', 'cycleTime', 'leadTime': no report computes them", - "kanboard": "corpus: kanboard/round4/M1-column.md 10.4 'lead and cycle time per task and averaged (TaskAnalyticModel::getLeadTime, getCycleTime)'", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): same grep, no cycle or lead time report; corpus: openproject/round4/M1-column.md 10.4 'There is no cycle time, no heatmap and no phase duration analysis'", + "kanboard": "corpus: kanboard/round4/M1-column.md 10.4 'lead and cycle time per task and averaged (TaskAnalyticModel::getLeadTime, getCycleTime)' ; source read at v1.2.54: app/Template/analytic/sidebar.php:19 'Lead and cycle time', app/Template/analytic/lead_cycle_time.php:3 averages; app/Controller/AnalyticController.php:21 leadAndCycleTime; app/Template/task/analytics.php:14-15 per task; app/Model/TaskAnalyticModel.php:22 getLeadTime, :34 getCycleTime", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): same grep, no cycle or lead time report; corpus: openproject/round4/M1-column.md 10.4 'There is no cycle time, no heatmap and no phase duration analysis' ; source read at v17.8.0: same search as prt-cumulative-flow, app, lib, modules and frontend/src for 'cycle_time', 'lead_time', 'cycle time', 'lead time': none; modules/reporting/app/models/cost_query/group_by holds time and cost groupings, no duration of work", "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'The Control Chart shows the cycle time and lead time for your product, version, or sprint'", "plane": "corpus: plane/round4/M1-column.md 10.4 'no duration recorded anywhere'; completed_at exists (issue.py:236-249) but no lead or cycle time report" }, @@ -3552,8 +3595,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/navigation/BoardExportModal.vue:12-18 'Export as JSON' and 'Export as CSV' on a board (tag v1.18.4) ; corpus: nextcloud-deck/round4/M1-column.md 10.3 said 'no CSV or XLSX; occ deck:export writes JSON', which the UI export contradicts ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:76 'Export board' opens src/components/navigation/BoardExportModal.vue:12 'Export as JSON', :18 'Export as CSV'; src/services/BoardApi.js:239-243 writes a .csv file of the cards; lib/Controller/BoardController.php:140 export, lib/Service/BoardService.php:716; no PDF", - "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 'Exports on the project menu: tasks, subtasks, transitions and daily summaries as CSV with a date range'", - "openproject": "corpus: openproject/round4/M1-column.md 10.3 'CSV and PDF registered at config/initializers/export_formats.rb:33-34, XLS added by modules/xls_export'", + "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 'Exports on the project menu: tasks, subtasks, transitions and daily summaries as CSV with a date range' ; source read at v1.2.54: app/Template/project_header/dropdown.php:63 'Exports'; app/Template/export/header.php:5-14 Tasks, Subtasks, Task transitions, Daily project summary; app/Controller/ExportController.php:34-35 CSV download; searched app/Controller and app/Export for 'pdf': none", + "openproject": "corpus: openproject/round4/M1-column.md 10.3 'CSV and PDF registered at config/initializers/export_formats.rb:33-34, XLS added by modules/xls_export' ; source read at v17.8.0: config/initializers/export_formats.rb:34 CSV and :35 PDF list exports, :37 single work package PDF; modules/xls_export/lib/open_project/xls_export/engine.rb:15-18 adds XLS; config/routes.rb:1007 work package export dialog on the list", "jira": "corpus: jira-data-center/round4/M1-column.md 10.3 'Export > CSV (All fields)'; other formats 'XML, Word and Printable', no XLSX or PDF", "plane": "corpus: plane/round4/code-census.md §10 'ExporterHistory: provider in json / csv / xlsx' ; M1-column.md 10.3 yes. CSV and spreadsheet yes; PDF export exists only for pages (code-census.md §4), not tasks" }, @@ -3582,8 +3625,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' saved searches ; 10.1 'no' ; source read at v1.19.0: searched lib/ and src/ for 'savedQuery', 'saved search', 'report': none; src/components/Controls.vue:172-229 the board filter is not saved; lib/Search/FilterStringParser.php parses one-off search filters only", - "kanboard": "corpus: kanboard/round4/journeys.md 5 shared custom filter saved ; code-census.md 'saved searches custom_filters.is_shared' : a saved query, no report builder", - "openproject": "corpus: openproject/round4/M1-column.md 9.3 personal saved queries, 10.1 widgets, 10.4 cost report pivot engine", + "kanboard": "corpus: kanboard/round4/journeys.md 5 shared custom filter saved ; code-census.md 'saved searches custom_filters.is_shared' : a saved query, no report builder ; source read at v1.2.54: app/Template/custom_filter/create.php:14 a saved and shareable query; app/Controller/CustomFilterController.php:57 save; the eight fixed charts in app/Template/analytic/sidebar.php:4-25; no report builder", + "openproject": "corpus: openproject/round4/M1-column.md 9.3 personal saved queries, 10.1 widgets, 10.4 cost report pivot engine ; source read at v17.8.0: config/locales/js-en.yml:591 'Save as' a work package view; app/contracts/queries/base_contract.rb:38 sums and :53 group_by saved on a query; modules/reporting/config/routes.rb:49-52 cost report save_as; modules/reporting/app/controllers/cost_reports_controller.rb:146 create", "jira": "corpus: jira-data-center/round4/M1-column.md 9.3 saved filters, 10.1 gadgets 'Issue Statistics', 'Pie Chart', 10.10 'Filter Results'", "plane": "corpus: plane/round4/code-census.md §9 saved IssueView with filters, display_filters and display_properties (a saved query); §10 'Custom Reports (BUSINESS) are absent' and analytics is a two-dimensional count" }, @@ -3611,8 +3654,8 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow (lib/Dashboard/), on the Nextcloud dashboard' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers three platform dashboard widgets; lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards', lib/Dashboard/DeckWidgetToday.php:38 'Cards due today', lib/Dashboard/DeckWidgetTomorrow.php:38 'Cards due tomorrow'; src/views/DashboardUpcoming.vue renders them", - "kanboard": "not a Nextcloud app; corpus: kanboard/round4/code-census.md empty grep 'widget' ; M1-column.md 9.12 'no' platform integration", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard' (OpenProject Integration app for Nextcloud); notifications, not a task list (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "not a Nextcloud app; corpus: kanboard/round4/code-census.md empty grep 'widget' ; M1-column.md 9.12 'no' platform integration ; source read at v1.2.54: a standalone PHP application, not a Nextcloud app; searched app/ (outside Locale) for 'widget', 'nextcloud': none", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard' (OpenProject Integration app for Nextcloud); notifications, not a task list (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard', served by the separate Nextcloud app from lib/api/v3/notifications/notification_collection_representer.rb; notifications, not a task list; the widget code is not in this repository", "jira": "not a Nextcloud product and no Nextcloud app from Atlassian; its own dashboard is prt-dashboard (corpus: jira-data-center/round4/M1-column.md 10.2); corpus: jira-data-center/round4/M1-column.md 1.9 integrations page covers Confluence only", "plane": "corpus: plane/round4/M1-column.md 9.12 'Plane is not hosted in a platform'; no Nextcloud dashboard widget" }, @@ -3641,8 +3684,8 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card 'Activity (the platform's stream filtered to the card)' ; code-census.md 'activity subjects 39' ; M1-column.md 10.9 'Verified live on card 6' ; source read at v1.19.0: appinfo/info.xml:67-79 registers activity settings, filter and provider; lib/Activity/ActivityManager.php:53-94 board, list, card, label, attachment and comment subjects; src/components/card/CardSidebarTabActivity.vue:7-12 and src/components/board/BoardSidebar.vue:42 'Activity' tabs (platform activity)", - "kanboard": "not a Nextcloud app; its own project activity stream (corpus: kanboard/round4/menu-tree.md project 'Activity', task 'Activity stream' ; code-census.md 'event log project_activities')", - "openproject": "own activity module per project (docs: opf/openproject HEAD 27a58131 docs/user-guide/activity; corpus: openproject/round4/M1-column.md 10.5 'the activity view aggregates them per project'); the Nextcloud integration offers dashboard, search and link preview (docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22-25), no Nextcloud activity stream entries (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "not a Nextcloud app; its own project activity stream (corpus: kanboard/round4/menu-tree.md project 'Activity', task 'Activity stream' ; code-census.md 'event log project_activities') ; source read at v1.2.54: not a Nextcloud app, so no Nextcloud activity stream; its own stream: app/Template/project_header/dropdown.php:38 'Activity', app/Controller/ActivityController.php:34 project, :50 task; app/ServiceProvider/NotificationProvider.php:39 ActivityStreamNotification", + "openproject": "own activity module per project (docs: opf/openproject HEAD 27a58131 docs/user-guide/activity; corpus: openproject/round4/M1-column.md 10.5 'the activity view aggregates them per project'); the Nextcloud integration offers dashboard, search and link preview (docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22-25), no Nextcloud activity stream entries (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:555 OpenProject's own per project Activity page; config/initializers/menus.rb:702-705 project 'Activity' menu; searched modules/storages/app (rb) for 'activity': no event pushed into the Nextcloud activity stream, the Nextcloud side is a separate app", "jira": "corpus: jira-data-center/round4/M1-column.md 5.4 'Your user profile also displays recent work in the Activity Stream' (own activity stream, not a host platform's)", "plane": "corpus: plane/round4/code-census.md §6 'IssueActivity ... ACTIVITY_MAPPER with 28 entries, all issue-scoped'; a per work item feed inside Plane, no workspace activity stream and no Nextcloud activity integration; project settings changes are not recorded (§13)" }, @@ -3665,14 +3708,14 @@ "origin": "own-code", "planninq": "partial", "nextcloud-deck": "partial", - "openproject": "no", + "openproject": "partial", "plane": "partial", "kanboard": "partial", "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.20 'push board changes to open clients when the notify_push app is installed ... without it the client polls. Not driven' ; source read at v1.19.0: src/sessions.js:40-60 listens for deck_board_update and deck_card_update from the notify_push app and reloads the open board; lib/NotifyPushEvents.php:13-14; without notify_push nothing refreshes: searched src/ for 'setInterval', 'polling': only session keep-alive at src/sessions.js:125 and a clock at src/main.js:65", - "kanboard": "corpus: kanboard/round4/M1-column.md 2.20 'the board polls: BoardAjaxController::check ... every board_private_refresh_interval seconds (10 by default) ... the task page does not refresh'", - "openproject": "corpus: openproject/round4/M1-column.md 2.20 'The work package page does not update when someone else edits it'", + "kanboard": "corpus: kanboard/round4/M1-column.md 2.20 'the board polls: BoardAjaxController::check ... every board_private_refresh_interval seconds (10 by default) ... the task page does not refresh' ; source read at v1.2.54: assets/js/src/BoardPolling.js:1-15 the board polls on an interval; app/Template/board/table_container.php:13 data-check-interval from board_private_refresh_interval; app/Controller/BoardAjaxController.php:65 check; no push and no refresh on the task page", + "openproject": "corpus: openproject/round4/M1-column.md 2.20 'The work package page does not update when someone else edits it' ; 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 frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/polling.controller.ts:45 polls every 10 s by default, :135 setInterval, :243-256 when the latest change is from another user it refreshes the work package fields or warns of a conflict; app/components/work_packages/activities_tab/lazy_index_component.rb:127-128 interval setting; boards and lists have no such polling", "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 'JSWSERVER-4452 (Agile board should refresh automatically whenever someone moves a card ...), Gathering Interest, 246 votes'", "plane": "corpus: plane/round4/code-census.md §12 'apps/live/src/types/index.ts:26 export type TDocumentTypes = \"project_page\"; ... pages collaborate live; issue descriptions and comments do not' ; M1-column.md 2.20 partial" }, @@ -3701,8 +3744,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md notification kinds 'card-assigned' ; M1-column.md 6.8 'four notifications reached jdevries ... two assignments' ; source read at v1.19.0: lib/Service/AssignmentService.php:77-78 assigning another user calls lib/Notification/NotificationHelper.php:107-121 sendCardAssigned with subject 'card-assigned', rendered by lib/Notification/Notifier.php; UI trigger src/components/card/AssignmentSelector.vue:17", - "kanboard": "corpus: kanboard/round4/M1-column.md 6.8 web notifications with the assignee filter ; source: app/Subscriber/NotificationSubscriber.php task events to app/Notification/ (web, mail)", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:18 'Be notified of activities on some or all of the work packages in which you are participating (as assignee, responsible or watcher)' (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "corpus: kanboard/round4/M1-column.md 6.8 web notifications with the assignee filter ; source: app/Subscriber/NotificationSubscriber.php task events to app/Notification/ (web, mail) ; source read at v1.2.54: app/Subscriber/NotificationSubscriber.php:27 TaskModel::EVENT_ASSIGNEE_CHANGE handled; app/Template/notification/task_assignee_change.php:9 'Assigned to %s'; app/Template/header/user_notifications.php:3 bell with unread notifications", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:18 'Be notified of activities on some or all of the work packages in which you are participating (as assignee, responsible or watcher)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/notification.rb:34 reason 'assigned'; app/models/notification_setting.rb:33 ASSIGNEE setting; app/services/notifications/create_from_model_service/work_package_strategy.rb derives the recipients; config/initializers/menus.rb:301-303 'Notifications and email' settings page", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur' (corpus: jira-data-center/round4/M1-column.md 8.6); Issue Assigned is a notification scheme event", "plane": "corpus: plane/round4/M1-column.md 6.8 'Notification with read_at, snoozed_till, archived_at' ; source: apps/api/plane/bgtasks/issue_activities_task.py:396-408 a new assignee is added as IssueSubscriber, and bgtasks/notification_task.py:303-315 sends them 'in_app:issue_activities:assigned'" }, @@ -3731,8 +3774,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: lib/Activity/SettingComment.php:20-28 'A comment was created on a card' activity setting, delivered by the platform's stream, mail or push per user ; corpus: nextcloud-deck/round4/code-census.md 'card-comment-mentioned' notification for mentions ; source read at v1.19.0: lib/Listeners/CommentEventListener.php:41-44 and :56-59 a new comment triggers the card_comment_create activity; lib/Activity/SettingComment.php:28 'A comment was created on a card' setting delivered by the platform stream or mail; direct notification only for mentions, lib/Notification/NotificationHelper.php:178", - "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies' and 6.8 notifications to assignee or creator ; source: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE => handleEvent, app/Template/notification/comment_create.php", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:27-29 participants are notified of all activities by default; docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies' and 6.8 notifications to assignee or creator ; source: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE => handleEvent, app/Template/notification/comment_create.php ; source read at v1.2.54: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE handled; app/Template/notification/comment_create.php:3 mail body; app/Template/user_view/notifications.php:13 limit to tasks assigned to or created by me", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:27-29 participants are notified of all activities by default; docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/notification.rb:37 reason 'commented' and :33 'mentioned'; app/models/notification_setting.rb:41 WORK_PACKAGE_COMMENTED; app/services/notifications/create_from_model_service.rb:33 mention parsing", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html events 'when an issue is created or completed, or when any issue fields are updated' (corpus: jira-data-center/round4/M1-column.md 8.6), comments included; push notifications for watched issues and mentions (Push notifications page)", "plane": "corpus: plane/round4/code-census.md §6 UserNotificationPreference 'comment' boolean ; source: bgtasks/notification_task.py:267 comment mentions and subscribers notified" }, @@ -3761,8 +3804,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.6 'platform: the notification (8.4) is mailed when the user's notification settings say so; Deck sends no mail itself' ; source: lib/Activity/SettingBase.php activity mail choices ; source read at v1.19.0: lib/Activity/SettingBase.php:79-89 each Deck activity type can be mailed by the platform, off by default; appinfo/info.xml:69-71 SettingChanges, SettingDescription, SettingComment; searched lib/ for 'IMailer': none, Deck sends no mail itself (platform)", - "kanboard": "corpus: kanboard/round4/M1-column.md 8.6 'the overdue command sends e-mail' ; code-census.md notifications 'app/Notification/ (web, mail, webhook, activity stream)'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/notification-and-email/README.md:23-25 'Email reminders ... configure the email reminders which you receive' (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "corpus: kanboard/round4/M1-column.md 8.6 'the overdue command sends e-mail' ; code-census.md notifications 'app/Notification/ (web, mail, webhook, activity stream)' ; source read at v1.2.54: app/ServiceProvider/NotificationProvider.php:31 'Email' notification type; app/Notification/MailNotification.php:31 notifyUser; app/Template/user_view/notifications.php:9 user picks methods", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/notification-and-email/README.md:23-25 'Email reminders ... configure the email reminders which you receive' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/notifications/mail_service.rb:44 sends mail per notification strategy; app/components/my/reminders/show_page_component.html.erb:33 immediate reminders and :45 daily email reminders; config/routes.rb:1138-1140 update_reminders and update_email_alerts", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur'", "plane": "corpus: plane/round4/code-census.md §6 'Email delivery is batched by bgtasks/email_notification_task.py, scheduled every five minutes', needs SMTP (menu-tree.md god-mode 'Email SMTP')" }, @@ -3791,8 +3834,8 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'live presence: Session per user per board, events for notify_push' ; corpus: _round4/compare/findings-batch6.md '2.31 ... Deck yes by its sessions' ; 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 isNotifyPushEnabled; src/sessions.js:76-82 createSession returns a dummy without notify_push; appinfo/routes.php:183-185 session create, sync, close", - "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 2.31 'no' (does the product show who else has the case open right now)", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rliE 'presence|currently viewing|also editing' over app, lib and frontend/src/app matches only Ruby presence checks in services (user_preferences/update_service.rb, journals/create_service.rb); no viewer indicator", + "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 2.31 'no' (does the product show who else has the case open right now) ; source read at v1.2.54: searched app/Controller and app/Template for 'presence', 'viewing', 'online': none; assets/js/src/BoardPolling.js:15 polls for changes, not for viewers", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rliE 'presence|currently viewing|also editing' over app, lib and frontend/src/app matches only Ruby presence checks in services (user_preferences/update_service.rb, journals/create_service.rb); no viewer indicator ; source read at v17.8.0: searched app, lib and frontend/src/app (rb, ts, erb, html) for 'currently viewing', 'also editing', 'viewers': only BIM viewer code and lib/open_project/text_formatting/filters/mention_filter.rb; real-time collaboration exists only in the Documents module (modules/documents/app/views/documents/show.html.erb), not on tasks or boards", "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 the issue pages 'say nothing about refresh', and no presence indicator appears in the issue or board documentation read", "plane": "source: grep -rlniE 'cursor|presence|collaborators|users.?online' packages/editor/src/core/extensions packages/editor/src/core/hooks and grep awareness in packages/editor/src return nothing; corpus silent" }, @@ -3820,8 +3863,8 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.12 'the smart picker (lib/Reference/CreateCardReferenceProvider.php) creates a card from inside Talk and pastes its link ... not driven' ; open-core.md 'It does not reach ... Talk's inbox' : no conversation per card ; source read at v1.19.0: src/init-talk.js:24-25 registers a Talk message action 'Create a card' from a chat message, loaded in Talk by lib/Listeners/BeforeTemplateRenderedListener.php:45-46; lib/Reference/CreateCardReferenceProvider.php:36 'Create a new deck card' smart picker; searched lib/ and src/ for a per-card conversation: none", - "kanboard": "corpus: kanboard/round4/M1-column.md 6.12 'no chat ... Slack and Mattermost are directory plugins'", - "openproject": "no chat integration (corpus: openproject/round4/M1-column.md 6.12 'no chat integration'); the Nextcloud app gives Talk only a link preview (col-link-preview)", + "kanboard": "corpus: kanboard/round4/M1-column.md 6.12 'no chat ... Slack and Mattermost are directory plugins' ; source read at v1.2.54: searched app/ (outside Locale) for 'slack', 'mattermost', 'rocket', 'chat': none; app/Schema/Sqlite.php:548-550 the old HipChat settings are deleted by migration; chat is the third-party Slack and Mattermost plugins", + "openproject": "no chat integration (corpus: openproject/round4/M1-column.md 6.12 'no chat integration'); the Nextcloud app gives Talk only a link preview (col-link-preview) ; source read at v17.8.0: searched modules/storages, app and lib (rb) for 'spreed', 'nextcloud talk', 'talk': only a code comment in app/services/oauth_clients/connection_manager.rb:63; no Talk room per work package; docs/user-guide/file-management/nextcloud-integration/README.md:220-222 Talk only renders a link preview", "jira": "corpus: jira-data-center/round4/M1-column.md 6.12 'no chat capture ... Jira Server for Slack is a Marketplace plugin, not the product'", "plane": "corpus: plane/round4/code-census.md §12 SlackProjectSync is an 'unreachable dead table'; no chat integration of any kind, and Talk is Nextcloud-specific" }, @@ -3850,8 +3893,8 @@ "jira": "partial", "evidence": { "nextcloud-deck": "source: lib/AppInfo/Application.php:144-146 CardReferenceProvider, BoardReferenceProvider, CommentReferenceProvider render rich previews of pasted links in Talk and Text ; corpus: nextcloud-deck/round4/code-census.md 'reference (4)' ; source read at v1.19.0: lib/AppInfo/Application.php:145-147 registers CardReferenceProvider, BoardReferenceProvider and CommentReferenceProvider; src/views/CardReferenceWidget.vue and src/views/BoardReferenceWidget.vue render the previews in Talk and Text (platform reference API)", - "kanboard": "source: grep -rniE 'oembed|og:|unfurl' app/Template/layout.php returns nothing; no preview of a task link elsewhere ; corpus: kanboard/round4/code-census.md empty grep 'widget'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:220-222 'Starting with OpenProject Nextcloud Integration App 2.4 a work package link preview will be shown if you use Nextcloud Talk or Text apps' (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "source: grep -rniE 'oembed|og:|unfurl' app/Template/layout.php returns nothing; no preview of a task link elsewhere ; corpus: kanboard/round4/code-census.md empty grep 'widget' ; source read at v1.2.54: searched app/Template for 'oembed', 'og:', 'twitter:card', 'unfurl': none; no endpoint that serves a task preview to another app", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:220-222 'Starting with OpenProject Nextcloud Integration App 2.4 a work package link preview will be shown if you use Nextcloud Talk or Text apps' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:220-224 work package link preview in Nextcloud Talk and Text via the integration app, which reads lib/api/v3/work_packages/work_package_representer.rb:302 previewMarkup; inside OpenProject config/routes.rb:1010 work package hover_card preview", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 'Gadgets You can embed a Confluence activity stream ... in Jira's dashboard' and application links to Confluence (1.9): previews live in Confluence, a separate product; no chat unfurl in the product", "plane": "source: apps/web/app/root.tsx:88-95 static og:title APP_TITLE and og:url https://app.plane.so/ for every page, so a pasted work item link previews as the generic app; no per-item unfurl. Corpus silent" }, @@ -3880,8 +3923,8 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search. Cards and boards under search-deck-card-board, comments under search-deck-comment ... Verified live' ; M1-column.md 9.12 'yes' ; source read at v1.19.0: lib/AppInfo/Application.php:136-137 registers DeckProvider and CardCommentProvider; lib/Search/DeckProvider.php:31 'search-deck-card-board', :42-50 boards and cards; lib/Search/CardCommentProvider.php:35 'search-deck-comment' (platform unified search)", - "kanboard": "corpus: kanboard/round4/M1-column.md 9.12 'no platform search to join' ; 9.1 'the header search box ... across every project the user can see' : its own global search finds tasks, not projects", - "openproject": "corpus: openproject/round4/M1-column.md 9.1 global quick search over eight searchables including work packages and projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets allows you to search OpenProject work packages via the universal search bar in Nextcloud' (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "corpus: kanboard/round4/M1-column.md 9.12 'no platform search to join' ; 9.1 'the header search box ... across every project the user can see' : its own global search finds tasks, not projects ; source read at v1.2.54: not a Nextcloud app, no platform search to join; its own search: app/Controller/SearchController.php:16-34 finds tasks across the user's projects with TaskProjectsFilter; projects are found only by name on app/Controller/ProjectListController.php:27-31", + "openproject": "corpus: openproject/round4/M1-column.md 9.1 global quick search over eight searchables including work packages and projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets allows you to search OpenProject work packages via the universal search bar in Nextcloud' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:326 OpenProject's own global search; app/controllers/search_controller.rb:141 search types include work packages and projects; docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets' in Nextcloud through the integration app", "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'The Search box is located at the top right of your screen ... start typing to search through all your issues and projects'", "plane": "corpus: plane/round4/M1-column.md 9.1 'app/views/search/base.py with per-entity filter methods for workspaces, projects, issues, cycles, modules, pages, views and intakes'; the product's own global search, titles only (code-census.md §9)" }, @@ -3910,8 +3953,8 @@ "jira": "partial", "evidence": { "nextcloud-deck": "generic only: lib/AppInfo/Application.php:212-213 registers Nextcloud collaboration ResourceProvider and ResourceProviderCard, so a board or card can be linked to other resources; nothing specific to the fleet's case management app ; source read at v1.19.0: generic only: lib/AppInfo/Application.php:213-214 registers collaboration ResourceProvider and ResourceProviderCard, shown by src/components/card/CardSidebarTabDetails.vue:34-38 NcCollectionList when the platform projects feature is on; searched lib/ and src/ for 'procest', 'dossiq', 'zaak': none", - "kanboard": "generic only: corpus: kanboard/round4/journeys.md 4 'createExternalTaskLink to a web link' ; menu-tree.md 'Add external link' ; journeys.md 1 a task 'reference' of Z-2026-0001", - "openproject": "no case management integration; a generic 'link' custom field format exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/initializers/custom_field_format.rb:41 formats.register('link')), so a URL to an external record can be stored per work package or project (cited source paths checked present at the released v17.8.0 tag.)", + "kanboard": "generic only: corpus: kanboard/round4/journeys.md 4 'createExternalTaskLink to a web link' ; menu-tree.md 'Add external link' ; journeys.md 1 a task 'reference' of Z-2026-0001 ; source read at v1.2.54: generic only: app/Template/task/sidebar.php:51 'Add external link', app/ExternalLink/WebLinkProvider.php; app/Helper/TaskHelper.php:198-199 free text 'Reference' field, :250 rendered as a link when it is a URL; no case app integration", + "openproject": "no case management integration; a generic 'link' custom field format exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/initializers/custom_field_format.rb:41 formats.register('link')), so a URL to an external record can be stored per work package or project (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/custom_field_format.rb:39-40 a 'link' (URL) custom field format usable on work packages and projects, so a case URL can be stored; searched app/models and modules/*/app/models for 'zaak', 'case management': no case connector", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'Issue linking allows you to create an association between two existing issues on either the same or different Jira servers' (corpus: jira-data-center/round4/M1-column.md 2.10); web links and a 'URL field' (corpus: jira-data-center/round4/M1-column.md 5.13) hold an external reference, no case app integration", "plane": "corpus: plane/round4/code-census.md §2 'IssueLink is a URL plus metadata JSON'; a generic external link can point at a case, no case integration" }, @@ -3940,8 +3983,8 @@ "jira": "no", "evidence": { "nextcloud-deck": "fleet-specific; Deck creates a card from Talk or Text (CreateCardReferenceProvider) but no board from another app's record (corpus: nextcloud-deck/round4/M1-column.md 1.9) ; source read at v1.19.0: searched lib/ and src/ for 'procest', 'dossiq', 'zaak': none; a card, not a board, can be made from Talk or Text, lib/Reference/CreateCardReferenceProvider.php:36 and src/init-talk.js:24", - "kanboard": "fleet-specific; no create-from-record integration (corpus: kanboard/round4/M1-column.md 1.3 'no')", - "openproject": "no case object or case app connector (corpus: openproject/round4/M1-column.md section 12 all Dutch case APIs 'no'); projects are created from templates only", + "kanboard": "fleet-specific; no create-from-record integration (corpus: kanboard/round4/M1-column.md 1.3 'no') ; source read at v1.2.54: fleet specific; app/Controller/ProjectCreationController.php:56 save takes a form only, searched app/ for a create-from-record hook: none", + "openproject": "no case object or case app connector (corpus: openproject/round4/M1-column.md section 12 all Dutch case APIs 'no'); projects are created from templates only ; source read at v17.8.0: searched app/models and modules/*/app/models for 'zaak', 'case': no case object or connector; app/components/projects/template_select_component.html.erb:39 projects start blank or from a template only", "jira": "corpus: jira-data-center/round4/M1-column.md 12.1 'No ZGW'; no case system integration to start a project from", "plane": "corpus: plane/round4/code-census.md §12 no connectors reachable; §5 no case or contact entity" }, @@ -3970,8 +4013,8 @@ "jira": "no", "evidence": { "nextcloud-deck": "fleet-specific; corpus: nextcloud-deck/round4/M1-column.md 5.4 'no' contact 360 and open-core.md 'Contacts has no link from a card' ; source read at v1.19.0: searched lib/ and src/ for 'pipelinq', 'crm', 'contact': no client link; lib/Db/Board.php:35-54 a board has no client or contact field", - "kanboard": "fleet-specific; corpus: kanboard/round4/M1-column.md 5.2 'no' contact registry", - "openproject": "no CRM integration; corpus: openproject/round4/M1-column.md 5.2 'no contact record'", + "kanboard": "fleet-specific; corpus: kanboard/round4/M1-column.md 5.2 'no' contact registry ; source read at v1.2.54: fleet specific; searched app/Template and app/Controller for 'client', 'customer', 'contact' registry: only mail hits; no embed surface for another app", + "openproject": "no CRM integration; corpus: openproject/round4/M1-column.md 5.2 'no contact record' ; source read at v17.8.0: searched app/models (rb) for 'crm', 'contact': no client or contact record and no CRM connector; the nearest is a project attribute, app/models/project_custom_field.rb:58", "jira": "corpus: jira-data-center/round4/M1-column.md 5.2 'Customers and organizations are JSM DC records'; no CRM client page integration", "plane": "corpus: plane/round4/code-census.md §5 'Contact, organisation or customer object: absent'" }, @@ -4004,7 +4047,7 @@ "evidence": { "nextcloud-deck": "source: lib/AppInfo/Application.php:189 DeckTeamResourceProvider lists a team's boards on the Team page, :144-145 board and card reference widgets in Text and Talk ; corpus: nextcloud-deck/round4/code-census.md 'team resource' ; source read at v1.19.0: lib/AppInfo/Application.php:191 DeckTeamResourceProvider lists a team's boards on the platform Team page; :145-146 card and board reference widgets, src/views/BoardReferenceWidget.vue, embed a board or card in Text and Talk; no widget for another app's record", "kanboard": "standalone application with no embed surface ; corpus: kanboard/round4/code-census.md empty grep 'widget'", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:161 'In the Details side panel, click on the OpenProject tab. This tab lets you link work packages in OpenProject to the current file, and will list all linked work packages' (work packages on a Nextcloud file, not projects on a record) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:161 'In the Details side panel, click on the OpenProject tab. This tab lets you link work packages in OpenProject to the current file, and will list all linked work packages' (work packages on a Nextcloud file, not projects on a record) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:161 the Nextcloud Files sidebar 'OpenProject' tab lists the work packages linked to a file, built by the separate Nextcloud app on modules/storages/lib/api/v3/file_links/create_endpoint.rb and modules/storages/lib/api/v3/file_links/file_link_representer.rb:144; work packages on a file, not a record's projects in another app", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 Confluence and Jira embed each other's content through application links ('You can embed a Confluence activity stream or a Confluence page in Jira's dashboard'); another Atlassian product, not an arbitrary app's record page", "plane": "corpus: plane/round4/M1-column.md 12.17 'there is no plugin API'; no embeddable widget in apps/web" }, @@ -4034,7 +4077,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.7 'a REST API at /index.php/apps/deck/api/v1.0 and v1.1 (84 routes ...) plus 24 OCS routes. Verified live' ; source read at v1.19.0: appinfo/routes.php:102-114 card_api routes under /api/v{apiVersion}/boards/.../cards, :139-141 OCS routes; lib/Controller/CardApiController.php and lib/Controller/BoardApiController.php; docs/API.md:7-53 the documented REST API", "kanboard": "corpus: kanboard/round4/code-census.md 'JSON-RPC procedure classes / methods 26 / 161' ; journeys.md 1 and 4 all over the API (JSON-RPC 2.0, not REST: M1-column.md 12.18)", - "openproject": "corpus: openproject/round4/M1-column.md 1.7 'API v3 is a Grape API rooted at lib/api/v3/root.rb'; 12.18 OpenAPI description", + "openproject": "corpus: openproject/round4/M1-column.md 1.7 'API v3 is a Grape API rooted at lib/api/v3/root.rb'; 12.18 OpenAPI description ; source read at v17.8.0: lib/api/v3/root.rb:35 API v3 root mounting every resource from :46; lib/api/v3/work_packages/work_packages_api.rb:99 work package endpoints; docs/api/apiv3/openapi-spec.yml the published OpenAPI description", "jira": "corpus: jira-data-center/round4/M1-column.md 1.7 'POST /api/2/issue Create an issue or sub-task from json'; 12.18 OpenAPI 3.0.1, 432 operations", "plane": "corpus: plane/round4/code-census.md §12 'The public REST API lives at apps/api/plane/api/ with views for ... issue, member, module, project, state', X-Api-Key auth ; M1-column.md 1.7 yes" }, @@ -4064,7 +4107,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'The Flow engine acts on files and knows no card event' ; source read at v1.19.0: searched lib/ for 'WorkflowEngine', 'IEntity', 'IOperation': none, so Deck registers no flow entity or check; card events reach only webhooks, lib/Event/ACardEvent.php:16", "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move'", - "openproject": "corpus: openproject/round4/M1-column.md 3.9 CustomAction 'is fired by a button a user presses, not by a transition' and authoring is Enterprise gated; webhooks are outbound only (6.11); no event-driven rules on the free build", + "openproject": "corpus: openproject/round4/M1-column.md 3.9 CustomAction 'is fired by a button a user presses, not by a transition' and authoring is Enterprise gated; webhooks are outbound only (6.11); no event-driven rules on the free build ; source read at v17.8.0: app/controllers/custom_actions_controller.rb:34 custom actions (multi-field changes on a button) are Enterprise gated to author; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 outbound created or updated events only; searched for event-driven rules on the free build: none", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation 'You can choose from many triggers including issue transitioned, scheduled trigger, or issue created' (bundled in Data Center)", "plane": "corpus: plane/round4/code-census.md §3 'no rule, no trigger, no condition and no action model'; 'Trigger And Action' (Pro) and 'Automation Flows' (Enterprise) are absent from Community (open-core.md)" }, @@ -4094,7 +4137,7 @@ "evidence": { "nextcloud-deck": "source: lib/Event/ACardEvent.php:17 'abstract class ACardEvent extends Event implements IWebhookCompatibleEvent' (CardCreatedEvent, CardUpdatedEvent, CardDeletedEvent), so the platform's webhook_listeners can post card events once an admin registers a listener over OCS. corpus: nextcloud-deck/round4/M1-column.md 6.11 said 'registers no events with webhook_listeners'; the tag's source contradicts it; not driven ; source read at v1.19.0: lib/Event/ACardEvent.php:16 card events implement the platform IWebhookCompatibleEvent, as do ACL events in lib/Event/AAclEvent.php:14, so the platform webhook_listeners app can post them once an admin registers a listener through its API; no webhook screen in Deck, searched src/ for 'webhook': none", "kanboard": "corpus: kanboard/round4/M1-column.md 6.11 'one webhook URL per instance with a token ... posted with event_name, event_data and event_author on every project event'", - "openproject": "corpus: openproject/round4/M1-column.md 6.11 'modules/webhooks/app/models/webhooks/webhook.rb with an event.rb selection model and a log.rb'", + "openproject": "corpus: openproject/round4/M1-column.md 6.11 'modules/webhooks/app/models/webhooks/webhook.rb with an event.rb selection model and a log.rb' ; source read at v17.8.0: modules/webhooks/config/routes.rb:30-38 admin outgoing webhooks; modules/webhooks/app/models/webhooks/webhook.rb:8 events per webhook and :24 all_projects; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 work package created or updated; modules/webhooks/app/models/webhooks/log.rb delivery log", "jira": "corpus: jira-data-center/round4/M1-column.md 6.11 'Webhooks are user-defined HTTP POST callbacks ... signed on request (HMAC)'", "plane": "corpus: plane/round4/code-census.md §11 'Webhook ... Event subscription is five booleans: project, issue, module, cycle, issue_comment', HMAC secret, WebhookLog with retry_count" }, @@ -4124,7 +4167,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; M1-column.md 11.2 'occ deck:export and occ deck:import ... Verified live' ; source read at v1.19.0: src/components/navigation/AppNavigationImportBoard.vue:7 'Import board', :10 accepts a JSON file, :45 importBoard; lib/Controller/BoardController.php:147 import, :183 system DeckJson; lib/Command/BoardImport.php:33 occ deck:import", "kanboard": "source: app/Import/ holds TaskImport.php and UserImport.php (CSV) only; no Deck importer", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): importers are app/services/import/jira* only (grep -rniIl 'deck' app/services/import returns nothing); CSV work package import is marked 'available on our Dev branch' (docs/user-guide/work-packages/importing/README.md)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): importers are app/services/import/jira* only (grep -rniIl 'deck' app/services/import returns nothing); CSV work package import is marked 'available on our Dev branch' (docs/user-guide/work-packages/importing/README.md) ; source read at v17.8.0: searched app/services/import and app/models for 'deck', 'trello': none; config/initializers/menus.rb:694-697 the only importer is 'Jira import'; docs/user-guide/work-packages has no CSV import at the tag", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html names CSV, JSON and importers for TFS, Rally, VersionOne, YouTrack, Axosoft, BaseCamp and Excel; no Nextcloud Deck importer", "plane": "corpus: plane/round4/code-census.md §12 'Importers: same. Importer is exported ... but no importer view or URL exists'" }, @@ -4154,7 +4197,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; code-census.md 'lib/Service/Importer/Systems/' ; 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 TrelloApiService.php reachable through lib/Command/BoardImport.php:33-40 occ deck:import --system and appinfo/routes.php:91-93 import API; the UI import is Deck JSON only, lib/Controller/BoardController.php:183; searched lib/Service/Importer for 'jira', 'csv': none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Import tasks' ; source: app/Import/TaskImport.php CSV tasks into an existing project; no Jira or Trello importer in core", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/installation-and-operations/jira-migration/README.md 'Step-by-step guide for migrating from Jira Data Center to OpenProject using the Jira Migrator'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/import/jiras/create_service.rb. Note: the migrator arrived behind a feature flag in 17.2 (release-notes/17-2-0:129-134), after the round-4 drive on 16.6.10; CSV import is dev-branch only Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10).", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/installation-and-operations/jira-migration/README.md 'Step-by-step guide for migrating from Jira Data Center to OpenProject using the Jira Migrator'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/import/jiras/create_service.rb. Note: the migrator arrived behind a feature flag in 17.2 (release-notes/17-2-0:129-134), after the round-4 drive on 16.6.10; CSV import is dev-branch only Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/initializers/menus.rb:694-697 admin 'Jira import'; config/routes.rb:908-918 admin import jira instances and runs; app/services/import/jira_client.rb and app/services/import/jiras do the import; no Trello or spreadsheet importer, Jira only", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file'", "plane": "corpus: plane/round4/code-census.md §12 'no importer view or URL exists'; source: grep -rniE 'import.?csv|jira|trello' apps/web/core --include=*.tsx finds no importer UI" }, @@ -4184,7 +4227,7 @@ "evidence": { "nextcloud-deck": "source: grep -rniE 'github|gitlab|commit' lib returns only migration comments; no forge integration ; corpus: nextcloud-deck/round4/open-core.md host surfaces list ; source read at v1.19.0: searched lib/ and src/ for 'github', 'gitlab', 'forge', 'commit': only a comment URL at lib/Service/SessionService.php:77 and a Vuex commit at src/components/Controls.vue:450; no forge integration", "kanboard": "source: grep -rniE 'github|gitlab|gogs|bitbucket' app/Action app/Controller returns 0 files; forge hooks are plugins (corpus: kanboard/round4/open-core.md 'a directory of 163 third-party plugins')", - "openproject": "corpus: openproject/round4/M1-column.md 12.22 'the GitHub and GitLab modules receive inbound events (modules/github_integration/, modules/gitlab_integration/)'", + "openproject": "corpus: openproject/round4/M1-column.md 12.22 'the GitHub and GitLab modules receive inbound events (modules/github_integration/, modules/gitlab_integration/)' ; source read at v17.8.0: modules/github_integration/lib/open_project/github_integration/engine.rb:94-96 registers the inbound 'github' hook and :82 a GitHub tab on the work package; modules/github_integration/app/models/github_pull_request.rb; modules/gitlab_integration/app/models/gitlab_merge_request.rb and modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb:73 GitLab tab", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 'workflow triggers from development tools' ('Fisheye/Crucible, Bitbucket and GitHub', 8.9); 12.5 'Jira's Subversion integration lets you see Subversion commit information relevant to each issue'", "plane": "corpus: plane/round4/code-census.md §12 'The GitHub and Slack integrations are unreachable dead tables in CE'; 'Popular integrations' is a Pro string. Only 'Copy branch name' exists in the web app" }, @@ -4214,7 +4257,7 @@ "evidence": { "nextcloud-deck": "source: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients on the REST API ; not in the round-4 drive ; source read at v1.19.0: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients built on the REST API at appinfo/routes.php:102-114; not Deck's own code", "kanboard": "source: app/Template/layout.php:5 viewport meta and ChangeLog:1028 'Improve layout on mobile/tablet devices' : a responsive web UI, no mobile app in the project", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/mobile-app-guide/README.md 'The OpenProject Mobile app (Beta) is available for iOS and Android. It is designed as a companion app'; beta, not in the round-4 drive The docs file is present at v17.8.0 (absent at v16.6.10); beta, so partial.", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/mobile-app-guide/README.md 'The OpenProject Mobile app (Beta) is available for iOS and Android. It is designed as a companion app'; beta, not in the round-4 drive The docs file is present at v17.8.0 (absent at v16.6.10); beta, so partial. ; source read at v17.8.0: docs/mobile-app-guide/README.md:2 'Mobile app guide (Beta)' and :10 a companion app for iOS and Android, a separate repository; docs/release-notes/17-0-0/README.md:279 built-in OAuth application for clients such as the mobile app; beta, so partial", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push notifications 'on iOS and Android devices' for the Jira Data Center mobile app (corpus: jira-data-center/round4/M1-column.md 6.8 'the mobile app has one')", "plane": "not checked: the web repo at 2f895b82 holds no mobile client (grep for play.google, apps.apple, 'mobile app' in apps/web, apps/space and en locales returns nothing) and round 4 did not test whether Plane's separate mobile apps connect to a Community self-hosted instance" }, @@ -4244,7 +4287,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 3 'the file appeared as /Deck/bijlage-r4b6.txt ... in the uploader's Files' : one /Deck folder per uploader, not a shared folder per board ; source read at v1.19.0: lib/Sharing/DeckShareProvider.php:50 DECK_FOLDER '/Deck' and lib/Service/ConfigService.php:244 attachment_folder '/Deck' per user: attachments land in each uploader's own /Deck folder and are shared to the board, no folder is made per board", "kanboard": "corpus: kanboard/round4/M1-column.md 4.23 'no' ; journeys.md 4 files stored under tasks/3/ in Kanboard's own store", - "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:27 'It is also possible to automatically create dedicated project folders'; corpus: openproject/round4/M1-column.md 4.23 'an automatically managed project folder (last_project_folder.rb)'; Nextcloud storage is free (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:27 'It is also possible to automatically create dedicated project folders'; corpus: openproject/round4/M1-column.md 4.23 'an automatically managed project folder (last_project_folder.rb)'; Nextcloud storage is free (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/storages/app/models/storages/project_storage.rb:46-52 project_folder_mode with 'automatic'; modules/storages/app/services/storages/nextcloud_managed_folder_create_service.rb:32-42 creates the managed project folder in Nextcloud; modules/storages/app/models/storages/last_project_folder.rb; modules/storages/config/locales/en.yml:21-22 'Project folder', 'Project folder mode'", "jira": "corpus: jira-data-center/round4/M1-column.md 4.23 'not hosted in a platform with a file manager'; attachments sit in the home directory or S3", "plane": "corpus: plane/round4/code-census.md §4 'Folders: absent. No folder or directory model'; M1-column.md 4.23 no file manager" }, @@ -4274,7 +4317,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 5 'pjanssen found nothing until added to the group' ; install.md 'a stranger reads the board -> HTTP 403' ; source read at v1.19.0: lib/Service/PermissionService.php:171-199 every read and write checks the board ACL and throws 'Permission denied'; lib/Db/Acl.php:31-39 read, edit, share, manage for user, group, remote, team; src/components/board/SharingTabSidebar.vue:39-52 'Can edit', 'Can share', 'Can manage'", "kanboard": "corpus: kanboard/round4/journeys.md 5 'carol, not a member, was refused on the project and on the task (403)' ; install.md refusal probe", - "openproject": "corpus: openproject/round4/M1-column.md 9.7 'search is scoped through the project permission system (app/services/authorization/user_allowed_query.rb)'; 13.1 project roles", + "openproject": "corpus: openproject/round4/M1-column.md 9.7 'search is scoped through the project permission system (app/services/authorization/user_allowed_query.rb)'; 13.1 project roles ; source read at v17.8.0: app/models/work_package.rb:87 visible scope is allowed_to view_work_packages and :231-232 visible?; app/models/work_packages/scopes/allowed_to.rb:39 permission-based scope; app/services/authorization/user_allowed_query.rb:31; config/initializers/permissions.rb:306 view_work_packages per project role", "jira": "corpus: jira-data-center/round4/M1-column.md 9.7 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues'", "plane": "corpus: plane/round4/code-census.md §13 'Project visibility adds network secret (0) or public-to-workspace (2)', allow_permission resolves ProjectMember role" }, @@ -4307,7 +4350,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings default board on start · calendar bridge · group limit for board creation (admin)' and 'There is almost none' ; source: no lib/Settings admin page in the tag ; source read at v1.19.0: src/components/DeckAppSettings.vue:27 'Admin settings' shown to admins inside the app settings dialog, :32 'Limit board creation to some groups', :41 'Enable federation'; no platform admin settings page, appinfo/info.xml:67-72 declares only activity settings", "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'About · Application settings · Email settings · Project settings · Board settings ...' ; M1-column.md 11.24 'yes'", - "openproject": "corpus: openproject/round4/menu-tree.md 'Administration' tree; corpus: openproject/round4/M1-column.md 11.24 'a large administration area over several hundred setting definitions'", + "openproject": "corpus: openproject/round4/menu-tree.md 'Administration' tree; corpus: openproject/round4/M1-column.md 11.24 'a large administration area over several hundred setting definitions' ; source read at v17.8.0: config/initializers/menus.rb:307 the Administration menu; config/routes.rb:740 admin settings namespace; config/routes.rb:885 working days and :890 iCalendar settings among the setting pages", "jira": "corpus: jira-data-center/round4/M1-column.md 11.24 instance configuration (CORS, banner, email templates); 11.15 'Configuring Jira application options'", "plane": "corpus: plane/round4/menu-tree.md 'Instance administration, at /god-mode: General, Email, Authentication, Workspaces, Artificial intelligence, Images' plus project Settings" }, @@ -4336,7 +4379,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md setup is occ app:install and occ config:app:set ; the app opens on a welcome board, no guided setup ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29 and lib/Service/DefaultBoardService.php:37-46 on first run create a sample board, nothing more; searched lib/ and src/ for 'wizard', 'onboarding': none", "kanboard": "source: app/Schema/Sqlite.php:1564 seeds user admin with password admin; no setup wizard (corpus: kanboard/round4/install.md 'the first page rendered the moment the container was healthy')", - "openproject": "corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database, so there is no setup wizard'; a first-login onboarding tour exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts, tours/gantt_tour.ts) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database, so there is no setup wizard'; a first-login onboarding tour exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts, tours/gantt_tour.ts) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/helpers/homescreen_helper.rb:52-53 onboarding modal for a first time user; app/views/layouts/base.html.erb:136-139 renders it; frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts guided tour; searched app (rb) for 'setup wizard', 'first run', 'installation wizard': none, the instance seeds itself", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira application setup wizard will only display the first time after you install' (database, administrator, email, language, licence)", "plane": "corpus: plane/round4/usability.md 'The instance setup form'; install.md first run ; source: apps/web/core/components/onboarding/ profile-setup, create-workspace, invite-members steps" }, @@ -4366,7 +4409,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source: lib/Service/DefaultBoardService.php and lib/Service/fixtures/default-board.json create a sample board per user ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29-30 on a user's first visit creates 'Welcome to Nextcloud Deck!' from lib/Service/DefaultBoardService.php:66 createDefaultBoard and lib/Service/fixtures/default-board.json:5-16 sample lists and cards, translated at lib/Service/DefaultBoardService.php:78-83; one sample per user, not an admin loader", "kanboard": "no demo or sample data in core ; source: app/Schema/Sqlite.php seeds settings and the admin user only ; corpus: kanboard/round4/install.md", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/seeders/demo_data_seeder.rb:29-30 DemoDataSeeder with its data seeder classes; app/seeders/demo_data/global_query_seeder.rb and overview_seeder.rb seed demo projects, queries and overviews on a fresh instance", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data'", "plane": "source: apps/api/plane/app/views/workspace/base.py:137 workspace_seed.delay on workspace creation, seeds from apps/api/plane/seeds/data (projects, issues, cycles, modules, pages, views, labels, states); corpus: plane/round4/code-census.md §5 cites the seeded dummy data (workspace_seed_task.py:160,163). Automatic, not opt-in" }, @@ -4401,7 +4444,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'translations in l10n/ 93' (nl among them: l10n/nl.js, nl.json) ; source read at v1.19.0: l10n/nl.json holds 441 translated strings against 445 in l10n/en_GB.json; 93 languages in l10n/; strings go through t('deck', ...) in src/, e.g. src/components/DeckAppSettings.vue:7, and l10n->t in lib/, e.g. lib/Dashboard/DeckWidgetUpcoming.php:53", "kanboard": "corpus: kanboard/round4/code-census.md 'locales, app/Locale/ 38, nl_NL among them'", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/crowdin/nl.yml, js-nl.yml, nl.seeders.yml; corpus: openproject/round4/M1-column.md 11.13 'translations come from Crowdin' (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/crowdin/nl.yml, js-nl.yml, nl.seeders.yml; corpus: openproject/round4/M1-column.md 11.13 'translations come from Crowdin' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/crowdin/nl.yml:1 Dutch server strings, with js-nl.yml and nl.seeders.yml beside it; config/locales/en.yml:3391 English source strings; the language is chosen per user in account settings", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/translating-jira-938847004.html 'Jira ships with a number of translations in the most commonly-requested languages'; Dutch is not listed there, product strings come as language packs ('update these via the Universal Plugin Manager', corpus: jira-data-center/round4/M1-column.md 11.13)", "plane": "source: packages/i18n/src/locales has 20 locales (cs, de, en, es, fr, id, it, ja, ka-ge, ko, pl, pt-BR, ro, ru, sk, tr-TR, ua, vi-VN, zh-CN, zh-TW) and no nl; English yes, Dutch no. Corpus: plane/round4/M1-column.md 11.13 'translations are static catalogues in packages/i18n'" }, @@ -4434,7 +4477,7 @@ "evidence": { "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue arrow-key card focus and N, F, X, Q shortcuts, src/components/cards/CardItem.vue:263-290 per-card keys, aria-labels on controls; not audited against WCAG AA in the round-4 drive (usability.md) ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:106-118 N, F, X, Q and arrow-key card navigation, listed in src/components/DeckAppSettings.vue:46-55; src/components/cards/CardItem.vue:12 tabindex and :30 aria-label; src/components/card/TagSelector.vue:15 aria labels on selects; not audited against WCAG AA, and the Gantt is a frappe-gantt SVG, src/components/board/GanttView.vue:63", "kanboard": "source: app/Template/config/keyboard_shortcuts.php shortcut list, app/Template/board/table_column.php:114 'ui-helper-hidden-accessible' screen-reader text; board cards have no keyboard move (brd-keyboard-move); not audited against WCAG AA in the round-4 drive", - "openproject": "corpus: openproject/round4/usability.md 'Every page carries a Jump to content skip link, headings are structured ... form fields carry proper labels'; docs: opf/openproject HEAD 27a58131 docs/release-notes/17-2-0/README.md:85 widgets 'follow WCAG 2.1 AA guidelines for focus management' (partial scope); cards move by drag only (brd-keyboard-move) (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "corpus: openproject/round4/usability.md 'Every page carries a Jump to content skip link, headings are structured ... form fields carry proper labels'; docs: opf/openproject HEAD 27a58131 docs/release-notes/17-2-0/README.md:85 widgets 'follow WCAG 2.1 AA guidelines for focus management' (partial scope); cards move by drag only (brd-keyboard-move) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/views/layouts/base.html.erb:71-72 skip-navigation link to content; docs/release-notes/17-2-0/README.md:85 overview widgets keyboard operable and 'follow WCAG 2.1 AA guidelines for focus management', a partial scope; brd-keyboard-move shows cards still move by drag only", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html Jira applications 'audited ... to make sure they're compliant with Section 508 and WCAG 2.0 AA' (an older level, vendor statement, not driven)", "plane": "corpus: plane/round4/usability.md 'The accessibility tree is usable but noisy. Navigating it surfaced the entire sidebar twice on every page'; no WCAG AA claim checked" }, @@ -4464,7 +4507,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 11.14 'platform: theming (enabled) sets logo, colours and name for the whole instance' ; the Vue client styles with platform CSS variables (e.g. var(--color-border) in src/components/board/GanttView.vue), so a token theme on the host would reach it; NL Design System tokens themselves are not shipped, not driven ; source read at v1.19.0: Deck styles with the platform CSS variables, e.g. src/components/board/GanttView.vue:530-546 var(--color-background-hover), var(--color-primary-element), so platform theming carries through; searched lib/ and src/ for 'nldesign', 'theming': no own token support, and board and label colours are fixed hex values, lib/Service/BoardService.php:242", "kanboard": "corpus: kanboard/round4/M1-column.md 11.14 'partial: application_stylesheet takes custom CSS ... the logo and name are fixed' ; source: assets/css/light.min.css styles through CSS custom properties (179 var(--...) uses, e.g. --color-primary), so custom CSS could map tokens onto them; no NL Design System tokens shipped, not driven", - "openproject": "corpus: openproject/round4/M1-column.md 11.14 'app/controllers/custom_styles_controller.rb:49 is the design and branding screen, Enterprise gated (define_custom_style). The free build sets a logo and nothing else'; no NL Design System tokens", + "openproject": "corpus: openproject/round4/M1-column.md 11.14 'app/controllers/custom_styles_controller.rb:49 is the design and branding screen, Enterprise gated (define_custom_style). The free build sets a logo and nothing else'; no NL Design System tokens ; source read at v17.8.0: app/controllers/custom_styles_controller.rb:49 design and colour customisation needs the :define_custom_style token, only logo downloads (:38-39) are unguarded; searched app and frontend/src (rb, scss, ts) for 'nldesign', 'nl-design', 'design token': none", "jira": "corpus: jira-data-center/round4/M1-column.md 11.14 'How to change your logo ... How to change Jira application colors'; colours and logo, no design-token theming or NL Design System support", "plane": "corpus: plane/round4/M1-column.md 11.14 'WorkspaceTheme and per-user theme ... No stylesheet or component theming'; no design token import" }, @@ -4494,7 +4537,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md 'occ app:install deck -> deck 1.18.4 installed' on a throwaway Nextcloud ; source read at v1.19.0: appinfo/info.xml:41-45 a Nextcloud app on pgsql, sqlite or mysql, installed on the customer's own server; searched lib/ for outgoing vendor calls: only the optional Trello importer, lib/Service/Importer/Systems/TrelloApiService.php:10-22; note v1.19.0 requires Nextcloud 35 exactly, appinfo/info.xml:45", "kanboard": "corpus: kanboard/round4/install.md 'Kanboard ships one official image ... needs nothing beside it'", - "openproject": "corpus: openproject/round4/install.md 'openproject/openproject:16 from Docker Hub ... against an external PostgreSQL'", + "openproject": "corpus: openproject/round4/install.md 'openproject/openproject:16 from Docker Hub ... against an external PostgreSQL' ; source read at v17.8.0: docker/prod/Dockerfile (line 6) builds the production image from this tree; docs/installation-and-operations/installation/docker/README.md:119-124 'docker run ... openproject/openproject:17' on your own host; publiccode.yml:55 GPL-3.0-or-later, no vendor cloud needed", "jira": "corpus: jira-data-center/round4/open-core.md 'On 30 March 2026 Atlassian stopped selling Data Center licences to new customers; on 28 March 2029 every Data Center product reaches end of life and turns read-only'; self-hosted for existing licence holders only", "plane": "corpus: plane/round4/install.md 'makeplane/plane-aio-community:v1.4.2' run on localhost:8096 with postgres, valkey, rabbitmq, minio ; usability.md notes an offline instance works apart from Unsplash covers" }, @@ -4524,7 +4567,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'Deck gates nothing and sells nothing. appinfo/info.xml says agpl' ; source read at v1.19.0: appinfo/info.xml:24 licence agpl; LICENSE; searched lib/ and src/ for 'subscription', 'enterprise', 'license key': no feature gate", "kanboard": "corpus: kanboard/round4/open-core.md 'Kanboard is not open core. One MIT licence covers the product'", - "openproject": "corpus: openproject/round4/open-core.md 'the core is GPL-3.0 ... and 32 named features are withheld behind a paid token'", + "openproject": "corpus: openproject/round4/open-core.md 'the core is GPL-3.0 ... and 32 named features are withheld behind a paid token' ; source read at v17.8.0: publiccode.yml:55 GPL-3.0-or-later core; app/models/enterprise_token.rb:56 allows_to? gates about 30 named features found in app, lib and modules, e.g. app/models/timestamp.rb:109 baseline_comparison, app/contracts/placeholder_users/create_contract.rb:34 placeholder_users, modules/resource_management/app/controllers/resource_management/base_controller.rb:43 resource_management", "jira": "corpus: jira-data-center/round4/open-core.md 'Jira Software Data Center is closed source with one edition, priced by user tier'", "plane": "corpus: plane/round4/open-core.md 'LICENSE.txt is the verbatim GNU AGPL v3' and 'this repository is the Community edition and nothing else. The paid features are not gated here. They are not here at all' (Pro, Business, Enterprise, One lists)" }, @@ -4553,7 +4596,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.9 'platform: admin_audit is shipped and disabled ... the Activity stream logs writes' ; code-census.md descriptionPrev before and after can be dropped (ActivityManager.php:414) ; source read at v1.19.0: lib/Activity/ActivityManager.php:53-94 every board, list, card and comment change is written to the platform activity table, which users cannot edit; :409-418 description before and after are dropped when the entry exceeds 4000 characters; searched lib/ for 'admin_audit', 'IAuditLogger': Deck feeds no audit log itself (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 activity stream and transitions with author and time, 13.9 'project_activities records writes only' ; no tamper protection on the table", - "openproject": "corpus: openproject/round4/M1-column.md section 13 closing finding 'Setting, Role, Member, Workflow, CustomAction and EnterpriseToken changes are recorded nowhere ... What is recorded is destroys only, and it is purged after 60 days'; work package journals are thorough (10.9)", + "openproject": "corpus: openproject/round4/M1-column.md section 13 closing finding 'Setting, Role, Member, Workflow, CustomAction and EnterpriseToken changes are recorded nowhere ... What is recorded is destroys only, and it is purged after 60 days'; work package journals are thorough (10.9) ; source read at v17.8.0: app/services/journals/create_service.rb:45 journals on every work package save, but app/models/work_package.rb:398-405 comments stay editable by their author or editors; app/models/work_package.rb:182 and app/models/project.rb:176 has_paper_trail keeps destroys that app/workers/paper_trail_audits/cleanup_job.rb:33-36 purges after 60 days; settings and role changes have no trail", "jira": "corpus: jira-data-center/round4/M1-column.md 10.5 audit log with filters and CSV export, 10.9 issue History tab; corpus: jira-data-center/round4/open-core.md audit log 'limited by the retention period and the default cap of 10 million records'; 13.9 reads not recorded", "plane": "corpus: plane/round4/code-census.md §13 'IssueActivity is an issue-scoped change log, not an audit log' and 'Settings changes are not logged'; 'API-enabled Audit Logs' is a paid string" }, @@ -4583,7 +4626,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 12.7 'platform: user_ldap shipped and disabled ... SAML and OIDC as store apps (user_saml, user_oidc), not shipped with this image' ; source read at v1.19.0: searched lib/ and src/ for 'saml', 'oidc', 'ldap', 'sso': none; sign-in is the platform's, Deck runs behind its session, lib/Service/PermissionService.php:171 checks the logged-in user; SSO depends on store apps user_saml or user_oidc (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 12.7 'LDAP ... and reverse-proxy header authentication in the core; grep saml|oidc|openid returns 0'", - "openproject": "corpus: openproject/round4/M1-column.md 12.7 'both exist and both are Enterprise gated: modules/openid_connect/ and modules/auth_saml/ on the sso_auth_providers symbol'; free build has LDAP authentication", + "openproject": "corpus: openproject/round4/M1-column.md 12.7 'both exist and both are Enterprise gated: modules/openid_connect/ and modules/auth_saml/ on the sso_auth_providers symbol'; free build has LDAP authentication ; source read at v17.8.0: modules/openid_connect/lib/open_project/openid_connect/engine.rb:50 and modules/auth_saml/lib/open_project/auth_saml/engine.rb:32 OIDC and SAML need the sso_auth_providers token; modules/auth_plugins/lib/open_project/plugins/auth_plugin.rb:94 same gate; config/routes.rb:716 LDAP authentication is free", "jira": "corpus: jira-data-center/round4/M1-column.md 12.7 'Atlassian provides the SSO for Atlassian Data Center app ... Bundled with the Data Center licence, no extra subscription'", "plane": "corpus: plane/round4/menu-tree.md 'Unique codes, Passwords, Google, GitHub, GitLab, Gitea' and 'No SAML, no OIDC, no LDAP'; open-core.md 'OIDC + SAML for SSO' (One) and 'LDAP support' (Enterprise). OAuth sign-in only" }, @@ -4613,7 +4656,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 6 'occ deck:export admin wrote both boards as JSON with stacks, cards, labels and ACL' ; source: src/components/navigation/BoardExportModal.vue JSON and CSV export, lib/AppInfo/Application.php:191 registerUserMigrator(DeckMigrator) ; source read at v1.19.0: src/components/navigation/BoardExportModal.vue:12-18 JSON and CSV per board; lib/Command/UserExport.php:39 occ deck:export for all of a user's boards; lib/AppInfo/Application.php:193 registers lib/UserMigration/DeckMigrator.php:71 export for the platform user migration", "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 CSV exports of tasks, subtasks, transitions and summaries ; 11.2 'the database can be downloaded whole'", - "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/controllers/admin/backups_controller.rb and config/routes.rb:1082 'resource :backups' (database and attachments backup from the admin UI); corpus: openproject/round4/M1-column.md 10.3 CSV, PDF, XLS exports (cited source paths checked present at the released v17.8.0 tag.)", + "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/controllers/admin/backups_controller.rb and config/routes.rb:1082 'resource :backups' (database and attachments backup from the admin UI); corpus: openproject/round4/M1-column.md 10.3 CSV, PDF, XLS exports (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:661-662 admin 'Backups'; config/routes.rb:959 backups; app/controllers/admin/backups_controller.rb:64 request_backup of database and attachments; config/initializers/export_formats.rb:34-35 CSV and PDF, config/initializers/permissions.rb:163 export_projects", "jira": "corpus: jira-data-center/round4/M1-column.md 11.2 'the whole-instance XML backup or a project import'; 10.3 CSV export; corpus: jira-data-center/round4/open-core.md data pipeline 'Data will be exported in CSV format'", "plane": "corpus: plane/round4/code-census.md §13 'Data export. Per-workspace issue export to json / csv / xlsx ... There is no full-account or per-subject export'; pages export to PDF only one at a time (§4)" }, @@ -4643,7 +4686,7 @@ "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.3 per-board ACL and code-census.md 'remote ACL type 6' federation : an account shared on one board sees only that board, but a guest account needs the store Guests app, not shipped ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:90-94 share a single board with a user, group, team or remote account, :32 '(remote)'; lib/Federation/DeckFederationProvider.php:25-42 federated board shares; lib/Service/PermissionService.php:171-199 an account sees only boards shared with it; a guest account needs the store Guests app, searched lib/ and src/ for 'guest': only a docblock at lib/Collaboration/Resources/ResourceProvider.php:72, no guest flow", "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer): bob read the task (200) and was refused on updateTask' ; carol with no membership 403 ; journeys.md 6 public read-only board", - "openproject": "corpus: openproject/round4/M1-column.md 13.1 membership per project with a role; the free build has no user seat limit (corpus: openproject/round4/open-core.md gates are features, not seats); per-work-package sharing is Enterprise gated (3.19)", + "openproject": "corpus: openproject/round4/M1-column.md 13.1 membership per project with a role; the free build has no user seat limit (corpus: openproject/round4/open-core.md gates are features, not seats); per-work-package sharing is Enterprise gated (3.19) ; source read at v17.8.0: config/initializers/permissions.rb:218 invite_members_by_email lets a project admin invite an outside person as a member of that one project; app/models/member.rb:40 membership is per project with a role; app/models/work_package.rb:87 visibility follows membership; per work package sharing is gated, app/models/sharing_strategies/work_package_strategy.rb:109", "jira": "corpus: jira-data-center/round4/M1-column.md 3.19 'a partner needs an account and a licence' and is 'scoped per project by a role'; every guest takes a licensed seat", "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when false a guest sees only items they own or are assigned'; a guest must be a workspace member with a login and is then added per project. Whether a workspace guest sees public-to-workspace projects was not driven" }, From 28f7ee5b79e9d24f4424f6dc3c55967432770dc1 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:23:15 +0200 Subject: [PATCH 06/13] feat(parity): Kanboard source read at v1.2.54 across all 148 rows, sources recorded --- openspec/parity/capabilities.json | 178 +++++++++++++++++++----------- 1 file changed, 113 insertions(+), 65 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index b34bfa87..901be352 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -136,7 +136,55 @@ "readOn": "2026-09-13", "columnAddedOn": "2026-09-26", "evidenceGrade": "driven", - "unknownReason": "Graded driven at the round-4 drive of 2026-09-13. Cells whose evidence starts with source were read from the tagged source at v1.2.54, not driven." + "unknownReason": "Graded driven at the round-4 drive of 2026-09-13 on v1.2.54, and every row read from source at the same tag on 2026-09-26. Two ratings moved where the code contradicts the drive (prj-status-filter, pln-reminder-lead-time).", + "sources": { + "docs": "https://docs.kanboard.org/", + "sourceRepo": { + "url": "https://github.com/kanboard/kanboard", + "tag": "v1.2.54", + "commit": "9ce6a5edc5b646ef15780cb445bc6d2c39d9898f" + }, + "featurePage": "https://kanboard.org/", + "featureRequests": "https://github.com/orgs/kanboard/discussions/categories/ideas", + "issueTracker": { + "url": "https://github.com/kanboard/kanboard/issues", + "featureLabel": "enhancement" + }, + "roadmap": null, + "changelog": "https://github.com/kanboard/kanboard/blob/main/ChangeLog", + "apiReference": "https://docs.kanboard.org/v1/api/", + "marketplace": "https://kanboard.org/plugins.html", + "pricing": null, + "accessibilityStatement": null, + "securityDocs": "https://github.com/kanboard/kanboard/security/policy", + "demoInstance": null, + "community": "https://github.com/orgs/kanboard/discussions", + "reviews": "https://alternativeto.net/software/kanboard/about/", + "videos": null, + "caseStudies": null, + "partnerDirectory": null, + "trainingCurriculum": null, + "jobPostings": null, + "tenders": null, + "nullReasons": { + "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 milestones in use", + "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" + } + }, + "sourceRead": { + "tag": "v1.2.54", + "commit": "9ce6a5edc5b646ef15780cb445bc6d2c39d9898f", + "readOn": "2026-09-26" + }, + "readHow": "Driven at v1.2.54 in round 4 (2026-09-13); source read at the same tag v1.2.54 on 2026-09-26 across all rows, with path:line beside the drive evidence: source read at v1.2.54, driven at 1.2.54, so the grade stays driven." }, { "key": "jira", @@ -263,7 +311,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 1 'createProject Vergunningen with identifier VERG' ; source: app/Model/ProjectModel.php:129 getByIdentifier, project description on the Edit project form ; source read at v1.2.54: app/Template/project_creation/create.php:13-15 'Identifier' field on the new project form; app/Template/project_edit/show.php:27-28 'Description' editor; app/Controller/ProjectCreationController.php:56 save; app/Model/ProjectModel.php:123 getByIdentifier", "openproject": "corpus: openproject/round4/menu-tree.md 'Projects' global module and 'Project settings > Information'; corpus: openproject/round4/M1-column.md 11.23 project attributes; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md (name, identifier, description) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/new_component.html.erb:32 project create form; app/forms/projects/settings/editable_identifier_form.rb:36 'identifier' field (the short key); app/forms/projects/settings/description_form.rb:35 description field; app/controllers/projects_controller.rb:113 create; app/contracts/projects/base_contract.rb:36-38 name, identifier, description attributes", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'you must provide: a name ... a key ... and designate a project lead', description added after creation; corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'", - "plane": "corpus: plane/round4/journeys.md 'Create a workspace, create a project, create a work item' ; code-census.md §2 'project.py:76 identifier = models.CharField(max_length=12)', unique per workspace via ProjectIdentifier ; source: apps/web/core/components/project/card.tsx:285 renders project.description" + "plane": "corpus: plane/round4/journeys.md 'Create a workspace, create a project, create a work item' ; code-census.md §2 'project.py:76 identifier = models.CharField(max_length=12)', unique per workspace via ProjectIdentifier ; source: apps/web/core/components/project/card.tsx:285 renders project.description ; source read at v1.4.2: apps/web/core/components/project/create/common-attributes.tsx:89 identifier field (derived from name, max 10) and :132 description field in the create modal; apps/api/plane/app/views/project/base.py:257-258 create; apps/api/plane/db/models/project.py:70-76 name, description, identifier CharField(max_length=12)" }, "built": { "state": "built", @@ -296,7 +344,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch ; source read at v1.2.54: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Template/config/project.php:21 'Disable personal projects' admin setting; app/Controller/ProjectCreationController.php:145 refuses personal projects when disabled; restriction is by application role, not by chosen group", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions') ; source read at v17.8.0: config/initializers/permissions.rb:34-39 add_project is a global permission; app/contracts/projects/create_contract.rb:67 create checks user.allowed_globally?(:add_project); app/models/global_role.rb:31 global roles; app/controllers/groups_controller.rb:184 a group has a 'global_roles' tab, so a chosen group can hold the right", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Creating and configuring a project is done by an administrator'; restricted to admins, but no documented grant to a chosen non-admin group", - "plane": "source: apps/api/plane/app/views/project/base.py:257 create is @allow_permission([ROLE.ADMIN, ROLE.MEMBER], level=\"WORKSPACE\"), so guests are excluded, but there is no setting to restrict creation to admins or chosen groups (corpus: plane/round4/code-census.md §5 three fixed roles 20/15/5, no groups)" + "plane": "source: apps/api/plane/app/views/project/base.py:257 create is @allow_permission([ROLE.ADMIN, ROLE.MEMBER], level=\"WORKSPACE\"), so guests are excluded, but there is no setting to restrict creation to admins or chosen groups (corpus: plane/round4/code-census.md §5 three fixed roles 20/15/5, no groups) ; source read at v1.4.2: apps/api/plane/app/views/project/base.py:257 create allowed for workspace ROLE.ADMIN and ROLE.MEMBER only, so guests cannot create; searched apps/api/plane for 'can_create_project', 'restrict.?project', 'project_creation': none, so no admin or group restriction setting" }, "built": { "state": "built", @@ -326,7 +374,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer)' ; menu-tree.md 'Permissions' ; source read at v1.2.54: app/Template/project_permission/users.php:36-54 add user form with a user autocomplete and role select, :26 'Remove'; app/Controller/ProjectPermissionController.php:67 addUser, :94 removeUser", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Members'; corpus: openproject/round4/M1-column.md 11.19 'memberships in app/models/member.rb' ; source read at v17.8.0: config/initializers/permissions.rb:208-216 manage_members covers members index, create, destroy and autocomplete_for_member; app/controllers/members_controller.rb:42 create, :87 destroy_by_principal", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' (Managing project roles, 2022-10-07); corpus: jira-data-center/round4/M1-column.md 13.4 Managing project role membership", - "plane": "corpus: plane/round4/menu-tree.md 'Settings: General, Members, ...' ; code-census.md §5 'ProjectMember.role', ProjectMemberInvite (project.py:192)" + "plane": "corpus: plane/round4/menu-tree.md 'Settings: General, Members, ...' ; code-census.md §5 'ProjectMember.role', ProjectMemberInvite (project.py:192) ; source read at v1.4.2: apps/web/core/components/project/member-list.tsx:78,110 'add_member' opens the invite modal, which lists workspace members not yet in the project, apps/web/core/components/project/send-project-invitation-modal.tsx:74; apps/api/plane/app/views/project/member.py:46-47 create and :290-291 destroy (admin only); apps/web/core/components/project/member-list-item.tsx:36 removeMemberFromProject" }, "built": { "state": "built", @@ -357,7 +405,7 @@ "kanboard": "corpus: kanboard/round4/usability.md 'three project roles and custom ones with column restrictions' ; journeys.md 5 custom role Toetser ; source read at v1.2.54: app/Core/Security/Role.php:18-20 project-manager, project-member, project-viewer; app/ServiceProvider/AuthenticationProvider.php:76-78 role hierarchy; app/Template/project_role/show.php:5 'Add a new custom role' with :21-27 project, drag and drop and column restrictions; app/Controller/ProjectRoleController.php:50 save", "openproject": "corpus: openproject/round4/M1-column.md 13.1 'app/models/role.rb:31 with nine subtypes ... Permissions are rows ... against a catalogue declared in code'; corpus: openproject/round4/M1-column.md 13.16 roles and permissions matrix ; source read at v17.8.0: app/models/role.rb:31-41 Role with builtin kinds; config/routes.rb:709 admin roles resources; config/initializers/permissions.rb:208 permissions are declared per role in code; app/controllers/members_controller.rb:71 update a member's roles", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 global permissions and project roles; corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission ... Assignable user Permission' (Managing project permissions)", - "plane": "corpus: plane/round4/code-census.md §5 'ROLE_CHOICES = ((20, \"Admin\"), (15, \"Member\"), (5, \"Guest\"))' project.py:21 ; three fixed roles, no custom role" + "plane": "corpus: plane/round4/code-census.md §5 'ROLE_CHOICES = ((20, \"Admin\"), (15, \"Member\"), (5, \"Guest\"))' project.py:21 ; three fixed roles, no custom role ; source read at v1.4.2: apps/api/plane/db/models/project.py:21 ROLE_CHOICES Admin 20, Member 15, Guest 5 and :219 ProjectMember.role; apps/web/core/components/project/settings/member-columns.tsx:101 updateMemberRole role dropdown; apps/api/plane/app/views/project/member.py:206 partial_update checks workspace role (:210-214). Three fixed roles, no custom role" }, "built": { "state": "none", @@ -387,7 +435,7 @@ "kanboard": "source: grep -rniE 'leave' app/Controller returns 0 hits; membership is removed by a project manager under Permissions (corpus: kanboard/round4/menu-tree.md 'Permissions') ; source read at v1.2.54: searched app/Controller and app/Template for 'leave': none; membership removal is app/Controller/ProjectPermissionController.php:94 removeUser, gated to Role::PROJECT_MANAGER at app/ServiceProvider/AuthenticationProvider.php:100", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'leave_project' finds only app/components/header/projects/node_component.html.erb:37, an 'x-circle' button that links to home_path (navigates away from the current project); removing a member needs manage_members; corpus: openproject/round4/M1-column.md 11.19 memberships administered, no self-removal found ; source read at v17.8.0: config/locales/en.yml:2890 'Leave project' is only app/components/header/projects/node_component.html.erb:33-37, an x-circle linking to home_path (navigates away); app/contracts/members/delete_from_project_contract.rb:32 removing any member needs manage_members; searched app/contracts/members for a self-removal exception: none", "jira": "corpus: jira-data-center/round4/M1-column.md 13.4 'project roles have specific members for each project' edited on the Managing project role membership page by a project or Jira admin; no self-leave documented", - "plane": "source: apps/api/plane/app/urls/project.py:88-89 'projects//members/leave/' ProjectMemberViewSet leave ; corpus silent on leaving" + "plane": "source: apps/api/plane/app/urls/project.py:88-89 'projects//members/leave/' ProjectMemberViewSet leave ; corpus silent on leaving ; source read at v1.4.2: apps/web/core/components/project/leave-project-modal.tsx:42,63 leaveProject; apps/api/plane/app/urls/project.py:88-89 members/leave/ route to ProjectMemberViewSet.leave; apps/api/plane/app/views/project/member.py:323-324 leave open to admin, member and guest" }, "built": { "state": "built", @@ -417,7 +465,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu ; source read at v1.2.54: app/Template/project/sidebar.php:59 'Close this project', :62 'Open this project'; app/Controller/ProjectStatusController.php:28 enable, :57 disable; app/Model/ProjectModel.php:539 enable, :555 disable; app/Template/project_list/project_icons.php:20 closed marker", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:141-148 'Archive' item needs archive_project; :153-161 'Unarchive' item (admin only); app/controllers/projects/archive_controller.rb:38-43 create archives, destroy unarchives; config/routes.rb:447", "jira": "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only", - "plane": "corpus: plane/round4/menu-tree.md workspace 'Archives' ; source: apps/api/plane/db/models/project.py:114 archived_at, apps/api/plane/app/urls/project.py:123-125 ProjectArchiveUnarchiveEndpoint (archive and unarchive)" + "plane": "corpus: plane/round4/menu-tree.md workspace 'Archives' ; source: apps/api/plane/db/models/project.py:114 archived_at, apps/api/plane/app/urls/project.py:123-125 ProjectArchiveUnarchiveEndpoint (archive and unarchive) ; source read at v1.4.2: apps/web/core/components/project/archive-restore-modal.tsx:32,44,67 archiveProject and restoreProject; apps/api/plane/app/urls/project.py:123-125 archive route; apps/api/plane/app/views/project/base.py:427-437 ProjectArchiveUnarchiveEndpoint post and delete; apps/api/plane/db/models/project.py:114 archived_at" }, "built": { "state": "built", @@ -450,7 +498,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Remove' under Configure this project ; source read at v1.2.54: app/Template/project/sidebar.php:67 'Remove' under the project menu; app/Controller/ProjectStatusController.php:87 remove; app/Model/ProjectModel.php:499-517 removes project and task files then the project; app/Schema/Sqlite.php:1556 tasks FOREIGN KEY(project_id) ON DELETE CASCADE", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Copy project, Delete project' ; source read at v17.8.0: app/components/projects/row_actions_component.rb:202-211 'Delete' row action (admin only) opens confirm_destroy; app/controllers/projects_controller.rb:153-165 destroy schedules deletion; app/services/projects/delete_service.rb:54-58 before_perform deletes members, work packages and storages, and descendants (:39)", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy'", - "plane": "corpus: plane/round4/code-census.md §2 soft delete via deleted_at, hard delete nightly by bgtasks/deletion_task.hard_delete ; source: apps/api/plane/bgtasks/deletion_task.py:18 soft_delete_related_objects cascades to the project's rows" + "plane": "corpus: plane/round4/code-census.md §2 soft delete via deleted_at, hard delete nightly by bgtasks/deletion_task.hard_delete ; source: apps/api/plane/bgtasks/deletion_task.py:18 soft_delete_related_objects cascades to the project's rows ; source read at v1.4.2: apps/web/core/components/project/delete-project-modal.tsx:33,61 deleteProject; apps/api/plane/app/views/project/base.py:382-399 destroy, workspace or project admin only; apps/api/plane/db/mixins.py:72-78 soft delete queues soft_delete_related_objects, apps/api/plane/bgtasks/deletion_task.py:18 cascades to the project's rows" }, "built": { "state": "built", @@ -480,7 +528,7 @@ "kanboard": "source: app/Filter/ProjectStatusFilter.php status filter on the project list, app/Template/project_list/sort_menu.php:11 sort by Status ; corpus: kanboard/round4/menu-tree.md 'Projects management' ; 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; app/Template/project_list/sort_menu.php:11 sort by 'Status' (is_active); app/Filter/ProjectStatusFilter.php:14 exists but grep of app/ for 'ProjectStatusFilter' finds no caller, so no page filters projects by status", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:117-135 filters 'Active projects', 'Archived projects', 'Project status - On track / Off track / At risk' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/menus/projects/menu.rb:87 'Archived projects' static list for admins; app/models/project_queries/static.rb:101-102 archived list filters active = false; app/models/queries/projects/filters/active_filter.rb:31 active filter; app/models/queries/projects/filters/project_status_filter.rb:35 status filter over app/models/project.rb:218-225 on_track, at_risk, off_track, not_started, finished, discontinued", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'A Jira project can only belong to one category'; 'An archived project will no longer appear in Jira' (archived projects page); no project status field to filter on", - "plane": "source: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects' ; corpus: plane/round4/menu-tree.md 'Archives'" + "plane": "source: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects' ; corpus: plane/round4/menu-tree.md 'Archives' ; source read at v1.4.2: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects'; apps/web/core/components/project/root.tsx:44-78 archives path sets the archived_projects display filter; apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/archives/page.tsx route; apps/api/plane/db/models/project.py:114 archived_at" }, "built": { "state": "built", @@ -510,7 +558,7 @@ "kanboard": "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings' ; source read at v1.2.54: app/Template/config/project.php:11-12 'Default columns for new projects (Comma-separated)'; app/Model/BoardModel.php:23 default Backlog, Ready, Work in progress, Done; :34 reads board_columns when a project is created", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'In an Action board each list represents a value of an attribute ... the Status board includes a list for the status New and a list for the status In Progress' (columns generated from statuses); Boards free (corpus: openproject/round4/menu-tree.md global 'Boards', not EE) (cited source paths checked present at the released v17.8.0 tag.) ; 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 basic, status, assignee, version, subproject, subtasks; modules/boards/app/services/boards/status_board_create_service.rb:11-17 a new Status board gets one list, Status.default; app/services/projects/copy/boards_dependent_service.rb:32-38 only a template or copy carries a prepared board set; a new blank project has no board", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types')", - "plane": "corpus: plane/round4/code-census.md §2 'DEFAULT_STATES at state.py:24-62 seeds five plus triage'; states are the board columns" + "plane": "corpus: plane/round4/code-census.md §2 'DEFAULT_STATES at state.py:24-62 seeds five plus triage'; states are the board columns ; source read at v1.4.2: apps/api/plane/db/models/state.py:24 DEFAULT_STATES list; apps/api/plane/app/views/project/base.py:293 project create bulk-creates a State per entry of DEFAULT_STATES, so every new project starts with the seeded columns" }, "built": { "state": "built", @@ -544,7 +592,7 @@ "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal' 26 hits 'none is a payment', 'currencies is a rate table for the task score' ; no budget or billing field on a project ; source read at v1.2.54: searched app/ (outside Locale) for 'budget', 'hourly', 'billing', 'fixed price': none; app/Schema/Sqlite.php:1526-1530 projects table and later ALTERs add no money field", "openproject": "corpus: openproject/round4/menu-tree.md project 'Budgets'; docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:11 'create and manage a project budget ... planned unit costs as well as labor costs'; no fixed-price or hourly billing term field (project attributes could hold it, corpus: openproject/round4/M1-column.md 11.23) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31 budgets resources; modules/budgets/app/models/budget.rb:59 subject, fixed_date required; :108 budget = base_amount + material + labor; :138 base_amount; searched app and modules for 'fixed_price', 'fixed.price', 'billing_type': none, so no delivery or billing term field", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'the integrations page lists test management, source control and collaboration tools and nothing financial'; no budget or billing term on a project; only a custom field on issues (corpus: jira-data-center/round4/M1-column.md 2.2)", - "plane": "corpus: plane/round4/code-census.md §2 fixed field list and 'no custom fields on any object'; no budget or billing field on Project (project.py:68-117); 'no Time tracking' (menu-tree.md)" + "plane": "corpus: plane/round4/code-census.md §2 fixed field list and 'no custom fields on any object'; no budget or billing field on Project (project.py:68-117); 'no Time tracking' (menu-tree.md) ; source read at v1.4.2: apps/api/plane/db/models/project.py:68-117 Project fields; searched project.py for 'budget', 'billing', 'fixed_price', 'hourly': none" }, "built": { "state": "built", @@ -577,7 +625,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'There is no customer or citizen interface' (nearest: a project-viewer account or the public read-only board) ; source read at v1.2.54: searched app/Template and app/Controller for 'portal', 'contractor', 'customer', 'client': only mail and password reset hits; nearest is a project-viewer account, app/Core/Security/Role.php:20, or the public board, app/ServiceProvider/AuthenticationProvider.php:153 BoardViewController readonly", "openproject": "corpus: openproject/round4/M1-column.md 6.7 'there is no citizen portal'; nearest is per-item sharing, Enterprise gated (corpus: openproject/round4/M1-column.md 3.19 work_package_sharing) ; source read at v17.8.0: searched app, modules/*/app and config/locales/en.yml for 'portal': only a UI modal portal element, app/views/layouts/base.html.erb:63; nearest is per work package sharing, app/models/sharing_strategies/work_package_strategy.rb:109 gated on :work_package_sharing", "jira": "corpus: jira-data-center/round4/M1-column.md 6.7 'The customer portal is JSM DC, a separate licence'; 3.19 'a partner needs an account and a licence'", - "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when guest_view_all_features is false a guest sees only items they own or are assigned'; an outsider needs a Plane login in the main app, there is no separate portal" + "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when guest_view_all_features is false a guest sees only items they own or are assigned'; an outsider needs a Plane login in the main app, there is no separate portal ; source read at v1.4.2: apps/api/plane/db/models/project.py:21 Guest role 5 and :100 guest_view_all_features default False; apps/web/core/components/project/project-settings-member-defaults.tsx:126,191 toggle for what guests see. A contractor is a guest user in the main app; no separate portal route under apps/web/app" }, "built": { "state": "built", @@ -607,7 +655,7 @@ "kanboard": "source: app/Template/project_creation/create.php:23 'Create from another project' with components chosen, app/Model/ProjectDuplicationModel.php:43-55 swimlanes, board columns, categories, roles, actions, tags, filters, tasks ; corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source read at v1.2.54: app/Template/project_creation/create.php:23-40 'Create from another project' with Categories, Tags, Actions, Custom filters, Tasks checkboxes; app/Model/ProjectDuplicationModel.php:43-57 swimlanes and board columns always copied, :102-118 loop", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project templates'; corpus: openproject/round4/M1-column.md 3.10 'applying a project template (app/models/project.rb:110)'; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-templates (copies work packages, boards, wiki, members); no labels object exists (categories copy) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/template_select_component.html.erb:39 template picker on new project; app/controllers/projects_controller.rb:106-115 new/create from template; app/controllers/projects/templated_controller.rb:35-41 mark a project as template; app/services/projects/copy/boards_dependent_service.rb:32, app/services/projects/copy/work_packages_dependent_service.rb:32 and the categories dependent service copy boards, categories, work packages", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes' (schemes only, no tasks or labels copied)", - "plane": "corpus: plane/round4/open-core.md 'Project Templates' listed under Business ; code-census.md §1 'Templates: absent from the backend', create-project-modal.tsx:29 templateId threaded to a no-op provider. Paid tier only, absent from Community" + "plane": "corpus: plane/round4/open-core.md 'Project Templates' listed under Business ; code-census.md §1 'Templates: absent from the backend', create-project-modal.tsx:29 templateId threaded to a no-op provider. Paid tier only, absent from Community ; source read at v1.4.2: apps/web/core/components/project/create-project-modal.tsx:29,78 templateId prop passed down, apps/web/core/components/projects/create/root.tsx:33 declares it and never reads it; searched apps/api/plane/db/models/__init__.py for 'template': none, no template model" }, "built": { "state": "none", @@ -636,7 +684,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source: app/Model/ProjectDuplicationModel.php:90 duplicate() ; source read at v1.2.54: app/Template/project/sidebar.php:52 'Duplicate'; app/Template/project_view/duplicate.php:26 Duplicate button; app/Controller/ProjectViewController.php:150 doDuplication; app/Model/ProjectDuplicationModel.php:90 duplicate", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings > Copy project'; corpus: openproject/round4/M1-column.md 2.9 copy service carries watchers, attachments ; source read at v17.8.0: app/components/projects/row_actions_component.rb:165-166 'Copy' row action needs copy_projects; config/initializers/permissions.rb:261-263 copy_projects permission; app/controllers/projects_controller.rb:131-140 copy enqueues Projects::EnqueueCopyService with chosen dependencies; app/services/projects/copy/work_packages_dependent_service.rb:118-127 relations are copied too", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Create with shared configuration ... use that project's schemes' is the only reuse; corpus: jira-data-center/round4/M1-column.md 11.2 issues move only with the whole-instance XML backup or a project import", - "plane": "corpus: plane/round4/menu-tree.md has no copy action ; source: grep -niE 'duplicate|clone|copy' apps/api/plane/app/urls/project.py returns only the licence header line" + "plane": "corpus: plane/round4/menu-tree.md has no copy action ; source: grep -niE 'duplicate|clone|copy' apps/api/plane/app/urls/project.py returns only the licence header line ; source read at v1.4.2: searched apps/api/plane/app/urls/project.py for 'duplicate', 'clone', 'copy': only the licence header at line 1; apps/web/core/components/project/card.tsx:115 the card's only copy action is handleCopyText, a link copy, not a project copy" }, "built": { "state": "none", @@ -665,7 +713,7 @@ "kanboard": "corpus: kanboard/round4/code-census.md 'metadata without a screen: project_has_metadata' ; open-core.md 'MetaMagik for typed custom fields' is a third-party plugin ; source read at v1.2.54: app/Api/Procedure/ProjectMetaDataProcedure.php:15 key-value project metadata over the API only; app/Controller/ProjectViewController.php:79 the only screen passes metadata to plugin integration forms, app/Template/project_view/integrations.php:12 'There is no integration registered'; typed custom fields are the third-party MetaMagik plugin", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields' ; source read at v17.8.0: config/routes.rb:789 admin project_custom_fields resources; config/initializers/menus.rb:777 project settings 'Project attributes'; app/models/project_custom_field.rb:58-66 visibility with admin_only fields; config/locales/en.yml:3575 'Project attributes'", "jira": "corpus: jira-data-center/round4/M1-column.md 11.23 projects have categories only; custom field contexts are 'a combination of projects and issue types where that field can be used' (2.2): fields live on issues, not projects", - "plane": "corpus: plane/round4/code-census.md §2 'the community edition has no custom fields on any object'; menu-tree.md 'no Custom fields or properties anywhere'" + "plane": "corpus: plane/round4/code-census.md §2 'the community edition has no custom fields on any object'; menu-tree.md 'no Custom fields or properties anywhere' ; source read at v1.4.2: searched apps/api/plane --include=*.py outside migrations for 'custom_field', 'CustomField', 'customproperty': only docstring examples at apps/api/plane/utils/filters/converters.py:78 and apps/api/plane/utils/filters/filter_backend.py:223, no model or endpoint" }, "built": { "state": "none", @@ -694,7 +742,7 @@ "kanboard": "source: grep -niE 'parent' app/Model/ProjectModel.php returns 0 hits; corpus: kanboard/round4/menu-tree.md flat project list ; source read at v1.2.54: searched app/Model/ProjectModel.php and app/Schema/Sqlite.php for 'parent' on projects: none; app/Schema/Sqlite.php:1526-1530 projects table has no parent column", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:64-65 'New subproject' needs add_subprojects; app/contracts/projects/base_contract.rb:45-46 parent attribute validated as assignable; app/contracts/projects/create_contract.rb:43-44 portfolio and program workspaces need the :portfolio_management Enterprise token, plain subprojects do not", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy'; corpus: jira-data-center/round4/M1-column.md 11.21 Advanced Roadmaps hierarchy 'Standard issue types are placed above the epic level (commonly Initiative ...)' groups issues, not projects", - "plane": "corpus: plane/round4/code-census.md §2 Project model lists no parent; 'teamspace' grep 0 hits (Teamspaces are Pro) ; source: grep -n parent apps/api/plane/db/models/project.py shows no parent project FK" + "plane": "corpus: plane/round4/code-census.md §2 Project model lists no parent; 'teamspace' grep 0 hits (Teamspaces are Pro) ; source: grep -n parent apps/api/plane/db/models/project.py shows no parent project FK ; source read at v1.4.2: searched apps/api/plane/db/models/project.py for 'parent': none, Project has no parent FK (fields at apps/api/plane/db/models/project.py:68-117); searched apps/api/plane --include=*.py for 'teamspace': none" }, "built": { "state": "none", @@ -723,7 +771,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity ; source read at v1.2.54: app/Template/project_overview/show.php:3-8 column task counts, description, activity; app/Template/project_overview/information.php:10-15 members by role, :22-26 start and end date; app/Controller/ProjectOverviewController.php:16 show", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews ; source read at v17.8.0: modules/overviews/config/routes.rb:6-7 project overview at the project root; modules/overviews/lib/overviews/grid_registration.rb:16 'project_description', :26 'project_status', :46 'members' default widgets; modules/overviews/app/components/overviews/overview_grid_component.rb renders them", "jira": "docs: project 'Summary' / project page is not in the corpus; corpus: jira-data-center/round4/M1-column.md 10.2 dashboards with gadgets can be built per project ('multiple dashboards for different projects'); no built-in overview with members and progress documented", - "plane": "source: no overview route under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ (archives, cycles, intake, issues, modules, pages, views only); the project card shows description and member count (apps/web/core/components/project/card.tsx:285-292). Project updates are a paid string never emitted (corpus: plane/round4/code-census.md opening section, is_project_updates_enabled 0 hits)" + "plane": "source: no overview route under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ (archives, cycles, intake, issues, modules, pages, views only); the project card shows description and member count (apps/web/core/components/project/card.tsx:285-292). Project updates are a paid string never emitted (corpus: plane/round4/code-census.md opening section, is_project_updates_enabled 0 hits) ; source read at v1.4.2: project detail routes under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ are archives, cycles, intake, issues, modules, pages, views only, no overview; apps/web/core/components/project/card.tsx:275-285 the project card shows description and member count" }, "built": { "state": "built", @@ -753,7 +801,7 @@ "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 11.26 'grep knowledge|faq|wiki returns 0. The nearest thing is a project file' ; source read at v1.2.54: searched app/ (outside Locale) for 'wiki', 'knowledge': none; nearest are project attachments, app/Template/project_overview/attachments.php:6 'Upload a file'", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Wiki'; corpus: openproject/round4/M1-column.md 9.1 wiki pages searchable (wiki_page.rb:52) ; source read at v17.8.0: lib/redmine/menu_manager/wiki_menu_helper.rb:30-34 builds the project Wiki menu when the module is on; config/routes.rb:496-500 project wiki resources with new page; app/models/wiki_page.rb:31, :52 wiki pages are searchable", "jira": "corpus: jira-data-center/round4/M1-column.md 1.9 'Integrating with Confluence Give your team the ability to share, discuss and work with Jira application issues in Confluence': wiki is a separate product (Confluence)", - "plane": "corpus: plane/round4/menu-tree.md 'Pages the only feature toggle that defaults on' ; code-census.md §4 Page with versioning, linked to projects via ProjectPage. 'Wikis' as a distinct object and 'Nested Pages' are paid (open-core.md)" + "plane": "corpus: plane/round4/menu-tree.md 'Pages the only feature toggle that defaults on' ; code-census.md §4 Page with versioning, linked to projects via ProjectPage. 'Wikis' as a distinct object and 'Nested Pages' are paid (open-core.md) ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(list)/page.tsx and apps/web/core/components/pages/pages-list-main-content.tsx:39,61 createPage; apps/api/plane/app/urls/page.py:23 project pages route, apps/api/plane/app/views/page/base.py:129 create; apps/api/plane/db/models/page.py:135 ProjectPage, apps/api/plane/db/models/project.py:96 page_view default True" }, "built": { "state": "none", @@ -782,7 +830,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 5 'createGroup Bouwtoezicht, addGroupMember carol, addProjectGroup(project-member): carol read the task' ; source read at v1.2.54: app/Template/project_permission/groups.php:38-48 add group form with group autocomplete, :29 remove; app/Controller/ProjectPermissionController.php:154-168 addGroup with a role", "openproject": "corpus: openproject/round4/M1-column.md 13.6 'a Group can be given a membership, so group-based visibility works' ; source read at v17.8.0: app/models/member.rb:40 a member is any principal; app/models/group.rb:31 Group < Principal; app/services/members/create_service.rb:49-55 adding a Group as member creates inherited memberships for its users; config/initializers/menus.rb:752 project Members page", "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects'", - "plane": "corpus: plane/round4/code-census.md §5 membership is per user, 'teamspace' grep 0 hits; M1-column.md 2.5 'assignees are individual users'. Teamspaces are a Pro string (open-core.md)" + "plane": "corpus: plane/round4/code-census.md §5 membership is per user, 'teamspace' grep 0 hits; M1-column.md 2.5 'assignees are individual users'. Teamspaces are a Pro string (open-core.md) ; source read at v1.4.2: apps/api/plane/db/models/project.py:210-219 ProjectMember is one user per row with a role; searched apps/api/plane/db/models/__init__.py for 'team', 'group' and apps/api/plane for 'teamspace': none, no group entity to share with" }, "built": { "state": "none", @@ -811,7 +859,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 6 'Enable public access ... the read-only board ... answered 200 without a session' ; menu-tree.md Public ; source read at v1.2.54: app/Template/project_view/share.php:19 'Enable public access', :10 'Public link'; app/ServiceProvider/AuthenticationProvider.php:153 BoardViewController readonly open to Role::APP_PUBLIC; app/Controller/BoardViewController.php:22 readonly; app/Model/ProjectModel.php:571 enablePublicAccess", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:105 'Make a project public'; corpus: openproject/round4/M1-column.md 4.21 'a public project, which exposes the whole project to anonymous users' (read-only follows the Anonymous role's permissions) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:177-178 'Make public' row action needs edit_project; app/models/project.rb:202 public_projects scope; :228 visible? is true for a public project to any user including anonymous, whose rights come from the Anonymous role, app/models/anonymous_user.rb:34", "jira": "corpus: jira-data-center/round4/M1-column.md 4.21 'you need to allow anonymous users to browse, search, and create issues in that project' (Allowing anonymous access to your project); browse without create is the read-only variant", - "plane": "corpus: plane/round4/code-census.md §6 'DeployBoard publishes an entity behind a random anchor', TYPE_CHOICES include project, view, page; space viewsets set AllowAny (space/views/project.py:20) ; journeys.md siblings of intake 'got past authentication'" + "plane": "corpus: plane/round4/code-census.md §6 'DeployBoard publishes an entity behind a random anchor', TYPE_CHOICES include project, view, page; space viewsets set AllowAny (space/views/project.py:20) ; journeys.md siblings of intake 'got past authentication' ; source read at v1.4.2: apps/web/core/components/project/publish-project/modal.tsx:60,94 publishProject; apps/api/plane/app/urls/project.py:113 project-deploy-boards route; apps/api/plane/db/models/deploy_board.py:19-32 DeployBoard with random anchor; apps/api/plane/space/views/project.py:20 permission_classes AllowAny for the public read" }, "built": { "state": "none", @@ -840,7 +888,7 @@ "kanboard": "corpus: kanboard/round4/usability.md 'Kanboard is a Kanban board with a task behind every card' ; menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: app/Controller/BoardViewController.php:56 show; app/Template/board/table_container.php:14 the board with its save url; app/Template/board/table_column.php:12 columns with task counts", "openproject": "corpus: openproject/round4/menu-tree.md global 'Boards' and project 'Work packages list, plus Gantt, board and calendar views'; boards_view is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md); docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:11 'OpenProject Agile boards ... Boards consist of lists (columns) and cards (work packages)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/config/routes.rb:2-13 global and project boards; modules/boards/app/controllers/boards/boards_controller.rb:120-129 basic and action board types; frontend/src/app/features/boards/board/board-list/board-list.component.html:22 a list per query; searched modules/boards for 'enterprise', 'allows_to': none, action boards free since 17.3", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Click Create a Kanban board'", - "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in a spreadsheet, board, calendar or gantt layout. That path is fast, clean and well made'" + "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in a spreadsheet, board, calendar or gantt layout. That path is fast, clean and well made' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx:130 board root with group drag and drop; apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:136 column drop target; apps/api/plane/app/views/issue/base.py:628 partial_update stores the new state" }, "built": { "state": "built", @@ -870,7 +918,7 @@ "kanboard": "corpus: kanboard/round4/usability.md 'the board, its columns and swimlanes' ; journeys.md 1 moveTaskPosition (the API behind the drag) ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:19 sortable columns, :37 save on drop, :72 posts to the board save url; app/Template/board/table_container.php:14 data-save-url; app/Controller/BoardAjaxController.php:22 save", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list or to a new list. Remember: Moving cards to another list in an Action board will update their attributes, e.g. status' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-card-view.component.ts:265 handleDrop; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165 cross-list drop; frontend/src/app/features/boards/board/board-actions/board-action.service.ts:280 assignToWorkPackage writes the list's attribute (status, assignee, version) to the moved card", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints section (cards moved between columns); corpus: jira-data-center/round4/M1-column.md 3.18 'you can drag and drop them'; board drag is the documented move", - "plane": "corpus: plane/round4/journeys.md board layout driven ; source: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable() from pragmatic-drag-and-drop; the workflow gate is the no-op hook (code-census.md opening section, use-workflow-drag-n-drop.ts:10-23), so every drop is accepted" + "plane": "corpus: plane/round4/journeys.md board layout driven ; source: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable() from pragmatic-drag-and-drop; the workflow gate is the no-op hook (code-census.md opening section, use-workflow-drag-n-drop.ts:10-23), so every drop is accepted ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable card; apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:136,171 dropTargetForElements onDrop to handleOnDrop; apps/web/core/components/issues/issue-layouts/utils.tsx:538 handleGroupDragDrop; apps/api/plane/app/views/issue/base.py:628 partial_update" }, "built": { "state": "built", @@ -900,7 +948,7 @@ "kanboard": "source: app/Template/task/sidebar.php:86 'Move position' dialog on the task page is a keyboard-usable form; app/Template/config/keyboard_shortcuts.php lists no card focus or move key on the board ; source read at v1.2.54: app/Template/task/sidebar.php:86 'Move position' on the task page only; app/Template/task_move_position/show.php:7-15 swimlane, column and position selects; app/Controller/TaskMovePositionController.php:33 save; app/Template/config/keyboard_shortcuts.php:11-15 board keys are n, s, c only, no card focus or move key", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniE 'keydown|keyboard|hotkey' frontend/src/app/features/boards returns only board-list-container.component.html:46 '(keydown.enter)=addList(board)'; cards move through WorkPackageCardDragAndDropService (drag only). The card's status can be changed from the card itself (agile-boards README:156 'update a work package's status directly in the card'), which is keyboard reachable on a Status board only ; source read at v17.8.0: searched frontend/src/app/features/boards and frontend/src/app/shared/directives/sortable-lists for 'keydown', 'keyboard', 'ArrowUp': only frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:46-47 Enter or Space on 'Add list'; cards move by drag only", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html only says app-specific shortcuts appear in the in-product dialog (Shift + /); the board shortcut list is not in the documentation and no instance was available", - "plane": "source: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:216 shortcut \"s\" opens the state menu for the focused work item in the command palette, so a state (column) change works from the keyboard once the item is open; no keyboard move on the board itself found (kanban/block.tsx is pointer drag only). Not driven in round 4" + "plane": "source: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:216 shortcut \"s\" opens the state menu for the focused work item in the command palette, so a state (column) change works from the keyboard once the item is open; no keyboard move on the board itself found (kanban/block.tsx is pointer drag only). Not driven in round 4 ; source read at v1.4.2: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:208-214 shortcut 's' in the command palette sets state_id of the focused work item; searched apps/web/core/components/issues/issue-layouts/kanban/ for 'onKeyDown', 'useKeypress', 'ArrowLeft', 'ArrowRight': none, so no keyboard move on the board itself" }, "built": { "state": "built", @@ -929,7 +977,7 @@ "kanboard": "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded' ; source read at v1.2.54: app/Template/column/index.php:19 'Task limit' column setting; app/Template/board/table_column.php:113-114 count over limit in the header; app/Template/board/table_tasks.php:6 board-task-list-limit class when the column is over its limit", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'wip.limit|work.in.progress|max_cards|card_limit' over app, modules and frontend/src hits only GitLab merge-request 'work in progress' handling (modules/gitlab_integration/...upsert_merge_request.rb); agile-boards README documents no list limit ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'wip_limit', 'wip.limit', 'max_cards', 'card_limit': none; a list is a saved query with a name only, frontend/src/app/features/boards/board/board-list/board-list.component.html:22", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints)", - "plane": "source: grep -rniE 'wip|max_issues|column_limit|issue_limit' --include=*.py apps/api returns only an unrelated test comment; corpus: plane/round4/code-census.md §2 State fields are name, description, color, slug, sequence, is_triage, default (no limit)" + "plane": "source: grep -rniE 'wip|max_issues|column_limit|issue_limit' --include=*.py apps/api returns only an unrelated test comment; corpus: plane/round4/code-census.md §2 State fields are name, description, color, slug, sequence, is_triage, default (no limit) ; source read at v1.4.2: apps/api/plane/db/models/state.py:79 State model; searched it for 'wip', 'max_issues', 'column_limit', 'issue_limit': none; searched apps/web/core/components/issues/issue-layouts/kanban/ likewise: none" }, "built": { "state": "built", @@ -962,7 +1010,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns' ; source read at v1.2.54: app/Template/column/index.php:5 'Add a new column', :29 'Change column position' drag handle, :34 Edit, :38 Remove; app/Controller/ColumnController.php:60 save, :114 update, :151 move, :186 remove", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:45-50 'Add list'; :7-10 drag lists to reorder (moveList); frontend/src/app/features/boards/board/board-list/board-list.component.html:22-25 rename a list inline; frontend/src/app/features/boards/board/board-list/board-list-menu.component.ts:66 'Delete list'", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header'", - "plane": "corpus: plane/round4/menu-tree.md 'Settings ... States' ; code-census.md §2 State per project with name, color, sequence; 'Groups are not user-definable' (six fixed groups), so columns within groups are free" + "plane": "corpus: plane/round4/menu-tree.md 'Settings ... States' ; code-census.md §2 State per project with name, color, sequence; 'Groups are not user-definable' (six fixed groups), so columns within groups are free ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/states route; apps/web/core/components/project-states/root.tsx:30-32 createState, moveStatePosition, updateState and apps/web/core/components/project-states/state-delete-modal.tsx:30,42 deleteState; apps/api/plane/app/views/state/base.py:47 create and :114 destroy" }, "built": { "state": "none", @@ -992,7 +1040,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 2 'createAction(project 1, task.move.column, TaskCloseColumn, column_id 4) ... is_active 0' : done is an automatic action per project, not a column flag ; source read at v1.2.54: app/Action/TaskCloseColumn.php:13,76 an automatic action closes a task moved into a chosen column; searched app/Schema/Sqlite.php for 'is_done', 'done_column': no done flag on columns", "openproject": "Status board columns are statuses and a status carries is_closed (corpus: openproject/round4/M1-column.md 2.7 'app/models/status.rb:31 ... is_closed (used at work_package.rb:105)'); the column itself is not marked done, closure comes from the status it maps to, and Basic board columns change nothing (agile-boards README:55) ; source read at v17.8.0: app/models/work_package.rb:276 closed? comes from status.is_closed?; modules/boards/app/services/boards/status_board_create_service.rb:11-12 a Status board list is a status_id filter, so a list counts as done only through its status; searched frontend/src/app/features/boards for a done or closed flag on a list: none", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses'", - "plane": "corpus: plane/round4/code-census.md §2 'A state change to a completed group state sets Issue.completed_at (issue.py:236-249)'; the completed group is fixed rather than chosen, but any state placed in it counts as done" + "plane": "corpus: plane/round4/code-census.md §2 'A state change to a completed group state sets Issue.completed_at (issue.py:236-249)'; the completed group is fixed rather than chosen, but any state placed in it counts as done ; source read at v1.4.2: apps/web/core/components/project-states/group-list.tsx lists states under fixed groups, a state added to the completed group counts as done; apps/api/plane/db/models/issue.py:240-247 _sync_completed_at sets completed_at when the state group is COMPLETED. The done group is fixed, any state in it is a done column" }, "built": { "state": "none", @@ -1022,7 +1070,7 @@ "kanboard": "corpus: kanboard/round4/usability.md 'one query language with twenty-five attributes runs the board' ; source: app/Filter/TaskPriorityFilter.php, assignee and tag filters in app/Filter/ ; source read at v1.2.54: app/Template/app/filters_helper.php:6-15 filter menu 'My tasks', 'Not assigned', 'Tasks due today'; app/ServiceProvider/FilterProvider.php:148 TaskAssigneeFilter, :156 TaskPriorityFilter, :223 TaskTagFilter in the board query lexer", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/features/boards/board/board-filter/board-filter.component.html '' with board-filters.service.ts building ApiV3 filters (assignee, type, priority, any work package filter corpus: openproject/round4/M1-column.md 9.2) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filter.component.html:1 '' the full work package filter set (assignee, type, priority, ...); frontend/src/app/features/boards/board/board-filter/board-filters.service.ts builds the ApiV3 filters saved on the board", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board'; default 'Only My Issues' and 'Recently Updated', each a JQL (assignee, labels, priority)", - "plane": "corpus: plane/round4/usability.md 'Layouts, filtering, the command palette ... are all good' ; code-census.md §9 IssueView filters; source: packages/constants/src/issue/filter.ts 'issues' page filters include assignees, labels, priority" + "plane": "corpus: plane/round4/usability.md 'Layouts, filtering, the command palette ... are all good' ; code-census.md §9 IssueView filters; source: packages/constants/src/issue/filter.ts 'issues' page filters include assignees, labels, priority ; source read at v1.4.2: apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx:206 project filter bar with labels, members and priority; apps/api/plane/utils/filters/filterset.py:138-151 assignee_id and label_id filters and :199 priority; apps/api/plane/utils/filters/converters.py:17-20 labels and assignees mapping" }, "built": { "state": "built", @@ -1052,7 +1100,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: app/Template/project_header/views.php:12 'Board', :18 'List' with the same search; app/Controller/TaskListController.php:21 show", "openproject": "corpus: openproject/round4/menu-tree.md 'Work packages list, plus Gantt, board and calendar views' over the same work packages ; source read at v17.8.0: frontend/src/app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive.ts:79 card view and :99 list view of the same query; frontend/src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service.ts:35-36 'list'|'card'; a board's lists are work package queries over the same records", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'base your board on an existing Saved Filter'; the same filter opens as a list in the issue navigator (corpus: jira-data-center/round4/M1-column.md 9.3, 9.5 column chooser)", - "plane": "corpus: plane/round4/menu-tree.md 'spreadsheet, board, calendar, gantt and list layouts'" + "plane": "corpus: plane/round4/menu-tree.md 'spreadsheet, board, calendar, gantt and list layouts' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx:24-36 LayoutSelection renders ISSUE_LAYOUTS; packages/constants/src/issue/layout.ts:9 'list' | 'kanban' | 'calendar' | 'spreadsheet' | 'gantt'; layout is a per-user display filter, the same items are served by apps/api/plane/app/views/issue/base.py:628 viewset" }, "built": { "state": "building", @@ -1082,7 +1130,7 @@ "kanboard": "source: app/Template/board/task_footer.php:24-28 tags, :62-74 due date, :135 priority, app/Template/board/task_private.php:29 assignee; blocked shows only as a link count icon (:89-90) with a tooltip ; corpus: kanboard/round4/menu-tree.md board screenshot ; source read at v1.2.54: app/Template/board/task_footer.php:24-28 tags, :62-74 due date coloured when overdue, :89-90 link count icon with tooltip, :135 priority; app/Template/board/task_private.php:29-31 assignee initials; no blocked marker, only the link count", "openproject": "Cards show type, subject, assignee avatar and dates, with highlighting by priority or type (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/.../highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'|'none'|'inline'); labels do not exist (corpus: openproject/round4/M1-column.md 2.8) and there is no blocked marker on a card (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html:121 'dueDate', :134 status button, :159-160 assignee avatar, :104-106 type; frontend/src/app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const.ts:31 priority or type highlight; searched that card template for 'blocked', 'blocks': none, and no label object exists", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards', 'Days in column shows dots on each card'; assignee avatar, flags and labels as a card field; blocked shown by the flag or a query colour ('One color per JQL query')", - "plane": "source: packages/constants/src/issue/common.ts ISSUE_DISPLAY_PROPERTIES keys key, assignee, start_date, due_date, labels, priority, state, sub_issue_count, attachment_count, link, estimate, modules, cycle: no blocked indicator; grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits ; corpus: plane/round4/code-census.md §9 display_properties" + "plane": "source: packages/constants/src/issue/common.ts ISSUE_DISPLAY_PROPERTIES keys key, assignee, start_date, due_date, labels, priority, state, sub_issue_count, attachment_count, link, estimate, modules, cycle: no blocked indicator; grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits ; corpus: plane/round4/code-census.md §9 display_properties ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:36,129 card renders IssueProperties; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:121,295 assignee and due date chips; packages/constants/src/issue/common.ts:142-159 display keys have no blocked entry; searched apps/web/core/components/issues/issue-layouts for 'blocked', 'blocking': none" }, "built": { "state": "built", @@ -1111,7 +1159,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:37 save sends the new position; app/Controller/BoardAjaxController.php:18-46 saves task positions from the drag and drop; app/Template/task_move_position/show.php:14-15 'Insert before this task', 'Insert after this task'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:161-175 same-list drop is a pure reorder; lib/api/v3/queries/order/query_order_api.rb:34, :73 PATCH the manual order; app/models/ordered_work_package.rb:31-35 stored position", "jira": "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column)", - "plane": "corpus: plane/round4/code-census.md §2 'sort_order float (:158)' on Issue ; source: kanban/block.tsx:206 drag within a group reorders by sort_order under manual ordering" + "plane": "corpus: plane/round4/code-census.md §2 'sort_order float (:158)' on Issue ; source: kanban/block.tsx:206 drag within a group reorders by sort_order under manual ordering ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable card; apps/web/core/components/issues/issue-layouts/utils.tsx:491-518 drop computes a new sort_order between neighbours under manual ordering; apps/api/plane/db/models/issue.py:158 sort_order FloatField" }, "built": { "state": "none", @@ -1143,7 +1191,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column ; source read at v1.2.54: app/Template/board/table_column.php:19 per column add button; app/Helper/TaskHelper.php:325-334 getNewBoardTaskButton 'Add a new task' opening TaskCreationController in that column; app/Template/board/table_column.php:35 'Create tasks in bulk'; app/Controller/TaskCreationController.php:51 save", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/add-card-dropdown/add-card-dropdown-menu.directive.ts:61 'Add new card' and :69 'Add existing'; config/locales/js-en.yml:189 'Add new card'; frontend/src/app/features/boards/board/board-list/board-inline-create.service.ts creates the card inside the list's query", "jira": "docs: inline create is documented on the backlog, not per board column; board cards come from the Create dialog (corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen'); not verified in a running instance", - "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot per column ; corpus: plane/round4/menu-tree.md 'New work item' global create" + "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot per column ; corpus: plane/round4/menu-tree.md 'New work item' global create ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot at the foot of each column; apps/api/plane/app/views/issue/base.py:405 create" }, "built": { "state": "none", @@ -1176,7 +1224,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Dashboard' ; source: app/Template/config/keyboard_shortcuts.php 'Open board switcher' ; source read at v1.2.54: app/Template/dashboard/overview.php:45-47 every project on the dashboard with open task counts per board column, linking to its board; app/Controller/DashboardController.php:18 show; app/Template/header.php:18 board selector; app/Template/config/keyboard_shortcuts.php:27 'Open board switcher'", "openproject": "corpus: openproject/round4/menu-tree.md global module 'Boards' in the top-left grid lists boards across projects ; source read at v17.8.0: modules/boards/config/routes.rb:2-5 global boards index; modules/boards/lib/open_project/boards/engine.rb:63-80 top and global menu 'Boards'; modules/boards/app/controllers/boards/boards_controller.rb:76-81 without a project it lists boards of every project allowed :show_board_views; modules/boards/app/views/boards/boards/index.html.erb:48 table of them", "jira": "docs: Jira Software 'View all boards' from the Boards menu; docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html boards span 'one or more projects'", - "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) offers spreadsheet and list layouts only; profile_issues offers kanban of your own items grouped by state or project. No page with every project's board ; corpus: plane/round4/menu-tree.md 'Workspace: Projects, Views, Analytics, Archives'" + "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) offers spreadsheet and list layouts only; profile_issues offers kanban of your own items grouped by state or project. No page with every project's board ; corpus: plane/round4/menu-tree.md 'Workspace: Projects, Views, Analytics, Archives' ; source read at v1.4.2: packages/constants/src/issue/filter.ts:170-195 my_issues (workspace views) offers spreadsheet and list layouts only, used by apps/web/core/components/workspace/views/form.tsx:137; packages/constants/src/issue/filter.ts:113-131 profile_issues offers a kanban grouped by project of one person's items; no page with every project's board" }, "built": { "state": "built", @@ -1206,7 +1254,7 @@ "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 9.14 'task_limit ... and, verified live, does not refuse the move' ; source read at v1.2.54: searched app/Model, app/Controller, app/Validator and assets/js/src/BoardDragAndDrop.js for 'task_limit' and 'limit': only column storage, app/Model/ColumnModel.php:183-212; the limit only styles the column, app/Template/board/table_tasks.php:6 board-task-list-limit", "openproject": "no WIP limit exists (see brd-wip-limits grep), so nothing blocks a move ; source read at v17.8.0: no limit to enforce: searched app, lib, modules and frontend/src for 'wip_limit', 'max_cards', 'card_limit': none; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165-171 a cross-list drop has no capacity check", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints are informational: violations only colour the column red or yellow and do not prevent issues being moved into it", - "plane": "no WIP limit exists (see brd-wip-limits); the drop gate is the hollow shim use-workflow-drag-n-drop.ts:10-23 'isWorkflowDropDisabled: false' (corpus: plane/round4/open-core.md shims table)" + "plane": "no WIP limit exists (see brd-wip-limits); the drop gate is the hollow shim use-workflow-drag-n-drop.ts:10-23 'isWorkflowDropDisabled: false' (corpus: plane/round4/open-core.md shims table) ; source read at v1.4.2: apps/web/core/components/workflow/use-workflow-drag-n-drop.ts:10-23 returns isWorkflowDropDisabled: false and a no-op handleWorkFlowState, so every drop is accepted; no WIP limit exists to enforce (see brd-wip-limits, apps/api/plane/db/models/state.py:79)" }, "built": { "state": "none", @@ -1235,7 +1283,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Swimlanes' ; code-census.md 'swimlanes SwimlaneModel' : swimlanes are named lanes a user places tasks in, not grouped automatically by assignee, priority or epic ; source read at v1.2.54: app/Template/swimlane/index.php:5 'Add a new swimlane'; app/Controller/SwimlaneController.php:57 save; app/Filter/TaskSwimlaneFilter.php:26 filter by swimlane; lanes are named and hand placed, nothing groups by assignee, priority or epic", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'swimlane' over the tree returns nothing; agile-boards README documents Basic and Action boards only ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'swimlane' (case-insensitive): none; board lists are laid out in one horizontal row, frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:9 cdkDropListOrientation horizontal", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane", - "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx ; packages/constants/src/issue/filter.ts:237 sub_group_by options state, priority, cycle, module, labels, assignees, created_by. No epic swimlane because epics are unreachable (corpus: plane/round4/journeys.md epics 404)" + "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx ; packages/constants/src/issue/filter.ts:237 sub_group_by options state, priority, cycle, module, labels, assignees, created_by. No epic swimlane because epics are unreachable (corpus: plane/round4/journeys.md epics 404) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx:62 SubGroupSwimlaneHeader; packages/constants/src/issue/filter.ts:237 sub_group_by state, priority, cycle, module, labels, assignees, created_by; apps/api/plane/app/views/issue/base.py:159-162 server groups by sub_group_by. No epic option" }, "built": { "state": "none", @@ -1264,7 +1312,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 5 'a custom filter Deze week te doen was saved as shared' ; code-census.md 'custom_filters.is_shared' ; source read at v1.2.54: app/Template/custom_filter/create.php:14 'Share with all project members', :17 'Append filter'; app/Controller/CustomFilterController.php:57 save; app/ServiceProvider/AuthenticationProvider.php:95 open to project members", "openproject": "A board is itself a saved query and work package queries can be saved and shared (corpus: openproject/round4/M1-column.md 9.3, 9.4 'a query is public or private'); board filter state is saved with the board, no separate named filter set per board ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filters.service.ts keeps one filter set saved with the board; app/contracts/queries/base_contract.rb:37 public flag and :62, :79 manage_public_queries for shared work package queries; searched frontend/src/app/features/boards for a named saved filter per board: none", "jira": "corpus: jira-data-center/round4/M1-column.md 9.4 'Filters ... can be shared with other users, user groups, projects, and project roles'; docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters are saved per board for 'anyone else using this board'", - "plane": "corpus: plane/round4/code-census.md §9 'a saved view can be shared (access = 1, the default) and it does carry its column set' ; menu-tree.md 'Views saved views'" + "plane": "corpus: plane/round4/code-census.md §9 'a saved view can be shared (access = 1, the default) and it does carry its column set' ; menu-tree.md 'Views saved views' ; source read at v1.4.2: apps/web/core/components/views/form.tsx:48,98 view form with access default PUBLIC; apps/api/plane/app/urls/views.py:18 project views route, apps/api/plane/app/views/view/base.py:420 create; apps/api/plane/db/models/view.py:58-66 IssueView with access Private or Public" }, "built": { "state": "none", @@ -1293,7 +1341,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28 ; source read at v1.2.54: app/Template/task_creation/show.php:18 colour field; app/Template/board/task_private.php:5 card class color-id; app/Action/TaskAssignColorCategory.php:23 'Assign automatically a color based on a category'; app/Action/TaskAssignColorPriority.php:23; app/Template/board/task_footer.php:28 coloured tags", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/configuration-modal/tabs/highlighting-tab.component.html:13 'entire card by' with :26 type and :29 priority options; app/contracts/queries/base_contract.rb:42 highlighting_mode saved; searched app and lib for an Enterprise gate on highlighting: none, attribute highlighting released to Community in 17.1", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query'", - "plane": "corpus: plane/round4/code-census.md §2 labels and states carry color; source: ISSUE_DISPLAY_PROPERTIES shows label and state chips on the card, no setting colours the whole card by label or type (no types exist, journeys.md)" + "plane": "corpus: plane/round4/code-census.md §2 labels and states carry color; source: ISSUE_DISPLAY_PROPERTIES shows label and state chips on the card, no setting colours the whole card by label or type (no types exist, journeys.md) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/properties/labels.tsx:155 a label chip on the card takes the label colour; apps/api/plane/db/models/label.py:21 color; no display option colours the whole card, packages/constants/src/issue/common.ts:142-159 display keys have no card colour)" }, "built": { "state": "none", @@ -1322,7 +1370,7 @@ "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move' ; source read at v1.2.54: app/Template/action/index.php:5 'Add a new action'; app/Controller/ActionCreationController.php:102 save; app/Action/TaskAssignSpecificUser.php:36 on EVENT_MOVE_COLUMN, app/Action/TaskCloseColumn.php:35; app/Core/Action/ActionManager.php:126 attachEvents", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'Moving work packages (cards) between two lists will update them automatically' (status, assignee, version boards set that attribute); arbitrary actions on entry need custom actions, which are button-triggered and Enterprise gated (corpus: openproject/round4/M1-column.md 3.9) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-actions/board-action.service.ts:279-290 moving a card writes the list's one attribute (status, assignee, version, subproject, parent); app/controllers/custom_actions_controller.rb:34 richer multi-field custom actions are Enterprise gated and triggered by a button, not by entering a list", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation on 'issue transitioned' whose actions are 'editing issues, sending notifications, creating sub-tasks' and workflow post functions such as 'Assign to Current User' (3.8); a column maps to statuses (docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html)", - "plane": "corpus: plane/round4/code-census.md §3 'The only automation engine in CE is two integer settings and one nightly job' (archive_in, close_in); 'Trigger And Action' (Pro) and 'Workflows + Approvals' (Business) are paid strings absent from Community (open-core.md)" + "plane": "corpus: plane/round4/code-census.md §3 'The only automation engine in CE is two integer settings and one nightly job' (archive_in, close_in); 'Trigger And Action' (Pro) and 'Workflows + Approvals' (Business) are paid strings absent from Community (open-core.md) ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/automations/page.tsx holds only apps/web/core/components/automation/auto-archive-automation.tsx:27-50 and auto-close; apps/api/plane/db/models/project.py:110-111 archive_in and close_in; apps/api/plane/bgtasks/issue_automation_task.py:23 nightly job. No on-enter-column trigger" }, "built": { "state": "none", @@ -1351,7 +1399,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md a board belongs to one project; Dashboard lists tasks across projects but no shared board ; source read at v1.2.54: app/Controller/BoardViewController.php:56-69 show builds the board from one project, boardFormatter withProjectId; searched app/Controller for a multi-project board: none, the dashboard lists tasks across projects without a board", "openproject": "Action boards include a subproject board (docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards, create-subproject-board image) and boards are per project; no board over unrelated projects documented (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/app/models/boards/grid.rb:33 a board belongs_to one project; modules/boards/app/services/boards/subproject_board_create_service.rb:4-9 a Subproject board, lists per child project; frontend/src/app/features/boards/board/board-actions/subproject/subproject-action.service.ts:43 'onlySubproject' filter; searched modules/boards for a board over unrelated projects: none", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects' and 'base your board on an existing Saved Filter'", - "plane": "source: packages/constants/src/issue/filter.ts my_issues layouts spreadsheet and list only (used by apps/web/core/components/workspace/views/form.tsx:148); profile_issues has kanban grouped by project for one person's items. Cross-project work is list-shaped, not a shared board" + "plane": "source: packages/constants/src/issue/filter.ts my_issues layouts spreadsheet and list only (used by apps/web/core/components/workspace/views/form.tsx:148); profile_issues has kanban grouped by project for one person's items. Cross-project work is list-shaped, not a shared board ; source read at v1.4.2: packages/constants/src/issue/filter.ts:170-195 workspace views (my_issues) offer spreadsheet and list layouts only, no kanban, used at apps/web/core/components/workspace/views/form.tsx:137; packages/constants/src/issue/filter.ts:128-131 profile kanban grouped by project covers one person's items only" }, "built": { "state": "none", @@ -1380,7 +1428,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md task 'Edit the task ... Open this task / Close this task · Remove' ; journeys.md 1 createTask ; source read at v1.2.54: app/Template/task/sidebar.php:36 'Edit the task', :92 'Close this task', :96 'Open this task', :102 'Remove'; app/Controller/TaskCreationController.php:51 save; app/Controller/TaskModificationController.php:83 edit; app/Controller/TaskSuppressionController.php:35 remove", "openproject": "corpus: openproject/round4/journeys.md 'Creating a work package, giving it a start date and a duration ... is the best-supported path'; corpus: openproject/round4/M1-column.md 1.2 work package create form; 2.17 delete service ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-new/wp-new-full-view.component.ts:35 create view; config/initializers/permissions.rb:324 add_work_packages, :333 edit_work_packages, :436 delete_work_packages; app/services/work_packages/create_service.rb, update_service.rb and delete_service.rb do the writes; app/models/work_package.rb:59 status", "jira": "corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen to open the Create issue dialog box'; 2.17 'Delete issues Permission'; statuses 2.7", - "plane": "corpus: plane/round4/journeys.md 'create a work item, give it a state, a priority, assignees, labels, a start date and a target date' ; code-census.md §2 Issue fields" + "plane": "corpus: plane/round4/journeys.md 'create a work item, give it a state, a priority, assignees, labels, a start date and a target date' ; code-census.md §2 Issue fields ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/title-input.tsx:53 title, apps/web/core/components/issues/issue-modal/form.tsx:238 description_html, apps/web/core/components/issues/issue-modal/components/default-properties.tsx:90 state_id; apps/api/plane/app/views/issue/base.py:405 create, :628 partial_update, :717 destroy; apps/api/plane/db/models/issue.py:136 name" }, "built": { "state": "built", @@ -1410,7 +1458,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 2.4 'yes' ; journeys.md 5 ; source: app/Model/TaskCreationModel.php:67 owner_id ; source read at v1.2.54: app/Helper/TaskHelper.php:126-130 'Assignee' select with 'Assign to me'; app/Controller/TaskModificationController.php:17 assignToMe; app/Model/TaskCreationModel.php:67 owner_id", "openproject": "corpus: openproject/round4/M1-column.md 2.4 'assigned_to and a separate responsible, both Principal (app/models/work_package.rb:57-81)' ; source read at v17.8.0: app/models/work_package.rb:61 assigned_to (a Principal); lib/api/v3/work_packages/schema/work_package_schema_representer.rb:451-453 available assignees feed the assignee picker; lib/api/v3/work_packages/work_packages_api.rb:99 AvailableAssigneesAPI", "jira": "corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission to assign issues to users'", - "plane": "corpus: plane/round4/M1-column.md 2.4 'Issue.assignees M2M (issue.py:149) ... editable from the work item peek and the spreadsheet layout'" + "plane": "corpus: plane/round4/M1-column.md 2.4 'Issue.assignees M2M (issue.py:149) ... editable from the work item peek and the spreadsheet layout' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:126 assignee_ids dropdown; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:121 updateIssue assignee_ids from the card; apps/api/plane/db/models/issue.py:149 assignees M2M; apps/api/plane/app/views/issue/base.py:628 partial_update" }, "built": { "state": "built", @@ -1439,7 +1487,7 @@ "kanboard": "source: a task has one owner_id (app/Model/TaskCreationModel.php:67); corpus: kanboard/round4/M1-column.md 2.5 'partial' (group only through a project, not per task) ; source read at v1.2.54: app/Helper/TaskHelper.php:127 a single owner_id select; app/Schema/Sqlite.php:1553 tasks.owner_id one column; searched app/Model and app/Schema for 'owner_ids', 'assignees': none; several assignees only through the third-party Group_assign plugin", "openproject": "corpus: openproject/round4/M1-column.md 2.5 'the two people fields are assigned_to and responsible and both are single-valued'; a Group can hold the assignment (one principal) ; source read at v17.8.0: app/models/work_package.rb:61-62 assigned_to and responsible are single belongs_to; searched app/models and lib/api/v3/work_packages for 'assignees' as a list and 'multi assign': only the available assignees picker; a group can be the one assignee", "jira": "corpus: jira-data-center/round4/M1-column.md 2.5 the assignee must be a single user (JRASERVER-5921 'Assign an issue to a group' closed as duplicate); 5.1 a 'User picker (multiple users)' custom field can list several people, which is not the assignee", - "plane": "corpus: plane/round4/code-census.md §2 'assignees M2M (:149)'; journeys.md 'assignees' plural set in the driven journey" + "plane": "corpus: plane/round4/code-census.md §2 'assignees M2M (:149)'; journeys.md 'assignees' plural set in the driven journey ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:126-139 assignee_ids dropdown with multiple; apps/api/plane/db/models/issue.py:149 assignees ManyToManyField" }, "built": { "state": "none", @@ -1468,7 +1516,7 @@ "kanboard": "source: app/Filter/TaskPriorityFilter.php, app/Template/board/task_footer.php:135 renderPriority, app/Action/TaskAssignColorPriority.php ; corpus: kanboard/round4/M1-column.md 2.6 bulk 'change ... priority' ; source read at v1.2.54: app/Helper/TaskHelper.php:174-179 'Priority' select over the project range; app/Template/board/task_footer.php:135 renderPriority on the card; app/Filter/TaskPriorityFilter.php; app/Action/TaskAssignColorPriority.php:23", "openproject": "corpus: openproject/round4/M1-column.md 8.2 'IssuePriority as a separate administered vocabulary'; 3.9 custom action kinds include priority ; source read at v17.8.0: app/models/work_package.rb:64 belongs_to priority IssuePriority; app/models/issue_priority.rb:31; config/routes.rb:771 admin work_package_priorities; config/initializers/menus.rb:421-422 'Priorities' admin page", "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'priority is a separate list'; 1.11 issue collector standard fields include 'Priority'", - "plane": "corpus: plane/round4/code-census.md §2 'priority from PRIORITY_CHOICES urgent/high/medium/low/none'" + "plane": "corpus: plane/round4/code-census.md §2 'priority from PRIORITY_CHOICES urgent/high/medium/low/none' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:109-119 PriorityDropdown; apps/api/plane/db/models/issue.py:107 PRIORITY_CHOICES and :141-143 priority field" }, "built": { "state": "built", @@ -1497,7 +1545,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 8.2 'yes' ; _round4/compare/promoted-rows-batch7.md 8.14 'the list and the board colour the date (task-date-overdue)' ; source read at v1.2.54: app/Helper/TaskHelper.php:235 'Due Date' field; app/Model/TaskCreationModel.php:63 date_due; app/Template/board/task_footer.php:62-66 task-date-overdue on the card; app/Template/task_list/task_icons.php:36 same in the list", "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package'; 8.2 'due date filters and a late indicator on the work package table' ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:129 due_date attribute; app/models/work_package.rb:285-287 overdue? when due_date is past and not closed; frontend/src/app/shared/components/fields/display/field-types/date-display-field.module.ts:63 overdue highlight class", "jira": "corpus: jira-data-center/round4/M1-column.md 3.6 'To schedule an issue, populate its Due date field'; 8.2 'overdue Find issues that were due before today'", - "plane": "corpus: plane/round4/M1-column.md 3.6 'Issue.target_date settable, sortable and filterable' and 8.2 'overdue styling is computed client side from target_date'" + "plane": "corpus: plane/round4/M1-column.md 3.6 'Issue.target_date settable, sortable and filterable' and 8.2 'overdue styling is computed client side from target_date' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:184-196 target_date picker; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:308 due date turns red via shouldHighlightIssueDueDate, packages/utils/src/work-item/base.ts:172; apps/api/plane/db/models/issue.py:148 target_date. Overdue is computed client side only" }, "built": { "state": "built", @@ -4046,7 +4094,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "source: lib/AppInfo/Application.php:189 DeckTeamResourceProvider lists a team's boards on the Team page, :144-145 board and card reference widgets in Text and Talk ; corpus: nextcloud-deck/round4/code-census.md 'team resource' ; source read at v1.19.0: lib/AppInfo/Application.php:191 DeckTeamResourceProvider lists a team's boards on the platform Team page; :145-146 card and board reference widgets, src/views/BoardReferenceWidget.vue, embed a board or card in Text and Talk; no widget for another app's record", - "kanboard": "standalone application with no embed surface ; corpus: kanboard/round4/code-census.md empty grep 'widget'", + "kanboard": "standalone application with no embed surface ; corpus: kanboard/round4/code-census.md empty grep 'widget' ; source read at v1.2.54: standalone application; searched app/ (outside Locale) for 'widget', 'embed' surfaces for another app: none; the nearest outward views are the token feeds, app/Controller/ICalendarController.php:62 and the public board", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:161 'In the Details side panel, click on the OpenProject tab. This tab lets you link work packages in OpenProject to the current file, and will list all linked work packages' (work packages on a Nextcloud file, not projects on a record) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:161 the Nextcloud Files sidebar 'OpenProject' tab lists the work packages linked to a file, built by the separate Nextcloud app on modules/storages/lib/api/v3/file_links/create_endpoint.rb and modules/storages/lib/api/v3/file_links/file_link_representer.rb:144; work packages on a file, not a record's projects in another app", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 Confluence and Jira embed each other's content through application links ('You can embed a Confluence activity stream or a Confluence page in Jira's dashboard'); another Atlassian product, not an arbitrary app's record page", "plane": "corpus: plane/round4/M1-column.md 12.17 'there is no plugin API'; no embeddable widget in apps/web" @@ -4076,7 +4124,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.7 'a REST API at /index.php/apps/deck/api/v1.0 and v1.1 (84 routes ...) plus 24 OCS routes. Verified live' ; source read at v1.19.0: appinfo/routes.php:102-114 card_api routes under /api/v{apiVersion}/boards/.../cards, :139-141 OCS routes; lib/Controller/CardApiController.php and lib/Controller/BoardApiController.php; docs/API.md:7-53 the documented REST API", - "kanboard": "corpus: kanboard/round4/code-census.md 'JSON-RPC procedure classes / methods 26 / 161' ; journeys.md 1 and 4 all over the API (JSON-RPC 2.0, not REST: M1-column.md 12.18)", + "kanboard": "corpus: kanboard/round4/code-census.md 'JSON-RPC procedure classes / methods 26 / 161' ; journeys.md 1 and 4 all over the API (JSON-RPC 2.0, not REST: M1-column.md 12.18) ; source read at v1.2.54: jsonrpc.php:5 JSON-RPC 2.0 endpoint, not REST; app/Api/Procedure holds 26 procedure classes, app/Api/Procedure/ProjectProcedure.php:109 createProject, app/Api/Procedure/TaskProcedure.php:101 createTask; app/Template/config/api.php:7-11 token and endpoint shown to the admin", "openproject": "corpus: openproject/round4/M1-column.md 1.7 'API v3 is a Grape API rooted at lib/api/v3/root.rb'; 12.18 OpenAPI description ; source read at v17.8.0: lib/api/v3/root.rb:35 API v3 root mounting every resource from :46; lib/api/v3/work_packages/work_packages_api.rb:99 work package endpoints; docs/api/apiv3/openapi-spec.yml the published OpenAPI description", "jira": "corpus: jira-data-center/round4/M1-column.md 1.7 'POST /api/2/issue Create an issue or sub-task from json'; 12.18 OpenAPI 3.0.1, 432 operations", "plane": "corpus: plane/round4/code-census.md §12 'The public REST API lives at apps/api/plane/api/ with views for ... issue, member, module, project, state', X-Api-Key auth ; M1-column.md 1.7 yes" @@ -4106,7 +4154,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'The Flow engine acts on files and knows no card event' ; source read at v1.19.0: searched lib/ for 'WorkflowEngine', 'IEntity', 'IOperation': none, so Deck registers no flow entity or check; card events reach only webhooks, lib/Event/ACardEvent.php:16", - "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move'", + "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move' ; source read at v1.2.54: app/Template/action/index.php:5 'Add a new action'; app/Controller/ActionCreationController.php:36 pick an event, :59 params, :102 save; app/ServiceProvider/ActionProvider.php:75 action manager with some fifty registered actions; app/Core/Action/ActionManager.php:126 attachEvents", "openproject": "corpus: openproject/round4/M1-column.md 3.9 CustomAction 'is fired by a button a user presses, not by a transition' and authoring is Enterprise gated; webhooks are outbound only (6.11); no event-driven rules on the free build ; source read at v17.8.0: app/controllers/custom_actions_controller.rb:34 custom actions (multi-field changes on a button) are Enterprise gated to author; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 outbound created or updated events only; searched for event-driven rules on the free build: none", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation 'You can choose from many triggers including issue transitioned, scheduled trigger, or issue created' (bundled in Data Center)", "plane": "corpus: plane/round4/code-census.md §3 'no rule, no trigger, no condition and no action model'; 'Trigger And Action' (Pro) and 'Automation Flows' (Enterprise) are absent from Community (open-core.md)" @@ -4136,7 +4184,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: lib/Event/ACardEvent.php:17 'abstract class ACardEvent extends Event implements IWebhookCompatibleEvent' (CardCreatedEvent, CardUpdatedEvent, CardDeletedEvent), so the platform's webhook_listeners can post card events once an admin registers a listener over OCS. corpus: nextcloud-deck/round4/M1-column.md 6.11 said 'registers no events with webhook_listeners'; the tag's source contradicts it; not driven ; source read at v1.19.0: lib/Event/ACardEvent.php:16 card events implement the platform IWebhookCompatibleEvent, as do ACL events in lib/Event/AAclEvent.php:14, so the platform webhook_listeners app can post them once an admin registers a listener through its API; no webhook screen in Deck, searched src/ for 'webhook': none", - "kanboard": "corpus: kanboard/round4/M1-column.md 6.11 'one webhook URL per instance with a token ... posted with event_name, event_data and event_author on every project event'", + "kanboard": "corpus: kanboard/round4/M1-column.md 6.11 'one webhook URL per instance with a token ... posted with event_name, event_data and event_author on every project event' ; source read at v1.2.54: app/Template/config/webhook.php:7-8 'Webhook URL', :20 token; app/ServiceProvider/NotificationProvider.php:38 webhook project notification; app/Notification/WebhookNotification.php:36 notifyProject, :59 postJson", "openproject": "corpus: openproject/round4/M1-column.md 6.11 'modules/webhooks/app/models/webhooks/webhook.rb with an event.rb selection model and a log.rb' ; source read at v17.8.0: modules/webhooks/config/routes.rb:30-38 admin outgoing webhooks; modules/webhooks/app/models/webhooks/webhook.rb:8 events per webhook and :24 all_projects; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 work package created or updated; modules/webhooks/app/models/webhooks/log.rb delivery log", "jira": "corpus: jira-data-center/round4/M1-column.md 6.11 'Webhooks are user-defined HTTP POST callbacks ... signed on request (HMAC)'", "plane": "corpus: plane/round4/code-census.md §11 'Webhook ... Event subscription is five booleans: project, issue, module, cycle, issue_comment', HMAC secret, WebhookLog with retry_count" @@ -4166,7 +4214,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; M1-column.md 11.2 'occ deck:export and occ deck:import ... Verified live' ; source read at v1.19.0: src/components/navigation/AppNavigationImportBoard.vue:7 'Import board', :10 accepts a JSON file, :45 importBoard; lib/Controller/BoardController.php:147 import, :183 system DeckJson; lib/Command/BoardImport.php:33 occ deck:import", - "kanboard": "source: app/Import/ holds TaskImport.php and UserImport.php (CSV) only; no Deck importer", + "kanboard": "source: app/Import/ holds TaskImport.php and UserImport.php (CSV) only; no Deck importer ; source read at v1.2.54: app/Import holds only TaskImport.php and UserImport.php for CSV; searched app/ (outside Locale) for 'deck', 'trello', 'jira' importers: none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): importers are app/services/import/jira* only (grep -rniIl 'deck' app/services/import returns nothing); CSV work package import is marked 'available on our Dev branch' (docs/user-guide/work-packages/importing/README.md) ; source read at v17.8.0: searched app/services/import and app/models for 'deck', 'trello': none; config/initializers/menus.rb:694-697 the only importer is 'Jira import'; docs/user-guide/work-packages has no CSV import at the tag", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html names CSV, JSON and importers for TFS, Rally, VersionOne, YouTrack, Axosoft, BaseCamp and Excel; no Nextcloud Deck importer", "plane": "corpus: plane/round4/code-census.md §12 'Importers: same. Importer is exported ... but no importer view or URL exists'" @@ -4196,7 +4244,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; code-census.md 'lib/Service/Importer/Systems/' ; 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 TrelloApiService.php reachable through lib/Command/BoardImport.php:33-40 occ deck:import --system and appinfo/routes.php:91-93 import API; the UI import is Deck JSON only, lib/Controller/BoardController.php:183; searched lib/Service/Importer for 'jira', 'csv': none", - "kanboard": "corpus: kanboard/round4/menu-tree.md 'Import tasks' ; source: app/Import/TaskImport.php CSV tasks into an existing project; no Jira or Trello importer in core", + "kanboard": "corpus: kanboard/round4/menu-tree.md 'Import tasks' ; source: app/Import/TaskImport.php CSV tasks into an existing project; no Jira or Trello importer in core ; source read at v1.2.54: app/Template/project_header/dropdown.php:69 'Import tasks'; app/Template/task_import/show.php:2-8 CSV with a delimiter; app/Controller/TaskImportController.php:40 save, :70 template; app/Template/project/sidebar.php:55 'Import tasks from another project'; no Jira or Trello importer in core", "openproject": "docs: opf/openproject HEAD 27a58131 docs/installation-and-operations/jira-migration/README.md 'Step-by-step guide for migrating from Jira Data Center to OpenProject using the Jira Migrator'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/import/jiras/create_service.rb. Note: the migrator arrived behind a feature flag in 17.2 (release-notes/17-2-0:129-134), after the round-4 drive on 16.6.10; CSV import is dev-branch only Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/initializers/menus.rb:694-697 admin 'Jira import'; config/routes.rb:908-918 admin import jira instances and runs; app/services/import/jira_client.rb and app/services/import/jiras do the import; no Trello or spreadsheet importer, Jira only", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file'", "plane": "corpus: plane/round4/code-census.md §12 'no importer view or URL exists'; source: grep -rniE 'import.?csv|jira|trello' apps/web/core --include=*.tsx finds no importer UI" @@ -4226,7 +4274,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: grep -rniE 'github|gitlab|commit' lib returns only migration comments; no forge integration ; corpus: nextcloud-deck/round4/open-core.md host surfaces list ; source read at v1.19.0: searched lib/ and src/ for 'github', 'gitlab', 'forge', 'commit': only a comment URL at lib/Service/SessionService.php:77 and a Vuex commit at src/components/Controls.vue:450; no forge integration", - "kanboard": "source: grep -rniE 'github|gitlab|gogs|bitbucket' app/Action app/Controller returns 0 files; forge hooks are plugins (corpus: kanboard/round4/open-core.md 'a directory of 163 third-party plugins')", + "kanboard": "source: grep -rniE 'github|gitlab|gogs|bitbucket' app/Action app/Controller returns 0 files; forge hooks are plugins (corpus: kanboard/round4/open-core.md 'a directory of 163 third-party plugins') ; source read at v1.2.54: searched app/Action and app/Controller for 'github', 'gitlab', 'gogs', 'bitbucket': no files; forge webhooks are third-party plugins", "openproject": "corpus: openproject/round4/M1-column.md 12.22 'the GitHub and GitLab modules receive inbound events (modules/github_integration/, modules/gitlab_integration/)' ; source read at v17.8.0: modules/github_integration/lib/open_project/github_integration/engine.rb:94-96 registers the inbound 'github' hook and :82 a GitHub tab on the work package; modules/github_integration/app/models/github_pull_request.rb; modules/gitlab_integration/app/models/gitlab_merge_request.rb and modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb:73 GitLab tab", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 'workflow triggers from development tools' ('Fisheye/Crucible, Bitbucket and GitHub', 8.9); 12.5 'Jira's Subversion integration lets you see Subversion commit information relevant to each issue'", "plane": "corpus: plane/round4/code-census.md §12 'The GitHub and Slack integrations are unreachable dead tables in CE'; 'Popular integrations' is a Pro string. Only 'Copy branch name' exists in the web app" @@ -4256,7 +4304,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "source: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients on the REST API ; not in the round-4 drive ; source read at v1.19.0: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients built on the REST API at appinfo/routes.php:102-114; not Deck's own code", - "kanboard": "source: app/Template/layout.php:5 viewport meta and ChangeLog:1028 'Improve layout on mobile/tablet devices' : a responsive web UI, no mobile app in the project", + "kanboard": "source: app/Template/layout.php:5 viewport meta and ChangeLog:1028 'Improve layout on mobile/tablet devices' : a responsive web UI, no mobile app in the project ; source read at v1.2.54: app/Template/layout.php:5 viewport meta; ChangeLog:1028 'Improve layout on mobile/tablet devices', ChangeLog:242 apple-mobile-web-app-capable meta tag: a responsive web UI, no mobile app in the tree", "openproject": "docs: opf/openproject HEAD 27a58131 docs/mobile-app-guide/README.md 'The OpenProject Mobile app (Beta) is available for iOS and Android. It is designed as a companion app'; beta, not in the round-4 drive The docs file is present at v17.8.0 (absent at v16.6.10); beta, so partial. ; source read at v17.8.0: docs/mobile-app-guide/README.md:2 'Mobile app guide (Beta)' and :10 a companion app for iOS and Android, a separate repository; docs/release-notes/17-0-0/README.md:279 built-in OAuth application for clients such as the mobile app; beta, so partial", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push notifications 'on iOS and Android devices' for the Jira Data Center mobile app (corpus: jira-data-center/round4/M1-column.md 6.8 'the mobile app has one')", "plane": "not checked: the web repo at 2f895b82 holds no mobile client (grep for play.google, apps.apple, 'mobile app' in apps/web, apps/space and en locales returns nothing) and round 4 did not test whether Plane's separate mobile apps connect to a Community self-hosted instance" @@ -4286,7 +4334,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 3 'the file appeared as /Deck/bijlage-r4b6.txt ... in the uploader's Files' : one /Deck folder per uploader, not a shared folder per board ; source read at v1.19.0: lib/Sharing/DeckShareProvider.php:50 DECK_FOLDER '/Deck' and lib/Service/ConfigService.php:244 attachment_folder '/Deck' per user: attachments land in each uploader's own /Deck folder and are shared to the board, no folder is made per board", - "kanboard": "corpus: kanboard/round4/M1-column.md 4.23 'no' ; journeys.md 4 files stored under tasks/3/ in Kanboard's own store", + "kanboard": "corpus: kanboard/round4/M1-column.md 4.23 'no' ; journeys.md 4 files stored under tasks/3/ in Kanboard's own store ; source read at v1.2.54: app/Model/TaskFileModel.php:59-61 files sit in Kanboard's own object store under 'tasks'; app/Template/project_overview/attachments.php:6 project attachments in the same store; searched app/ for an outside file store link: none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:27 'It is also possible to automatically create dedicated project folders'; corpus: openproject/round4/M1-column.md 4.23 'an automatically managed project folder (last_project_folder.rb)'; Nextcloud storage is free (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/storages/app/models/storages/project_storage.rb:46-52 project_folder_mode with 'automatic'; modules/storages/app/services/storages/nextcloud_managed_folder_create_service.rb:32-42 creates the managed project folder in Nextcloud; modules/storages/app/models/storages/last_project_folder.rb; modules/storages/config/locales/en.yml:21-22 'Project folder', 'Project folder mode'", "jira": "corpus: jira-data-center/round4/M1-column.md 4.23 'not hosted in a platform with a file manager'; attachments sit in the home directory or S3", "plane": "corpus: plane/round4/code-census.md §4 'Folders: absent. No folder or directory model'; M1-column.md 4.23 no file manager" @@ -4316,7 +4364,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 5 'pjanssen found nothing until added to the group' ; install.md 'a stranger reads the board -> HTTP 403' ; source read at v1.19.0: lib/Service/PermissionService.php:171-199 every read and write checks the board ACL and throws 'Permission denied'; lib/Db/Acl.php:31-39 read, edit, share, manage for user, group, remote, team; src/components/board/SharingTabSidebar.vue:39-52 'Can edit', 'Can share', 'Can manage'", - "kanboard": "corpus: kanboard/round4/journeys.md 5 'carol, not a member, was refused on the project and on the task (403)' ; install.md refusal probe", + "kanboard": "corpus: kanboard/round4/journeys.md 5 'carol, not a member, was refused on the project and on the task (403)' ; install.md refusal probe ; source read at v1.2.54: app/Middleware/ProjectAuthorizationMiddleware.php:29,34 checkProjectAccess on every task and project request, :47-50 throws AccessForbiddenException; app/Model/ProjectPermissionModel.php:121 isUserAllowed; app/Controller/ProjectListController.php:20-23 non admins see only their project ids", "openproject": "corpus: openproject/round4/M1-column.md 9.7 'search is scoped through the project permission system (app/services/authorization/user_allowed_query.rb)'; 13.1 project roles ; source read at v17.8.0: app/models/work_package.rb:87 visible scope is allowed_to view_work_packages and :231-232 visible?; app/models/work_packages/scopes/allowed_to.rb:39 permission-based scope; app/services/authorization/user_allowed_query.rb:31; config/initializers/permissions.rb:306 view_work_packages per project role", "jira": "corpus: jira-data-center/round4/M1-column.md 9.7 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues'", "plane": "corpus: plane/round4/code-census.md §13 'Project visibility adds network secret (0) or public-to-workspace (2)', allow_permission resolves ProjectMember role" @@ -4349,7 +4397,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings default board on start · calendar bridge · group limit for board creation (admin)' and 'There is almost none' ; source: no lib/Settings admin page in the tag ; source read at v1.19.0: src/components/DeckAppSettings.vue:27 'Admin settings' shown to admins inside the app settings dialog, :32 'Limit board creation to some groups', :41 'Enable federation'; no platform admin settings page, appinfo/info.xml:67-72 declares only activity settings", - "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'About · Application settings · Email settings · Project settings · Board settings ...' ; M1-column.md 11.24 'yes'", + "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'About · Application settings · Email settings · Project settings · Board settings ...' ; M1-column.md 11.24 'yes' ; source read at v1.2.54: app/Template/config/sidebar.php:4-34 About, Application, Email, Project, Board settings, Tags, Link labels, Currency rates, Integrations, Webhooks, API; app/ServiceProvider/AuthenticationProvider.php:160 ConfigController admin only", "openproject": "corpus: openproject/round4/menu-tree.md 'Administration' tree; corpus: openproject/round4/M1-column.md 11.24 'a large administration area over several hundred setting definitions' ; source read at v17.8.0: config/initializers/menus.rb:307 the Administration menu; config/routes.rb:740 admin settings namespace; config/routes.rb:885 working days and :890 iCalendar settings among the setting pages", "jira": "corpus: jira-data-center/round4/M1-column.md 11.24 instance configuration (CORS, banner, email templates); 11.15 'Configuring Jira application options'", "plane": "corpus: plane/round4/menu-tree.md 'Instance administration, at /god-mode: General, Email, Authentication, Workspaces, Artificial intelligence, Images' plus project Settings" @@ -4378,7 +4426,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md setup is occ app:install and occ config:app:set ; the app opens on a welcome board, no guided setup ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29 and lib/Service/DefaultBoardService.php:37-46 on first run create a sample board, nothing more; searched lib/ and src/ for 'wizard', 'onboarding': none", - "kanboard": "source: app/Schema/Sqlite.php:1564 seeds user admin with password admin; no setup wizard (corpus: kanboard/round4/install.md 'the first page rendered the moment the container was healthy')", + "kanboard": "source: app/Schema/Sqlite.php:1564 seeds user admin with password admin; no setup wizard (corpus: kanboard/round4/install.md 'the first page rendered the moment the container was healthy') ; source read at v1.2.54: app/Schema/Sqlite.php:1563-1564 seeds user admin with password admin; searched app/Template and app/Controller for 'wizard', 'onboard', 'first run', 'welcome': none", "openproject": "corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database, so there is no setup wizard'; a first-login onboarding tour exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts, tours/gantt_tour.ts) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/helpers/homescreen_helper.rb:52-53 onboarding modal for a first time user; app/views/layouts/base.html.erb:136-139 renders it; frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts guided tour; searched app (rb) for 'setup wizard', 'first run', 'installation wizard': none, the instance seeds itself", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira application setup wizard will only display the first time after you install' (database, administrator, email, language, licence)", "plane": "corpus: plane/round4/usability.md 'The instance setup form'; install.md first run ; source: apps/web/core/components/onboarding/ profile-setup, create-workspace, invite-members steps" @@ -4408,7 +4456,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source: lib/Service/DefaultBoardService.php and lib/Service/fixtures/default-board.json create a sample board per user ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29-30 on a user's first visit creates 'Welcome to Nextcloud Deck!' from lib/Service/DefaultBoardService.php:66 createDefaultBoard and lib/Service/fixtures/default-board.json:5-16 sample lists and cards, translated at lib/Service/DefaultBoardService.php:78-83; one sample per user, not an admin loader", - "kanboard": "no demo or sample data in core ; source: app/Schema/Sqlite.php seeds settings and the admin user only ; corpus: kanboard/round4/install.md", + "kanboard": "no demo or sample data in core ; source: app/Schema/Sqlite.php seeds settings and the admin user only ; corpus: kanboard/round4/install.md ; source read at v1.2.54: searched app/Schema and app/Console for 'demo', 'sample data', 'fixture': none; app/Schema/Sqlite.php:1563-1564 the install seeds only the admin user", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/seeders/demo_data_seeder.rb:29-30 DemoDataSeeder with its data seeder classes; app/seeders/demo_data/global_query_seeder.rb and overview_seeder.rb seed demo projects, queries and overviews on a fresh instance", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data'", "plane": "source: apps/api/plane/app/views/workspace/base.py:137 workspace_seed.delay on workspace creation, seeds from apps/api/plane/seeds/data (projects, issues, cycles, modules, pages, views, labels, states); corpus: plane/round4/code-census.md §5 cites the seeded dummy data (workspace_seed_task.py:160,163). Automatic, not opt-in" @@ -4443,7 +4491,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'translations in l10n/ 93' (nl among them: l10n/nl.js, nl.json) ; source read at v1.19.0: l10n/nl.json holds 441 translated strings against 445 in l10n/en_GB.json; 93 languages in l10n/; strings go through t('deck', ...) in src/, e.g. src/components/DeckAppSettings.vue:7, and l10n->t in lib/, e.g. lib/Dashboard/DeckWidgetUpcoming.php:53", - "kanboard": "corpus: kanboard/round4/code-census.md 'locales, app/Locale/ 38, nl_NL among them'", + "kanboard": "corpus: kanboard/round4/code-census.md 'locales, app/Locale/ 38, nl_NL among them' ; source read at v1.2.54: app/Locale holds 38 locales; app/Locale/nl_NL/translations.php:372 'Board settings' => 'Bord-instellingen', 1468 translated keys and no commented out ones; app/Template/config/application.php:12 application language, app/Template/user_modification/show.php:28-29 per user language", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/crowdin/nl.yml, js-nl.yml, nl.seeders.yml; corpus: openproject/round4/M1-column.md 11.13 'translations come from Crowdin' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/crowdin/nl.yml:1 Dutch server strings, with js-nl.yml and nl.seeders.yml beside it; config/locales/en.yml:3391 English source strings; the language is chosen per user in account settings", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/translating-jira-938847004.html 'Jira ships with a number of translations in the most commonly-requested languages'; Dutch is not listed there, product strings come as language packs ('update these via the Universal Plugin Manager', corpus: jira-data-center/round4/M1-column.md 11.13)", "plane": "source: packages/i18n/src/locales has 20 locales (cs, de, en, es, fr, id, it, ja, ka-ge, ko, pl, pt-BR, ro, ru, sk, tr-TR, ua, vi-VN, zh-CN, zh-TW) and no nl; English yes, Dutch no. Corpus: plane/round4/M1-column.md 11.13 'translations are static catalogues in packages/i18n'" @@ -4476,7 +4524,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue arrow-key card focus and N, F, X, Q shortcuts, src/components/cards/CardItem.vue:263-290 per-card keys, aria-labels on controls; not audited against WCAG AA in the round-4 drive (usability.md) ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:106-118 N, F, X, Q and arrow-key card navigation, listed in src/components/DeckAppSettings.vue:46-55; src/components/cards/CardItem.vue:12 tabindex and :30 aria-label; src/components/card/TagSelector.vue:15 aria labels on selects; not audited against WCAG AA, and the Gantt is a frappe-gantt SVG, src/components/board/GanttView.vue:63", - "kanboard": "source: app/Template/config/keyboard_shortcuts.php shortcut list, app/Template/board/table_column.php:114 'ui-helper-hidden-accessible' screen-reader text; board cards have no keyboard move (brd-keyboard-move); not audited against WCAG AA in the round-4 drive", + "kanboard": "source: app/Template/config/keyboard_shortcuts.php shortcut list, app/Template/board/table_column.php:114 'ui-helper-hidden-accessible' screen-reader text; board cards have no keyboard move (brd-keyboard-move); not audited against WCAG AA in the round-4 drive ; source read at v1.2.54: app/Template/config/keyboard_shortcuts.php:5-31 keyboard shortcuts; app/Template/board/table_column.php:12 'ui-helper-hidden-accessible' screen reader text; app/Template/column/index.php:29 aria-label on the drag handle; cards cannot be moved by keyboard on the board, see brd-keyboard-move; no accessibility statement or audit in the tree", "openproject": "corpus: openproject/round4/usability.md 'Every page carries a Jump to content skip link, headings are structured ... form fields carry proper labels'; docs: opf/openproject HEAD 27a58131 docs/release-notes/17-2-0/README.md:85 widgets 'follow WCAG 2.1 AA guidelines for focus management' (partial scope); cards move by drag only (brd-keyboard-move) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/views/layouts/base.html.erb:71-72 skip-navigation link to content; docs/release-notes/17-2-0/README.md:85 overview widgets keyboard operable and 'follow WCAG 2.1 AA guidelines for focus management', a partial scope; brd-keyboard-move shows cards still move by drag only", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html Jira applications 'audited ... to make sure they're compliant with Section 508 and WCAG 2.0 AA' (an older level, vendor statement, not driven)", "plane": "corpus: plane/round4/usability.md 'The accessibility tree is usable but noisy. Navigating it surfaced the entire sidebar twice on every page'; no WCAG AA claim checked" @@ -4506,7 +4554,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 11.14 'platform: theming (enabled) sets logo, colours and name for the whole instance' ; the Vue client styles with platform CSS variables (e.g. var(--color-border) in src/components/board/GanttView.vue), so a token theme on the host would reach it; NL Design System tokens themselves are not shipped, not driven ; source read at v1.19.0: Deck styles with the platform CSS variables, e.g. src/components/board/GanttView.vue:530-546 var(--color-background-hover), var(--color-primary-element), so platform theming carries through; searched lib/ and src/ for 'nldesign', 'theming': no own token support, and board and label colours are fixed hex values, lib/Service/BoardService.php:242", - "kanboard": "corpus: kanboard/round4/M1-column.md 11.14 'partial: application_stylesheet takes custom CSS ... the logo and name are fixed' ; source: assets/css/light.min.css styles through CSS custom properties (179 var(--...) uses, e.g. --color-primary), so custom CSS could map tokens onto them; no NL Design System tokens shipped, not driven", + "kanboard": "corpus: kanboard/round4/M1-column.md 11.14 'partial: application_stylesheet takes custom CSS ... the logo and name are fixed' ; source: assets/css/light.min.css styles through CSS custom properties (179 var(--...) uses, e.g. --color-primary), so custom CSS could map tokens onto them; no NL Design System tokens shipped, not driven ; source read at v1.2.54: app/Template/config/application.php:35-36 'Custom Stylesheet'; app/Helper/AssetHelper.php:52-53 injects it on every page; assets/css/src/themes/dark.css:2-5 theme colours are CSS custom properties, 179 var() uses in assets/css/light.min.css; no NL Design System token mapping", "openproject": "corpus: openproject/round4/M1-column.md 11.14 'app/controllers/custom_styles_controller.rb:49 is the design and branding screen, Enterprise gated (define_custom_style). The free build sets a logo and nothing else'; no NL Design System tokens ; source read at v17.8.0: app/controllers/custom_styles_controller.rb:49 design and colour customisation needs the :define_custom_style token, only logo downloads (:38-39) are unguarded; searched app and frontend/src (rb, scss, ts) for 'nldesign', 'nl-design', 'design token': none", "jira": "corpus: jira-data-center/round4/M1-column.md 11.14 'How to change your logo ... How to change Jira application colors'; colours and logo, no design-token theming or NL Design System support", "plane": "corpus: plane/round4/M1-column.md 11.14 'WorkspaceTheme and per-user theme ... No stylesheet or component theming'; no design token import" @@ -4536,7 +4584,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md 'occ app:install deck -> deck 1.18.4 installed' on a throwaway Nextcloud ; source read at v1.19.0: appinfo/info.xml:41-45 a Nextcloud app on pgsql, sqlite or mysql, installed on the customer's own server; searched lib/ for outgoing vendor calls: only the optional Trello importer, lib/Service/Importer/Systems/TrelloApiService.php:10-22; note v1.19.0 requires Nextcloud 35 exactly, appinfo/info.xml:45", - "kanboard": "corpus: kanboard/round4/install.md 'Kanboard ships one official image ... needs nothing beside it'", + "kanboard": "corpus: kanboard/round4/install.md 'Kanboard ships one official image ... needs nothing beside it' ; source read at v1.2.54: Dockerfile line 1 FROM alpine and line 13 EXPOSE 80 443, one self-contained image with its own nginx, docker/etc/nginx/nginx.conf:75; config.default.php:67 DB_DRIVER sqlite by default; no vendor cloud service is called", "openproject": "corpus: openproject/round4/install.md 'openproject/openproject:16 from Docker Hub ... against an external PostgreSQL' ; source read at v17.8.0: docker/prod/Dockerfile (line 6) builds the production image from this tree; docs/installation-and-operations/installation/docker/README.md:119-124 'docker run ... openproject/openproject:17' on your own host; publiccode.yml:55 GPL-3.0-or-later, no vendor cloud needed", "jira": "corpus: jira-data-center/round4/open-core.md 'On 30 March 2026 Atlassian stopped selling Data Center licences to new customers; on 28 March 2029 every Data Center product reaches end of life and turns read-only'; self-hosted for existing licence holders only", "plane": "corpus: plane/round4/install.md 'makeplane/plane-aio-community:v1.4.2' run on localhost:8096 with postgres, valkey, rabbitmq, minio ; usability.md notes an offline instance works apart from Unsplash covers" @@ -4566,7 +4614,7 @@ "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'Deck gates nothing and sells nothing. appinfo/info.xml says agpl' ; source read at v1.19.0: appinfo/info.xml:24 licence agpl; LICENSE; searched lib/ and src/ for 'subscription', 'enterprise', 'license key': no feature gate", - "kanboard": "corpus: kanboard/round4/open-core.md 'Kanboard is not open core. One MIT licence covers the product'", + "kanboard": "corpus: kanboard/round4/open-core.md 'Kanboard is not open core. One MIT licence covers the product' ; source read at v1.2.54: composer.json:5 license MIT, LICENSE line 1 'The MIT License (MIT)'; searched app/ (outside Locale) for 'license key', 'premium', 'enterprise' gating: none, every feature in the tree ships under the one licence", "openproject": "corpus: openproject/round4/open-core.md 'the core is GPL-3.0 ... and 32 named features are withheld behind a paid token' ; source read at v17.8.0: publiccode.yml:55 GPL-3.0-or-later core; app/models/enterprise_token.rb:56 allows_to? gates about 30 named features found in app, lib and modules, e.g. app/models/timestamp.rb:109 baseline_comparison, app/contracts/placeholder_users/create_contract.rb:34 placeholder_users, modules/resource_management/app/controllers/resource_management/base_controller.rb:43 resource_management", "jira": "corpus: jira-data-center/round4/open-core.md 'Jira Software Data Center is closed source with one edition, priced by user tier'", "plane": "corpus: plane/round4/open-core.md 'LICENSE.txt is the verbatim GNU AGPL v3' and 'this repository is the Community edition and nothing else. The paid features are not gated here. They are not here at all' (Pro, Business, Enterprise, One lists)" @@ -4595,7 +4643,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.9 'platform: admin_audit is shipped and disabled ... the Activity stream logs writes' ; code-census.md descriptionPrev before and after can be dropped (ActivityManager.php:414) ; source read at v1.19.0: lib/Activity/ActivityManager.php:53-94 every board, list, card and comment change is written to the platform activity table, which users cannot edit; :409-418 description before and after are dropped when the entry exceeds 4000 characters; searched lib/ for 'admin_audit', 'IAuditLogger': Deck feeds no audit log itself (platform)", - "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 activity stream and transitions with author and time, 13.9 'project_activities records writes only' ; no tamper protection on the table", + "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 activity stream and transitions with author and time, 13.9 'project_activities records writes only' ; no tamper protection on the table ; source read at v1.2.54: app/Controller/ActivityController.php:50 task activity and app/Controller/TaskViewController.php:133 transitions with author and time; app/Console/ProjectActivityArchiveCommand.php:14,19 'projects:archive-activities' deletes entries older than a year, app/Model/ProjectActivityModel.php:75-77 cleanup: no tamper protection or retention lock", "openproject": "corpus: openproject/round4/M1-column.md section 13 closing finding 'Setting, Role, Member, Workflow, CustomAction and EnterpriseToken changes are recorded nowhere ... What is recorded is destroys only, and it is purged after 60 days'; work package journals are thorough (10.9) ; source read at v17.8.0: app/services/journals/create_service.rb:45 journals on every work package save, but app/models/work_package.rb:398-405 comments stay editable by their author or editors; app/models/work_package.rb:182 and app/models/project.rb:176 has_paper_trail keeps destroys that app/workers/paper_trail_audits/cleanup_job.rb:33-36 purges after 60 days; settings and role changes have no trail", "jira": "corpus: jira-data-center/round4/M1-column.md 10.5 audit log with filters and CSV export, 10.9 issue History tab; corpus: jira-data-center/round4/open-core.md audit log 'limited by the retention period and the default cap of 10 million records'; 13.9 reads not recorded", "plane": "corpus: plane/round4/code-census.md §13 'IssueActivity is an issue-scoped change log, not an audit log' and 'Settings changes are not logged'; 'API-enabled Audit Logs' is a paid string" @@ -4625,7 +4673,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 12.7 'platform: user_ldap shipped and disabled ... SAML and OIDC as store apps (user_saml, user_oidc), not shipped with this image' ; source read at v1.19.0: searched lib/ and src/ for 'saml', 'oidc', 'ldap', 'sso': none; sign-in is the platform's, Deck runs behind its session, lib/Service/PermissionService.php:171 checks the logged-in user; SSO depends on store apps user_saml or user_oidc (platform)", - "kanboard": "corpus: kanboard/round4/M1-column.md 12.7 'LDAP ... and reverse-proxy header authentication in the core; grep saml|oidc|openid returns 0'", + "kanboard": "corpus: kanboard/round4/M1-column.md 12.7 'LDAP ... and reverse-proxy header authentication in the core; grep saml|oidc|openid returns 0' ; source read at v1.2.54: app/Auth/LdapAuth.php and app/Auth/ReverseProxyAuth.php in core, config.default.php:103 LDAP_AUTH, :206 REVERSE_PROXY_AUTH; app/Controller/OAuthController.php:13 only a hook for provider plugins; searched app/ for 'saml', 'oidc', 'openid': none, OAuth2 and SAML are third-party plugins", "openproject": "corpus: openproject/round4/M1-column.md 12.7 'both exist and both are Enterprise gated: modules/openid_connect/ and modules/auth_saml/ on the sso_auth_providers symbol'; free build has LDAP authentication ; source read at v17.8.0: modules/openid_connect/lib/open_project/openid_connect/engine.rb:50 and modules/auth_saml/lib/open_project/auth_saml/engine.rb:32 OIDC and SAML need the sso_auth_providers token; modules/auth_plugins/lib/open_project/plugins/auth_plugin.rb:94 same gate; config/routes.rb:716 LDAP authentication is free", "jira": "corpus: jira-data-center/round4/M1-column.md 12.7 'Atlassian provides the SSO for Atlassian Data Center app ... Bundled with the Data Center licence, no extra subscription'", "plane": "corpus: plane/round4/menu-tree.md 'Unique codes, Passwords, Google, GitHub, GitLab, Gitea' and 'No SAML, no OIDC, no LDAP'; open-core.md 'OIDC + SAML for SSO' (One) and 'LDAP support' (Enterprise). OAuth sign-in only" @@ -4655,7 +4703,7 @@ "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 6 'occ deck:export admin wrote both boards as JSON with stacks, cards, labels and ACL' ; source: src/components/navigation/BoardExportModal.vue JSON and CSV export, lib/AppInfo/Application.php:191 registerUserMigrator(DeckMigrator) ; source read at v1.19.0: src/components/navigation/BoardExportModal.vue:12-18 JSON and CSV per board; lib/Command/UserExport.php:39 occ deck:export for all of a user's boards; lib/AppInfo/Application.php:193 registers lib/UserMigration/DeckMigrator.php:71 export for the platform user migration", - "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 CSV exports of tasks, subtasks, transitions and summaries ; 11.2 'the database can be downloaded whole'", + "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 CSV exports of tasks, subtasks, transitions and summaries ; 11.2 'the database can be downloaded whole' ; source read at v1.2.54: app/Template/export/header.php:5-14 CSV exports of tasks, subtasks, transitions, daily summary; app/Template/config/about.php:72-73 'Download the database' as a gzip compressed SQLite file, app/Controller/ConfigController.php:190 downloadDb; app/Api/Procedure has read calls for every object", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/controllers/admin/backups_controller.rb and config/routes.rb:1082 'resource :backups' (database and attachments backup from the admin UI); corpus: openproject/round4/M1-column.md 10.3 CSV, PDF, XLS exports (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:661-662 admin 'Backups'; config/routes.rb:959 backups; app/controllers/admin/backups_controller.rb:64 request_backup of database and attachments; config/initializers/export_formats.rb:34-35 CSV and PDF, config/initializers/permissions.rb:163 export_projects", "jira": "corpus: jira-data-center/round4/M1-column.md 11.2 'the whole-instance XML backup or a project import'; 10.3 CSV export; corpus: jira-data-center/round4/open-core.md data pipeline 'Data will be exported in CSV format'", "plane": "corpus: plane/round4/code-census.md §13 'Data export. Per-workspace issue export to json / csv / xlsx ... There is no full-account or per-subject export'; pages export to PDF only one at a time (§4)" @@ -4685,7 +4733,7 @@ "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.3 per-board ACL and code-census.md 'remote ACL type 6' federation : an account shared on one board sees only that board, but a guest account needs the store Guests app, not shipped ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:90-94 share a single board with a user, group, team or remote account, :32 '(remote)'; lib/Federation/DeckFederationProvider.php:25-42 federated board shares; lib/Service/PermissionService.php:171-199 an account sees only boards shared with it; a guest account needs the store Guests app, searched lib/ and src/ for 'guest': only a docblock at lib/Collaboration/Resources/ResourceProvider.php:72, no guest flow", - "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer): bob read the task (200) and was refused on updateTask' ; carol with no membership 403 ; journeys.md 6 public read-only board", + "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer): bob read the task (200) and was refused on updateTask' ; carol with no membership 403 ; journeys.md 6 public read-only board ; source read at v1.2.54: app/Template/user_list/listing.php:8 'Invite people', app/Controller/UserInviteController.php:27 save; app/Core/Security/Role.php:20,48 'Project Viewer' role; app/Template/project_permission/users.php:36-54 add that user to one project; app/Middleware/ProjectAuthorizationMiddleware.php:47-50 refuses all other projects", "openproject": "corpus: openproject/round4/M1-column.md 13.1 membership per project with a role; the free build has no user seat limit (corpus: openproject/round4/open-core.md gates are features, not seats); per-work-package sharing is Enterprise gated (3.19) ; source read at v17.8.0: config/initializers/permissions.rb:218 invite_members_by_email lets a project admin invite an outside person as a member of that one project; app/models/member.rb:40 membership is per project with a role; app/models/work_package.rb:87 visibility follows membership; per work package sharing is gated, app/models/sharing_strategies/work_package_strategy.rb:109", "jira": "corpus: jira-data-center/round4/M1-column.md 3.19 'a partner needs an account and a licence' and is 'scoped per project by a role'; every guest takes a licensed seat", "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when false a guest sees only items they own or are assigned'; a guest must be a workspace member with a login and is then added per project. Whether a workspace guest sees public-to-workspace projects was not driven" From 6e56a5300bd354b84668aed610ac0541906ad7e9 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:36:07 +0200 Subject: [PATCH 07/13] feat(parity): Plane source read at v1.4.2 across all 148 rows, sources recorded, three drive contradictions re-rated --- openspec/parity/capabilities.json | 479 ++++++++++++++++-------------- 1 file changed, 262 insertions(+), 217 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 901be352..2dd33294 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -127,7 +127,52 @@ "vendor": "Plane Software", "readOn": "2026-09-12", "columnAddedOn": "2026-09-26", - "evidenceGrade": "driven" + "evidenceGrade": "driven", + "sources": { + "docs": "https://docs.plane.so/", + "sourceRepo": { + "url": "https://github.com/makeplane/plane", + "tag": "v1.4.2", + "commit": "5f7d92784c403f76284f0f16718f320221dc7fec" + }, + "featurePage": "https://plane.so/", + "featureRequests": "https://github.com/makeplane/plane/issues?q=is%3Aissue+is%3Aopen+label%3A%22%E2%9C%A8feature%22+sort%3Areactions-%2B1-desc", + "issueTracker": { + "url": "https://github.com/makeplane/plane/issues", + "featureLabel": "✨feature" + }, + "roadmap": null, + "changelog": "https://plane.so/changelog", + "apiReference": "https://developers.plane.so/api-reference/introduction", + "marketplace": "https://plane.so/marketplace", + "pricing": "https://plane.so/pricing", + "accessibilityStatement": null, + "securityDocs": "https://plane.so/security", + "demoInstance": null, + "community": "https://forum.plane.so/", + "reviews": null, + "videos": "https://www.youtube.com/@planepowers", + "caseStudies": "https://plane.so/customers", + "partnerDirectory": "https://plane.so/partners", + "trainingCurriculum": null, + "jobPostings": "https://plane.so/careers", + "tenders": null, + "nullReasons": { + "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 could be confirmed; plane.so links no review site", + "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 names Plane" + } + }, + "sourceRead": { + "tag": "v1.4.2", + "commit": "5f7d92784c403f76284f0f16718f320221dc7fec", + "readOn": "2026-09-26" + }, + "readHow": "Driven at v1.4.2 in round 4 (2026-09-12); source read at the same tag v1.4.2 on 2026-09-26 across all rows: source read at v1.4.2, driven at v1.4.2, so the grade stays driven. The round-4 code census was read at 2f895b8, not at the driven tag, so every cite was re-derived in the tag tree. Plane carries stubs that always return disabled (filter exclusion hardcoded off, a bulk-operation route the API does not define, a bulk-delete modal nothing opens, milestones as an orphan string); none of them is credited.", + "unknownReason": "Graded driven at the round-4 drive of 2026-09-12 on v1.4.2, and every row read from source at the same tag on 2026-09-26. Three ratings moved where the code contradicts the drive (tsk-checklist, int-mobile, plt-guest-access)." }, { "key": "kanboard", @@ -310,7 +355,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add board' ; source: lib/Db/Board.php:33-51 a board has title, owner, colour, settings; no short key and no description field ; source read at v1.19.0: lib/Db/Board.php:34-53 a board has title, owner, teamId, colour, archived, settings and no key or description; src/components/navigation/AppNavigationAddBoard.vue:19 'Board name' is the only input; lib/Service/BoardService.php:188 create(title, userId, color); searched lib/Db/Board.php for 'description', 'key', 'identifier': none", "kanboard": "corpus: kanboard/round4/journeys.md 1 'createProject Vergunningen with identifier VERG' ; source: app/Model/ProjectModel.php:129 getByIdentifier, project description on the Edit project form ; source read at v1.2.54: app/Template/project_creation/create.php:13-15 'Identifier' field on the new project form; app/Template/project_edit/show.php:27-28 'Description' editor; app/Controller/ProjectCreationController.php:56 save; app/Model/ProjectModel.php:123 getByIdentifier", "openproject": "corpus: openproject/round4/menu-tree.md 'Projects' global module and 'Project settings > Information'; corpus: openproject/round4/M1-column.md 11.23 project attributes; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md (name, identifier, description) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/new_component.html.erb:32 project create form; app/forms/projects/settings/editable_identifier_form.rb:36 'identifier' field (the short key); app/forms/projects/settings/description_form.rb:35 description field; app/controllers/projects_controller.rb:113 create; app/contracts/projects/base_contract.rb:36-38 name, identifier, description attributes", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'you must provide: a name ... a key ... and designate a project lead', description added after creation; corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'you must provide: a name ... a key ... and designate a project lead', description added after creation; corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'When creating a project, yo need to give it a name, a key, and add a project lead'; the description is set under project details after creation (read 2026-09-26)", "plane": "corpus: plane/round4/journeys.md 'Create a workspace, create a project, create a work item' ; code-census.md §2 'project.py:76 identifier = models.CharField(max_length=12)', unique per workspace via ProjectIdentifier ; source: apps/web/core/components/project/card.tsx:285 renders project.description ; source read at v1.4.2: apps/web/core/components/project/create/common-attributes.tsx:89 identifier field (derived from name, max 10) and :132 description field in the create modal; apps/api/plane/app/views/project/base.py:257-258 create; apps/api/plane/db/models/project.py:70-76 name, description, identifier CharField(max_length=12)" }, "built": { @@ -343,7 +388,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings ... group limit for board creation (admin)' ; source: lib/Service/PermissionService.php:345-363 canCreate reads groupLimit ; source read at v1.19.0: src/components/DeckAppSettings.vue:26-37 admin section 'Limit board creation to some groups' (multi-select of groups); lib/Service/ConfigService.php:209 stores groupLimit; lib/Service/PermissionService.php:368-383 canCreate allows only members of the listed groups", "kanboard": "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch ; source read at v1.2.54: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Template/config/project.php:21 'Disable personal projects' admin setting; app/Controller/ProjectCreationController.php:145 refuses personal projects when disabled; restriction is by application role, not by chosen group", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions') ; source read at v17.8.0: config/initializers/permissions.rb:34-39 add_project is a global permission; app/contracts/projects/create_contract.rb:67 create checks user.allowed_globally?(:add_project); app/models/global_role.rb:31 global roles; app/controllers/groups_controller.rb:184 a group has a 'global_roles' tab, so a chosen group can hold the right", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Creating and configuring a project is done by an administrator'; restricted to admins, but no documented grant to a chosen non-admin group", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Creating and configuring a project is done by an administrator'; restricted to admins, but no documented grant to a chosen non-admin group ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Note that creating and configuring a project is done by an administrator'; https://confluence.atlassian.com/adminjiraserver/managing-global-permissions-938847142.html names no separate create-project permission, so a chosen group needs the full Jira administrators permission (read 2026-09-26)", "plane": "source: apps/api/plane/app/views/project/base.py:257 create is @allow_permission([ROLE.ADMIN, ROLE.MEMBER], level=\"WORKSPACE\"), so guests are excluded, but there is no setting to restrict creation to admins or chosen groups (corpus: plane/round4/code-census.md §5 three fixed roles 20/15/5, no groups) ; source read at v1.4.2: apps/api/plane/app/views/project/base.py:257 create allowed for workspace ROLE.ADMIN and ROLE.MEMBER only, so guests cannot create; searched apps/api/plane for 'can_create_project', 'restrict.?project', 'project_creation': none, so no admin or group restriction setting" }, "built": { @@ -373,7 +418,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'sharing with users, groups, teams and remote users, each with edit, share and manage' ; journeys.md 1 ACL for jdevries ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:7 NcSelectUsers picker to add a user, group, team or remote user, :64 'Delete' removes the share; lib/Service/BoardService.php:419 addAcl and :541 deleteAcl, routes appinfo/routes.php:28-30", "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer)' ; menu-tree.md 'Permissions' ; source read at v1.2.54: app/Template/project_permission/users.php:36-54 add user form with a user autocomplete and role select, :26 'Remove'; app/Controller/ProjectPermissionController.php:67 addUser, :94 removeUser", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Members'; corpus: openproject/round4/M1-column.md 11.19 'memberships in app/models/member.rb' ; source read at v17.8.0: config/initializers/permissions.rb:208-216 manage_members covers members index, create, destroy and autocomplete_for_member; app/controllers/members_controller.rb:42 create, :87 destroy_by_principal", - "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' (Managing project roles, 2022-10-07); corpus: jira-data-center/round4/M1-column.md 13.4 Managing project role membership", + "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' (Managing project roles, 2022-10-07); corpus: jira-data-center/round4/M1-column.md 13.4 Managing project role membership ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-role-membership-938847171.html 'Select Add users to a role ... Search for the user or group you wish to add, and select the project role' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'Settings: General, Members, ...' ; code-census.md §5 'ProjectMember.role', ProjectMemberInvite (project.py:192) ; source read at v1.4.2: apps/web/core/components/project/member-list.tsx:78,110 'add_member' opens the invite modal, which lists workspace members not yet in the project, apps/web/core/components/project/send-project-invitation-modal.tsx:74; apps/api/plane/app/views/project/member.py:46-47 create and :290-291 destroy (admin only); apps/web/core/components/project/member-list-item.tsx:36 removeMemberFromProject" }, "built": { @@ -404,7 +449,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'Acl: participant of type user, group, remote or team, with edit, share, manage' lib/Db/Acl.php:27-35 ; journeys.md 5 edit-only collaborator refused 403 on ACL change ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:39-58 per share 'Can edit', 'Can share', 'Can manage', 'Owner' (transfer); lib/Db/Acl.php:31-34 PERMISSION_READ, EDIT, SHARE, MANAGE; lib/Service/PermissionService.php:131-132 owner or ACL grants manage and share", "kanboard": "corpus: kanboard/round4/usability.md 'three project roles and custom ones with column restrictions' ; journeys.md 5 custom role Toetser ; source read at v1.2.54: app/Core/Security/Role.php:18-20 project-manager, project-member, project-viewer; app/ServiceProvider/AuthenticationProvider.php:76-78 role hierarchy; app/Template/project_role/show.php:5 'Add a new custom role' with :21-27 project, drag and drop and column restrictions; app/Controller/ProjectRoleController.php:50 save", "openproject": "corpus: openproject/round4/M1-column.md 13.1 'app/models/role.rb:31 with nine subtypes ... Permissions are rows ... against a catalogue declared in code'; corpus: openproject/round4/M1-column.md 13.16 roles and permissions matrix ; source read at v17.8.0: app/models/role.rb:31-41 Role with builtin kinds; config/routes.rb:709 admin roles resources; config/initializers/permissions.rb:208 permissions are declared per role in code; app/controllers/members_controller.rb:71 update a member's roles", - "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 global permissions and project roles; corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission ... Assignable user Permission' (Managing project permissions)", + "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 global permissions and project roles; corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission ... Assignable user Permission' (Managing project permissions) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-roles-938847166.html 'Project roles are a flexible way to associate users and/or groups with particular projects'; roles are used in 'permission schemes' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §5 'ROLE_CHOICES = ((20, \"Admin\"), (15, \"Member\"), (5, \"Guest\"))' project.py:21 ; three fixed roles, no custom role ; source read at v1.4.2: apps/api/plane/db/models/project.py:21 ROLE_CHOICES Admin 20, Member 15, Guest 5 and :219 ProjectMember.role; apps/web/core/components/project/settings/member-columns.tsx:101 updateMemberRole role dropdown; apps/api/plane/app/views/project/member.py:206 partial_update checks workspace role (:210-214). Three fixed roles, no custom role" }, "built": { @@ -434,7 +479,7 @@ "nextcloud-deck": "source: appinfo/routes.php:26 board#leave, lib/Service/BoardService.php:515 leave() ('Board owner cannot leave board'), src/components/navigation/AppNavigationBoard.vue:157 'Leave board' menu entry ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:151-157 'Leave board' action; appinfo/routes.php:26 board#leave; lib/Service/BoardService.php:569-571 leave() refuses only the owner ('Board owner cannot leave board')", "kanboard": "source: grep -rniE 'leave' app/Controller returns 0 hits; membership is removed by a project manager under Permissions (corpus: kanboard/round4/menu-tree.md 'Permissions') ; source read at v1.2.54: searched app/Controller and app/Template for 'leave': none; membership removal is app/Controller/ProjectPermissionController.php:94 removeUser, gated to Role::PROJECT_MANAGER at app/ServiceProvider/AuthenticationProvider.php:100", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'leave_project' finds only app/components/header/projects/node_component.html.erb:37, an 'x-circle' button that links to home_path (navigates away from the current project); removing a member needs manage_members; corpus: openproject/round4/M1-column.md 11.19 memberships administered, no self-removal found ; source read at v17.8.0: config/locales/en.yml:2890 'Leave project' is only app/components/header/projects/node_component.html.erb:33-37, an x-circle linking to home_path (navigates away); app/contracts/members/delete_from_project_contract.rb:32 removing any member needs manage_members; searched app/contracts/members for a self-removal exception: none", - "jira": "corpus: jira-data-center/round4/M1-column.md 13.4 'project roles have specific members for each project' edited on the Managing project role membership page by a project or Jira admin; no self-leave documented", + "jira": "corpus: jira-data-center/round4/M1-column.md 13.4 'project roles have specific members for each project' edited on the Managing project role membership page by a project or Jira admin; no self-leave documented ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-role-membership-938847171.html 'For all of the following procedures, you must be logged in to Jira as a project administrator'; no self-removal is described for a member (read 2026-09-26)", "plane": "source: apps/api/plane/app/urls/project.py:88-89 'projects//members/leave/' ProjectMemberViewSet leave ; corpus silent on leaving ; source read at v1.4.2: apps/web/core/components/project/leave-project-modal.tsx:42,63 leaveProject; apps/api/plane/app/urls/project.py:88-89 members/leave/ route to ProjectMemberViewSet.leave; apps/api/plane/app/views/project/member.py:323-324 leave open to admin, member and guest" }, "built": { @@ -464,7 +509,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards ...)' ; source: lib/Controller/BoardController.php:54 update(..., bool archived) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:62-68 'Archive board' and :54-60 'Unarchive board' actions calling archiveBoard/unarchiveBoard (:364-370); lib/Controller/BoardController.php:54 update(id, title, color, archived)", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu ; source read at v1.2.54: app/Template/project/sidebar.php:59 'Close this project', :62 'Open this project'; app/Controller/ProjectStatusController.php:28 enable, :57 disable; app/Model/ProjectModel.php:539 enable, :555 disable; app/Template/project_list/project_icons.php:20 closed marker", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:141-148 'Archive' item needs archive_project; :153-161 'Unarchive' item (admin only); app/controllers/projects/archive_controller.rb:38-43 create archives, destroy unarchives; config/routes.rb:447", - "jira": "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only", + "jira": "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/archiving-a-project-938847621.html 'You can archive any project, and restore it later, if needed'; needs 'the Jira Administrator or Jira System Administrator global permission' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md workspace 'Archives' ; source: apps/api/plane/db/models/project.py:114 archived_at, apps/api/plane/app/urls/project.py:123-125 ProjectArchiveUnarchiveEndpoint (archive and unarchive) ; source read at v1.4.2: apps/web/core/components/project/archive-restore-modal.tsx:32,44,67 archiveProject and restoreProject; apps/api/plane/app/urls/project.py:123-125 archive route; apps/api/plane/app/views/project/base.py:427-437 ProjectArchiveUnarchiveEndpoint post and delete; apps/api/plane/db/models/project.py:114 archived_at" }, "built": { @@ -497,7 +542,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'deletedAt on cards, stacks, boards and attachments; trashRetentionHours' ; journeys.md 6 trash purge ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:144-148 'Delete board' with an undo (:8-15); lib/Service/BoardService.php:288-296 delete() sets deletedAt (manage permission), :318 deleteUndo; lib/Cron/DeleteCron.php:63-69 purges after the trash retention; lib/Db/BoardMapper.php:519-531 deleting a board deletes its ACL, stacks and their cards", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Remove' under Configure this project ; source read at v1.2.54: app/Template/project/sidebar.php:67 'Remove' under the project menu; app/Controller/ProjectStatusController.php:87 remove; app/Model/ProjectModel.php:499-517 removes project and task files then the project; app/Schema/Sqlite.php:1556 tasks FOREIGN KEY(project_id) ON DELETE CASCADE", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Copy project, Delete project' ; source read at v17.8.0: app/components/projects/row_actions_component.rb:202-211 'Delete' row action (admin only) opens confirm_destroy; app/controllers/projects_controller.rb:153-165 destroy schedules deletion; app/services/projects/delete_service.rb:54-58 before_perform deletes members, work packages and storages, and descendants (:39)", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy'", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Select Delete project in the Project settings menu'; 'Once the project's been deleted, it can only be recovered by reinstating a backup or an XML copy' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 soft delete via deleted_at, hard delete nightly by bgtasks/deletion_task.hard_delete ; source: apps/api/plane/bgtasks/deletion_task.py:18 soft_delete_related_objects cascades to the project's rows ; source read at v1.4.2: apps/web/core/components/project/delete-project-modal.tsx:33,61 deleteProject; apps/api/plane/app/views/project/base.py:382-399 destroy, workspace or project admin only; apps/api/plane/db/mixins.py:72-78 soft delete queues soft_delete_related_objects, apps/api/plane/bgtasks/deletion_task.py:18 cascades to the project's rows" }, "built": { @@ -527,7 +572,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards and Shared under each)' ; source: src/components/navigation/AppNavigation.vue:28 route /board/archived ; source read at v1.19.0: src/components/navigation/AppNavigation.vue:19 'All boards', :28-31 'Archived boards' (/board/archived), :37-40 'Shared with you'; src/router.js:63-72 boards.archived and boards.shared routes; lib/Controller/BoardController.php:54 archived flag on the board", "kanboard": "source: app/Filter/ProjectStatusFilter.php status filter on the project list, app/Template/project_list/sort_menu.php:11 sort by Status ; corpus: kanboard/round4/menu-tree.md 'Projects management' ; 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; app/Template/project_list/sort_menu.php:11 sort by 'Status' (is_active); app/Filter/ProjectStatusFilter.php:14 exists but grep of app/ for 'ProjectStatusFilter' finds no caller, so no page filters projects by status", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:117-135 filters 'Active projects', 'Archived projects', 'Project status - On track / Off track / At risk' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/menus/projects/menu.rb:87 'Archived projects' static list for admins; app/models/project_queries/static.rb:101-102 archived list filters active = false; app/models/queries/projects/filters/active_filter.rb:31 active filter; app/models/queries/projects/filters/project_status_filter.rb:35 status filter over app/models/project.rb:218-225 on_track, at_risk, off_track, not_started, finished, discontinued", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'A Jira project can only belong to one category'; 'An archived project will no longer appear in Jira' (archived projects page); no project status field to filter on", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'A Jira project can only belong to one category'; 'An archived project will no longer appear in Jira' (archived projects page); no project status field to filter on ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/archiving-a-project-938847621.html archived projects 'won't be visible anywhere besides the Archived projects page'; https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html projects sort by category and 'A Jira project can only belong to one category', no status filter on the list (read 2026-09-26)", "plane": "source: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects' ; corpus: plane/round4/menu-tree.md 'Archives' ; source read at v1.4.2: packages/constants/src/project.ts:96-101 project list scopes 'my_projects' and 'archived_projects'; apps/web/core/components/project/root.tsx:44-78 archives path sets the archived_projects display filter; apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/archives/page.tsx route; apps/api/plane/db/models/project.py:114 archived_at" }, "built": { @@ -557,7 +602,7 @@ "nextcloud-deck": "source: lib/Service/BoardService.php:188-217 create() inserts default labels only and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board alone ; corpus: nextcloud-deck/round4/journeys.md 1 four lists added by hand ; source read at v1.19.0: lib/Service/BoardService.php:188-217 create() inserts four default labels ('Finished', 'To review', 'Action needed', 'Later') and no stacks; lib/Service/DefaultBoardService.php stacks are for the welcome board only; searched BoardService create for 'Stack', 'stackMapper->insert': none", "kanboard": "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings' ; source read at v1.2.54: app/Template/config/project.php:11-12 'Default columns for new projects (Comma-separated)'; app/Model/BoardModel.php:23 default Backlog, Ready, Work in progress, Done; :34 reads board_columns when a project is created", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'In an Action board each list represents a value of an attribute ... the Status board includes a list for the status New and a list for the status In Progress' (columns generated from statuses); Boards free (corpus: openproject/round4/menu-tree.md global 'Boards', not EE) (cited source paths checked present at the released v17.8.0 tag.) ; 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 basic, status, assignee, version, subproject, subtasks; modules/boards/app/services/boards/status_board_create_service.rb:11-17 a new Status board gets one list, Status.default; app/services/projects/copy/boards_dependent_service.rb:32-38 only a template or copy carries a prepared board set; a new blank project has no board", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types')", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'If your board's project is using the Jira default workflow: Default column ... To Do Open, Reopened In Progress In Progress Done Resolved, Closed' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'DEFAULT_STATES at state.py:24-62 seeds five plus triage'; states are the board columns ; source read at v1.4.2: apps/api/plane/db/models/state.py:24 DEFAULT_STATES list; apps/api/plane/app/views/project/base.py:293 project create bulk-creates a State per entry of DEFAULT_STATES, so every new project starts with the seeded columns" }, "built": { @@ -591,7 +636,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' in Db/ return 0 ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'billing', 'hourly', 'fixed price': none; lib/Db/Board.php:34-53 holds no commercial field", "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal' 26 hits 'none is a payment', 'currencies is a rate table for the task score' ; no budget or billing field on a project ; source read at v1.2.54: searched app/ (outside Locale) for 'budget', 'hourly', 'billing', 'fixed price': none; app/Schema/Sqlite.php:1526-1530 projects table and later ALTERs add no money field", "openproject": "corpus: openproject/round4/menu-tree.md project 'Budgets'; docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:11 'create and manage a project budget ... planned unit costs as well as labor costs'; no fixed-price or hourly billing term field (project attributes could hold it, corpus: openproject/round4/M1-column.md 11.23) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31 budgets resources; modules/budgets/app/models/budget.rb:59 subject, fixed_date required; :108 budget = base_amount + material + labor; :138 base_amount; searched app and modules for 'fixed_price', 'fixed.price', 'billing_type': none, so no delivery or billing term field", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'the integrations page lists test management, source control and collaboration tools and nothing financial'; no budget or billing term on a project; only a custom field on issues (corpus: jira-data-center/round4/M1-column.md 2.2)", + "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'the integrations page lists test management, source control and collaboration tools and nothing financial'; no budget or billing term on a project; only a custom field on issues (corpus: jira-data-center/round4/M1-column.md 2.2) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'About the project details' lists the key, the project lead and application access, no budget, fixed price or billing term; financial terms are not a project field in the docs read (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 fixed field list and 'no custom fields on any object'; no budget or billing field on Project (project.py:68-117); 'no Time tracking' (menu-tree.md) ; source read at v1.4.2: apps/api/plane/db/models/project.py:68-117 Project fields; searched project.py for 'budget', 'billing', 'fixed_price', 'hourly': none" }, "built": { @@ -624,7 +669,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' (nearest: remote ACL type 6, code-census.md federation row) ; source read at v1.19.0: the only non-account readers are federated users: lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE and lib/Controller/BoardOcsController.php:37-38 PublicPage read serves a federation token, not a portal; searched src/router.js for 'public', 'portal', 'share/': none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'There is no customer or citizen interface' (nearest: a project-viewer account or the public read-only board) ; source read at v1.2.54: searched app/Template and app/Controller for 'portal', 'contractor', 'customer', 'client': only mail and password reset hits; nearest is a project-viewer account, app/Core/Security/Role.php:20, or the public board, app/ServiceProvider/AuthenticationProvider.php:153 BoardViewController readonly", "openproject": "corpus: openproject/round4/M1-column.md 6.7 'there is no citizen portal'; nearest is per-item sharing, Enterprise gated (corpus: openproject/round4/M1-column.md 3.19 work_package_sharing) ; source read at v17.8.0: searched app, modules/*/app and config/locales/en.yml for 'portal': only a UI modal portal element, app/views/layouts/base.html.erb:63; nearest is per work package sharing, app/models/sharing_strategies/work_package_strategy.rb:109 gated on :work_package_sharing", - "jira": "corpus: jira-data-center/round4/M1-column.md 6.7 'The customer portal is JSM DC, a separate licence'; 3.19 'a partner needs an account and a licence'", + "jira": "corpus: jira-data-center/round4/M1-column.md 6.7 'The customer portal is JSM DC, a separate licence'; 3.19 'a partner needs an account and a licence' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/licensing-and-application-access-938846887.html 'If a user has access to an application, they will count as a licensed user'; the customer portal belongs to Jira Service Management, a separate application (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when guest_view_all_features is false a guest sees only items they own or are assigned'; an outsider needs a Plane login in the main app, there is no separate portal ; source read at v1.4.2: apps/api/plane/db/models/project.py:21 Guest role 5 and :100 guest_view_all_features default False; apps/web/core/components/project/project-settings-member-defaults.tsx:126,191 toggle for what guests see. A contractor is a guest user in the main app; no separate portal route under apps/web/app" }, "built": { @@ -654,7 +699,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'template beyond the import config schema' ; nearest is Clone board (prj-copy) ; source read at v1.19.0: searched lib/ and src/ for 'template' as a board feature: only psalm @template tags and lib/Provider/DeckProvider.php:94 SearchTemplate; nearest is clone board clone at appinfo/routes.php:31 and import at appinfo/routes.php:34", "kanboard": "source: app/Template/project_creation/create.php:23 'Create from another project' with components chosen, app/Model/ProjectDuplicationModel.php:43-55 swimlanes, board columns, categories, roles, actions, tags, filters, tasks ; corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source read at v1.2.54: app/Template/project_creation/create.php:23-40 'Create from another project' with Categories, Tags, Actions, Custom filters, Tasks checkboxes; app/Model/ProjectDuplicationModel.php:43-57 swimlanes and board columns always copied, :102-118 loop", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project templates'; corpus: openproject/round4/M1-column.md 3.10 'applying a project template (app/models/project.rb:110)'; docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-templates (copies work packages, boards, wiki, members); no labels object exists (categories copy) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/template_select_component.html.erb:39 template picker on new project; app/controllers/projects_controller.rb:106-115 new/create from template; app/controllers/projects/templated_controller.rb:35-41 mark a project as template; app/services/projects/copy/boards_dependent_service.rb:32, app/services/projects/copy/work_packages_dependent_service.rb:32 and the categories dependent service copy boards, categories, work packages", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes' (schemes only, no tasks or labels copied)", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes' (schemes only, no tasks or labels copied) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'Jira comes with several default project types with preconfigured workflows and issue types'; https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html a template creates 'its own set of schemes', no tasks or labels are copied (read 2026-09-26)", "plane": "corpus: plane/round4/open-core.md 'Project Templates' listed under Business ; code-census.md §1 'Templates: absent from the backend', create-project-modal.tsx:29 templateId threaded to a no-op provider. Paid tier only, absent from Community ; source read at v1.4.2: apps/web/core/components/project/create-project-modal.tsx:29,78 templateId prop passed down, apps/web/core/components/projects/create/root.tsx:33 declares it and never reads it; searched apps/api/plane/db/models/__init__.py for 'template': none, no template model" }, "built": { @@ -683,7 +728,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.9 'card#clone and board#clone (appinfo/routes.php:31)' ; source: src/components/navigation/BoardCloneModal.vue options with cards, assignments, labels, due dates ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:52 'Clone board' opens src/components/navigation/BoardCloneModal.vue:9-32 'Clone cards', 'Clone assignments', 'Clone labels', 'Clone due dates', 'Move all cards to the first list'; lib/Service/BoardService.php:607 clone() and :767 cloneCards; appinfo/routes.php:31 board#clone", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Duplicate' ; source: app/Model/ProjectDuplicationModel.php:90 duplicate() ; source read at v1.2.54: app/Template/project/sidebar.php:52 'Duplicate'; app/Template/project_view/duplicate.php:26 Duplicate button; app/Controller/ProjectViewController.php:150 doDuplication; app/Model/ProjectDuplicationModel.php:90 duplicate", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings > Copy project'; corpus: openproject/round4/M1-column.md 2.9 copy service carries watchers, attachments ; source read at v17.8.0: app/components/projects/row_actions_component.rb:165-166 'Copy' row action needs copy_projects; config/initializers/permissions.rb:261-263 copy_projects permission; app/controllers/projects_controller.rb:131-140 copy enqueues Projects::EnqueueCopyService with chosen dependencies; app/services/projects/copy/work_packages_dependent_service.rb:118-127 relations are copied too", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Create with shared configuration ... use that project's schemes' is the only reuse; corpus: jira-data-center/round4/M1-column.md 11.2 issues move only with the whole-instance XML backup or a project import", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Create with shared configuration ... use that project's schemes' is the only reuse; corpus: jira-data-center/round4/M1-column.md 11.2 issues move only with the whole-instance XML backup or a project import ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'You can select Create with shared configuration to select an existing project and to use that project's schemes'; schemes are shared, issues and boards are not copied (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md has no copy action ; source: grep -niE 'duplicate|clone|copy' apps/api/plane/app/urls/project.py returns only the licence header line ; source read at v1.4.2: searched apps/api/plane/app/urls/project.py for 'duplicate', 'clone', 'copy': only the licence header at line 1; apps/web/core/components/project/card.tsx:115 the card's only copy action is handleCopyText, a link copy, not a project copy" }, "built": { @@ -712,7 +757,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'typed fields ... there is no schema' ; source: lib/Db/Board.php fields ; source read at v1.19.0: lib/Db/Board.php:34-53 fixed columns only; searched lib/ and src/ for 'custom field', 'customField', 'custom_field': none", "kanboard": "corpus: kanboard/round4/code-census.md 'metadata without a screen: project_has_metadata' ; open-core.md 'MetaMagik for typed custom fields' is a third-party plugin ; source read at v1.2.54: app/Api/Procedure/ProjectMetaDataProcedure.php:15 key-value project metadata over the API only; app/Controller/ProjectViewController.php:79 the only screen passes metadata to plugin integration forms, app/Template/project_view/integrations.php:12 'There is no integration registered'; typed custom fields are the third-party MetaMagik plugin", "openproject": "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields' ; source read at v17.8.0: config/routes.rb:789 admin project_custom_fields resources; config/initializers/menus.rb:777 project settings 'Project attributes'; app/models/project_custom_field.rb:58-66 visibility with admin_only fields; config/locales/en.yml:3575 'Project attributes'", - "jira": "corpus: jira-data-center/round4/M1-column.md 11.23 projects have categories only; custom field contexts are 'a combination of projects and issue types where that field can be used' (2.2): fields live on issues, not projects", + "jira": "corpus: jira-data-center/round4/M1-column.md 11.23 projects have categories only; custom field contexts are 'a combination of projects and issue types where that field can be used' (2.2): fields live on issues, not projects ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-custom-field-contexts-1047552717.html 'A context of a custom field is a combination of projects and issue types where that field can be used': custom fields sit on issues, not on the project record (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'the community edition has no custom fields on any object'; menu-tree.md 'no Custom fields or properties anywhere' ; source read at v1.4.2: searched apps/api/plane --include=*.py outside migrations for 'custom_field', 'CustomField', 'customproperty': only docstring examples at apps/api/plane/utils/filters/converters.py:78 and apps/api/plane/utils/filters/filter_backend.py:223, no model or endpoint" }, "built": { @@ -741,7 +786,7 @@ "nextcloud-deck": "source: lib/Db/Board.php has no parent field ; corpus: nextcloud-deck/round4/menu-tree.md a flat list of boards ; source read at v1.19.0: lib/Db/Board.php:34-53 no parent field; searched lib/Db and src/ for 'parentId', 'parent_id', 'subboard': only a comment reply parentId in src/services/CommentApi.js:27", "kanboard": "source: grep -niE 'parent' app/Model/ProjectModel.php returns 0 hits; corpus: kanboard/round4/menu-tree.md flat project list ; source read at v1.2.54: searched app/Model/ProjectModel.php and app/Schema/Sqlite.php for 'parent' on projects: none; app/Schema/Sqlite.php:1526-1530 projects table has no parent column", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:64-65 'New subproject' needs add_subprojects; app/contracts/projects/base_contract.rb:45-46 parent attribute validated as assignable; app/contracts/projects/create_contract.rb:43-44 portfolio and program workspaces need the :portfolio_management Enterprise token, plain subprojects do not", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy'; corpus: jira-data-center/round4/M1-column.md 11.21 Advanced Roadmaps hierarchy 'Standard issue types are placed above the epic level (commonly Initiative ...)' groups issues, not projects", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy'; corpus: jira-data-center/round4/M1-column.md 11.21 Advanced Roadmaps hierarchy 'Standard issue types are placed above the epic level (commonly Initiative ...)' groups issues, not projects ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'a project category is not part of a project hierarchy. Also, Jira does not support sub-projects or parent projects'; https://confluence.atlassian.com/jirasoftwareserver/configure-your-jira-software-instance-for-advanced-roadmaps-1044784156.html 'Configure custom hierarchy levels' above epics, issue level only (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 Project model lists no parent; 'teamspace' grep 0 hits (Teamspaces are Pro) ; source: grep -n parent apps/api/plane/db/models/project.py shows no parent project FK ; source read at v1.4.2: searched apps/api/plane/db/models/project.py for 'parent': none, Project has no parent FK (fields at apps/api/plane/db/models/project.py:68-117); searched apps/api/plane --include=*.py for 'teamspace': none" }, "built": { @@ -770,7 +815,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Open details for the board's sidebar with sharing, tags, deleted items and the activity stream' ; no description or progress on a board (lib/Db/Board.php) ; source read at v1.19.0: src/components/board/BoardSidebar.vue:11-42 the board details sidebar has tabs 'Sharing' (members), 'Tags', 'Deleted items', 'Activity' and no description or progress; lib/Db/Board.php:34-53 no description field; src/router.js:94 /board/:id/details", "kanboard": "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity ; source read at v1.2.54: app/Template/project_overview/show.php:3-8 column task counts, description, activity; app/Template/project_overview/information.php:10-15 members by role, :22-26 start and end date; app/Controller/ProjectOverviewController.php:16 show", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews ; source read at v17.8.0: modules/overviews/config/routes.rb:6-7 project overview at the project root; modules/overviews/lib/overviews/grid_registration.rb:16 'project_description', :26 'project_status', :46 'members' default widgets; modules/overviews/app/components/overviews/overview_grid_component.rb renders them", - "jira": "docs: project 'Summary' / project page is not in the corpus; corpus: jira-data-center/round4/M1-column.md 10.2 dashboards with gadgets can be built per project ('multiple dashboards for different projects'); no built-in overview with members and progress documented", + "jira": "docs: project 'Summary' / project page is not in the corpus; corpus: jira-data-center/round4/M1-column.md 10.2 dashboards with gadgets can be built per project ('multiple dashboards for different projects'); no built-in overview with members and progress documented ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html 'You can create multiple dashboards for different projects ... Each project has a default dashboard'; https://confluence.atlassian.com/adminjiraserver/configuring-issue-level-security-938847117.html 'The Project summary page is displayed' is an admin settings page, no member and progress overview (read 2026-09-26)", "plane": "source: no overview route under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ (archives, cycles, intake, issues, modules, pages, views only); the project card shows description and member count (apps/web/core/components/project/card.tsx:285-292). Project updates are a paid string never emitted (corpus: plane/round4/code-census.md opening section, is_project_updates_enabled 0 hits) ; source read at v1.4.2: project detail routes under apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/ are archives, cycles, intake, issues, modules, pages, views only, no overview; apps/web/core/components/project/card.tsx:275-285 the project card shows description and member count" }, "built": { @@ -800,7 +845,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/promoted row 11.26 in _round4/compare/promoted-rows-batch6.md 'no knowledge base; the platform's Collectives is a store app' ; source read at v1.19.0: searched lib/ and src/ for 'wiki', 'collectives', 'page': no knowledge pages; nearest is file attachments on a card and the related resources panel in src/components/board/SharingTabSidebar.vue:82 NcRelatedResourcesPanel", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 11.26 'grep knowledge|faq|wiki returns 0. The nearest thing is a project file' ; source read at v1.2.54: searched app/ (outside Locale) for 'wiki', 'knowledge': none; nearest are project attachments, app/Template/project_overview/attachments.php:6 'Upload a file'", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Wiki'; corpus: openproject/round4/M1-column.md 9.1 wiki pages searchable (wiki_page.rb:52) ; source read at v17.8.0: lib/redmine/menu_manager/wiki_menu_helper.rb:30-34 builds the project Wiki menu when the module is on; config/routes.rb:496-500 project wiki resources with new page; app/models/wiki_page.rb:31, :52 wiki pages are searchable", - "jira": "corpus: jira-data-center/round4/M1-column.md 1.9 'Integrating with Confluence Give your team the ability to share, discuss and work with Jira application issues in Confluence': wiki is a separate product (Confluence)", + "jira": "corpus: jira-data-center/round4/M1-column.md 1.9 'Integrating with Confluence Give your team the ability to share, discuss and work with Jira application issues in Confluence': wiki is a separate product (Confluence) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Confluence is a content creation and collaboration platform': pages live in Confluence, a separate product and licence, not in Jira (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'Pages the only feature toggle that defaults on' ; code-census.md §4 Page with versioning, linked to projects via ProjectPage. 'Wikis' as a distinct object and 'Nested Pages' are paid (open-core.md) ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(list)/page.tsx and apps/web/core/components/pages/pages-list-main-content.tsx:39,61 createPage; apps/api/plane/app/urls/page.py:23 project pages route, apps/api/plane/app/views/page/base.py:129 create; apps/api/plane/db/models/page.py:135 ProjectPage, apps/api/plane/db/models/project.py:96 page_view default True" }, "built": { @@ -829,7 +874,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 1 'then the group vergunningen with edit' ; code-census.md Acl participant type group or team ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:30-31 shares shown as '(Group)' and '(Team)'; lib/Db/Acl.php:37 PERMISSION_TYPE_GROUP and :39 PERMISSION_TYPE_CIRCLE; lib/Service/BoardService.php:419 addAcl(boardId, type, participant, ...)", "kanboard": "corpus: kanboard/round4/journeys.md 5 'createGroup Bouwtoezicht, addGroupMember carol, addProjectGroup(project-member): carol read the task' ; source read at v1.2.54: app/Template/project_permission/groups.php:38-48 add group form with group autocomplete, :29 remove; app/Controller/ProjectPermissionController.php:154-168 addGroup with a role", "openproject": "corpus: openproject/round4/M1-column.md 13.6 'a Group can be given a membership, so group-based visibility works' ; source read at v17.8.0: app/models/member.rb:40 a member is any principal; app/models/group.rb:31 Group < Principal; app/services/members/create_service.rb:49-55 adding a Group as member creates inherited memberships for its users; config/initializers/menus.rb:752 project Members page", - "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects'", + "jira": "corpus: jira-data-center/round4/M1-column.md 13.1 'Project roles are a flexible way to associate users and/or groups with particular projects' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-role-membership-938847171.html 'Search for the user or group you wish to add, and select the project role you wish to add them to' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §5 membership is per user, 'teamspace' grep 0 hits; M1-column.md 2.5 'assignees are individual users'. Teamspaces are a Pro string (open-core.md) ; source read at v1.4.2: apps/api/plane/db/models/project.py:210-219 ProjectMember is one user per row with a role; searched apps/api/plane/db/models/__init__.py for 'team', 'group' and apps/api/plane for 'teamspace': none, no group entity to share with" }, "built": { @@ -858,7 +903,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'There is no portal and no public page; every reader is an account' ; M1-column.md 1.1 no PublicPage on a card route ; source read at v1.19.0: searched src/router.js and appinfo/routes.php for a public board or link share route: none; lib/Controller/BoardOcsController.php:37-38 PublicPage read serves federated remote boards, see lib/Db/Acl.php:38 PERMISSION_TYPE_REMOTE, which requires an account on another server", "kanboard": "corpus: kanboard/round4/journeys.md 6 'Enable public access ... the read-only board ... answered 200 without a session' ; menu-tree.md Public ; source read at v1.2.54: app/Template/project_view/share.php:19 'Enable public access', :10 'Public link'; app/ServiceProvider/AuthenticationProvider.php:153 BoardViewController readonly open to Role::APP_PUBLIC; app/Controller/BoardViewController.php:22 readonly; app/Model/ProjectModel.php:571 enablePublicAccess", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:105 'Make a project public'; corpus: openproject/round4/M1-column.md 4.21 'a public project, which exposes the whole project to anonymous users' (read-only follows the Anonymous role's permissions) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:177-178 'Make public' row action needs edit_project; app/models/project.rb:202 public_projects scope; :228 visible? is true for a public project to any user including anonymous, whose rights come from the Anonymous role, app/models/anonymous_user.rb:34", - "jira": "corpus: jira-data-center/round4/M1-column.md 4.21 'you need to allow anonymous users to browse, search, and create issues in that project' (Allowing anonymous access to your project); browse without create is the read-only variant", + "jira": "corpus: jira-data-center/round4/M1-column.md 4.21 'you need to allow anonymous users to browse, search, and create issues in that project' (Allowing anonymous access to your project); browse without create is the read-only variant ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/allowing-anonymous-access-to-your-project-938847186.html 'you need to allow anonymous users to browse, search, and create issues in that project'; granting only Browse gives a read-only view without an account (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §6 'DeployBoard publishes an entity behind a random anchor', TYPE_CHOICES include project, view, page; space viewsets set AllowAny (space/views/project.py:20) ; journeys.md siblings of intake 'got past authentication' ; source read at v1.4.2: apps/web/core/components/project/publish-project/modal.tsx:60,94 publishProject; apps/api/plane/app/urls/project.py:113 project-deploy-boards route; apps/api/plane/db/models/deploy_board.py:19-32 DeployBoard with random anchor; apps/api/plane/space/views/project.py:20 permission_classes AllowAny for the public read" }, "built": { @@ -887,7 +932,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'Deck is a kanban board inside Nextcloud: boards with columns, cards' ; menu-tree.md 'The board, as it opens' ; source read at v1.19.0: src/components/board/Board.vue:61-75 stacks rendered as draggable columns, src/components/board/Stack.vue:104-122 cards inside each stack; lib/Db/Stack.php:28-35 a stack has title, board, order and isDoneColumn; appinfo/routes.php:37-43 stack routes", "kanboard": "corpus: kanboard/round4/usability.md 'Kanboard is a Kanban board with a task behind every card' ; menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: app/Controller/BoardViewController.php:56 show; app/Template/board/table_container.php:14 the board with its save url; app/Template/board/table_column.php:12 columns with task counts", "openproject": "corpus: openproject/round4/menu-tree.md global 'Boards' and project 'Work packages list, plus Gantt, board and calendar views'; boards_view is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md); docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:11 'OpenProject Agile boards ... Boards consist of lists (columns) and cards (work packages)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/config/routes.rb:2-13 global and project boards; modules/boards/app/controllers/boards/boards_controller.rb:120-129 basic and action board types; frontend/src/app/features/boards/board/board-list/board-list.component.html:22 a list per query; searched modules/boards for 'enterprise', 'allows_to': none, action boards free since 17.3", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Click Create a Kanban board'", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Click Create a Kanban board' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; 'Kanban boards are for teams that focus on managing and constraining their work-in-progress' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in a spreadsheet, board, calendar or gantt layout. That path is fast, clean and well made' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx:130 board root with group drag and drop; apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:136 column drop target; apps/api/plane/app/views/issue/base.py:628 partial_update stores the new state" }, "built": { @@ -917,7 +962,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'a stack is a column you drag a card into' (open-core.md 2.7 row) ; M1-column.md 2.6 'one card at a time is dragged' ; source read at v1.19.0: src/components/board/Stack.vue:104-114 vue-smooth-dnd Container with @drop onDropCard (:277); appinfo/routes.php:52 card#reorder moves a card to another stack and order", "kanboard": "corpus: kanboard/round4/usability.md 'the board, its columns and swimlanes' ; journeys.md 1 moveTaskPosition (the API behind the drag) ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:19 sortable columns, :37 save on drop, :72 posts to the board save url; app/Template/board/table_container.php:14 data-save-url; app/Controller/BoardAjaxController.php:22 save", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list or to a new list. Remember: Moving cards to another list in an Action board will update their attributes, e.g. status' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-card-view.component.ts:265 handleDrop; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165 cross-list drop; frontend/src/app/features/boards/board/board-actions/board-action.service.ts:280 assignToWorkPackage writes the list's attribute (status, assignee, version) to the moved card", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints section (cards moved between columns); corpus: jira-data-center/round4/M1-column.md 3.18 'you can drag and drop them'; board drag is the documented move", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints section (cards moved between columns); corpus: jira-data-center/round4/M1-column.md 3.18 'you can drag and drop them'; board drag is the documented move ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-the-simplified-workflow-938845286.html the Simplified Workflow 'Allows issues to be dragged freely between columns' (read 2026-09-26)", "plane": "corpus: plane/round4/journeys.md board layout driven ; source: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable() from pragmatic-drag-and-drop; the workflow gate is the no-op hook (code-census.md opening section, use-workflow-drag-n-drop.ts:10-23), so every drop is accepted ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable card; apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:136,171 dropTargetForElements onDrop to handleOnDrop; apps/web/core/components/issues/issue-layouts/utils.tsx:538 handleGroupDragDrop; apps/api/plane/app/views/issue/base.py:628 partial_update" }, "built": { @@ -942,12 +987,12 @@ "openproject": "no", "plane": "partial", "kanboard": "partial", - "jira": "unknown", + "jira": "yes", "evidence": { "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue:113-123 arrow keys move focus between cards, src/components/cards/CardItem.vue:283 'KeyM' opens the card menu with Move card (corpus: nextcloud-deck/round4/menu-tree.md 'The action menu: Mark as done, Move card') ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:118-129 arrow keys move focus between cards; src/components/cards/CardItem.vue:306-307 'KeyM' opens the card menu; src/components/cards/CardMenuEntries.vue:53-57 'Move/copy card' opens src/CardMoveDialog.vue:6-18 'Select a board', 'Select a list'", "kanboard": "source: app/Template/task/sidebar.php:86 'Move position' dialog on the task page is a keyboard-usable form; app/Template/config/keyboard_shortcuts.php lists no card focus or move key on the board ; source read at v1.2.54: app/Template/task/sidebar.php:86 'Move position' on the task page only; app/Template/task_move_position/show.php:7-15 swimlane, column and position selects; app/Controller/TaskMovePositionController.php:33 save; app/Template/config/keyboard_shortcuts.php:11-15 board keys are n, s, c only, no card focus or move key", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniE 'keydown|keyboard|hotkey' frontend/src/app/features/boards returns only board-list-container.component.html:46 '(keydown.enter)=addList(board)'; cards move through WorkPackageCardDragAndDropService (drag only). The card's status can be changed from the card itself (agile-boards README:156 'update a work package's status directly in the card'), which is keyboard reachable on a Status board only ; source read at v17.8.0: searched frontend/src/app/features/boards and frontend/src/app/shared/directives/sortable-lists for 'keydown', 'keyboard', 'ArrowUp': only frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:46-47 Enter or Space on 'Add list'; cards move by drag only", - "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html only says app-specific shortcuts appear in the in-product dialog (Shift + /); the board shortcut list is not in the documentation and no instance was available", + "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html only says app-specific shortcuts appear in the in-product dialog (Shift + /); the board shortcut list is not in the documentation and no instance was available ; 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 2026-09-26)", "plane": "source: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:216 shortcut \"s\" opens the state menu for the focused work item in the command palette, so a state (column) change works from the keyboard once the item is open; no keyboard move on the board itself found (kanban/block.tsx is pointer drag only). Not driven in round 4 ; source read at v1.4.2: apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:208-214 shortcut 's' in the command palette sets state_id of the focused work item; searched apps/web/core/components/issues/issue-layouts/kanban/ for 'onKeyDown', 'useKeypress', 'ArrowLeft', 'ArrowRight': none, so no keyboard move on the board itself" }, "built": { @@ -976,7 +1021,7 @@ "nextcloud-deck": "source: lib/Db/Stack.php carries title, order, isDoneColumn and no limit; corpus: nextcloud-deck/round4/code-census.md 'Stack with order and isDoneColumn' ; source read at v1.19.0: lib/Db/Stack.php:28-35 title, boardId, order, isDoneColumn and no limit; searched lib/ and src/ for 'wip', 'limit' on stacks, 'max_cards': none. 1.19.0 only shows a card count beside the list title, CHANGELOG.md:10 and src/components/board/Stack.vue:18", "kanboard": "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded' ; source read at v1.2.54: app/Template/column/index.php:19 'Task limit' column setting; app/Template/board/table_column.php:113-114 count over limit in the header; app/Template/board/table_tasks.php:6 board-task-list-limit class when the column is over its limit", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniI 'wip.limit|work.in.progress|max_cards|card_limit' over app, modules and frontend/src hits only GitLab merge-request 'work in progress' handling (modules/gitlab_integration/...upsert_merge_request.rb); agile-boards README documents no list limit ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'wip_limit', 'wip.limit', 'max_cards', 'card_limit': none; a list is a saved query with a name only, frontend/src/app/features/boards/board/board-list/board-list.component.html:22", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints)", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'If a column constraint is exceeded, then the column will change color ... Column colored red, Maximum number of issues exceeded' (read 2026-09-26)", "plane": "source: grep -rniE 'wip|max_issues|column_limit|issue_limit' --include=*.py apps/api returns only an unrelated test comment; corpus: plane/round4/code-census.md §2 State fields are name, description, color, slug, sequence, is_triage, default (no limit) ; source read at v1.4.2: apps/api/plane/db/models/state.py:79 State model; searched it for 'wip', 'max_issues', 'column_limit', 'issue_limit': none; searched apps/web/core/components/issues/issue-layouts/kanban/ likewise: none" }, "built": { @@ -1009,7 +1054,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Add list ... each with Add card and an Actions menu (rename, reorder, mark as done column, delete)' ; source read at v1.19.0: src/components/Controls.vue:39-56 'Add list', src/components/board/Stack.vue:43 'Edit list title', :69 'Delete list'; src/components/board/Board.vue:61-67 lists are draggable with @drop onDropStack; appinfo/routes.php:38-41 stack create, update, reorder, delete", "kanboard": "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns' ; source read at v1.2.54: app/Template/column/index.php:5 'Add a new column', :29 'Change column position' drag handle, :34 Edit, :38 Remove; app/Controller/ColumnController.php:60 save, :114 update, :151 move, :186 remove", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:45-50 'Add list'; :7-10 drag lists to reorder (moveList); frontend/src/app/features/boards/board/board-list/board-list.component.html:22-25 rename a list inline; frontend/src/app/features/boards/board/board-list/board-list-menu.component.ts:66 'Delete list'", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header'", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Click the Add Column button', 'Change the name of a column', 'Move a column ... drag the column left or right', 'Delete a column' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'Settings ... States' ; code-census.md §2 State per project with name, color, sequence; 'Groups are not user-definable' (six fixed groups), so columns within groups are free ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/states route; apps/web/core/components/project-states/root.tsx:30-32 createState, moveStatePosition, updateState and apps/web/core/components/project-states/state-delete-modal.tsx:30,42 deleteState; apps/api/plane/app/views/state/base.py:47 create and :114 destroy" }, "built": { @@ -1039,7 +1084,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'mark as done column' ; source: lib/Service/CardService.php:454-455 a card moved into the done column gets setDone ; source read at v1.19.0: src/components/board/Stack.vue:66 list menu 'Set cards as \"done\"'; lib/Db/Stack.php:35 isDoneColumn; lib/Service/CardService.php:454-462 a card moved into the done list gets setDone, leaving it clears done; appinfo/routes.php:158 stack_ocs#setDoneStack", "kanboard": "corpus: kanboard/round4/journeys.md 2 'createAction(project 1, task.move.column, TaskCloseColumn, column_id 4) ... is_active 0' : done is an automatic action per project, not a column flag ; source read at v1.2.54: app/Action/TaskCloseColumn.php:13,76 an automatic action closes a task moved into a chosen column; searched app/Schema/Sqlite.php for 'is_done', 'done_column': no done flag on columns", "openproject": "Status board columns are statuses and a status carries is_closed (corpus: openproject/round4/M1-column.md 2.7 'app/models/status.rb:31 ... is_closed (used at work_package.rb:105)'); the column itself is not marked done, closure comes from the status it maps to, and Basic board columns change nothing (agile-boards README:55) ; source read at v17.8.0: app/models/work_package.rb:276 closed? comes from status.is_closed?; modules/boards/app/services/boards/status_board_create_service.rb:11-12 a Status board list is a status_id filter, so a list counts as done only through its status; searched frontend/src/app/features/boards for a done or closed flag on a list: none", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses'", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The single right-most column will always be green, representing items in a successful state'; default mapping 'Done Resolved, Closed' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'A state change to a completed group state sets Issue.completed_at (issue.py:236-249)'; the completed group is fixed rather than chosen, but any state placed in it counts as done ; source read at v1.4.2: apps/web/core/components/project-states/group-list.tsx lists states under fixed groups, a state added to the completed group counts as done; apps/api/plane/db/models/issue.py:240-247 _sync_completed_at sets completed_at when the state group is COMPLETED. The done group is fixed, any state in it is a done column" }, "built": { @@ -1069,7 +1114,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md filter 'title: description: list: tag: assigned: date:' ; a card has no priority (open-core.md 'a card is title, description, date, labels, assignees') ; source read at v1.19.0: src/components/Controls.vue:104 'Filter by tag', :115 'Filter by assigned user', :139 'Filter by status', :172 'Filter by due date', :65-74 board filter text field; lib/Db/Card.php has no priority field, searched lib/Db and src/ for 'priority': none, so assignee and label yes, priority no", "kanboard": "corpus: kanboard/round4/usability.md 'one query language with twenty-five attributes runs the board' ; source: app/Filter/TaskPriorityFilter.php, assignee and tag filters in app/Filter/ ; source read at v1.2.54: app/Template/app/filters_helper.php:6-15 filter menu 'My tasks', 'Not assigned', 'Tasks due today'; app/ServiceProvider/FilterProvider.php:148 TaskAssigneeFilter, :156 TaskPriorityFilter, :223 TaskTagFilter in the board query lexer", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/features/boards/board/board-filter/board-filter.component.html '' with board-filters.service.ts building ApiV3 filters (assignee, type, priority, any work package filter corpus: openproject/round4/M1-column.md 9.2) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filter.component.html:1 '' the full work package filter set (assignee, type, priority, ...); frontend/src/app/features/boards/board/board-filter/board-filters.service.ts builds the ApiV3 filters saved on the board", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board'; default 'Only My Issues' and 'Recently Updated', each a JQL (assignee, labels, priority)", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board'; default 'Only My Issues' and 'Recently Updated', each a JQL (assignee, labels, priority) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html 'Quick Filters allow you (or anyone else using this board) to further filter the collection of issues appearing on a Scrum board or Kanban board' (read 2026-09-26)", "plane": "corpus: plane/round4/usability.md 'Layouts, filtering, the command palette ... are all good' ; code-census.md §9 IssueView filters; source: packages/constants/src/issue/filter.ts 'issues' page filters include assignees, labels, priority ; source read at v1.4.2: apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx:206 project filter bar with labels, members and priority; apps/api/plane/utils/filters/filterset.py:138-151 assignee_id and label_id filters and :199 priority; apps/api/plane/utils/filters/converters.py:17-20 labels and assignees mapping" }, "built": { @@ -1099,7 +1144,7 @@ "nextcloud-deck": "source: src/components/Controls.vue view modes are 'Kanban view' and 'Gantt view' only (viewMode values kanban, gantt), plus 'Toggle compact mode'; corpus: nextcloud-deck/round4/menu-tree.md says 'the view modes (board and list)', which the tag's source does not bear out; the nearest list is 'Upcoming cards' across boards (menu-tree.md) ; source read at v1.19.0: src/components/Controls.vue:235-249 view modes 'Kanban view' and 'Gantt view', :261 'Toggle compact mode'; src/components/board/Board.vue:52 GanttView when viewMode is gantt; searched src/ for a list or table view mode: none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: app/Template/project_header/views.php:12 'Board', :18 'List' with the same search; app/Controller/TaskListController.php:21 show", "openproject": "corpus: openproject/round4/menu-tree.md 'Work packages list, plus Gantt, board and calendar views' over the same work packages ; source read at v17.8.0: frontend/src/app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive.ts:79 card view and :99 list view of the same query; frontend/src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service.ts:35-36 'list'|'card'; a board's lists are work package queries over the same records", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'base your board on an existing Saved Filter'; the same filter opens as a list in the issue navigator (corpus: jira-data-center/round4/M1-column.md 9.3, 9.5 column chooser)", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'base your board on an existing Saved Filter'; the same filter opens as a list in the issue navigator (corpus: jira-data-center/round4/M1-column.md 9.3, 9.5 column chooser) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html a board runs on 'an issue filter with the following query: project = ... ORDER BY Rank ASC'; https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html the same filter shows as a list view in search (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'spreadsheet, board, calendar, gantt and list layouts' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx:24-36 LayoutSelection renders ISSUE_LAYOUTS; packages/constants/src/issue/layout.ts:9 'list' | 'kanban' | 'calendar' | 'spreadsheet' | 'gantt'; layout is a per-user display filter, the same items are served by apps/api/plane/app/views/issue/base.py:628 viewset" }, "built": { @@ -1129,7 +1174,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels, the due badge, assignee avatars' ; source: src/components/cards/CardBadges.vue has no dependency or blocked badge ; source read at v1.19.0: src/components/cards/CardItem.vue:50-54 labels on the card, src/components/cards/CardBadges.vue:9 due date badge, :24 checklist, :33 attachments, :40 assignee avatars; searched CardBadges.vue for 'depend', 'blocked': none, so no blocked state", "kanboard": "source: app/Template/board/task_footer.php:24-28 tags, :62-74 due date, :135 priority, app/Template/board/task_private.php:29 assignee; blocked shows only as a link count icon (:89-90) with a tooltip ; corpus: kanboard/round4/menu-tree.md board screenshot ; source read at v1.2.54: app/Template/board/task_footer.php:24-28 tags, :62-74 due date coloured when overdue, :89-90 link count icon with tooltip, :135 priority; app/Template/board/task_private.php:29-31 assignee initials; no blocked marker, only the link count", "openproject": "Cards show type, subject, assignee avatar and dates, with highlighting by priority or type (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/.../highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'|'none'|'inline'); labels do not exist (corpus: openproject/round4/M1-column.md 2.8) and there is no blocked marker on a card (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html:121 'dueDate', :134 status button, :159-160 assignee avatar, :104-106 type; frontend/src/app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const.ts:31 priority or type highlight; searched that card template for 'blocked', 'blocks': none, and no label object exists", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards', 'Days in column shows dots on each card'; assignee avatar, flags and labels as a card field; blocked shown by the flag or a query colour ('One color per JQL query')", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards', 'Days in column shows dots on each card'; assignee avatar, flags and labels as a card field; blocked shown by the flag or a query colour ('One color per JQL query') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can configure cards on a board to display up to three additional fields'; 'Adding Days in column to your cards This shows a series of dots on each card' (read 2026-09-26)", "plane": "source: packages/constants/src/issue/common.ts ISSUE_DISPLAY_PROPERTIES keys key, assignee, start_date, due_date, labels, priority, state, sub_issue_count, attachment_count, link, estimate, modules, cycle: no blocked indicator; grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits ; corpus: plane/round4/code-census.md §9 display_properties ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:36,129 card renders IssueProperties; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:121,295 assignee and due date chips; packages/constants/src/issue/common.ts:142-159 display keys have no blocked entry; searched apps/web/core/components/issues/issue-layouts for 'blocked', 'blocking': none" }, "built": { @@ -1158,7 +1203,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md Card and Stack carry an order ; source: appinfo/routes.php card#reorder ; source read at v1.19.0: src/components/board/Stack.vue:104-114 drag within a list calls onDropCard; lib/Service/CardService.php:436 reorder(id, stackId, order); appinfo/routes.php:52 card#reorder", "kanboard": "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:37 save sends the new position; app/Controller/BoardAjaxController.php:18-46 saves task positions from the drag and drop; app/Template/task_move_position/show.php:14-15 'Insert before this task', 'Insert after this task'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:161-175 same-list drop is a pure reorder; lib/api/v3/queries/order/query_order_api.rb:34, :73 PATCH the manual order; app/models/ordered_work_package.rb:31-35 stored position", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column)", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html board filter 'ORDER BY Rank ASC'; https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'Drag and drop an issue to rank it' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'sort_order float (:158)' on Issue ; source: kanban/block.tsx:206 drag within a group reorders by sort_order under manual ordering ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable card; apps/web/core/components/issues/issue-layouts/utils.tsx:491-518 drop computes a new sort_order between neighbours under manual ordering; apps/api/plane/db/models/issue.py:158 sort_order FloatField" }, "built": { @@ -1190,7 +1235,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'each with Add card' ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' in each list, :128-135 inline 'Card name' input; src/components/KeyboardShortcuts.vue:106-107 'KeyN' new card; appinfo/routes.php:47 card#create", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column ; source read at v1.2.54: app/Template/board/table_column.php:19 per column add button; app/Helper/TaskHelper.php:325-334 getNewBoardTaskButton 'Add a new task' opening TaskCreationController in that column; app/Template/board/table_column.php:35 'Create tasks in bulk'; app/Controller/TaskCreationController.php:51 save", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/add-card-dropdown/add-card-dropdown-menu.directive.ts:61 'Add new card' and :69 'Add existing'; config/locales/js-en.yml:189 'Add new card'; frontend/src/app/features/boards/board/board-list/board-inline-create.service.ts creates the card inside the list's query", - "jira": "docs: inline create is documented on the backlog, not per board column; board cards come from the Create dialog (corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen'); not verified in a running instance", + "jira": "docs: inline create is documented on the backlog, not per board column; board cards come from the Create dialog (corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen'); not verified in a running instance ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'You can quickly create issues using the inline issue create feature. Just click + Create issue' is documented for the backlog; no per-column create on the board is described (read 2026-09-26)", "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot per column ; corpus: plane/round4/menu-tree.md 'New work item' global create ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot at the foot of each column; apps/api/plane/app/views/issue/base.py:405 create" }, "built": { @@ -1223,7 +1268,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source read at v1.19.0: src/router.js:55-60 /board route renders Boards with the ALL filter; src/components/boards/Boards.vue:9 'Search boards', :16-23 a table of every board with 'Board name' and 'Members'; src/components/navigation/AppNavigation.vue:19 'All boards'; appinfo/routes.php:20 board#index", "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Dashboard' ; source: app/Template/config/keyboard_shortcuts.php 'Open board switcher' ; source read at v1.2.54: app/Template/dashboard/overview.php:45-47 every project on the dashboard with open task counts per board column, linking to its board; app/Controller/DashboardController.php:18 show; app/Template/header.php:18 board selector; app/Template/config/keyboard_shortcuts.php:27 'Open board switcher'", "openproject": "corpus: openproject/round4/menu-tree.md global module 'Boards' in the top-left grid lists boards across projects ; source read at v17.8.0: modules/boards/config/routes.rb:2-5 global boards index; modules/boards/lib/open_project/boards/engine.rb:63-80 top and global menu 'Boards'; modules/boards/app/controllers/boards/boards_controller.rb:76-81 without a project it lists boards of every project allowed :show_board_views; modules/boards/app/views/boards/boards/index.html.erb:48 table of them", - "jira": "docs: Jira Software 'View all boards' from the Boards menu; docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html boards span 'one or more projects'", + "jira": "docs: Jira Software 'View all boards' from the Boards menu; docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html boards span 'one or more projects' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'Select Boards > View All Boards from the top navigation bar' (read 2026-09-26)", "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) offers spreadsheet and list layouts only; profile_issues offers kanban of your own items grouped by state or project. No page with every project's board ; corpus: plane/round4/menu-tree.md 'Workspace: Projects, Views, Analytics, Archives' ; source read at v1.4.2: packages/constants/src/issue/filter.ts:170-195 my_issues (workspace views) offers spreadsheet and list layouts only, used by apps/web/core/components/workspace/views/form.tsx:137; packages/constants/src/issue/filter.ts:113-131 profile_issues offers a kanban grouped by project of one person's items; no page with every project's board" }, "built": { @@ -1253,7 +1298,7 @@ "nextcloud-deck": "no WIP limit to enforce (brd-wip-limits) ; source: lib/Db/Stack.php ; source read at v1.19.0: no limit to enforce: lib/Db/Stack.php:28-35 has no limit field; lib/Service/CardService.php:436 reorder checks permission and archive state, searched it for 'limit', 'max': none", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 9.14 'task_limit ... and, verified live, does not refuse the move' ; source read at v1.2.54: searched app/Model, app/Controller, app/Validator and assets/js/src/BoardDragAndDrop.js for 'task_limit' and 'limit': only column storage, app/Model/ColumnModel.php:183-212; the limit only styles the column, app/Template/board/table_tasks.php:6 board-task-list-limit", "openproject": "no WIP limit exists (see brd-wip-limits grep), so nothing blocks a move ; source read at v17.8.0: no limit to enforce: searched app, lib, modules and frontend/src for 'wip_limit', 'max_cards', 'card_limit': none; frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:165-171 a cross-list drop has no capacity check", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints are informational: violations only colour the column red or yellow and do not prevent issues being moved into it", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html constraints are informational: violations only colour the column red or yellow and do not prevent issues being moved into it ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'These values don't have any impact on the number of issues displayed in the columns': a breached limit only colours the column red or yellow (read 2026-09-26)", "plane": "no WIP limit exists (see brd-wip-limits); the drop gate is the hollow shim use-workflow-drag-n-drop.ts:10-23 'isWorkflowDropDisabled: false' (corpus: plane/round4/open-core.md shims table) ; source read at v1.4.2: apps/web/core/components/workflow/use-workflow-drag-n-drop.ts:10-23 returns isWorkflowDropDisabled: false and a no-op handleWorkFlowState, so every drop is accepted; no WIP limit exists to enforce (see brd-wip-limits, apps/api/plane/db/models/state.py:79)" }, "built": { @@ -1282,7 +1327,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md the board is lists as columns only ; source: grep -rniF 'swimlane' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'swimlane', 'lane', 'groupBy': none; src/components/board/Board.vue:61-75 renders stacks as a single row of columns", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Swimlanes' ; code-census.md 'swimlanes SwimlaneModel' : swimlanes are named lanes a user places tasks in, not grouped automatically by assignee, priority or epic ; source read at v1.2.54: app/Template/swimlane/index.php:5 'Add a new swimlane'; app/Controller/SwimlaneController.php:57 save; app/Filter/TaskSwimlaneFilter.php:26 filter by swimlane; lanes are named and hand placed, nothing groups by assignee, priority or epic", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'swimlane' over the tree returns nothing; agile-boards README documents Basic and Action boards only ; source read at v17.8.0: searched app, lib, modules and frontend/src for 'swimlane' (case-insensitive): none; board lists are laid out in one horizontal row, frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:9 cdkDropListOrientation horizontal", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; a JQL query swimlane covers priority or epic (read 2026-09-26)", "plane": "source: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx ; packages/constants/src/issue/filter.ts:237 sub_group_by options state, priority, cycle, module, labels, assignees, created_by. No epic swimlane because epics are unreachable (corpus: plane/round4/journeys.md epics 404) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx:62 SubGroupSwimlaneHeader; packages/constants/src/issue/filter.ts:237 sub_group_by state, priority, cycle, module, labels, assignees, created_by; apps/api/plane/app/views/issue/base.py:159-162 server groups by sub_group_by. No epic option" }, "built": { @@ -1311,7 +1356,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' (personal and shared saved searches) ; source read at v1.19.0: searched lib/ and src/ for 'savedFilter', 'saveFilter', 'saved filter': none; src/components/Controls.vue:104-229 filter state lives in the page only, with 'Clear filter' at :229", "kanboard": "corpus: kanboard/round4/journeys.md 5 'a custom filter Deze week te doen was saved as shared' ; code-census.md 'custom_filters.is_shared' ; source read at v1.2.54: app/Template/custom_filter/create.php:14 'Share with all project members', :17 'Append filter'; app/Controller/CustomFilterController.php:57 save; app/ServiceProvider/AuthenticationProvider.php:95 open to project members", "openproject": "A board is itself a saved query and work package queries can be saved and shared (corpus: openproject/round4/M1-column.md 9.3, 9.4 'a query is public or private'); board filter state is saved with the board, no separate named filter set per board ; source read at v17.8.0: frontend/src/app/features/boards/board/board-filter/board-filters.service.ts keeps one filter set saved with the board; app/contracts/queries/base_contract.rb:37 public flag and :62, :79 manage_public_queries for shared work package queries; searched frontend/src/app/features/boards for a named saved filter per board: none", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.4 'Filters ... can be shared with other users, user groups, projects, and project roles'; docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters are saved per board for 'anyone else using this board'", + "jira": "corpus: jira-data-center/round4/M1-column.md 9.4 'Filters ... can be shared with other users, user groups, projects, and project roles'; docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters are saved per board for 'anyone else using this board' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/saving-your-search-as-a-filter-939938748.html 'Share and email search results with your colleagues'; 'Your new filter will be added to your favorite filters and shared, according to the sharing preference' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §9 'a saved view can be shared (access = 1, the default) and it does carry its column set' ; menu-tree.md 'Views saved views' ; source read at v1.4.2: apps/web/core/components/views/form.tsx:48,98 view form with access default PUBLIC; apps/api/plane/app/urls/views.py:18 project views route, apps/api/plane/app/views/view/base.py:420 create; apps/api/plane/db/models/view.py:58-66 IssueView with access Private or Public" }, "built": { @@ -1340,7 +1385,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'A card in the column shows its title, labels' ; M1-column.md 2.8 'labels per board with a colour' : labels are coloured chips, the card itself is not coloured by category ; source read at v1.19.0: per-card colour exists, which the drive evidence missed: src/components/cards/CardMenuEntries.vue:7-13 'Change card color' picker, src/components/cards/CardItem.vue:203 renders it, lib/Db/Card.php:75 color, lib/Service/CardService.php:292-294; the colour is set by hand, not derived from a label, type or category, so partial stands", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28 ; source read at v1.2.54: app/Template/task_creation/show.php:18 colour field; app/Template/board/task_private.php:5 card class color-id; app/Action/TaskAssignColorCategory.php:23 'Assign automatically a color based on a category'; app/Action/TaskAssignColorPriority.php:23; app/Template/board/task_footer.php:28 coloured tags", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/configuration-modal/tabs/highlighting-tab.component.html:13 'entire card by' with :26 type and :29 priority options; app/contracts/queries/base_contract.rb:42 highlighting_mode saved; searched app and lib for an Enterprise gate on highlighting: none, attribute highlighting released to Community in 17.1", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query'", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'Base your card colors on ... Issue types One color per issue type', also per priority, assignee or JQL query (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 labels and states carry color; source: ISSUE_DISPLAY_PROPERTIES shows label and state chips on the card, no setting colours the whole card by label or type (no types exist, journeys.md) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/properties/labels.tsx:155 a label chip on the card takes the label colour; apps/api/plane/db/models/label.py:21 color; no display option colours the whole card, packages/constants/src/issue/common.ts:142-159 display keys have no card colour)" }, "built": { @@ -1369,7 +1414,7 @@ "nextcloud-deck": "source: lib/Service/CardService.php:454-460 entering the done column marks the card done and leaving it clears done; no other action ; corpus: nextcloud-deck/round4/M1-column.md 3.9 'no' ; source read at v1.19.0: lib/Service/CardService.php:454-462 entering a done list marks the card done and leaving it clears done, set from src/components/board/Stack.vue:66; searched lib/ for other stack-entry side effects, 'rule', 'automation': none", "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move' ; source read at v1.2.54: app/Template/action/index.php:5 'Add a new action'; app/Controller/ActionCreationController.php:102 save; app/Action/TaskAssignSpecificUser.php:36 on EVENT_MOVE_COLUMN, app/Action/TaskCloseColumn.php:35; app/Core/Action/ActionManager.php:126 attachEvents", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:61 'Moving work packages (cards) between two lists will update them automatically' (status, assignee, version boards set that attribute); arbitrary actions on entry need custom actions, which are button-triggered and Enterprise gated (corpus: openproject/round4/M1-column.md 3.9) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-actions/board-action.service.ts:279-290 moving a card writes the list's one attribute (status, assignee, version, subproject, parent); app/controllers/custom_actions_controller.rb:34 richer multi-field custom actions are Enterprise gated and triggered by a button, not by entering a list", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation on 'issue transitioned' whose actions are 'editing issues, sending notifications, creating sub-tasks' and workflow post functions such as 'Assign to Current User' (3.8); a column maps to statuses (docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html)", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation on 'issue transitioned' whose actions are 'editing issues, sending notifications, creating sub-tasks' and workflow post functions such as 'Assign to Current User' (3.8); a column maps to statuses (docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html) ; docs read 2026-09-26: https://confluence.atlassian.com/automation/jira-automation-triggers-993924804.html triggers include 'Issue transitioned', so a rule runs when a card moves to the column mapped to that status (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §3 'The only automation engine in CE is two integer settings and one nightly job' (archive_in, close_in); 'Trigger And Action' (Pro) and 'Workflows + Approvals' (Business) are paid strings absent from Community (open-core.md) ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/automations/page.tsx holds only apps/web/core/components/automation/auto-archive-automation.tsx:27-50 and auto-close; apps/api/plane/db/models/project.py:110-111 archive_in and close_in; apps/api/plane/bgtasks/issue_automation_task.py:23 nightly job. No on-enter-column trigger" }, "built": { @@ -1398,7 +1443,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Upcoming cards cards assigned to me across boards, by due date' is a list, not a board ; source read at v1.19.0: src/components/overview/Overview.vue:57-83 the Upcoming view groups my assigned cards from all boards into fixed due-date columns (Overdue, Today, Tomorrow, Next 7 days, Later, No due) with no drag between them; src/stores/overview.js:26 and lib/Controller/OverviewApiController.php:29 upcomingCards; no board that holds cards of several boards", "kanboard": "corpus: kanboard/round4/menu-tree.md a board belongs to one project; Dashboard lists tasks across projects but no shared board ; source read at v1.2.54: app/Controller/BoardViewController.php:56-69 show builds the board from one project, boardFormatter withProjectId; searched app/Controller for a multi-project board: none, the dashboard lists tasks across projects without a board", "openproject": "Action boards include a subproject board (docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards, create-subproject-board image) and boards are per project; no board over unrelated projects documented (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/boards/app/models/boards/grid.rb:33 a board belongs_to one project; modules/boards/app/services/boards/subproject_board_create_service.rb:4-9 a Subproject board, lists per child project; frontend/src/app/features/boards/board/board-actions/subproject/subproject-action.service.ts:43 'onlySubproject' filter; searched modules/boards for a board over unrelated projects: none", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects' and 'base your board on an existing Saved Filter'", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects' and 'base your board on an existing Saved Filter' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; board filter 'project = \"[YOUR PROJECT(S)]\" ORDER BY Rank ASC' (read 2026-09-26)", "plane": "source: packages/constants/src/issue/filter.ts my_issues layouts spreadsheet and list only (used by apps/web/core/components/workspace/views/form.tsx:148); profile_issues has kanban grouped by project for one person's items. Cross-project work is list-shaped, not a shared board ; source read at v1.4.2: packages/constants/src/issue/filter.ts:170-195 workspace views (my_issues) offer spreadsheet and list layouts only, no kanban, used at apps/web/core/components/workspace/views/form.tsx:137; packages/constants/src/issue/filter.ts:128-131 profile kanban grouped by project covers one person's items only" }, "built": { @@ -1427,7 +1472,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'A card becomes a case' ; menu-tree.md card action menu 'Delete' ; done or open is the status (code-census.md Card done, archived) ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' and :135 'Card name'; src/components/card/CardSidebar.vue:231-238 title edit; src/components/card/Description.vue description; src/components/cards/CardMenuEntries.vue:49 'Mark as done', :78 'Delete card'; lib/Controller/CardController.php:49 create, :67 update, :83 delete, :106 done", "kanboard": "corpus: kanboard/round4/menu-tree.md task 'Edit the task ... Open this task / Close this task · Remove' ; journeys.md 1 createTask ; source read at v1.2.54: app/Template/task/sidebar.php:36 'Edit the task', :92 'Close this task', :96 'Open this task', :102 'Remove'; app/Controller/TaskCreationController.php:51 save; app/Controller/TaskModificationController.php:83 edit; app/Controller/TaskSuppressionController.php:35 remove", "openproject": "corpus: openproject/round4/journeys.md 'Creating a work package, giving it a start date and a duration ... is the best-supported path'; corpus: openproject/round4/M1-column.md 1.2 work package create form; 2.17 delete service ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-new/wp-new-full-view.component.ts:35 create view; config/initializers/permissions.rb:324 add_work_packages, :333 edit_work_packages, :436 delete_work_packages; app/services/work_packages/create_service.rb, update_service.rb and delete_service.rb do the writes; app/models/work_package.rb:59 status", - "jira": "corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen to open the Create issue dialog box'; 2.17 'Delete issues Permission'; statuses 2.7", + "jira": "corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen to open the Create issue dialog box'; 2.17 'Delete issues Permission'; statuses 2.7 ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-issues-and-sub-tasks-939938925.html 'Select Create at the top of the screen to open the Create issue dialog box'; https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html lists Edit and Delete issues permissions (read 2026-09-26)", "plane": "corpus: plane/round4/journeys.md 'create a work item, give it a state, a priority, assignees, labels, a start date and a target date' ; code-census.md §2 Issue fields ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/title-input.tsx:53 title, apps/web/core/components/issues/issue-modal/form.tsx:238 description_html, apps/web/core/components/issues/issue-modal/components/default-properties.tsx:90 state_id; apps/api/plane/app/views/issue/base.py:405 create, :628 partial_update, :717 destroy; apps/api/plane/db/models/issue.py:136 name" }, "built": { @@ -1457,7 +1502,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.4 'assignUser and unassignUser per card ... Verified live' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:17-18 'Assign a user to this card…' mounted from src/components/card/CardSidebarTabDetails.vue:15-19; lib/Controller/CardController.php:126 assignUser, lib/Service/AssignmentService.php:48", "kanboard": "corpus: kanboard/round4/M1-column.md 2.4 'yes' ; journeys.md 5 ; source: app/Model/TaskCreationModel.php:67 owner_id ; source read at v1.2.54: app/Helper/TaskHelper.php:126-130 'Assignee' select with 'Assign to me'; app/Controller/TaskModificationController.php:17 assignToMe; app/Model/TaskCreationModel.php:67 owner_id", "openproject": "corpus: openproject/round4/M1-column.md 2.4 'assigned_to and a separate responsible, both Principal (app/models/work_package.rb:57-81)' ; source read at v17.8.0: app/models/work_package.rb:61 assigned_to (a Principal); lib/api/v3/work_packages/schema/work_package_schema_representer.rb:451-453 available assignees feed the assignee picker; lib/api/v3/work_packages/work_packages_api.rb:99 AvailableAssigneesAPI", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission to assign issues to users'", + "jira": "corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission to assign issues to users' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html 'Assign issues Permission to assign issues to users. This permissions also allows autocompletion of users in the Assign Issue dropdown' (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 2.4 'Issue.assignees M2M (issue.py:149) ... editable from the work item peek and the spreadsheet layout' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:126 assignee_ids dropdown; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:121 updateIssue assignee_ids from the card; apps/api/plane/db/models/issue.py:149 assignees M2M; apps/api/plane/app/views/issue/base.py:628 partial_update" }, "built": { @@ -1486,7 +1531,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 2 'jdevries and the group as assignees' ; code-census.md 'Assignment: user, group, team, remote' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:14 :multiple=\"true\", :6 'Assign to users/groups/team'; lib/Db/Assignment.php:17-20 user, group, circle and remote assignees", "kanboard": "source: a task has one owner_id (app/Model/TaskCreationModel.php:67); corpus: kanboard/round4/M1-column.md 2.5 'partial' (group only through a project, not per task) ; source read at v1.2.54: app/Helper/TaskHelper.php:127 a single owner_id select; app/Schema/Sqlite.php:1553 tasks.owner_id one column; searched app/Model and app/Schema for 'owner_ids', 'assignees': none; several assignees only through the third-party Group_assign plugin", "openproject": "corpus: openproject/round4/M1-column.md 2.5 'the two people fields are assigned_to and responsible and both are single-valued'; a Group can hold the assignment (one principal) ; source read at v17.8.0: app/models/work_package.rb:61-62 assigned_to and responsible are single belongs_to; searched app/models and lib/api/v3/work_packages for 'assignees' as a list and 'multi assign': only the available assignees picker; a group can be the one assignee", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.5 the assignee must be a single user (JRASERVER-5921 'Assign an issue to a group' closed as duplicate); 5.1 a 'User picker (multiple users)' custom field can list several people, which is not the assignee", + "jira": "corpus: jira-data-center/round4/M1-column.md 2.5 the assignee must be a single user (JRASERVER-5921 'Assign an issue to a group' closed as duplicate); 5.1 a 'User picker (multiple users)' custom field can list several people, which is not the assignee ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html the Assign Issue dropdown sets one assignee; https://confluence.atlassian.com/adminjiraserver/adding-custom-fields-1047552713.html 'User picker (multiple users) ... Allows selecting multiple users' as an extra field only (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'assignees M2M (:149)'; journeys.md 'assignees' plural set in the driven journey ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:126-139 assignee_ids dropdown with multiple; apps/api/plane/db/models/issue.py:149 assignees ManyToManyField" }, "built": { @@ -1515,7 +1560,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'a card is title, description, date, labels, assignees; there is no schema' ; source: lib/Db/Card.php has no priority ; source read at v1.19.0: lib/Db/Card.php:73-96 card fields hold no priority; searched lib/ and src/ for 'priority': only lib/Activity/Filter.php:47 and lib/Activity/SettingBase.php:55 (activity sort order), nothing on a card", "kanboard": "source: app/Filter/TaskPriorityFilter.php, app/Template/board/task_footer.php:135 renderPriority, app/Action/TaskAssignColorPriority.php ; corpus: kanboard/round4/M1-column.md 2.6 bulk 'change ... priority' ; source read at v1.2.54: app/Helper/TaskHelper.php:174-179 'Priority' select over the project range; app/Template/board/task_footer.php:135 renderPriority on the card; app/Filter/TaskPriorityFilter.php; app/Action/TaskAssignColorPriority.php:23", "openproject": "corpus: openproject/round4/M1-column.md 8.2 'IssuePriority as a separate administered vocabulary'; 3.9 custom action kinds include priority ; source read at v17.8.0: app/models/work_package.rb:64 belongs_to priority IssuePriority; app/models/issue_priority.rb:31; config/routes.rb:771 admin work_package_priorities; config/initializers/menus.rb:421-422 'Priorities' admin page", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'priority is a separate list'; 1.11 issue collector standard fields include 'Priority'", + "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'priority is a separate list'; 1.11 issue collector standard fields include 'Priority' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-fields-reference-939938743.html 'Syntax priority Field Type PRIORITY'; https://confluence.atlassian.com/adminjiraserver/translating-resolutions-priorities-statuses-and-issue-types-938847111.html names 'the priority field' as an issue constant (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'priority from PRIORITY_CHOICES urgent/high/medium/low/none' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:109-119 PriorityDropdown; apps/api/plane/db/models/issue.py:107 PRIORITY_CHOICES and :141-143 priority field" }, "built": { @@ -1544,7 +1589,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'the date:overdue filter listed the card' ; code-census.md 'duedate, three colour thresholds, one overdue job' ; source read at v1.19.0: src/components/card/DueDateSelector.vue:13 'Set a due date', :187-206 quick picks; src/components/cards/badges/DueDate.vue:67 overdue state on the card badge; src/components/overview/Overview.vue:59 'Overdue' column; lib/Db/Card.php:106 DUEDATE_OVERDUE", "kanboard": "corpus: kanboard/round4/M1-column.md 8.2 'yes' ; _round4/compare/promoted-rows-batch7.md 8.14 'the list and the board colour the date (task-date-overdue)' ; source read at v1.2.54: app/Helper/TaskHelper.php:235 'Due Date' field; app/Model/TaskCreationModel.php:63 date_due; app/Template/board/task_footer.php:62-66 task-date-overdue on the card; app/Template/task_list/task_icons.php:36 same in the list", "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package'; 8.2 'due date filters and a late indicator on the work package table' ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:129 due_date attribute; app/models/work_package.rb:285-287 overdue? when due_date is past and not closed; frontend/src/app/shared/components/fields/display/field-types/date-display-field.module.ts:63 overdue highlight class", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.6 'To schedule an issue, populate its Due date field'; 8.2 'overdue Find issues that were due before today'", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.6 'To schedule an issue, populate its Due date field'; 8.2 'overdue Find issues that were due before today' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/scheduling-an-issue-939938943.html 'You can schedule issue due dates in Jira Software'; 'To search for issues that are overdue at the time of the search, select the first radio button' (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 3.6 'Issue.target_date settable, sortable and filterable' and 8.2 'overdue styling is computed client side from target_date' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:184-196 target_date picker; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:308 due date turns red via shouldHighlightIssueDueDate, packages/utils/src/work-item/base.ts:172; apps/api/plane/db/models/issue.py:148 target_date. Overdue is computed client side only" }, "built": { @@ -1574,8 +1619,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'a start date, a due date' ; code-census.md Card 'startdate' ; source read at v1.19.0: src/components/card/StartDateSelector.vue:6 'Assign a start date to this card…', :12 'Set a start date', mounted at src/components/card/CardSidebarTabDetails.vue:21-23, :176 updateCardStartDate; lib/Db/Card.php:91 startdate; lib/Controller/CardController.php:67 update takes startdate", "kanboard": "source: app/Model/TaskCreationModel.php:64 date_started ; app/Action/TaskMoveColumnOnStartDate.php ; corpus: kanboard/round4/menu-tree.md 'the task's 26 detail fields' ; source read at v1.2.54: app/Helper/TaskHelper.php:229 'Start Date' field; app/Model/TaskCreationModel.php:64 date_started; app/Action/TaskMoveColumnOnStartDate.php:23 move once the start date is reached", "openproject": "corpus: openproject/round4/M1-column.md 3.6 'due_date on the work package, distinct from start_date and duration'; corpus: openproject/round4/journeys.md duration derivation ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:122-126 start_date attribute, validated against the soonest start; config/routes.rb:1007 work package pages whose date picker is served by app/controllers/work_packages/date_picker_controller.rb", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.3 'plans schedule on target start and target end dates' (Configure your Advanced Roadmaps plan settings)", - "plane": "corpus: plane/round4/code-census.md §2 'start_date and target_date DateFields (:147-148)'" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.3 'plans schedule on target start and target end dates' (Configure your Advanced Roadmaps plan settings) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configure-your-advanced-roadmaps-plan-settings-1044784158.html 'By default, target start and target end dates are used when scheduling issues in a plan' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 'start_date and target_date DateFields (:147-148)' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:165-177 start_date picker; apps/api/plane/db/models/issue.py:147 start_date DateField; apps/api/plane/app/views/issue/base.py:628 partial_update" }, "built": { "state": "built", @@ -1603,8 +1648,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.8 'labels per board with a colour ... Verified live: label Kap on card 6' ; source read at v1.19.0: src/components/card/TagSelector.vue:15-16 'Assign a tag to this card…', 'Select or create a tag…', mounted at src/components/card/CardSidebarTabDetails.vue:8-13, :187 addLabelToCard; lib/Controller/CardController.php:116 assignLabel, lib/Service/CardService.php:618", "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTag spoed and setTaskTags' ; source: app/Template/board/task_footer.php:28 tag colour ; source read at v1.2.54: app/Helper/TaskHelper.php:90-95 'Tags' field on the task form; app/Model/TaskTagModel.php:100 save; app/Template/board/task_footer.php:28 tag colour on the card; app/Controller/ProjectTagController.php:39 save a project tag", "openproject": "corpus: openproject/round4/M1-column.md 2.8 'no tag object on a work package. Nearest are app/models/category.rb:31 (project-scoped, single-valued) and a list custom field' ; source read at v17.8.0: searched app/models for 'tag', 'taggable', 'label_ids': no tag object on a work package; nearest app/models/category.rb:31-33 a project-scoped Category, and app/models/work_package.rb holds one category per work package", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.8 'Labels is a system field ... Allows adding labels to issues'; labels carry no colour of their own (card colours are per type, priority, assignee or query: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html)", - "plane": "corpus: plane/round4/M1-column.md 2.8 'label.py:11 workspace-scoped with an optional project, a self-FK parent, color and sort_order'" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.8 'Labels is a system field ... Allows adding labels to issues'; labels carry no colour of their own (card colours are per type, priority, assignee or query: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/adding-custom-fields-1047552713.html 'Labels STANDARD Allows adding labels to issues to facilitate issue categorization and search'; no colour is documented on a label (card colours go by type, priority, assignee or query) (read 2026-09-26)", + "plane": "corpus: plane/round4/M1-column.md 2.8 'label.py:11 workspace-scoped with an optional project, a self-FK parent, color and sort_order' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:147-157 label_ids dropdown; apps/web/core/components/issues/issue-layouts/properties/labels.tsx:155 coloured chip; apps/api/plane/db/models/label.py:11-21 Label with parent and color; apps/api/plane/db/models/issue.py:543-545 IssueLabel" }, "built": { "state": "built", @@ -1636,8 +1681,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md board sidebar 'tags' ; source: lib/Service/LabelService.php:87 delete, lib/Db/LabelMapper.php:62 deleteLabelAssignments removes it from every card ; source read at v1.19.0: src/components/board/TagsTabSidebar.vue:45 'Edit', :50 'Delete', :81 'Add a new tag'; lib/Service/LabelService.php:87 delete checks manage permission; lib/Db/LabelMapper.php:60-64 delete first removes the label from every card (deleteLabelAssignments)", "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'Tags management' and project 'Tags' ; source: app/Schema/Sqlite.php:305 task_has_tags FOREIGN KEY(tag_id) ON DELETE CASCADE ; source read at v1.2.54: app/Template/config/sidebar.php:19 'Tags management' for global tags; app/Controller/TagController.php:15 index; app/Controller/ProjectTagController.php:112 remove; app/Schema/Sqlite.php:301-305 task_has_tags FOREIGN KEY(tag_id) ON DELETE CASCADE", "openproject": "no label object (corpus: openproject/round4/M1-column.md 2.8); categories are administered per project (category.rb) but are single-valued and not labels ; source read at v17.8.0: no label set to administer: nearest is config/routes.rb:576 per project categories and app/controllers/categories_controller.rb:64-73 deleting a category reassigns or clears it on its work packages, but a category is single-valued and uncoloured, so not labels", - "jira": "docs: https://confluence.atlassian.com/display/JIRAKB/Delete+a+label+in+Jira 'To completely delete a label from a Jira instance, it must simply be removed from all the issues where it is used' via bulk 'Change Labels'; labels are free text with no managed set", - "plane": "corpus: plane/round4/menu-tree.md 'Settings ... Labels' ; source: apps/api/plane/db/models/issue.py:543-545 IssueLabel label FK on_delete=CASCADE, and bgtasks/deletion_task.py:18 soft_delete_related_objects cascades a soft delete to IssueLabel rows" + "jira": "docs: https://confluence.atlassian.com/display/JIRAKB/Delete+a+label+in+Jira 'To completely delete a label from a Jira instance, it must simply be removed from all the issues where it is used' via bulk 'Change Labels'; labels are free text with no managed set ; docs read 2026-09-26: https://support.atlassian.com/jira/kb/delete-a-label-in-jira/ 'Labels can't be deleted from Jira via UI and/or database'; open request JRASERVER-33672 'Improve the way Labels can be deleted in JIRA' (read 2026-09-26)", + "plane": "corpus: plane/round4/menu-tree.md 'Settings ... Labels' ; source: apps/api/plane/db/models/issue.py:543-545 IssueLabel label FK on_delete=CASCADE, and bgtasks/deletion_task.py:18 soft_delete_related_objects cascades a soft delete to IssueLabel rows ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/labels/page.tsx; apps/web/core/components/labels/project-setting-label-list.tsx:42 create, update, reorder and apps/web/core/components/labels/delete-label-modal.tsx:43 deleteLabel; apps/api/plane/app/views/issue/label.py:86 destroy; apps/api/plane/db/models/issue.py:545 IssueLabel.label on_delete CASCADE" }, "built": { "state": "built", @@ -1665,8 +1710,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card action menu '... and the share link' ; card route /board//card/ ; source read at v1.19.0: src/router.js:114 route /board/:id/card/:cardId/:tabId? opens the card; src/components/card/CardSidebar.vue:31 'Open in bigger view'; src/components/cards/CardMenuEntries.vue:18 'Card details'; lib/Service/CardService.php:671 getCardUrl builds the shareable link; searched src for 'Copy link', 'clipboard': none, so the link is the address bar URL", "kanboard": "corpus: kanboard/round4/menu-tree.md 'A task, as it opens' (TaskViewController page with its own URL) ; source read at v1.2.54: app/ServiceProvider/RouteProvider.php:118-119 routes 'task/:task_id' and 't/:task_id' to TaskViewController show; app/Template/task/sidebar.php:36 task page actions", "openproject": "every work package has its own URL /work_packages/ and the full view; corpus: openproject/round4/M1-column.md 2.1 'every work package has an instance-wide integer id' ; source read at v17.8.0: config/routes.rb:1007 /work_packages/:id show; app/controllers/work_packages_controller.rb:72 show; frontend/src/app/features/work-packages/routing/work-packages-routes.ts:30 WorkPackagesFullViewComponent the full page view", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'; 2.21 'You can easily keep your team informed by sharing issues with them via email'", - "plane": "corpus: plane/round4/open-core.md 'apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx' ; source: quick-action-dropdowns/helper.tsx:107 copyUrlToClipboard(generateWorkItemLink) 'Copy work item link'" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.1 'Jira issue keys ... are of the format -'; 2.21 'You can easily keep your team informed by sharing issues with them via email' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/editing-and-collaborating-on-issues-939938928.html 'You can easily keep your team informed by sharing issues with them via email ... select the Share button'; each issue has its key URL (read 2026-09-26)", + "plane": "corpus: plane/round4/open-core.md 'apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx' ; source: quick-action-dropdowns/helper.tsx:107 copyUrlToClipboard(generateWorkItemLink) 'Copy work item link' ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx full page route per work item key; apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx:88,203 generateWorkItemLink and 'copy_link' action; apps/api/plane/app/views/issue/base.py:628 viewset serves the item" }, "built": { "state": "built", @@ -1694,8 +1739,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search ... Verified live' ; M1-column.md 9.1 'Dorpsstraat found the card' ; source read at v1.19.0: src/components/Controls.vue:65-72 board search field with 'Clear search'; lib/AppInfo/Application.php:136-137 registers DeckProvider and CardCommentProvider for unified search; lib/Search/DeckProvider.php:38 search, lib/Service/SearchService.php:35 searchCards", "kanboard": "corpus: kanboard/round4/M1-column.md 9.1 'the header search box (SearchController::index) runs the same query language across every project' ; source read at v1.2.54: app/Template/dashboard/overview.php:5-9 search box posting to SearchController; app/Controller/SearchController.php:16 index; app/ServiceProvider/FilterProvider.php:227-231 TaskSearchFilter and TaskTitleFilter as the default text match", "openproject": "corpus: openproject/round4/M1-column.md 9.1 'app/controllers/search_controller.rb over eight registered searchables: work packages ...' ; source read at v17.8.0: config/routes.rb:326 search; app/controllers/search_controller.rb:141 search_types from lib/redmine/search.rb:43; app/models/work_package.rb:152 acts_as_searchable over subject and description; frontend/src/app/core/global_search/global-search-work-packages.component.ts the header search results", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'start typing to search through all your issues and projects'; 4.17 'the text field allows you to search all text fields'", - "plane": "corpus: plane/round4/code-census.md §9 'Issues [\"name\", \"sequence_id\", \"project__identifier\"]' and 'Descriptions are not searched ... Nor are comments'; title and key only" + "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'start typing to search through all your issues and projects'; 4.17 'the text field allows you to search all text fields' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/quick-searching-939938728.html 'The Search box is located at the top right of your screen ... just start typing what you're looking for'; https://confluence.atlassian.com/jirasoftwareserver/search-syntax-for-text-fields-939938747.html (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §9 'Issues [\"name\", \"sequence_id\", \"project__identifier\"]' and 'Descriptions are not searched ... Nor are comments'; title and key only ; source read at v1.4.2: apps/web/core/components/power-k/ui/modal/search-menu.tsx:51 searchWorkspace from the command palette; apps/api/plane/app/urls/search.py:13 search route; apps/api/plane/app/views/search/base.py:83-94 filter_issues matches name, sequence_id, project__identifier with icontains only, no description or comment text" }, "built": { "state": "none", @@ -1723,8 +1768,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.6 'no multi-select on a board ... grep bulk|batch lib/Controller returns 0 hits' ; 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 as \"done\"' with src/stores/stack.js:122-127 marking every open card in the list done; no selection of several cards: searched src/ for 'multiSelect', 'selectedCards', 'bulk': none", "kanboard": "corpus: kanboard/round4/M1-column.md 2.6 'TaskBulkController, TaskBulkChangePropertyController ... change assignee, category, color, priority, or move a set of tasks' ; source read at v1.2.54: app/Template/task_list/header.php:20 'Move selected tasks to another column or swimlane', :23 'Edit tasks in bulk'; app/Template/task_bulk_change_property/show.php:25 assignee, :54 'Just add these tag(s)'; app/Template/board/table_column.php:41 'Close all tasks in this column and this swimlane'", "openproject": "corpus: openproject/round4/M1-column.md 2.6 'bulk edit, move, copy and delete on a work package selection' ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts:60-72 'Bulk edit', 'Bulk move', 'Bulk duplicate' on a selection; config/routes.rb:999 work_packages bulk edit, update, destroy; app/controllers/work_packages/bulk_controller.rb", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.6 'You can do this by performing a bulk change operation' with edit, move, delete, watch and transition", - "plane": "corpus: plane/round4/open-core.md 'use-bulk-operation-status.ts:7 ... export const useBulkOperationStatus = () => false;' ; M1-column.md 2.6 no. 'Full Time Tracking + Bulk Ops' is a Pro string, absent from Community" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.6 'You can do this by performing a bulk change operation' with edit, move, delete, watch and transition ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/editing-multiple-issues-at-the-same-time-939938937.html 'At some point, you may need to change multiple issues at the same time. You can do this by performing a bulk change operation' (read 2026-09-26)", + "plane": "corpus: plane/round4/open-core.md 'use-bulk-operation-status.ts:7 ... export const useBulkOperationStatus = () => false;' ; M1-column.md 2.6 no. 'Full Time Tracking + Bulk Ops' is a Pro string, absent from Community ; source read at v1.4.2: apps/web/core/hooks/use-bulk-operation-status.ts:7 returns false, read at apps/web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx:66; apps/web/core/services/issue/issue.service.ts:340 calls a 'bulk-operation-issues' route that apps/api/plane/app/urls/issue.py does not define; bulk delete modal at apps/web/core/components/modals/work-item-level.tsx:104 has no opener" }, "built": { "state": "none", @@ -1752,8 +1797,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.1 'comments on a card through the platform's comments app ... Verified live' ; source read at v1.19.0: src/components/card/CardSidebar.vue:63-68 'Comments' tab mounts CardSidebarTabComments; src/components/card/CommentForm.vue:8 NcRichContenteditable, :91 1000 character limit; lib/Service/CommentService.php:97 create over the platform comments manager; appinfo/routes.php:171-174 comments API", "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown with edit and delete ... Verified live' ; source read at v1.2.54: app/Template/task/sidebar.php:56 'Add a comment'; app/Controller/CommentController.php:42 save, :97 update, :145 remove; app/Template/comment/show.php:54 edit and remove for the author or an admin", "openproject": "corpus: openproject/round4/M1-column.md 6.1 'a comment is a journal with notes ... written by app/services/journals/create_service.rb' ; source read at v17.8.0: app/components/work_packages/activities_tab/journals/new_component.html.erb:24 'type to comment' and :32 submit comment; config/initializers/permissions.rb:359 add_work_package_comments; app/services/journals/create_service.rb:86 create_journal with notes", - "jira": "corpus: jira-data-center/round4/M1-column.md 6.1 'You can add and manage comments in the issue view'", - "plane": "corpus: plane/round4/M1-column.md 6.1 'IssueComment with comment_json, comment_html ... parent threading'" + "jira": "corpus: jira-data-center/round4/M1-column.md 6.1 'You can add and manage comments in the issue view' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/editing-and-collaborating-on-issues-939938928.html 'learning about the basics of editing and commenting on an issue ... Using the wiki toolbar to make your comments and descriptions pop' (read 2026-09-26)", + "plane": "corpus: plane/round4/M1-column.md 6.1 'IssueComment with comment_json, comment_html ... parent threading' ; source read at v1.4.2: apps/web/core/components/comments/comment-create.tsx:66 createComment; apps/api/plane/app/urls/issue.py:157 comments route; apps/api/plane/db/models/issue.py:451 IssueComment with parent at :475 for threading" }, "built": { "state": "built", @@ -1781,8 +1826,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.10 'an attachment of type file is a Files node' ; journeys.md 3 'The attachment turns out to be a file' ; menu-tree.md Attachments '(upload, or attach a file from Files)' ; source read at v1.19.0: src/components/card/AttachmentList.vue:10 'Upload new files', :13 'Share from Files' opening the platform file picker at :230-231, :65 'Show in Files'; lib/Service/FilesAppService.php:39 attachment of type file backed by a Files share; appinfo/routes.php:66 attachment#create", "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskFile with a base64 blob, read back with its path under tasks/3/' ; M1-column.md 4.23 'no' : files upload into Kanboard's own store, there is no organisation file store to pick from ; source read at v1.2.54: app/Template/task/sidebar.php:61 'Attach a document', :64 'Add a screenshot'; app/Controller/TaskFileController.php:52 save; app/Model/TaskFileModel.php:59-61 stored under Kanboard's own 'tasks' prefix, app/Model/FileModel.php:284; searched app/ for a picker on an outside file store: none", "openproject": "corpus: openproject/round4/M1-column.md 1.10 'modules/storages/app/models/storages/file_link.rb:35-40 links a remote Nextcloud, OneDrive or SharePoint file to a work package'; 4.23 'Nextcloud is free, the other two are Enterprise gated' ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component.ts Files tab with the storage file picker; modules/storages/app/models/storages/file_link.rb:35-39 a file link on a WorkPackage; modules/storages/lib/open_project/storages/engine.rb:198 manage_file_links; modules/storages/app/models/storages/storage.rb:93 Nextcloud needs no token, one_drive_storage.rb and sharepoint_storage.rb gate on :one_drive_sharepoint_file_storage", - "jira": "corpus: jira-data-center/round4/M1-column.md 1.10 'Jira is not hosted in a platform with files or chat of its own; attachments are Jira's'; 4.22 upload by drag and drop, so files are uploaded copies, not links into a file store", - "plane": "corpus: plane/round4/code-census.md §4 FileAsset ISSUE_ATTACHMENT uploaded presigned to S3 ; M1-column.md 4.22 drag and drop upload. Files are uploaded copies; there is no link to an organisation file store (M1-column.md 4.23 'no file manager')" + "jira": "corpus: jira-data-center/round4/M1-column.md 1.10 'Jira is not hosted in a platform with files or chat of its own; attachments are Jira's'; 4.22 upload by drag and drop, so files are uploaded copies, not links into a file store ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/attaching-files-and-screenshots-to-issues-939938913.html 'you can attach documents, images, and screenshots to your Jira application issues': uploaded copies, no link to an organisation file store (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §4 FileAsset ISSUE_ATTACHMENT uploaded presigned to S3 ; M1-column.md 4.22 drag and drop upload. Files are uploaded copies; there is no link to an organisation file store (M1-column.md 4.23 'no file manager') ; source read at v1.4.2: apps/web/core/components/issues/attachment/attachment-upload.tsx:41 useDropzone upload; apps/api/plane/app/urls/issue.py:138 attachments route, apps/api/plane/app/views/issue/attachment.py:100 post; apps/api/plane/db/models/asset.py:36-37 ISSUE_ATTACHMENT context. Uploaded copies only, no picker for an organisation file store" }, "built": { "state": "built", @@ -1810,8 +1855,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.9 'the activity tab on the card, with the 39 subjects ... Verified live' ; 2.16 description before and after ; source read at v1.19.0: src/components/card/CardSidebar.vue:74-78 'Activity' tab, src/components/card/CardSidebarTabActivity.vue:7-12 activity list filtered to object deck_card; lib/Activity/ActivityManager.php:68-94 card subjects (title, description, due date, stack, assign, label, attachment), :412 description before and after (platform activity)", "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 'an Activity stream tab and a Transitions tab ... with author and time' ; 2.16 'The previous value of a field is not kept' ; source read at v1.2.54: app/Template/task/sidebar.php:10 'Activity stream', :13 'Transitions'; app/Controller/ActivityController.php:50 task; app/Controller/TaskViewController.php:133-140 transitions from transitionModel getAllByTask; the previous value of an edited field is not kept", "openproject": "corpus: openproject/round4/M1-column.md 10.9 'the Activity tab, rendering journals with ten detail kinds and 14 typed causes' ; source read at v17.8.0: app/components/work_packages/activities_tab/journals/item_component.html.erb:2-7 one entry per journal with its changes; app/components/work_packages/activities_tab/journals/filter_and_sorting_component.rb filter to changes only; app/services/journals/create_service.rb:45 journals written on every save", - "jira": "corpus: jira-data-center/round4/M1-column.md 10.9 'The History tab of an issue records ... changes to an issue field'", - "plane": "corpus: plane/round4/M1-column.md 10.9 'the activity feed on the work item, from IssueActivity with actor, verb, field, old and new value'" + "jira": "corpus: jira-data-center/round4/M1-column.md 10.9 'The History tab of an issue records ... changes to an issue field' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/working-with-issues-939938901.html 'The History tab of an issue records the following information: creator of the issue ... changes to an issue field' (read 2026-09-26)", + "plane": "corpus: plane/round4/M1-column.md 10.9 'the activity feed on the work item, from IssueActivity with actor, verb, field, old and new value' ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/main-content.tsx:184 IssueActivity feed; apps/api/plane/app/urls/issue.py:150 history route; apps/api/plane/db/models/issue.py:415 IssueActivity with actor, field, old and new value" }, "built": { "state": "built", @@ -1839,8 +1884,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.10 'No sub-cards and no hierarchy; a checklist in the description is the nearest child' ; source read at v1.19.0: lib/Db/Card.php:73-96 no parent field; searched lib/Db and src/ for 'subtask', 'parentId', 'parent_id', 'childCard': only src/services/CommentApi.js:27 (comment replies); the nearest child is the markdown checklist, src/components/cards/CardBadges.vue:23-25", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Add a sub-task' ; M1-column.md 3.3 'subtasks ... with a status of todo, in progress or done, an assignee and a time estimate' ; source read at v1.2.54: app/Template/task/sidebar.php:43 'Add a sub-task'; app/Template/subtask/create.php:19-20 assignee and time estimate; app/Controller/SubtaskController.php:65 save; app/Model/SubtaskModel.php:28-30 todo, in progress, done", "openproject": "corpus: openproject/round4/M1-column.md 2.10 'hierarchy is a separate closure table, WorkPackageHierarchy' ; source read at v17.8.0: config/locales/js-en.yml:790 'Add child', :792 'Create new child'; app/contracts/work_packages/base_contract.rb:91 parent_id; app/models/work_package.rb:179 has_closure_tree; app/controllers/work_package_hierarchy_relations_controller.rb", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'Sub-tasks are generally used to split up a parent issue into a number of tasks' (one level only)", - "plane": "corpus: plane/round4/code-census.md §2 'Issue.parent gives sub-issues; the endpoint is apps/api/plane/app/urls/issue.py:105'" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'Sub-tasks are generally used to split up a parent issue into a number of tasks' (one level only) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-sub-tasks-938847874.html 'Sub-tasks are generally used to split up a parent issue into a number of tasks which can be assigned and tracked separately' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 'Issue.parent gives sub-issues; the endpoint is apps/api/plane/app/urls/issue.py:105' ; source read at v1.4.2: apps/web/core/components/issues/issue-detail-widgets/sub-issues/title-actions.tsx:114 add sub-work item button; apps/api/plane/app/urls/issue.py:105 sub-issues route, apps/api/plane/app/views/issue/sub_issue.py:204 post; apps/api/plane/db/models/issue.py:114 parent FK" }, "built": { "state": "built", @@ -1864,15 +1909,15 @@ "planninq": "no", "nextcloud-deck": "yes", "openproject": "partial", - "plane": "no", + "plane": "partial", "kanboard": "yes", - "jira": "no", + "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.3 'a markdown task list in the description renders as checkboxes with a progress badge on the card ... Verified live: card 22' ; source read at v1.19.0: src/components/card/Description.vue:70 and :85 markdown-it-task-checkbox renders '- [ ]' items as clickable checkboxes; src/components/cards/CardBadges.vue:23-25 'Todo items' badge with checked/total, :75-78 counts; stored in the card description, lib/Db/Card.php:74", "kanboard": "corpus: kanboard/round4/M1-column.md 3.3 'subtasks are a checklist on a task' ; source: app/Template/board/task_footer.php:98-99 completion percentage on the card ; source read at v1.2.54: app/Template/subtask/create.php:24 'Create another sub-task' for quick list entry; app/Controller/SubtaskStatusController.php:18 change toggles a subtask's status; app/Template/board/task_footer.php:98-99 completion percentage on the card", "openproject": "corpus: openproject/round4/M1-column.md 3.3 'ls app/models | grep -i checklist returns nothing. Nearest is a child work package per item'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): the bundled CKEditor (frontend/src/vendor/ckeditor/ckeditor.js) carries todoList and todoListChecked, so a description can hold ticked checkboxes as text (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM 'tasklist' extension and lib/open_project/text_formatting/filters/task_list_filter.rb:31 render ticked boxes in a description; searched app/models for 'checklist': none, so no checklist object with progress", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.3 'no checklist object ... JRASERVER-47605 (To-do lists (checkbox) for description field on tickets), Gathering Interest, 1028 votes'; checklists are Marketplace apps", - "plane": "corpus: plane/round4/code-census.md §3 'No checklist model. Sub-tasks are ordinary issues with parent set'" + "jira": "corpus: jira-data-center/round4/M1-column.md 3.3 'no checklist object ... JRASERVER-47605 (To-do lists (checkbox) for description field on tickets), Gathering Interest, 1028 votes'; checklists are Marketplace apps ; 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 (checkbox) for description field on tickets', Gathering Interest, 1027 votes; https://marketplace.atlassian.com/apps/1211562/checklists-for-jira-enterprise-by-herocoders paid app 'create ToDo lists ... on Jira issues', build 7.2.11.11 compatible to Jira 11.3.11 (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §3 'No checklist model. Sub-tasks are ordinary issues with parent set' ; 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 packages/editor/src/core/extensions/slash-commands/command-items-list.tsx:150; the work item description uses it via apps/web/core/components/issues/issue-modal/components/description-editor.tsx:184 RichTextEditor. Checkboxes in the description text, no checklist object or progress count; searched apps/api/plane/db/models for 'checklist': only apps/api/plane/db/models/workspace.py:211 onboarding" }, "built": { "state": "none", @@ -1900,8 +1945,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'recurr|repeat' 0 hits ; M1-column.md 1.8 'no' ; source read at v1.19.0: searched lib/ and src/ for 'recurr', 'repeat', 'rrule': only CSS background-repeat, src/components/cards/CardCover.vue:86, and SVG animation; lib/Db/Card.php:73-96 no schedule field", "kanboard": "corpus: kanboard/round4/M1-column.md 1.8 'recurrence_* ... RecurringTaskSubscriber clones it on close ... Verified live' ; journeys.md 3 ; source read at v1.2.54: app/Template/task/sidebar.php:39 'Edit recurrence'; app/Template/task_recurrence/edit.php:25-35 trigger, factor and timeframe for the next due date; app/Subscriber/RecurringTaskSubscriber.php:15,26 onClose duplicates; app/Model/TaskRecurrenceModel.php:81 duplicateRecurringTask", "openproject": "corpus: openproject/round4/M1-column.md 1.8 'grep -rn recurring.*work_package ... returns nothing. Recurrence exists only for meetings' ; source read at v17.8.0: searched app/models and app/services for 'recurr': only meetings, app/models/project.rb:108 recurring_meetings and modules/meeting/app/models/recurring_meeting.rb:31; nothing for work packages", - "jira": "corpus: jira-data-center/round4/M1-column.md 1.8 Automation 'scheduled trigger' with actions 'creating sub-tasks' and creating issues (rated yes there for planned cases); a rule an admin writes, not a repeat setting on the task", - "plane": "corpus: plane/round4/code-census.md §1 'Recurring issues: absent', grep recurring returns one celery comment ; source: grep -rli recurr apps/web/core hits only license/modal upsell files" + "jira": "corpus: jira-data-center/round4/M1-column.md 1.8 Automation 'scheduled trigger' with actions 'creating sub-tasks' and creating issues (rated yes there for planned cases); a rule an admin writes, not a repeat setting on the task ; docs read 2026-09-26: https://confluence.atlassian.com/automation/jira-automation-triggers-993924804.html 'Scheduled ... This executes a rule on a specified schedule'; https://confluence.atlassian.com/automation/jira-automation-actions-993924834.html actions 'Clone issue', 'Create issue': a rule an admin writes, not a repeat setting on the task (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §1 'Recurring issues: absent', grep recurring returns one celery comment ; source: grep -rli recurr apps/web/core hits only license/modal upsell files ; source read at v1.4.2: searched apps/api/plane --include=*.py for 'recurr', 'rrule': one comment at apps/api/plane/celery.py:45; searched apps/web/core for 'recurr': only upsell files such as apps/web/core/components/license/modal/upgrade-modal.tsx" }, "built": { "state": "none", @@ -1929,8 +1974,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/usability.md 'cards with a title, a markdown description' ; menu-tree.md 'the markdown description with checkboxes' ; source read at v1.19.0: src/components/card/Description.vue:47-53 VueEasymde markdown editor, :69-87 markdown-it renders headings, lists, task checkboxes and links, :120 uses the Text app editor when installed, :45 'Write a description …'; lib/Db/Card.php:74 description", "kanboard": "source: app/Helper/TextHelper.php:5,43 Markdown transformation of descriptions and comments ; corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown' ; source read at v1.2.54: app/Helper/TaskHelper.php:63 description uses the textEditor; app/Helper/FormHelper.php:228 textEditor, assets/js/components/text-editor.js:79 editor with preview; app/Helper/TextHelper.php:43-49 Markdown rendering", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/wysiwyg/README.md:27 'The CKEditor5 build in OpenProject supports basic text styles, such as bold and italic formatting, headings' and :63 Markdown '#, ##, ###' (GFM tables :50) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts the CKEditor 5 field on descriptions and comments; lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM with table, autolink and tasklist, so text is stored as Markdown", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html Visual mode 'gives you a What You See Is What You Get (WYSIWYG) experience' and 'you can still enter wiki markup syntax'", - "plane": "corpus: plane/round4/code-census.md §2 description_json / description_html; usability.md driven editor ; source: packages/editor rich text editor with markdown copy (i18n 'Copy markdown')" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html Visual mode 'gives you a What You See Is What You Get (WYSIWYG) experience' and 'you can still enter wiki markup syntax' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html 'Formatting content in Visual mode gives you a What You See Is What You Get (WYSIWYG) experience' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 description_json / description_html; usability.md driven editor ; source: packages/editor rich text editor with markdown copy (i18n 'Copy markdown') ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/description-editor.tsx:23,184 RichTextEditor for the description; packages/editor/src/core/extensions/extensions.ts:65 CoreEditorExtensions with lists and task lists; apps/api/plane/db/models/issue.py:137-138 description_json and description_html" }, "built": { "state": "built", @@ -1958,8 +2003,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Comments (the platform's comments with mentions)' ; code-census.md notification kinds 'card-comment-mentioned' ; source read at v1.19.0: src/components/card/CommentForm.vue:8-12 NcRichContenteditable with member autocomplete at :81-82; lib/Listeners/CommentEventListener.php:65 calls lib/Notification/NotificationHelper.php:178-204 sendMention, notifying each mentioned board member", "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies (comment.user.mention, UserMentionJob)' ; source read at v1.2.54: app/Helper/FormHelper.php:250 '@' trigger suggests project users in the editor; app/Job/CommentEventJob.php:45-46 queues UserMentionJob; app/Model/CommentModel.php:31 comment.user.mention; app/Subscriber/NotificationSubscriber.php:34 notifies", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'you will be notified about important changes ... new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/notifications/create_from_model_service.rb:33 parses '' and :41 group mentions from the saved text; app/models/notification.rb:33 reason 'mentioned'; frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts sets up the editor that inserts the mention", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html notification types include 'mentions'; @mention in comments generates an email to the mentioned user (Configuring email notifications, corpus: jira-data-center/round4/M1-column.md 6.8)", - "plane": "corpus: plane/round4/code-census.md §6 'IssueMention (issue.py:323)' and UserNotificationPreference 'mention' boolean ; source: apps/api/plane/bgtasks/notification_task.py:84-111 mentions become subscribers and are notified" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html notification types include 'mentions'; @mention in comments generates an email to the mentioned user (Configuring email notifications, corpus: jira-data-center/round4/M1-column.md 6.8) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/editing-and-collaborating-on-issues-939938928.html 'you can mention them by typing @ and their usernames in the issue description or comment'; https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'When you're mentioned in an issue ... a mention will be included in the email' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §6 'IssueMention (issue.py:323)' and UserNotificationPreference 'mention' boolean ; source: apps/api/plane/bgtasks/notification_task.py:84-111 mentions become subscribers and are notified ; source read at v1.4.2: apps/web/core/components/editor/lite-text/editor.tsx:105-106 searchEntity feeds the @ mention menu in the comment editor; apps/api/plane/bgtasks/notification_task.py:37-50 IssueMention rows and :157-160 create_mention_notification sender 'mentioned'; apps/api/plane/db/models/issue.py:323 IssueMention" }, "built": { "state": "built", @@ -1991,8 +2036,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.13 'card#reorder moves a card to another stack or board; the UI offers Move card' ; source read at v1.19.0: src/components/cards/CardMenuEntries.vue:57 'Move/copy card'; src/CardMoveDialog.vue:9 'Select a board', :18 'Select a list', :26 'Move card', :104-107 moveCard; lib/Service/CardService.php:436-440 reorder to a stack on another board after edit checks on both", "kanboard": "corpus: kanboard/round4/menu-tree.md task actions 'Move to project' ; 'Duplicate to project' ; source read at v1.2.54: app/Template/task/sidebar.php:77 'Move to project', :72 'Duplicate to project'; app/Controller/TaskDuplicationController.php:47 move, :84 copy", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/work-packages/duplicate-move-delete/README.md:5 'How to duplicate, move to another project or delete a work package'; corpus: openproject/round4/M1-column.md 2.6 bulk move (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts:66-68 'Move' action; config/routes.rb:1016-1021 work package move routes; app/controllers/work_packages/moves_controller.rb:47 create, :143-144 target project must be allowed_target_projects_on_move", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.13 'The Move issue wizard allows you to choose any other project in your Jira instance to move your selected issue to'", - "plane": "source: apps/api/plane/app/serializers/issue.py:100 project_id read_only=True; apps/web/core/components/issues/issue-modal/form.tsx:368 project select disabled={!!data?.id || !!data?.sourceIssueId}; 'move_to_project' exists only for workspace drafts (workspace-draft/draft-issue-block.tsx:83)" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.13 'The Move issue wizard allows you to choose any other project in your Jira instance to move your selected issue to' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/moving-an-issue-939938939.html 'you may want to move this issue to a different project. You can easily do this using the Move issue wizard' (read 2026-09-26)", + "plane": "source: apps/api/plane/app/serializers/issue.py:100 project_id read_only=True; apps/web/core/components/issues/issue-modal/form.tsx:368 project select disabled={!!data?.id || !!data?.sourceIssueId}; 'move_to_project' exists only for workspace drafts (workspace-draft/draft-issue-block.tsx:83) ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/form.tsx:368 project select disabled for an existing item; apps/api/plane/app/serializers/issue.py:100 project_id read_only; searched apps/api/plane/app/urls/issue.py and apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx for 'move_to_project', 'transfer': none" }, "built": { "state": "none", @@ -2020,8 +2065,8 @@ "nextcloud-deck": "the only card-to-card link is a dependency (corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 2.26 'one typed link, card dependencies ... No declared types beyond it'); a card link pasted in a description renders through the reference provider (code-census.md 'reference (4)') ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards' is the only typed card link; src/components/card/CardSidebarTabDetails.vue:34-38 NcCollectionList relates a card to other resources but only when the platform projects feature is on (:92 projects_enabled); lib/AppInfo/Application.php:45 CardReferenceProvider previews a pasted card link", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 2.26 'links holds label pairs with opposite_id (11 shipped: relates to, blocks / is blocked by ...)' ; source read at v1.2.54: app/Template/task/sidebar.php:48 'Add internal link'; app/Template/task_internal_link/create.php:10-13 label and task; app/Schema/Sqlite.php:961 seeds 'relates to'; app/Controller/TaskInternalLinkController.php:48 save", "openproject": "corpus: openproject/round4/M1-column.md 2.10 'Relations are app/models/relation.rb:31 with eleven typed entries' (relates to among them) ; source read at v17.8.0: app/models/relation.rb:35 TYPE_RELATES and :55-57 'related to' among the typed relations, non-scheduling; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; config/locales/en.yml:3609 'related to'", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may relate to another. An issue may duplicate another. An issue may block another'", - "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices 'duplicate, relates_to, blocked_by, ...'" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may relate to another. An issue may duplicate another. An issue may block another' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'An issue may relate to another. An issue may duplicate another. An issue may block another' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices 'duplicate, relates_to, blocked_by, ...' ; source read at v1.4.2: apps/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx:38-40 opens the relation modal; apps/web/core/components/relations/index.tsx:13-14 relates_to option; apps/api/plane/app/urls/issue.py:236 issue-relation route; apps/api/plane/db/models/issue.py:272-274 IssueRelationChoices RELATES_TO" }, "built": { "state": "built", @@ -2054,8 +2099,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.5 'no mail intake: grep imap|mailbox|message_id lib returns 0 hits' ; source read at v1.19.0: searched lib/ for 'imap', 'mailbox', 'message_id', 'IMailer': only mail wording in lib/Activity/SettingBase.php, lib/Activity/SettingChanges.php and lib/Service/AttachmentService.php, no mail intake; appinfo/routes.php:47 cards are created only through the web and API routes", "kanboard": "corpus: kanboard/round4/M1-column.md 1.5 'no' ; open-core.md 'Mailgun, Postmark, Sendgrid | 1.5, mail in | nothing' (third-party plugins only) ; source read at v1.2.54: searched app/ (outside Locale) for 'imap', 'inbound', 'receiveEmail', 'EmailHandler': none; mail in is the third-party Mailgun, Postmark and Sendgrid plugins", "openproject": "corpus: openproject/round4/M1-column.md 1.5 'the work package handler creates at handlers/work_package.rb:73 ... Transports are IMAP, POP3 and Gmail' ; source read at v17.8.0: app/services/incoming_emails/handlers/work_package.rb:56 default creates a new work package, :73-76 receive_new_work_package; config/initializers/menus.rb:595 admin 'Incoming emails' settings", - "jira": "corpus: jira-data-center/round4/M1-column.md 1.5 'Jira can receive emails from licensed users to create issues or add comments'", - "plane": "corpus: plane/round4/code-census.md §1 'Email intake: absent', grep email.?intake|mailbox|imap 0 hits; SourceType has one value IN_APP" + "jira": "corpus: jira-data-center/round4/M1-column.md 1.5 'Jira can receive emails from licensed users to create issues or add comments' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/creating-issues-and-comments-from-email-938847641.html 'Jira can receive emails from licensed users to create issues or add comments and attachments' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §1 'Email intake: absent', grep email.?intake|mailbox|imap 0 hits; SourceType has one value IN_APP ; source read at v1.4.2: apps/api/plane/db/models/intake.py:38-39 SourceType has only IN_APP; searched apps/api/plane --include=*.py for 'email.?intake', 'inbound.?email', 'mailbox', 'imap': none" }, "built": { "state": "none", @@ -2083,8 +2128,8 @@ "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source: grep -rniF 'backlog' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'backlog': none; lib/Db/Card.php:77 every card belongs to a stack, so every card sits on the board; src/router.js:79 a board is the only card container", "kanboard": "source: app/Model/BoardModel.php:23 default columns 'Backlog', 'Ready', 'Work in progress', 'Done' : the backlog is the first column on the board, not a separate list ; corpus: kanboard/round4/journeys.md 5 column restriction 'Backlog' ; source read at v1.2.54: app/Model/BoardModel.php:23 default columns start with 'Backlog': the backlog is the first board column; searched app/Controller for a separate backlog view: none", "openproject": "corpus: openproject/round4/menu-tree.md 'Inside a project > Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:14 'record and prioritize work packages in sprints and the backlog' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:65 project backlog page and :73 backlog buckets; modules/backlogs/app/components/backlogs/inbox_component.rb:32 'Backlog inbox', modules/backlogs/config/locales/en.yml:53, of unplanned work packages; modules/backlogs/app/controllers/backlogs/backlog_controller.rb:40 show", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'The Kanban backlog shows issues in both Backlog and Selected for Development sections' and team members can 'focus on your work-in-progress on the Kanban board, without the distraction of items in planning'", - "plane": "corpus: plane/round4/code-census.md §2 state groups 'backlog, unstarted, started, completed, cancelled, triage'; the backlog is a state group shown as board columns unless filtered out, not a separate list apart from the board. Intake (off by default) is a triage queue, not a backlog (menu-tree.md)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'The Kanban backlog shows issues in both Backlog and Selected for Development sections' and team members can 'focus on your work-in-progress on the Kanban board, without the distraction of items in planning' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'sample Kanban backlog ... with Backlog and Selected for Development as board columns'; team members focus on the Kanban board 'without the distraction' of the backlog (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 state groups 'backlog, unstarted, started, completed, cancelled, triage'; the backlog is a state group shown as board columns unless filtered out, not a separate list apart from the board. Intake (off by default) is a triage queue, not a backlog (menu-tree.md) ; source read at v1.4.2: apps/api/plane/db/models/state.py:15 BACKLOG is a state group; apps/api/plane/utils/issue_filters.py:298-300 display type 'backlog' narrows to that group, offered in packages/constants/src/issue/filter.ts:121 type active or backlog. The backlog is a filter over the same layouts, not a separate list apart from the board" }, "built": { "state": "specified", @@ -2112,8 +2157,8 @@ "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source read at v1.19.0: no backlog to move from: searched lib/ and src/ for 'backlog': none; lib/Db/Card.php:77 a card always carries a stackId, so it is on the board from creation", "kanboard": "moving a task out of the Backlog column is a column move (corpus: kanboard/round4/journeys.md 1 moveTaskPosition); no separate backlog to plan from ; source read at v1.2.54: app/Model/BoardModel.php:23 Backlog is a board column; moving out of it is a column move, assets/js/src/BoardDragAndDrop.js:37 and app/Template/task_list/header.php:20 'Move selected tasks to another column or swimlane'; no separate backlog to plan from", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:234 'Your sprint is set in motion by clicking the Start sprint button ... it will open the sprint board'; basic boards add an existing work package as a card (agile-boards README:139) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:105-107 move and move_to_sprint_dialog; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:71 move to sprint, :97-103 move via Backlogs::WorkPackages::UpdateService; modules/backlogs/app/services/backlogs/sprints/start_service.rb:66 starting the sprint builds its board, which shows the moved work package", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board'", - "plane": "corpus: plane/round4/code-census.md §2 State group; moving a work item from a backlog-group state to an unstarted or started state is an ordinary state change (drag or state menu)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 State group; moving a work item from a backlog-group state to an unstarted or started state is an ordinary state change (drag or state menu) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:136,171 drop a card from a backlog-group column into another state column; apps/web/core/components/issues/issue-modal/components/default-properties.tsx:90 state_id dropdown; apps/api/plane/app/views/issue/base.py:628 partial_update; apps/api/plane/db/models/state.py:15 BACKLOG group" }, "built": { "state": "specified", @@ -2141,8 +2186,8 @@ "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; the board filter (menu-tree.md) filters columns, there is no backlog list ; source read at v1.19.0: no backlog list: searched lib/ and src/ for 'backlog': none; the only filter is the board filter in src/components/Controls.vue:65-72, which filters the columns, and searched Controls.vue for 'sort': only the label list at :394", "kanboard": "corpus: kanboard/round4/menu-tree.md 'List' view with the filter dropdown and query language (usability.md 'runs the board, the list, the saved filters'), sortable; not a backlog of its own ; source read at v1.2.54: app/Template/task_list/sort_menu.php:5-20 List view sort by id, swimlane, column, category, position; app/Template/app/filters_helper.php:6-15 filter menu; the backlog is a column, reached with a column: query, app/Filter/TaskColumnFilter.php; not a backlog of its own", "openproject": "docs: opf/openproject v17.8.0 docs/user-guide/backlogs-scrum/README.md:103 'The all backlog buckets button is a multi-select dropdown that allows you to filter for buckets within your backlog' and :239 all sprints filter, so released 17.8 filters containers, not the work packages in them; work package filters for backlogs arrive in 17.9.0 (docs/release-notes/17-9-0 release_date 2026-09-30, not yet released on 2026-09-26, present only in the 18.0-dev tree); ordering is by drag (round-4 drive on 16.6.10) ; source read at v17.8.0: modules/backlogs/app/controllers/backlogs/backlog_filters.rb:32-39 the backlog filter holds only bucket_ids, sprint_ids and show_all; modules/backlogs/app/components/backlogs/backlog_filter_select_panel_component.rb:60 buckets plus inbox picker; order is the dragged position only, modules/backlogs/app/models/sprint.rb:97 order_by_position", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters apply on 'a Scrum board or Kanban board' including its backlog; order is Rank (docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'the issues you're creating and ranking for your team')", - "plane": "corpus: plane/round4/code-census.md §9 IssueView filters and display_filters ; usability.md 'Layouts, filtering ... are all good'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters apply on 'a Scrum board or Kanban board' including its backlog; order is Rank (docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'the issues you're creating and ranking for your team') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters 'further filter the collection of issues appearing on a Scrum board or Kanban board'; https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'Drag and drop an issue to rank it' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §9 IssueView filters and display_filters ; usability.md 'Layouts, filtering ... are all good' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx:112-118 order_by selector; apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx:206 filters; apps/api/plane/utils/issue_filters.py:298-300 backlog type; apps/api/plane/utils/order_queryset.py:12 order_by allowlist" }, "built": { "state": "specified", @@ -2170,8 +2215,8 @@ "nextcloud-deck": "no backlog apart from the board: corpus: nextcloud-deck/round4/menu-tree.md 'a kanban has one thing to navigate, the board' ; source read at v1.19.0: no backlog to rank: searched lib/ and src/ for 'backlog': none; ordering exists only inside a board list, lib/Service/CardService.php:436 reorder", "kanboard": "tasks are ordered by drag within the Backlog column (corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position); no ranked backlog list ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:37 drag within the Backlog column saves a position; app/Controller/BoardAjaxController.php:18 save; app/Template/task_list/sort_menu.php:20 List sorts by 'Position' but cannot be dragged", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:170 'You can prioritize work packages within the Inbox backlog, a backlog bucket, or a sprint by dragging and dropping them' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/app/components/backlogs/work_package_card_list_component.rb:41-59 drag_and_drop on the card list; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:97-110 move stores the new position, same-list moves reorder", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'an optimized list view of the issues you're creating and ranking for your team'", - "plane": "corpus: plane/round4/code-census.md §2 Issue 'sort_order float (:158)'; list and board support manual drag ordering (kanban/block.tsx:206 draggable)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'an optimized list view of the issues you're creating and ranking for your team' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'Drag and drop an issue to rank it. You can also right-click the issue to open a menu that allows you to send it to the top or the bottom of the backlog' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 Issue 'sort_order float (:158)'; list and board support manual drag ordering (kanban/block.tsx:206 draggable) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/list/block.tsx:117 draggable rows in the list layout and apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 on the board; apps/web/core/components/issues/issue-layouts/utils.tsx:491-518 new sort_order between neighbours; apps/api/plane/db/models/issue.py:158 sort_order" }, "built": { "state": "none", @@ -2199,8 +2244,8 @@ "nextcloud-deck": "source: grep -rniF 'sprint' lib returns 0 hits ; corpus: nextcloud-deck/round4/usability.md no iteration object ; source read at v1.19.0: searched lib/, src/ and appinfo/ for 'sprint', 'iteration': only sprintf in lib/Service/BoardService.php:242; lib/Db has Board, Stack, Card, Label, Acl, Assignment, Attachment, Session and no iteration entity", "kanboard": "source: grep -rniF 'sprint' app --include=*.php outside Locale returns no sprint model ; corpus: kanboard/round4/code-census.md objects table has no iteration ; source read at v1.2.54: searched app/ (outside Locale) word-bounded for 'sprint', 'sprints', 'iteration', 'velocity': none; app/Schema/Sqlite.php has no sprint or iteration table", "openproject": "corpus: openproject/round4/menu-tree.md 'Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:59 'Each sprint is displayed in a dedicated container showing ... start and end dates'; multiple active sprints are Enterprise gated (open-core.md multiple_active_sprints) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:84-94 sprints with new, start, finish; modules/backlogs/app/models/sprint.rb:75-77 start_date and finish_date required when active, finish after start; modules/backlogs/app/contracts/backlogs/projects/backlog_settings_contract.rb:96 several active sprints need the :multiple_active_sprints token", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/estimate-in-story-points-938845204.html 'Velocity is then worked out based on how many points the team can complete in each sprint'; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Sprint Report'", - "plane": "corpus: plane/round4/menu-tree.md 'Cycles time boxes, off by default' ; code-census.md §3 'Cycle is a time box: start_date and end_date'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/estimate-in-story-points-938845204.html 'Velocity is then worked out based on how many points the team can complete in each sprint'; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Sprint Report' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html 'Create sprints Start sprints Complete sprints ... Edit sprint information (sprint name, goal, dates)' (read 2026-09-26)", + "plane": "corpus: plane/round4/menu-tree.md 'Cycles time boxes, off by default' ; code-census.md §3 'Cycle is a time box: start_date and end_date' ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/page.tsx; apps/web/core/components/cycles/modal.tsx:43,52 createCycle; apps/api/plane/app/urls/cycle.py:23 route, apps/api/plane/app/views/cycle/base.py:271 create; apps/api/plane/db/models/cycle.py:60-64 Cycle start_date and end_date. Cycles are off by default per project" }, "built": { "state": "none", @@ -2228,8 +2273,8 @@ "nextcloud-deck": "no sprints (bkl-sprints) ; source read at v1.19.0: no sprints, see bkl-sprints: searched lib/ and src/ for 'sprint', 'iteration': none beyond lib/Service/BoardService.php:242 sprintf", "kanboard": "no sprints (bkl-sprints) ; source read at v1.2.54: no sprint object, see bkl-sprints: word-bounded search of app/ for 'sprint' returns nothing; app/Controller/BoardViewController.php:56 the board is per project only", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:265 'Sprint board' among the sprint menu items; :234 'Clicking it will open the sprint board' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/locales/en.yml:179 'Sprint board'; modules/backlogs/config/routes.rb:112 sprint taskboard; modules/backlogs/app/controllers/backlogs/taskboard_controller.rb:35-38 redirects to the sprint's board; modules/boards/app/services/boards/sprint_task_board_create_service.rb:65-76 one list per status of the sprint's work", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards in your Backlog and Active sprints' (the Active sprints board is the current sprint); docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart: Tracks the total work remaining' per sprint", - "plane": "corpus: plane/round4/code-census.md §3 CycleIssue membership ; source: apps/web/core/components/issues/issue-layouts/roots/cycle-layout-root.tsx renders the cycle's items in the same layouts, board included. The cross-project 'Active Cycles' page is an upsell (open-core.md shims table, active-cycles/page.tsx:13)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'You can add up to three additional fields to cards in your Backlog and Active sprints' (the Active sprints board is the current sprint); docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart: Tracks the total work remaining' per sprint ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'display on cards in the Backlog and Active sprints of your Scrum board': Active sprints is the board of the running sprint (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §3 CycleIssue membership ; source: apps/web/core/components/issues/issue-layouts/roots/cycle-layout-root.tsx renders the cycle's items in the same layouts, board included. The cross-project 'Active Cycles' page is an upsell (open-core.md shims table, active-cycles/page.tsx:13) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/roots/cycle-layout-root.tsx:40-41 KANBAN renders CycleKanBanLayout for one cycle; apps/api/plane/app/urls/cycle.py:40 cycle-issues route, apps/api/plane/app/views/cycle/issue.py:40 CycleIssueViewSet" }, "built": { "state": "none", @@ -2257,8 +2302,8 @@ "nextcloud-deck": "no sprints and no points ; corpus: nextcloud-deck/round4/M1-column.md 10.1 'no' KPI dashboards ; source read at v1.19.0: searched lib/ and src/ for 'velocity', 'story point', 'estimate': only lib/UserMigration/DeckMigrator.php:64 getEstimatedExportSize; lib/Db/Card.php:73-96 no points or estimate field", "kanboard": "no sprints; corpus: kanboard/round4/menu-tree.md Analytics lists 'Task distribution · User repartition · Cumulative flow diagram · Burndown chart · Average time into each column · Lead and cycle time · Estimated vs actual time', no velocity ; source read at v1.2.54: app/Template/analytic/sidebar.php:4-25 the eight analytics are task distribution, user repartition, CFD, burndown, time in column, lead and cycle, estimated vs actual; word-bounded search of app/ for 'velocity': none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'velocity' modules/backlogs returns only spec files; the backlogs-scrum README documents burndown and sprint board, no velocity chart ; source read at v17.8.0: modules/backlogs/app/components/backlogs/sprint_component.html.erb:63-64 a 'velocity' CSS class holds only the current sprint's story point total; modules/backlogs/app/components/backlogs/sprint_reports/widgets has burndown_chart and goal only; searched modules/backlogs non-spec code for 'velocity': no chart over past sprints", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Velocity Chart: Tracks the amount of work completed from sprint to sprint'", - "plane": "source: grep -rli velocity apps/web/core apps/api packages/constants hits only apps/api/plane/settings/openapi.py prose; no velocity chart across cycles. Corpus silent" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Velocity Chart: Tracks the amount of work completed from sprint to sprint' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Velocity Chart Sprints Tracks the amount of work completed from sprint to sprint' (read 2026-09-26)", + "plane": "source: grep -rli velocity apps/web/core apps/api packages/constants hits only apps/api/plane/settings/openapi.py prose; no velocity chart across cycles. Corpus silent ; source read at v1.4.2: searched apps/web/core, apps/api/plane and packages/i18n/src/locales/en for 'velocity': one hit, prose in apps/api/plane/settings/openapi.py; no chart comparing completed work across cycles" }, "built": { "state": "none", @@ -2286,8 +2331,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no' process analytics ; no chart in the app (menu-tree.md) ; source read at v1.19.0: searched lib/ and src/ for 'burndown', 'burnup', 'chart': no chart component; the only chart-like view is the Gantt, src/components/board/GanttView.vue:63 frappe-gantt, which plots dates, not remaining work", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Burndown chart' : a project burndown over the complexity score by date range, not bound to a sprint ; source read at v1.2.54: app/Template/analytic/sidebar.php:13 'Burndown chart'; app/Controller/AnalyticController.php:129-131 burndown over the task score; app/Template/analytic/burndown.php:21 a free date range, not a sprint", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:266 'Burndown chart'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/backlogs/app/models/burndown.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:113 sprint burndown_chart; modules/backlogs/app/controllers/backlogs/burndown_chart_controller.rb:35 show; modules/backlogs/app/models/burndown.rb:31-32 Burndown built per sprint; modules/backlogs/config/locales/en.yml:144-147 burndown chart page strings", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart', 'Burnup Chart', 'Release Burndown', 'Epic Burndown'", - "plane": "source: apps/web/core/components/cycles/analytics-sidebar/sidebar-chart.tsx:15 ProgressChart and apps/web/core/components/core/sidebar/progress-chart.tsx:23-45 'current' versus 'ideal' series, i18n 'Burndown chart' ; corpus: plane/round4/code-census.md §3 Cycle.progress_snapshot. Burndown comparison across cycles is the Active Cycles upsell" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Burndown Chart', 'Burnup Chart', 'Release Burndown', 'Epic Burndown' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html report list 'Burndown Chart Burnup Chart Control Chart Cumulative Flow Diagram Epic Burndown ... Release Burndown Sprint Report' (read 2026-09-26)", + "plane": "source: apps/web/core/components/cycles/analytics-sidebar/sidebar-chart.tsx:15 ProgressChart and apps/web/core/components/core/sidebar/progress-chart.tsx:23-45 'current' versus 'ideal' series, i18n 'Burndown chart' ; corpus: plane/round4/code-census.md §3 Cycle.progress_snapshot. Burndown comparison across cycles is the Active Cycles upsell ; source read at v1.4.2: apps/web/core/components/cycles/analytics-sidebar/sidebar-chart.tsx:15,26 cycle sidebar chart; apps/web/core/components/core/sidebar/progress-chart.tsx:20-44 'current' versus 'ideal' series; apps/api/plane/app/views/cycle/base.py:932 burndown_plot, apps/api/plane/utils/analytics_plot.py:123" }, "built": { "state": "none", @@ -2315,8 +2360,8 @@ "nextcloud-deck": "source: grep -rniE 'milestone|release|version' lib/Db returns no version object ; corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones ; source read at v1.19.0: searched lib/ and src/ for 'milestone', 'release', 'fixVersion': no version object; lib/Db/Card.php:73-96 and lib/Db/Board.php carry no release field", "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' : a task can be linked to a milestone task; no version or release object ; source read at v1.2.54: app/Schema/Sqlite.php:968-969 link labels 'targets milestone' and 'is a milestone of' let a task point at a milestone task; word-bounded search of app/Controller and app/Template for 'release', 'version': only plugin and about screens", "openproject": "corpus: openproject/round4/menu-tree.md 'Project settings ... Versions'; corpus: openproject/round4/M1-column.md 9.1 and 11.10 version custom field; docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Product roadmap release planning' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:478 project versions new, create; app/models/work_package_version.rb:31-35 a work package links to versions with kind target, several target versions allowed since 17.8; config/initializers/menus.rb:793 project settings 'Versions'", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report', 'Release Burndown'; docs: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'a release can start Relative to previous release date' (corpus 8.8)", - "plane": "corpus: plane/round4/code-census.md §3 'Module is a scope grouping: start_date / target_date, status from ModuleStatus ... Membership is ModuleIssue'; no version object as such, a module with a target date stands in for a release" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report', 'Release Burndown'; docs: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'a release can start Relative to previous release date' (corpus 8.8) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'Releases in Advanced Roadmaps are referred to as Fix versions in Jira Software'; https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §3 'Module is a scope grouping: start_date / target_date, status from ModuleStatus ... Membership is ModuleIssue'; no version object as such, a module with a target date stands in for a release ; source read at v1.4.2: apps/web/core/components/modules/modal.tsx:44 createModule; apps/api/plane/app/urls/module.py:20 modules route, apps/api/plane/app/views/module/base.py:295 create; apps/api/plane/db/models/module.py:67-74 Module with target_date and status. A module with a target date stands in for a release" }, "built": { "state": "none", @@ -2344,8 +2389,8 @@ "nextcloud-deck": "no epics or versions over time ; corpus: nextcloud-deck/round4/menu-tree.md five navigation entries, none a roadmap ; source read at v1.19.0: searched lib/ and src/ for 'roadmap', 'milestone': none, and 'epic' hits only NcDateTimePickerNative and getFilePickerBuilder, e.g. src/components/card/DueDateSelector.vue:10; src/router.js:29-153 has no roadmap route", "kanboard": "corpus: kanboard/round4/menu-tree.md project menu has no roadmap or timeline; the Gantt is not in core (code-census.md objects table) ; source read at v1.2.54: searched app/Controller and app/Template for 'roadmap', 'gantt', 'release': no roadmap screen; app/Template/project_header/views.php:6-18 views are Overview, Board, List", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Find out about the Product Roadmap and Release planning in OpenProject'; corpus: openproject/round4/menu-tree.md global 'Gantt charts' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:713-716 project 'Roadmap' menu when versions exist; config/routes.rb:484-487 /roadmap is versions#index; app/controllers/versions_controller.rb:39 index lists versions with their work packages and progress", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 Releases in Advanced Roadmaps and 3.14 'Modify a view in Advanced Roadmaps'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (timeline of epics and releases, Advanced Roadmaps bundled in the Jira Software DC documentation set)", - "plane": "source: apps/web/core/components/modules/modules-list-view.tsx:52 and modules/gantt-chart/modules-list-layout.tsx draw a project's modules on a timeline; epics are unreachable (corpus: plane/round4/journeys.md) and there is no cross-project roadmap" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 Releases in Advanced Roadmaps and 3.14 'Modify a view in Advanced Roadmaps'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (timeline of epics and releases, Advanced Roadmaps bundled in the Jira Software DC documentation set) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html 'a plan contains all of the work that needs to be done on your project in a timeline format'; https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'Monitor releases from your timeline' (read 2026-09-26)", + "plane": "source: apps/web/core/components/modules/modules-list-view.tsx:52 and modules/gantt-chart/modules-list-layout.tsx draw a project's modules on a timeline; epics are unreachable (corpus: plane/round4/journeys.md) and there is no cross-project roadmap ; source read at v1.4.2: apps/web/core/components/modules/modules-list-view.tsx:17,108 ModulesListGanttChartView draws a project's modules on a timeline; apps/api/plane/db/models/module.py:73 target_date. Per project only, no epics, no cross-project roadmap" }, "built": { "state": "built", @@ -2373,8 +2418,8 @@ "nextcloud-deck": "source: src/components/Controls.vue:236-237 'Gantt view' view mode beside 'Kanban view', src/components/board/Board.vue:49 GanttView, src/components/board/GanttView.vue:63 frappe-gantt over start and due dates (tag v1.18.4). The round-4 menu-tree.md lists 'the view modes (board and list)' and missed the Gantt mode ; source read at v1.19.0: src/components/Controls.vue:242 'Kanban view' and :244-249 'Gantt view' toggle; src/components/board/Board.vue:49 mounts GanttView; src/components/board/GanttView.vue:63 frappe-gantt, :196-198 Days, Weeks, Months zoom, :303-328 bars from card start and due dates", "kanboard": "source: the only 'gantt' in app/ is a comment in app/Analytic/AverageLeadCycleTimeAnalytic.php:91; the Gantt is a plugin ; corpus: kanboard/round4/menu-tree.md 'Overview · Board · List' ; source read at v1.2.54: searched app/ (outside Locale) for 'gantt': the only hit is a comment, app/Analytic/AverageLeadCycleTimeAnalytic.php:91; app/Template/project_header/views.php:6-18 no timeline view; the Gantt is a third-party plugin", "openproject": "corpus: openproject/round4/menu-tree.md global 'Gantt charts' and project work package 'Gantt' view ; source read at v17.8.0: modules/gantt/config/routes.rb:3-10 project and global Gantt; modules/gantt/lib/open_project/gantt/engine.rb:41 gantt project module; frontend/src/app/features/work-packages/components/wp-table/timeline/wp-timeline.ts the timeline beside the table", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (Advanced Roadmaps timeline); corpus: jira-data-center/round4/M1-column.md 8.3 plans schedule on target start and end dates", - "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in ... gantt layout'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (Advanced Roadmaps timeline); corpus: jira-data-center/round4/M1-column.md 8.3 plans schedule on target start and end dates ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'On your timeline, dependent issues will have numbered badges at either end of the schedule bar' (Advanced Roadmaps, bundled in Data Center) (read 2026-09-26)", + "plane": "corpus: plane/round4/menu-tree.md 'Work items spreadsheet, board, calendar, gantt and list layouts' ; journeys.md 'look at it in ... gantt layout' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/roots/project-layout-root.tsx:23,36-37 GANTT renders BaseGanttRoot; apps/api/plane/db/models/issue.py:147-148 start_date and target_date; apps/api/plane/app/views/issue/base.py:628 partial_update" }, "built": { "state": "built", @@ -2403,8 +2448,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card Details 'dependent cards' ; _round4/compare/promoted-rows-batch6.md 2.26 'card dependencies (card_api#assignDependentCard, appinfo/routes.php:111, table oc_deck_dependent_cards)' ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards', :56 'Add dependent card', mounted at src/components/card/CardSidebarTabDetails.vue:29-32; lib/Controller/CardController.php:136 assignDependentCard, lib/Service/CardService.php:688, lib/Db/CardMapper.php:673 table deck_dependent_cards", "kanboard": "corpus: kanboard/round4/journeys.md 4 'createTaskLink(3, 2, link 2 \"blocks\") and getAllTaskLinks(2) returned the same link as \"is blocked by\" from the other side' ; source read at v1.2.54: app/Schema/Sqlite.php:962-963 'blocks' and 'is blocked by' link pair; app/Template/task/sidebar.php:48 'Add internal link'; app/Model/TaskLinkModel.php:166 create writes both sides", "openproject": "corpus: openproject/round4/M1-column.md 2.10 relation.rb eleven typed entries; 8.9 'a follows relation with lag ... moves a successor'; blocks/blocked by among them ; source read at v17.8.0: app/models/relation.rb:36-39 precedes, follows, blocks, blocked types; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; app/contracts/relations/base_contract.rb:39-43 relation validation", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may block another' (Linking issues); docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (corpus 8.8)", - "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices includes blocked_by with pair 'blocking' (issue.py:272-290)" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may block another' (Linking issues); docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (corpus 8.8) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'An issue may block another'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §2 IssueRelationChoices includes blocked_by with pair 'blocking' (issue.py:272-290) ; source read at v1.4.2: apps/web/core/components/relations/index.tsx:27 blocked_by option in the relation menu; apps/api/plane/app/urls/issue.py:236 issue-relation route; apps/api/plane/db/models/issue.py:275 BLOCKED_BY and :284 blocked_by paired with blocking" }, "built": { "state": "built", @@ -2437,8 +2482,8 @@ "nextcloud-deck": "source: lib/Db/CardMapper.php:674 addDependency skips a duplicate (hasDependency); lib/Service/CardService.php:688-707 checks permissions and archive state only, so a self or circular dependency is not refused ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:152-154 the picker leaves out the card itself, cards already linked and cards of other boards; lib/Db/CardMapper.php:673-676 server skips a duplicate; lib/Service/CardService.php:688-702 checks permission and archive state only, searched it for 'cycle', 'circular': none, so a loop A to B to A is accepted", "kanboard": "source: app/Validator/TaskLinkValidator.php:29 'A task cannot be linked to itself'; no duplicate or cycle check in the validator ; corpus: kanboard/round4/journeys.md 4 ; source read at v1.2.54: app/Validator/TaskLinkValidator.php:29 'A task cannot be linked to itself'; app/Schema/Sqlite.php:958 unique index on link_id, task_id, opposite_task_id refuses the same link twice, app/Model/TaskLinkModel.php:174-176 then returns false; no cycle check anywhere in the validator or model", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/en.yml:555 'circular_dependency: This relation would create a circular dependency.' and :851 'The relationship creates a circle of relationships'; corpus: openproject/round4/M1-column.md 2.10 relations normalised by 'before_validation :reverse_if_needed' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/relations/base_contract.rb:67-68 adds 'circular_dependency' when :99-100 the target is not in WorkPackage.relatable; app/models/work_packages/scopes/relatable.rb:178 relatable excludes cycles; app/models/relation.rb:137 uniqueness of to per from blocks duplicates; config/locales/en.yml:505 'This relation would create a circular dependency.'", - "jira": "docs: https://jira.atlassian.com/browse/JRA-10068 'Posibility of creation circular references', Closed, Won't Fix: 'It is posible to create circular dependancies or duplicates on issues'; Advanced Roadmaps only flags the conflict (docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'The badges on either end will turn red if there are conflicting dates')", - "plane": "source: apps/api/plane/db/models/issue.py:306-312 UniqueConstraint on (issue, related_issue) blocks duplicates, and apps/api/plane/app/views/issue/relation.py:229-245 bulk_create(ignore_conflicts=True) drops them silently; no self or circular check in relation.py create. Corpus silent" + "jira": "docs: https://jira.atlassian.com/browse/JRA-10068 'Posibility of creation circular references', Closed, Won't Fix: 'It is posible to create circular dependancies or duplicates on issues'; Advanced Roadmaps only flags the conflict (docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'The badges on either end will turn red if there are conflicting dates') ; docs read 2026-09-26: https://jira.atlassian.com/browse/JRASERVER-10068 'Posibility of creation circular references', Closed, Won't Fix, 2 votes (JRA-10068 redirects here; tracker REST API, read 2026-09-26)", + "plane": "source: apps/api/plane/db/models/issue.py:306-312 UniqueConstraint on (issue, related_issue) blocks duplicates, and apps/api/plane/app/views/issue/relation.py:229-245 bulk_create(ignore_conflicts=True) drops them silently; no self or circular check in relation.py create. Corpus silent ; source read at v1.4.2: apps/api/plane/app/views/search/issue.py:44 the relation picker excludes the item itself and its parent, :47-53 excludes already related items; apps/api/plane/db/models/issue.py:308-311 UniqueConstraint issue and related_issue; apps/api/plane/app/views/issue/relation.py:229-245 bulk_create ignore_conflicts, no check for a circular chain" }, "built": { "state": "built", @@ -2470,8 +2515,8 @@ "nextcloud-deck": "source: src/components/cards/CardBadges.vue shows no dependency badge; src/components/card/DependentCardsSelector.vue lists dependencies with their done state inside the card only ; source read at v1.19.0: searched src/components/cards/CardBadges.vue and src/components/cards/CardItem.vue for 'depend', 'block': no badge on the board card; src/components/card/DependentCardsSelector.vue:13-32 lists each dependency with its done state, struck through when done, inside the card only", "kanboard": "source: app/Template/board/task_footer.php:89-90 a link count icon with a tooltip listing the links, not a blocked state ; corpus: kanboard/round4/journeys.md 4 search 'link:\"is blocked by\"' finds them ; source read at v1.2.54: app/Template/board/task_footer.php:89-90 a link count icon whose tooltip lists the links, no blocked state; app/Filter/TaskLinkFilter.php lets a search find 'is blocked by' links; searched app/Template/board for 'blocked': none", "openproject": "relations are listed on the work package and drawn in the Gantt (corpus: openproject/round4/M1-column.md 2.10), but no card or list badge marks a task blocked by unfinished work; agile-boards README documents no blocked marker ; source read at v17.8.0: app/models/queries/work_packages/filter/blocked_filter.rb:33 a list filter for 'blocked by' exists; frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html has no blocked marker (searched it for 'blocked', 'blocks': none); relations display in the table became Community in 17.8", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html numbered badges on the schedule bar that 'turn red if there are conflicting dates' (timeline only); on the board a blocked state is a manual flag or a query colour (https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per JQL query')", - "plane": "source: grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits; ISSUE_DISPLAY_PROPERTIES (packages/constants/src/issue/common.ts) has no blocked property. Relations show only on the work item page" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html numbered badges on the schedule bar that 'turn red if there are conflicting dates' (timeline only); on the board a blocked state is a manual flag or a query colour (https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per JQL query') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar'; 'The badges on either end will turn red if there are conflicting dates': on the plan timeline only, not on board cards (read 2026-09-26)", + "plane": "source: grep -rniE 'blocked|blocking' apps/web/core/components/issues/issue-layouts returns 0 hits; ISSUE_DISPLAY_PROPERTIES (packages/constants/src/issue/common.ts) has no blocked property. Relations show only on the work item page ; source read at v1.4.2: packages/constants/src/issue/common.ts:142-159 card display keys have no blocked entry; searched apps/web/core/components/issues/issue-layouts for 'blocked', 'blocking': none. Relations show only inside the work item, apps/web/core/components/relations/index.tsx:27" }, "built": { "state": "built", @@ -2504,8 +2549,8 @@ "nextcloud-deck": "source: src/components/board/GanttView.vue:297-325 cardToGanttTask passes id, name, start, end, progress and no dependencies to frappe-gantt, so dependent cards are not drawn ; source read at v1.19.0: src/components/board/GanttView.vue:303-328 cardToGanttTask passes id, name, start, end, progress and class with no dependencies field; searched GanttView.vue for 'dependencies': none, so frappe-gantt draws no arrows", "kanboard": "no timeline in core (pln-gantt) ; source read at v1.2.54: no timeline in core: searched app/ for 'gantt', the only hit is a comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'To add dependencies between work packages, you can set them as predecessor or successor in the Gantt chart' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive.ts:39-43 draws TimelineRelationElement lines from WorkPackageRelationsService; app/models/relation.rb:36-37 precedes and follows", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar based on dependency type'", - "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx:26 declares enableDependency and the ChartDraggable body (:30-39) never destructures or uses it; no dependency path component in the tree. A hollow shim like those in corpus: plane/round4/open-core.md" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar based on dependency type' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'On your timeline, dependent issues will have numbered badges at either end of the schedule bar based on dependency type' (read 2026-09-26)", + "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx:26 declares enableDependency and the ChartDraggable body (:30-39) never destructures or uses it; no dependency path component in the tree. A hollow shim like those in corpus: plane/round4/open-core.md ; source read at v1.4.2: apps/web/core/components/gantt-chart/helpers/draggable.tsx:26 declares enableDependency and :30-38 ChartDraggable never destructures it; searched apps/web/core/components/gantt-chart for 'dependency.?path', 'DependencyPath', 'relation.?line': none" }, "built": { "state": "built", @@ -2537,8 +2582,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'has reached its due date' : the ScheduledNotifications job notifies at the due date, not ahead of it ; _round4/compare/promoted-rows-batch6.md 8.14 'notifies once, marking notified' ; source read at v1.19.0: lib/Cron/ScheduledNotifications.php:33-39 notifies on cards from lib/Db/CardMapper.php:358-367 findOverdue, where duedate is before NOW(), once per card via notified; lib/Notification/NotificationHelper.php:88-95 subject 'card-overdue', so the notice comes when the due date passes, never ahead of it", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 8.14 'the daily cron fires task.overdue and mails the assignee' (after the date, not before) ; source: app/Console/TaskOverdueNotificationCommand.php:18-22 ; source read at v1.2.54: app/Console/TaskOverdueNotificationCommand.php:18-19 'notification:overdue-tasks' mails once the date has passed, :151-165 per user; ahead of the date only as a workaround, app/Action/TaskMoveColumnOnDueDate.php:22 moves a task N days before due, which notifies watchers of the move", "openproject": "corpus: openproject/round4/M1-column.md 8.6 'date alerts are exactly this feature and they are Enterprise gated ... both return early without the token'; 8.4 'app/models/reminder.rb:31' manual reminders are free ; source read at v17.8.0: app/workers/notifications/schedule_date_alerts_notifications_job.rb:38 and app/workers/notifications/create_date_alerts_notifications_job.rb:41 automatic due alerts return early without the :date_alerts token; app/models/reminder.rb:31 and config/routes.rb:1076-1077 manual per work package reminders are free", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.4 'a scheduled rule can send out a reminder to the assignee'; 8.6 'a filter subscription on duedate < now() mails on a schedule'; nothing fires before the due date without a rule", - "plane": "corpus: plane/round4/journeys.md 'A due date that notifies nobody. target_date is a sortable, filterable column, and nothing in the scheduler reads it' ; code-census.md §8 'Reminder or due-date job: absent'" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.4 'a scheduled rule can send out a reminder to the assignee'; 8.6 'a filter subscription on duedate < now() mails on a schedule'; nothing fires before the due date without a rule ; docs read 2026-09-26: https://confluence.atlassian.com/automation/examples-and-use-cases-of-jira-automation-rules-1518962339.html rule templates 'Rule scheduling based on a Due Date field', 'Send weekly reminder emails for assignee to log work'; https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html filter subscriptions: an admin or user builds it, no built-in due reminder (read 2026-09-26)", + "plane": "corpus: plane/round4/journeys.md 'A due date that notifies nobody. target_date is a sortable, filterable column, and nothing in the scheduler reads it' ; code-census.md §8 'Reminder or due-date job: absent' ; source read at v1.4.2: apps/api/plane/celery.py:44-88 beat schedule has no due-date task, only email batching, cleanup, archive and close; searched apps/api/plane/bgtasks/notification_task.py and apps/api/plane/bgtasks/email_notification_task.py for 'target_date', 'due', 'overdue': none" }, "built": { "state": "built", @@ -2567,8 +2612,8 @@ "nextcloud-deck": "source: lib/Cron/ScheduledNotifications.php:34 fires on due date; ConfigService reads calendar, trashRetentionHours and groupLimit only (corpus: nextcloud-deck/round4/open-core.md) ; source read at v1.19.0: lib/Db/CardMapper.php:362 the only trigger is duedate < NOW(); lib/Service/ConfigService.php:77-256 app values are federationEnabled, calendar, cardIdBadge, groupLimit and trashRetentionHours, no reminder offset; searched lib/ for 'leadTime', 'reminder', 'before': none", "kanboard": "source: app/Console/TaskOverdueNotificationCommand.php options show, group, manager; no days-ahead setting ; corpus: kanboard/round4/code-census.md 90 config constants, none a lead time ; 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 app/Action/TaskMoveColumnOnDueDate.php:22 'Move the task to another column when the due date is less than a certain number of days', :45 'Duration in days', :72-77 daily cron check; app/Action/TaskEmail.php:23,35 'Send a task by email to someone' on that move; registered at app/ServiceProvider/ActionProvider.php:108", "openproject": "corpus: openproject/round4/M1-column.md 8.6 date alerts carry a per-user duration (code-census #7 'the contract rejects a write that sets a date alert duration' without the token): per user, not admin, and Enterprise gated ; source read at v17.8.0: app/contracts/user_preferences/params_contract.rb:37 DATE_ALERT_DURATIONS nil, 0, 1, 3, 7 days chosen per user, and :34-35 enterprise_action :date_alerts on any write that sets them; app/components/my/notifications/show_page_component.html.erb:61-64 per user setting with Enterprise banner; searched app/views/admin and app/components/admin for a date alert lead time: none", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 a rule writes '{{now.plusDays(3).toBusinessDay()}}'; an admin builds the lead time into a scheduled automation rule (8.4, 8.6); no setting", - "plane": "corpus: plane/round4/code-census.md §8 'A due date in Plane CE never notifies anybody', so there is no lead time to set" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 a rule writes '{{now.plusDays(3).toBusinessDay()}}'; an admin builds the lead time into a scheduled automation rule (8.4, 8.6); no setting ; docs read 2026-09-26: https://confluence.atlassian.com/automation/examples-of-using-smart-values-with-dates-993924630.html smart values 'plusDays / minusDays' let a rule author set the lead time; no instance setting for reminder lead time (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §8 'A due date in Plane CE never notifies anybody', so there is no lead time to set ; source read at v1.4.2: no due reminder exists to configure, apps/api/plane/celery.py:44-88 has no such task; searched apps/api/plane/db/models/project.py and apps/api/plane/db/models/workspace.py for 'remind': none" }, "built": { "state": "built", @@ -2597,8 +2642,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'the notify-due choice per user' ; code-census.md 'notify-due per user per board' (lib/Notification/NotificationHelper.php:66) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:83 'Turn off due date reminders', :102-130 'Due date reminders' all, assigned or 'No notifications' per board; lib/Service/ConfigService.php:22-25 and :191 per-user notify-due values; lib/Notification/NotificationHelper.php:66-70 skips users set to off", "kanboard": "source: app/Template/user_view/notifications.php:9 notification_types checkboxes per user, with the assignee/creator filter (promoted-rows-batch7.md 13.18 'by the user's own filter') ; source read at v1.2.54: app/Template/user_view/notifications.php:9 notification methods, :12-13 'I want to receive notifications for:' filter, :17 per project; app/Console/TaskOverdueNotificationCommand.php:134,157 overdue mails only go to users with notifications on and passing their filter; the opt out is for all notifications, not reminders alone", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md in-app and email notification settings per user; the automatic due alerts to opt out of are Enterprise gated (corpus: openproject/round4/M1-column.md 8.6), so on the free build there is nothing automatic to turn off (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/my/notifications/show_page_component.html.erb:42 the date alert toggles render only when date_alerts_available?, else :64 an Enterprise banner; app/menus/notifications/menu.rb:142 same gate; general notification settings are free", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.6 filter subscriptions are created 'for yourself and/or other users'; a rule-sent reminder has no per-user opt-out documented", - "plane": "corpus: plane/round4/code-census.md §8 no due reminder exists; UserNotificationPreference (notification.py:104-108) has property_change, state_change, comment, mention, issue_completed and nothing for due dates" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.6 filter subscriptions are created 'for yourself and/or other users'; a rule-sent reminder has no per-user opt-out documented ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'You can create a subscription of any frequency for yourself and/or other users', so a user drops their own subscription; a rule-sent reminder has no documented per-user opt-out (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §8 no due reminder exists; UserNotificationPreference (notification.py:104-108) has property_change, state_change, comment, mention, issue_completed and nothing for due dates ; source read at v1.4.2: apps/api/plane/db/models/notification.py:104-108 preferences are property_change, state_change, comment, mention, issue_completed; nothing for due dates, since no due reminder exists" }, "built": { "state": "built", @@ -2627,8 +2672,8 @@ "nextcloud-deck": "source: src/components/board/GanttView.vue:275 dragging a bar calls updateTaskDate, :373-377 dispatches updateCardDates with the new startdate and duedate ; not in the round-4 drive (menu-tree.md) ; source read at v1.19.0: src/components/board/GanttView.vue:369 bars editable when the user can edit, :371-372 on_date_change keeps the drag, :276-279 commits it through updateTaskDate, :379-384 dispatches updateCardDates with the new startdate and duedate; lib/Controller/CardController.php:67 update", "kanboard": "no timeline in core (pln-gantt) ; source read at v1.2.54: no timeline in core: searched app/ for 'gantt', only the comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91; drag to reschedule is the third-party Gantt plugin", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/README.md (gantt-chart.gif, create-new-element-gantt-chart.gif) drag bars to change dates; corpus: openproject/round4/journeys.md duration derivation on edit (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-mouse-handler.ts:63-97 mousedown on a bar starts a drag that shifts or resizes the dates; the change is saved through the work package update service", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'adjust the dates by clicking and dragging the ends of the schedule bar'", - "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx LeftResizable, RightResizable and onMouseDown handleBlockDrag(e, \"move\"); chart/timeline-drag-helper.tsx ; corpus: plane/round4/menu-tree.md gantt layout" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'adjust the dates by clicking and dragging the ends of the schedule bar' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'adjust the dates by clicking and dragging the ends of the schedule bar' (read 2026-09-26)", + "plane": "source: apps/web/core/components/gantt-chart/helpers/draggable.tsx LeftResizable, RightResizable and onMouseDown handleBlockDrag(e, \"move\"); chart/timeline-drag-helper.tsx ; corpus: plane/round4/menu-tree.md gantt layout ; source read at v1.4.2: apps/web/core/components/gantt-chart/helpers/draggable.tsx:15-16,34 LeftResizable, RightResizable and handleBlockDrag move; apps/web/core/components/gantt-chart/chart/main-content.tsx:40 blockUpdateHandler; apps/api/plane/app/views/issue/base.py:628 partial_update stores start_date and target_date" }, "built": { "state": "none", @@ -2657,8 +2702,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/pending-rows-batch6.md 3.21 'a dependent card is a link; nothing moves a date' ; source read at v1.19.0: lib/Service/CardService.php:688-702 adding a dependency stores a link and fires activity, no date is touched; src/components/board/GanttView.vue:379-384 a drag updates only the dragged card; searched lib/ for 'reschedule', 'shift' on dependent cards: none", "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 3.21 'a link moves no date: TaskLinkModel writes two rows and fires an event' ; source read at v1.2.54: app/Model/TaskLinkModel.php:166-180 creating a link writes two rows and fires task_internal_link.create_update, no date change; searched app/Action for a link-driven date shift: none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'there is an automatic scheduling mode and a manual scheduling mode (default) (new in release 15.4) ... determine how work packages behave when the dates of related work packages change'; corpus: openproject/round4/M1-column.md 8.9 set_schedule_service.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/work_packages/date_picker/dialog_content_component.html.erb:10-16 manual or automatic scheduling in the date picker; app/contracts/work_packages/base_contract.rb:116 schedule_manually; app/services/work_packages/set_schedule_service.rb:31-41 reschedules followers when start or due date changes, called from app/services/work_packages/set_attributes_service.rb:322", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'The Auto-scheduler constructs a plan using issue details based on your plan settings', considering dependencies, capacity and estimates", - "plane": "source: gantt-chart/blocks/block.tsx:32 updateBlockDates(IBlockUpdateDependencyData[]) is a seam, but dependency handling is dropped in draggable.tsx (see pln-deps-on-timeline) and relation.py create changes no dates; corpus: plane/round4/code-census.md §8 'No other module computes a date'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'The Auto-scheduler constructs a plan using issue details based on your plan settings', considering dependencies, capacity and estimates ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'The Auto-scheduler constructs a plan using issue details based on your plan settings'; it considers 'dependencies' and 'issue rankings' (read 2026-09-26)", + "plane": "source: gantt-chart/blocks/block.tsx:32 updateBlockDates(IBlockUpdateDependencyData[]) is a seam, but dependency handling is dropped in draggable.tsx (see pln-deps-on-timeline) and relation.py create changes no dates; corpus: plane/round4/code-census.md §8 'No other module computes a date' ; source read at v1.4.2: apps/web/core/components/gantt-chart/blocks/block.tsx:32,45 updateBlockDates is a typed seam, but apps/web/core/components/gantt-chart/helpers/draggable.tsx:30-38 drops enableDependency; apps/api/plane/app/views/issue/relation.py:229-245 creating a relation changes no dates" }, "built": { "state": "none", @@ -2686,8 +2731,8 @@ "nextcloud-deck": "source: grep -rniF 'critical' lib returns only the Trello importer; the Gantt (GanttView.vue) computes no path ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'critical': none; src/components/board/GanttView.vue:303-328 bars carry no dependency or slack data to compute a path", "kanboard": "no timeline in core ; source: grep -rniF 'critical path' app returns 0 hits ; source read at v1.2.54: searched app/ (outside Locale) for 'critical path', 'critical_path': none; no timeline in core, the only 'gantt' is a comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'Is there a critical path feature? Unfortunately, we don't have the critical path feature yet' ; source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml) for 'critical path', 'critical_path': none; docs/user-guide/gantt-chart/gantt-chart-faq/README.md:35-37 'we don't have the critical path feature yet'", - "jira": "docs: Advanced Roadmaps pages read (dependencies, auto-schedule, releases) name no critical path; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html lists the factors it schedules on and none is a critical path", - "plane": "source: grep -rliE 'critical.?path' over apps and packages (*.ts, *.tsx, *.py, *.json) returns nothing; corpus: plane/round4/code-census.md §8 no date arithmetic beyond relative filters" + "jira": "docs: Advanced Roadmaps pages read (dependencies, auto-schedule, releases) name no critical path; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html lists the factors it schedules on and none is a critical path ; docs read 2026-09-26: https://jira.atlassian.com/browse/JSWSERVER-24942 'Is there a plan of including Critical Path functionality in Advanced Roadmaps?', Suggestion, Gathering Interest; also JSWSERVER-24925 'Highlight blockers on the critical path', 138 votes (tracker REST API, read 2026-09-26)", + "plane": "source: grep -rliE 'critical.?path' over apps and packages (*.ts, *.tsx, *.py, *.json) returns nothing; corpus: plane/round4/code-census.md §8 no date arithmetic beyond relative filters ; source read at v1.4.2: searched apps and packages in *.ts, *.tsx, *.py, *.json for 'critical.?path': none; the only date arithmetic is the relative filter in apps/api/plane/utils/issue_filters.py:29-51" }, "built": { "state": "none", @@ -2715,8 +2760,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.8 'no' milestones ; source read at v1.19.0: searched lib/ and src/ for 'milestone': none; src/components/board/GanttView.vue:303-328 every bar is a card with a start and end, no zero-length milestone marker", "kanboard": "corpus: kanboard/round4/M1-column.md 2.10 link pair 'targets milestone / is a milestone of' ; 8.8 'no' milestones with planned intervals: a milestone is a linked task, not a timeline marker ; source read at v1.2.54: app/Schema/Sqlite.php:968-969 'targets milestone' and 'is a milestone of' link labels; a milestone is an ordinary task linked from app/Template/task/sidebar.php:48 'Add internal link', with no timeline to place it on", "openproject": "corpus: openproject/round4/M1-column.md 8.8 'milestone is a built-in type forced to duration 1 (app/services/work_packages/set_attributes_service.rb:367-368)' ; source read at v17.8.0: app/models/type.rb:285-286 is_milestone per type; app/models/work_package.rb:290-291 milestone?; app/services/work_packages/set_attributes_service.rb:87-93 unify milestone dates to one day; drawn as a diamond on the Gantt timeline", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 'milestones are releases in a plan' (Releases in Advanced Roadmaps); no milestone item type", - "plane": "source: i18n 'Milestones ... Enable milestones' strings (packages/i18n/src/locales/en) have no caller outside locales (grep milestones_description returns only locale files), so milestones are a closed-build feature; modules draw on the module timeline as dated bars (corpus: plane/round4/M1-column.md 8.8 'Cycle and Module carry start and end dates ... a milestone in the planning sense')" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.8 'milestones are releases in a plan' (Releases in Advanced Roadmaps); no milestone item type ; docs read 2026-09-26: https://jira.atlassian.com/browse/JSWSERVER-25115 'Milestones', Suggestion, Gathering Interest, 282 votes; https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html releases on the timeline stand in for milestones (read 2026-09-26)", + "plane": "source: i18n 'Milestones ... Enable milestones' strings (packages/i18n/src/locales/en) have no caller outside locales (grep milestones_description returns only locale files), so milestones are a closed-build feature; modules draw on the module timeline as dated bars (corpus: plane/round4/M1-column.md 8.8 'Cycle and Module carry start and end dates ... a milestone in the planning sense') ; source read at v1.4.2: packages/i18n/src/locales/en/common.json:838-839 'milestones_description' has no caller in apps/web, and apps/web/core/store/project/project.store.ts:21,86 names a 'milestones' section no component renders; searched apps/api/plane/db/models for 'milestone': none. Dated modules stand in, apps/web/core/components/modules/modules-list-view.tsx:108 module gantt, apps/api/plane/db/models/module.py:73 target_date" }, "built": { "state": "none", @@ -2744,8 +2789,8 @@ "nextcloud-deck": "no plan to baseline ; source: grep -rniF 'baseline' lib returns 0 hits ; source read at v1.19.0: searched lib/ and src/ for 'baseline': only CSS var(--default-grid-baseline), e.g. src/components/Controls.vue:539; lib/Db/Card.php:90-91 one duedate and one startdate, no saved plan", "kanboard": "no plan to baseline ; source: grep -rniF 'baseline' app returns 0 hits ; source read at v1.2.54: searched app/ (outside Locale) for 'baseline': none; no plan object to snapshot", "openproject": "corpus: openproject/round4/open-core.md baseline_comparison Enterprise gated; 'Timestamp.allowed ... otherwise selects only those that are one_day_ago? or newer', so the free build compares against yesterday at most ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-baseline/baseline the Baseline dropdown on the table; app/models/timestamp.rb:108-111 without the :baseline_comparison token only timestamps from yesterday onward are allowed, so the free build compares against yesterday at most", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.16 'No as-at view of the whole issue'; Advanced Roadmaps pages read have no baseline", - "plane": "source: grep -rliE 'baseline' apps/api --include=*.py returns only two test docstrings (tests/contract/api/test_projects.py:109, test_workspace_user_preference_app.py:69), no baseline model; corpus: plane/round4/code-census.md §8 date fields list has no baseline" + "jira": "corpus: jira-data-center/round4/M1-column.md 2.16 'No as-at view of the whole issue'; Advanced Roadmaps pages read have no baseline ; docs read 2026-09-26: https://jira.atlassian.com/browse/JRASERVER-60879 'Create a Snapshot/baseline of JIRA at a certain point in time', Closed, Won't Do; https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html Advanced Roadmaps pages name no saved plan baseline (JSWSERVER-1815, fixed 2012, is sprint scope change only) (read 2026-09-26)", + "plane": "source: grep -rliE 'baseline' apps/api --include=*.py returns only two test docstrings (tests/contract/api/test_projects.py:109, test_workspace_user_preference_app.py:69), no baseline model; corpus: plane/round4/code-census.md §8 date fields list has no baseline ; source read at v1.4.2: searched apps/api/plane --include=*.py for 'baseline': only test prose in apps/api/plane/tests/contract/api/test_projects.py and apps/api/plane/tests/contract/app/test_workspace_user_preference_app.py, no baseline model or snapshot of planned dates" }, "built": { "state": "none", @@ -2773,8 +2818,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 8.11 'nothing knows a working day' and 8.12 'no calendar of holidays anywhere in Deck' ; source read at v1.19.0: searched lib/ and src/ for 'holiday', 'workday', 'working day': none; 'weekend' is only the due date quick pick at src/components/card/DueDateSelector.vue:178 and Gantt shading colours at src/components/board/GanttView.vue:530", "kanboard": "corpus: kanboard/round4/code-census.md empty grep 'working.?day|business.?day|holiday' ; promoted-rows-batch7.md 8.11 'and it was measured' ; source read at v1.2.54: searched app/ (outside Locale) for 'working day', 'business day', 'holiday': none; app/Action/TaskMoveColumnOnDueDate.php:72 counts plain calendar days, duration times 86400", "openproject": "corpus: openproject/round4/journeys.md 'The derived date cannot land on a weekend or an administered holiday: ... 0 non-working results in 1675 computations'; /admin/settings/working_days_and_hours ; source read at v17.8.0: config/routes.rb:885 admin working days and hours settings; app/models/non_working_day.rb holidays; app/services/work_packages/shared/days.rb:38 duration uses WorkingDays unless ignore_non_working_days", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 'working days exist only for board reports (Configuring working days)' and the JQL clock counts calendar days; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html does not mention absences or non-working days", - "plane": "corpus: plane/round4/code-census.md §8 'grep holiday|business_day|working_day|bizdays returns 0 hits'; 'A month is thirty days'" + "jira": "corpus: jira-data-center/round4/M1-column.md 8.1 'working days exist only for board reports (Configuring working days)' and the JQL clock counts calendar days; docs: https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html does not mention absences or non-working days ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-working-days-938845342.html 'The Working Days setting for your board is used for different reports and gadgets ... filter out weekends, holidays'; https://jira.atlassian.com/browse/JRASERVER-22506 'JQL search with working days range', Gathering Interest, 560 votes (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §8 'grep holiday|business_day|working_day|bizdays returns 0 hits'; 'A month is thirty days' ; source read at v1.4.2: searched apps/api/plane --include=*.py for 'holiday', 'business_day', 'working_day': none; apps/api/plane/utils/issue_filters.py:29-51 counts a month as thirty days" }, "built": { "state": "none", @@ -2798,13 +2843,13 @@ "openproject": "yes", "plane": "yes", "kanboard": "no", - "jira": "no", + "jira": "partial", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Calendar. With the bridge on, every board is a CalDAV calendar ... so the Calendar app and a phone show the deadlines. Verified live' : the calendar view is the platform Calendar app, not inside Deck ; source read at v1.19.0: appinfo/info.xml:93 registers lib/DAV/CalendarPlugin.php, lib/DAV/Calendar.php:207 one VTODO calendar per board, lib/Db/Card.php:140 a card becomes a VTODO, shown by the platform Calendar app; src/components/DeckAppSettings.vue:22-23 'Show boards in calendar/tasks'; src/router.js:29-153 no calendar view inside Deck", "kanboard": "corpus: kanboard/round4/usability.md 'no calendar' ; menu-tree.md 'Overview · Board · List' (the calendar view is a plugin) ; source read at v1.2.54: ChangeLog:1196 'Move calendar to external plugin'; app/ServiceProvider/AuthenticationProvider.php:87 still names CalendarController but no such file exists in app/Controller; app/Template/project_header/views.php:6-18 views are Overview, Board, List", "openproject": "corpus: openproject/round4/menu-tree.md project 'Calendars'; docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'How to create, use and subscribe to a calendar' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/calendar/config/routes.rb:2-6 project calendars; modules/calendar/lib/open_project/calendar/engine.rb:29 calendar_view module; frontend/src/app/features/calendar/calendar-entry.component.ts the calendar page", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 'the Marketplace calendars (Event Calendar for Jira ...) display, they do not book': a calendar view is a Marketplace app; Team Calendars is a Confluence product", - "plane": "corpus: plane/round4/menu-tree.md 'calendar ... layouts' ; code-census.md §12 'There is a calendar layout for issues in the web app'" + "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 'the Marketplace calendars (Event Calendar for Jira ...) display, they do not book': a calendar view is a Marketplace app; Team Calendars is a Confluence product ; 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 'shows issues and versions in a calendar format based on their due date'; Atlassian's free Jira Calendar Plugin 8.0.0 (2025-11-05) is compatible with Jira 11.0.0 to 11.3.11 (Marketplace REST API, read 2026-09-26)", + "plane": "corpus: plane/round4/menu-tree.md 'calendar ... layouts' ; code-census.md §12 'There is a calendar layout for issues in the web app' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/roots/project-layout-root.tsx:22,34-35 CALENDAR renders CalendarLayout; apps/web/core/components/issues/issue-layouts/calendar/base-calendar-root.tsx:100 groups by target_date; apps/api/plane/db/models/issue.py:148 target_date" }, "built": { "state": "none", @@ -2832,8 +2877,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'every card with a due date a VTODO in it ... Verified live with a REPORT on the board's calendar' ; open-core.md caveat: API-set time zones republished as UTC ; source read at v1.19.0: appinfo/info.xml:93 lib/DAV/CalendarPlugin.php platform CalDAV plugin; lib/DAV/Calendar.php:207 VTODO calendar per board; lib/Db/Card.php:138-160 DUE, DTSTART and STATUS from the card; lib/DAV/CalendarObject.php:58-59 objects are read-only to CalDAV clients; src/components/DeckAppSettings.vue:22-23 per-user switch", "kanboard": "corpus: kanboard/round4/journeys.md 6 'the iCal feed (text/calendar, one VEVENT per dated task)' behind a public token ; source: app/Template/user_view/share.php:9 per-user iCal feed : read-only subscription, not CalDAV ; source read at v1.2.54: app/Template/user_view/share.php:9 per user 'iCal feed', app/Template/project_view/share.php:12 per project feed; app/Controller/ICalendarController.php:22 user, :62 project, token based and read only; searched app/ for 'caldav': none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/calendar/README.md 'Subscribe to a calendar: OpenProject allows you to subscribe to and access any of your calendars using an external client that supports the iCalendar format'; corpus: openproject/round4/menu-tree.md admin 'Calendar subscriptions' (iCal feed, read-only, counts as the generic capability) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/calendar/config/routes.rb:17 per calendar '/ical' feed; modules/calendar/app/controllers/calendar/ical_controller.rb:35 show; config/locales/js-en.yml:396 'use the URL (iCalendar) to subscribe to this calendar in an external client'; config/initializers/menus.rb:526-529 admin 'Calendar subscriptions'; a read-only iCal subscription, not two-way CalDAV", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 dates on an issue are due dates; no iCal or CalDAV feed in the 983 pages the corpus read (1.9 integrations page covers Confluence only)", - "plane": "corpus: plane/round4/code-census.md §12 'iCal / calendar feed: absent ... no feed a calendar client can subscribe to, and no CalDAV'" + "jira": "corpus: jira-data-center/round4/M1-column.md 12.13 dates on an issue are due dates; no iCal or CalDAV feed in the 983 pages the corpus read (1.9 integrations page covers Confluence only) ; docs read 2026-09-26: https://jira.atlassian.com/browse/JRASERVER-2971 'iCalendar support', Suggestion, Gathering Interest, 22 votes; https://marketplace.atlassian.com/apps/293/jira-calendar-plugin?hosting=datacenter the Atlassian calendar app is 'A gadget for displaying the Calendar in HTML format', no feed (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §12 'iCal / calendar feed: absent ... no feed a calendar client can subscribe to, and no CalDAV' ; source read at v1.4.2: searched apps/api/plane --include=*.py for 'ical', 'icalendar', 'vcalendar', 'BEGIN:VEVENT', 'caldav': none; the calendar is only an in-app layout, apps/web/core/components/issues/issue-layouts/roots/project-layout-root.tsx:34-35" }, "built": { "state": "none", @@ -2861,8 +2906,8 @@ "nextcloud-deck": "source: src/components/board/Board.vue:49 the Gantt view is per board; nothing combines boards on one timeline (the platform Calendar shows several board calendars, menu-tree.md Calendar, which is not a timeline) ; source read at v1.19.0: src/components/board/GanttView.vue:205-209 the timeline is built from this.stacks of the open board only; src/components/board/Board.vue:49 it is a view mode of one board; src/components/overview/Overview.vue:57-83 the cross-board view is due-date columns, not a timeline", "kanboard": "no timeline in core (pln-gantt) ; source read at v1.2.54: no timeline in core: searched app/ for 'gantt', only the comment at app/Analytic/AverageLeadCycleTimeAnalytic.php:91", "openproject": "corpus: openproject/round4/menu-tree.md global module 'Gantt charts' across projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart OpenProject-overarching-project-planning.png (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/gantt/config/routes.rb:16-24 global Gantt outside any project; modules/gantt/lib/open_project/gantt/engine.rb:60 global menu item; app/components/projects/index_page_header_component.rb:64-66 'Open as Gantt' from the project list via app/services/projects/gantt_query_generator_service.rb", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; Advanced Roadmaps plans take several projects and boards as sources (corpus: jira-data-center/round4/M1-column.md 8.8 plan releases across a plan)", - "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) layouts are spreadsheet and list only, no gantt; the gantt is per project. Corpus silent" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; Advanced Roadmaps plans take several projects and boards as sources (corpus: jira-data-center/round4/M1-column.md 8.8 plan releases across a plan) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html 'Issue sources - Choose which projects, boards, and filters you want to import'; 'A single plan can load up to 5,000 issues and can't contain more than 100 projects' (read 2026-09-26)", + "plane": "source: packages/constants/src/issue/filter.ts my_issues (workspace views) layouts are spreadsheet and list only, no gantt; the gantt is per project. Corpus silent ; source read at v1.4.2: packages/constants/src/issue/filter.ts:170-195 workspace views (my_issues) offer spreadsheet and list layouts, no gantt; the gantt root is mounted per project at apps/web/core/components/issues/issue-layouts/roots/project-layout-root.tsx:36-37" }, "built": { "state": "none", @@ -2891,8 +2936,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md Analytics 'Estimated vs actual time' ; source read at v1.2.54: app/Helper/TaskHelper.php:204-209 'Original estimate' on the task form; app/Template/subtask/create.php:20 subtask estimate; app/Template/subtask/timer.php:9 '%sh estimated'", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md:6 'estimated time, remaining time, work'; corpus: openproject/round4/M1-column.md 3.15 derived progress values (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/work_packages/base_contract.rb:77 estimated_hours (Work), :80 derived_estimated_hours, :83 remaining_hours; app/models/work_package.rb:646 duration strings parsed on write; shown as Work and Remaining work on the work package", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'When work is first logged against the issue, the Time Spent is subtracted from the Original Estimate'", - "plane": "source: packages/constants/src/estimates.ts:122-140 the 'time' (hours) estimate system is is_ee: true, and apps/web/core/components/estimates/create/helper.tsx:10-18 isEstimateSystemEnabled returns false for anything but POINTS and CATEGORIES; corpus: plane/round4/code-census.md §10 'Time tracking and worklogs: absent'. Time estimates are a paid-build feature, absent from Community" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'When work is first logged against the issue, the Time Spent is subtracted from the Original Estimate' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'Original Estimate Amount of time you believe is required to solve the issue' (read 2026-09-26)", + "plane": "source: packages/constants/src/estimates.ts:122-140 the 'time' (hours) estimate system is is_ee: true, and apps/web/core/components/estimates/create/helper.tsx:10-18 isEstimateSystemEnabled returns false for anything but POINTS and CATEGORIES; corpus: plane/round4/code-census.md §10 'Time tracking and worklogs: absent'. Time estimates are a paid-build feature, absent from Community ; source read at v1.4.2: packages/constants/src/estimates.ts:122-140 the 'time' hours system is is_ee: true, and apps/web/core/components/estimates/create/helper.tsx:10-18 isEstimateSystemEnabled returns false for it; apps/api/plane/db/models/estimate.py:13-15 EstimateType has only categories and points" }, "built": { "state": "built", @@ -2920,8 +2965,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; lib/Db has no time entry entity", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Model/TaskCreationModel.php:67 time_spent on the task form, app/Model/SubtaskTimeTrackingModel.php:245 updateSubtaskTimeSpent ; source read at v1.2.54: app/Template/task_modification/show.php:30 'Time spent' on the task edit form, app/Helper/TaskHelper.php:215-220; app/Template/subtask/edit.php:11 subtask time spent", "openproject": "corpus: openproject/round4/menu-tree.md project 'Time and costs'; docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md 'Log time'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/js-en.yml:168 'Log time'; modules/costs/app/components/time_entries/entry_dialog_component.rb the log time dialog; modules/costs/config/routes.rb:32 time_entries create, update, destroy; modules/costs/lib/costs/engine.rb:48-54 log_own_time and log_time permissions", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html work logs with 'Edit Own Work Logs' and 'Delete Own Work Logs' permissions", - "plane": "corpus: plane/round4/code-census.md §10 'There is no worklog table, no timer, no duration field, no UI'; menu-tree.md 'no Time tracking'. 'Full Time Tracking' is a Pro string (open-core.md)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html work logs with 'Edit Own Work Logs' and 'Delete Own Work Logs' permissions ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'When you log time for the first time, the time spent is subtracted from the original estimate'; needs 'the Work on Issues ... project permissions' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 'There is no worklog table, no timer, no duration field, no UI'; menu-tree.md 'no Time tracking'. 'Full Time Tracking' is a Pro string (open-core.md) ; source read at v1.4.2: apps/api/plane/db/models/project.py:98 is_time_tracking_enabled is an inert flag; searched apps/api/plane/db/models for 'worklog', 'time_spent', 'logged_time', 'duration': only the export choice at apps/api/plane/db/models/exporter.py:31, no worklog model" }, "built": { "state": "built", @@ -2949,8 +2994,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no duration field to type into: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; the only time inputs are date pickers, src/components/card/DueDateSelector.vue:10", "kanboard": "source: time fields are decimal hours rendered as '%sh spent' (app/Template/subtask/timer.php:3,9); no parsing of '1h 30m' found (grep -rniE '[0-9]h ?[0-9]+m' app/Core/DateParser.php returns nothing) ; source read at v1.2.54: app/Helper/TaskHelper.php:209,220 time fields are numeric decimal hours, app/Helper/FormHelper.php:381 numeric; app/Template/subtask/timer.php:3 '%sh spent'; searched app/Core/DateParser.php for an 'h m' duration parser: none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/duration_converter.rb:147 'ChronicDuration.parse(duration_string' and modules/costs/app/helpers/costs/number_helper.rb:79 falls back to DurationConverter.parse for hours strings, so '1h 30m' parses (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/app/components/time_entries/days_and_hours_form.rb:73-79 visible hours_display field with hidden hours; frontend/src/stimulus/controllers/dynamic/time-entry.controller.ts:166-171 parses it with durationStringToSeconds, so '1h 30m' works; app/services/duration_converter.rb:78, :140 server parse with ChronicDuration", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can specify additional time units after a time value X, such as Xw, Xd, Xh, or Xm'", - "plane": "corpus: plane/round4/code-census.md §8 'no duration type' and §10 no duration field" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can specify additional time units after a time value X, such as Xw, Xd, Xh, or Xm' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can specify additional time units after a time value X, such as Xw, Xd, Xh, or Xm, to represent weeks (w), days (d), hours (h), and minutes (m)' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §8 'no duration type' and §10 no duration field ; source read at v1.4.2: no time entry field exists; searched apps/api/plane/db/models for 'duration', 'time_spent': none, apps/api/plane/db/models/estimate.py:13-15 estimates are points or categories" }, "built": { "state": "built", @@ -2973,13 +3018,13 @@ "openproject": "yes", "plane": "no", "kanboard": "partial", - "jira": "no", + "jira": "partial", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; src/router.js:29-153 no timesheet route", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; source: app/Template/user_view/timesheet.php:5-23 'Subtask timesheet' per user with Start, End and Time spent, sortable by start, not grouped by date ; source read at v1.2.54: app/Template/user_view/sidebar.php:19 'Time tracking'; app/Controller/UserViewController.php:57 timesheet; app/Template/user_view/timesheet.php:5-15 'Subtask timesheet' rows with task, subtask, start, end, time spent, sortable but not grouped by date", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/my-time-tracking/README.md 'The My time tracking module offers a clear overview of your personal time entries' in 'a calendar or list view'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/config/routes.rb:59 '/time-tracking/(:mode-:view_mode)(/:date)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/config/routes.rb:50-56 /time-tracking by day, week, workweek or month in list or calendar view; modules/costs/app/controllers/my/time_tracking_controller.rb:45 index; modules/costs/app/components/my/time_tracking/list_stats_component.rb:51 totals per period", - "jira": "docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'; timesheets are the Marketplace apps Tempo Timesheets and Timesheet Reports and Gadgets, not the product", - "plane": "corpus: plane/round4/code-census.md §10 'The paid strings \"Full Time Tracking + Bulk Ops\", \"Historical timesheets\" ... are absent'" + "jira": "docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'; timesheets are the Marketplace apps Tempo Timesheets and Timesheet Reports and Gadgets, not the product ; 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', Closed, Won't Fix, 124 votes; https://marketplace.atlassian.com/apps/6572/timesheets-by-tempo-jira-time-tracking paid app, version 19.6.2-jira-11 (2026-09-24) compatible to Jira 11.3.11 (Marketplace REST API, read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 'The paid strings \"Full Time Tracking + Bulk Ops\", \"Historical timesheets\" ... are absent' ; source read at v1.4.2: packages/i18n/src/locales/en/empty-state.json:249-250 'Track timesheets for all members' is a string with no worklog model behind it; searched apps/api/plane/db/models for 'worklog': only the choice at apps/api/plane/db/models/exporter.py:31" }, "built": { "state": "built", @@ -3008,8 +3053,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: neither logged time nor an estimate exists: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time · Estimated vs actual time per column' ; source: app/Template/subtask/timer.php:2-9 spent/estimated on the subtask ; source read at v1.2.54: app/Template/task/time_tracking_summary.php:8-10 'Estimate', 'Spent', 'Remaining' on the task's time tracking page, app/Controller/TaskViewController.php:108-120; app/Template/subtask/timer.php:3-9 spent over estimated; app/Controller/AnalyticController.php:43 timeComparison", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/progress-tracking/README.md work and remaining work; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/work_packages/scopes/include_spent_time.rb (spent time beside work on the work package) Note: include_spent_time.rb is in the 18.0-dev tree only; the progress-tracking docs cited are present at v17.8.0, and spent time beside work predates the drive. ; source read at v17.8.0: lib/api/v3/work_packages/work_package_representer.rb:458 spent_time property beside estimated and remaining hours; app/contracts/work_packages/base_contract.rb:77-83 estimated_hours and remaining_hours; both shown as Spent time and Work in the work package details", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html Time Spent against Original Estimate and Remaining Estimate; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html Time Tracking Report shows 'Original Estimate, Estimated Time Remaining, Time Spent, and Accuracy'", - "plane": "corpus: plane/round4/code-census.md §10 no worklog; estimates are points or categories only (helper.tsx:10-18)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html Time Spent against Original Estimate and Remaining Estimate; docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html Time Tracking Report shows 'Original Estimate, Estimated Time Remaining, Time Spent, and Accuracy' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'the time spent is subtracted from the original estimate, and the resulting value is automatically presented in the remaining estimate' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 no worklog; estimates are points or categories only (helper.tsx:10-18) ; source read at v1.4.2: no logged time exists; apps/api/plane/db/models/estimate.py:13-15 estimates are points or categories and the hours system is enterprise only, packages/constants/src/estimates.ts:140 is_ee: true; searched apps/api/plane/db/models for 'worklog': only apps/api/plane/db/models/exporter.py:31" }, "built": { "state": "built", @@ -3038,8 +3083,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no time entry to correct: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field", "kanboard": "source: app/Template/task/time_tracking_details.php:5 'editable' => false : timer entries cannot be edited or removed; only the task and subtask time_spent totals are editable in their forms ; source read at v1.2.54: app/Template/task/time_tracking_details.php:15-29 timer entries listed with user, start, end, time spent and no edit or remove link; only the totals are editable, app/Template/task_modification/show.php:30 and app/Template/subtask/edit.php:11", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:22-23 'Edit logged time', 'Delete time entries' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/costs/app/controllers/time_entries_controller.rb:101 update and :125 destroy; modules/costs/config/routes.rb:32 time_entries update, destroy; modules/costs/lib/costs/engine.rb:61 edit_own_time_entries and :66 edit_time_entries", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can edit your own work log entries if you have been granted the Edit Own Work Logs permission' and 'delete your own work log entries'", - "plane": "corpus: plane/round4/code-census.md §10 no time entries exist to correct" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'You can edit your own work log entries if you have been granted the Edit Own Work Logs permission' and 'delete your own work log entries' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'Make sure you have the Work on Issues, Delete Work Logs, and Edit Work Logs project permissions' (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 no time entries exist to correct ; source read at v1.4.2: no time entry model: searched apps/api/plane/db/models for 'worklog', 'time_spent', 'duration': only the export choice at apps/api/plane/db/models/exporter.py:31; packages/types/src/issues/activity/base.ts:82 'WORKLOG' activity type has no emitter" }, "built": { "state": "built", @@ -3068,8 +3113,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; src/router.js:29-153 no report route", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Estimated vs actual time' per project and the per-user 'Time tracking' page (app/Template/user_view/sidebar.php:19); no report of time per person across projects ; source read at v1.2.54: app/Template/analytic/sidebar.php:22 'Estimated vs actual time' per project, app/Controller/AnalyticController.php:43; app/Template/user_view/sidebar.php:19 per user 'Time tracking'; no report of time per person across projects", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md time and cost reports grouped by user, project and more (corpus: openproject/round4/M1-column.md 10.4 'the reporting module is a real pivot engine over cost and time') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/reporting/config/routes.rb:31 cost_reports; modules/reporting/app/models/cost_query/group_by/user_id.rb and project_id.rb group time by person and project, with spent_on, week, tmonth and more beside them", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Time Tracking Report' per version and 'User Workload Report: Shows how much work a user has been allocated'; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'", - "plane": "corpus: plane/round4/code-census.md §10 'Dashboards: absent', no worklogs; Analytics is 'a two-dimensional count' of work items (menu-tree.md)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Time Tracking Report' per version and 'User Workload Report: Shows how much work a user has been allocated'; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Time Tracking Report Shows time tracking information on issues for a particular version of a project'; 'User Workload Report Shows how much work a user has been allocated': per version and per user, no per person per project report (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 'Dashboards: absent', no worklogs; Analytics is 'a two-dimensional count' of work items (menu-tree.md) ; source read at v1.4.2: apps/api/plane/app/views/analytic/advance.py:289-308 analytics chart counts work items by x_axis and group_by, no hours dimension; searched apps/api/plane/db/models for 'worklog': only apps/api/plane/db/models/exporter.py:31" }, "built": { "state": "built", @@ -3101,8 +3146,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; the row is specific to the fleet's HR app ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'humaniq', 'payroll': none; the row names the fleet's HR app, which Deck does not know", "kanboard": "the row is specific to the fleet's HR app; Kanboard stores time in its own subtask_time_tracking table only (corpus: kanboard/round4/code-census.md objects table) ; source read at v1.2.54: hours live only in Kanboard's own tables: app/Model/SubtaskTimeTrackingModel.php:245 updateSubtaskTimeSpent, :263 updateTaskTimeTracking; searched app/ for an HR or payroll hand-off: none", "openproject": "no HR app integration; time entries live in the costs module only (source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/models/time_entry.rb); corpus: openproject/round4/M1-column.md section 12 (Integrations) lists no HR system ; source read at v17.8.0: modules/costs/app/models/time_entry.rb:47-56 time entries live in OpenProject's own costs module; searched app, lib and modules (rb) for 'payroll': none, and no HR system integration exists", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.5 and 12.12 integrations list test management, source control and collaboration tools; no HR or payroll hand-off", - "plane": "corpus: plane/round4/code-census.md §10 no hours recorded at all, and no HR integration (§12)" + "jira": "corpus: jira-data-center/round4/M1-column.md 12.5 and 12.12 integrations list test management, source control and collaboration tools; no HR or payroll hand-off ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html lists Zephyr test management and source control integrations, nothing for HR or payroll; work logs live on the Jira issue only (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 no hours recorded at all, and no HR integration (§12) ; source read at v1.4.2: no hours recorded, apps/api/plane/db/models/project.py:98 is_time_tracking_enabled is inert; searched apps/api/plane --include=*.py for 'payroll', 'hr_': none" }, "built": { "state": "specified", @@ -3131,8 +3176,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; 'timer' in src/ is only the drag autoscroll interval at src/components/board/Stack.vue:365-391", "kanboard": "corpus: _round4/compare/promoted-rows-batch7.md 10.11 (Kanboard) 'tasks.time_estimated and time_spent, subtask time tracking with a start/stop timer ... a per-user timesheet (getUserTimesheet). Verified live' ; menu-tree.md task sidebar 'Time tracking' ; source: app/Model/SubtaskTimeTrackingModel.php:143 toggleTimer ; source read at v1.2.54: app/Template/subtask/timer.php:12-13 timer shown to the subtask's assignee; app/Helper/SubtaskHelper.php:80 renderTimer; app/Controller/SubtaskStatusController.php:44 timer, logStartTime and logEndTime", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/time-tracking/README.md:54 'Starting with OpenProject 13.0, you can also track time in real time using the start/stop time tracking button'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): modules/costs/app/controllers/my/timer_controller.rb (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-timer-button/wp-timer-button.component.ts:82 'Stop' and :99-100 stop via TimeEntryTimerService; frontend/src/app/shared/components/time_entries/timer/timer-account-menu.component.ts running timer in the account menu; modules/costs/app/models/time_entry.rb:47 ongoing time entries; modules/costs/config/routes.rb:49 /timer", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html documents logging entered durations only; timers are Marketplace apps", - "plane": "corpus: plane/round4/code-census.md §10 'no timer'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html documents logging entered durations only; timers are Marketplace apps ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html documents typed durations only ('Xw, Xd, Xh, or Xm'); a Marketplace search for a start and stop timer on Data Center found no clear match (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 'no timer' ; source read at v1.4.2: searched apps/api/plane/db and apps/api/plane/app --include=*.py for 'timer', 'start_timer', 'stop_timer': none; apps/api/plane/db/models/project.py:98 time tracking flag is inert" }, "built": { "state": "none", @@ -3155,13 +3200,13 @@ "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no", + "jira": "partial", "evidence": { "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'approv': none", "kanboard": "source: grep -rniE 'approv' app/Model returns no timesheet approval ; corpus: kanboard/round4/code-census.md objects table ; source read at v1.2.54: searched app/Model and app/Controller for 'approv': none; app/Template/user_view/timesheet.php:5 the timesheet is a read-only list", "openproject": "corpus: openproject/round4/M1-column.md 3.13 'grep -rliI approval|approve app/models modules/*/app/models returns nothing' ; source read at v17.8.0: searched app/models, modules/*/app/models, modules/costs and modules/reporting for 'approv': none; modules/costs/config/routes.rb:32 time entries have create, update, destroy only, no submit or approve", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.13 'the approval step is JSM DC'; no timesheet object to approve (tim-timesheet)", - "plane": "corpus: plane/round4/code-census.md §3 'Approvals: absent' and §10 no timesheets" + "jira": "corpus: jira-data-center/round4/M1-column.md 3.13 'the approval step is JSM DC'; no timesheet object to approve (tim-timesheet) ; 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 https://marketplace.atlassian.com/apps/6572/timesheets-by-tempo-jira-time-tracking paid app, highlight 'Approve timesheets and categorize billable and non-billable hours', build 19.6.2-jira-11 compatible to Jira 11.3.11; the product itself has no timesheet to approve (Marketplace REST API, read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §3 'Approvals: absent' and §10 no timesheets ; source read at v1.4.2: searched apps/api/plane --include=*.py for 'approval', 'approve': only OpenAPI prose at apps/api/plane/settings/openapi.py:95-96; no timesheet or approval model" }, "built": { "state": "none", @@ -3189,8 +3234,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: no time entries to export: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; the board export at src/components/navigation/BoardExportModal.vue:12-18 writes cards, not time", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Exports' ; source: app/Export/SubtaskExport.php:57-64 CSV with 'Time estimated', 'Time spent' per subtask; no export of individual time entries ; source read at v1.2.54: app/Template/project_header/dropdown.php:63 'Exports'; app/Export/SubtaskExport.php:57-64 CSV with 'Time estimated' and 'Time spent' per subtask; no export of the individual timer entries in app/Export", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md:93 'To export reports for time and costs to Excel you can open or create a report in the Time and costs module' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/reporting/app/controllers/cost_reports_controller.rb:78-85 the time and costs report answers format.xls and format.pdf exports; modules/reporting/config/routes.rb:31 cost_reports; modules/xls_export provides the spreadsheet writer", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'Export > CSV (All fields)' carries the issue's time spent fields (corpus: jira-data-center/round4/M1-column.md 10.3), not individual work logs; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project'", - "plane": "corpus: plane/round4/code-census.md §10 'exporter.py:31 lists (\"issue_worklogs\", \"Issue Worklogs\") ... but grep issue_worklogs finds no producer'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'Export > CSV (All fields)' carries the issue's time spent fields (corpus: jira-data-center/round4/M1-column.md 10.3), not individual work logs; docs: https://jira.atlassian.com/browse/JRASERVER-6137 'Generate worklog report', Closed, Won't Fix, 124 votes: 'It would be great to add a worklog report by user and/or by project' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'Click Export > CSV (All fields) or Export > CSV (Current fields)': issue rows carry time spent totals, not individual work log entries (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 'exporter.py:31 lists (\"issue_worklogs\", \"Issue Worklogs\") ... but grep issue_worklogs finds no producer' ; source read at v1.4.2: apps/api/plane/db/models/exporter.py:31 'issue_worklogs' is a choice with no producer: searched apps/api/plane --include=*.py outside migrations for 'issue_worklogs': only that line; no worklog rows exist to export" }, "built": { "state": "none", @@ -3218,8 +3263,8 @@ "nextcloud-deck": "corpus: _round4/compare/promoted-rows-batch6.md 10.11 (Deck) 'no time on a card; grep -rniE timesheet|hours|duration lib/Db returns 0 hits' ; nextcloud-deck/round4/code-census.md empty greps ; source read at v1.19.0: searched lib/ and src/ outside the importer for 'timesheet', 'timeSpent', 'worklog', 'estimat': only lib/UserMigration/DeckMigrator.php:64 export size; lib/Db/Card.php:73-96 no time field; searched lib/ and src/ for 'billable', 'invoice', 'hourlyRate': none", "kanboard": "corpus: kanboard/round4/code-census.md greps 'payment|stripe|ideal returns 26 hits and none is a payment' ; no invoicing hand-off ; source read at v1.2.54: searched app/ (outside Locale) for 'invoice' and 'payment': none; app/Export holds only SubtaskExport.php, TaskExport.php, TransitionExport.php", "openproject": "cost reports compute cash value from rates (docs: opf/openproject HEAD 27a58131 docs/user-guide/time-and-costs/reporting/README.md 'Labor, Cash value'), but no invoice object or accounting hand-off exists (corpus: openproject/round4/M1-column.md 12.12 'no payment integration') ; source read at v17.8.0: searched app, lib and modules (rb) for 'invoice': none; modules/reporting/app/controllers/cost_reports_controller.rb:84-85 time leaves only as an XLS or PDF report, with no billing or accounting hand-off", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'no payment provider ... nothing financial'", - "plane": "corpus: plane/round4/code-census.md §10 no billable time; §5 no customer entity" + "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'no payment provider ... nothing financial' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html no invoicing or financial integration in the product; https://marketplace.atlassian.com/apps/6572/timesheets-by-tempo-jira-time-tracking markets billable hours 'for seamless customer invoicing' but documents no hand-off to an invoicing system (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 no billable time; §5 no customer entity ; source read at v1.4.2: searched apps/api/plane/db/models --include=*.py for 'invoice', 'billable': none; no time entries, apps/api/plane/db/models/project.py:98 time tracking flag inert" }, "built": { "state": "none", @@ -3248,8 +3293,8 @@ "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload', 'hours': only date picker defaults and Gantt 'Hours' zoom, src/components/board/GanttView.vue:195; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'User repartition' (tasks per assignee per project) ; source: app/Controller/ProjectUserOverviewController.php manager view of users across projects : counts, not allocation ; source read at v1.2.54: app/Template/project_list/listing.php:18 'Users overview'; app/Controller/ProjectUserOverviewController.php:104 opens, :113 closed tasks per user across projects; app/Template/project_user_overview/sidebar.php:24-27; counts only, no allocation", "openproject": "corpus: openproject/round4/open-core.md resource_management and team_planner_view Enterprise gated; corpus: openproject/round4/code-census.md #22 'absent, 403 on every controller in the module, except the planners index'; docs: opf/openproject HEAD 27a58131 docs/user-guide/resource-management/README.md 'allocate work to users and monitor team capacity'. Free build: assignee grouping in work package queries only (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/resource_management/config/routes.rb:41 resource planners and :114 staffing; modules/resource_management/app/services/resource_allocations/availability.rb:111 capacity per user; modules/resource_management/app/controllers/resource_management/base_controller.rb:41-43 every action behind the :resource_management Enterprise token; modules/team_planner/app/controllers/team_planner/team_planner_controller.rb:14 team planner likewise gated", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report: Shows how much work a user has been allocated, and how long it should take'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps team capacity per sprint in hours or story points", - "plane": "corpus: plane/round4/code-census.md §10 no time or allocation data; menu-tree.md 'no Dashboards, no Reports beyond a two-dimensional Analytics count'" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report: Shows how much work a user has been allocated, and how long it should take'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps team capacity per sprint in hours or story points ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report Shows how much work a user has been allocated ... the remaining workload, on a per-project basis'; https://confluence.atlassian.com/jirasoftwareserver/capacity-and-velocity-in-advanced-roadmaps-1044784184.html team capacity per iteration (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 no time or allocation data; menu-tree.md 'no Dashboards, no Reports beyond a two-dimensional Analytics count' ; source read at v1.4.2: searched apps/api/plane/db/models --include=*.py for 'capacity', 'allocation', 'availability': none; apps/api/plane/app/views/analytic/advance.py:289-308 analytics counts work items only" }, "built": { "state": "built", @@ -3281,8 +3326,8 @@ "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload', 'hours': only date picker defaults and Gantt 'Hours' zoom, src/components/board/GanttView.vue:195; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours; the board sidebar tabs are sharing, tags, deleted items and activity, src/components/board/BoardSidebar.vue", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Task distribution · User repartition' per project : task counts per column and per user, no capacity ; source read at v1.2.54: app/Controller/AnalyticController.php:87 taskDistribution, :103 userDistribution; app/Template/analytic/sidebar.php:4-7 'Task distribution', 'User repartition': task counts per column and per user, no capacity", "openproject": "project capacity is the resource planner (Enterprise gated, corpus: openproject/round4/code-census.md #22); free build shows work and remaining work totals per project query (corpus: openproject/round4/M1-column.md 3.15 progress values) ; source read at v17.8.0: modules/resource_management/config/locales/en.yml:98 'available, scheduled' capacity summary and :129 'start planning capacity for this project'; modules/resource_management/lib/open_project/resource_management/engine.rb:120-124 project menu entry needs the resource_management token; free build shows only Work and Remaining work sums, app/contracts/work_packages/base_contract.rb:80", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Workload Report'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps 'If you set the capacity at 40 hours, the sprint's capacity will be 80 hours' (per team, not per project)", - "plane": "corpus: plane/round4/code-census.md §10 no allocation or hours model; project analytics are work item counts (project_analytics.py:44,97)" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Workload Report'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps 'If you set the capacity at 40 hours, the sprint's capacity will be 80 hours' (per team, not per project) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Workload Report Shows how much outstanding work there is (per user and per issue) before a given version is complete': per version, no project capacity summary (read 2026-09-26)", + "plane": "corpus: plane/round4/code-census.md §10 no allocation or hours model; project analytics are work item counts (project_analytics.py:44,97) ; source read at v1.4.2: apps/api/plane/app/views/analytic/project_analytics.py:44,97 project analytics are work item counts and stats; searched apps/api/plane/db/models for 'capacity', 'allocation': none" }, "built": { "state": "built", @@ -3311,8 +3356,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards' is a navigation list with no state or progress ; source read at v1.19.0: src/components/boards/Boards.vue:9-23 'All boards' is a table of 'Board name' and 'Members' only, with no status, progress or due counts per board; src/router.js:55-60; searched src/ for 'portfolio', 'progress' on boards: none", "kanboard": "corpus: kanboard/round4/menu-tree.md header 'Projects management' ; source: app/Template/project_user_overview/ manager overview of projects, users and open tasks; no portfolio health view ; source read at v1.2.54: app/Template/dashboard/overview.php:21-47 all projects with open tasks per column; app/Template/project_user_overview/sidebar.php:18-27 managers, members, open and closed tasks across projects; no health or status rollup", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:44 'create a multi-project status dashboard if you include your own project attributes or project life cycle phases' and project status filters (:129); portfolio and program workspaces are Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/queries/projects/filters/project_status_filter.rb:35 project status on the free projects list with custom project attribute columns; app/components/projects/index_page_header_component.rb:64-66 open all as one Gantt; config/initializers/menus.rb:34-44 the separate Portfolios module needs :portfolio_management", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html issue sources 'determine which projects, boards, and filters you want to import', a plan holds up to 100 projects (Advanced Roadmaps, bundled)", - "plane": "corpus: plane/round4/menu-tree.md workspace 'Projects', 'Analytics'; code-census.md §10 AnalyticsEndpoint and AdvanceAnalyticsChartEndpoint 'a two-dimensional count, not a report builder'. A workspace-level count across projects, no portfolio health view" + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html issue sources 'determine which projects, boards, and filters you want to import', a plan holds up to 100 projects (Advanced Roadmaps, bundled) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html 'Issue sources - Choose which projects, boards, and filters you want to import'; 'For a program: Connected plans - choose the plans you want to c[onnect]' (read 2026-09-26)", + "plane": "corpus: plane/round4/menu-tree.md workspace 'Projects', 'Analytics'; code-census.md §10 AnalyticsEndpoint and AdvanceAnalyticsChartEndpoint 'a two-dimensional count, not a report builder'. A workspace-level count across projects, no portfolio health view ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx workspace analytics; apps/web/core/components/analytics/overview/root.tsx:10-19 active projects and project insights, apps/web/core/components/analytics/overview/active-project-item.tsx:37-62 percent complete per project; apps/api/plane/app/urls/analytic.py:61 advance-analytics, apps/api/plane/app/views/analytic/advance.py:43. Counts and completion only, no health or status" }, "built": { "state": "built", @@ -3341,8 +3386,8 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow' ; 'Upcoming cards cards assigned to me across boards' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers dashboard widgets DeckWidgetUpcoming, DeckWidgetToday, DeckWidgetTomorrow, lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards'; inside Deck src/router.js:36-38 /upcoming renders src/components/overview/Overview.vue:57-83 my cards by due date", "kanboard": "corpus: kanboard/round4/M1-column.md 10.2 'the dashboard is fixed: projects, my tasks, my subtasks, calendar, activity (DashboardController)' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:4-13 'Overview', 'My projects', 'My tasks', 'My subtasks'; app/Controller/DashboardController.php:18 show, :35 tasks, :51 subtasks; app/Template/dashboard/layout.php:18 'My activity stream'", "openproject": "corpus: openproject/round4/menu-tree.md 'My page personal dashboard, grid of widgets'; corpus: openproject/round4/M1-column.md 10.2 'modules/my_page/, the same grid machinery per user' ; source read at v17.8.0: modules/my_page/config/routes.rb:3 /my/page; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' and :87 'work_packages_created' default widgets on a per user grid", - "jira": "corpus: jira-data-center/round4/M1-column.md 10.2 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on'", - "plane": "corpus: plane/round4/journeys.md 'Manage widgets ... exactly three toggles: Quicklinks, Recents, Your stickies' and 'there is no dashboard route'; menu-tree.md 'Your work' gives the personal item list" + "jira": "corpus: jira-data-center/round4/M1-column.md 10.2 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on' (read 2026-09-26)", + "plane": "corpus: plane/round4/journeys.md 'Manage widgets ... exactly three toggles: Quicklinks, Recents, Your stickies' and 'there is no dashboard route'; menu-tree.md 'Your work' gives the personal item list ; source read at v1.4.2: apps/web/core/components/home/home-dashboard-widgets.tsx:34-52 the home page has a fixed widget set: quick_links, recents, my_stickies, new_at_plane; searched apps/web/app for a dashboard page.tsx: none; the backend Dashboard model was renamed away, apps/api/plane/db/migrations/0090_rename_dashboard_deprecateddashboard_and_more.py:1" }, "built": { "state": "built", @@ -3375,7 +3420,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 3.5 'the dashboard shows \"My tasks\" and \"My subtasks\"' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:10 'My tasks', :13 'My subtasks'; app/Controller/DashboardController.php:35-41 tasks via getDashboardPaginator for the user across projects; app/Template/dashboard/tasks.php:2", "openproject": "corpus: openproject/round4/M1-column.md 3.5 'default queries ship and modules/my_page/ renders personal ones'; global 'Work packages' module across projects (corpus: openproject/round4/menu-tree.md) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:41 'assigned_to_me' among the default queries, built at :115; app/menus/work_packages/menu.rb:40-50 lists them in the global Work packages menu across all projects; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' widget", "jira": "corpus: jira-data-center/round4/M1-column.md 3.5 'predefined system filters for common queries, such as My Open Issues'", - "plane": "corpus: plane/round4/menu-tree.md workspace 'Your work' ; M1-column.md 5.4 'a workspace member's profile page aggregates their assigned and created work items' ; source: filter.ts profile_issues list and kanban grouped by project" + "plane": "corpus: plane/round4/menu-tree.md workspace 'Your work' ; M1-column.md 5.4 'a workspace member's profile page aggregates their assigned and created work items' ; source: filter.ts profile_issues list and kanban grouped by project ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/[profileViewId]/page.tsx assigned, created and subscribed tabs; packages/constants/src/issue/filter.ts:113-131 profile_issues list and kanban grouped by project; apps/api/plane/app/urls/workspace.py:153 user-issues route, apps/api/plane/app/views/workspace/user.py:98 WorkspaceUserProfileIssuesEndpoint" }, "built": { "state": "specified", @@ -3405,7 +3450,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md board filter 'due today, due tomorrow, due yesterday, closed, open' and Analytics 'Task distribution' ; no blocked count ; source read at v1.2.54: app/Template/app/filters_helper.php:8-12 'Tasks due today', 'Tasks due yesterday', 'Closed tasks', 'Open tasks' as filters; app/Template/analytic/sidebar.php:4 'Task distribution' per column; no blocked count and no single status report", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/models/queries/work_packages/filter/blocked_filter.rb (relation 'blocked by'), due_date_filter.rb, status open/closed filters; saved as a query and shown in a widget (corpus: openproject/round4/M1-column.md 10.10) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:38 'overdue' default query; app/models/queries/work_packages/filter/blocked_filter.rb:33, due_date_filter.rb and status_filter.rb filters, saved as queries and shown as widgets or in app/menus/work_packages/menu.rb:40", "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'Find all overdue issues: duedate < now() and resolution is empty' and gadgets over filters (10.10); blocked is not a state or a documented JQL field in DC, only a link on each issue", - "plane": "corpus: plane/round4/code-census.md §10 analytics chart 'x_axis (default PRIORITY) and an optional group_by' counts by state; M1-column.md 8.2 'The server holds no overdue state', and blocked is not a groupable dimension" + "plane": "corpus: plane/round4/code-census.md §10 analytics chart 'x_axis (default PRIORITY) and an optional group_by' counts by state; M1-column.md 8.2 'The server holds no overdue state', and blocked is not a groupable dimension ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/page.tsx profile overview; apps/api/plane/app/views/workspace/user.py:409 state_distribution and :468 pending_issues_count; apps/api/plane/app/views/analytic/advance.py:289-308 counts by x_axis. Searched apps/api/plane/app/views/workspace/user.py and apps/api/plane/app/views/analytic for 'overdue', 'target_date__lt': none, blocked is no dimension" }, "built": { "state": "built", @@ -3439,7 +3484,7 @@ "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; time estimates exist per task (promoted-rows-batch7.md 10.11) but nothing sets them against availability ; source read at v1.2.54: searched app/ (outside Locale) for 'availability', 'capacity', 'vacation', 'absence', 'out of office': only a password reset comment; estimates exist per task, app/Helper/TaskHelper.php:208, but nothing sets a person's available hours", "openproject": "user working hours and time off are recorded (docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md:11 'define your working schedule, plan future schedule changes, and manage your time off'), but the planner that sets workload against them is resource management, Enterprise gated (corpus: openproject/round4/code-census.md #22) Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/routes.rb:1120-1121 per user working hours and non working times, free, with config/initializers/menus.rb:277-279 'Schedule and availability'; modules/resource_management/app/services/resource_allocations/availability.rb:111 hours against availability only in the resource planner, gated at modules/resource_management/app/controllers/resource_management/base_controller.rb:41-43", "jira": "docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps capacity is set per team per sprint in hours ('If you set the capacity at 40 hours'); per-person hours against availability are not in the 11.3 page", - "plane": "corpus: plane/round4/code-census.md §10 no hours logged and no availability model" + "plane": "corpus: plane/round4/code-census.md §10 no hours logged and no availability model ; source read at v1.4.2: no hours or availability: searched apps/api/plane/db/models --include=*.py for 'capacity', 'availability', 'leave', 'out.?of.?office': none; apps/api/plane/db/models/project.py:98 time tracking flag inert" }, "built": { "state": "decided-no", @@ -3469,7 +3514,7 @@ "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; source read at v1.2.54: searched app/ (outside Locale) for 'capacity', 'availability': no capacity object to exceed; app/Controller/ProjectUserOverviewController.php:104 counts open tasks only", "openproject": "only inside the Enterprise resource planner (corpus: openproject/round4/code-census.md #22); nothing on the free build warns about an over-planned person ; source read at v17.8.0: modules/resource_management/app/services/resource_allocations/availability.rb:52-53 overbooked?; modules/resource_management/config/locales/en.yml:237 'This user is over-allocated in the selected period.'; modules/resource_management/app/controllers/resource_management/work_package_timeline/events_controller.rb:41 marks overbooked allocations, all behind the resource_management token", "jira": "docs: docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps and https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'the Auto-scheduler will assign tasks to sprints based on the size of an issue, team capacity, and sprint length': capacity per team and sprint, no per-person warning documented", - "plane": "corpus: plane/round4/code-census.md §10 no capacity data to warn on" + "plane": "corpus: plane/round4/code-census.md §10 no capacity data to warn on ; source read at v1.4.2: no capacity data: searched apps/api/plane/db/models --include=*.py for 'capacity', 'allocation': none; apps/api/plane/celery.py:44-88 has no workload check" }, "built": { "state": "none", @@ -3498,7 +3543,7 @@ "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 13.17 'grep out.?of.?office|substitut|delegat|absence returns 0' ; source read at v1.2.54: searched app/ (outside Locale) for 'out of office', 'absence', 'vacation', 'holiday', 'working day': none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md time off and individual working hours per user (free); instance working days drive scheduling (corpus: openproject/round4/M1-column.md section 8); using personal time off in planning is resource management, Enterprise gated Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/routes.rb:1121 user non working times (time off) and :1120 working hours, free; modules/resource_management/app/services/resource_allocations/working_time_calendar.rb:17-18 and :81 subtract UserNonWorkingTime and holidays from capacity, only inside the Enterprise resource planner; free scheduling uses app/services/work_packages/shared/days.rb:38 instance working days", "jira": "not checked: absences appear in the old standalone Advanced Roadmaps 3.29 docs (Configuring the availability of team members) but not in the Jira Software 11.3 Advanced Roadmaps pages read (Teams, Capacity and velocity, Auto-schedule)", - "plane": "corpus: plane/round4/code-census.md §8 no working-day calendar ('holiday|working_day' 0 hits); M1-column.md 13.12 'out.of.office' grep returns nothing" + "plane": "corpus: plane/round4/code-census.md §8 no working-day calendar ('holiday|working_day' 0 hits); M1-column.md 13.12 'out.of.office' grep returns nothing ; source read at v1.4.2: searched apps/api/plane/db/models --include=*.py for 'leave', 'out.?of.?office', 'vacation', 'holiday': only a code comment at apps/api/plane/db/models/base.py:37" }, "built": { "state": "decided-no", @@ -3528,7 +3573,7 @@ "kanboard": "corpus: kanboard/round4/code-census.md 'payment|stripe|ideal returns 26 hits and none is a payment' ; no budget field on a project ; source read at v1.2.54: searched app/Model and app/Schema/Sqlite.php for 'budget', 'cost': none; app/Schema/Sqlite.php:1526-1530 projects table carries no money field", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:15 'If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31-37 budgets; modules/budgets/app/models/budget.rb:120-123 budget_ratio and :150-151 spent from material and labor; modules/budgets/app/views/budgets/show.html.erb:47-48 spent ratio bar and :79 'Spent'", "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'nothing financial'; no budget object in Jira Software", - "plane": "corpus: plane/round4/code-census.md §2 fixed fields and no custom fields; no budget or cost model in db/models" + "plane": "corpus: plane/round4/code-census.md §2 fixed fields and no custom fields; no budget or cost model in db/models ; source read at v1.4.2: searched apps/api/plane/db/models --include=*.py for 'budget', 'cost': none; Project fields at apps/api/plane/db/models/project.py:68-117 carry no money" }, "built": { "state": "none", @@ -3558,7 +3603,7 @@ "kanboard": "source: a task has one owner_id, a user (app/Model/TaskCreationModel.php:67); no placeholder role ; source read at v1.2.54: app/Helper/TaskHelper.php:126-127 the assignee select lists users only; app/Schema/Sqlite.php:1553 tasks.owner_id is a user id; searched app/Model for 'placeholder' roles on tasks: none", "openproject": "corpus: openproject/round4/open-core.md placeholder_users Enterprise gated; corpus: openproject/round4/code-census.md #18 'absent from the UI and refused server side, for creation only' ; source read at v17.8.0: config/initializers/menus.rb:324-325 admin 'Placeholder users'; config/initializers/permissions.rb:106 placeholder_users actions; app/contracts/placeholder_users/create_contract.rb:34 creating one needs the :placeholder_users Enterprise token", "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html does not address members who are not Jira users; virtual members existed in the standalone Portfolio product and were not confirmed for DC 11", - "plane": "corpus: plane/round4/code-census.md §5 'Every actor in Plane is a User row with a login'; assignees are users only" + "plane": "corpus: plane/round4/code-census.md §5 'Every actor in Plane is a User row with a login'; assignees are users only ; source read at v1.4.2: apps/api/plane/db/models/issue.py:149-152 assignees is a ManyToMany to AUTH_USER_MODEL, so only real users can be assigned; searched apps/api/plane/db/models for 'placeholder', 'role_slot': none" }, "built": { "state": "none", @@ -3587,7 +3632,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Cumulative flow diagram' ; M1-column.md 10.4 'from project_daily_column_stats' ; source read at v1.2.54: app/Template/analytic/sidebar.php:10 'Cumulative flow diagram'; app/Controller/AnalyticController.php:119 cfd; assets/js/components/chart-project-cumulative-flow.js renders it", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'cumulative.flow|cycle.time|lead.time' over app, modules and frontend/src returns nothing ; source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml, erb) for 'cumulative flow', 'cycle time', 'lead time', 'cycle_time', 'lead_time': none; modules/backlogs/app/components/backlogs/sprint_reports/widgets holds burndown and goal only", "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'the Cumulative Flow Diagram is an area chart that shows the various statuses of work items'", - "plane": "corpus: plane/round4/code-census.md §10 analytics are two-dimensional counts; source: grep -rliE 'cumulative' in packages/i18n/src/locales/en returns nothing" + "plane": "corpus: plane/round4/code-census.md §10 analytics are two-dimensional counts; source: grep -rliE 'cumulative' in packages/i18n/src/locales/en returns nothing ; source read at v1.4.2: searched packages/i18n/src/locales/en and apps/web/core for 'cumulative': only the swimlane prop isSubGroupCumulative at apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx:41, no flow chart; apps/api/plane/app/views/analytic/advance.py:289-308 is a two-dimensional count" }, "built": { "state": "none", @@ -3616,7 +3661,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 10.4 'lead and cycle time per task and averaged (TaskAnalyticModel::getLeadTime, getCycleTime)' ; source read at v1.2.54: app/Template/analytic/sidebar.php:19 'Lead and cycle time', app/Template/analytic/lead_cycle_time.php:3 averages; app/Controller/AnalyticController.php:21 leadAndCycleTime; app/Template/task/analytics.php:14-15 per task; app/Model/TaskAnalyticModel.php:22 getLeadTime, :34 getCycleTime", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): same grep, no cycle or lead time report; corpus: openproject/round4/M1-column.md 10.4 'There is no cycle time, no heatmap and no phase duration analysis' ; source read at v17.8.0: same search as prt-cumulative-flow, app, lib, modules and frontend/src for 'cycle_time', 'lead_time', 'cycle time', 'lead time': none; modules/reporting/app/models/cost_query/group_by holds time and cost groupings, no duration of work", "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'The Control Chart shows the cycle time and lead time for your product, version, or sprint'", - "plane": "corpus: plane/round4/M1-column.md 10.4 'no duration recorded anywhere'; completed_at exists (issue.py:236-249) but no lead or cycle time report" + "plane": "corpus: plane/round4/M1-column.md 10.4 'no duration recorded anywhere'; completed_at exists (issue.py:236-249) but no lead or cycle time report ; source read at v1.4.2: apps/api/plane/db/models/issue.py:159 completed_at is stored but searched apps/api/plane --include=*.py for 'lead.?time', 'cycle.?time': none, no report computes it" }, "built": { "state": "none", @@ -3646,7 +3691,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 'Exports on the project menu: tasks, subtasks, transitions and daily summaries as CSV with a date range' ; source read at v1.2.54: app/Template/project_header/dropdown.php:63 'Exports'; app/Template/export/header.php:5-14 Tasks, Subtasks, Task transitions, Daily project summary; app/Controller/ExportController.php:34-35 CSV download; searched app/Controller and app/Export for 'pdf': none", "openproject": "corpus: openproject/round4/M1-column.md 10.3 'CSV and PDF registered at config/initializers/export_formats.rb:33-34, XLS added by modules/xls_export' ; source read at v17.8.0: config/initializers/export_formats.rb:34 CSV and :35 PDF list exports, :37 single work package PDF; modules/xls_export/lib/open_project/xls_export/engine.rb:15-18 adds XLS; config/routes.rb:1007 work package export dialog on the list", "jira": "corpus: jira-data-center/round4/M1-column.md 10.3 'Export > CSV (All fields)'; other formats 'XML, Word and Printable', no XLSX or PDF", - "plane": "corpus: plane/round4/code-census.md §10 'ExporterHistory: provider in json / csv / xlsx' ; M1-column.md 10.3 yes. CSV and spreadsheet yes; PDF export exists only for pages (code-census.md §4), not tasks" + "plane": "corpus: plane/round4/code-census.md §10 'ExporterHistory: provider in json / csv / xlsx' ; M1-column.md 10.3 yes. CSV and spreadsheet yes; PDF export exists only for pages (code-census.md §4), not tasks ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/exports/page.tsx and apps/web/core/components/exporter/export-modal.tsx:91 CSV, Excel, JSON; apps/api/plane/app/urls/exporter.py:12 export-issues, apps/api/plane/app/views/exporter/base.py:23 post; apps/api/plane/db/models/exporter.py:36 providers json, csv, xlsx. PDF only for pages, apps/web/core/components/pages/modals/export-page-modal.tsx" }, "built": { "state": "built", @@ -3676,7 +3721,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 5 shared custom filter saved ; code-census.md 'saved searches custom_filters.is_shared' : a saved query, no report builder ; source read at v1.2.54: app/Template/custom_filter/create.php:14 a saved and shareable query; app/Controller/CustomFilterController.php:57 save; the eight fixed charts in app/Template/analytic/sidebar.php:4-25; no report builder", "openproject": "corpus: openproject/round4/M1-column.md 9.3 personal saved queries, 10.1 widgets, 10.4 cost report pivot engine ; source read at v17.8.0: config/locales/js-en.yml:591 'Save as' a work package view; app/contracts/queries/base_contract.rb:38 sums and :53 group_by saved on a query; modules/reporting/config/routes.rb:49-52 cost report save_as; modules/reporting/app/controllers/cost_reports_controller.rb:146 create", "jira": "corpus: jira-data-center/round4/M1-column.md 9.3 saved filters, 10.1 gadgets 'Issue Statistics', 'Pie Chart', 10.10 'Filter Results'", - "plane": "corpus: plane/round4/code-census.md §9 saved IssueView with filters, display_filters and display_properties (a saved query); §10 'Custom Reports (BUSINESS) are absent' and analytics is a two-dimensional count" + "plane": "corpus: plane/round4/code-census.md §9 saved IssueView with filters, display_filters and display_properties (a saved query); §10 'Custom Reports (BUSINESS) are absent' and analytics is a two-dimensional count ; source read at v1.4.2: apps/web/core/components/views/form.tsx:98 saved view form; apps/api/plane/db/models/view.py:58-64 IssueView stores filters and display_properties, a saved query; apps/api/plane/app/views/analytic/advance.py:289-308 analytics is a fixed x_axis by group_by count, no report builder" }, "built": { "state": "none", @@ -3705,7 +3750,7 @@ "kanboard": "not a Nextcloud app; corpus: kanboard/round4/code-census.md empty grep 'widget' ; M1-column.md 9.12 'no' platform integration ; source read at v1.2.54: a standalone PHP application, not a Nextcloud app; searched app/ (outside Locale) for 'widget', 'nextcloud': none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard' (OpenProject Integration app for Nextcloud); notifications, not a task list (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard', served by the separate Nextcloud app from lib/api/v3/notifications/notification_collection_representer.rb; notifications, not a task list; the widget code is not in this repository", "jira": "not a Nextcloud product and no Nextcloud app from Atlassian; its own dashboard is prt-dashboard (corpus: jira-data-center/round4/M1-column.md 10.2); corpus: jira-data-center/round4/M1-column.md 1.9 integrations page covers Confluence only", - "plane": "corpus: plane/round4/M1-column.md 9.12 'Plane is not hosted in a platform'; no Nextcloud dashboard widget" + "plane": "corpus: plane/round4/M1-column.md 9.12 'Plane is not hosted in a platform'; no Nextcloud dashboard widget ; source read at v1.4.2: Plane is a standalone Django and React app with no Nextcloud dashboard widget: searched apps and packages for 'nextcloud', 'OCP', 'IWidget': none; the only home widgets are Plane's own, apps/web/core/components/home/home-dashboard-widgets.tsx:34-52" }, "built": { "state": "built", @@ -3735,7 +3780,7 @@ "kanboard": "not a Nextcloud app; its own project activity stream (corpus: kanboard/round4/menu-tree.md project 'Activity', task 'Activity stream' ; code-census.md 'event log project_activities') ; source read at v1.2.54: not a Nextcloud app, so no Nextcloud activity stream; its own stream: app/Template/project_header/dropdown.php:38 'Activity', app/Controller/ActivityController.php:34 project, :50 task; app/ServiceProvider/NotificationProvider.php:39 ActivityStreamNotification", "openproject": "own activity module per project (docs: opf/openproject HEAD 27a58131 docs/user-guide/activity; corpus: openproject/round4/M1-column.md 10.5 'the activity view aggregates them per project'); the Nextcloud integration offers dashboard, search and link preview (docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22-25), no Nextcloud activity stream entries (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:555 OpenProject's own per project Activity page; config/initializers/menus.rb:702-705 project 'Activity' menu; searched modules/storages/app (rb) for 'activity': no event pushed into the Nextcloud activity stream, the Nextcloud side is a separate app", "jira": "corpus: jira-data-center/round4/M1-column.md 5.4 'Your user profile also displays recent work in the Activity Stream' (own activity stream, not a host platform's)", - "plane": "corpus: plane/round4/code-census.md §6 'IssueActivity ... ACTIVITY_MAPPER with 28 entries, all issue-scoped'; a per work item feed inside Plane, no workspace activity stream and no Nextcloud activity integration; project settings changes are not recorded (§13)" + "plane": "corpus: plane/round4/code-census.md §6 'IssueActivity ... ACTIVITY_MAPPER with 28 entries, all issue-scoped'; a per work item feed inside Plane, no workspace activity stream and no Nextcloud activity integration; project settings changes are not recorded (§13) ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/main-content.tsx:184 per work item activity feed; apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx per user activity; apps/api/plane/bgtasks/issue_activities_task.py:1540 ACTIVITY_MAPPER is issue scoped. No Nextcloud activity integration: searched apps and packages for 'nextcloud': none" }, "built": { "state": "built", @@ -3765,7 +3810,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 2.20 'the board polls: BoardAjaxController::check ... every board_private_refresh_interval seconds (10 by default) ... the task page does not refresh' ; source read at v1.2.54: assets/js/src/BoardPolling.js:1-15 the board polls on an interval; app/Template/board/table_container.php:13 data-check-interval from board_private_refresh_interval; app/Controller/BoardAjaxController.php:65 check; no push and no refresh on the task page", "openproject": "corpus: openproject/round4/M1-column.md 2.20 'The work package page does not update when someone else edits it' ; 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 frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/polling.controller.ts:45 polls every 10 s by default, :135 setInterval, :243-256 when the latest change is from another user it refreshes the work package fields or warns of a conflict; app/components/work_packages/activities_tab/lazy_index_component.rb:127-128 interval setting; boards and lists have no such polling", "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 'JSWSERVER-4452 (Agile board should refresh automatically whenever someone moves a card ...), Gathering Interest, 246 votes'", - "plane": "corpus: plane/round4/code-census.md §12 'apps/live/src/types/index.ts:26 export type TDocumentTypes = \"project_page\"; ... pages collaborate live; issue descriptions and comments do not' ; M1-column.md 2.20 partial" + "plane": "corpus: plane/round4/code-census.md §12 'apps/live/src/types/index.ts:26 export type TDocumentTypes = \"project_page\"; ... pages collaborate live; issue descriptions and comments do not' ; M1-column.md 2.20 partial ; source read at v1.4.2: apps/live/src/types/index.ts:26 TDocumentTypes is only 'project_page'; packages/editor/src/core/extensions/extensions.ts:7,62 HocuspocusProvider for the page editor. Searched apps/web/core/store for 'socket', 'websocket', 'EventSource': none, so work item lists and boards refresh only on fetch" }, "built": { "state": "built", @@ -3795,7 +3840,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 6.8 web notifications with the assignee filter ; source: app/Subscriber/NotificationSubscriber.php task events to app/Notification/ (web, mail) ; source read at v1.2.54: app/Subscriber/NotificationSubscriber.php:27 TaskModel::EVENT_ASSIGNEE_CHANGE handled; app/Template/notification/task_assignee_change.php:9 'Assigned to %s'; app/Template/header/user_notifications.php:3 bell with unread notifications", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:18 'Be notified of activities on some or all of the work packages in which you are participating (as assignee, responsible or watcher)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/notification.rb:34 reason 'assigned'; app/models/notification_setting.rb:33 ASSIGNEE setting; app/services/notifications/create_from_model_service/work_package_strategy.rb derives the recipients; config/initializers/menus.rb:301-303 'Notifications and email' settings page", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur' (corpus: jira-data-center/round4/M1-column.md 8.6); Issue Assigned is a notification scheme event", - "plane": "corpus: plane/round4/M1-column.md 6.8 'Notification with read_at, snoozed_till, archived_at' ; source: apps/api/plane/bgtasks/issue_activities_task.py:396-408 a new assignee is added as IssueSubscriber, and bgtasks/notification_task.py:303-315 sends them 'in_app:issue_activities:assigned'" + "plane": "corpus: plane/round4/M1-column.md 6.8 'Notification with read_at, snoozed_till, archived_at' ; source: apps/api/plane/bgtasks/issue_activities_task.py:396-408 a new assignee is added as IssueSubscriber, and bgtasks/notification_task.py:303-315 sends them 'in_app:issue_activities:assigned' ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/notifications/page.tsx:12,31 NotificationsRoot inbox; apps/api/plane/bgtasks/issue_activities_task.py:357-371 track_assignees and :395-398 adds the new assignee as IssueSubscriber; apps/api/plane/bgtasks/notification_task.py:280-311 notifies subscribers" }, "built": { "state": "built", @@ -3825,7 +3870,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies' and 6.8 notifications to assignee or creator ; source: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE => handleEvent, app/Template/notification/comment_create.php ; source read at v1.2.54: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE handled; app/Template/notification/comment_create.php:3 mail body; app/Template/user_view/notifications.php:13 limit to tasks assigned to or created by me", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:27-29 participants are notified of all activities by default; docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/notification.rb:37 reason 'commented' and :33 'mentioned'; app/models/notification_setting.rb:41 WORK_PACKAGE_COMMENTED; app/services/notifications/create_from_model_service.rb:33 mention parsing", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html events 'when an issue is created or completed, or when any issue fields are updated' (corpus: jira-data-center/round4/M1-column.md 8.6), comments included; push notifications for watched issues and mentions (Push notifications page)", - "plane": "corpus: plane/round4/code-census.md §6 UserNotificationPreference 'comment' boolean ; source: bgtasks/notification_task.py:267 comment mentions and subscribers notified" + "plane": "corpus: plane/round4/code-census.md §6 UserNotificationPreference 'comment' boolean ; source: bgtasks/notification_task.py:267 comment mentions and subscribers notified ; source read at v1.4.2: apps/web/core/components/settings/profile/content/pages/notifications/email-notification-form.tsx:131 'comment' preference; apps/api/plane/bgtasks/notification_task.py:133-150 comment mentions and :280-311 subscribers notified; apps/api/plane/db/models/notification.py:106 comment preference" }, "built": { "state": "none", @@ -3855,7 +3900,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 8.6 'the overdue command sends e-mail' ; code-census.md notifications 'app/Notification/ (web, mail, webhook, activity stream)' ; source read at v1.2.54: app/ServiceProvider/NotificationProvider.php:31 'Email' notification type; app/Notification/MailNotification.php:31 notifyUser; app/Template/user_view/notifications.php:9 user picks methods", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/notification-and-email/README.md:23-25 'Email reminders ... configure the email reminders which you receive' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/notifications/mail_service.rb:44 sends mail per notification strategy; app/components/my/reminders/show_page_component.html.erb:33 immediate reminders and :45 daily email reminders; config/routes.rb:1138-1140 update_reminders and update_email_alerts", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur'", - "plane": "corpus: plane/round4/code-census.md §6 'Email delivery is batched by bgtasks/email_notification_task.py, scheduled every five minutes', needs SMTP (menu-tree.md god-mode 'Email SMTP')" + "plane": "corpus: plane/round4/code-census.md §6 'Email delivery is batched by bgtasks/email_notification_task.py, scheduled every five minutes', needs SMTP (menu-tree.md god-mode 'Email SMTP') ; source read at v1.4.2: apps/web/core/components/settings/profile/content/pages/notifications/email-notification-form.tsx:69,89,131,151 email toggles; apps/api/plane/bgtasks/email_notification_task.py:47 stack_email_notification and :153 send_email_notification; apps/api/plane/celery.py:47 scheduled batching. Needs SMTP set by the instance admin" }, "built": { "state": "none", @@ -3885,7 +3930,7 @@ "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 2.31 'no' (does the product show who else has the case open right now) ; source read at v1.2.54: searched app/Controller and app/Template for 'presence', 'viewing', 'online': none; assets/js/src/BoardPolling.js:15 polls for changes, not for viewers", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rliE 'presence|currently viewing|also editing' over app, lib and frontend/src/app matches only Ruby presence checks in services (user_preferences/update_service.rb, journals/create_service.rb); no viewer indicator ; source read at v17.8.0: searched app, lib and frontend/src/app (rb, ts, erb, html) for 'currently viewing', 'also editing', 'viewers': only BIM viewer code and lib/open_project/text_formatting/filters/mention_filter.rb; real-time collaboration exists only in the Documents module (modules/documents/app/views/documents/show.html.erb), not on tasks or boards", "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 the issue pages 'say nothing about refresh', and no presence indicator appears in the issue or board documentation read", - "plane": "source: grep -rlniE 'cursor|presence|collaborators|users.?online' packages/editor/src/core/extensions packages/editor/src/core/hooks and grep awareness in packages/editor/src return nothing; corpus silent" + "plane": "source: grep -rlniE 'cursor|presence|collaborators|users.?online' packages/editor/src/core/extensions packages/editor/src/core/hooks and grep awareness in packages/editor/src return nothing; corpus silent ; source read at v1.4.2: searched packages/editor/src, apps/live/src and apps/web/core for 'awareness', 'CollaborationCursor', 'connected.?users', 'active.?users', 'viewers': none; apps/live/src/types/index.ts:26 live sync covers pages only and shows no presence" }, "built": { "state": "none", @@ -3914,7 +3959,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 6.12 'no chat ... Slack and Mattermost are directory plugins' ; source read at v1.2.54: searched app/ (outside Locale) for 'slack', 'mattermost', 'rocket', 'chat': none; app/Schema/Sqlite.php:548-550 the old HipChat settings are deleted by migration; chat is the third-party Slack and Mattermost plugins", "openproject": "no chat integration (corpus: openproject/round4/M1-column.md 6.12 'no chat integration'); the Nextcloud app gives Talk only a link preview (col-link-preview) ; source read at v17.8.0: searched modules/storages, app and lib (rb) for 'spreed', 'nextcloud talk', 'talk': only a code comment in app/services/oauth_clients/connection_manager.rb:63; no Talk room per work package; docs/user-guide/file-management/nextcloud-integration/README.md:220-222 Talk only renders a link preview", "jira": "corpus: jira-data-center/round4/M1-column.md 6.12 'no chat capture ... Jira Server for Slack is a Marketplace plugin, not the product'", - "plane": "corpus: plane/round4/code-census.md §12 SlackProjectSync is an 'unreachable dead table'; no chat integration of any kind, and Talk is Nextcloud-specific" + "plane": "corpus: plane/round4/code-census.md §12 SlackProjectSync is an 'unreachable dead table'; no chat integration of any kind, and Talk is Nextcloud-specific ; source read at v1.4.2: apps/api/plane/db/models/integration/slack.py:14 SlackProjectSync is a model with no route: searched apps/api/plane/app/urls for 'slack', 'talk', 'mattermost', 'teams': none" }, "built": { "state": "none", @@ -3944,7 +3989,7 @@ "kanboard": "source: grep -rniE 'oembed|og:|unfurl' app/Template/layout.php returns nothing; no preview of a task link elsewhere ; corpus: kanboard/round4/code-census.md empty grep 'widget' ; source read at v1.2.54: searched app/Template for 'oembed', 'og:', 'twitter:card', 'unfurl': none; no endpoint that serves a task preview to another app", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:220-222 'Starting with OpenProject Nextcloud Integration App 2.4 a work package link preview will be shown if you use Nextcloud Talk or Text apps' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:220-224 work package link preview in Nextcloud Talk and Text via the integration app, which reads lib/api/v3/work_packages/work_package_representer.rb:302 previewMarkup; inside OpenProject config/routes.rb:1010 work package hover_card preview", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 'Gadgets You can embed a Confluence activity stream ... in Jira's dashboard' and application links to Confluence (1.9): previews live in Confluence, a separate product; no chat unfurl in the product", - "plane": "source: apps/web/app/root.tsx:88-95 static og:title APP_TITLE and og:url https://app.plane.so/ for every page, so a pasted work item link previews as the generic app; no per-item unfurl. Corpus silent" + "plane": "source: apps/web/app/root.tsx:88-95 static og:title APP_TITLE and og:url https://app.plane.so/ for every page, so a pasted work item link previews as the generic app; no per-item unfurl. Corpus silent ; source read at v1.4.2: apps/web/app/root.tsx:102-107 static og:title APP_TITLE and og:url https://app.plane.so/ for every page, so a pasted work item link previews as the generic app; searched apps for 'oembed': none. apps/api/plane/tests/unit/bg_tasks/test_ssrf_advisories.py:26 unfurling is the other direction, links pasted into Plane" }, "built": { "state": "none", @@ -3974,7 +4019,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 9.12 'no platform search to join' ; 9.1 'the header search box ... across every project the user can see' : its own global search finds tasks, not projects ; source read at v1.2.54: not a Nextcloud app, no platform search to join; its own search: app/Controller/SearchController.php:16-34 finds tasks across the user's projects with TaskProjectsFilter; projects are found only by name on app/Controller/ProjectListController.php:27-31", "openproject": "corpus: openproject/round4/M1-column.md 9.1 global quick search over eight searchables including work packages and projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets allows you to search OpenProject work packages via the universal search bar in Nextcloud' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:326 OpenProject's own global search; app/controllers/search_controller.rb:141 search types include work packages and projects; docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets' in Nextcloud through the integration app", "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'The Search box is located at the top right of your screen ... start typing to search through all your issues and projects'", - "plane": "corpus: plane/round4/M1-column.md 9.1 'app/views/search/base.py with per-entity filter methods for workspaces, projects, issues, cycles, modules, pages, views and intakes'; the product's own global search, titles only (code-census.md §9)" + "plane": "corpus: plane/round4/M1-column.md 9.1 'app/views/search/base.py with per-entity filter methods for workspaces, projects, issues, cycles, modules, pages, views and intakes'; the product's own global search, titles only (code-census.md §9) ; source read at v1.4.2: apps/web/core/components/power-k/ui/modal/search-menu.tsx:51 searchWorkspace from the command palette; apps/api/plane/app/urls/search.py:13 route, apps/api/plane/app/views/search/base.py:46 GlobalSearchEndpoint over projects and work items, titles and keys only, :83-94" }, "built": { "state": "built", @@ -4004,7 +4049,7 @@ "kanboard": "generic only: corpus: kanboard/round4/journeys.md 4 'createExternalTaskLink to a web link' ; menu-tree.md 'Add external link' ; journeys.md 1 a task 'reference' of Z-2026-0001 ; source read at v1.2.54: generic only: app/Template/task/sidebar.php:51 'Add external link', app/ExternalLink/WebLinkProvider.php; app/Helper/TaskHelper.php:198-199 free text 'Reference' field, :250 rendered as a link when it is a URL; no case app integration", "openproject": "no case management integration; a generic 'link' custom field format exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/initializers/custom_field_format.rb:41 formats.register('link')), so a URL to an external record can be stored per work package or project (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/custom_field_format.rb:39-40 a 'link' (URL) custom field format usable on work packages and projects, so a case URL can be stored; searched app/models and modules/*/app/models for 'zaak', 'case management': no case connector", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'Issue linking allows you to create an association between two existing issues on either the same or different Jira servers' (corpus: jira-data-center/round4/M1-column.md 2.10); web links and a 'URL field' (corpus: jira-data-center/round4/M1-column.md 5.13) hold an external reference, no case app integration", - "plane": "corpus: plane/round4/code-census.md §2 'IssueLink is a URL plus metadata JSON'; a generic external link can point at a case, no case integration" + "plane": "corpus: plane/round4/code-census.md §2 'IssueLink is a URL plus metadata JSON'; a generic external link can point at a case, no case integration ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/links/root.tsx:17,37 createLink with a URL and title; apps/api/plane/app/urls/issue.py:110 issue-links route; apps/api/plane/db/models/issue.py:371 IssueLink. A generic URL can point at a case, no case integration" }, "built": { "state": "built", @@ -4034,7 +4079,7 @@ "kanboard": "fleet-specific; no create-from-record integration (corpus: kanboard/round4/M1-column.md 1.3 'no') ; source read at v1.2.54: fleet specific; app/Controller/ProjectCreationController.php:56 save takes a form only, searched app/ for a create-from-record hook: none", "openproject": "no case object or case app connector (corpus: openproject/round4/M1-column.md section 12 all Dutch case APIs 'no'); projects are created from templates only ; source read at v17.8.0: searched app/models and modules/*/app/models for 'zaak', 'case': no case object or connector; app/components/projects/template_select_component.html.erb:39 projects start blank or from a template only", "jira": "corpus: jira-data-center/round4/M1-column.md 12.1 'No ZGW'; no case system integration to start a project from", - "plane": "corpus: plane/round4/code-census.md §12 no connectors reachable; §5 no case or contact entity" + "plane": "corpus: plane/round4/code-census.md §12 no connectors reachable; §5 no case or contact entity ; source read at v1.4.2: searched apps/api/plane/db/models/__init__.py for 'customer', 'contact', 'organisation', 'organization', 'case': none; the only create path is the project form, apps/api/plane/app/views/project/base.py:257-258" }, "built": { "state": "specified", @@ -4064,7 +4109,7 @@ "kanboard": "fleet-specific; corpus: kanboard/round4/M1-column.md 5.2 'no' contact registry ; source read at v1.2.54: fleet specific; searched app/Template and app/Controller for 'client', 'customer', 'contact' registry: only mail hits; no embed surface for another app", "openproject": "no CRM integration; corpus: openproject/round4/M1-column.md 5.2 'no contact record' ; source read at v17.8.0: searched app/models (rb) for 'crm', 'contact': no client or contact record and no CRM connector; the nearest is a project attribute, app/models/project_custom_field.rb:58", "jira": "corpus: jira-data-center/round4/M1-column.md 5.2 'Customers and organizations are JSM DC records'; no CRM client page integration", - "plane": "corpus: plane/round4/code-census.md §5 'Contact, organisation or customer object: absent'" + "plane": "corpus: plane/round4/code-census.md §5 'Contact, organisation or customer object: absent' ; source read at v1.4.2: searched apps/api/plane/db/models/__init__.py for 'customer', 'contact', 'client': none; Project has no client field, apps/api/plane/db/models/project.py:68-117" }, "built": { "state": "built", @@ -4097,7 +4142,7 @@ "kanboard": "standalone application with no embed surface ; corpus: kanboard/round4/code-census.md empty grep 'widget' ; source read at v1.2.54: standalone application; searched app/ (outside Locale) for 'widget', 'embed' surfaces for another app: none; the nearest outward views are the token feeds, app/Controller/ICalendarController.php:62 and the public board", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:161 'In the Details side panel, click on the OpenProject tab. This tab lets you link work packages in OpenProject to the current file, and will list all linked work packages' (work packages on a Nextcloud file, not projects on a record) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:161 the Nextcloud Files sidebar 'OpenProject' tab lists the work packages linked to a file, built by the separate Nextcloud app on modules/storages/lib/api/v3/file_links/create_endpoint.rb and modules/storages/lib/api/v3/file_links/file_link_representer.rb:144; work packages on a file, not a record's projects in another app", "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 Confluence and Jira embed each other's content through application links ('You can embed a Confluence activity stream or a Confluence page in Jira's dashboard'); another Atlassian product, not an arbitrary app's record page", - "plane": "corpus: plane/round4/M1-column.md 12.17 'there is no plugin API'; no embeddable widget in apps/web" + "plane": "corpus: plane/round4/M1-column.md 12.17 'there is no plugin API'; no embeddable widget in apps/web ; source read at v1.4.2: searched apps/web/app for 'iframe', 'embed': none; the only outside view is the read-only public board, apps/api/plane/db/models/deploy_board.py:19-32, which shows one published entity, not a record's projects" }, "built": { "state": "built", @@ -4127,7 +4172,7 @@ "kanboard": "corpus: kanboard/round4/code-census.md 'JSON-RPC procedure classes / methods 26 / 161' ; journeys.md 1 and 4 all over the API (JSON-RPC 2.0, not REST: M1-column.md 12.18) ; source read at v1.2.54: jsonrpc.php:5 JSON-RPC 2.0 endpoint, not REST; app/Api/Procedure holds 26 procedure classes, app/Api/Procedure/ProjectProcedure.php:109 createProject, app/Api/Procedure/TaskProcedure.php:101 createTask; app/Template/config/api.php:7-11 token and endpoint shown to the admin", "openproject": "corpus: openproject/round4/M1-column.md 1.7 'API v3 is a Grape API rooted at lib/api/v3/root.rb'; 12.18 OpenAPI description ; source read at v17.8.0: lib/api/v3/root.rb:35 API v3 root mounting every resource from :46; lib/api/v3/work_packages/work_packages_api.rb:99 work package endpoints; docs/api/apiv3/openapi-spec.yml the published OpenAPI description", "jira": "corpus: jira-data-center/round4/M1-column.md 1.7 'POST /api/2/issue Create an issue or sub-task from json'; 12.18 OpenAPI 3.0.1, 432 operations", - "plane": "corpus: plane/round4/code-census.md §12 'The public REST API lives at apps/api/plane/api/ with views for ... issue, member, module, project, state', X-Api-Key auth ; M1-column.md 1.7 yes" + "plane": "corpus: plane/round4/code-census.md §12 'The public REST API lives at apps/api/plane/api/ with views for ... issue, member, module, project, state', X-Api-Key auth ; M1-column.md 1.7 yes ; source read at v1.4.2: apps/web/core/components/settings/profile/content/pages/api-tokens.tsx and apps/web/core/components/api-token/modal/create-token-modal.tsx issue a token; apps/api/plane/app/urls/api.py:11 api-tokens; apps/api/plane/api/middleware/api_authentication.py:17-24 X-Api-Key; apps/api/plane/api/urls/work_item.py:36-41 project issues CRUD" }, "built": { "state": "built", @@ -4157,7 +4202,7 @@ "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move' ; source read at v1.2.54: app/Template/action/index.php:5 'Add a new action'; app/Controller/ActionCreationController.php:36 pick an event, :59 params, :102 save; app/ServiceProvider/ActionProvider.php:75 action manager with some fifty registered actions; app/Core/Action/ActionManager.php:126 attachEvents", "openproject": "corpus: openproject/round4/M1-column.md 3.9 CustomAction 'is fired by a button a user presses, not by a transition' and authoring is Enterprise gated; webhooks are outbound only (6.11); no event-driven rules on the free build ; source read at v17.8.0: app/controllers/custom_actions_controller.rb:34 custom actions (multi-field changes on a button) are Enterprise gated to author; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 outbound created or updated events only; searched for event-driven rules on the free build: none", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation 'You can choose from many triggers including issue transitioned, scheduled trigger, or issue created' (bundled in Data Center)", - "plane": "corpus: plane/round4/code-census.md §3 'no rule, no trigger, no condition and no action model'; 'Trigger And Action' (Pro) and 'Automation Flows' (Enterprise) are absent from Community (open-core.md)" + "plane": "corpus: plane/round4/code-census.md §3 'no rule, no trigger, no condition and no action model'; 'Trigger And Action' (Pro) and 'Automation Flows' (Enterprise) are absent from Community (open-core.md) ; source read at v1.4.2: apps/web/core/components/workflow/use-workflow-drag-n-drop.ts:10-23 is a no-op shim; the only automation is apps/api/plane/db/models/project.py:110-111 archive_in and close_in; searched apps/api/plane/db/models for a Trigger, Rule or Automation class: none" }, "built": { "state": "built", @@ -4187,7 +4232,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 6.11 'one webhook URL per instance with a token ... posted with event_name, event_data and event_author on every project event' ; source read at v1.2.54: app/Template/config/webhook.php:7-8 'Webhook URL', :20 token; app/ServiceProvider/NotificationProvider.php:38 webhook project notification; app/Notification/WebhookNotification.php:36 notifyProject, :59 postJson", "openproject": "corpus: openproject/round4/M1-column.md 6.11 'modules/webhooks/app/models/webhooks/webhook.rb with an event.rb selection model and a log.rb' ; source read at v17.8.0: modules/webhooks/config/routes.rb:30-38 admin outgoing webhooks; modules/webhooks/app/models/webhooks/webhook.rb:8 events per webhook and :24 all_projects; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 work package created or updated; modules/webhooks/app/models/webhooks/log.rb delivery log", "jira": "corpus: jira-data-center/round4/M1-column.md 6.11 'Webhooks are user-defined HTTP POST callbacks ... signed on request (HMAC)'", - "plane": "corpus: plane/round4/code-census.md §11 'Webhook ... Event subscription is five booleans: project, issue, module, cycle, issue_comment', HMAC secret, WebhookLog with retry_count" + "plane": "corpus: plane/round4/code-census.md §11 'Webhook ... Event subscription is five booleans: project, issue, module, cycle, issue_comment', HMAC secret, WebhookLog with retry_count ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/webhooks/page.tsx; apps/api/plane/db/models/webhook.py:39-43 event switches project, issue, module, cycle, issue_comment; apps/api/plane/bgtasks/webhook_task.py:101-114 delivery with retry_count" }, "built": { "state": "built", @@ -4217,7 +4262,7 @@ "kanboard": "source: app/Import/ holds TaskImport.php and UserImport.php (CSV) only; no Deck importer ; source read at v1.2.54: app/Import holds only TaskImport.php and UserImport.php for CSV; searched app/ (outside Locale) for 'deck', 'trello', 'jira' importers: none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): importers are app/services/import/jira* only (grep -rniIl 'deck' app/services/import returns nothing); CSV work package import is marked 'available on our Dev branch' (docs/user-guide/work-packages/importing/README.md) ; source read at v17.8.0: searched app/services/import and app/models for 'deck', 'trello': none; config/initializers/menus.rb:694-697 the only importer is 'Jira import'; docs/user-guide/work-packages has no CSV import at the tag", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html names CSV, JSON and importers for TFS, Rally, VersionOne, YouTrack, Axosoft, BaseCamp and Excel; no Nextcloud Deck importer", - "plane": "corpus: plane/round4/code-census.md §12 'Importers: same. Importer is exported ... but no importer view or URL exists'" + "plane": "corpus: plane/round4/code-census.md §12 'Importers: same. Importer is exported ... but no importer view or URL exists' ; source read at v1.4.2: apps/api/plane/db/models/importer.py:13 Importer model has no view; apps/api/plane/app/urls/external.py:17,22 the routes named 'importer' point at GPT endpoints; searched apps/web/core --include=*.tsx for 'deck': none" }, "built": { "state": "none", @@ -4247,7 +4292,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md 'Import tasks' ; source: app/Import/TaskImport.php CSV tasks into an existing project; no Jira or Trello importer in core ; source read at v1.2.54: app/Template/project_header/dropdown.php:69 'Import tasks'; app/Template/task_import/show.php:2-8 CSV with a delimiter; app/Controller/TaskImportController.php:40 save, :70 template; app/Template/project/sidebar.php:55 'Import tasks from another project'; no Jira or Trello importer in core", "openproject": "docs: opf/openproject HEAD 27a58131 docs/installation-and-operations/jira-migration/README.md 'Step-by-step guide for migrating from Jira Data Center to OpenProject using the Jira Migrator'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/import/jiras/create_service.rb. Note: the migrator arrived behind a feature flag in 17.2 (release-notes/17-2-0:129-134), after the round-4 drive on 16.6.10; CSV import is dev-branch only Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/initializers/menus.rb:694-697 admin 'Jira import'; config/routes.rb:908-918 admin import jira instances and runs; app/services/import/jira_client.rb and app/services/import/jiras do the import; no Trello or spreadsheet importer, Jira only", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file'", - "plane": "corpus: plane/round4/code-census.md §12 'no importer view or URL exists'; source: grep -rniE 'import.?csv|jira|trello' apps/web/core --include=*.tsx finds no importer UI" + "plane": "corpus: plane/round4/code-census.md §12 'no importer view or URL exists'; source: grep -rniE 'import.?csv|jira|trello' apps/web/core --include=*.tsx finds no importer UI ; source read at v1.4.2: apps/api/plane/db/models/importer.py:13 Importer is unrouted; searched apps/api/plane/app for 'jira', 'trello': none; apps/web/core/components/workspace/billing/comparison/plans.tsx:940-941 'Import your work items and members from Jira' is a paid plan line, not an importer" }, "built": { "state": "built", @@ -4277,7 +4322,7 @@ "kanboard": "source: grep -rniE 'github|gitlab|gogs|bitbucket' app/Action app/Controller returns 0 files; forge hooks are plugins (corpus: kanboard/round4/open-core.md 'a directory of 163 third-party plugins') ; source read at v1.2.54: searched app/Action and app/Controller for 'github', 'gitlab', 'gogs', 'bitbucket': no files; forge webhooks are third-party plugins", "openproject": "corpus: openproject/round4/M1-column.md 12.22 'the GitHub and GitLab modules receive inbound events (modules/github_integration/, modules/gitlab_integration/)' ; source read at v17.8.0: modules/github_integration/lib/open_project/github_integration/engine.rb:94-96 registers the inbound 'github' hook and :82 a GitHub tab on the work package; modules/github_integration/app/models/github_pull_request.rb; modules/gitlab_integration/app/models/gitlab_merge_request.rb and modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb:73 GitLab tab", "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 'workflow triggers from development tools' ('Fisheye/Crucible, Bitbucket and GitHub', 8.9); 12.5 'Jira's Subversion integration lets you see Subversion commit information relevant to each issue'", - "plane": "corpus: plane/round4/code-census.md §12 'The GitHub and Slack integrations are unreachable dead tables in CE'; 'Popular integrations' is a Pro string. Only 'Copy branch name' exists in the web app" + "plane": "corpus: plane/round4/code-census.md §12 'The GitHub and Slack integrations are unreachable dead tables in CE'; 'Popular integrations' is a Pro string. Only 'Copy branch name' exists in the web app ; source read at v1.4.2: apps/api/plane/db/models/integration/github.py:14,54 GithubRepository and GithubIssueSync have no route: searched apps/api/plane/app/urls for 'github', 'gitlab': none; packages/i18n/src/locales/en/common.json:610 'Copy branch name' is the only forge touch" }, "built": { "state": "none", @@ -4299,7 +4344,7 @@ "planninq": "no", "nextcloud-deck": "yes", "openproject": "partial", - "plane": "unknown", + "plane": "no", "kanboard": "partial", "jira": "yes", "evidence": { @@ -4307,7 +4352,7 @@ "kanboard": "source: app/Template/layout.php:5 viewport meta and ChangeLog:1028 'Improve layout on mobile/tablet devices' : a responsive web UI, no mobile app in the project ; source read at v1.2.54: app/Template/layout.php:5 viewport meta; ChangeLog:1028 'Improve layout on mobile/tablet devices', ChangeLog:242 apple-mobile-web-app-capable meta tag: a responsive web UI, no mobile app in the tree", "openproject": "docs: opf/openproject HEAD 27a58131 docs/mobile-app-guide/README.md 'The OpenProject Mobile app (Beta) is available for iOS and Android. It is designed as a companion app'; beta, not in the round-4 drive The docs file is present at v17.8.0 (absent at v16.6.10); beta, so partial. ; source read at v17.8.0: docs/mobile-app-guide/README.md:2 'Mobile app guide (Beta)' and :10 a companion app for iOS and Android, a separate repository; docs/release-notes/17-0-0/README.md:279 built-in OAuth application for clients such as the mobile app; beta, so partial", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push notifications 'on iOS and Android devices' for the Jira Data Center mobile app (corpus: jira-data-center/round4/M1-column.md 6.8 'the mobile app has one')", - "plane": "not checked: the web repo at 2f895b82 holds no mobile client (grep for play.google, apps.apple, 'mobile app' in apps/web, apps/space and en locales returns nothing) and round 4 did not test whether Plane's separate mobile apps connect to a Community self-hosted instance" + "plane": "not checked: the web repo at 2f895b82 holds no mobile client (grep for play.google, apps.apple, 'mobile app' in apps/web, apps/space and en locales returns nothing) and round 4 did not test whether Plane's separate mobile apps connect to a Community self-hosted instance ; 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 README.md for 'play.google', 'apps.apple', 'testflight', 'mobile app': none; the open mobile repo makeplane/plane-mobile is archived since 2024-07-02; https://plane.so/mobile states 'At the moment Plane Mobile app doesn't support Community edition'" }, "built": { "state": "none", @@ -4337,7 +4382,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 4.23 'no' ; journeys.md 4 files stored under tasks/3/ in Kanboard's own store ; source read at v1.2.54: app/Model/TaskFileModel.php:59-61 files sit in Kanboard's own object store under 'tasks'; app/Template/project_overview/attachments.php:6 project attachments in the same store; searched app/ for an outside file store link: none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:27 'It is also possible to automatically create dedicated project folders'; corpus: openproject/round4/M1-column.md 4.23 'an automatically managed project folder (last_project_folder.rb)'; Nextcloud storage is free (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/storages/app/models/storages/project_storage.rb:46-52 project_folder_mode with 'automatic'; modules/storages/app/services/storages/nextcloud_managed_folder_create_service.rb:32-42 creates the managed project folder in Nextcloud; modules/storages/app/models/storages/last_project_folder.rb; modules/storages/config/locales/en.yml:21-22 'Project folder', 'Project folder mode'", "jira": "corpus: jira-data-center/round4/M1-column.md 4.23 'not hosted in a platform with a file manager'; attachments sit in the home directory or S3", - "plane": "corpus: plane/round4/code-census.md §4 'Folders: absent. No folder or directory model'; M1-column.md 4.23 no file manager" + "plane": "corpus: plane/round4/code-census.md §4 'Folders: absent. No folder or directory model'; M1-column.md 4.23 no file manager ; source read at v1.4.2: searched apps/api/plane/db/models/__init__.py for 'folder', 'directory': none; files are per work item attachments, apps/api/plane/db/models/asset.py:36-37" }, "built": { "state": "none", @@ -4367,7 +4412,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 5 'carol, not a member, was refused on the project and on the task (403)' ; install.md refusal probe ; source read at v1.2.54: app/Middleware/ProjectAuthorizationMiddleware.php:29,34 checkProjectAccess on every task and project request, :47-50 throws AccessForbiddenException; app/Model/ProjectPermissionModel.php:121 isUserAllowed; app/Controller/ProjectListController.php:20-23 non admins see only their project ids", "openproject": "corpus: openproject/round4/M1-column.md 9.7 'search is scoped through the project permission system (app/services/authorization/user_allowed_query.rb)'; 13.1 project roles ; source read at v17.8.0: app/models/work_package.rb:87 visible scope is allowed_to view_work_packages and :231-232 visible?; app/models/work_packages/scopes/allowed_to.rb:39 permission-based scope; app/services/authorization/user_allowed_query.rb:31; config/initializers/permissions.rb:306 view_work_packages per project role", "jira": "corpus: jira-data-center/round4/M1-column.md 9.7 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues'", - "plane": "corpus: plane/round4/code-census.md §13 'Project visibility adds network secret (0) or public-to-workspace (2)', allow_permission resolves ProjectMember role" + "plane": "corpus: plane/round4/code-census.md §13 'Project visibility adds network secret (0) or public-to-workspace (2)', allow_permission resolves ProjectMember role ; source read at v1.4.2: apps/api/plane/app/views/issue/base.py:84 work item list behind allow_permission at project level; apps/api/plane/app/permissions/base.py:19 allow_permission checks a ProjectMember row with an allowed role; apps/api/plane/db/models/project.py:69-74 network Secret or Public; apps/web/core/components/project/join-project-modal.tsx for non-members" }, "built": { "state": "built", @@ -4400,7 +4445,7 @@ "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'About · Application settings · Email settings · Project settings · Board settings ...' ; M1-column.md 11.24 'yes' ; source read at v1.2.54: app/Template/config/sidebar.php:4-34 About, Application, Email, Project, Board settings, Tags, Link labels, Currency rates, Integrations, Webhooks, API; app/ServiceProvider/AuthenticationProvider.php:160 ConfigController admin only", "openproject": "corpus: openproject/round4/menu-tree.md 'Administration' tree; corpus: openproject/round4/M1-column.md 11.24 'a large administration area over several hundred setting definitions' ; source read at v17.8.0: config/initializers/menus.rb:307 the Administration menu; config/routes.rb:740 admin settings namespace; config/routes.rb:885 working days and :890 iCalendar settings among the setting pages", "jira": "corpus: jira-data-center/round4/M1-column.md 11.24 instance configuration (CORS, banner, email templates); 11.15 'Configuring Jira application options'", - "plane": "corpus: plane/round4/menu-tree.md 'Instance administration, at /god-mode: General, Email, Authentication, Workspaces, Artificial intelligence, Images' plus project Settings" + "plane": "corpus: plane/round4/menu-tree.md 'Instance administration, at /god-mode: General, Email, Authentication, Workspaces, Artificial intelligence, Images' plus project Settings ; source read at v1.4.2: apps/admin/app/(all)/(dashboard)/general/page.tsx, email, authentication, ai, image and workspace pages; apps/api/plane/license/models/instance.py:72 InstanceConfiguration key value store; project settings at apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/features/cycles/page.tsx" }, "built": { "state": "built", @@ -4429,7 +4474,7 @@ "kanboard": "source: app/Schema/Sqlite.php:1564 seeds user admin with password admin; no setup wizard (corpus: kanboard/round4/install.md 'the first page rendered the moment the container was healthy') ; source read at v1.2.54: app/Schema/Sqlite.php:1563-1564 seeds user admin with password admin; searched app/Template and app/Controller for 'wizard', 'onboard', 'first run', 'welcome': none", "openproject": "corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database, so there is no setup wizard'; a first-login onboarding tour exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts, tours/gantt_tour.ts) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/helpers/homescreen_helper.rb:52-53 onboarding modal for a first time user; app/views/layouts/base.html.erb:136-139 renders it; frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts guided tour; searched app (rb) for 'setup wizard', 'first run', 'installation wizard': none, the instance seeds itself", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira application setup wizard will only display the first time after you install' (database, administrator, email, language, licence)", - "plane": "corpus: plane/round4/usability.md 'The instance setup form'; install.md first run ; source: apps/web/core/components/onboarding/ profile-setup, create-workspace, invite-members steps" + "plane": "corpus: plane/round4/usability.md 'The instance setup form'; install.md first run ; source: apps/web/core/components/onboarding/ profile-setup, create-workspace, invite-members steps ; source read at v1.4.2: apps/admin/components/instance/setup-form.tsx first admin setup, apps/api/plane/license/models/instance.py:38 is_setup_done; apps/web/app/(all)/onboarding/page.tsx:12,53 OnboardingRoot with profile, workspace and invite steps under apps/web/core/components/onboarding/" }, "built": { "state": "built", @@ -4459,7 +4504,7 @@ "kanboard": "no demo or sample data in core ; source: app/Schema/Sqlite.php seeds settings and the admin user only ; corpus: kanboard/round4/install.md ; source read at v1.2.54: searched app/Schema and app/Console for 'demo', 'sample data', 'fixture': none; app/Schema/Sqlite.php:1563-1564 the install seeds only the admin user", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/seeders/demo_data_seeder.rb:29-30 DemoDataSeeder with its data seeder classes; app/seeders/demo_data/global_query_seeder.rb and overview_seeder.rb seed demo projects, queries and overviews on a fresh instance", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data'", - "plane": "source: apps/api/plane/app/views/workspace/base.py:137 workspace_seed.delay on workspace creation, seeds from apps/api/plane/seeds/data (projects, issues, cycles, modules, pages, views, labels, states); corpus: plane/round4/code-census.md §5 cites the seeded dummy data (workspace_seed_task.py:160,163). Automatic, not opt-in" + "plane": "source: apps/api/plane/app/views/workspace/base.py:137 workspace_seed.delay on workspace creation, seeds from apps/api/plane/seeds/data (projects, issues, cycles, modules, pages, views, labels, states); corpus: plane/round4/code-census.md §5 cites the seeded dummy data (workspace_seed_task.py:160,163). Automatic, not opt-in ; source read at v1.4.2: apps/api/plane/app/views/workspace/base.py:48,139 workspace create queues workspace_seed; apps/api/plane/bgtasks/workspace_seed_task.py:505 seeds from apps/api/plane/seeds/data/projects.json with issues, cycles, modules, pages, views, labels and states files beside it. Runs on every new workspace, not an opt-in button" }, "built": { "state": "built", @@ -4494,7 +4539,7 @@ "kanboard": "corpus: kanboard/round4/code-census.md 'locales, app/Locale/ 38, nl_NL among them' ; source read at v1.2.54: app/Locale holds 38 locales; app/Locale/nl_NL/translations.php:372 'Board settings' => 'Bord-instellingen', 1468 translated keys and no commented out ones; app/Template/config/application.php:12 application language, app/Template/user_modification/show.php:28-29 per user language", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/crowdin/nl.yml, js-nl.yml, nl.seeders.yml; corpus: openproject/round4/M1-column.md 11.13 'translations come from Crowdin' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/crowdin/nl.yml:1 Dutch server strings, with js-nl.yml and nl.seeders.yml beside it; config/locales/en.yml:3391 English source strings; the language is chosen per user in account settings", "jira": "docs: https://confluence.atlassian.com/adminjiraserver/translating-jira-938847004.html 'Jira ships with a number of translations in the most commonly-requested languages'; Dutch is not listed there, product strings come as language packs ('update these via the Universal Plugin Manager', corpus: jira-data-center/round4/M1-column.md 11.13)", - "plane": "source: packages/i18n/src/locales has 20 locales (cs, de, en, es, fr, id, it, ja, ka-ge, ko, pl, pt-BR, ro, ru, sk, tr-TR, ua, vi-VN, zh-CN, zh-TW) and no nl; English yes, Dutch no. Corpus: plane/round4/M1-column.md 11.13 'translations are static catalogues in packages/i18n'" + "plane": "source: packages/i18n/src/locales has 20 locales (cs, de, en, es, fr, id, it, ja, ka-ge, ko, pl, pt-BR, ro, ru, sk, tr-TR, ua, vi-VN, zh-CN, zh-TW) and no nl; English yes, Dutch no. Corpus: plane/round4/M1-column.md 11.13 'translations are static catalogues in packages/i18n' ; source read at v1.4.2: packages/i18n/src/constants/language.ts:11-30 SUPPORTED_LANGUAGES has 19 entries with en and no nl; apps/web/core/components/settings/profile/content/pages/preferences/language-and-timezone-list.tsx:50 language switch; server strings stay English. English yes, Dutch no" }, "built": { "state": "built", @@ -4527,7 +4572,7 @@ "kanboard": "source: app/Template/config/keyboard_shortcuts.php shortcut list, app/Template/board/table_column.php:114 'ui-helper-hidden-accessible' screen-reader text; board cards have no keyboard move (brd-keyboard-move); not audited against WCAG AA in the round-4 drive ; source read at v1.2.54: app/Template/config/keyboard_shortcuts.php:5-31 keyboard shortcuts; app/Template/board/table_column.php:12 'ui-helper-hidden-accessible' screen reader text; app/Template/column/index.php:29 aria-label on the drag handle; cards cannot be moved by keyboard on the board, see brd-keyboard-move; no accessibility statement or audit in the tree", "openproject": "corpus: openproject/round4/usability.md 'Every page carries a Jump to content skip link, headings are structured ... form fields carry proper labels'; docs: opf/openproject HEAD 27a58131 docs/release-notes/17-2-0/README.md:85 widgets 'follow WCAG 2.1 AA guidelines for focus management' (partial scope); cards move by drag only (brd-keyboard-move) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/views/layouts/base.html.erb:71-72 skip-navigation link to content; docs/release-notes/17-2-0/README.md:85 overview widgets keyboard operable and 'follow WCAG 2.1 AA guidelines for focus management', a partial scope; brd-keyboard-move shows cards still move by drag only", "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html Jira applications 'audited ... to make sure they're compliant with Section 508 and WCAG 2.0 AA' (an older level, vendor statement, not driven)", - "plane": "corpus: plane/round4/usability.md 'The accessibility tree is usable but noisy. Navigating it surfaced the entire sidebar twice on every page'; no WCAG AA claim checked" + "plane": "corpus: plane/round4/usability.md 'The accessibility tree is usable but noisy. Navigating it surfaced the entire sidebar twice on every page'; no WCAG AA claim checked ; source read at v1.4.2: packages/i18n/src/locales/en/accessibility.json:2 aria_labels catalogue, used at apps/web/core/components/account/auth-forms/password.tsx:193; 45 aria-label attributes across apps/web/core/components; searched apps, packages and docs for 'wcag' conformance claims: only colour luminance helpers at packages/utils/src/color.ts:153" }, "built": { "state": "built", @@ -4557,7 +4602,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 11.14 'partial: application_stylesheet takes custom CSS ... the logo and name are fixed' ; source: assets/css/light.min.css styles through CSS custom properties (179 var(--...) uses, e.g. --color-primary), so custom CSS could map tokens onto them; no NL Design System tokens shipped, not driven ; source read at v1.2.54: app/Template/config/application.php:35-36 'Custom Stylesheet'; app/Helper/AssetHelper.php:52-53 injects it on every page; assets/css/src/themes/dark.css:2-5 theme colours are CSS custom properties, 179 var() uses in assets/css/light.min.css; no NL Design System token mapping", "openproject": "corpus: openproject/round4/M1-column.md 11.14 'app/controllers/custom_styles_controller.rb:49 is the design and branding screen, Enterprise gated (define_custom_style). The free build sets a logo and nothing else'; no NL Design System tokens ; source read at v17.8.0: app/controllers/custom_styles_controller.rb:49 design and colour customisation needs the :define_custom_style token, only logo downloads (:38-39) are unguarded; searched app and frontend/src (rb, scss, ts) for 'nldesign', 'nl-design', 'design token': none", "jira": "corpus: jira-data-center/round4/M1-column.md 11.14 'How to change your logo ... How to change Jira application colors'; colours and logo, no design-token theming or NL Design System support", - "plane": "corpus: plane/round4/M1-column.md 11.14 'WorkspaceTheme and per-user theme ... No stylesheet or component theming'; no design token import" + "plane": "corpus: plane/round4/M1-column.md 11.14 'WorkspaceTheme and per-user theme ... No stylesheet or component theming'; no design token import ; source read at v1.4.2: apps/api/plane/db/models/workspace.py:286 WorkspaceTheme stores colours only; searched apps and packages in *.ts, *.tsx, *.css for 'nl.?design', 'design.?tokens': only a Storybook file, packages/propel/src/toast/toast.stories.tsx" }, "built": { "state": "built", @@ -4587,7 +4632,7 @@ "kanboard": "corpus: kanboard/round4/install.md 'Kanboard ships one official image ... needs nothing beside it' ; source read at v1.2.54: Dockerfile line 1 FROM alpine and line 13 EXPOSE 80 443, one self-contained image with its own nginx, docker/etc/nginx/nginx.conf:75; config.default.php:67 DB_DRIVER sqlite by default; no vendor cloud service is called", "openproject": "corpus: openproject/round4/install.md 'openproject/openproject:16 from Docker Hub ... against an external PostgreSQL' ; source read at v17.8.0: docker/prod/Dockerfile (line 6) builds the production image from this tree; docs/installation-and-operations/installation/docker/README.md:119-124 'docker run ... openproject/openproject:17' on your own host; publiccode.yml:55 GPL-3.0-or-later, no vendor cloud needed", "jira": "corpus: jira-data-center/round4/open-core.md 'On 30 March 2026 Atlassian stopped selling Data Center licences to new customers; on 28 March 2029 every Data Center product reaches end of life and turns read-only'; self-hosted for existing licence holders only", - "plane": "corpus: plane/round4/install.md 'makeplane/plane-aio-community:v1.4.2' run on localhost:8096 with postgres, valkey, rabbitmq, minio ; usability.md notes an offline instance works apart from Unsplash covers" + "plane": "corpus: plane/round4/install.md 'makeplane/plane-aio-community:v1.4.2' run on localhost:8096 with postgres, valkey, rabbitmq, minio ; usability.md notes an offline instance works apart from Unsplash covers ; source read at v1.4.2: deployments/aio/community/Dockerfile all-in-one community image, plus deployments/kubernetes and deployments/swarm; apps/api/plane/license/models/instance.py:29 edition defaults to PLANE_COMMUNITY; apps/web/core/components/license/modal/upgrade-modal.tsx:37 isSelfHosted = true" }, "built": { "state": "built", @@ -4617,7 +4662,7 @@ "kanboard": "corpus: kanboard/round4/open-core.md 'Kanboard is not open core. One MIT licence covers the product' ; source read at v1.2.54: composer.json:5 license MIT, LICENSE line 1 'The MIT License (MIT)'; searched app/ (outside Locale) for 'license key', 'premium', 'enterprise' gating: none, every feature in the tree ships under the one licence", "openproject": "corpus: openproject/round4/open-core.md 'the core is GPL-3.0 ... and 32 named features are withheld behind a paid token' ; source read at v17.8.0: publiccode.yml:55 GPL-3.0-or-later core; app/models/enterprise_token.rb:56 allows_to? gates about 30 named features found in app, lib and modules, e.g. app/models/timestamp.rb:109 baseline_comparison, app/contracts/placeholder_users/create_contract.rb:34 placeholder_users, modules/resource_management/app/controllers/resource_management/base_controller.rb:43 resource_management", "jira": "corpus: jira-data-center/round4/open-core.md 'Jira Software Data Center is closed source with one edition, priced by user tier'", - "plane": "corpus: plane/round4/open-core.md 'LICENSE.txt is the verbatim GNU AGPL v3' and 'this repository is the Community edition and nothing else. The paid features are not gated here. They are not here at all' (Pro, Business, Enterprise, One lists)" + "plane": "corpus: plane/round4/open-core.md 'LICENSE.txt is the verbatim GNU AGPL v3' and 'this repository is the Community edition and nothing else. The paid features are not gated here. They are not here at all' (Pro, Business, Enterprise, One lists) ; source read at v1.4.2: LICENSE.txt:1-2 GNU AGPL v3; packages/constants/src/subscription.ts:7-30 enterprise, business and pro feature lists such as 'Project Templates', 'Workflows + Approvals', 'Full Time Tracking + Bulk Ops', 'Teamspaces' are absent from this tree, held back in paid builds" }, "built": { "state": "built", @@ -4646,7 +4691,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 activity stream and transitions with author and time, 13.9 'project_activities records writes only' ; no tamper protection on the table ; source read at v1.2.54: app/Controller/ActivityController.php:50 task activity and app/Controller/TaskViewController.php:133 transitions with author and time; app/Console/ProjectActivityArchiveCommand.php:14,19 'projects:archive-activities' deletes entries older than a year, app/Model/ProjectActivityModel.php:75-77 cleanup: no tamper protection or retention lock", "openproject": "corpus: openproject/round4/M1-column.md section 13 closing finding 'Setting, Role, Member, Workflow, CustomAction and EnterpriseToken changes are recorded nowhere ... What is recorded is destroys only, and it is purged after 60 days'; work package journals are thorough (10.9) ; source read at v17.8.0: app/services/journals/create_service.rb:45 journals on every work package save, but app/models/work_package.rb:398-405 comments stay editable by their author or editors; app/models/work_package.rb:182 and app/models/project.rb:176 has_paper_trail keeps destroys that app/workers/paper_trail_audits/cleanup_job.rb:33-36 purges after 60 days; settings and role changes have no trail", "jira": "corpus: jira-data-center/round4/M1-column.md 10.5 audit log with filters and CSV export, 10.9 issue History tab; corpus: jira-data-center/round4/open-core.md audit log 'limited by the retention period and the default cap of 10 million records'; 13.9 reads not recorded", - "plane": "corpus: plane/round4/code-census.md §13 'IssueActivity is an issue-scoped change log, not an audit log' and 'Settings changes are not logged'; 'API-enabled Audit Logs' is a paid string" + "plane": "corpus: plane/round4/code-census.md §13 'IssueActivity is an issue-scoped change log, not an audit log' and 'Settings changes are not logged'; 'API-enabled Audit Logs' is a paid string ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/main-content.tsx:184 activity feed; apps/api/plane/db/models/issue.py:415 IssueActivity written only by apps/api/plane/bgtasks/issue_activities_task.py:1540 ACTIVITY_MAPPER, issue scoped; searched apps/api/plane --include=*.py for 'audit.?log', 'AuditLog': none; apps/api/plane/db/models/api.py:51 APIActivityLog is purged nightly" }, "built": { "state": "built", @@ -4676,7 +4721,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 12.7 'LDAP ... and reverse-proxy header authentication in the core; grep saml|oidc|openid returns 0' ; source read at v1.2.54: app/Auth/LdapAuth.php and app/Auth/ReverseProxyAuth.php in core, config.default.php:103 LDAP_AUTH, :206 REVERSE_PROXY_AUTH; app/Controller/OAuthController.php:13 only a hook for provider plugins; searched app/ for 'saml', 'oidc', 'openid': none, OAuth2 and SAML are third-party plugins", "openproject": "corpus: openproject/round4/M1-column.md 12.7 'both exist and both are Enterprise gated: modules/openid_connect/ and modules/auth_saml/ on the sso_auth_providers symbol'; free build has LDAP authentication ; source read at v17.8.0: modules/openid_connect/lib/open_project/openid_connect/engine.rb:50 and modules/auth_saml/lib/open_project/auth_saml/engine.rb:32 OIDC and SAML need the sso_auth_providers token; modules/auth_plugins/lib/open_project/plugins/auth_plugin.rb:94 same gate; config/routes.rb:716 LDAP authentication is free", "jira": "corpus: jira-data-center/round4/M1-column.md 12.7 'Atlassian provides the SSO for Atlassian Data Center app ... Bundled with the Data Center licence, no extra subscription'", - "plane": "corpus: plane/round4/menu-tree.md 'Unique codes, Passwords, Google, GitHub, GitLab, Gitea' and 'No SAML, no OIDC, no LDAP'; open-core.md 'OIDC + SAML for SSO' (One) and 'LDAP support' (Enterprise). OAuth sign-in only" + "plane": "corpus: plane/round4/menu-tree.md 'Unique codes, Passwords, Google, GitHub, GitLab, Gitea' and 'No SAML, no OIDC, no LDAP'; open-core.md 'OIDC + SAML for SSO' (One) and 'LDAP support' (Enterprise). OAuth sign-in only ; source read at v1.4.2: apps/admin/app/(all)/(dashboard)/authentication/page.tsx with google, github, gitlab and gitea sub pages; apps/api/plane/authentication/provider/oauth/google.py:1 and github.py, gitlab.py, gitea.py beside it; searched apps/api/plane --include=*.py for 'saml', 'oidc', 'ldap': none" }, "built": { "state": "built", @@ -4706,7 +4751,7 @@ "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 CSV exports of tasks, subtasks, transitions and summaries ; 11.2 'the database can be downloaded whole' ; source read at v1.2.54: app/Template/export/header.php:5-14 CSV exports of tasks, subtasks, transitions, daily summary; app/Template/config/about.php:72-73 'Download the database' as a gzip compressed SQLite file, app/Controller/ConfigController.php:190 downloadDb; app/Api/Procedure has read calls for every object", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/controllers/admin/backups_controller.rb and config/routes.rb:1082 'resource :backups' (database and attachments backup from the admin UI); corpus: openproject/round4/M1-column.md 10.3 CSV, PDF, XLS exports (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:661-662 admin 'Backups'; config/routes.rb:959 backups; app/controllers/admin/backups_controller.rb:64 request_backup of database and attachments; config/initializers/export_formats.rb:34-35 CSV and PDF, config/initializers/permissions.rb:163 export_projects", "jira": "corpus: jira-data-center/round4/M1-column.md 11.2 'the whole-instance XML backup or a project import'; 10.3 CSV export; corpus: jira-data-center/round4/open-core.md data pipeline 'Data will be exported in CSV format'", - "plane": "corpus: plane/round4/code-census.md §13 'Data export. Per-workspace issue export to json / csv / xlsx ... There is no full-account or per-subject export'; pages export to PDF only one at a time (§4)" + "plane": "corpus: plane/round4/code-census.md §13 'Data export. Per-workspace issue export to json / csv / xlsx ... There is no full-account or per-subject export'; pages export to PDF only one at a time (§4) ; source read at v1.4.2: apps/web/core/components/exporter/export-modal.tsx:91 CSV, Excel, JSON of work items; apps/api/plane/app/views/exporter/base.py:22-35 export of chosen or all member projects; apps/web/core/components/pages/modals/export-page-modal.tsx:30,49 pages one at a time as pdf or markdown. No full-account export with cycles, modules, comments and files together" }, "built": { "state": "built", @@ -4728,7 +4773,7 @@ "planninq": "partial", "nextcloud-deck": "partial", "openproject": "yes", - "plane": "partial", + "plane": "yes", "kanboard": "yes", "jira": "partial", "evidence": { @@ -4736,7 +4781,7 @@ "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer): bob read the task (200) and was refused on updateTask' ; carol with no membership 403 ; journeys.md 6 public read-only board ; source read at v1.2.54: app/Template/user_list/listing.php:8 'Invite people', app/Controller/UserInviteController.php:27 save; app/Core/Security/Role.php:20,48 'Project Viewer' role; app/Template/project_permission/users.php:36-54 add that user to one project; app/Middleware/ProjectAuthorizationMiddleware.php:47-50 refuses all other projects", "openproject": "corpus: openproject/round4/M1-column.md 13.1 membership per project with a role; the free build has no user seat limit (corpus: openproject/round4/open-core.md gates are features, not seats); per-work-package sharing is Enterprise gated (3.19) ; source read at v17.8.0: config/initializers/permissions.rb:218 invite_members_by_email lets a project admin invite an outside person as a member of that one project; app/models/member.rb:40 membership is per project with a role; app/models/work_package.rb:87 visibility follows membership; per work package sharing is gated, app/models/sharing_strategies/work_package_strategy.rb:109", "jira": "corpus: jira-data-center/round4/M1-column.md 3.19 'a partner needs an account and a licence' and is 'scoped per project by a role'; every guest takes a licensed seat", - "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when false a guest sees only items they own or are assigned'; a guest must be a workspace member with a login and is then added per project. Whether a workspace guest sees public-to-workspace projects was not driven" + "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when false a guest sees only items they own or are assigned'; a guest must be a workspace member with a login and is then added per project. Whether a workspace guest sees public-to-workspace projects was not driven ; 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 with role Guest; apps/api/plane/app/views/project/base.py:101-114 a workspace guest only lists projects they are a member of; apps/api/plane/app/views/project/invite.py:131 guests cannot self-join; apps/api/plane/db/models/project.py:100 guest_view_all_features narrows items further" }, "built": { "state": "built", From 216d9ce499449001602ce2e98e0d29e2c4ec1a75 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:36:58 +0200 Subject: [PATCH 08/13] feat(parity): add 31 demand rows mined from the Deck, OpenProject, Kanboard and Plane feature requests and changelogs, deduplicated with the tender rows --- openspec/parity/capabilities.json | 657 +++++++++++++++++++++++++++++- 1 file changed, 654 insertions(+), 3 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 2dd33294..787a5f6d 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -4805,17 +4805,17 @@ "name": "Keep a risk register per project that scores each risk on likelihood and impact and records its countermeasures.", "origin": "tender", "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", - "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4003, 4004, 64441 (risk table scored on likelihood and impact, format adjustable per portfolio).", + "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4003, 4004, 64441 (risk table scored on likelihood and impact, format adjustable per portfolio). Also asked for by openproject: https://community.openproject.org/wp/49051 (featureRequest).", "evidence": { "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: searched app and modules (rb) for 'risk_register', 'risk_log', 'class Risk': none; config/locales/en.yml:257 'At risk' is only a project status; open Feature request since 2023-07-10", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", "nextcloud-deck": "unknown", - "openproject": "unknown", + "openproject": "no", "plane": "unknown", "kanboard": "unknown", "jira": "unknown" @@ -5008,6 +5008,657 @@ "plane": "unknown", "kanboard": "unknown", "jira": "unknown" + }, + { + "id": "pln-calendar-writeback", + "area": "planning", + "name": "Change a task's dates or mark it done from a calendar or phone task app and have the change saved back.", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/deck/issues/2399", + "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: lib/DAV/CalendarObject.php:58-59 put throws Forbidden 'This calendar-object is read-only'; lib/Db/Card.php:152 FIXME for write support; the request has 70 reactions", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "no", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prj-grouping", + "area": "projects", + "name": "Group projects into folders or categories in the navigation.", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/deck/issues/2006", + "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: src/components/navigation/AppNavigation.vue:19 fixed entries All, Archived and Shared boards; lib/Db/Board.php:35-54 no folder or category field; the request has 31 reactions", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "no", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "col-comment-images", + "area": "collaboration", + "name": "Paste or drop an image straight into a task description or a comment.", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/deck/issues/533", + "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5545 (featureRequest).", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: src/components/card/CommentForm.vue:8-12 a plain rich text field with mentions, :91 1000 character limit; searched src/components/card for 'paste': none; the request has 34 reactions", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: assets/js/components/screenshot.js:9-10 pasting from the clipboard works but app/Controller/TaskFileController.php:18 screenshot stores it as an attachment; the description editor, app/Helper/FormHelper.php:228, takes Markdown image links only", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "no", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "partial", + "jira": "unknown" + }, + { + "id": "tsk-templates", + "area": "tasks", + "name": "Create a new task from a template with a ready-made description, checklist and labels.", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/deck/issues/1556", + "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: src/CardMoveDialog.vue:28-29 'Copy card' duplicates an existing card to any list, appinfo/routes.php:176 card#clone; searched lib/ and src/ for 'template' on cards: none, so no card can be kept as a template; the request has 19 reactions", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "partial", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "brd-move-column", + "area": "boards", + "name": "Move or copy a whole column with its tasks to another project.", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/deck/issues/3579", + "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: appinfo/routes.php:37-43 stack routes are per board with no move or copy; searched lib/Service/StackService.php for 'move', 'copy', 'transfer': none; the request has 18 reactions", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "no", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "tsk-all-day-due", + "area": "tasks", + "name": "Set a due date for a whole day without picking a time.", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/deck/issues/1157", + "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: src/components/card/DueDateSelector.vue:10-15 the picker is datetime-local; searched src/ and lib/ for 'allDay', 'all day': none; the request has 17 reactions", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "no", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "brd-column-count", + "area": "boards", + "name": "See how many tasks sit in each column.", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/deck/pull/8038", + "note": "Demand row mined from nextcloud-deck (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: src/components/board/Stack.vue:18 and :31 card count next to the list title, :491 stack__card-count; CHANGELOG.md:11 1.19.0 'show card count next to the list title'", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "yes", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prj-team-owner", + "area": "projects", + "name": "Let a team own a project so it stays when a person leaves.", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/deck/pull/8320", + "note": "Demand row mined from nextcloud-deck (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: appinfo/routes.php:144 board_ocs#createForTeam, lib/Controller/BoardOcsController.php:56; lib/Service/TeamBoardService.php:24-30 hands the board to the next team member when one leaves; searched src/ for 'createForTeam', 'teamId': no Deck screen, so it is created through the API or the Teams app", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "partial", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "col-federated-share", + "area": "collaboration", + "name": "Share a project with people on another organisation's server.", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/deck/pull/8261", + "note": "Demand row mined from nextcloud-deck (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "source read at v1.19.0: src/components/board/SharingTabSidebar.vue:94 remotes share type, :32 '(remote)'; lib/Federation/DeckFederationProvider.php:25-42 receives federated board shares; src/components/DeckAppSettings.vue:41 admin 'Enable federation'; CHANGELOG.md:14 1.19.0 signed OCM", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "yes", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "int-ai-connector", + "area": "integration", + "name": "Let an AI assistant read and change tasks through a standard connector.", + "origin": "changelog", + "originUrl": "https://www.openproject.org/docs/release-notes/17-8-0/", + "note": "Demand row mined from openproject (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: config/routes.rb:48 mounts API::Mcp at /mcp; lib/api/mcp.rb:47 refuses without the :mcp_server Enterprise token; config/initializers/menus.rb:507 admin MCP configuration; 17.2 read, 17.8 create and update", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "partial", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "col-live-docs", + "area": "collaboration", + "name": "Write a shared document together in real time, seeing each other's cursors.", + "origin": "changelog", + "originUrl": "https://www.openproject.org/docs/release-notes/17-0-0/", + "note": "Demand row mined from openproject (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: modules/documents/app/views/documents/show.html.erb:34-35 collaborative documents when real-time collaboration is on, served by the Hocuspocus service in docker/hocuspocus; searched modules/documents for an Enterprise gate: none", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "yes", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "col-meeting-actions", + "area": "collaboration", + "name": "Run a meeting from an agenda and turn agenda items into tasks.", + "origin": "changelog", + "originUrl": "https://www.openproject.org/docs/release-notes/17-6-0/", + "note": "Demand row mined from openproject (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: modules/meeting/config/routes.rb:109-110 convert_to_work_package on an agenda item; modules/meeting/app/services/meeting_agenda_items/convert_to_work_package_service.rb:64-67 creates the work package; modules/meeting/app/components/meeting_agenda_items/item_component/show_component.rb:136 menu action", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "yes", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "tsk-readable-key", + "area": "tasks", + "name": "Give each task a readable key made of the project key and a number, such as ABC-123.", + "origin": "changelog", + "originUrl": "https://www.openproject.org/docs/release-notes/17-5-0/", + "note": "Demand row mined from openproject (changelog) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5544 (featureRequest).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: app/models/work_package/semantic_identifier.rb:37-42 'PROJ-42' identifiers accepted in routes; config/constants/settings/definition.rb:1411-1418 admin setting work_packages_identifier, classic by default, semantic on request", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: app/Template/board/task_private.php:26 cards show a global '#id'; the project identifier exists, app/Model/ProjectModel.php:123, but no per project task number; the request has the most votes of the Ideas category (6)", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "yes", + "plane": "unknown", + "kanboard": "no", + "jira": "unknown" + }, + { + "id": "bkl-sprint-goal", + "area": "backlog", + "name": "Set a goal for each sprint and keep it visible while the sprint runs.", + "origin": "changelog", + "originUrl": "https://www.openproject.org/docs/release-notes/17-6-0/", + "note": "Demand row mined from openproject (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: modules/backlogs/app/models/sprint_goal.rb:31-35 a goal per sprint; modules/backlogs/app/components/backlogs/sprint_component.rb:100 goal_text on the sprint header; modules/backlogs/config/locales/en.yml:41 'Sprint goal'", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "yes", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prj-request-approval", + "area": "projects", + "name": "Request a new project through a guided form that someone reviews before it starts.", + "origin": "changelog", + "originUrl": "https://www.openproject.org/docs/release-notes/17-1-0/", + "note": "Demand row mined from openproject (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: config/initializers/menus.rb:778-779 project settings 'Project initiation request'; config/routes.rb:216 creation_wizard; app/controllers/projects/settings/creation_wizard_controller.rb:108 needs the :project_creation_wizard Enterprise token", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "partial", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "bkl-planning-poker", + "area": "backlog", + "name": "Estimate tasks together as a team with planning poker.", + "origin": "featureRequest", + "originUrl": "https://community.openproject.org/wp/35154", + "note": "Demand row mined from openproject (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml) for 'poker': none; open Feature request since 2020-11-05, status new", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "no", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "tsk-review-approval", + "area": "tasks", + "name": "Have a task reviewed and approved by chosen people before it can be closed.", + "origin": "featureRequest", + "originUrl": "https://community.openproject.org/wp/49426", + "note": "Demand row mined from openproject (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: searched app/models and modules/*/app/models for 'approv': none; closing is a status change governed by workflows only; open Feature request since 2023-07-27", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "no", + "plane": "unknown", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "col-edit-conflict", + "area": "collaboration", + "name": "Be warned or stopped when a colleague is editing the same task at the same time.", + "origin": "featureRequest", + "originUrl": "https://github.com/orgs/kanboard/discussions/5691", + "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: searched app/Model/TaskModificationModel.php and app/Controller for 'lock', 'locked_by', 'editing': none; the last save wins", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "no", + "jira": "unknown" + }, + { + "id": "int-automation-edit", + "area": "integration", + "name": "Change an existing automation rule without deleting and recreating it.", + "origin": "featureRequest", + "originUrl": "https://github.com/orgs/kanboard/discussions/5403", + "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: app/Controller/ActionController.php:18 index, :46 confirm, :65 remove are the only actions on an existing rule; app/Controller/ActionCreationController.php:102 creates new ones", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "no", + "jira": "unknown" + }, + { + "id": "prt-dashboard-order", + "area": "portfolio", + "name": "Arrange the projects on your dashboard in your own order.", + "origin": "featureRequest", + "originUrl": "https://github.com/orgs/kanboard/discussions/5394", + "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: app/Template/project_list/sort_menu.php:5-17 sort by id, name, status, start or end date; searched app/Model for a per user project position: none", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "partial", + "jira": "unknown" + }, + { + "id": "plt-rtl", + "area": "platform", + "name": "Use the app in a right-to-left language such as Arabic.", + "origin": "changelog", + "originUrl": "https://github.com/kanboard/kanboard/blob/main/ChangeLog", + "note": "Demand row mined from kanboard (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: ChangeLog:112 'add basic support for right-to-left (RTL) languages' in 1.2.48 (October 2025); app/Template/layout.php:2 dir rtl; app/Model/LanguageModel.php:205 isRtlLanguage", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "yes", + "jira": "unknown" + }, + { + "id": "plt-outbound-guard", + "area": "platform", + "name": "Stop webhooks and link lookups from reaching addresses on the internal network.", + "origin": "changelog", + "originUrl": "https://github.com/kanboard/kanboard/blob/main/ChangeLog", + "note": "Demand row mined from kanboard (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "source read at v1.2.54: ChangeLog:67 SSRF protection for webhooks in 1.2.51, :95 private network block for external links in 1.2.49; app/Notification/WebhookNotification.php:42 refuses private URLs; app/constants.php:190,193 opt-in overrides", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "yes", + "jira": "unknown" + }, + { + "id": "tsk-diagrams", + "area": "tasks", + "name": "Draw a diagram, such as a flowchart, inside a task description or a documentation page.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/8147", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: searched packages/editor/src and apps/web/core for 'mermaid': none; the editor extensions at packages/editor/src/core/extensions/extensions.ts:65 carry no diagram block; the request has 39 reactions, a sibling #4086 has 15", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "no", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "plt-ai-assist", + "area": "platform", + "name": "Get AI help writing or summarising task text, using a model the organisation runs itself.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/5941", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26. Also asked for by openproject: https://community.openproject.org/wp/69622 (roadmap).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: not in v17.8.0: searched app, lib and modules (rb) for 'openai', 'anthropic', 'ai_assist': none; roadmap item for 18.0.0 in development, with 66020 LLM connection settings", + "plane": "source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/description-editor.tsx:22 GptAssistantPopover; apps/api/plane/app/views/external/base.py:50-53 SUPPORTED_PROVIDERS openai, anthropic, gemini and :84-93 LLM_API_KEY, LLM_PROVIDER, LLM_MODEL; no base URL setting, so no self-hosted model; the request has 27 reactions", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "no", + "plane": "partial", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "int-pages-api", + "area": "integration", + "name": "Read and write documentation pages through the API.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/8598", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: searched apps/api/plane/api/urls for 'page': no page routes in the token API, only apps/api/plane/app/urls/page.py:23 for the web session; the request has 22 reactions, siblings #7319 (17) and #4108 (6)", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "no", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "prj-wiki-tree", + "area": "projects", + "name": "Organise documentation pages in folders or a tree of subpages.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/5620", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: apps/api/plane/db/models/page.py:40 Page.parent exists but no component in apps/web/core/components/pages offers subpages, apps/web/core/components/pages/list/block.tsx:30 is a flat list; 'Nested Pages' is a paid plan line at packages/constants/src/subscription.ts:21; the request has 17 reactions, #7511 folders has 8", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "no", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "plt-2fa", + "area": "platform", + "name": "Protect sign-in with a second factor, such as an authenticator app.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/1212", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5392 (featureRequest).", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: searched apps/api/plane --include=*.py for 'totp', 'two.factor', 'mfa': none; sign-in providers are apps/api/plane/authentication/provider/oauth/google.py:1 and siblings plus email and magic code; the request has 9 reactions", + "kanboard": "source read at v1.2.54: app/Auth/TotpAuth.php:17 time based one time codes in core, app/Template/user_view/sidebar.php:63-64 two factor page; searched app/ for 'webauthn', 'fido', 'passkey': none, which is what the request asks for", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "no", + "kanboard": "partial", + "jira": "unknown" + }, + { + "id": "prj-shared-workflow", + "area": "projects", + "name": "Share one set of statuses, labels and estimates across many projects.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/4706", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: apps/api/plane/app/views/project/base.py:293 each project copies DEFAULT_STATES into its own State rows, and apps/api/plane/db/models/estimate.py:18 an Estimate belongs to one project; searched apps/api/plane/app/urls/state.py for a workspace level state route: none; the request has 10 reactions", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "no", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "brd-filter-exclude", + "area": "boards", + "name": "Filter tasks by excluding a value, such as everything not assigned to me.", + "origin": "featureRequest", + "originUrl": "https://github.com/makeplane/plane/issues/8510", + "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: apps/api/plane/utils/filters/filter_backend.py:172,205 the server accepts a 'not' group in rich_filters, but apps/web/core/hooks/rich-filters/use-filters-operator-configs.ts:19-21 hardcodes allowNegative: false, so the web filter bar offers no exclusion; the request has 6 reactions", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "partial", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "plt-command-palette", + "area": "platform", + "name": "Navigate the whole app and run actions from the keyboard with a command palette.", + "origin": "changelog", + "originUrl": "https://github.com/makeplane/plane/releases/tag/v1.2.0", + "note": "Demand row mined from plane (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: apps/web/core/components/power-k/core/shortcut-handler.ts:12 cmd+k and modifier shortcuts; apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:214 per item actions; apps/api/plane/app/urls/search.py:13 search behind it; shipped as 'Power K, supercharged' in v1.2.0 (2025-12-11)", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "yes", + "kanboard": "unknown", + "jira": "unknown" + }, + { + "id": "bkl-intake-triage", + "area": "backlog", + "name": "Collect incoming requests in a triage queue and accept or decline each before it reaches the backlog.", + "origin": "changelog", + "originUrl": "https://github.com/makeplane/plane/releases/tag/v1.2.0", + "note": "Demand row mined from plane (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/intake/page.tsx; apps/web/core/components/inbox/content/inbox-issue-header.tsx:42,73-74 accept and decline; apps/api/plane/app/urls/intake.py:27, apps/api/plane/app/views/intake/base.py:335; apps/api/plane/db/models/state.py:20 TRIAGE group, 'Triage state for Intake' in v1.2.0", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "yes", + "kanboard": "unknown", + "jira": "unknown" } ], "pending": [ From 2ae2a9b999f0671f69eaff759c553fe6b3617ce2 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:44:02 +0200 Subject: [PATCH 09/13] feat(parity): Jira re-read from public docs across all 148 rows, sources recorded, nine Jira demand rows added --- openspec/parity/capabilities.json | 511 +++++++++++++++++++++--------- 1 file changed, 367 insertions(+), 144 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 787a5f6d..96ed9c08 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -235,9 +235,43 @@ "key": "jira", "name": "Jira Software Data Center 11", "vendor": "Atlassian", - "readOn": "2026-09-13", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", - "evidenceGrade": "docs-only" + "evidenceGrade": "docs-only", + "sources": { + "docs": "https://confluence.atlassian.com/jirasoftwareserver/", + "sourceRepo": null, + "featurePage": "https://www.atlassian.com/enterprise/data-center/jira", + "featureRequests": "https://jira.atlassian.com/browse/JSWSERVER", + "issueTracker": { + "url": "https://jira.atlassian.com/browse/JRASERVER", + "featureLabel": "issuetype = Suggestion" + }, + "roadmap": "https://www.atlassian.com/roadmap/data-center", + "changelog": "https://confluence.atlassian.com/jirasoftware/jira-software-release-notes-776821069.html", + "apiReference": "https://developer.atlassian.com/server/jira/platform/rest/v11000/intro", + "marketplace": "https://marketplace.atlassian.com/addons/app/jira?hosting=datacenter", + "pricing": "https://www.atlassian.com/licensing/data-center", + "accessibilityStatement": "https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html", + "securityDocs": "https://confluence.atlassian.com/security", + "demoInstance": null, + "community": "https://community.atlassian.com/", + "reviews": "https://www.peerspot.com/products/jira-reviews", + "videos": "https://www.youtube.com/@Atlassian", + "caseStudies": "https://www.atlassian.com/customers", + "partnerDirectory": "https://partnerdirectory.atlassian.com/", + "trainingCurriculum": "https://community.atlassian.com/learning", + "jobPostings": "https://www.atlassian.com/company/careers/all-jobs", + "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 426139 (Universiteit Maastricht, Atlassian licences); https://www.tenderned.nl/aankondigingen/overzicht/358912" + ], + "nullReasons": { + "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 Data Center trial URL https://www.atlassian.com/software/jira/data-center/trial returns 404" + } + }, + "readHow": "Docs-only: re-read on 2026-09-26 from public Atlassian documentation, release notes, the Atlassian roadmap and the public tracker jira.atlassian.com (JRASERVER, JSWSERVER), no trial account and no login; the first docs reading was 2026-09-13. Plugin rule, as everywhere in wave 5: a capability that needs a named Marketplace app rates partial with the app and its Jira 11 Data Center build cited, never yes. The 13 Sep reading used no for the same cases, so pln-calendar-view, tsk-checklist, tim-timesheet and tim-approval moved no to partial under this rule, not because Jira itself changed.", + "unknownReason": "Docs-only reading of Jira Software Data Center 11 on 2026-09-26; a cell stays unknown where the public documentation neither states the capability nor its absence, with the pages searched on the cell." } ], "areas": [ @@ -3419,7 +3453,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 3.5 'Upcoming cards (/upcoming/) lists cards assigned to me across boards' ; source read at v1.19.0: src/router.js:36-38 /upcoming; src/components/overview/Overview.vue:111 'Upcoming cards', :57-83 due-date columns; lib/Controller/OverviewApiController.php:29 upcomingCards, lib/Service/OverviewService.php:26-41 cards assigned to me or unassigned across all my boards", "kanboard": "corpus: kanboard/round4/M1-column.md 3.5 'the dashboard shows \"My tasks\" and \"My subtasks\"' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:10 'My tasks', :13 'My subtasks'; app/Controller/DashboardController.php:35-41 tasks via getDashboardPaginator for the user across projects; app/Template/dashboard/tasks.php:2", "openproject": "corpus: openproject/round4/M1-column.md 3.5 'default queries ship and modules/my_page/ renders personal ones'; global 'Work packages' module across projects (corpus: openproject/round4/menu-tree.md) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:41 'assigned_to_me' among the default queries, built at :115; app/menus/work_packages/menu.rb:40-50 lists them in the global Work packages menu across all projects; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' widget", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.5 'predefined system filters for common queries, such as My Open Issues'", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.5 'predefined system filters for common queries, such as My Open Issues' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/searching-for-issues-939938681.html 'predefined system filters for common queries, such as My Open Issues, Reported by Me, Recently Viewed, and All Issues' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md workspace 'Your work' ; M1-column.md 5.4 'a workspace member's profile page aggregates their assigned and created work items' ; source: filter.ts profile_issues list and kanban grouped by project ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/[profileViewId]/page.tsx assigned, created and subscribed tabs; packages/constants/src/issue/filter.ts:113-131 profile_issues list and kanban grouped by project; apps/api/plane/app/urls/workspace.py:153 user-issues route, apps/api/plane/app/views/workspace/user.py:98 WorkspaceUserProfileIssuesEndpoint" }, "built": { @@ -3449,7 +3483,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 4 'The date:overdue filter listed the card' ; M1-column.md 10.1 'no dashboards of counts' : a filter, not a report; no blocked state ; source read at v1.19.0: src/components/overview/Overview.vue:59 'Overdue' column and lib/Service/OverviewService.php:50-52 overdue bucket for my cards; src/components/Controls.vue:172-225 'Filter by due date' with 'Overdue' on a board; no counts and no blocked state, searched src/ for 'blocked': none", "kanboard": "corpus: kanboard/round4/menu-tree.md board filter 'due today, due tomorrow, due yesterday, closed, open' and Analytics 'Task distribution' ; no blocked count ; source read at v1.2.54: app/Template/app/filters_helper.php:8-12 'Tasks due today', 'Tasks due yesterday', 'Closed tasks', 'Open tasks' as filters; app/Template/analytic/sidebar.php:4 'Task distribution' per column; no blocked count and no single status report", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/models/queries/work_packages/filter/blocked_filter.rb (relation 'blocked by'), due_date_filter.rb, status open/closed filters; saved as a query and shown in a widget (corpus: openproject/round4/M1-column.md 10.10) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:38 'overdue' default query; app/models/queries/work_packages/filter/blocked_filter.rb:33, due_date_filter.rb and status_filter.rb filters, saved as queries and shown as widgets or in app/menus/work_packages/menu.rb:40", - "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'Find all overdue issues: duedate < now() and resolution is empty' and gadgets over filters (10.10); blocked is not a state or a documented JQL field in DC, only a link on each issue", + "jira": "corpus: jira-data-center/round4/M1-column.md 8.2 'Find all overdue issues: duedate < now() and resolution is empty' and gadgets over filters (10.10); blocked is not a state or a documented JQL field in DC, only a link on each issue ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-functions-reference-939938746.html 'Find issues that are overdue: duedate < now() and status not in (closed, resolved)': overdue and open are filters and gadgets, blocked is not a documented state (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §10 analytics chart 'x_axis (default PRIORITY) and an optional group_by' counts by state; M1-column.md 8.2 'The server holds no overdue state', and blocked is not a groupable dimension ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/page.tsx profile overview; apps/api/plane/app/views/workspace/user.py:409 state_distribution and :468 pending_issues_count; apps/api/plane/app/views/analytic/advance.py:289-308 counts by x_axis. Searched apps/api/plane/app/views/workspace/user.py and apps/api/plane/app/views/analytic for 'overdue', 'target_date__lt': none, blocked is no dimension" }, "built": { @@ -3483,7 +3517,7 @@ "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload': none; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours", "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; time estimates exist per task (promoted-rows-batch7.md 10.11) but nothing sets them against availability ; source read at v1.2.54: searched app/ (outside Locale) for 'availability', 'capacity', 'vacation', 'absence', 'out of office': only a password reset comment; estimates exist per task, app/Helper/TaskHelper.php:208, but nothing sets a person's available hours", "openproject": "user working hours and time off are recorded (docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md:11 'define your working schedule, plan future schedule changes, and manage your time off'), but the planner that sets workload against them is resource management, Enterprise gated (corpus: openproject/round4/code-census.md #22) Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/routes.rb:1120-1121 per user working hours and non working times, free, with config/initializers/menus.rb:277-279 'Schedule and availability'; modules/resource_management/app/services/resource_allocations/availability.rb:111 hours against availability only in the resource planner, gated at modules/resource_management/app/controllers/resource_management/base_controller.rb:41-43", - "jira": "docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps capacity is set per team per sprint in hours ('If you set the capacity at 40 hours'); per-person hours against availability are not in the 11.3 page", + "jira": "docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps capacity is set per team per sprint in hours ('If you set the capacity at 40 hours'); per-person hours against availability are not in the 11.3 page ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/capacity-and-velocity-in-advanced-roadmaps-1044784184.html 'The number of story points or hours your team can complete in one iteration is referred to as its capacity': team level per iteration; https://jira.atlassian.com/browse/JSWSERVER-25072 'Individual capacity planning is not available in the new experience', Not Being Considered (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §10 no hours logged and no availability model ; source read at v1.4.2: no hours or availability: searched apps/api/plane/db/models --include=*.py for 'capacity', 'availability', 'leave', 'out.?of.?office': none; apps/api/plane/db/models/project.py:98 time tracking flag inert" }, "built": { @@ -3513,7 +3547,7 @@ "nextcloud-deck": "no hours, capacity or availability on a card or user (corpus: nextcloud-deck/round4/code-census.md empty greps 'timesheet|hours|duration' in Db/) ; source read at v1.19.0: searched lib/ and src/ for 'capacity', 'availability', 'workload': none; lib/Db/Card.php:73-96 and lib/Db/User.php carry no hours, so nothing to warn against", "kanboard": "no availability or capacity object (corpus: kanboard/round4/code-census.md objects table; empty grep 'working.?day|business.?day|holiday') ; source read at v1.2.54: searched app/ (outside Locale) for 'capacity', 'availability': no capacity object to exceed; app/Controller/ProjectUserOverviewController.php:104 counts open tasks only", "openproject": "only inside the Enterprise resource planner (corpus: openproject/round4/code-census.md #22); nothing on the free build warns about an over-planned person ; source read at v17.8.0: modules/resource_management/app/services/resource_allocations/availability.rb:52-53 overbooked?; modules/resource_management/config/locales/en.yml:237 'This user is over-allocated in the selected period.'; modules/resource_management/app/controllers/resource_management/work_package_timeline/events_controller.rb:41 marks overbooked allocations, all behind the resource_management token", - "jira": "docs: docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps and https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'the Auto-scheduler will assign tasks to sprints based on the size of an issue, team capacity, and sprint length': capacity per team and sprint, no per-person warning documented", + "jira": "docs: docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps and https://confluence.atlassian.com/jirasoftwareserver/auto-schedule-issues-in-advanced-roadmaps-1044784172.html 'the Auto-scheduler will assign tasks to sprints based on the size of an issue, team capacity, and sprint length': capacity per team and sprint, no per-person warning documented ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/troubleshoot-warnings-in-advanced-roadmaps-1044784205.html warnings flag sprint scope changes, 'a heads up that sprint capacity will be affected': team and sprint capacity, not per person (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §10 no capacity data to warn on ; source read at v1.4.2: no capacity data: searched apps/api/plane/db/models --include=*.py for 'capacity', 'allocation': none; apps/api/plane/celery.py:44-88 has no workload check" }, "built": { @@ -3537,12 +3571,12 @@ "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "unknown", + "jira": "no", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/_round4/compare/promoted-rows-batch6.md 13.17 'no out of office; the platform's user_status shows a status and follows nobody' ; source read at v1.19.0: searched lib/ and src/ for 'absence', 'out of office', 'user_status', 'working hours': none; 'leave' is only leaving a board, lib/Controller/BoardController.php:69", "kanboard": "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 13.17 'grep out.?of.?office|substitut|delegat|absence returns 0' ; source read at v1.2.54: searched app/ (outside Locale) for 'out of office', 'absence', 'vacation', 'holiday', 'working day': none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/schedule-and-availability/README.md time off and individual working hours per user (free); instance working days drive scheduling (corpus: openproject/round4/M1-column.md section 8); using personal time off in planning is resource management, Enterprise gated Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/routes.rb:1121 user non working times (time off) and :1120 working hours, free; modules/resource_management/app/services/resource_allocations/working_time_calendar.rb:17-18 and :81 subtract UserNonWorkingTime and holidays from capacity, only inside the Enterprise resource planner; free scheduling uses app/services/work_packages/shared/days.rb:38 instance working days", - "jira": "not checked: absences appear in the old standalone Advanced Roadmaps 3.29 docs (Configuring the availability of team members) but not in the Jira Software 11.3 Advanced Roadmaps pages read (Teams, Capacity and velocity, Auto-schedule)", + "jira": "not checked: absences appear in the old standalone Advanced Roadmaps 3.29 docs (Configuring the availability of team members) but not in the Jira Software 11.3 Advanced Roadmaps pages read (Teams, Capacity and velocity, Auto-schedule) ; 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; https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html has no absences (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §8 no working-day calendar ('holiday|working_day' 0 hits); M1-column.md 13.12 'out.of.office' grep returns nothing ; source read at v1.4.2: searched apps/api/plane/db/models --include=*.py for 'leave', 'out.?of.?office', 'vacation', 'holiday': only a code comment at apps/api/plane/db/models/base.py:37" }, "built": { @@ -3572,7 +3606,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md empty greps 'payment', 'timesheet|hours|duration' ; source read at v1.19.0: searched lib/ and src/ for 'budget', 'cost': none; lib/Db/Board.php holds title, owner, colour, archive and settings, no money field", "kanboard": "corpus: kanboard/round4/code-census.md 'payment|stripe|ideal returns 26 hits and none is a payment' ; no budget field on a project ; source read at v1.2.54: searched app/Model and app/Schema/Sqlite.php for 'budget', 'cost': none; app/Schema/Sqlite.php:1526-1530 projects table carries no money field", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:15 'If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31-37 budgets; modules/budgets/app/models/budget.rb:120-123 budget_ratio and :150-151 spent from material and labor; modules/budgets/app/views/budgets/show.html.erb:47-48 spent ratio bar and :79 'Spent'", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'nothing financial'; no budget object in Jira Software", + "jira": "corpus: jira-data-center/round4/M1-column.md 12.12 'nothing financial'; no budget object in Jira Software ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html project details carry no budget or cost; https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html lists no financial integration (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 fixed fields and no custom fields; no budget or cost model in db/models ; source read at v1.4.2: searched apps/api/plane/db/models --include=*.py for 'budget', 'cost': none; Project fields at apps/api/plane/db/models/project.py:68-117 carry no money" }, "built": { @@ -3597,12 +3631,12 @@ "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "unknown", + "jira": "partial", "evidence": { "nextcloud-deck": "source: lib/Db/Assignment.php:17-20 assignee types user, group, team, remote; no placeholder role ; source read at v1.19.0: lib/Db/Assignment.php:17-20 assignee types are user, group, circle and remote, each a real account or team; searched lib/ and src/ for 'placeholder role', 'role': no unnamed role assignee", "kanboard": "source: a task has one owner_id, a user (app/Model/TaskCreationModel.php:67); no placeholder role ; source read at v1.2.54: app/Helper/TaskHelper.php:126-127 the assignee select lists users only; app/Schema/Sqlite.php:1553 tasks.owner_id is a user id; searched app/Model for 'placeholder' roles on tasks: none", "openproject": "corpus: openproject/round4/open-core.md placeholder_users Enterprise gated; corpus: openproject/round4/code-census.md #18 'absent from the UI and refused server side, for creation only' ; source read at v17.8.0: config/initializers/menus.rb:324-325 admin 'Placeholder users'; config/initializers/permissions.rb:106 placeholder_users actions; app/contracts/placeholder_users/create_contract.rb:34 creating one needs the :placeholder_users Enterprise token", - "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html does not address members who are not Jira users; virtual members existed in the standalone Portfolio product and were not confirmed for DC 11", + "jira": "not checked: https://confluence.atlassian.com/jirasoftwareserver/teams-in-advanced-roadmaps-1044784181.html does not address members who are not Jira users; virtual members existed in the standalone Portfolio product and were not confirmed for DC 11 ; 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 person, no placeholder role or virtual member is documented (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §5 'Every actor in Plane is a User row with a login'; assignees are users only ; source read at v1.4.2: apps/api/plane/db/models/issue.py:149-152 assignees is a ManyToMany to AUTH_USER_MODEL, so only real users can be assigned; searched apps/api/plane/db/models for 'placeholder', 'role_slot': none" }, "built": { @@ -3631,7 +3665,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no analytics' ; source read at v1.19.0: searched lib/ and src/ for 'cumulative', 'flow diagram', 'chart': none; lib/Db/Stack.php:28-35 keeps no history of card counts per list", "kanboard": "corpus: kanboard/round4/menu-tree.md Analytics 'Cumulative flow diagram' ; M1-column.md 10.4 'from project_daily_column_stats' ; source read at v1.2.54: app/Template/analytic/sidebar.php:10 'Cumulative flow diagram'; app/Controller/AnalyticController.php:119 cfd; assets/js/components/chart-project-cumulative-flow.js renders it", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rniIl 'cumulative.flow|cycle.time|lead.time' over app, modules and frontend/src returns nothing ; source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml, erb) for 'cumulative flow', 'cycle time', 'lead time', 'cycle_time', 'lead_time': none; modules/backlogs/app/components/backlogs/sprint_reports/widgets holds burndown and goal only", - "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'the Cumulative Flow Diagram is an area chart that shows the various statuses of work items'", + "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'the Cumulative Flow Diagram is an area chart that shows the various statuses of work items' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/cumulative-flow-diagram-938845656.html 'A Cumulative Flow Diagram (CFD) is an area chart that shows the various statuses of work items' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §10 analytics are two-dimensional counts; source: grep -rliE 'cumulative' in packages/i18n/src/locales/en returns nothing ; source read at v1.4.2: searched packages/i18n/src/locales/en and apps/web/core for 'cumulative': only the swimlane prop isSubGroupCumulative at apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx:41, no flow chart; apps/api/plane/app/views/analytic/advance.py:289-308 is a two-dimensional count" }, "built": { @@ -3660,7 +3694,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 10.4 'no duration is stored beyond createdAt, lastModified and done' ; source read at v1.19.0: lib/Db/Card.php:81 createdAt and :89 done timestamps exist, but searched lib/ and src/ for 'cycle time', 'lead time', 'cycleTime', 'leadTime': no report computes them", "kanboard": "corpus: kanboard/round4/M1-column.md 10.4 'lead and cycle time per task and averaged (TaskAnalyticModel::getLeadTime, getCycleTime)' ; source read at v1.2.54: app/Template/analytic/sidebar.php:19 'Lead and cycle time', app/Template/analytic/lead_cycle_time.php:3 averages; app/Controller/AnalyticController.php:21 leadAndCycleTime; app/Template/task/analytics.php:14-15 per task; app/Model/TaskAnalyticModel.php:22 getLeadTime, :34 getCycleTime", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): same grep, no cycle or lead time report; corpus: openproject/round4/M1-column.md 10.4 'There is no cycle time, no heatmap and no phase duration analysis' ; source read at v17.8.0: same search as prt-cumulative-flow, app, lib, modules and frontend/src for 'cycle_time', 'lead_time', 'cycle time', 'lead time': none; modules/reporting/app/models/cost_query/group_by holds time and cost groupings, no duration of work", - "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'The Control Chart shows the cycle time and lead time for your product, version, or sprint'", + "jira": "corpus: jira-data-center/round4/M1-column.md 10.4 'The Control Chart shows the cycle time and lead time for your product, version, or sprint' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/control-chart-938845628.html 'The Control Chart shows the cycle time and lead time for your product, version, or sprint' (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 10.4 'no duration recorded anywhere'; completed_at exists (issue.py:236-249) but no lead or cycle time report ; source read at v1.4.2: apps/api/plane/db/models/issue.py:159 completed_at is stored but searched apps/api/plane --include=*.py for 'lead.?time', 'cycle.?time': none, no report computes it" }, "built": { @@ -3690,7 +3724,7 @@ "nextcloud-deck": "source: src/components/navigation/BoardExportModal.vue:12-18 'Export as JSON' and 'Export as CSV' on a board (tag v1.18.4) ; corpus: nextcloud-deck/round4/M1-column.md 10.3 said 'no CSV or XLSX; occ deck:export writes JSON', which the UI export contradicts ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:76 'Export board' opens src/components/navigation/BoardExportModal.vue:12 'Export as JSON', :18 'Export as CSV'; src/services/BoardApi.js:239-243 writes a .csv file of the cards; lib/Controller/BoardController.php:140 export, lib/Service/BoardService.php:716; no PDF", "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 'Exports on the project menu: tasks, subtasks, transitions and daily summaries as CSV with a date range' ; source read at v1.2.54: app/Template/project_header/dropdown.php:63 'Exports'; app/Template/export/header.php:5-14 Tasks, Subtasks, Task transitions, Daily project summary; app/Controller/ExportController.php:34-35 CSV download; searched app/Controller and app/Export for 'pdf': none", "openproject": "corpus: openproject/round4/M1-column.md 10.3 'CSV and PDF registered at config/initializers/export_formats.rb:33-34, XLS added by modules/xls_export' ; source read at v17.8.0: config/initializers/export_formats.rb:34 CSV and :35 PDF list exports, :37 single work package PDF; modules/xls_export/lib/open_project/xls_export/engine.rb:15-18 adds XLS; config/routes.rb:1007 work package export dialog on the list", - "jira": "corpus: jira-data-center/round4/M1-column.md 10.3 'Export > CSV (All fields)'; other formats 'XML, Word and Printable', no XLSX or PDF", + "jira": "corpus: jira-data-center/round4/M1-column.md 10.3 'Export > CSV (All fields)'; other formats 'XML, Word and Printable', no XLSX or PDF ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html 'Click Export > CSV (All fields) or Export > CSV (Current fields)'; 'Click Export > XML'; Word and Printable views, no PDF or XLSX (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §10 'ExporterHistory: provider in json / csv / xlsx' ; M1-column.md 10.3 yes. CSV and spreadsheet yes; PDF export exists only for pages (code-census.md §4), not tasks ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/exports/page.tsx and apps/web/core/components/exporter/export-modal.tsx:91 CSV, Excel, JSON; apps/api/plane/app/urls/exporter.py:12 export-issues, apps/api/plane/app/views/exporter/base.py:23 post; apps/api/plane/db/models/exporter.py:36 providers json, csv, xlsx. PDF only for pages, apps/web/core/components/pages/modals/export-page-modal.tsx" }, "built": { @@ -3720,7 +3754,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 9.3 and 9.4 'no' saved searches ; 10.1 'no' ; source read at v1.19.0: searched lib/ and src/ for 'savedQuery', 'saved search', 'report': none; src/components/Controls.vue:172-229 the board filter is not saved; lib/Search/FilterStringParser.php parses one-off search filters only", "kanboard": "corpus: kanboard/round4/journeys.md 5 shared custom filter saved ; code-census.md 'saved searches custom_filters.is_shared' : a saved query, no report builder ; source read at v1.2.54: app/Template/custom_filter/create.php:14 a saved and shareable query; app/Controller/CustomFilterController.php:57 save; the eight fixed charts in app/Template/analytic/sidebar.php:4-25; no report builder", "openproject": "corpus: openproject/round4/M1-column.md 9.3 personal saved queries, 10.1 widgets, 10.4 cost report pivot engine ; source read at v17.8.0: config/locales/js-en.yml:591 'Save as' a work package view; app/contracts/queries/base_contract.rb:38 sums and :53 group_by saved on a query; modules/reporting/config/routes.rb:49-52 cost report save_as; modules/reporting/app/controllers/cost_reports_controller.rb:146 create", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.3 saved filters, 10.1 gadgets 'Issue Statistics', 'Pie Chart', 10.10 'Filter Results'", + "jira": "corpus: jira-data-center/round4/M1-column.md 9.3 saved filters, 10.1 gadgets 'Issue Statistics', 'Pie Chart', 10.10 'Filter Results' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/gadgets-for-jira-applications-939939037.html 'Filter Results Shows the results of a selected issue filter'; 'Issue Statistics Shows issue statistics returned from a selected project or saved filter' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §9 saved IssueView with filters, display_filters and display_properties (a saved query); §10 'Custom Reports (BUSINESS) are absent' and analytics is a two-dimensional count ; source read at v1.4.2: apps/web/core/components/views/form.tsx:98 saved view form; apps/api/plane/db/models/view.py:58-64 IssueView stores filters and display_properties, a saved query; apps/api/plane/app/views/analytic/advance.py:289-308 analytics is a fixed x_axis by group_by count, no report builder" }, "built": { @@ -3749,7 +3783,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow (lib/Dashboard/), on the Nextcloud dashboard' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers three platform dashboard widgets; lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards', lib/Dashboard/DeckWidgetToday.php:38 'Cards due today', lib/Dashboard/DeckWidgetTomorrow.php:38 'Cards due tomorrow'; src/views/DashboardUpcoming.vue renders them", "kanboard": "not a Nextcloud app; corpus: kanboard/round4/code-census.md empty grep 'widget' ; M1-column.md 9.12 'no' platform integration ; source read at v1.2.54: a standalone PHP application, not a Nextcloud app; searched app/ (outside Locale) for 'widget', 'nextcloud': none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard' (OpenProject Integration app for Nextcloud); notifications, not a task list (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:22 'View OpenProject notifications via the Nextcloud dashboard', served by the separate Nextcloud app from lib/api/v3/notifications/notification_collection_representer.rb; notifications, not a task list; the widget code is not in this repository", - "jira": "not a Nextcloud product and no Nextcloud app from Atlassian; its own dashboard is prt-dashboard (corpus: jira-data-center/round4/M1-column.md 10.2); corpus: jira-data-center/round4/M1-column.md 1.9 integrations page covers Confluence only", + "jira": "not a Nextcloud product and no Nextcloud app from Atlassian; its own dashboard is prt-dashboard (corpus: jira-data-center/round4/M1-column.md 10.2); corpus: jira-data-center/round4/M1-column.md 1.9 integrations page covers Confluence only ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html Jira has its own dashboards; https://confluence.atlassian.com/adminjiraserver/integrating-with-collaboration-tools-938846920.html names Confluence and chat tools, no Nextcloud integration (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 9.12 'Plane is not hosted in a platform'; no Nextcloud dashboard widget ; source read at v1.4.2: Plane is a standalone Django and React app with no Nextcloud dashboard widget: searched apps and packages for 'nextcloud', 'OCP', 'IWidget': none; the only home widgets are Plane's own, apps/web/core/components/home/home-dashboard-widgets.tsx:34-52" }, "built": { @@ -3779,7 +3813,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md card 'Activity (the platform's stream filtered to the card)' ; code-census.md 'activity subjects 39' ; M1-column.md 10.9 'Verified live on card 6' ; source read at v1.19.0: appinfo/info.xml:67-79 registers activity settings, filter and provider; lib/Activity/ActivityManager.php:53-94 board, list, card, label, attachment and comment subjects; src/components/card/CardSidebarTabActivity.vue:7-12 and src/components/board/BoardSidebar.vue:42 'Activity' tabs (platform activity)", "kanboard": "not a Nextcloud app; its own project activity stream (corpus: kanboard/round4/menu-tree.md project 'Activity', task 'Activity stream' ; code-census.md 'event log project_activities') ; source read at v1.2.54: not a Nextcloud app, so no Nextcloud activity stream; its own stream: app/Template/project_header/dropdown.php:38 'Activity', app/Controller/ActivityController.php:34 project, :50 task; app/ServiceProvider/NotificationProvider.php:39 ActivityStreamNotification", "openproject": "own activity module per project (docs: opf/openproject HEAD 27a58131 docs/user-guide/activity; corpus: openproject/round4/M1-column.md 10.5 'the activity view aggregates them per project'); the Nextcloud integration offers dashboard, search and link preview (docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:22-25), no Nextcloud activity stream entries (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:555 OpenProject's own per project Activity page; config/initializers/menus.rb:702-705 project 'Activity' menu; searched modules/storages/app (rb) for 'activity': no event pushed into the Nextcloud activity stream, the Nextcloud side is a separate app", - "jira": "corpus: jira-data-center/round4/M1-column.md 5.4 'Your user profile also displays recent work in the Activity Stream' (own activity stream, not a host platform's)", + "jira": "corpus: jira-data-center/round4/M1-column.md 5.4 'Your user profile also displays recent work in the Activity Stream' (own activity stream, not a host platform's) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/managing-your-user-profile-939938953.html 'Your user profile also displays recent work in the Activity Stream': Jira's own stream, no feed into a host platform's activity app (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §6 'IssueActivity ... ACTIVITY_MAPPER with 28 entries, all issue-scoped'; a per work item feed inside Plane, no workspace activity stream and no Nextcloud activity integration; project settings changes are not recorded (§13) ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/main-content.tsx:184 per work item activity feed; apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx per user activity; apps/api/plane/bgtasks/issue_activities_task.py:1540 ACTIVITY_MAPPER is issue scoped. No Nextcloud activity integration: searched apps and packages for 'nextcloud': none" }, "built": { @@ -3809,7 +3843,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 2.20 'push board changes to open clients when the notify_push app is installed ... without it the client polls. Not driven' ; source read at v1.19.0: src/sessions.js:40-60 listens for deck_board_update and deck_card_update from the notify_push app and reloads the open board; lib/NotifyPushEvents.php:13-14; without notify_push nothing refreshes: searched src/ for 'setInterval', 'polling': only session keep-alive at src/sessions.js:125 and a clock at src/main.js:65", "kanboard": "corpus: kanboard/round4/M1-column.md 2.20 'the board polls: BoardAjaxController::check ... every board_private_refresh_interval seconds (10 by default) ... the task page does not refresh' ; source read at v1.2.54: assets/js/src/BoardPolling.js:1-15 the board polls on an interval; app/Template/board/table_container.php:13 data-check-interval from board_private_refresh_interval; app/Controller/BoardAjaxController.php:65 check; no push and no refresh on the task page", "openproject": "corpus: openproject/round4/M1-column.md 2.20 'The work package page does not update when someone else edits it' ; 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 frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/polling.controller.ts:45 polls every 10 s by default, :135 setInterval, :243-256 when the latest change is from another user it refreshes the work package fields or warns of a conflict; app/components/work_packages/activities_tab/lazy_index_component.rb:127-128 interval setting; boards and lists have no such polling", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 'JSWSERVER-4452 (Agile board should refresh automatically whenever someone moves a card ...), Gathering Interest, 246 votes'", + "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 'JSWSERVER-4452 (Agile board should refresh automatically whenever someone moves a card ...), Gathering Interest, 246 votes' ; docs read 2026-09-26: https://jira.atlassian.com/browse/JSWSERVER-4452 'Agile board should refresh automatically whenever someone moves a card or makes another change', Suggestion, Gathering Interest, 246 votes (tracker REST API, read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 'apps/live/src/types/index.ts:26 export type TDocumentTypes = \"project_page\"; ... pages collaborate live; issue descriptions and comments do not' ; M1-column.md 2.20 partial ; source read at v1.4.2: apps/live/src/types/index.ts:26 TDocumentTypes is only 'project_page'; packages/editor/src/core/extensions/extensions.ts:7,62 HocuspocusProvider for the page editor. Searched apps/web/core/store for 'socket', 'websocket', 'EventSource': none, so work item lists and boards refresh only on fetch" }, "built": { @@ -3839,7 +3873,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md notification kinds 'card-assigned' ; M1-column.md 6.8 'four notifications reached jdevries ... two assignments' ; source read at v1.19.0: lib/Service/AssignmentService.php:77-78 assigning another user calls lib/Notification/NotificationHelper.php:107-121 sendCardAssigned with subject 'card-assigned', rendered by lib/Notification/Notifier.php; UI trigger src/components/card/AssignmentSelector.vue:17", "kanboard": "corpus: kanboard/round4/M1-column.md 6.8 web notifications with the assignee filter ; source: app/Subscriber/NotificationSubscriber.php task events to app/Notification/ (web, mail) ; source read at v1.2.54: app/Subscriber/NotificationSubscriber.php:27 TaskModel::EVENT_ASSIGNEE_CHANGE handled; app/Template/notification/task_assignee_change.php:9 'Assigned to %s'; app/Template/header/user_notifications.php:3 bell with unread notifications", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:18 'Be notified of activities on some or all of the work packages in which you are participating (as assignee, responsible or watcher)' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/notification.rb:34 reason 'assigned'; app/models/notification_setting.rb:33 ASSIGNEE setting; app/services/notifications/create_from_model_service/work_package_strategy.rb derives the recipients; config/initializers/menus.rb:301-303 'Notifications and email' settings page", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur' (corpus: jira-data-center/round4/M1-column.md 8.6); Issue Assigned is a notification scheme event", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur' (corpus: jira-data-center/round4/M1-column.md 8.6); Issue Assigned is a notification scheme event ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur'; https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html mobile push for 'Issues you're assigned to ... New assignee' (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 6.8 'Notification with read_at, snoozed_till, archived_at' ; source: apps/api/plane/bgtasks/issue_activities_task.py:396-408 a new assignee is added as IssueSubscriber, and bgtasks/notification_task.py:303-315 sends them 'in_app:issue_activities:assigned' ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/notifications/page.tsx:12,31 NotificationsRoot inbox; apps/api/plane/bgtasks/issue_activities_task.py:357-371 track_assignees and :395-398 adds the new assignee as IssueSubscriber; apps/api/plane/bgtasks/notification_task.py:280-311 notifies subscribers" }, "built": { @@ -3869,7 +3903,7 @@ "nextcloud-deck": "source: lib/Activity/SettingComment.php:20-28 'A comment was created on a card' activity setting, delivered by the platform's stream, mail or push per user ; corpus: nextcloud-deck/round4/code-census.md 'card-comment-mentioned' notification for mentions ; source read at v1.19.0: lib/Listeners/CommentEventListener.php:41-44 and :56-59 a new comment triggers the card_comment_create activity; lib/Activity/SettingComment.php:28 'A comment was created on a card' setting delivered by the platform stream or mail; direct notification only for mentions, lib/Notification/NotificationHelper.php:178", "kanboard": "corpus: kanboard/round4/M1-column.md 6.1 'a mention that notifies' and 6.8 notifications to assignee or creator ; source: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE => handleEvent, app/Template/notification/comment_create.php ; source read at v1.2.54: app/Subscriber/NotificationSubscriber.php:31 CommentModel::EVENT_CREATE handled; app/Template/notification/comment_create.php:3 mail body; app/Template/user_view/notifications.php:13 limit to tasks assigned to or created by me", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/notification-settings/README.md:27-29 participants are notified of all activities by default; docs: opf/openproject HEAD 27a58131 docs/user-guide/notifications/README.md:22 'new comments that mention you' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/notification.rb:37 reason 'commented' and :33 'mentioned'; app/models/notification_setting.rb:41 WORK_PACKAGE_COMMENTED; app/services/notifications/create_from_model_service.rb:33 mention parsing", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html events 'when an issue is created or completed, or when any issue fields are updated' (corpus: jira-data-center/round4/M1-column.md 8.6), comments included; push notifications for watched issues and mentions (Push notifications page)", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html events 'when an issue is created or completed, or when any issue fields are updated' (corpus: jira-data-center/round4/M1-column.md 8.6), comments included; push notifications for watched issues and mentions (Push notifications page) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html batched updates include 'Changes to any of the issue fields ... Comments Work logs Attachments Mentions' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §6 UserNotificationPreference 'comment' boolean ; source: bgtasks/notification_task.py:267 comment mentions and subscribers notified ; source read at v1.4.2: apps/web/core/components/settings/profile/content/pages/notifications/email-notification-form.tsx:131 'comment' preference; apps/api/plane/bgtasks/notification_task.py:133-150 comment mentions and :280-311 subscribers notified; apps/api/plane/db/models/notification.py:106 comment preference" }, "built": { @@ -3899,7 +3933,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 8.6 'platform: the notification (8.4) is mailed when the user's notification settings say so; Deck sends no mail itself' ; source: lib/Activity/SettingBase.php activity mail choices ; source read at v1.19.0: lib/Activity/SettingBase.php:79-89 each Deck activity type can be mailed by the platform, off by default; appinfo/info.xml:69-71 SettingChanges, SettingDescription, SettingComment; searched lib/ for 'IMailer': none, Deck sends no mail itself (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 8.6 'the overdue command sends e-mail' ; code-census.md notifications 'app/Notification/ (web, mail, webhook, activity stream)' ; source read at v1.2.54: app/ServiceProvider/NotificationProvider.php:31 'Email' notification type; app/Notification/MailNotification.php:31 notifyUser; app/Template/user_view/notifications.php:9 user picks methods", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/account-settings/notification-and-email/README.md:23-25 'Email reminders ... configure the email reminders which you receive' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/services/notifications/mail_service.rb:44 sends mail per notification strategy; app/components/my/reminders/show_page_component.html.erb:33 immediate reminders and :45 daily email reminders; config/routes.rb:1138-1140 update_reminders and update_email_alerts", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur'", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-email-notifications-938847633.html 'Jira can send email notifications to users when significant events occur. For example, when an issue is created or completed' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §6 'Email delivery is batched by bgtasks/email_notification_task.py, scheduled every five minutes', needs SMTP (menu-tree.md god-mode 'Email SMTP') ; source read at v1.4.2: apps/web/core/components/settings/profile/content/pages/notifications/email-notification-form.tsx:69,89,131,151 email toggles; apps/api/plane/bgtasks/email_notification_task.py:47 stack_email_notification and :153 send_email_notification; apps/api/plane/celery.py:47 scheduled batching. Needs SMTP set by the instance admin" }, "built": { @@ -3929,7 +3963,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'live presence: Session per user per board, events for notify_push' ; corpus: _round4/compare/findings-batch6.md '2.31 ... Deck yes by its sessions' ; 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 isNotifyPushEnabled; src/sessions.js:76-82 createSession returns a dummy without notify_push; appinfo/routes.php:183-185 session create, sync, close", "kanboard": "corpus: kanboard/round4/_round4/compare/pending-rows-batch7.md 2.31 'no' (does the product show who else has the case open right now) ; source read at v1.2.54: searched app/Controller and app/Template for 'presence', 'viewing', 'online': none; assets/js/src/BoardPolling.js:15 polls for changes, not for viewers", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): grep -rliE 'presence|currently viewing|also editing' over app, lib and frontend/src/app matches only Ruby presence checks in services (user_preferences/update_service.rb, journals/create_service.rb); no viewer indicator ; source read at v17.8.0: searched app, lib and frontend/src/app (rb, ts, erb, html) for 'currently viewing', 'also editing', 'viewers': only BIM viewer code and lib/open_project/text_formatting/filters/mention_filter.rb; real-time collaboration exists only in the Documents module (modules/documents/app/views/documents/show.html.erb), not on tasks or boards", - "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 the issue pages 'say nothing about refresh', and no presence indicator appears in the issue or board documentation read", + "jira": "corpus: jira-data-center/round4/M1-column.md 2.20 the issue pages 'say nothing about refresh', and no presence indicator appears in the issue or board documentation read ; docs read 2026-09-26: https://jira.atlassian.com/browse/JRASERVER-69810 'Show who is Viewing the JIRA ticket Real Time', Suggestion, Gathering Interest, 8 votes (tracker REST API, read 2026-09-26)", "plane": "source: grep -rlniE 'cursor|presence|collaborators|users.?online' packages/editor/src/core/extensions packages/editor/src/core/hooks and grep awareness in packages/editor/src return nothing; corpus silent ; source read at v1.4.2: searched packages/editor/src, apps/live/src and apps/web/core for 'awareness', 'CollaborationCursor', 'connected.?users', 'active.?users', 'viewers': none; apps/live/src/types/index.ts:26 live sync covers pages only and shows no presence" }, "built": { @@ -3958,7 +3992,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 6.12 'the smart picker (lib/Reference/CreateCardReferenceProvider.php) creates a card from inside Talk and pastes its link ... not driven' ; open-core.md 'It does not reach ... Talk's inbox' : no conversation per card ; source read at v1.19.0: src/init-talk.js:24-25 registers a Talk message action 'Create a card' from a chat message, loaded in Talk by lib/Listeners/BeforeTemplateRenderedListener.php:45-46; lib/Reference/CreateCardReferenceProvider.php:36 'Create a new deck card' smart picker; searched lib/ and src/ for a per-card conversation: none", "kanboard": "corpus: kanboard/round4/M1-column.md 6.12 'no chat ... Slack and Mattermost are directory plugins' ; source read at v1.2.54: searched app/ (outside Locale) for 'slack', 'mattermost', 'rocket', 'chat': none; app/Schema/Sqlite.php:548-550 the old HipChat settings are deleted by migration; chat is the third-party Slack and Mattermost plugins", "openproject": "no chat integration (corpus: openproject/round4/M1-column.md 6.12 'no chat integration'); the Nextcloud app gives Talk only a link preview (col-link-preview) ; source read at v17.8.0: searched modules/storages, app and lib (rb) for 'spreed', 'nextcloud talk', 'talk': only a code comment in app/services/oauth_clients/connection_manager.rb:63; no Talk room per work package; docs/user-guide/file-management/nextcloud-integration/README.md:220-222 Talk only renders a link preview", - "jira": "corpus: jira-data-center/round4/M1-column.md 6.12 'no chat capture ... Jira Server for Slack is a Marketplace plugin, not the product'", + "jira": "corpus: jira-data-center/round4/M1-column.md 6.12 'no chat capture ... Jira Server for Slack is a Marketplace plugin, not the product' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/integrating-with-collaboration-tools-938846920.html covers Confluence and the retired Hipchat integration; a Marketplace REST search for 'nextcloud' among Data Center Jira apps returns 0 (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 SlackProjectSync is an 'unreachable dead table'; no chat integration of any kind, and Talk is Nextcloud-specific ; source read at v1.4.2: apps/api/plane/db/models/integration/slack.py:14 SlackProjectSync is a model with no route: searched apps/api/plane/app/urls for 'slack', 'talk', 'mattermost', 'teams': none" }, "built": { @@ -3988,7 +4022,7 @@ "nextcloud-deck": "source: lib/AppInfo/Application.php:144-146 CardReferenceProvider, BoardReferenceProvider, CommentReferenceProvider render rich previews of pasted links in Talk and Text ; corpus: nextcloud-deck/round4/code-census.md 'reference (4)' ; source read at v1.19.0: lib/AppInfo/Application.php:145-147 registers CardReferenceProvider, BoardReferenceProvider and CommentReferenceProvider; src/views/CardReferenceWidget.vue and src/views/BoardReferenceWidget.vue render the previews in Talk and Text (platform reference API)", "kanboard": "source: grep -rniE 'oembed|og:|unfurl' app/Template/layout.php returns nothing; no preview of a task link elsewhere ; corpus: kanboard/round4/code-census.md empty grep 'widget' ; source read at v1.2.54: searched app/Template for 'oembed', 'og:', 'twitter:card', 'unfurl': none; no endpoint that serves a task preview to another app", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:220-222 'Starting with OpenProject Nextcloud Integration App 2.4 a work package link preview will be shown if you use Nextcloud Talk or Text apps' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:220-224 work package link preview in Nextcloud Talk and Text via the integration app, which reads lib/api/v3/work_packages/work_package_representer.rb:302 previewMarkup; inside OpenProject config/routes.rb:1010 work package hover_card preview", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 'Gadgets You can embed a Confluence activity stream ... in Jira's dashboard' and application links to Confluence (1.9): previews live in Confluence, a separate product; no chat unfurl in the product", + "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 'Gadgets You can embed a Confluence activity stream ... in Jira's dashboard' and application links to Confluence (1.9): previews live in Confluence, a separate product; no chat unfurl in the product ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Any Jira search result can be embedded in a Confluence page using the Jira Issues macro': previews live in Confluence, not in a general chat or document tool (read 2026-09-26)", "plane": "source: apps/web/app/root.tsx:88-95 static og:title APP_TITLE and og:url https://app.plane.so/ for every page, so a pasted work item link previews as the generic app; no per-item unfurl. Corpus silent ; source read at v1.4.2: apps/web/app/root.tsx:102-107 static og:title APP_TITLE and og:url https://app.plane.so/ for every page, so a pasted work item link previews as the generic app; searched apps for 'oembed': none. apps/api/plane/tests/unit/bg_tasks/test_ssrf_advisories.py:26 unfurling is the other direction, links pasted into Plane" }, "built": { @@ -4018,7 +4052,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Unified search. Cards and boards under search-deck-card-board, comments under search-deck-comment ... Verified live' ; M1-column.md 9.12 'yes' ; source read at v1.19.0: lib/AppInfo/Application.php:136-137 registers DeckProvider and CardCommentProvider; lib/Search/DeckProvider.php:31 'search-deck-card-board', :42-50 boards and cards; lib/Search/CardCommentProvider.php:35 'search-deck-comment' (platform unified search)", "kanboard": "corpus: kanboard/round4/M1-column.md 9.12 'no platform search to join' ; 9.1 'the header search box ... across every project the user can see' : its own global search finds tasks, not projects ; source read at v1.2.54: not a Nextcloud app, no platform search to join; its own search: app/Controller/SearchController.php:16-34 finds tasks across the user's projects with TaskProjectsFilter; projects are found only by name on app/Controller/ProjectListController.php:27-31", "openproject": "corpus: openproject/round4/M1-column.md 9.1 global quick search over eight searchables including work packages and projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets allows you to search OpenProject work packages via the universal search bar in Nextcloud' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:326 OpenProject's own global search; app/controllers/search_controller.rb:141 search types include work packages and projects; docs/user-guide/file-management/nextcloud-integration/README.md:214 'Enable unified search for tickets' in Nextcloud through the integration app", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'The Search box is located at the top right of your screen ... start typing to search through all your issues and projects'", + "jira": "corpus: jira-data-center/round4/M1-column.md 9.1 'The Search box is located at the top right of your screen ... start typing to search through all your issues and projects' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/quick-searching-939938728.html 'The Search box is located at the top right of your screen, in the Jira header bar': Jira's own global search, it is its own platform (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 9.1 'app/views/search/base.py with per-entity filter methods for workspaces, projects, issues, cycles, modules, pages, views and intakes'; the product's own global search, titles only (code-census.md §9) ; source read at v1.4.2: apps/web/core/components/power-k/ui/modal/search-menu.tsx:51 searchWorkspace from the command palette; apps/api/plane/app/urls/search.py:13 route, apps/api/plane/app/views/search/base.py:46 GlobalSearchEndpoint over projects and work items, titles and keys only, :83-94" }, "built": { @@ -4048,7 +4082,7 @@ "nextcloud-deck": "generic only: lib/AppInfo/Application.php:212-213 registers Nextcloud collaboration ResourceProvider and ResourceProviderCard, so a board or card can be linked to other resources; nothing specific to the fleet's case management app ; source read at v1.19.0: generic only: lib/AppInfo/Application.php:213-214 registers collaboration ResourceProvider and ResourceProviderCard, shown by src/components/card/CardSidebarTabDetails.vue:34-38 NcCollectionList when the platform projects feature is on; searched lib/ and src/ for 'procest', 'dossiq', 'zaak': none", "kanboard": "generic only: corpus: kanboard/round4/journeys.md 4 'createExternalTaskLink to a web link' ; menu-tree.md 'Add external link' ; journeys.md 1 a task 'reference' of Z-2026-0001 ; source read at v1.2.54: generic only: app/Template/task/sidebar.php:51 'Add external link', app/ExternalLink/WebLinkProvider.php; app/Helper/TaskHelper.php:198-199 free text 'Reference' field, :250 rendered as a link when it is a URL; no case app integration", "openproject": "no case management integration; a generic 'link' custom field format exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/initializers/custom_field_format.rb:41 formats.register('link')), so a URL to an external record can be stored per work package or project (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/custom_field_format.rb:39-40 a 'link' (URL) custom field format usable on work packages and projects, so a case URL can be stored; searched app/models and modules/*/app/models for 'zaak', 'case management': no case connector", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'Issue linking allows you to create an association between two existing issues on either the same or different Jira servers' (corpus: jira-data-center/round4/M1-column.md 2.10); web links and a 'URL field' (corpus: jira-data-center/round4/M1-column.md 5.13) hold an external reference, no case app integration", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'Issue linking allows you to create an association between two existing issues on either the same or different Jira servers' (corpus: jira-data-center/round4/M1-column.md 2.10); web links and a 'URL field' (corpus: jira-data-center/round4/M1-column.md 5.13) hold an external reference, no case app integration ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'Link an issue to any other web page' and links between issues 'on either the same or different Jira servers': a plain web link, no case system integration (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §2 'IssueLink is a URL plus metadata JSON'; a generic external link can point at a case, no case integration ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/links/root.tsx:17,37 createLink with a URL and title; apps/api/plane/app/urls/issue.py:110 issue-links route; apps/api/plane/db/models/issue.py:371 IssueLink. A generic URL can point at a case, no case integration" }, "built": { @@ -4078,7 +4112,7 @@ "nextcloud-deck": "fleet-specific; Deck creates a card from Talk or Text (CreateCardReferenceProvider) but no board from another app's record (corpus: nextcloud-deck/round4/M1-column.md 1.9) ; source read at v1.19.0: searched lib/ and src/ for 'procest', 'dossiq', 'zaak': none; a card, not a board, can be made from Talk or Text, lib/Reference/CreateCardReferenceProvider.php:36 and src/init-talk.js:24", "kanboard": "fleet-specific; no create-from-record integration (corpus: kanboard/round4/M1-column.md 1.3 'no') ; source read at v1.2.54: fleet specific; app/Controller/ProjectCreationController.php:56 save takes a form only, searched app/ for a create-from-record hook: none", "openproject": "no case object or case app connector (corpus: openproject/round4/M1-column.md section 12 all Dutch case APIs 'no'); projects are created from templates only ; source read at v17.8.0: searched app/models and modules/*/app/models for 'zaak', 'case': no case object or connector; app/components/projects/template_select_component.html.erb:39 projects start blank or from a template only", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.1 'No ZGW'; no case system integration to start a project from", + "jira": "corpus: jira-data-center/round4/M1-column.md 12.1 'No ZGW'; no case system integration to start a project from ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html names no case management integration; project creation is an admin action (https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html) (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 no connectors reachable; §5 no case or contact entity ; source read at v1.4.2: searched apps/api/plane/db/models/__init__.py for 'customer', 'contact', 'organisation', 'organization', 'case': none; the only create path is the project form, apps/api/plane/app/views/project/base.py:257-258" }, "built": { @@ -4108,7 +4142,7 @@ "nextcloud-deck": "fleet-specific; corpus: nextcloud-deck/round4/M1-column.md 5.4 'no' contact 360 and open-core.md 'Contacts has no link from a card' ; source read at v1.19.0: searched lib/ and src/ for 'pipelinq', 'crm', 'contact': no client link; lib/Db/Board.php:35-54 a board has no client or contact field", "kanboard": "fleet-specific; corpus: kanboard/round4/M1-column.md 5.2 'no' contact registry ; source read at v1.2.54: fleet specific; searched app/Template and app/Controller for 'client', 'customer', 'contact' registry: only mail hits; no embed surface for another app", "openproject": "no CRM integration; corpus: openproject/round4/M1-column.md 5.2 'no contact record' ; source read at v17.8.0: searched app/models (rb) for 'crm', 'contact': no client or contact record and no CRM connector; the nearest is a project attribute, app/models/project_custom_field.rb:58", - "jira": "corpus: jira-data-center/round4/M1-column.md 5.2 'Customers and organizations are JSM DC records'; no CRM client page integration", + "jira": "corpus: jira-data-center/round4/M1-column.md 5.2 'Customers and organizations are JSM DC records'; no CRM client page integration ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/licensing-and-application-access-938846887.html customer records belong to Jira Service Management, a separate application; https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html lists no CRM integration (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §5 'Contact, organisation or customer object: absent' ; source read at v1.4.2: searched apps/api/plane/db/models/__init__.py for 'customer', 'contact', 'client': none; Project has no client field, apps/api/plane/db/models/project.py:68-117" }, "built": { @@ -4141,7 +4175,7 @@ "nextcloud-deck": "source: lib/AppInfo/Application.php:189 DeckTeamResourceProvider lists a team's boards on the Team page, :144-145 board and card reference widgets in Text and Talk ; corpus: nextcloud-deck/round4/code-census.md 'team resource' ; source read at v1.19.0: lib/AppInfo/Application.php:191 DeckTeamResourceProvider lists a team's boards on the platform Team page; :145-146 card and board reference widgets, src/views/BoardReferenceWidget.vue, embed a board or card in Text and Talk; no widget for another app's record", "kanboard": "standalone application with no embed surface ; corpus: kanboard/round4/code-census.md empty grep 'widget' ; source read at v1.2.54: standalone application; searched app/ (outside Locale) for 'widget', 'embed' surfaces for another app: none; the nearest outward views are the token feeds, app/Controller/ICalendarController.php:62 and the public board", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:161 'In the Details side panel, click on the OpenProject tab. This tab lets you link work packages in OpenProject to the current file, and will list all linked work packages' (work packages on a Nextcloud file, not projects on a record) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: docs/user-guide/file-management/nextcloud-integration/README.md:161 the Nextcloud Files sidebar 'OpenProject' tab lists the work packages linked to a file, built by the separate Nextcloud app on modules/storages/lib/api/v3/file_links/create_endpoint.rb and modules/storages/lib/api/v3/file_links/file_link_representer.rb:144; work packages on a file, not a record's projects in another app", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 Confluence and Jira embed each other's content through application links ('You can embed a Confluence activity stream or a Confluence page in Jira's dashboard'); another Atlassian product, not an arbitrary app's record page", + "jira": "corpus: jira-data-center/round4/M1-column.md 9.12 Confluence and Jira embed each other's content through application links ('You can embed a Confluence activity stream or a Confluence page in Jira's dashboard'); another Atlassian product, not an arbitrary app's record page ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Any Jira search result can be embedded in a Confluence page using the Jira Issues macro': embedding works inside Atlassian products over application links, not in any other app's page (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 12.17 'there is no plugin API'; no embeddable widget in apps/web ; source read at v1.4.2: searched apps/web/app for 'iframe', 'embed': none; the only outside view is the read-only public board, apps/api/plane/db/models/deploy_board.py:19-32, which shows one published entity, not a record's projects" }, "built": { @@ -4171,7 +4205,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 1.7 'a REST API at /index.php/apps/deck/api/v1.0 and v1.1 (84 routes ...) plus 24 OCS routes. Verified live' ; source read at v1.19.0: appinfo/routes.php:102-114 card_api routes under /api/v{apiVersion}/boards/.../cards, :139-141 OCS routes; lib/Controller/CardApiController.php and lib/Controller/BoardApiController.php; docs/API.md:7-53 the documented REST API", "kanboard": "corpus: kanboard/round4/code-census.md 'JSON-RPC procedure classes / methods 26 / 161' ; journeys.md 1 and 4 all over the API (JSON-RPC 2.0, not REST: M1-column.md 12.18) ; source read at v1.2.54: jsonrpc.php:5 JSON-RPC 2.0 endpoint, not REST; app/Api/Procedure holds 26 procedure classes, app/Api/Procedure/ProjectProcedure.php:109 createProject, app/Api/Procedure/TaskProcedure.php:101 createTask; app/Template/config/api.php:7-11 token and endpoint shown to the admin", "openproject": "corpus: openproject/round4/M1-column.md 1.7 'API v3 is a Grape API rooted at lib/api/v3/root.rb'; 12.18 OpenAPI description ; source read at v17.8.0: lib/api/v3/root.rb:35 API v3 root mounting every resource from :46; lib/api/v3/work_packages/work_packages_api.rb:99 work package endpoints; docs/api/apiv3/openapi-spec.yml the published OpenAPI description", - "jira": "corpus: jira-data-center/round4/M1-column.md 1.7 'POST /api/2/issue Create an issue or sub-task from json'; 12.18 OpenAPI 3.0.1, 432 operations", + "jira": "corpus: jira-data-center/round4/M1-column.md 1.7 'POST /api/2/issue Create an issue or sub-task from json'; 12.18 OpenAPI 3.0.1, 432 operations ; docs read 2026-09-26: https://developer.atlassian.com/server/jira/platform/rest/v11000/api-group-issue embedded OpenAPI 3.0.1 'Jira Software Data Center REST API Reference' 11.0.1, 432 operations, including 'POST /api/2/issue Create an issue or sub-task from json' and 'POST /api/2/project Create a new project' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 'The public REST API lives at apps/api/plane/api/ with views for ... issue, member, module, project, state', X-Api-Key auth ; M1-column.md 1.7 yes ; source read at v1.4.2: apps/web/core/components/settings/profile/content/pages/api-tokens.tsx and apps/web/core/components/api-token/modal/create-token-modal.tsx issue a token; apps/api/plane/app/urls/api.py:11 api-tokens; apps/api/plane/api/middleware/api_authentication.py:17-24 X-Api-Key; apps/api/plane/api/urls/work_item.py:36-41 project issues CRUD" }, "built": { @@ -4201,7 +4235,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'The Flow engine acts on files and knows no card event' ; source read at v1.19.0: searched lib/ for 'WorkflowEngine', 'IEntity', 'IOperation': none, so Deck registers no flow entity or check; card events reach only webhooks, lib/Event/ACardEvent.php:16", "kanboard": "corpus: kanboard/round4/usability.md 'fifty event-to-action classes, bound per project' ; journeys.md 2 'A rule fires on a move' ; source read at v1.2.54: app/Template/action/index.php:5 'Add a new action'; app/Controller/ActionCreationController.php:36 pick an event, :59 params, :102 save; app/ServiceProvider/ActionProvider.php:75 action manager with some fifty registered actions; app/Core/Action/ActionManager.php:126 attachEvents", "openproject": "corpus: openproject/round4/M1-column.md 3.9 CustomAction 'is fired by a button a user presses, not by a transition' and authoring is Enterprise gated; webhooks are outbound only (6.11); no event-driven rules on the free build ; source read at v17.8.0: app/controllers/custom_actions_controller.rb:34 custom actions (multi-field changes on a button) are Enterprise gated to author; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 outbound created or updated events only; searched for event-driven rules on the free build: none", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation 'You can choose from many triggers including issue transitioned, scheduled trigger, or issue created' (bundled in Data Center)", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 automation 'You can choose from many triggers including issue transitioned, scheduled trigger, or issue created' (bundled in Data Center) ; docs read 2026-09-26: https://confluence.atlassian.com/automation/jira-automation-triggers-993924804.html 'You can use the following triggers: General triggers Field value changed Incoming webhook Issue archived Issue assigned Issue commented Issue created' (Automation for Jira, bundled in Data Center) (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §3 'no rule, no trigger, no condition and no action model'; 'Trigger And Action' (Pro) and 'Automation Flows' (Enterprise) are absent from Community (open-core.md) ; source read at v1.4.2: apps/web/core/components/workflow/use-workflow-drag-n-drop.ts:10-23 is a no-op shim; the only automation is apps/api/plane/db/models/project.py:110-111 archive_in and close_in; searched apps/api/plane/db/models for a Trigger, Rule or Automation class: none" }, "built": { @@ -4231,7 +4265,7 @@ "nextcloud-deck": "source: lib/Event/ACardEvent.php:17 'abstract class ACardEvent extends Event implements IWebhookCompatibleEvent' (CardCreatedEvent, CardUpdatedEvent, CardDeletedEvent), so the platform's webhook_listeners can post card events once an admin registers a listener over OCS. corpus: nextcloud-deck/round4/M1-column.md 6.11 said 'registers no events with webhook_listeners'; the tag's source contradicts it; not driven ; source read at v1.19.0: lib/Event/ACardEvent.php:16 card events implement the platform IWebhookCompatibleEvent, as do ACL events in lib/Event/AAclEvent.php:14, so the platform webhook_listeners app can post them once an admin registers a listener through its API; no webhook screen in Deck, searched src/ for 'webhook': none", "kanboard": "corpus: kanboard/round4/M1-column.md 6.11 'one webhook URL per instance with a token ... posted with event_name, event_data and event_author on every project event' ; source read at v1.2.54: app/Template/config/webhook.php:7-8 'Webhook URL', :20 token; app/ServiceProvider/NotificationProvider.php:38 webhook project notification; app/Notification/WebhookNotification.php:36 notifyProject, :59 postJson", "openproject": "corpus: openproject/round4/M1-column.md 6.11 'modules/webhooks/app/models/webhooks/webhook.rb with an event.rb selection model and a log.rb' ; source read at v17.8.0: modules/webhooks/config/routes.rb:30-38 admin outgoing webhooks; modules/webhooks/app/models/webhooks/webhook.rb:8 events per webhook and :24 all_projects; modules/webhooks/lib/open_project/webhooks/event_resources/work_package.rb:54 work package created or updated; modules/webhooks/app/models/webhooks/log.rb delivery log", - "jira": "corpus: jira-data-center/round4/M1-column.md 6.11 'Webhooks are user-defined HTTP POST callbacks ... signed on request (HMAC)'", + "jira": "corpus: jira-data-center/round4/M1-column.md 6.11 'Webhooks are user-defined HTTP POST callbacks ... signed on request (HMAC)' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-webhooks-938846912.html 'Webhooks are user-defined HTTP POST callbacks. They provide a lightweight mechanism for letting remote applications receive push notifications from Jira' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §11 'Webhook ... Event subscription is five booleans: project, issue, module, cycle, issue_comment', HMAC secret, WebhookLog with retry_count ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/webhooks/page.tsx; apps/api/plane/db/models/webhook.py:39-43 event switches project, issue, module, cycle, issue_comment; apps/api/plane/bgtasks/webhook_task.py:101-114 delivery with retry_count" }, "built": { @@ -4261,7 +4295,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; M1-column.md 11.2 'occ deck:export and occ deck:import ... Verified live' ; source read at v1.19.0: src/components/navigation/AppNavigationImportBoard.vue:7 'Import board', :10 accepts a JSON file, :45 importBoard; lib/Controller/BoardController.php:147 import, :183 system DeckJson; lib/Command/BoardImport.php:33 occ deck:import", "kanboard": "source: app/Import/ holds TaskImport.php and UserImport.php (CSV) only; no Deck importer ; source read at v1.2.54: app/Import holds only TaskImport.php and UserImport.php for CSV; searched app/ (outside Locale) for 'deck', 'trello', 'jira' importers: none", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): importers are app/services/import/jira* only (grep -rniIl 'deck' app/services/import returns nothing); CSV work package import is marked 'available on our Dev branch' (docs/user-guide/work-packages/importing/README.md) ; source read at v17.8.0: searched app/services/import and app/models for 'deck', 'trello': none; config/initializers/menus.rb:694-697 the only importer is 'Jira import'; docs/user-guide/work-packages has no CSV import at the tag", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html names CSV, JSON and importers for TFS, Rally, VersionOne, YouTrack, Axosoft, BaseCamp and Excel; no Nextcloud Deck importer", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html names CSV, JSON and importers for TFS, Rally, VersionOne, YouTrack, Axosoft, BaseCamp and Excel; no Nextcloud Deck importer ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/migrating-from-other-issue-trackers-938847532.html 'As of Jira 8.4, we no longer support built-in importers that are dedicated to some applications ... you can still import data to Jira in CSV or JSON format': no Nextcloud Deck importer (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 'Importers: same. Importer is exported ... but no importer view or URL exists' ; source read at v1.4.2: apps/api/plane/db/models/importer.py:13 Importer model has no view; apps/api/plane/app/urls/external.py:17,22 the routes named 'importer' point at GPT endpoints; searched apps/web/core --include=*.tsx for 'deck': none" }, "built": { @@ -4291,7 +4325,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Import board Deck JSON, Trello JSON, Trello API' ; code-census.md 'lib/Service/Importer/Systems/' ; 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 TrelloApiService.php reachable through lib/Command/BoardImport.php:33-40 occ deck:import --system and appinfo/routes.php:91-93 import API; the UI import is Deck JSON only, lib/Controller/BoardController.php:183; searched lib/Service/Importer for 'jira', 'csv': none", "kanboard": "corpus: kanboard/round4/menu-tree.md 'Import tasks' ; source: app/Import/TaskImport.php CSV tasks into an existing project; no Jira or Trello importer in core ; source read at v1.2.54: app/Template/project_header/dropdown.php:69 'Import tasks'; app/Template/task_import/show.php:2-8 CSV with a delimiter; app/Controller/TaskImportController.php:40 save, :70 template; app/Template/project/sidebar.php:55 'Import tasks from another project'; no Jira or Trello importer in core", "openproject": "docs: opf/openproject HEAD 27a58131 docs/installation-and-operations/jira-migration/README.md 'Step-by-step guide for migrating from Jira Data Center to OpenProject using the Jira Migrator'; source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/services/import/jiras/create_service.rb. Note: the migrator arrived behind a feature flag in 17.2 (release-notes/17-2-0:129-134), after the round-4 drive on 16.6.10; CSV import is dev-branch only Shipped in 17.x, after the 16.6.10 drive; the cited files are present at v17.8.0 (absent at v16.6.10). ; source read at v17.8.0: config/initializers/menus.rb:694-697 admin 'Jira import'; config/routes.rb:908-918 admin import jira instances and runs; app/services/import/jira_client.rb and app/services/import/jiras do the import; no Trello or spreadsheet importer, Jira only", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file'", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/importing-data-from-csv-938847533.html 'The Jira Importers plugin, which is bundled with Jira, allows you to import your data from a comma-separated value (CSV) file'; https://confluence.atlassian.com/adminjiraserver/importing-and-exporting-data-938847531.html import 'another Jira instance'; no Trello importer is listed (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 'no importer view or URL exists'; source: grep -rniE 'import.?csv|jira|trello' apps/web/core --include=*.tsx finds no importer UI ; source read at v1.4.2: apps/api/plane/db/models/importer.py:13 Importer is unrouted; searched apps/api/plane/app for 'jira', 'trello': none; apps/web/core/components/workspace/billing/comparison/plans.tsx:940-941 'Import your work items and members from Jira' is a paid plan line, not an importer" }, "built": { @@ -4321,7 +4355,7 @@ "nextcloud-deck": "source: grep -rniE 'github|gitlab|commit' lib returns only migration comments; no forge integration ; corpus: nextcloud-deck/round4/open-core.md host surfaces list ; source read at v1.19.0: searched lib/ and src/ for 'github', 'gitlab', 'forge', 'commit': only a comment URL at lib/Service/SessionService.php:77 and a Vuex commit at src/components/Controls.vue:450; no forge integration", "kanboard": "source: grep -rniE 'github|gitlab|gogs|bitbucket' app/Action app/Controller returns 0 files; forge hooks are plugins (corpus: kanboard/round4/open-core.md 'a directory of 163 third-party plugins') ; source read at v1.2.54: searched app/Action and app/Controller for 'github', 'gitlab', 'gogs', 'bitbucket': no files; forge webhooks are third-party plugins", "openproject": "corpus: openproject/round4/M1-column.md 12.22 'the GitHub and GitLab modules receive inbound events (modules/github_integration/, modules/gitlab_integration/)' ; source read at v17.8.0: modules/github_integration/lib/open_project/github_integration/engine.rb:94-96 registers the inbound 'github' hook and :82 a GitHub tab on the work package; modules/github_integration/app/models/github_pull_request.rb; modules/gitlab_integration/app/models/gitlab_merge_request.rb and modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb:73 GitLab tab", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 'workflow triggers from development tools' ('Fisheye/Crucible, Bitbucket and GitHub', 8.9); 12.5 'Jira's Subversion integration lets you see Subversion commit information relevant to each issue'", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.9 'workflow triggers from development tools' ('Fisheye/Crucible, Bitbucket and GitHub', 8.9); 12.5 'Jira's Subversion integration lets you see Subversion commit information relevant to each issue' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/processing-issues-with-smart-commits-938845602.html 'If you use Bitbucket or GitHub ... you can process your Jira Software issues using special commands, called Smart Commits'; https://confluence.atlassian.com/adminjiraserver/configuring-workflow-triggers-938847513.html triggers from 'Fisheye/Crucible, Bitbucket and GitHub' (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §12 'The GitHub and Slack integrations are unreachable dead tables in CE'; 'Popular integrations' is a Pro string. Only 'Copy branch name' exists in the web app ; source read at v1.4.2: apps/api/plane/db/models/integration/github.py:14,54 GithubRepository and GithubIssueSync have no route: searched apps/api/plane/app/urls for 'github', 'gitlab': none; packages/i18n/src/locales/en/common.json:610 'Copy branch name' is the only forge touch" }, "built": { @@ -4351,7 +4385,7 @@ "nextcloud-deck": "source: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients on the REST API ; not in the round-4 drive ; source read at v1.19.0: README.md:24-27 'Nextcloud Deck app for Android' (F-Droid, Google Play) and 'Nextcloud Deck app for iOS' (App Store), third-party clients built on the REST API at appinfo/routes.php:102-114; not Deck's own code", "kanboard": "source: app/Template/layout.php:5 viewport meta and ChangeLog:1028 'Improve layout on mobile/tablet devices' : a responsive web UI, no mobile app in the project ; source read at v1.2.54: app/Template/layout.php:5 viewport meta; ChangeLog:1028 'Improve layout on mobile/tablet devices', ChangeLog:242 apple-mobile-web-app-capable meta tag: a responsive web UI, no mobile app in the tree", "openproject": "docs: opf/openproject HEAD 27a58131 docs/mobile-app-guide/README.md 'The OpenProject Mobile app (Beta) is available for iOS and Android. It is designed as a companion app'; beta, not in the round-4 drive The docs file is present at v17.8.0 (absent at v16.6.10); beta, so partial. ; source read at v17.8.0: docs/mobile-app-guide/README.md:2 'Mobile app guide (Beta)' and :10 a companion app for iOS and Android, a separate repository; docs/release-notes/17-0-0/README.md:279 built-in OAuth application for clients such as the mobile app; beta, so partial", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push notifications 'on iOS and Android devices' for the Jira Data Center mobile app (corpus: jira-data-center/round4/M1-column.md 6.8 'the mobile app has one')", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push notifications 'on iOS and Android devices' for the Jira Data Center mobile app (corpus: jira-data-center/round4/M1-column.md 6.8 'the mobile app has one') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/push-notifications-993923359.html push for the 'Jira Data Center mobile app'; https://confluence.atlassian.com/jirasoftware/jira-software-11-2-x-release-notes-1653834634.html 'we're removing the Jira Mobile plugin in favor of the Jira Data Center mobile app for iOS and Android' (read 2026-09-26)", "plane": "not checked: the web repo at 2f895b82 holds no mobile client (grep for play.google, apps.apple, 'mobile app' in apps/web, apps/space and en locales returns nothing) and round 4 did not test whether Plane's separate mobile apps connect to a Community self-hosted instance ; 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 README.md for 'play.google', 'apps.apple', 'testflight', 'mobile app': none; the open mobile repo makeplane/plane-mobile is archived since 2024-07-02; https://plane.so/mobile states 'At the moment Plane Mobile app doesn't support Community edition'" }, "built": { @@ -4381,7 +4415,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 3 'the file appeared as /Deck/bijlage-r4b6.txt ... in the uploader's Files' : one /Deck folder per uploader, not a shared folder per board ; source read at v1.19.0: lib/Sharing/DeckShareProvider.php:50 DECK_FOLDER '/Deck' and lib/Service/ConfigService.php:244 attachment_folder '/Deck' per user: attachments land in each uploader's own /Deck folder and are shared to the board, no folder is made per board", "kanboard": "corpus: kanboard/round4/M1-column.md 4.23 'no' ; journeys.md 4 files stored under tasks/3/ in Kanboard's own store ; source read at v1.2.54: app/Model/TaskFileModel.php:59-61 files sit in Kanboard's own object store under 'tasks'; app/Template/project_overview/attachments.php:6 project attachments in the same store; searched app/ for an outside file store link: none", "openproject": "docs: opf/openproject HEAD 27a58131 docs/user-guide/file-management/nextcloud-integration/README.md:27 'It is also possible to automatically create dedicated project folders'; corpus: openproject/round4/M1-column.md 4.23 'an automatically managed project folder (last_project_folder.rb)'; Nextcloud storage is free (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/storages/app/models/storages/project_storage.rb:46-52 project_folder_mode with 'automatic'; modules/storages/app/services/storages/nextcloud_managed_folder_create_service.rb:32-42 creates the managed project folder in Nextcloud; modules/storages/app/models/storages/last_project_folder.rb; modules/storages/config/locales/en.yml:21-22 'Project folder', 'Project folder mode'", - "jira": "corpus: jira-data-center/round4/M1-column.md 4.23 'not hosted in a platform with a file manager'; attachments sit in the home directory or S3", + "jira": "corpus: jira-data-center/round4/M1-column.md 4.23 'not hosted in a platform with a file manager'; attachments sit in the home directory or S3 ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-file-attachments-938847851.html 'Jira stores user avatars and attachments, such as files and images, in the home directory in the data sub-directory': per issue attachments, no project folder in a file store (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §4 'Folders: absent. No folder or directory model'; M1-column.md 4.23 no file manager ; source read at v1.4.2: searched apps/api/plane/db/models/__init__.py for 'folder', 'directory': none; files are per work item attachments, apps/api/plane/db/models/asset.py:36-37" }, "built": { @@ -4411,7 +4445,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 5 'pjanssen found nothing until added to the group' ; install.md 'a stranger reads the board -> HTTP 403' ; source read at v1.19.0: lib/Service/PermissionService.php:171-199 every read and write checks the board ACL and throws 'Permission denied'; lib/Db/Acl.php:31-39 read, edit, share, manage for user, group, remote, team; src/components/board/SharingTabSidebar.vue:39-52 'Can edit', 'Can share', 'Can manage'", "kanboard": "corpus: kanboard/round4/journeys.md 5 'carol, not a member, was refused on the project and on the task (403)' ; install.md refusal probe ; source read at v1.2.54: app/Middleware/ProjectAuthorizationMiddleware.php:29,34 checkProjectAccess on every task and project request, :47-50 throws AccessForbiddenException; app/Model/ProjectPermissionModel.php:121 isUserAllowed; app/Controller/ProjectListController.php:20-23 non admins see only their project ids", "openproject": "corpus: openproject/round4/M1-column.md 9.7 'search is scoped through the project permission system (app/services/authorization/user_allowed_query.rb)'; 13.1 project roles ; source read at v17.8.0: app/models/work_package.rb:87 visible scope is allowed_to view_work_packages and :231-232 visible?; app/models/work_packages/scopes/allowed_to.rb:39 permission-based scope; app/services/authorization/user_allowed_query.rb:31; config/initializers/permissions.rb:306 view_work_packages per project role", - "jira": "corpus: jira-data-center/round4/M1-column.md 9.7 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues'", + "jira": "corpus: jira-data-center/round4/M1-column.md 9.7 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html 'Browse projects Permission to browse projects, use the Issue Navigator, and view individual issues' granted per project through permission schemes (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §13 'Project visibility adds network secret (0) or public-to-workspace (2)', allow_permission resolves ProjectMember role ; source read at v1.4.2: apps/api/plane/app/views/issue/base.py:84 work item list behind allow_permission at project level; apps/api/plane/app/permissions/base.py:19 allow_permission checks a ProjectMember row with an allowed role; apps/api/plane/db/models/project.py:69-74 network Secret or Public; apps/web/core/components/project/join-project-modal.tsx for non-members" }, "built": { @@ -4444,7 +4478,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings default board on start · calendar bridge · group limit for board creation (admin)' and 'There is almost none' ; source: no lib/Settings admin page in the tag ; source read at v1.19.0: src/components/DeckAppSettings.vue:27 'Admin settings' shown to admins inside the app settings dialog, :32 'Limit board creation to some groups', :41 'Enable federation'; no platform admin settings page, appinfo/info.xml:67-72 declares only activity settings", "kanboard": "corpus: kanboard/round4/menu-tree.md Settings 'About · Application settings · Email settings · Project settings · Board settings ...' ; M1-column.md 11.24 'yes' ; source read at v1.2.54: app/Template/config/sidebar.php:4-34 About, Application, Email, Project, Board settings, Tags, Link labels, Currency rates, Integrations, Webhooks, API; app/ServiceProvider/AuthenticationProvider.php:160 ConfigController admin only", "openproject": "corpus: openproject/round4/menu-tree.md 'Administration' tree; corpus: openproject/round4/M1-column.md 11.24 'a large administration area over several hundred setting definitions' ; source read at v17.8.0: config/initializers/menus.rb:307 the Administration menu; config/routes.rb:740 admin settings namespace; config/routes.rb:885 working days and :890 iCalendar settings among the setting pages", - "jira": "corpus: jira-data-center/round4/M1-column.md 11.24 instance configuration (CORS, banner, email templates); 11.15 'Configuring Jira application options'", + "jira": "corpus: jira-data-center/round4/M1-column.md 11.24 instance configuration (CORS, banner, email templates); 11.15 'Configuring Jira application options' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-jira-application-options-938847824.html 'These options can be accessed and edited on Jira's General Configuration page ... select Administration > System' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'Instance administration, at /god-mode: General, Email, Authentication, Workspaces, Artificial intelligence, Images' plus project Settings ; source read at v1.4.2: apps/admin/app/(all)/(dashboard)/general/page.tsx, email, authentication, ai, image and workspace pages; apps/api/plane/license/models/instance.py:72 InstanceConfiguration key value store; project settings at apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/features/cycles/page.tsx" }, "built": { @@ -4473,7 +4507,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md setup is occ app:install and occ config:app:set ; the app opens on a welcome board, no guided setup ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29 and lib/Service/DefaultBoardService.php:37-46 on first run create a sample board, nothing more; searched lib/ and src/ for 'wizard', 'onboarding': none", "kanboard": "source: app/Schema/Sqlite.php:1564 seeds user admin with password admin; no setup wizard (corpus: kanboard/round4/install.md 'the first page rendered the moment the container was healthy') ; source read at v1.2.54: app/Schema/Sqlite.php:1563-1564 seeds user admin with password admin; searched app/Template and app/Controller for 'wizard', 'onboard', 'first run', 'welcome': none", "openproject": "corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database, so there is no setup wizard'; a first-login onboarding tour exists (source: opf/openproject HEAD 27a58131 (18.0.0-dev): frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts, tours/gantt_tour.ts) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/helpers/homescreen_helper.rb:52-53 onboarding modal for a first time user; app/views/layouts/base.html.erb:136-139 renders it; frontend/src/app/core/setup/globals/onboarding/onboarding_tour.ts guided tour; searched app (rb) for 'setup wizard', 'first run', 'installation wizard': none, the instance seeds itself", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira application setup wizard will only display the first time after you install' (database, administrator, email, language, licence)", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira application setup wizard will only display the first time after you install' (database, administrator, email, language, licence) ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/running-the-setup-wizard-938846872.html 'The Jira setup wizard allows you to set up your Jira application' after install (read 2026-09-26)", "plane": "corpus: plane/round4/usability.md 'The instance setup form'; install.md first run ; source: apps/web/core/components/onboarding/ profile-setup, create-workspace, invite-members steps ; source read at v1.4.2: apps/admin/components/instance/setup-form.tsx first admin setup, apps/api/plane/license/models/instance.py:38 is_setup_done; apps/web/app/(all)/onboarding/page.tsx:12,53 OnboardingRoot with profile, workspace and invite steps under apps/web/core/components/onboarding/" }, "built": { @@ -4503,7 +4537,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source: lib/Service/DefaultBoardService.php and lib/Service/fixtures/default-board.json create a sample board per user ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29-30 on a user's first visit creates 'Welcome to Nextcloud Deck!' from lib/Service/DefaultBoardService.php:66 createDefaultBoard and lib/Service/fixtures/default-board.json:5-16 sample lists and cards, translated at lib/Service/DefaultBoardService.php:78-83; one sample per user, not an admin loader", "kanboard": "no demo or sample data in core ; source: app/Schema/Sqlite.php seeds settings and the admin user only ; corpus: kanboard/round4/install.md ; source read at v1.2.54: searched app/Schema and app/Console for 'demo', 'sample data', 'fixture': none; app/Schema/Sqlite.php:1563-1564 the install seeds only the admin user", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/seeders/demo_data_seeder.rb:29-30 DemoDataSeeder with its data seeder classes; app/seeders/demo_data/global_query_seeder.rb and overview_seeder.rb seed demo projects, queries and overviews on a fresh instance", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data'", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data' (read 2026-09-26)", "plane": "source: apps/api/plane/app/views/workspace/base.py:137 workspace_seed.delay on workspace creation, seeds from apps/api/plane/seeds/data (projects, issues, cycles, modules, pages, views, labels, states); corpus: plane/round4/code-census.md §5 cites the seeded dummy data (workspace_seed_task.py:160,163). Automatic, not opt-in ; source read at v1.4.2: apps/api/plane/app/views/workspace/base.py:48,139 workspace create queues workspace_seed; apps/api/plane/bgtasks/workspace_seed_task.py:505 seeds from apps/api/plane/seeds/data/projects.json with issues, cycles, modules, pages, views, labels and states files beside it. Runs on every new workspace, not an opt-in button" }, "built": { @@ -4533,12 +4567,12 @@ "openproject": "yes", "plane": "partial", "kanboard": "yes", - "jira": "partial", + "jira": "yes", "evidence": { "nextcloud-deck": "corpus: nextcloud-deck/round4/code-census.md 'translations in l10n/ 93' (nl among them: l10n/nl.js, nl.json) ; source read at v1.19.0: l10n/nl.json holds 441 translated strings against 445 in l10n/en_GB.json; 93 languages in l10n/; strings go through t('deck', ...) in src/, e.g. src/components/DeckAppSettings.vue:7, and l10n->t in lib/, e.g. lib/Dashboard/DeckWidgetUpcoming.php:53", "kanboard": "corpus: kanboard/round4/code-census.md 'locales, app/Locale/ 38, nl_NL among them' ; source read at v1.2.54: app/Locale holds 38 locales; app/Locale/nl_NL/translations.php:372 'Board settings' => 'Bord-instellingen', 1468 translated keys and no commented out ones; app/Template/config/application.php:12 application language, app/Template/user_modification/show.php:28-29 per user language", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/crowdin/nl.yml, js-nl.yml, nl.seeders.yml; corpus: openproject/round4/M1-column.md 11.13 'translations come from Crowdin' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/locales/crowdin/nl.yml:1 Dutch server strings, with js-nl.yml and nl.seeders.yml beside it; config/locales/en.yml:3391 English source strings; the language is chosen per user in account settings", - "jira": "docs: https://confluence.atlassian.com/adminjiraserver/translating-jira-938847004.html 'Jira ships with a number of translations in the most commonly-requested languages'; Dutch is not listed there, product strings come as language packs ('update these via the Universal Plugin Manager', corpus: jira-data-center/round4/M1-column.md 11.13)", + "jira": "docs: https://confluence.atlassian.com/adminjiraserver/translating-jira-938847004.html 'Jira ships with a number of translations in the most commonly-requested languages'; Dutch is not listed there, product strings come as language packs ('update these via the Universal Plugin Manager', corpus: jira-data-center/round4/M1-column.md 11.13) ; 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 installed, you can select from the default languages: Chinese Czech Danish Dutch English (UK or US) ...'; users 'choose your preferred language in the user profile' (translating page) (read 2026-09-26)", "plane": "source: packages/i18n/src/locales has 20 locales (cs, de, en, es, fr, id, it, ja, ka-ge, ko, pl, pt-BR, ro, ru, sk, tr-TR, ua, vi-VN, zh-CN, zh-TW) and no nl; English yes, Dutch no. Corpus: plane/round4/M1-column.md 11.13 'translations are static catalogues in packages/i18n' ; source read at v1.4.2: packages/i18n/src/constants/language.ts:11-30 SUPPORTED_LANGUAGES has 19 entries with en and no nl; apps/web/core/components/settings/profile/content/pages/preferences/language-and-timezone-list.tsx:50 language switch; server strings stay English. English yes, Dutch no" }, "built": { @@ -4571,7 +4605,7 @@ "nextcloud-deck": "source: src/components/KeyboardShortcuts.vue arrow-key card focus and N, F, X, Q shortcuts, src/components/cards/CardItem.vue:263-290 per-card keys, aria-labels on controls; not audited against WCAG AA in the round-4 drive (usability.md) ; source read at v1.19.0: src/components/KeyboardShortcuts.vue:106-118 N, F, X, Q and arrow-key card navigation, listed in src/components/DeckAppSettings.vue:46-55; src/components/cards/CardItem.vue:12 tabindex and :30 aria-label; src/components/card/TagSelector.vue:15 aria labels on selects; not audited against WCAG AA, and the Gantt is a frappe-gantt SVG, src/components/board/GanttView.vue:63", "kanboard": "source: app/Template/config/keyboard_shortcuts.php shortcut list, app/Template/board/table_column.php:114 'ui-helper-hidden-accessible' screen-reader text; board cards have no keyboard move (brd-keyboard-move); not audited against WCAG AA in the round-4 drive ; source read at v1.2.54: app/Template/config/keyboard_shortcuts.php:5-31 keyboard shortcuts; app/Template/board/table_column.php:12 'ui-helper-hidden-accessible' screen reader text; app/Template/column/index.php:29 aria-label on the drag handle; cards cannot be moved by keyboard on the board, see brd-keyboard-move; no accessibility statement or audit in the tree", "openproject": "corpus: openproject/round4/usability.md 'Every page carries a Jump to content skip link, headings are structured ... form fields carry proper labels'; docs: opf/openproject HEAD 27a58131 docs/release-notes/17-2-0/README.md:85 widgets 'follow WCAG 2.1 AA guidelines for focus management' (partial scope); cards move by drag only (brd-keyboard-move) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/views/layouts/base.html.erb:71-72 skip-navigation link to content; docs/release-notes/17-2-0/README.md:85 overview widgets keyboard operable and 'follow WCAG 2.1 AA guidelines for focus management', a partial scope; brd-keyboard-move shows cards still move by drag only", - "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html Jira applications 'audited ... to make sure they're compliant with Section 508 and WCAG 2.0 AA' (an older level, vendor statement, not driven)", + "jira": "docs: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html Jira applications 'audited ... to make sure they're compliant with Section 508 and WCAG 2.0 AA' (an older level, vendor statement, not driven) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/accessibility-improvements-in-jira-993923419.html 'We've audited the Jira applications to make sure they're compliant with Section 508 and WCAG 2.0 AA. The result of this audit is the Jira Server and Data Center VPAT report': WCAG 2.0 vendor statement, not 2.1 or 2.2 AA (read 2026-09-26)", "plane": "corpus: plane/round4/usability.md 'The accessibility tree is usable but noisy. Navigating it surfaced the entire sidebar twice on every page'; no WCAG AA claim checked ; source read at v1.4.2: packages/i18n/src/locales/en/accessibility.json:2 aria_labels catalogue, used at apps/web/core/components/account/auth-forms/password.tsx:193; 45 aria-label attributes across apps/web/core/components; searched apps, packages and docs for 'wcag' conformance claims: only colour luminance helpers at packages/utils/src/color.ts:153" }, "built": { @@ -4601,7 +4635,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 11.14 'platform: theming (enabled) sets logo, colours and name for the whole instance' ; the Vue client styles with platform CSS variables (e.g. var(--color-border) in src/components/board/GanttView.vue), so a token theme on the host would reach it; NL Design System tokens themselves are not shipped, not driven ; source read at v1.19.0: Deck styles with the platform CSS variables, e.g. src/components/board/GanttView.vue:530-546 var(--color-background-hover), var(--color-primary-element), so platform theming carries through; searched lib/ and src/ for 'nldesign', 'theming': no own token support, and board and label colours are fixed hex values, lib/Service/BoardService.php:242", "kanboard": "corpus: kanboard/round4/M1-column.md 11.14 'partial: application_stylesheet takes custom CSS ... the logo and name are fixed' ; source: assets/css/light.min.css styles through CSS custom properties (179 var(--...) uses, e.g. --color-primary), so custom CSS could map tokens onto them; no NL Design System tokens shipped, not driven ; source read at v1.2.54: app/Template/config/application.php:35-36 'Custom Stylesheet'; app/Helper/AssetHelper.php:52-53 injects it on every page; assets/css/src/themes/dark.css:2-5 theme colours are CSS custom properties, 179 var() uses in assets/css/light.min.css; no NL Design System token mapping", "openproject": "corpus: openproject/round4/M1-column.md 11.14 'app/controllers/custom_styles_controller.rb:49 is the design and branding screen, Enterprise gated (define_custom_style). The free build sets a logo and nothing else'; no NL Design System tokens ; source read at v17.8.0: app/controllers/custom_styles_controller.rb:49 design and colour customisation needs the :define_custom_style token, only logo downloads (:38-39) are unguarded; searched app and frontend/src (rb, scss, ts) for 'nldesign', 'nl-design', 'design token': none", - "jira": "corpus: jira-data-center/round4/M1-column.md 11.14 'How to change your logo ... How to change Jira application colors'; colours and logo, no design-token theming or NL Design System support", + "jira": "corpus: jira-data-center/round4/M1-column.md 11.14 'How to change your logo ... How to change Jira application colors'; colours and logo, no design-token theming or NL Design System support ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/configuring-the-look-and-feel-of-your-jira-applications-938846975.html 'How to change your logo ... How to change Jira application colors': logo and colours, no design tokens or NL Design System (read 2026-09-26)", "plane": "corpus: plane/round4/M1-column.md 11.14 'WorkspaceTheme and per-user theme ... No stylesheet or component theming'; no design token import ; source read at v1.4.2: apps/api/plane/db/models/workspace.py:286 WorkspaceTheme stores colours only; searched apps and packages in *.ts, *.tsx, *.css for 'nl.?design', 'design.?tokens': only a Storybook file, packages/propel/src/toast/toast.stories.tsx" }, "built": { @@ -4631,7 +4665,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/install.md 'occ app:install deck -> deck 1.18.4 installed' on a throwaway Nextcloud ; source read at v1.19.0: appinfo/info.xml:41-45 a Nextcloud app on pgsql, sqlite or mysql, installed on the customer's own server; searched lib/ for outgoing vendor calls: only the optional Trello importer, lib/Service/Importer/Systems/TrelloApiService.php:10-22; note v1.19.0 requires Nextcloud 35 exactly, appinfo/info.xml:45", "kanboard": "corpus: kanboard/round4/install.md 'Kanboard ships one official image ... needs nothing beside it' ; source read at v1.2.54: Dockerfile line 1 FROM alpine and line 13 EXPOSE 80 443, one self-contained image with its own nginx, docker/etc/nginx/nginx.conf:75; config.default.php:67 DB_DRIVER sqlite by default; no vendor cloud service is called", "openproject": "corpus: openproject/round4/install.md 'openproject/openproject:16 from Docker Hub ... against an external PostgreSQL' ; source read at v17.8.0: docker/prod/Dockerfile (line 6) builds the production image from this tree; docs/installation-and-operations/installation/docker/README.md:119-124 'docker run ... openproject/openproject:17' on your own host; publiccode.yml:55 GPL-3.0-or-later, no vendor cloud needed", - "jira": "corpus: jira-data-center/round4/open-core.md 'On 30 March 2026 Atlassian stopped selling Data Center licences to new customers; on 28 March 2029 every Data Center product reaches end of life and turns read-only'; self-hosted for existing licence holders only", + "jira": "corpus: jira-data-center/round4/open-core.md 'On 30 March 2026 Atlassian stopped selling Data Center licences to new customers; on 28 March 2029 every Data Center product reaches end of life and turns read-only'; self-hosted for existing licence holders only ; docs read 2026-09-26: https://www.atlassian.com/migration 'Mar 30, 2026 End of license sales to new customers ... New customers will no longer be able to purchase'; 'Data Center end of life will take place on March 28, 2029': self-hosted for existing licence holders only, until then (read 2026-09-26)", "plane": "corpus: plane/round4/install.md 'makeplane/plane-aio-community:v1.4.2' run on localhost:8096 with postgres, valkey, rabbitmq, minio ; usability.md notes an offline instance works apart from Unsplash covers ; source read at v1.4.2: deployments/aio/community/Dockerfile all-in-one community image, plus deployments/kubernetes and deployments/swarm; apps/api/plane/license/models/instance.py:29 edition defaults to PLANE_COMMUNITY; apps/web/core/components/license/modal/upgrade-modal.tsx:37 isSelfHosted = true" }, "built": { @@ -4661,7 +4695,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/open-core.md 'Deck gates nothing and sells nothing. appinfo/info.xml says agpl' ; source read at v1.19.0: appinfo/info.xml:24 licence agpl; LICENSE; searched lib/ and src/ for 'subscription', 'enterprise', 'license key': no feature gate", "kanboard": "corpus: kanboard/round4/open-core.md 'Kanboard is not open core. One MIT licence covers the product' ; source read at v1.2.54: composer.json:5 license MIT, LICENSE line 1 'The MIT License (MIT)'; searched app/ (outside Locale) for 'license key', 'premium', 'enterprise' gating: none, every feature in the tree ships under the one licence", "openproject": "corpus: openproject/round4/open-core.md 'the core is GPL-3.0 ... and 32 named features are withheld behind a paid token' ; source read at v17.8.0: publiccode.yml:55 GPL-3.0-or-later core; app/models/enterprise_token.rb:56 allows_to? gates about 30 named features found in app, lib and modules, e.g. app/models/timestamp.rb:109 baseline_comparison, app/contracts/placeholder_users/create_contract.rb:34 placeholder_users, modules/resource_management/app/controllers/resource_management/base_controller.rb:43 resource_management", - "jira": "corpus: jira-data-center/round4/open-core.md 'Jira Software Data Center is closed source with one edition, priced by user tier'", + "jira": "corpus: jira-data-center/round4/open-core.md 'Jira Software Data Center is closed source with one edition, priced by user tier' ; docs read 2026-09-26: https://www.atlassian.com/licensing/data-center Data Center is sold as a subscription by user tier ('The renewal cost is the same cost as a new license purchase for the user tier'); the source is not published under an open licence (read 2026-09-26)", "plane": "corpus: plane/round4/open-core.md 'LICENSE.txt is the verbatim GNU AGPL v3' and 'this repository is the Community edition and nothing else. The paid features are not gated here. They are not here at all' (Pro, Business, Enterprise, One lists) ; source read at v1.4.2: LICENSE.txt:1-2 GNU AGPL v3; packages/constants/src/subscription.ts:7-30 enterprise, business and pro feature lists such as 'Project Templates', 'Workflows + Approvals', 'Full Time Tracking + Bulk Ops', 'Teamspaces' are absent from this tree, held back in paid builds" }, "built": { @@ -4690,7 +4724,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.9 'platform: admin_audit is shipped and disabled ... the Activity stream logs writes' ; code-census.md descriptionPrev before and after can be dropped (ActivityManager.php:414) ; source read at v1.19.0: lib/Activity/ActivityManager.php:53-94 every board, list, card and comment change is written to the platform activity table, which users cannot edit; :409-418 description before and after are dropped when the entry exceeds 4000 characters; searched lib/ for 'admin_audit', 'IAuditLogger': Deck feeds no audit log itself (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 10.9 activity stream and transitions with author and time, 13.9 'project_activities records writes only' ; no tamper protection on the table ; source read at v1.2.54: app/Controller/ActivityController.php:50 task activity and app/Controller/TaskViewController.php:133 transitions with author and time; app/Console/ProjectActivityArchiveCommand.php:14,19 'projects:archive-activities' deletes entries older than a year, app/Model/ProjectActivityModel.php:75-77 cleanup: no tamper protection or retention lock", "openproject": "corpus: openproject/round4/M1-column.md section 13 closing finding 'Setting, Role, Member, Workflow, CustomAction and EnterpriseToken changes are recorded nowhere ... What is recorded is destroys only, and it is purged after 60 days'; work package journals are thorough (10.9) ; source read at v17.8.0: app/services/journals/create_service.rb:45 journals on every work package save, but app/models/work_package.rb:398-405 comments stay editable by their author or editors; app/models/work_package.rb:182 and app/models/project.rb:176 has_paper_trail keeps destroys that app/workers/paper_trail_audits/cleanup_job.rb:33-36 purges after 60 days; settings and role changes have no trail", - "jira": "corpus: jira-data-center/round4/M1-column.md 10.5 audit log with filters and CSV export, 10.9 issue History tab; corpus: jira-data-center/round4/open-core.md audit log 'limited by the retention period and the default cap of 10 million records'; 13.9 reads not recorded", + "jira": "corpus: jira-data-center/round4/M1-column.md 10.5 audit log with filters and CSV export, 10.9 issue History tab; corpus: jira-data-center/round4/open-core.md audit log 'limited by the retention period and the default cap of 10 million records'; 13.9 reads not recorded ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/auditing-in-jira-938847740.html 'The database retention is limited by the retention period and the default cap of 10 million records': an admin-managed log that ages out, and issue views are not recorded (JRASERVER-43578, Gathering Interest) (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §13 'IssueActivity is an issue-scoped change log, not an audit log' and 'Settings changes are not logged'; 'API-enabled Audit Logs' is a paid string ; source read at v1.4.2: apps/web/core/components/issues/issue-detail/main-content.tsx:184 activity feed; apps/api/plane/db/models/issue.py:415 IssueActivity written only by apps/api/plane/bgtasks/issue_activities_task.py:1540 ACTIVITY_MAPPER, issue scoped; searched apps/api/plane --include=*.py for 'audit.?log', 'AuditLog': none; apps/api/plane/db/models/api.py:51 APIActivityLog is purged nightly" }, "built": { @@ -4720,7 +4754,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 12.7 'platform: user_ldap shipped and disabled ... SAML and OIDC as store apps (user_saml, user_oidc), not shipped with this image' ; source read at v1.19.0: searched lib/ and src/ for 'saml', 'oidc', 'ldap', 'sso': none; sign-in is the platform's, Deck runs behind its session, lib/Service/PermissionService.php:171 checks the logged-in user; SSO depends on store apps user_saml or user_oidc (platform)", "kanboard": "corpus: kanboard/round4/M1-column.md 12.7 'LDAP ... and reverse-proxy header authentication in the core; grep saml|oidc|openid returns 0' ; source read at v1.2.54: app/Auth/LdapAuth.php and app/Auth/ReverseProxyAuth.php in core, config.default.php:103 LDAP_AUTH, :206 REVERSE_PROXY_AUTH; app/Controller/OAuthController.php:13 only a hook for provider plugins; searched app/ for 'saml', 'oidc', 'openid': none, OAuth2 and SAML are third-party plugins", "openproject": "corpus: openproject/round4/M1-column.md 12.7 'both exist and both are Enterprise gated: modules/openid_connect/ and modules/auth_saml/ on the sso_auth_providers symbol'; free build has LDAP authentication ; source read at v17.8.0: modules/openid_connect/lib/open_project/openid_connect/engine.rb:50 and modules/auth_saml/lib/open_project/auth_saml/engine.rb:32 OIDC and SAML need the sso_auth_providers token; modules/auth_plugins/lib/open_project/plugins/auth_plugin.rb:94 same gate; config/routes.rb:716 LDAP authentication is free", - "jira": "corpus: jira-data-center/round4/M1-column.md 12.7 'Atlassian provides the SSO for Atlassian Data Center app ... Bundled with the Data Center licence, no extra subscription'", + "jira": "corpus: jira-data-center/round4/M1-column.md 12.7 'Atlassian provides the SSO for Atlassian Data Center app ... Bundled with the Data Center licence, no extra subscription' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/saml-sso-for-jira-data-center-applications-938847031.html 'SAML single sign-on should work with any identity provider implementing the SAML 2.0 Web Browser SSO Profile'; https://confluence.atlassian.com/jirasoftware/jira-software-11-1-x-release-notes-1627193784.html adds 'Sign SAML authentication requests' (read 2026-09-26)", "plane": "corpus: plane/round4/menu-tree.md 'Unique codes, Passwords, Google, GitHub, GitLab, Gitea' and 'No SAML, no OIDC, no LDAP'; open-core.md 'OIDC + SAML for SSO' (One) and 'LDAP support' (Enterprise). OAuth sign-in only ; source read at v1.4.2: apps/admin/app/(all)/(dashboard)/authentication/page.tsx with google, github, gitlab and gitea sub pages; apps/api/plane/authentication/provider/oauth/google.py:1 and github.py, gitlab.py, gitea.py beside it; searched apps/api/plane --include=*.py for 'saml', 'oidc', 'ldap': none" }, "built": { @@ -4750,7 +4784,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/journeys.md 6 'occ deck:export admin wrote both boards as JSON with stacks, cards, labels and ACL' ; source: src/components/navigation/BoardExportModal.vue JSON and CSV export, lib/AppInfo/Application.php:191 registerUserMigrator(DeckMigrator) ; source read at v1.19.0: src/components/navigation/BoardExportModal.vue:12-18 JSON and CSV per board; lib/Command/UserExport.php:39 occ deck:export for all of a user's boards; lib/AppInfo/Application.php:193 registers lib/UserMigration/DeckMigrator.php:71 export for the platform user migration", "kanboard": "corpus: kanboard/round4/M1-column.md 10.3 CSV exports of tasks, subtasks, transitions and summaries ; 11.2 'the database can be downloaded whole' ; source read at v1.2.54: app/Template/export/header.php:5-14 CSV exports of tasks, subtasks, transitions, daily summary; app/Template/config/about.php:72-73 'Download the database' as a gzip compressed SQLite file, app/Controller/ConfigController.php:190 downloadDb; app/Api/Procedure has read calls for every object", "openproject": "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/controllers/admin/backups_controller.rb and config/routes.rb:1082 'resource :backups' (database and attachments backup from the admin UI); corpus: openproject/round4/M1-column.md 10.3 CSV, PDF, XLS exports (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:661-662 admin 'Backups'; config/routes.rb:959 backups; app/controllers/admin/backups_controller.rb:64 request_backup of database and attachments; config/initializers/export_formats.rb:34-35 CSV and PDF, config/initializers/permissions.rb:163 export_projects", - "jira": "corpus: jira-data-center/round4/M1-column.md 11.2 'the whole-instance XML backup or a project import'; 10.3 CSV export; corpus: jira-data-center/round4/open-core.md data pipeline 'Data will be exported in CSV format'", + "jira": "corpus: jira-data-center/round4/M1-column.md 11.2 'the whole-instance XML backup or a project import'; 10.3 CSV export; corpus: jira-data-center/round4/open-core.md data pipeline 'Data will be exported in CSV format' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/data-pipeline-1027142324.html 'You can trigger a data export in your application's admin console or through the REST API. Data will be exported in CSV format'; https://confluence.atlassian.com/jirasoftwareserver/working-with-search-results-939938808.html CSV and XML export (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §13 'Data export. Per-workspace issue export to json / csv / xlsx ... There is no full-account or per-subject export'; pages export to PDF only one at a time (§4) ; source read at v1.4.2: apps/web/core/components/exporter/export-modal.tsx:91 CSV, Excel, JSON of work items; apps/api/plane/app/views/exporter/base.py:22-35 export of chosen or all member projects; apps/web/core/components/pages/modals/export-page-modal.tsx:30,49 pages one at a time as pdf or markdown. No full-account export with cycles, modules, comments and files together" }, "built": { @@ -4780,7 +4814,7 @@ "nextcloud-deck": "corpus: nextcloud-deck/round4/M1-column.md 13.3 per-board ACL and code-census.md 'remote ACL type 6' federation : an account shared on one board sees only that board, but a guest account needs the store Guests app, not shipped ; source read at v1.19.0: src/components/board/SharingTabSidebar.vue:90-94 share a single board with a user, group, team or remote account, :32 '(remote)'; lib/Federation/DeckFederationProvider.php:25-42 federated board shares; lib/Service/PermissionService.php:171-199 an account sees only boards shared with it; a guest account needs the store Guests app, searched lib/ and src/ for 'guest': only a docblock at lib/Collaboration/Resources/ResourceProvider.php:72, no guest flow", "kanboard": "corpus: kanboard/round4/journeys.md 5 'addProjectUser(bob, project-viewer): bob read the task (200) and was refused on updateTask' ; carol with no membership 403 ; journeys.md 6 public read-only board ; source read at v1.2.54: app/Template/user_list/listing.php:8 'Invite people', app/Controller/UserInviteController.php:27 save; app/Core/Security/Role.php:20,48 'Project Viewer' role; app/Template/project_permission/users.php:36-54 add that user to one project; app/Middleware/ProjectAuthorizationMiddleware.php:47-50 refuses all other projects", "openproject": "corpus: openproject/round4/M1-column.md 13.1 membership per project with a role; the free build has no user seat limit (corpus: openproject/round4/open-core.md gates are features, not seats); per-work-package sharing is Enterprise gated (3.19) ; source read at v17.8.0: config/initializers/permissions.rb:218 invite_members_by_email lets a project admin invite an outside person as a member of that one project; app/models/member.rb:40 membership is per project with a role; app/models/work_package.rb:87 visibility follows membership; per work package sharing is gated, app/models/sharing_strategies/work_package_strategy.rb:109", - "jira": "corpus: jira-data-center/round4/M1-column.md 3.19 'a partner needs an account and a licence' and is 'scoped per project by a role'; every guest takes a licensed seat", + "jira": "corpus: jira-data-center/round4/M1-column.md 3.19 'a partner needs an account and a licence' and is 'scoped per project by a role'; every guest takes a licensed seat ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/licensing-and-application-access-938846887.html 'If a user has access to an application, they will count as a licensed user'; a guest is scoped to one project by role (https://confluence.atlassian.com/adminjiraserver/managing-project-roles-938847166.html) but takes a seat (read 2026-09-26)", "plane": "corpus: plane/round4/code-census.md §5 'Guest is role 5 ... when false a guest sees only items they own or are assigned'; a guest must be a workspace member with a login and is then added per project. Whether a workspace guest sees public-to-workspace projects was not driven ; 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 with role Guest; apps/api/plane/app/views/project/base.py:101-114 a workspace guest only lists projects they are a member of; apps/api/plane/app/views/project/invite.py:131 guests cannot self-join; apps/api/plane/db/models/project.py:100 guest_view_all_features narrows items further" }, "built": { @@ -4807,17 +4841,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4003, 4004, 64441 (risk table scored on likelihood and impact, format adjustable per portfolio). Also asked for by openproject: https://community.openproject.org/wp/49051 (featureRequest).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ (php, js, vue) for 'likelihood', 'risk_register', 'riskregister': none; a board holds cards only", "openproject": "source read at v17.8.0: searched app and modules (rb) for 'risk_register', 'risk_log', 'class Risk': none; config/locales/en.yml:257 'At risk' is only a project status; open Feature request since 2023-07-10", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: searched apps/api/plane and apps/web (py, ts, tsx) for 'likelihood', 'risk_register', 'riskregister': none", + "kanboard": "source read at v1.2.54: searched app/ (php) for 'likelihood', 'risk_register', 'riskregister': none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "no", - "plane": "unknown", - "kanboard": "unknown", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4828,17 +4862,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4012 (logboeken voor acties, issues, leerpunten, bijeenkomsten), 64437.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'lesson', 'meeting', 'log' registers: none; only cards on stacks, which can stand in for actions but carry no log type", + "openproject": "source read at v17.8.0: modules/meeting/config/routes.rb:62 project meetings with agenda and outcomes; app/controllers/work_package_types/types_controller.rb:69 admins add types such as issue or action; searched config/locales/en.yml and modules/*/config/locales/en.yml for 'lessons': none, so no lessons learned log", + "plane": "source read at v1.4.2: apps/api/plane/app/urls/page.py:22 project pages hold free form logs; work items cover actions and issues; searched apps/web/core for 'lesson', 'meeting' logs: none, so no structured meeting or lessons log", + "kanboard": "source read at v1.2.54: searched app/Model and app/Controller for 'lesson', 'meeting', 'issue log': none; tasks only", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", + "plane": "partial", + "kanboard": "no", "jira": "unknown" }, { @@ -4849,17 +4883,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 3998, 3999, 4000 (financial tables per cost category and phase, totals at portfolio level).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'budget', 'cost', 'portfolio': none", + "openproject": "source read at v17.8.0: modules/overviews/app/components/overviews/workspaces/portfolio_overview_grid_component.html.erb:38 BudgetTotals on the portfolio overview; modules/budgets/app/models/budgets/aggregated_budgets_with_spend.rb:41-46 budget and spend totals; app/contracts/projects/create_contract.rb:42 portfolios need the :portfolio_management Enterprise token; no commitments or forecast", + "plane": "source read at v1.4.2: searched apps/api/plane/db/models and apps/web/core for 'budget', 'cost', 'spend': none", + "kanboard": "source read at v1.2.54: searched app/ for 'budget', 'cost', 'portfolio': none (budget is a third party plugin, not core)", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4870,17 +4904,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4001, 4023, 4127 (automated link with the financial system, project number as key).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and appinfo/routes.php for 'finance', 'cost', 'import': no cost model to import into", + "openproject": "source read at v17.8.0: modules/costs/lib/api/v3/cost_entries/cost_entries_api.rb:49 the cost entries API is read only (get); searched modules/costs and modules/budgets config/routes.rb for 'import': none; no finance system connector", + "plane": "source read at v1.4.2: searched apps/api/plane for 'budget', 'cost', 'finance': no spend model", + "kanboard": "source read at v1.2.54: searched app/Model and app/Api/Procedure for 'cost', 'budget', 'finance': none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4891,17 +4925,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4008, 4009, 64440 (weekly timesheets with non-project activities, sickness and leave).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'timesheet', 'time spent', 'worklog': no time logging", + "openproject": "source read at v17.8.0: modules/costs/app/models/time_entry.rb:50 every time entry needs a project and entity; app/models/user_non_working_time.rb:31 and config/routes.rb:1241 personal non working time records leave, but outside the timesheet; sickness or training need a stand in project", + "plane": "source read at v1.4.2: apps/api/plane/db/models/project.py:98 is_time_tracking_enabled flag only; searched apps/web for 'worklog', 'timesheet': only apps/web/core/components/common/activity/helper.tsx, no time entry screen in this edition", + "kanboard": "source read at v1.2.54: searched app/Model for 'timesheet', 'absence', 'leave': time is tracked only on subtasks inside a project", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4912,17 +4946,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4130, wish (faseafsluiting afhankelijk van het uploaden van een fasedocument).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'phase', 'gate': none", + "openproject": "source read at v17.8.0: app/models/project/phase_definition.rb:44-45 phases carry start and finish gates, but a gate is only a date, app/models/project/phase.rb:57-58; searched app/models/project and app/contracts/project_phases for 'attachment', 'document': none; phase definitions need an Enterprise token, app/controllers/admin/settings/project_phase_definitions_controller.rb:39", + "plane": "source read at v1.4.2: searched apps/api/plane/db/models for 'phase', 'gate': none", + "kanboard": "source read at v1.2.54: searched app/Model and app/Action for 'phase', 'gate': none; no action blocks a column move on an attachment", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4933,17 +4967,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4132, wish (GANTT-diagrammen van aannemers vanuit MS-project importeren).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: lib/Service/Importer/Systems/TrelloJsonService.php:28 and lib/Service/Importer/Systems/TrelloApiService.php:19 plus a Deck JSON importer are the only systems; searched lib/ and src/ for 'msproject', 'mpp', 'mspdi': none", + "openproject": "source read at v17.8.0: config/routes.rb:909-911 the admin import namespace offers Jira only; searched app, lib, modules and frontend/src for 'mpp', 'mspdi', 'ms project' importers: none", + "plane": "source read at v1.4.2: searched apps/api/plane and apps/web/core for 'mpp', 'mspdi', 'ms project': none; importers appear only on the billing comparison, apps/web/core/components/workspace/billing/comparison/plans.tsx", + "kanboard": "source read at v1.2.54: app/Controller/TaskImportController.php:40 imports tasks from CSV only, no dependencies or Gantt; searched app/ for 'mpp', 'mspdi', 'msproject': none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4954,17 +4988,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4054, 4126 (bestanden en metadata voor dossiervorming ongewijzigd overzetten naar het zaaksysteem).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ for 'zaak', 'case', 'archive export' with metadata: none; board archiving only hides the board", + "openproject": "source read at v17.8.0: searched app, lib and modules/storages for 'zaak', 'dms', 'records management', 'case system': none; file storages link Nextcloud or OneDrive folders but hand nothing over to a case system", + "plane": "source read at v1.4.2: searched apps/api/plane for 'zaak', 'records', 'case management': none", + "kanboard": "source read at v1.2.54: searched app/ and app/Api/Procedure for 'zaak', 'records', 'case management': none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4975,17 +5009,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4059 to 4063 (vernietigingslijsten, vernietiging en bewijs van vernietiging).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ for 'retention', 'destruction', 'vernietig': none", + "openproject": "source read at v17.8.0: searched app, lib and modules (rb) for 'retention', 'destruction', 'vernietig': none", + "plane": "source read at v1.4.2: searched apps/api/plane for 'retention', 'destruction': none; archive_in and close_in on apps/api/plane/db/models/project.py:110-111 auto archive, they do not destroy with proof", + "kanboard": "source read at v1.2.54: searched app/ for 'retention', 'destruction', 'vernietig': none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -4996,17 +5030,17 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/365739", "note": "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4020, 4129, 24322, 64437 (GROTIK status per project, aggregated per portfolio).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/Db/Board.php and src/ for a board status: none", + "openproject": "source read at v17.8.0: app/models/project.rb:218-221 one status per project, on track, at risk, off track; app/models/project_queries/static.rb:119 project list filtered by status; the six GROTIK aspects only through project attributes; no per aspect roll up to a portfolio", + "plane": "source read at v1.4.2: searched apps/api/plane/db/models/project.py for a status or health field: none; project states are not in this edition", + "kanboard": "source read at v1.2.54: searched app/Model/ProjectModel.php and app/Template/project_overview for a status or health field: none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -5018,16 +5052,16 @@ "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: lib/DAV/CalendarObject.php:58-59 put throws Forbidden 'This calendar-object is read-only'; lib/Db/Card.php:152 FIXME for write support; the request has 70 reactions", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: modules/calendar/config/routes.rb:17 calendar/ical#show is a read only iCal feed; searched app and modules for 'caldav': none", + "plane": "source read at v1.4.2: searched apps/api/plane for 'caldav', 'icalendar', '.ics': none", + "kanboard": "source read at v1.2.54: app/Controller/ICalendarController.php:22 and :62 serve read only iCal feeds; searched app/ for 'caldav': none", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", "nextcloud-deck": "no", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "unknown" }, { @@ -5039,16 +5073,16 @@ "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: src/components/navigation/AppNavigation.vue:19 fixed entries All, Archived and Shared boards; lib/Db/Board.php:35-54 no folder or category field; the request has 31 reactions", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: config/locales/en.yml:3696 'Add subproject'; app/models/projects/hierarchy.rb:104 nested set; frontend/src/app/shared/components/searchable-project-list/project-data.ts:38 children render as a tree in the project picker", + "plane": "source read at v1.4.2: apps/web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx:60 favourite folders; apps/api/plane/db/models/favorite.py:23-25 is_folder and parent; apps/web/core/components/workspace/sidebar/projects-list-item.tsx:383 add a project to favourites; folders are per user, the project list itself stays flat", + "kanboard": "source read at v1.2.54: searched app/Model/ProjectModel.php and app/Template/project_list for 'group', 'folder', 'category': none; app/Model/CategoryModel.php is for tasks inside one project", "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" }, "planninq": "unknown", "nextcloud-deck": "no", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "openproject": "yes", + "plane": "partial", + "kanboard": "no", "jira": "unknown" }, { @@ -5372,20 +5406,20 @@ "name": "Be warned or stopped when a colleague is editing the same task at the same time.", "origin": "featureRequest", "originUrl": "https://github.com/orgs/kanboard/discussions/5691", - "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26.", + "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26. Also asked for by jira: https://jira.atlassian.com/browse/JRASERVER-6146 (featureRequest).", "evidence": { "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "source read at v1.2.54: searched app/Model/TaskModificationModel.php and app/Controller for 'lock', 'locked_by', 'editing': none; the last save wins", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "JRASERVER-6146 'Implement issue locking', Suggestion, Gathering Interest, 505 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", "openproject": "unknown", "plane": "unknown", "kanboard": "no", - "jira": "unknown" + "jira": "no" }, { "id": "int-automation-edit", @@ -5659,6 +5693,195 @@ "plane": "yes", "kanboard": "unknown", "jira": "unknown" + }, + { + "id": "tsk-estimate-rollup", + "area": "time", + "name": "See the estimates of all subtasks added up on the parent task.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JSWSERVER-9167", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JSWSERVER-9167 'Provide ability to automatically sum estimates from sub-tasks in user stories', Future Consideration, 1993 votes; https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'Choosing to include sub-tasks displays the aggregated time': hours roll up, story points do not (read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "partial" + }, + { + "id": "col-threaded-comments", + "area": "collaboration", + "name": "Reply to a specific comment so a discussion stays threaded.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JRASERVER-3406", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JRASERVER-3406 'Threaded Comments', Suggestion, Future Consideration, 1017 votes (tracker REST API, read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "no" + }, + { + "id": "tsk-clone-tree", + "area": "tasks", + "name": "Copy a task together with its subtasks and the child tasks under it.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JSWSERVER-7721", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JSWSERVER-7721 'When cloning an Epic, add the option to clone the linked Stories as well', Future Consideration, 1295 votes; https://confluence.atlassian.com/jirasoftwareserver/creating-issues-and-sub-tasks-939938925.html 'Clone sub-tasks to copy existing sub-tasks' (read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "partial" + }, + { + "id": "col-group-mention", + "area": "collaboration", + "name": "Mention a whole team or group in a comment so every member is notified.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JRASERVER-28225", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JRASERVER-28225 'Mentions of groups', Suggestion, Future Consideration, 910 votes (tracker REST API, read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "no" + }, + { + "id": "tim-work-type", + "area": "time", + "name": "Record what kind of work logged time was, such as a meeting or development.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JRASERVER-1780", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JRASERVER-1780 'Add type of work in Log work', Suggestion, Not Being Considered, 773 votes (tracker REST API, read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "no" + }, + { + "id": "tsk-merge", + "area": "tasks", + "name": "Merge two duplicate tasks into one, keeping comments and history.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JRASERVER-3592", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JRASERVER-3592 'Merging of issues', Suggestion, Future Consideration, 533 votes (tracker REST API, read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "no" + }, + { + "id": "tsk-duplicate-warning", + "area": "tasks", + "name": "Be warned about similar existing tasks while creating a new one.", + "origin": "featureRequest", + "originUrl": "https://jira.atlassian.com/browse/JRASERVER-1633", + "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "JRASERVER-1633 'find similar feature to prevent creating duplicate issue', Suggestion, Gathering Interest, 175 votes (tracker REST API, read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "no" + }, + { + "id": "int-automation-guard", + "area": "integration", + "name": "Restrict who may build automations that use powerful actions.", + "origin": "changelog", + "originUrl": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html", + "note": "Demand row mined from jira (changelog) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "11.3 release notes 'Starting from Jira 11.3.3, you can use automation restrictions to decide who can create, edit, enable, or disable automation rules that use specific components'; 11.3.3 released 5 March 2026 (read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "yes" + }, + { + "id": "plt-security-insights", + "area": "platform", + "name": "See an admin overview of security risks in the installation with suggested fixes.", + "origin": "roadmap", + "originUrl": "https://www.atlassian.com/roadmap/data-center", + "note": "Demand row mined from jira (roadmap) on 2026-09-26.", + "evidence": { + "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "jira": "roadmap 'Security insights Get centralised, instance-level security insights for your Confluence and Jira Data Center in Admin Hub ... Released Q3 2026': it runs through the cloud Admin Hub, so a buyer without a cloud connection does not get it (read 2026-09-26)" + }, + "planninq": "unknown", + "nextcloud-deck": "unknown", + "openproject": "unknown", + "plane": "unknown", + "kanboard": "unknown", + "jira": "partial" } ], "pending": [ From e09551d1187d2ea5ea052602b2b193c8d1c75129 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:44:17 +0200 Subject: [PATCH 10/13] fix(parity): cite the tracker URL on the Jira demand-row cells --- openspec/parity/capabilities.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 96ed9c08..c12ce753 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -5412,7 +5412,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "source read at v1.2.54: searched app/Model/TaskModificationModel.php and app/Controller for 'lock', 'locked_by', 'editing': none; the last save wins", - "jira": "JRASERVER-6146 'Implement issue locking', Suggestion, Gathering Interest, 505 votes (tracker REST API, read 2026-09-26)" + "jira": "https://jira.atlassian.com/browse/JRASERVER-6146 JRASERVER-6146 'Implement issue locking', Suggestion, Gathering Interest, 505 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5727,7 +5727,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "JRASERVER-3406 'Threaded Comments', Suggestion, Future Consideration, 1017 votes (tracker REST API, read 2026-09-26)" + "jira": "https://jira.atlassian.com/browse/JRASERVER-3406 JRASERVER-3406 'Threaded Comments', Suggestion, Future Consideration, 1017 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5769,7 +5769,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "JRASERVER-28225 'Mentions of groups', Suggestion, Future Consideration, 910 votes (tracker REST API, read 2026-09-26)" + "jira": "https://jira.atlassian.com/browse/JRASERVER-28225 JRASERVER-28225 'Mentions of groups', Suggestion, Future Consideration, 910 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5790,7 +5790,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "JRASERVER-1780 'Add type of work in Log work', Suggestion, Not Being Considered, 773 votes (tracker REST API, read 2026-09-26)" + "jira": "https://jira.atlassian.com/browse/JRASERVER-1780 JRASERVER-1780 'Add type of work in Log work', Suggestion, Not Being Considered, 773 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5811,7 +5811,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "JRASERVER-3592 'Merging of issues', Suggestion, Future Consideration, 533 votes (tracker REST API, read 2026-09-26)" + "jira": "https://jira.atlassian.com/browse/JRASERVER-3592 JRASERVER-3592 'Merging of issues', Suggestion, Future Consideration, 533 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5832,7 +5832,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "JRASERVER-1633 'find similar feature to prevent creating duplicate issue', Suggestion, Gathering Interest, 175 votes (tracker REST API, read 2026-09-26)" + "jira": "https://jira.atlassian.com/browse/JRASERVER-1633 JRASERVER-1633 'find similar feature to prevent creating duplicate issue', Suggestion, Gathering Interest, 175 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5853,7 +5853,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "11.3 release notes 'Starting from Jira 11.3.3, you can use automation restrictions to decide who can create, edit, enable, or disable automation rules that use specific components'; 11.3.3 released 5 March 2026 (read 2026-09-26)" + "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 11.3 release notes 'Starting from Jira 11.3.3, you can use automation restrictions to decide who can create, edit, enable, or disable automation rules that use specific components'; 11.3.3 released 5 March 2026 (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", @@ -5874,7 +5874,7 @@ "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "roadmap 'Security insights Get centralised, instance-level security insights for your Confluence and Jira Data Center in Admin Hub ... Released Q3 2026': it runs through the cloud Admin Hub, so a buyer without a cloud connection does not get it (read 2026-09-26)" + "jira": "https://www.atlassian.com/roadmap/data-center roadmap 'Security insights Get centralised, instance-level security insights for your Confluence and Jira Data Center in Admin Hub ... Released Q3 2026': it runs through the cloud Admin Hub, so a buyer without a cloud connection does not get it (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "unknown", From eb04087bf175a4f3483667543b310bcd4703afdd Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:52:35 +0200 Subject: [PATCH 11/13] feat(parity): rate the 41 demand rows for Deck, OpenProject, Plane and Kanboard from source --- openspec/parity/capabilities.json | 492 +++++++++++++++--------------- 1 file changed, 246 insertions(+), 246 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index c12ce753..c58043eb 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -4845,14 +4845,14 @@ "openproject": "source read at v17.8.0: searched app and modules (rb) for 'risk_register', 'risk_log', 'class Risk': none; config/locales/en.yml:257 'At risk' is only a project status; open Feature request since 2023-07-10", "plane": "source read at v1.4.2: searched apps/api/plane and apps/web (py, ts, tsx) for 'likelihood', 'risk_register', 'riskregister': none", "kanboard": "source read at v1.2.54: searched app/ (php) for 'likelihood', 'risk_register', 'riskregister': none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://marketplace.atlassian.com/apps/1213146/risk-register paid app 'Risk Register', build 8.1.1 compatible to Jira 11.3.11: 'record risks, assess their magnitude ... collaborate with others on their treatment'; Jira itself has no risk object (Marketplace REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "prj-project-logs", @@ -4866,14 +4866,14 @@ "openproject": "source read at v17.8.0: modules/meeting/config/routes.rb:62 project meetings with agenda and outcomes; app/controllers/work_package_types/types_controller.rb:69 admins add types such as issue or action; searched config/locales/en.yml and modules/*/config/locales/en.yml for 'lessons': none, so no lessons learned log", "plane": "source read at v1.4.2: apps/api/plane/app/urls/page.py:22 project pages hold free form logs; work items cover actions and issues; searched apps/web/core for 'lesson', 'meeting' logs: none, so no structured meeting or lessons log", "kanboard": "source read at v1.2.54: searched app/Model and app/Controller for 'lesson', 'meeting', 'issue log': none; tasks only", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Jira enables you to keep track of different types of things ... by using different issue types': an admin can add action, issue, lesson or meeting log issue types per project; there is no built-in project log (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "partial", "plane": "partial", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "prt-portfolio-finance", @@ -4887,14 +4887,14 @@ "openproject": "source read at v17.8.0: modules/overviews/app/components/overviews/workspaces/portfolio_overview_grid_component.html.erb:38 BudgetTotals on the portfolio overview; modules/budgets/app/models/budgets/aggregated_budgets_with_spend.rb:41-46 budget and spend totals; app/contracts/projects/create_contract.rb:42 portfolios need the :portfolio_management Enterprise token; no commitments or forecast", "plane": "source read at v1.4.2: searched apps/api/plane/db/models and apps/web/core for 'budget', 'cost', 'spend': none", "kanboard": "source read at v1.2.54: searched app/ for 'budget', 'cost', 'portfolio': none (budget is a third party plugin, not core)", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://marketplace.atlassian.com/apps/1211259/budgets-jira-project-budget-management-tempo paid app Tempo Budgets, build 19.6.2-jira-11 compatible to Jira 11.3.11: 'Budget and track projects, and portfolios ... Forecast costs, revenues, and profitability'; Jira has no budget object (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "int-finance-import", @@ -4908,14 +4908,14 @@ "openproject": "source read at v17.8.0: modules/costs/lib/api/v3/cost_entries/cost_entries_api.rb:49 the cost entries API is read only (get); searched modules/costs and modules/budgets config/routes.rb for 'import': none; no finance system connector", "plane": "source read at v1.4.2: searched apps/api/plane for 'budget', 'cost', 'finance': no spend model", "kanboard": "source read at v1.2.54: searched app/Model and app/Api/Procedure for 'cost', 'budget', 'finance': none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html lists no finance system integration, and projects carry no budget or spend fields (https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html) to import into (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "no" }, { "id": "tim-non-project", @@ -4929,14 +4929,14 @@ "openproject": "source read at v17.8.0: modules/costs/app/models/time_entry.rb:50 every time entry needs a project and entity; app/models/user_non_working_time.rb:31 and config/routes.rb:1241 personal non working time records leave, but outside the timesheet; sickness or training need a stand in project", "plane": "source read at v1.4.2: apps/api/plane/db/models/project.py:98 is_time_tracking_enabled flag only; searched apps/web for 'worklog', 'timesheet': only apps/web/core/components/common/activity/helper.tsx, no time entry screen in this edition", "kanboard": "source read at v1.2.54: searched app/Model for 'timesheet', 'absence', 'leave': time is tracked only on subtasks inside a project", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html work is logged against an issue only ('Make sure you have the Work on Issues ... project permissions'), so leave or training needs an internal project with placeholder issues; no separate non-project category (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "pln-phase-gate-document", @@ -4950,14 +4950,14 @@ "openproject": "source read at v17.8.0: app/models/project/phase_definition.rb:44-45 phases carry start and finish gates, but a gate is only a date, app/models/project/phase.rb:57-58; searched app/models/project and app/contracts/project_phases for 'attachment', 'document': none; phase definitions need an Enterprise token, app/controllers/admin/settings/project_phase_definitions_controller.rb:39", "plane": "source read at v1.4.2: searched apps/api/plane/db/models for 'phase', 'gate': none", "kanboard": "source read at v1.2.54: searched app/Model and app/Action for 'phase', 'gate': none; no action blocks a column move on an attachment", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/using-validators-with-custom-fields-938847524.html 'Use the Fields Required workflow validator that is packaged in the Jira Suite Utilities'; https://marketplace.atlassian.com/apps/5048/jsu-automation-suite-for-jira-workflows paid app, build 4.1.3 compatible to Jira 11.3.11; phases are workflow statuses, not project phases (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "int-import-msproject", @@ -4971,14 +4971,14 @@ "openproject": "source read at v17.8.0: config/routes.rb:909-911 the admin import namespace offers Jira only; searched app, lib, modules and frontend/src for 'mpp', 'mspdi', 'ms project' importers: none", "plane": "source read at v1.4.2: searched apps/api/plane and apps/web/core for 'mpp', 'mspdi', 'ms project': none; importers appear only on the billing comparison, apps/web/core/components/workspace/billing/comparison/plans.tsx", "kanboard": "source read at v1.2.54: app/Controller/TaskImportController.php:40 imports tasks from CSV only, no dependencies or Gantt; searched app/ for 'mpp', 'mspdi', 'msproject': none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://marketplace.atlassian.com/apps/1211768/wbs-gantt-chart-for-jira-enterprise-project-management paid app WBS Gantt-Chart for Jira, build 9.20.0.1067 compatible to Jira 11.3.11, lists 'Microsoft Project import/export'; https://confluence.atlassian.com/adminjiraserver/migrating-from-other-issue-trackers-938847532.html core import is CSV or JSON only (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "int-archive-to-case", @@ -4992,14 +4992,14 @@ "openproject": "source read at v17.8.0: searched app, lib and modules/storages for 'zaak', 'dms', 'records management', 'case system': none; file storages link Nextcloud or OneDrive folders but hand nothing over to a case system", "plane": "source read at v1.4.2: searched apps/api/plane for 'zaak', 'records', 'case management': none", "kanboard": "source read at v1.2.54: searched app/ and app/Api/Procedure for 'zaak', 'records', 'case management': none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html names no records or case management integration; https://confluence.atlassian.com/adminjiraserver/archiving-a-project-938847621.html archiving keeps data inside Jira, 'All the project data remains in the database' (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "no" }, { "id": "plt-destruction-list", @@ -5013,14 +5013,14 @@ "openproject": "source read at v17.8.0: searched app, lib and modules (rb) for 'retention', 'destruction', 'vernietig': none", "plane": "source read at v1.4.2: searched apps/api/plane for 'retention', 'destruction': none; archive_in and close_in on apps/api/plane/db/models/project.py:110-111 auto archive, they do not destroy with proof", "kanboard": "source read at v1.2.54: searched app/ for 'retention', 'destruction', 'vernietig': none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://jira.atlassian.com/browse/JRASERVER-78250 'Retention rules for Jira', Suggestion, Gathering Interest; JRASERVER-70162 'Ability to auto-delete Archived issues', Gathering Interest, 17 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "no" }, { "id": "prt-status-grotik", @@ -5034,14 +5034,14 @@ "openproject": "source read at v17.8.0: app/models/project.rb:218-221 one status per project, on track, at risk, off track; app/models/project_queries/static.rb:119 project list filtered by status; the six GROTIK aspects only through project attributes; no per aspect roll up to a portfolio", "plane": "source read at v1.4.2: searched apps/api/plane/db/models/project.py for a status or health field: none; project states are not in this edition", "kanboard": "source read at v1.2.54: searched app/Model/ProjectModel.php and app/Template/project_overview for a status or health field: none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://marketplace.atlassian.com/apps/1228554/pmo-assessment-and-reports-for-jira paid app, build 1.2 compatible to Jira 11.3.11: 'insights into project time, costs, quality and inefficiencies'; it covers time, money and quality, not organisation, information and risk, and Jira has no project status report (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "partial" }, { "id": "pln-calendar-writeback", @@ -5055,14 +5055,14 @@ "openproject": "source read at v17.8.0: modules/calendar/config/routes.rb:17 calendar/ical#show is a read only iCal feed; searched app and modules for 'caldav': none", "plane": "source read at v1.4.2: searched apps/api/plane for 'caldav', 'icalendar', '.ics': none", "kanboard": "source read at v1.2.54: app/Controller/ICalendarController.php:22 and :62 serve read only iCal feeds; searched app/ for 'caldav': none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://jira.atlassian.com/browse/JRASERVER-2971 'iCalendar support', Gathering Interest, 22 votes: no feed in the product; https://marketplace.atlassian.com/apps/1214714/calendar-sync-for-jira (build 3.0.0, Jira 11.3.11) publishes calendar 'feeds' configured by JQL, a one-way export with no write-back documented (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "unknown" + "jira": "no" }, { "id": "prj-grouping", @@ -5076,14 +5076,14 @@ "openproject": "source read at v17.8.0: config/locales/en.yml:3696 'Add subproject'; app/models/projects/hierarchy.rb:104 nested set; frontend/src/app/shared/components/searchable-project-list/project-data.ts:38 children render as a tree in the project picker", "plane": "source read at v1.4.2: apps/web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx:60 favourite folders; apps/api/plane/db/models/favorite.py:23-25 is_folder and parent; apps/web/core/components/workspace/sidebar/projects-list-item.tsx:383 add a project to favourites; folders are per user, the project list itself stays flat", "kanboard": "source read at v1.2.54: searched app/Model/ProjectModel.php and app/Template/project_list for 'group', 'folder', 'category': none; app/Model/CategoryModel.php is for tasks inside one project", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html project categories are created 'via Administration > Projects > Project Categories', and Jira 'can display projects sorted by the project category' (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", "openproject": "yes", "plane": "partial", "kanboard": "no", - "jira": "unknown" + "jira": "yes" }, { "id": "col-comment-images", @@ -5094,17 +5094,17 @@ "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5545 (featureRequest).", "evidence": { "nextcloud-deck": "source read at v1.19.0: src/components/card/CommentForm.vue:8-12 a plain rich text field with mentions, :91 1000 character limit; searched src/components/card for 'paste': none; the request has 34 reactions", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "openproject": "source read at v17.8.0: frontend/src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component.ts:243 the CKEditor field uploads pasted or dropped images as attachments of the resource, used for descriptions and comments; lib/api/v3/attachments/attachments_by_work_package_api.rb:56 stores them", + "plane": "source read at v1.4.2: packages/editor/src/core/plugins/drop.ts:26 handlePaste and :54 handleDrop insert images; apps/web/core/components/comments/card/edit-form.tsx:98 uploadFile in the comment editor; apps/api/plane/app/urls/asset.py:28 file-assets endpoint", "kanboard": "source read at v1.2.54: assets/js/components/screenshot.js:9-10 pasting from the clipboard works but app/Controller/TaskFileController.php:18 screenshot stores it as an attachment; the description editor, app/Helper/FormHelper.php:228, takes Markdown image links only", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/jirasoftwareserver/attaching-files-and-screenshots-to-issues-939938913.html 'copy a file from your computer and paste it directly in the Create Issue dialog. Make sure that you paste the image outside the Description box': a pasted image becomes an attachment; https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html warns 'Pasting content may not work as expected' (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", - "openproject": "unknown", - "plane": "unknown", + "openproject": "yes", + "plane": "yes", "kanboard": "partial", - "jira": "unknown" + "jira": "partial" }, { "id": "tsk-templates", @@ -5115,17 +5115,17 @@ "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: src/CardMoveDialog.vue:28-29 'Copy card' duplicates an existing card to any list, appinfo/routes.php:176 card#clone; searched lib/ and src/ for 'template' on cards: none, so no card can be kept as a template; the request has 19 reactions", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "openproject": "source read at v17.8.0: config/routes.rb:190 and app/controllers/work_package_types/defaults_tab_controller.rb:41-46 a default description per work package type fills new work packages; no checklist or label set in it; copy of a work package is the other route", + "plane": "source read at v1.4.2: apps/web/core/components/issues/issue-modal/provider.tsx:37-52 workItemTemplateId and handleTemplateChange are no op stubs in this edition; searched apps/api/plane/app/urls for a template route: none", + "kanboard": "source read at v1.2.54: app/Template/project_predefined_content/show.php:5 'Add predefined task description'; app/Helper/TaskHelper.php:68 offers them in the task form; app/Model/PredefinedTaskDescriptionModel.php stores them; description only, no subtasks or tags", + "jira": "https://jira.atlassian.com/browse/JRASERVER-7731 'Template issue', Suggestion, Future Consideration, 440 votes; https://marketplace.atlassian.com/apps/1211044/issue-templates-for-jira paid app Issue Templates for Jira, build 8.7.7 compatible to Jira 11.3.11 (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "partial", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "openproject": "partial", + "plane": "no", + "kanboard": "partial", + "jira": "partial" }, { "id": "brd-move-column", @@ -5136,17 +5136,17 @@ "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: appinfo/routes.php:37-43 stack routes are per board with no move or copy; searched lib/Service/StackService.php for 'move', 'copy', 'transfer': none; the request has 18 reactions", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "openproject": "source read at v17.8.0: frontend/src/app/features/boards/board/board-list/board-list.component.html:30-33 the list menu offers rename and remove; searched frontend/src/app/features/boards for 'move to project', 'copy list': none", + "plane": "source read at v1.4.2: searched apps/api/plane/app/views/state and apps/web/core/components/project-states for 'move', 'copy', 'transfer' of a state with its work items: none; states belong to one project", + "kanboard": "source read at v1.2.54: app/Template/board/table_column.php:31-41 the column menu offers hide, bulk create and close all; app/Controller/TaskBulkMoveColumnController.php:21 moves within the same project; a task moves to another project one at a time", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/editing-multiple-issues-at-the-same-time-939938937.html bulk change moves the tasks ('the Move issue and Bulk change permissions to perform the Bulk move operation'); a column is a status mapping on one board (https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html), so the column itself is not moved or copied (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "openproject": "no", + "plane": "no", + "kanboard": "no", + "jira": "partial" }, { "id": "tsk-all-day-due", @@ -5157,17 +5157,17 @@ "note": "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: src/components/card/DueDateSelector.vue:10-15 the picker is datetime-local; searched src/ and lib/ for 'allDay', 'all day': none; the request has 17 reactions", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "openproject": "source read at v17.8.0: db/migrate/tables/work_packages.rb:40 due_date is a date column; frontend/src/app/shared/components/datepicker/wp-date-picker-modal/wp-date-picker.modal.ts:98 the picker sets a date, no time", + "plane": "source read at v1.4.2: apps/api/plane/db/models/issue.py:148 target_date is a DateField; apps/web/core/components/issues/issue-detail/sidebar.tsx:164-167 the due date picker sends a date only", + "kanboard": "source read at v1.2.54: app/Core/DateParser.php:160-161 a date without time is accepted, but app/Helper/TaskHelper.php:235 renders a datetime field and app/Helper/DateHelper.php:57 always shows a time, midnight for a date only value", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-fields-reference-939938743.html 'Note that the due date relates to the date only (not to the time)' (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "no", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "openproject": "yes", + "plane": "yes", + "kanboard": "partial", + "jira": "yes" }, { "id": "brd-column-count", @@ -5178,17 +5178,17 @@ "note": "Demand row mined from nextcloud-deck (changelog) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: src/components/board/Stack.vue:18 and :31 card count next to the list title, :491 stack__card-count; CHANGELOG.md:11 1.19.0 'show card count next to the list title'", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "openproject": "source read at v17.8.0: frontend/src/app/features/boards/board/board-list/board-list.component.html:14-33 a board list header carries no count; the grouped work package table does, frontend/src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/group-header-builder.ts:84-85", + "plane": "source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx:134 count in the column header; apps/api/plane/utils/paginator.py:321 total_results per group", + "kanboard": "source read at v1.2.54: app/Template/board/table_column.php:11-12 'Task count' in the column header; app/Formatter/BoardColumnFormatter.php:103 nb_tasks", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'In the Column Constraint drop-down, select either Issue Count or Issue Count, excluding sub-tasks. Note, enabling column constraints will show the issue count in each column' (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "yes", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "openproject": "partial", + "plane": "yes", + "kanboard": "yes", + "jira": "yes" }, { "id": "prj-team-owner", @@ -5199,17 +5199,17 @@ "note": "Demand row mined from nextcloud-deck (changelog) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: appinfo/routes.php:144 board_ocs#createForTeam, lib/Controller/BoardOcsController.php:56; lib/Service/TeamBoardService.php:24-30 hands the board to the next team member when one leaves; searched src/ for 'createForTeam', 'teamId': no Deck screen, so it is created through the API or the Teams app", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "openproject": "source read at v17.8.0: config/locales/en.yml:1915 'Add member' accepts groups, :3344 'Groups'; app/models/member.rb:40 a member is any principal, user or group; a project belongs to no person, so it stays when one leaves", + "plane": "source read at v1.4.2: apps/api/plane/db/models/project.py:75 a project belongs to the workspace, so it stays when a member leaves; searched apps/api/plane/db/models for a team entity: no teamspace in this edition", + "kanboard": "source read at v1.2.54: app/Template/project_permission/index.php:13 group permissions; app/Controller/ProjectPermissionController.php:154 addGroup; app/Model/UserModel.php:423-432 removing a user deletes only private projects, team projects stay", + "jira": "https://confluence.atlassian.com/adminjiraserver/managing-project-roles-938847166.html roles take groups, so rights stay with a team; but 'Every project has a project lead', one user, and https://confluence.atlassian.com/adminjiraserver/anonymizing-users-992677655.html 'Some items owned by a user, like Project Lead ... You'll need to select a new owner' (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "partial", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "openproject": "yes", + "plane": "partial", + "kanboard": "yes", + "jira": "partial" }, { "id": "col-federated-share", @@ -5220,17 +5220,17 @@ "note": "Demand row mined from nextcloud-deck (changelog) on 2026-09-26.", "evidence": { "nextcloud-deck": "source read at v1.19.0: src/components/board/SharingTabSidebar.vue:94 remotes share type, :32 '(remote)'; lib/Federation/DeckFederationProvider.php:25-42 receives federated board shares; src/components/DeckAppSettings.vue:41 admin 'Enable federation'; CHANGELOG.md:14 1.19.0 signed OCM", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "openproject": "source read at v17.8.0: searched app, lib and modules for 'federat', 'remote share', 'ocm': none; sharing is to users of the same instance", + "plane": "source read at v1.4.2: searched apps/api/plane for 'federat', 'remote', 'ocm' sharing: none", + "kanboard": "source read at v1.2.54: searched app/ for 'federat', 'remote share': none", + "jira": "https://confluence.atlassian.com/adminjiraserver/licensing-and-application-access-938846887.html access needs a user in this instance ('If a user has access to an application, they will count as a licensed user') or anonymous access; https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html other Jira servers are reached only as remote issue links over an application link (read 2026-09-26)" }, "planninq": "unknown", "nextcloud-deck": "yes", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "openproject": "no", + "plane": "no", + "kanboard": "no", + "jira": "no" }, { "id": "int-ai-connector", @@ -5240,18 +5240,18 @@ "originUrl": "https://www.openproject.org/docs/release-notes/17-8-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/, src/ and appinfo/ for 'mcp', 'model context protocol', 'TaskProcessing', 'ContextChat': none; the OCS and REST API in appinfo/routes.php is the only machine interface", "openproject": "source read at v17.8.0: config/routes.rb:48 mounts API::Mcp at /mcp; lib/api/mcp.rb:47 refuses without the :mcp_server Enterprise token; config/initializers/menus.rb:507 admin MCP configuration; 17.2 read, 17.8 create and update", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: searched apps/api, apps/web and apps/live for 'mcp', 'model context protocol': none; the token API under apps/api/plane/api is the only machine interface in this tree", + "kanboard": "source read at v1.2.54: searched app/ for 'mcp', 'model context protocol': none; app/Api/Procedure JSON-RPC is the only machine interface", + "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 'cloud connectors ... Now, you can set up and manage Rovo and Portfolio Insights connectors in one place': Atlassian's AI assistant Rovo reaches Data Center data through the cloud Admin Hub; no self-hosted standard connector and no write path documented (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "partial", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "no", + "kanboard": "no", + "jira": "partial" }, { "id": "col-live-docs", @@ -5261,18 +5261,18 @@ "originUrl": "https://www.openproject.org/docs/release-notes/17-0-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/components/card/Description.vue:208 the Text editor is embedded for one user at a time; appinfo/routes.php:183-185 sessions track board viewers, not shared editing; searched src/ for 'collaborat', 'yjs': none", "openproject": "source read at v17.8.0: modules/documents/app/views/documents/show.html.erb:34-35 collaborative documents when real-time collaboration is on, served by the Hocuspocus service in docker/hocuspocus; searched modules/documents for an Enterprise gate: none", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: apps/web/core/components/pages/editor/editor-body.tsx:275 CollaborativeDocumentEditorWithRef; apps/live/src/server.ts:30 Hocuspocus sync; packages/editor/src/core/hooks/use-collaborative-editor.ts:80 Collaboration; but apps/web/core/hooks/use-editor-flagging.ts:37 disables 'collaboration-cursor', so no cursors of others", + "kanboard": "source read at v1.2.54: searched app/ and assets/js for 'collaborat', 'websocket', 'yjs': none", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Confluence is a content creation and collaboration platform': shared documents are a separate product and licence; Jira has issue fields, not live documents (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "yes", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "partial", + "kanboard": "no", + "jira": "no" }, { "id": "col-meeting-actions", @@ -5282,18 +5282,18 @@ "originUrl": "https://www.openproject.org/docs/release-notes/17-6-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'meeting', 'agenda': none", "openproject": "source read at v17.8.0: modules/meeting/config/routes.rb:109-110 convert_to_work_package on an agenda item; modules/meeting/app/services/meeting_agenda_items/convert_to_work_package_service.rb:64-67 creates the work package; modules/meeting/app/components/meeting_agenda_items/item_component/show_component.rb:136 menu action", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: searched apps/api/plane and apps/web/core for 'meeting', 'agenda': none", + "kanboard": "source read at v1.2.54: searched app/ for 'meeting', 'agenda': none", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html meeting notes and pages live in Confluence, which can turn text into issues ('Specs to issues'); Jira Software has no meeting or agenda object in the docs read (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "yes", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "no", + "kanboard": "no", + "jira": "no" }, { "id": "tsk-readable-key", @@ -5303,18 +5303,18 @@ "originUrl": "https://www.openproject.org/docs/release-notes/17-5-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5544 (featureRequest).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/Db/Card.php and lib/Db/Board.php for 'identifier', 'prefix', 'sequence': none; cards carry a global numeric id", "openproject": "source read at v17.8.0: app/models/work_package/semantic_identifier.rb:37-42 'PROJ-42' identifiers accepted in routes; config/constants/settings/definition.rb:1411-1418 admin setting work_packages_identifier, classic by default, semantic on request", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "plane": "source read at v1.4.2: apps/web/core/components/issues/issue-detail/relation-select.tsx:136 shows identifier-sequence such as ABC-12; apps/api/plane/db/models/issue.py:199 per project sequence_id; apps/api/plane/app/urls/issue.py:282 lookup by project identifier and number", "kanboard": "source read at v1.2.54: app/Template/board/task_private.php:26 cards show a global '#id'; the project identifier exists, app/Model/ProjectModel.php:123, but no per project task number; the request has the most votes of the Ideas category (6)", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'The project key becomes the first part of that project's issue keys, e.g. DDT-1, DDT-2' (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "yes", - "plane": "unknown", + "plane": "yes", "kanboard": "no", - "jira": "unknown" + "jira": "yes" }, { "id": "bkl-sprint-goal", @@ -5324,18 +5324,18 @@ "originUrl": "https://www.openproject.org/docs/release-notes/17-6-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'sprint', 'iteration', 'goal': none", "openproject": "source read at v17.8.0: modules/backlogs/app/models/sprint_goal.rb:31-35 a goal per sprint; modules/backlogs/app/components/backlogs/sprint_component.rb:100 goal_text on the sprint header; modules/backlogs/config/locales/en.yml:41 'Sprint goal'", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: apps/web/core/components/cycles/form.tsx:125 a free description per cycle; apps/web/core/components/cycles/analytics-sidebar/sidebar-details.tsx:70-73 shown in the cycle sidebar; apps/api/plane/db/models/cycle.py:62; no field named or used as the goal", + "kanboard": "source read at v1.2.54: searched app/Model and app/Template for 'sprint', 'iteration', 'goal': none", + "jira": "https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html sprint actions include 'Add sprint goals'; https://confluence.atlassian.com/adminjiraserver/upgrade-matrix-966063322.html 'Sprint goals: add goals to your sprints to let your team know what you want to achieve' (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "yes", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "partial", + "kanboard": "no", + "jira": "yes" }, { "id": "prj-request-approval", @@ -5345,18 +5345,18 @@ "originUrl": "https://www.openproject.org/docs/release-notes/17-1-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'request', 'approv', 'wizard' around board creation: none; a board is created directly", "openproject": "source read at v17.8.0: config/initializers/menus.rb:778-779 project settings 'Project initiation request'; config/routes.rb:216 creation_wizard; app/controllers/projects/settings/creation_wizard_controller.rb:108 needs the :project_creation_wizard Enterprise token", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: searched apps/api/plane/app/urls and apps/web/core/components/project for 'request', 'approv' on project creation: none; intake handles work items, not projects; 'Workflows + Approvals' is a paid plan line at packages/constants/src/subscription.ts:18", + "kanboard": "source read at v1.2.54: searched app/Controller/ProjectCreationController.php and app/Model for 'request', 'approv': none; a project is created directly", + "jira": "https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'creating and configuring a project is done by an administrator': no request form or review step before a project exists; request forms are Jira Service Management, a separate licence (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "partial", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "no", + "kanboard": "no", + "jira": "no" }, { "id": "bkl-planning-poker", @@ -5366,18 +5366,18 @@ "originUrl": "https://community.openproject.org/wp/35154", "note": "Demand row mined from openproject (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'poker', 'estimate', 'story point': none", "openproject": "source read at v17.8.0: searched app, lib, modules and frontend/src (rb, ts, yml) for 'poker': none; open Feature request since 2020-11-05, status new", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: searched apps/api/plane and apps/web/core for 'poker': none; estimates are set by one person per work item", + "kanboard": "source read at v1.2.54: searched app/ for 'poker': none", + "jira": "https://marketplace.atlassian.com/apps/700473/agile-poker-for-jira-planning-estimation paid app Agile Poker for Jira, build 6.1.0-jira-11 compatible to Jira 11.3.11: 'Run Planning Poker-style or async Wideband Delphi sessions'; Jira itself only stores the estimate (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "no", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "no", + "kanboard": "no", + "jira": "partial" }, { "id": "tsk-review-approval", @@ -5387,18 +5387,18 @@ "originUrl": "https://community.openproject.org/wp/49426", "note": "Demand row mined from openproject (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'approv', 'review': none; any member with edit rights can mark a card done", "openproject": "source read at v17.8.0: searched app/models and modules/*/app/models for 'approv': none; closing is a status change governed by workflows only; open Feature request since 2023-07-27", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "plane": "source read at v1.4.2: searched apps/api/plane and apps/web/core for 'approv': only the paid plan line 'Workflows + Approvals', packages/constants/src/subscription.ts:18, and upgrade modals", + "kanboard": "source read at v1.2.54: searched app/ for 'approv', 'reviewer': none in core; column move restrictions per role, app/Controller/ColumnMoveRestrictionController.php, limit who moves a task but name no reviewer", + "jira": "https://confluence.atlassian.com/adminjiraserver/advanced-workflow-configuration-938847443.html 'Conditions, check that a transition should be performed by the user', so a close transition can be limited to a reviewer role; https://jira.atlassian.com/browse/JRASERVER-62053 'ability to add approval feature project workflow', Closed, Won't Do; multi-person approval needs https://marketplace.atlassian.com/apps/1223591/workflowwise-parallel-approval-and-workflow-extension (build 2.12.5, Jira 11.3.11) (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "no", - "plane": "unknown", - "kanboard": "unknown", - "jira": "unknown" + "plane": "no", + "kanboard": "no", + "jira": "partial" }, { "id": "col-edit-conflict", @@ -5408,16 +5408,16 @@ "originUrl": "https://github.com/orgs/kanboard/discussions/5691", "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26. Also asked for by jira: https://jira.atlassian.com/browse/JRASERVER-6146 (featureRequest).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/sessions.js:40 notify_push refreshes the board after others save; searched lib/Service/CardService.php and lib/Controller/CardController.php for 'etag', 'conflict', 'If-Match': none, so the last save wins", + "openproject": "source read at v17.8.0: frontend/src/app/features/work-packages/services/notifications/work-package-notification.service.ts:52 handles UpdateConflict with config/locales/js-en.yml:390 'refresh the resource'; lib/api/root_api.rb:305 maps a stale lock_version to lib/api/errors/conflict.rb:32", + "plane": "source read at v1.4.2: apps/live/src/types/index.ts:26 live sync covers project pages only; searched apps/api/plane/app/views/issue/base.py for 'conflict', 'etag', 'stale': none, so work item saves overwrite", "kanboard": "source read at v1.2.54: searched app/Model/TaskModificationModel.php and app/Controller for 'lock', 'locked_by', 'editing': none; the last save wins", "jira": "https://jira.atlassian.com/browse/JRASERVER-6146 JRASERVER-6146 'Implement issue locking', Suggestion, Gathering Interest, 505 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", + "plane": "no", "kanboard": "no", "jira": "no" }, @@ -5429,18 +5429,18 @@ "originUrl": "https://github.com/orgs/kanboard/discussions/5403", "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'automation', 'rule', 'trigger': no automation rules to edit", + "openproject": "source read at v17.8.0: searched app and modules (rb) for 'automation': none; modules/webhooks/config/routes.rb:36 outgoing webhooks are the nearest, and workflows only govern status transitions", + "plane": "source read at v1.4.2: apps/web/core/components/automation/auto-archive-automation.tsx:27 and auto-close-automation.tsx edit the two built in rules in place; apps/api/plane/bgtasks/issue_automation_task.py runs them, apps/api/plane/celery.py:60; no custom rules exist to edit", "kanboard": "source read at v1.2.54: app/Controller/ActionController.php:18 index, :46 confirm, :65 remove are the only actions on an existing rule; app/Controller/ActionCreationController.php:102 creates new ones", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 'decide who can create, edit, enable, or disable automation rules': rules are edited in place (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "partial", "kanboard": "no", - "jira": "unknown" + "jira": "yes" }, { "id": "prt-dashboard-order", @@ -5450,18 +5450,18 @@ "originUrl": "https://github.com/orgs/kanboard/discussions/5394", "note": "Demand row mined from kanboard (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/components/navigation/AppNavigationBoardCategory.vue:66 boards are always sorted by title; searched lib/Db/Board.php for an order field: none", + "openproject": "source read at v17.8.0: modules/my_page/lib/my_page/grid_registration.rb:17 a favourite projects widget on My page; modules/grids/app/components/grids/widgets/favorite_projects.rb:41 lists them by name; you pick which projects show, not their order", + "plane": "source read at v1.4.2: apps/web/core/components/workspace/sidebar/projects-list-item.tsx:307 'drag to rearrange'; apps/web/core/components/workspace/sidebar/projects-list.tsx:102 saves sort_order; apps/api/plane/db/models/project.py:223 sort_order per member", "kanboard": "source read at v1.2.54: app/Template/project_list/sort_menu.php:5-17 sort by id, name, status, start or end date; searched app/Model for a per user project position: none", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html gadgets on a dashboard 'can be reordered and switched between the left and right columns'; the Projects gadget 'Shows information on various issue filters from a selected project', one project per gadget, so ordering projects means ordering gadgets (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", + "plane": "yes", "kanboard": "partial", - "jira": "unknown" + "jira": "partial" }, { "id": "plt-rtl", @@ -5471,18 +5471,18 @@ "originUrl": "https://github.com/kanboard/kanboard/blob/main/ChangeLog", "note": "Demand row mined from kanboard (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: l10n/ar.json and l10n/he.json ship translations and page direction comes from the Nextcloud server, not Deck; src/components/card/Description.vue:269 notes the text editor does not support rtl yet; searched src/ for other 'rtl' handling: none", + "openproject": "source read at v17.8.0: config/locales/crowdin/ar.yml ships Arabic, but app/views/layouts/base.html.erb:30-33 sets no dir attribute; right to left only per custom field, config/locales/en.yml:122 'Right-to-Left content', frontend/src/app/shared/components/fields/display/field-types/formattable-display-field.module.ts:47-48", + "plane": "source read at v1.4.2: apps/web/app/root.tsx:63 html lang en with no dir; packages/i18n/src/locales carries no Arabic, Hebrew or Persian; searched apps/web and packages for 'rtl', 'direction: rtl': none", "kanboard": "source read at v1.2.54: ChangeLog:112 'add basic support for right-to-left (RTL) languages' in 1.2.48 (October 2025); app/Template/layout.php:2 dir rtl; app/Model/LanguageModel.php:205 isRtlLanguage", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://jira.atlassian.com/browse/JRASERVER-15355 'Add Support for Right to Left Languages', Suggestion, Gathering Interest, 111 votes; https://confluence.atlassian.com/adminjiraserver/choosing-a-default-language-938847001.html default languages list no Arabic or Hebrew (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", + "nextcloud-deck": "partial", + "openproject": "partial", + "plane": "no", "kanboard": "yes", - "jira": "unknown" + "jira": "no" }, { "id": "plt-outbound-guard", @@ -5492,18 +5492,18 @@ "originUrl": "https://github.com/kanboard/kanboard/blob/main/ChangeLog", "note": "Demand row mined from kanboard (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: lib/Service/Importer/Systems/TrelloApiService.php:39 and lib/Federation/DeckFederationProxy.php:24 go out through the Nextcloud IClientService, whose local address block lives in the server, not in Deck; Deck has no webhooks of its own", + "openproject": "source read at v17.8.0: modules/webhooks/app/services/webhooks/outgoing/request_webhook_service.rb:16 SsrfProtection.post for webhooks; lib/open_project.rb:69 ssrf_filter on the shared HTTP client with an allowlist; lib/open_project/ssrf_protection.rb:32; app/controllers/admin_controller.rb:112 also checks the SMTP host", + "plane": "source read at v1.4.2: apps/api/plane/bgtasks/work_item_link_task.py:62-68 refuses private or internal addresses for link previews; apps/api/plane/bgtasks/webhook_task.py:369 records a blocked webhook target without retry", "kanboard": "source read at v1.2.54: ChangeLog:67 SSRF protection for webhooks in 1.2.51, :95 private network block for external links in 1.2.49; app/Notification/WebhookNotification.php:42 refuses private URLs; app/constants.php:190,193 opt-in overrides", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/adminjiraserver/configuring-the-allowlist-1014667309.html 'Jira admins can allow incoming and outgoing connections and content from specified sources by adding URLs to the allowlist'; the page names gadgets and application links, not webhooks, and no rule against internal addresses (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", + "nextcloud-deck": "partial", + "openproject": "yes", + "plane": "yes", "kanboard": "yes", - "jira": "unknown" + "jira": "partial" }, { "id": "tsk-diagrams", @@ -5513,18 +5513,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/8147", "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched src/ and package.json for 'mermaid', 'drawio', 'plantuml': none; src/components/card/Description.vue:208 embeds the separate Text app when installed, whose features are outside this tree", + "openproject": "source read at v17.8.0: searched app, lib, modules and frontend/src/app for 'mermaid', 'plantuml', 'drawio': none; the only hit in frontend/src/vendor/ckeditor/ckeditor.js is an emoji keyword", "plane": "source read at v1.4.2: searched packages/editor/src and apps/web/core for 'mermaid': none; the editor extensions at packages/editor/src/core/extensions/extensions.ts:65 carry no diagram block; the request has 39 reactions, a sibling #4086 has 15", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: searched app/ and assets/js for 'mermaid', 'plantuml', 'drawio': none in core", + "jira": "https://marketplace.atlassian.com/apps/1211413/draw-io-diagrams-for-jira paid app draw.io Diagrams for Jira, build 11.1.3 compatible to Jira 11.3.11: 'create a wide variety of helpful diagrams and attach them to your Jira issues'; no diagram editor in the product (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "no", + "openproject": "no", "plane": "no", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "no", + "jira": "partial" }, { "id": "plt-ai-assist", @@ -5534,18 +5534,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/5941", "note": "Demand row mined from plane (featureRequest) on 2026-09-26. Also asked for by openproject: https://community.openproject.org/wp/69622 (roadmap).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'assistant', 'textprocessing', 'llm', 'openai': none", "openproject": "source read at v17.8.0: not in v17.8.0: searched app, lib and modules (rb) for 'openai', 'anthropic', 'ai_assist': none; roadmap item for 18.0.0 in development, with 66020 LLM connection settings", "plane": "source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/description-editor.tsx:22 GptAssistantPopover; apps/api/plane/app/views/external/base.py:50-53 SUPPORTED_PROVIDERS openai, anthropic, gemini and :84-93 LLM_API_KEY, LLM_PROVIDER, LLM_MODEL; no base URL setting, so no self-hosted model; the request has 27 reactions", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: searched app/ for 'assistant', 'llm', 'openai': none", + "jira": "https://marketplace.atlassian.com/apps/1230009/issue-ai-analytics-for-jira-cloud-private-ai paid app, build 11.1.11 compatible to Jira 11.3.11: 'You can also integrate your Private AI with Private AI mode'; Atlassian's own Rovo reaches Data Center only through cloud connectors (11.3 release notes) (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", + "nextcloud-deck": "no", "openproject": "no", "plane": "partial", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "no", + "jira": "partial" }, { "id": "int-pages-api", @@ -5555,18 +5555,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/8598", "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: appinfo/routes.php has boards, stacks, cards, labels, comments and attachments; searched it for 'page', 'wiki': none, Deck has no documentation pages", + "openproject": "source read at v17.8.0: modules/documents/lib/api/v3/documents/documents_api.rb:41 lists, :64 reads and :70 patches documents; lib/api/v3/wiki_pages/wiki_pages_api.rb:41 reads a wiki page by id with title only, lib/api/v3/wiki_pages/wiki_page_representer.rb:40-42; no create over the API", "plane": "source read at v1.4.2: searched apps/api/plane/api/urls for 'page': no page routes in the token API, only apps/api/plane/app/urls/page.py:23 for the web session; the request has 22 reactions, siblings #7319 (17) and #4108 (6)", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: searched app/Api/Procedure for 'page', 'wiki', 'document': none; core has no documentation pages", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html documentation pages are Confluence, a separate product; https://developer.atlassian.com/server/jira/platform/rest/v11000/intro the Jira REST API (432 operations) covers issues, projects and boards, no pages (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "no", + "openproject": "partial", "plane": "no", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "no", + "jira": "no" }, { "id": "prj-wiki-tree", @@ -5576,18 +5576,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/5620", "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'wiki', 'page', 'subpage': none", + "openproject": "source read at v17.8.0: app/views/wiki/index.html.erb:33 'Table of Contents' tree; config/locales/en.yml:1929 'Change parent page'; app/models/wiki_page.rb:37 acts_as_tree", "plane": "source read at v1.4.2: apps/api/plane/db/models/page.py:40 Page.parent exists but no component in apps/web/core/components/pages offers subpages, apps/web/core/components/pages/list/block.tsx:30 is a flat list; 'Nested Pages' is a paid plan line at packages/constants/src/subscription.ts:21; the request has 17 reactions, #7511 folders has 8", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: searched app/ for 'wiki', 'subpage': none in core; a wiki is a third party plugin", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Confluence spaces are great for creating and organizing' pages: page trees are Confluence, a separate product and licence, not Jira (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", "plane": "no", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "no", + "jira": "no" }, { "id": "plt-2fa", @@ -5597,18 +5597,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/1212", "note": "Demand row mined from plane (featureRequest) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5392 (featureRequest).", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: Deck has no sign in of its own: searched lib/ for 'twofactor', 'totp', 'IProvider' for login: only lib/Collaboration/Resources/ResourceProvider.php:23, a resource provider; a second factor comes from the Nextcloud server and its two factor apps", + "openproject": "source read at v17.8.0: modules/two_factor_authentication/config/locales/en.yml:25 'Authenticator application'; modules/two_factor_authentication/app/models/two_factor_authentication/device/totp.rb:6 TOTP device, with webauthn.rb and sms.rb beside it; modules/two_factor_authentication/config/routes.rb:15 webauthn challenge", "plane": "source read at v1.4.2: searched apps/api/plane --include=*.py for 'totp', 'two.factor', 'mfa': none; sign-in providers are apps/api/plane/authentication/provider/oauth/google.py:1 and siblings plus email and magic code; the request has 9 reactions", "kanboard": "source read at v1.2.54: app/Auth/TotpAuth.php:17 time based one time codes in core, app/Template/user_view/sidebar.php:63-64 two factor page; searched app/ for 'webauthn', 'fido', 'passkey': none, which is what the request asks for", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-10-2-x-release-notes-1455425728.html 'You can now set up two-step verification and verify your identity with an authentication app when you log in'; enforcing it for everyone is open request JRASERVER-78553 (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "partial", + "openproject": "yes", "plane": "no", "kanboard": "partial", - "jira": "unknown" + "jira": "yes" }, { "id": "prj-shared-workflow", @@ -5618,18 +5618,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/4706", "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/Db and lib/Service for a label or stack set shared across boards: none; labels and stacks belong to one board, cloning a board copies them", + "openproject": "source read at v17.8.0: config/initializers/menus.rb:409-410 instance wide Statuses admin; app/models/status.rb:31-34 statuses and workflows are global; modules/backlogs/lib/open_project/backlogs/engine.rb:251 story points on every type; types and custom fields are shared across projects", "plane": "source read at v1.4.2: apps/api/plane/app/views/project/base.py:293 each project copies DEFAULT_STATES into its own State rows, and apps/api/plane/db/models/estimate.py:18 an Estimate belongs to one project; searched apps/api/plane/app/urls/state.py for a workspace level state route: none; the request has 10 reactions", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: app/Controller/TagController.php:15 global tags, app/Model/TagModel.php:56 project_id 0; app/Template/config/project.php:11 default columns for new projects, used at app/Model/BoardModel.php:34, copied once, not shared afterwards", + "jira": "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Sometimes you may wish to share schemes among your projects, so that editing one scheme changes that scheme in several projects at once. You can select Create with shared configuration' (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", "plane": "no", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "partial", + "jira": "yes" }, { "id": "brd-filter-exclude", @@ -5639,18 +5639,18 @@ "originUrl": "https://github.com/makeplane/plane/issues/8510", "note": "Demand row mined from plane (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/components/Controls.vue:117-121 filters include tags, users, due and 'unassigned'; src/stores/card.js:23-52 applies them as matches only; searched src/ for 'exclude', 'not': none", + "openproject": "source read at v17.8.0: config/locales/en.yml:3505 'is not' operator in the filter bar; app/models/queries/operators/not_equals.rb:34 the '!' operator applies to assignee, status and other filters", "plane": "source read at v1.4.2: apps/api/plane/utils/filters/filter_backend.py:172,205 the server accepts a 'not' group in rich_filters, but apps/web/core/hooks/rich-filters/use-filters-operator-configs.ts:19-21 hardcodes allowNegative: false, so the web filter bar offers no exclusion; the request has 6 reactions", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: app/Core/Filter/Lexer.php:28-34 no negation token in the search syntax; app/Filter/TaskAssigneeFilter.php:61-67 offers me, nobody and anybody only; app/Filter/TaskIdExclusionFilter.php:24 is an internal filter for task autocomplete, app/Controller/TaskAjaxController.php:39", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-operators-reference-939938745.html 'The != operator is used to search for issues where the value of a specified field doesn't match'; board quick filters are JQL (https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html), e.g. assignee != currentUser() (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", "plane": "partial", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "no", + "jira": "yes" }, { "id": "plt-command-palette", @@ -5660,18 +5660,18 @@ "originUrl": "https://github.com/makeplane/plane/releases/tag/v1.2.0", "note": "Demand row mined from plane (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/components/KeyboardShortcuts.vue:71-73 Ctrl+F search and board shortcuts with a help modal; searched src/ for 'palette', 'command': none, so no palette to run actions", + "openproject": "source read at v17.8.0: frontend/src/app/shared/directives/a11y/keyboard-shortcut.service.ts:61-79 go to shortcuts, 's' quick search and 'p' project search; searched frontend/src for 'command palette', 'commandPalette': none", "plane": "source read at v1.4.2: apps/web/core/components/power-k/core/shortcut-handler.ts:12 cmd+k and modifier shortcuts; apps/web/core/components/power-k/ui/pages/context-based/work-item/commands.ts:214 per item actions; apps/api/plane/app/urls/search.py:13 search behind it; shipped as 'Power K, supercharged' in v1.2.0 (2025-12-11)", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: assets/js/components/keyboard-shortcuts.js:28-63 '?' help, 'b' board switcher, 's' search, 'n' new task; app/Template/config/keyboard_shortcuts.php lists them; no palette that runs arbitrary actions", + "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html 'Keyboard shortcuts are a great way ... for performing actions without having to take your fingers off the keyboard'; the issue Operations Dialog opens with a dot (named in https://jira.atlassian.com/browse/JRASERVER-23222); no app-wide command palette is documented (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "partial", + "openproject": "partial", "plane": "yes", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "partial", + "jira": "partial" }, { "id": "bkl-intake-triage", @@ -5681,18 +5681,18 @@ "originUrl": "https://github.com/makeplane/plane/releases/tag/v1.2.0", "note": "Demand row mined from plane (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'triage', 'intake', 'inbox': none", + "openproject": "source read at v17.8.0: searched app, modules and frontend/src/app for 'triage', 'intake': none; app/services/incoming_emails/mail_handler.rb creates work packages from mail straight into a project, with no accept or decline step", "plane": "source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/intake/page.tsx; apps/web/core/components/inbox/content/inbox-issue-header.tsx:42,73-74 accept and decline; apps/api/plane/app/urls/intake.py:27, apps/api/plane/app/views/intake/base.py:335; apps/api/plane/db/models/state.py:20 TRIAGE group, 'Triage state for Intake' in v1.2.0", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "jira": "not checked: row added 2026-09-26 from a demand signal, back-fill pending" + "kanboard": "source read at v1.2.54: searched app/ for 'triage', 'intake', 'inbox': none in core", + "jira": "https://confluence.atlassian.com/adminjiraserver/creating-issues-and-comments-from-email-938847641.html 'Jira can receive emails from licensed users to create issues'; https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html issues move from Backlog to 'Selected for development': a triage status can be modelled, but there is no request queue with accept or decline; that is Jira Service Management (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", + "nextcloud-deck": "no", + "openproject": "no", "plane": "yes", - "kanboard": "unknown", - "jira": "unknown" + "kanboard": "no", + "jira": "partial" }, { "id": "tsk-estimate-rollup", From 9a97651a5da915e7db8cc8f3169f392dd691286e Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:57:38 +0200 Subject: [PATCH 12/13] feat(parity): rate the nine Jira-proposed demand rows for Deck, OpenProject, Plane and Kanboard from source --- openspec/parity/capabilities.json | 144 +++++++++++++++--------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index c58043eb..79c646c5 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -5702,17 +5702,17 @@ "originUrl": "https://jira.atlassian.com/browse/JSWSERVER-9167", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/Db/Card.php and src/ for 'estimate', 'story point', 'subtask': none; cards have no estimate or children", + "openproject": "source read at v17.8.0: config/locales/en.yml:1790 'Total work' shown on parents; app/services/work_packages/update_ancestors_service.rb:146-147 derived_estimated_hours summed from children", + "plane": "source read at v1.4.2: apps/api/plane/app/views/issue/sub_issue.py:147 returns each sub work item's estimate_point, but searched apps/web/core/components/issues for a summed parent estimate: none; totals exist only per cycle", + "kanboard": "source read at v1.2.54: app/Template/task/details.php:98-101 time estimated on the task; app/Model/SubtaskTimeTrackingModel.php:280-287 SUM of subtask time_estimated written to the task, called from app/Model/SubtaskModel.php:219", "jira": "JSWSERVER-9167 'Provide ability to automatically sum estimates from sub-tasks in user stories', Future Consideration, 1993 votes; https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'Choosing to include sub-tasks displays the aggregated time': hours roll up, story points do not (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", + "plane": "no", + "kanboard": "yes", "jira": "partial" }, { @@ -5723,17 +5723,17 @@ "originUrl": "https://jira.atlassian.com/browse/JRASERVER-3406", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/components/card/CardSidebarTabComments.vue:14-16 reply to a comment, src/components/card/CommentItem.vue:6 reply preview; lib/Service/CommentService.php:97 create with replyTo and :47-48 returns the parent; shown as a flat list with the quoted parent, not nested", + "openproject": "source read at v17.8.0: app/components/work_packages/activities_tab/journals/item_component/actions.rb:61-64 'Quote this comment', config/locales/js-en.yml:576, pastes quoted text into a new comment; no parent link, so no thread; config/locales/en.yml:1982 'Reply' belongs to forums", + "plane": "source read at v1.4.2: apps/api/plane/db/models/issue.py:475-476 IssueComment.parent exists, but searched apps/web/core/components/comments for 'reply', 'parent': only an icon, apps/web/core/components/comments/comment-block.tsx:42, nothing sets a parent", + "kanboard": "source read at v1.2.54: searched app/Model/CommentModel.php for 'parent', 'reply': none; comments are a flat list", "jira": "https://jira.atlassian.com/browse/JRASERVER-3406 JRASERVER-3406 'Threaded Comments', Suggestion, Future Consideration, 1017 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "yes", + "openproject": "partial", + "plane": "no", + "kanboard": "no", "jira": "no" }, { @@ -5744,17 +5744,17 @@ "originUrl": "https://jira.atlassian.com/browse/JSWSERVER-7721", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: appinfo/routes.php:176 card#clone copies one card; searched lib/Db for child cards or subtasks: none", + "openproject": "source read at v17.8.0: config/locales/js-en.yml:155 'Duplicate in another project' and bulk copy; app/services/work_packages/bulk/copy_service.rb:87-97 copies every descendant under the copied parent, run by app/workers/work_packages/bulk_copy_job.rb:36", + "plane": "source read at v1.4.2: packages/i18n/src/locales/en/common.json:325 'Make a copy'; apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/all-issue.tsx:58-65 copies one work item's fields, no sub work items", + "kanboard": "source read at v1.2.54: app/Template/task/dropdown.php:48 'Duplicate'; app/Model/TaskDuplicationModel.php:164 copies subtasks and :59 tags; child tasks joined by links are not copied", "jira": "JSWSERVER-7721 'When cloning an Epic, add the option to clone the linked Stories as well', Future Consideration, 1295 votes; https://confluence.atlassian.com/jirasoftwareserver/creating-issues-and-sub-tasks-939938925.html 'Clone sub-tasks to copy existing sub-tasks' (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", + "plane": "no", + "kanboard": "partial", "jira": "partial" }, { @@ -5765,17 +5765,17 @@ "originUrl": "https://jira.atlassian.com/browse/JRASERVER-28225", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: src/components/card/CommentForm.vue:61-66 suggests board users only; lib/Notification/NotificationHelper.php:189-190 skips non user mentions", + "openproject": "source read at v17.8.0: app/services/notifications/create_from_model_service.rb:41 matches group mentions and :281 notifies the group's members; app/models/queries/principals/filters/mentionable_on_work_package_filter.rb:53 supplies mentionable principals, groups included", + "plane": "source read at v1.4.2: apps/api/plane/bgtasks/notification_task.py:123 and :137 extract only user_mention components; searched apps/api/plane/db/models for a team or group entity: none", + "kanboard": "source read at v1.2.54: app/Job/UserMentionJob.php:57-61 resolves @username to single users; searched it for 'group': none", "jira": "https://jira.atlassian.com/browse/JRASERVER-28225 JRASERVER-28225 'Mentions of groups', Suggestion, Future Consideration, 910 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", + "plane": "no", + "kanboard": "no", "jira": "no" }, { @@ -5786,17 +5786,17 @@ "originUrl": "https://jira.atlassian.com/browse/JRASERVER-1780", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'time spent', 'worklog', 'timesheet': no time logging", + "openproject": "source read at v17.8.0: modules/costs/app/components/time_entries/activity_form.rb:35-49 activity picker on the log time form; modules/costs/app/models/time_entry.rb:39 activity; modules/costs/app/models/time_entry_activity.rb:29; config/locales/en.yml:2617 'Time tracking activities'", + "plane": "source read at v1.4.2: apps/api/plane/db/models/project.py:98 only an is_time_tracking_enabled flag; searched apps/web for a worklog screen: none in this edition", + "kanboard": "source read at v1.2.54: app/Model/SubtaskTimeTrackingModel.php:263 tracks hours per subtask with no type; searched app/Model for 'activity type', 'work type': none", "jira": "https://jira.atlassian.com/browse/JRASERVER-1780 JRASERVER-1780 'Add type of work in Log work', Suggestion, Not Being Considered, 773 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "yes", + "plane": "no", + "kanboard": "no", "jira": "no" }, { @@ -5807,17 +5807,17 @@ "originUrl": "https://jira.atlassian.com/browse/JRASERVER-3592", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/Service/CardService.php and appinfo/routes.php for 'merge', 'duplicate': none", + "openproject": "source read at v17.8.0: app/models/relation.rb:40-41 'duplicates' and 'duplicated' relations only link two work packages; searched app/services/work_packages for 'merge': none, comments and history stay apart", + "plane": "source read at v1.4.2: apps/api/plane/db/models/issue.py:273 a 'duplicate' relation only links; searched apps/api/plane/app/views/issue for 'merge': none", + "kanboard": "source read at v1.2.54: app/Schema/Sqlite.php:964-965 'duplicates' and 'is duplicated by' links only; searched app/Controller and app/Model for 'merge' of tasks: none", "jira": "https://jira.atlassian.com/browse/JRASERVER-3592 JRASERVER-3592 'Merging of issues', Suggestion, Future Consideration, 533 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "no" }, { @@ -5828,17 +5828,17 @@ "originUrl": "https://jira.atlassian.com/browse/JRASERVER-1633", "note": "Demand row mined from jira (featureRequest) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched src/ and lib/ for 'similar', 'duplicate' on card creation: none", + "openproject": "source read at v17.8.0: searched app, modules and frontend/src/app for 'similar', 'dedupe', 'duplicate detection' on create: none", + "plane": "source read at v1.4.2: apps/web/core/hooks/use-debounced-duplicate-issues.tsx:15 always returns an empty list in this edition, so the create modal never warns", + "kanboard": "source read at v1.2.54: searched app/Controller/TaskCreationController.php and assets/js for 'similar', 'duplicate' checks: none", "jira": "https://jira.atlassian.com/browse/JRASERVER-1633 JRASERVER-1633 'find similar feature to prevent creating duplicate issue', Suggestion, Gathering Interest, 175 votes (tracker REST API, read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "no", "jira": "no" }, { @@ -5849,17 +5849,17 @@ "originUrl": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html", "note": "Demand row mined from jira (changelog) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: searched lib/ and src/ for 'automation', 'rule': Deck has no automations", + "openproject": "source read at v17.8.0: searched app and modules (rb) for 'automation': none; no automation builder to guard", + "plane": "source read at v1.4.2: apps/web/core/components/automation/auto-archive-automation.tsx:27 only two built in archive and close rules; no powerful actions or builder to restrict", + "kanboard": "source read at v1.2.54: app/ServiceProvider/AuthenticationProvider.php:80-82 only project managers may create automatic actions, one gate for every action; no per action restriction on the powerful ones", "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 11.3 release notes 'Starting from Jira 11.3.3, you can use automation restrictions to decide who can create, edit, enable, or disable automation rules that use specific components'; 11.3.3 released 5 March 2026 (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "no", + "openproject": "no", + "plane": "no", + "kanboard": "partial", "jira": "yes" }, { @@ -5870,17 +5870,17 @@ "originUrl": "https://www.atlassian.com/roadmap/data-center", "note": "Demand row mined from jira (roadmap) on 2026-09-26.", "evidence": { - "nextcloud-deck": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "openproject": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "plane": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", - "kanboard": "not checked: row added 2026-09-26 from a demand signal, back-fill pending", + "nextcloud-deck": "source read at v1.19.0: provided by the Nextcloud server: its security and setup warnings cover the installation Deck runs in, appinfo/info.xml:45; searched lib/ for its own security overview: none", + "openproject": "source read at v17.8.0: config/routes.rb:644 admin info; app/controllers/admin_controller.rb:89-98 a checklist that flags an unchanged default admin and storage issues; config/locales/en.yml:5499 security badge for new releases; no risk overview with suggested fixes", + "plane": "source read at v1.4.2: searched apps/admin and apps/api/plane/license for 'security', 'health', 'check': none beyond email config", + "kanboard": "source read at v1.2.54: searched app/Controller/ConfigController.php and app/Template/config for 'security', 'health', 'check': none", "jira": "https://www.atlassian.com/roadmap/data-center roadmap 'Security insights Get centralised, instance-level security insights for your Confluence and Jira Data Center in Admin Hub ... Released Q3 2026': it runs through the cloud Admin Hub, so a buyer without a cloud connection does not get it (read 2026-09-26)" }, "planninq": "unknown", - "nextcloud-deck": "unknown", - "openproject": "unknown", - "plane": "unknown", - "kanboard": "unknown", + "nextcloud-deck": "partial", + "openproject": "partial", + "plane": "no", + "kanboard": "no", "jira": "partial" } ], From f1a0b0319f6ee6e914719dbf88805b45068e99c3 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sun, 27 Sep 2026 00:06:32 +0200 Subject: [PATCH 13/13] feat(parity): rate planninq on the 50 demand rows from its code with the two-hop trace --- openspec/parity/capabilities.json | 751 +++++++++++++++++++++++++----- 1 file changed, 645 insertions(+), 106 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 79c646c5..69ad6ae4 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -4847,12 +4847,22 @@ "kanboard": "source read at v1.2.54: searched app/ (php) for 'likelihood', 'risk_register', 'riskregister': none", "jira": "https://marketplace.atlassian.com/apps/1213146/risk-register paid app 'Risk Register', build 8.1.1 compatible to Jira 11.3.11: 'record risks, assess their magnitude ... collaborate with others on their treatment'; Jira itself has no risk object (Marketplace REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "searched src/ lib/ and lib/Settings/planninq_register.json for risk, likelihood, impact, countermeasure: none. No risk schema, no risk page in src/manifest.json pages, no risk component in src/registry.js:42-51.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "prj-project-logs", @@ -4868,12 +4878,22 @@ "kanboard": "source read at v1.2.54: searched app/Model and app/Controller for 'lesson', 'meeting', 'issue log': none; tasks only", "jira": "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Jira enables you to keep track of different types of things ... by using different issue types': an admin can add action, issue, lesson or meeting log issue types per project; there is no built-in project log (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "partial", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No project-scoped log of actions, issues, lessons learned or meetings. The only logs are per task: CnObjectSidebar Comments (notes) and Activity (audit trail) tabs on src/views/TaskDetail.vue:129-137. The project settings sidebar has Details, Members and Danger zone tabs only (src/components/ProjectSettingsSidebar.vue:8-165).", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "prt-portfolio-finance", @@ -4889,12 +4909,23 @@ "kanboard": "source read at v1.2.54: searched app/ for 'budget', 'cost', 'portfolio': none (budget is a third party plugin, not core)", "jira": "https://marketplace.atlassian.com/apps/1211259/budgets-jira-project-budget-management-tempo paid app Tempo Budgets, build 19.6.2-jira-11 compatible to Jira 11.3.11: 'Budget and track projects, and portfolios ... Forecast costs, revenues, and profitability'; Jira has no budget object (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Budget is schema plus display only: lib/Settings/planninq_register.json:544-561 budgetHours/budgetAmount/hourlyRate, shown on src/components/ProjectListItem.vue:44-49 and totalled in src/integrations/CnProjectsWidget.vue:254-256 (a leaf rendered on OTHER apps' pages). No planninq page sets a budget, and spend, commitments and forecast have no property at all. The Portfolio page (src/views/Portfolio.vue:29-69) carries no money column.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "nearCredit": "the budget total in CnProjectsWidget reads like a portfolio figure but is budget only, is set nowhere in planninq and renders on other apps' pages" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "portfolio", + "featureConfidence": "high" }, { "id": "int-finance-import", @@ -4910,12 +4941,22 @@ "kanboard": "source read at v1.2.54: searched app/Model and app/Api/Procedure for 'cost', 'budget', 'finance': none", "jira": "https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html lists no finance system integration, and projects carry no budget or spend fields (https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html) to import into (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "No finance import and no project number to match on: project.key is declared at lib/Settings/planninq_register.json:524 and unused in src/ and lib/. lib/Service/RegisterImportService.php loads planninq's own register JSON (schemas and seed objects), not external spend. Spend and commitments have no schema property to land in.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "high" }, { "id": "tim-non-project", @@ -4931,12 +4972,23 @@ "kanboard": "source read at v1.2.54: searched app/Model for 'timesheet', 'absence', 'leave': time is tracked only on subtasks inside a project", "jira": "https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html work is logged against an issue only ('Make sure you have the Work on Issues ... project permissions'), so leave or training needs an internal project with placeholder issues; no separate non-project category (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Logging requires a task: src/views/TaskDetail.vue:91 opens src/dialogs/TimeEntryDialog.vue, which writes task: this.taskId (:160) through src/store/timeEntries.js:149 create. src/views/Timesheet.vue:53-80 only lists the user's entries (src/store/timeEntries.js:121 fetchForCurrentUser). humaniq declares LeaveRequest and SickLeaveCase schemas (hrmq/lib/Settings/humaniq_register.json), but planninq never reads them, so leave does not appear in the planninq timesheet.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "consumesSibling": "humaniq has leave and sick-leave schemas; planninq does not consume them" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "time-tracking", + "featureConfidence": "high" }, { "id": "pln-phase-gate-document", @@ -4952,12 +5004,22 @@ "kanboard": "source read at v1.2.54: searched app/Model and app/Action for 'phase', 'gate': none; no action blocks a column move on an attachment", "jira": "https://confluence.atlassian.com/adminjiraserver/using-validators-with-custom-fields-938847524.html 'Use the Fields Required workflow validator that is packaged in the Jira Suite Utilities'; https://marketplace.atlassian.com/apps/5048/jsu-automation-suite-for-jira-workflows paid app, build 4.1.3 compatible to Jira 11.3.11; phases are workflow statuses, not project phases (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Schema only: lib/Settings/planninq_register.json:584-760 declares projectPhase (title, status open/in_progress/completed/cancelled, order, budget). grep for 'projectPhase' and 'phase' across src/ finds nothing but an unrelated comment in src/App.vue:122. No page lists phases and no guard checks for a concluding document.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "timeline", + "featureConfidence": "medium" }, { "id": "int-import-msproject", @@ -4973,12 +5035,22 @@ "kanboard": "source read at v1.2.54: app/Controller/TaskImportController.php:40 imports tasks from CSV only, no dependencies or Gantt; searched app/ for 'mpp', 'mspdi', 'msproject': none", "jira": "https://marketplace.atlassian.com/apps/1211768/wbs-gantt-chart-for-jira-enterprise-project-management paid app WBS Gantt-Chart for Jira, build 9.20.0.1067 compatible to Jira 11.3.11, lists 'Microsoft Project import/export'; https://confluence.atlassian.com/adminjiraserver/migrating-from-other-issue-trackers-938847532.html core import is CSV or JSON only (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No Microsoft Project import in src/ or lib/. lib/Service/RegisterImportService.php imports the app's own configuration. The nearest path is OpenRegister's generic register import (the int-import-other row), which takes tabular rows and would not rebuild a Gantt plan with dependencies.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "high" }, { "id": "int-archive-to-case", @@ -4994,12 +5066,23 @@ "kanboard": "source read at v1.2.54: searched app/ and app/Api/Procedure for 'zaak', 'records', 'case management': none", "jira": "https://confluence.atlassian.com/adminjiraserver/integrating-with-other-tools-938846907.html names no records or case management integration; https://confluence.atlassian.com/adminjiraserver/archiving-a-project-938847621.html archiving keeps data inside Jira, 'All the project data remains in the database' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "src/components/ProjectSettingsSidebar.vue:47-53 displays caseReference when set; no action exports a project's attachments or metadata to dossiq/procest or a ZGW DRC. grep for 'zaakUuid', 'caseReference', 'drc', 'archive' in lib/ finds only the portal field exclusion list in lib/Portal/PortalContributionProvider.php:64.", + "reachedOn": "ProjectBoard /projects/:id, project settings sidebar shows the case reference only", + "owner": "ConductionNL/planninq", + "consumesSibling": "dossiq/procest owns cases; planninq only stores a reference to one" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "high" }, { "id": "plt-destruction-list", @@ -5015,12 +5098,24 @@ "kanboard": "source read at v1.2.54: searched app/ for 'retention', 'destruction', 'vernietig': none", "jira": "https://jira.atlassian.com/browse/JRASERVER-78250 'Retention rules for Jira', Suggestion, Gathering Interest; JRASERVER-70162 'Ability to auto-delete Archived issues', Gathering Interest, 17 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "built", + "evidence": "OpenRegister builds destruction lists from object retention metadata (openregister lib/BackgroundJob/DestructionCheckJob.php calls RetentionService findEligibleForDestruction, approval routes archival#approveDestructionList in openregister appinfo/routes.php on development 7367d6d). planninq sets no retention period on any project, task or time entry, so on a code reading none of its records would ever be put on a list.", + "reachedOn": "OpenRegister archival settings and destruction lists; no planninq page", + "owner": "ConductionNL/openregister", + "consumesSibling": "no: planninq objects carry no retention metadata", + "liveCheck": "confirm whether OpenRegister applies a register-wide default retention that would pick up planninq objects" + }, + "provider": "openregister", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "medium" }, { "id": "prt-status-grotik", @@ -5036,12 +5131,22 @@ "kanboard": "source read at v1.2.54: searched app/Model/ProjectModel.php and app/Template/project_overview for a status or health field: none", "jira": "https://marketplace.atlassian.com/apps/1228554/pmo-assessment-and-reports-for-jira paid app, build 1.2 compatible to Jira 11.3.11: 'insights into project time, costs, quality and inefficiencies'; it covers time, money and quality, not organisation, information and risk, and Jira has no project status report (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "The only per-project roll-up is src/views/Portfolio.vue:29-69 (members, open, overdue, open-work bar) fed by src/store/projects.js:170 fetchProjects. No per-aspect status property on the project schema (lib/Settings/planninq_register.json:450-580) and no portfolio roll-up of such statuses.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "portfolio", + "featureConfidence": "high" }, { "id": "pln-calendar-writeback", @@ -5057,12 +5162,22 @@ "kanboard": "source read at v1.2.54: app/Controller/ICalendarController.php:22 and :62 serve read only iCal feeds; searched app/ for 'caldav': none", "jira": "https://jira.atlassian.com/browse/JRASERVER-2971 'iCalendar support', Gathering Interest, 22 votes: no feed in the product; https://marketplace.atlassian.com/apps/1214714/calendar-sync-for-jira (build 3.0.0, Jira 11.3.11) publishes calendar 'feeds' configured by JQL, a one-way export with no write-back documented (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "Schema only: lib/Settings/planninq_register.json:311-316 calendarEventUid. grep for calendarEventUid, caldav, vtodo in src/ and lib/ finds only the portal exclusion comment lib/Portal/PortalContributionProvider.php:64. Nothing publishes tasks to a calendar, so nothing can be written back.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "timeline", + "featureConfidence": "medium" }, { "id": "prj-grouping", @@ -5078,12 +5193,22 @@ "kanboard": "source read at v1.2.54: searched app/Model/ProjectModel.php and app/Template/project_list for 'group', 'folder', 'category': none; app/Model/CategoryModel.php is for tasks inside one project", "jira": "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html project categories are created 'via Administration > Projects > Project Categories', and Jira 'can display projects sorted by the project category' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "partial", "kanboard": "no", - "jira": "yes" + "jira": "yes", + "built": { + "state": "none", + "evidence": "Projects are a flat list on src/views/ProjectList.vue:86-92 with status chips :10-17 and free text search :33-37. The project schema has no category, folder or group property, and the menu src/manifest.json:48-58 lists pages, not projects.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "col-comment-images", @@ -5099,12 +5224,22 @@ "kanboard": "source read at v1.2.54: assets/js/components/screenshot.js:9-10 pasting from the clipboard works but app/Controller/TaskFileController.php:18 screenshot stores it as an attachment; the description editor, app/Helper/FormHelper.php:228, takes Markdown image links only", "jira": "https://confluence.atlassian.com/jirasoftwareserver/attaching-files-and-screenshots-to-issues-939938913.html 'copy a file from your computer and paste it directly in the Create Issue dialog. Make sure that you paste the image outside the Description box': a pasted image becomes an attachment; https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html warns 'Pasting content may not work as expected' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "yes", "kanboard": "partial", - "jira": "partial" + "jira": "partial", + "built": { + "state": "built", + "evidence": "Comments: src/views/TaskDetail.vue:129-137 mounts CnObjectSidebar (notesLabel 'Comments'); nextcloud-vue src/components/CnObjectSidebar/CnNotesTab.vue renders each note as text plus mention spans and has no paste or drop handler for images. Description: display only at src/views/TaskDetail.vue:269, no edit form anywhere [tsk-create-edit].", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/nextcloud-vue" + }, + "provider": "nextcloud-vue", + "providerHow": "read-from-code", + "feature": "task-collaboration", + "featureConfidence": "high" }, { "id": "tsk-templates", @@ -5120,12 +5255,22 @@ "kanboard": "source read at v1.2.54: app/Template/project_predefined_content/show.php:5 'Add predefined task description'; app/Helper/TaskHelper.php:68 offers them in the task form; app/Model/PredefinedTaskDescriptionModel.php stores them; description only, no subtasks or tags", "jira": "https://jira.atlassian.com/browse/JRASERVER-7731 'Template issue', Suggestion, Future Consideration, 440 votes; https://marketplace.atlassian.com/apps/1211044/issue-templates-for-jira paid app Issue Templates for Jira, build 8.7.7 compatible to Jira 11.3.11 (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "partial", "openproject": "partial", "plane": "no", "kanboard": "partial", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No task template and no task create path to apply one to: src/store/projects.js has fetchTask, fetchTasks, updateTaskStatus :835 and updateTask :871, no createTask. The Store page (src/manifest.json:61-71) installs configsets and flows, not task templates.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "brd-move-column", @@ -5141,12 +5286,22 @@ "kanboard": "source read at v1.2.54: app/Template/board/table_column.php:31-41 the column menu offers hide, bulk create and close all; app/Controller/TaskBulkMoveColumnController.php:21 moves within the same project; a task moves to another project one at a time", "jira": "https://confluence.atlassian.com/jirasoftwareserver/editing-multiple-issues-at-the-same-time-939938937.html bulk change moves the tasks ('the Move issue and Bulk change permissions to perform the Bulk move operation'); a column is a status mapping on one board (https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html), so the column itself is not moved or copied (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Columns are the five task statuses, hard-coded at src/utils/taskHelpers.js:252 and mapped at src/views/ProjectBoard.vue:283-291. The per-project column objects written by src/store/projects.js:469 createDefaultColumns are never read back, so there is nothing to move or copy to another project.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "kanban-board", + "featureConfidence": "high" }, { "id": "tsk-all-day-due", @@ -5162,12 +5317,23 @@ "kanboard": "source read at v1.2.54: app/Core/DateParser.php:160-161 a date without time is accepted, but app/Helper/TaskHelper.php:235 renders a datetime field and app/Helper/DateHelper.php:57 always shows a time, midnight for a date only value", "jira": "https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-fields-reference-939938743.html 'Note that the due date relates to the date only (not to the time)' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "yes", "kanboard": "partial", - "jira": "yes" + "jira": "yes", + "built": { + "state": "none", + "evidence": "The data model already stores a whole-day due date [lib/Settings/planninq_register.json:268-272], and src/components/TaskCard.vue:16-21 shows the badge from it, but a user cannot set or change one anywhere [tsk-due-date]. A schema that fits the row is not a screen that delivers it.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "nearCredit": "the date-only dueDate format reads like whole-day due dates, but nothing lets a user set one" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "brd-column-count", @@ -5183,12 +5349,25 @@ "kanboard": "source read at v1.2.54: app/Template/board/table_column.php:11-12 'Task count' in the column header; app/Formatter/BoardColumnFormatter.php:103 nb_tasks", "jira": "https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'In the Column Constraint drop-down, select either Issue Count or Issue Count, excluding sub-tasks. Note, enabling column constraints will show the issue count in each column' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "yes", "nextcloud-deck": "yes", "openproject": "partial", "plane": "yes", "kanboard": "yes", - "jira": "yes" + "jira": "yes", + "built": { + "state": "built", + "evidence": "src/views/ProjectBoard.vue:118-120 {{ tasksByStatus[column.status].length }} -> :303-305 groupTasksByStatus over :320-322 visibleTasks -> src/store/projects.js:775-784 fetchTasks -> OpenRegister /apps/openregister/api/objects/planninq/task filtered by project", + "reachedOn": "ProjectBoard /projects/:id, every column header", + "owner": "ConductionNL/planninq", + "defects": [ + "src/views/ProjectBoard.vue:118 the count span is aria-hidden and the column section's aria-label [:109] is the column name only, so a screen-reader user never hears the count" + ] + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "kanban-board", + "featureConfidence": "high" }, { "id": "prj-team-owner", @@ -5204,12 +5383,23 @@ "kanboard": "source read at v1.2.54: app/Template/project_permission/index.php:13 group permissions; app/Controller/ProjectPermissionController.php:154 addGroup; app/Model/UserModel.php:423-432 removing a user deletes only private projects, team projects stay", "jira": "https://confluence.atlassian.com/adminjiraserver/managing-project-roles-938847166.html roles take groups, so rights stay with a team; but 'Every project has a project lead', one user, and https://confluence.atlassian.com/adminjiraserver/anonymizing-users-992677655.html 'Some items owned by a user, like Project Lead ... You'll need to select a new owner' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "partial", "openproject": "yes", "plane": "partial", "kanboard": "yes", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Owner and members are user ids [lib/Settings/planninq_register.json:478-490]. No group, team or circle can own or join a project [prj-group-share]. When the owner leaves through the leave dialog, ownership passes to the alphabetically first remaining member (lib/Controller/ProjectController.php:288-290), but a deleted account leaves the project with an owner nobody holds.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "liveCheck": "what happens to a project whose owner account is deleted in Nextcloud rather than leaving through the dialog" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "col-federated-share", @@ -5225,12 +5415,22 @@ "kanboard": "source read at v1.2.54: searched app/ for 'federat', 'remote share': none", "jira": "https://confluence.atlassian.com/adminjiraserver/licensing-and-application-access-938846887.html access needs a user in this instance ('If a user has access to an application, they will count as a licensed user') or anonymous access; https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html other Jira servers are reached only as remote issue links over an application link (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "yes", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "Project sharing is the members array of local uids [lib/Settings/planninq_register.json:483], filled by src/components/MemberSearch.vue:112-145 from the local users endpoint. No federated cloud id can be added and nothing talks to another server.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "int-ai-connector", @@ -5246,12 +5446,24 @@ "kanboard": "source read at v1.2.54: searched app/ for 'mcp', 'model context protocol': none; app/Api/Procedure JSON-RPC is the only machine interface", "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 'cloud connectors ... Now, you can set up and manage Rovo and Portfolio Insights connectors in one place': Atlassian's AI assistant Rovo reaches Data Center data through the cloud Admin Hub; no self-hosted standard connector and no write path documented (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "partial", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "built", + "evidence": "src/views/ProjectBoard.vue:587 applyStatusMove -> src/store/projects.js:835-869 updateTaskStatus -> OpenRegister objects API for planninq/task. The MCP objects tool [openregister lib/Mcp/BuiltIn/ObjectsToolProvider.php getTools, listObjects, updateObject; openregister lib/Controller/McpServerController.php] addresses the same objects generically. planninq consumes it only by storing its data in OpenRegister: no planninq-specific tools, and dependency edges written through the tool skip lib/Service/DependencyService.php cycle checks.", + "reachedOn": "OpenRegister MCP endpoint /apps/openregister/api/mcp; no planninq page", + "owner": "ConductionNL/openregister", + "consumesSibling": "indirectly: the tasks live in OpenRegister, planninq adds no tools", + "liveCheck": "confirm an MCP client can list and update planninq task objects and that the task schema's authorization rules apply to MCP calls" + }, + "provider": "openregister", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "medium" }, { "id": "col-live-docs", @@ -5267,12 +5479,24 @@ "kanboard": "source read at v1.2.54: searched app/ and assets/js for 'collaborat', 'websocket', 'yjs': none", "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Confluence is a content creation and collaboration platform': shared documents are a separate product and licence; Jira has issue fields, not live documents (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "partial", "nextcloud-deck": "no", "openproject": "yes", "plane": "partial", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "built", + "evidence": "src/views/TaskDetail.vue:129-137 CnObjectSidebar with filesLabel 'Attachments' -> src/utils/taskHelpers.js:50-60 taskCollaborationSidebarConfig -> OpenRegister per-object files API; nextcloud-vue src/components/CnObjectSidebar/CnFilesTab.vue opens a file in the Viewer or links 'Show in Files'. Real-time cursors come from Nextcloud Text or Nextcloud Office when installed, not from planninq.", + "reachedOn": "TaskDetail /projects/:id/tasks/:taskId, Attachments tab, then Nextcloud Text or Office outside planninq", + "owner": "nextcloud/server", + "consumesSibling": "through the attachments tab only", + "liveCheck": "open an attached .md or .docx from the Attachments tab and confirm it lands in a collaborative editor" + }, + "provider": "nextcloud", + "providerHow": "read-from-code", + "feature": "task-collaboration", + "featureConfidence": "low" }, { "id": "col-meeting-actions", @@ -5288,18 +5512,28 @@ "kanboard": "source read at v1.2.54: searched app/ for 'meeting', 'agenda': none", "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html meeting notes and pages live in Confluence, which can turn text into issues ('Specs to issues'); Jira Software has no meeting or agenda object in the docs read (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "no", - "jira": "no" - }, - { - "id": "tsk-readable-key", - "area": "tasks", - "name": "Give each task a readable key made of the project key and a number, such as ABC-123.", - "origin": "changelog", + "jira": "no", + "built": { + "state": "none", + "evidence": "No meeting or agenda object in lib/Settings/planninq_register.json and no page for one in src/manifest.json pages. decidiq owns meetings in the fleet, but planninq neither links to it nor creates tasks from its agenda items.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-collaboration", + "featureConfidence": "high" + }, + { + "id": "tsk-readable-key", + "area": "tasks", + "name": "Give each task a readable key made of the project key and a number, such as ABC-123.", + "origin": "changelog", "originUrl": "https://www.openproject.org/docs/release-notes/17-5-0/", "note": "Demand row mined from openproject (changelog) on 2026-09-26. Also asked for by kanboard: https://github.com/orgs/kanboard/discussions/5544 (featureRequest).", "evidence": { @@ -5309,12 +5543,23 @@ "kanboard": "source read at v1.2.54: app/Template/board/task_private.php:26 cards show a global '#id'; the project identifier exists, app/Model/ProjectModel.php:123, but no per project task number; the request has the most votes of the Ideas category (6)", "jira": "https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'The project key becomes the first part of that project's issue keys, e.g. DDT-1, DDT-2' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "yes", "kanboard": "no", - "jira": "yes" + "jira": "yes", + "built": { + "state": "none", + "evidence": "Schema only: key on task and project, both described as import-preserved values. No key generation, no key on src/components/TaskCard.vue:1-68 or src/views/TaskDetail.vue:262-270, no key field on project create.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "nearCredit": "the schema descriptions promise ABC-123 keys; no code produces or shows them" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "bkl-sprint-goal", @@ -5330,12 +5575,23 @@ "kanboard": "source read at v1.2.54: searched app/Model and app/Template for 'sprint', 'iteration', 'goal': none", "jira": "https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html sprint actions include 'Add sprint goals'; https://confluence.atlassian.com/adminjiraserver/upgrade-matrix-966063322.html 'Sprint goals: add goals to your sprints to let your team know what you want to achieve' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "partial", "kanboard": "no", - "jira": "yes" + "jira": "yes", + "built": { + "state": "none", + "evidence": "The backlog page is an empty state [src/views/ProjectBacklog.vue:24-30], although its manifest note [src/manifest.json:146] describes an ordered task list. No sprint schema exists, so there is nothing to set a goal on.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "nearCredit": "the manifest _note describes a working backlog; the page is a placeholder" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "backlog", + "featureConfidence": "high" }, { "id": "prj-request-approval", @@ -5351,12 +5607,22 @@ "kanboard": "source read at v1.2.54: searched app/Controller/ProjectCreationController.php and app/Model for 'request', 'approv': none; a project is created directly", "jira": "https://confluence.atlassian.com/adminjiraserver/creating-a-project-938846813.html 'creating and configuring a project is done by an administrator': no request form or review step before a project exists; request forms are Jira Service Management, a separate licence (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "Create path: src/dialogs/ProjectCreationDialog.vue:65-75 submit -> src/store/projects.js:328 createProject -> POST /apps/planninq/api/projects -> lib/Controller/ProjectController.php create, which stores the project immediately. No request status, no reviewer and no guided intake form. The creation policy [prj-create-policy] restricts WHO may create, it does not route a request to someone.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "bkl-planning-poker", @@ -5372,12 +5638,22 @@ "kanboard": "source read at v1.2.54: searched app/ for 'poker': none", "jira": "https://marketplace.atlassian.com/apps/700473/agile-poker-for-jira-planning-estimation paid app Agile Poker for Jira, build 6.1.0-jira-11 compatible to Jira 11.3.11: 'Run Planning Poker-style or async Wideband Delphi sessions'; Jira itself only stores the estimate (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No estimation session and no story point field on any screen. The only estimate a user can enter is the per-task time estimate on src/views/TaskDetail.vue:60-72, entered alone.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "backlog", + "featureConfidence": "high" }, { "id": "tsk-review-approval", @@ -5393,12 +5669,23 @@ "kanboard": "source read at v1.2.54: searched app/ for 'approv', 'reviewer': none in core; column move restrictions per role, app/Controller/ColumnMoveRestrictionController.php, limit who moves a task but name no reviewer", "jira": "https://confluence.atlassian.com/adminjiraserver/advanced-workflow-configuration-938847443.html 'Conditions, check that a transition should be performed by the user', so a close transition can be limited to a reviewer role; https://jira.atlassian.com/browse/JRASERVER-62053 'ability to add approval feature project workflow', Closed, Won't Do; multi-person approval needs https://marketplace.atlassian.com/apps/1223591/workflowwise-parallel-approval-and-workflow-extension (build 2.12.5, Jira 11.3.11) (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Status changes are unguarded moves between the five statuses [src/utils/taskHelpers.js:252]. No reviewer property on the task schema, no approval state, no rule blocking done until someone approves. The 'Review' default column [src/store/projects.js:104-110] is written on project create and never rendered.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "nearCredit": "a 'Review' default column exists in the store, but columns are never shown and nothing gates closing" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "col-edit-conflict", @@ -5414,12 +5701,23 @@ "kanboard": "source read at v1.2.54: searched app/Model/TaskModificationModel.php and app/Controller for 'lock', 'locked_by', 'editing': none; the last save wins", "jira": "https://jira.atlassian.com/browse/JRASERVER-6146 JRASERVER-6146 'Implement issue locking', Suggestion, Gathering Interest, 505 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "built", + "evidence": "OpenRegister: POST /api/objects/{register}/{schema}/{id}/lock and unlock [openregister appinfo/routes.php, development 7367d6d]. planninq: src/views/TaskDetail.vue:420-476 syncLiveSubscription swaps in the fresh task when it changes elsewhere, which is live refresh, not a conflict warning; saveEstimate at :557 writes without a version check.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/openregister", + "consumesSibling": "no: planninq never takes a lock" + }, + "provider": "openregister", + "providerHow": "read-from-code", + "feature": "task-collaboration", + "featureConfidence": "high" }, { "id": "int-automation-edit", @@ -5435,12 +5733,23 @@ "kanboard": "source read at v1.2.54: app/Controller/ActionController.php:18 index, :46 confirm, :65 remove are the only actions on an existing rule; app/Controller/ActionCreationController.php:102 creates new ones", "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 'decide who can create, edit, enable, or disable automation rules': rules are edited in place (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "yes", "nextcloud-deck": "no", "openproject": "no", "plane": "partial", "kanboard": "no", - "jira": "yes" + "jira": "yes", + "built": { + "state": "built", + "evidence": "src/manifest.json:57 menu 'Flows' -> src/manifest.json:223-229 Flows index [rowRoute FlowDetail] -> src/manifest.json:231-236 FlowDetail type flow -> nextcloud-vue src/composables/useFlowStore.js:1772 axios.put /apps/openregister/api/flows/{id} -> openregister appinfo/routes.php:863 flow#update [development 7367d6d]; drafts and versions at openregister appinfo/routes.php:852-858.", + "reachedOn": "Flows /flows [settings menu] -> FlowDetail /flows/:id", + "owner": "ConductionNL/openregister", + "consumesSibling": "yes: planninq mounts the library flow pages from its manifest" + }, + "provider": "openregister", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "medium" }, { "id": "prt-dashboard-order", @@ -5456,12 +5765,22 @@ "kanboard": "source read at v1.2.54: app/Template/project_list/sort_menu.php:5-17 sort by id, name, status, start or end date; searched app/Model for a per user project position: none", "jira": "https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html gadgets on a dashboard 'can be reordered and switched between the left and right columns'; the Projects gadget 'Shows information on various issue filters from a selected project', one project per gadget, so ordering projects means ordering gadgets (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "yes", "kanboard": "partial", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "src/components/DashboardPanels.vue:18-44 renders recentProjects [:102-106, a filter and slice of src/store/projects.js:170 fetchProjects]. No stored per-user order, no drag handle, no favourite or pin.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "dashboard", + "featureConfidence": "high" }, { "id": "plt-rtl", @@ -5477,12 +5796,27 @@ "kanboard": "source read at v1.2.54: ChangeLog:112 'add basic support for right-to-left (RTL) languages' in 1.2.48 (October 2025); app/Template/layout.php:2 dir rtl; app/Model/LanguageModel.php:205 isRtlLanguage", "jira": "https://jira.atlassian.com/browse/JRASERVER-15355 'Add Support for Right to Left Languages', Suggestion, Gathering Interest, 111 votes; https://confluence.atlassian.com/adminjiraserver/choosing-a-default-language-938847001.html default languages list no Arabic or Hebrew (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "partial", "nextcloud-deck": "partial", "openproject": "partial", "plane": "no", "kanboard": "yes", - "jira": "no" + "jira": "no", + "built": { + "state": "built", + "evidence": "Layout: logical CSS throughout, e.g. src/components/TaskCard.vue:285, src/views/ProjectTimeline.vue:503 and :535, and no physical margin or padding in src/. Strings: every UI string goes through t('planninq', ...) installed at src/main.js:178, with catalogues in l10n/ for 37 languages, none of them right-to-left. Timeline: src/views/ProjectTimeline.vue:57, :67 and :101 position ticks, today marker and bars with style left.", + "reachedOn": "every page, mirrored by Nextcloud when the user's language is RTL, with English strings", + "owner": "ConductionNL/planninq", + "defects": [ + "l10n/ has no ar, he or fa catalogue, so no RTL language is translated", + "src/views/ProjectTimeline.vue:101 bars use a physical left offset, so the Gantt does not mirror" + ], + "liveCheck": "switch a user to Arabic and look at the board and the timeline" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "medium" }, { "id": "plt-outbound-guard", @@ -5498,12 +5832,23 @@ "kanboard": "source read at v1.2.54: ChangeLog:67 SSRF protection for webhooks in 1.2.51, :95 private network block for external links in 1.2.49; app/Notification/WebhookNotification.php:42 refuses private URLs; app/constants.php:190,193 opt-in overrides", "jira": "https://confluence.atlassian.com/adminjiraserver/configuring-the-allowlist-1014667309.html 'Jira admins can allow incoming and outgoing connections and content from specified sources by adding URLs to the allowlist'; the page names gadgets and application links, not webhooks, and no rule against internal addresses (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "yes", "nextcloud-deck": "partial", "openproject": "yes", "plane": "yes", "kanboard": "yes", - "jira": "partial" + "jira": "partial", + "built": { + "state": "built", + "evidence": "src/views/ProjectBoard.vue:587 applyStatusMove -> src/store/projects.js:835 updateTaskStatus -> OpenRegister object update -> OpenRegister WebhookEventListener -> openregister lib/Service/WebhookService.php initializeHttpClient, where assertSafeWebhookUri gates the URL and the on_redirect callback re-checks every hop [development 7367d6d]. planninq's lib/ holds no HTTP client, so it opens no second path.", + "reachedOn": "OpenRegister webhook delivery for planninq objects; planninq itself sends nothing out", + "owner": "ConductionNL/openregister", + "consumesSibling": "yes, by storing its objects in OpenRegister" + }, + "provider": "openregister", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "medium" }, { "id": "tsk-diagrams", @@ -5519,12 +5864,22 @@ "kanboard": "source read at v1.2.54: searched app/ and assets/js for 'mermaid', 'plantuml', 'drawio': none in core", "jira": "https://marketplace.atlassian.com/apps/1211413/draw-io-diagrams-for-jira paid app draw.io Diagrams for Jira, build 11.1.3 compatible to Jira 11.3.11: 'create a wide variety of helpful diagrams and attach them to your Jira issues'; no diagram editor in the product (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No diagram editor or renderer, no rich description editor [tsk-rich-text], no wiki [prj-wiki].", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "plt-ai-assist", @@ -5540,12 +5895,24 @@ "kanboard": "source read at v1.2.54: searched app/ for 'assistant', 'llm', 'openai': none", "jira": "https://marketplace.atlassian.com/apps/1230009/issue-ai-analytics-for-jira-cloud-private-ai paid app, build 11.1.11 compatible to Jira 11.3.11: 'You can also integrate your Private AI with Private AI mode'; Atlassian's own Rovo reaches Data Center only through cloud connectors (11.3 release notes) (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "partial", "nextcloud-deck": "no", "openproject": "no", "plane": "partial", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "built", + "evidence": "src/views/TaskDetail.vue:129-137 CnObjectSidebar -> src/utils/taskHelpers.js:50-60 taskCollaborationSidebarConfig -> nextcloud-vue CnNotesTab NcRichContenteditable with the default '/' smart picker. The AI comes from the Nextcloud Assistant app and whatever model the admin configures; planninq adds no AI action on tasks.", + "reachedOn": "TaskDetail /projects/:id/tasks/:taskId, Comments tab, '/' picker, only when Nextcloud Assistant is installed", + "owner": "nextcloud/server", + "consumesSibling": "only through the library comment composer", + "liveCheck": "with Assistant installed, type '/' in a task comment and confirm the text generation picker appears" + }, + "provider": "nextcloud", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "low" }, { "id": "int-pages-api", @@ -5561,12 +5928,22 @@ "kanboard": "source read at v1.2.54: searched app/Api/Procedure for 'page', 'wiki', 'document': none; core has no documentation pages", "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html documentation pages are Confluence, a separate product; https://developer.atlassian.com/server/jira/platform/rest/v11000/intro the Jira REST API (432 operations) covers issues, projects and boards, no pages (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "No page or wiki schema in lib/Settings/planninq_register.json, so neither planninq's routes [appinfo/routes.php:10-38] nor OpenRegister's objects API carry documentation pages for it.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "high" }, { "id": "prj-wiki-tree", @@ -5582,12 +5959,22 @@ "kanboard": "source read at v1.2.54: searched app/ for 'wiki', 'subpage': none in core; a wiki is a third party plugin", "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-jira-applications-with-confluence-939938870.html 'Confluence spaces are great for creating and organizing' pages: page trees are Confluence, a separate product and licence, not Jira (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "src/manifest.json:53 Documentation menu entry is an href to the product docs site. No in-app page model.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "high" }, { "id": "plt-2fa", @@ -5603,12 +5990,23 @@ "kanboard": "source read at v1.2.54: app/Auth/TotpAuth.php:17 time based one time codes in core, app/Template/user_view/sidebar.php:63-64 two factor page; searched app/ for 'webauthn', 'fido', 'passkey': none, which is what the request asks for", "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-10-2-x-release-notes-1455425728.html 'You can now set up two-step verification and verify your identity with an authentication app when you log in'; enforcing it for everyone is open request JRASERVER-78553 (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "yes", "nextcloud-deck": "partial", "openproject": "yes", "plane": "no", "kanboard": "partial", - "jira": "yes" + "jira": "yes", + "built": { + "state": "built", + "evidence": "src/App.vue:21-27 CnAppRoot inside the logged-in Nextcloud page -> src/store/modules/settings.js:37 requesttoken header -> lib/Controller/SettingsController.php:148 userSession->getUser(). A second factor such as TOTP is enforced by Nextcloud's two-factor providers before any app page loads.", + "reachedOn": "Nextcloud login, with a two-factor provider enabled by the admin", + "owner": "nextcloud/server", + "consumesSibling": "yes: planninq relies on the Nextcloud session" + }, + "provider": "nextcloud", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "high" }, { "id": "prj-shared-workflow", @@ -5624,12 +6022,23 @@ "kanboard": "source read at v1.2.54: app/Controller/TagController.php:15 global tags, app/Model/TagModel.php:56 project_id 0; app/Template/config/project.php:11 default columns for new projects, used at app/Model/BoardModel.php:34, copied once, not shared afterwards", "jira": "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html 'Sometimes you may wish to share schemes among your projects, so that editing one scheme changes that scheme in several projects at once. You can select Create with shared configuration' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "partial", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "partial", - "jira": "yes" + "jira": "yes", + "built": { + "state": "built", + "evidence": "Statuses: src/utils/taskHelpers.js:252 -> src/views/ProjectBoard.vue:283-291 on every board. Labels: src/views/settings/Settings.vue:152-198 -> src/store/labels.js:78-105 createLabel -> OpenRegister planninq/label objects; boards read them at src/views/ProjectBoard.vue:424-429 -> src/store/projects.js:806-833 fetchLabels. Shared by construction, not by choice: the statuses cannot be edited and labels cannot be scoped to some projects.", + "reachedOn": "every ProjectBoard /projects/:id; labels managed in the admin settings page", + "owner": "ConductionNL/planninq", + "gap": "one global set only, statuses not configurable, no estimate scale" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "projects", + "featureConfidence": "medium" }, { "id": "brd-filter-exclude", @@ -5645,12 +6054,22 @@ "kanboard": "source read at v1.2.54: app/Core/Filter/Lexer.php:28-34 no negation token in the search syntax; app/Filter/TaskAssigneeFilter.php:61-67 offers me, nobody and anybody only; app/Filter/TaskIdExclusionFilter.php:24 is an internal filter for task autocomplete, app/Controller/TaskAjaxController.php:39", "jira": "https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-operators-reference-939938745.html 'The != operator is used to search for issues where the value of a specified field doesn't match'; board quick filters are JQL (https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html), e.g. assignee != currentUser() (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "partial", "kanboard": "no", - "jira": "yes" + "jira": "yes", + "built": { + "state": "none", + "evidence": "filterTasksByLabel [src/utils/labelHelpers.js:174-180] returns every task or those WITH the label. No exclusion operator and no other filter dimension on the board.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "kanban-board", + "featureConfidence": "high" }, { "id": "plt-command-palette", @@ -5666,12 +6085,22 @@ "kanboard": "source read at v1.2.54: assets/js/components/keyboard-shortcuts.js:28-63 '?' help, 'b' board switcher, 's' search, 'n' new task; app/Template/config/keyboard_shortcuts.php lists them; no palette that runs arbitrary actions", "jira": "https://confluence.atlassian.com/jirasoftwareserver/using-keyboard-shortcuts-939938977.html 'Keyboard shortcuts are a great way ... for performing actions without having to take your fingers off the keyboard'; the issue Operations Dialog opens with a dot (named in https://jira.atlassian.com/browse/JRASERVER-23222); no app-wide command palette is documented (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "partial", "openproject": "partial", "plane": "yes", "kanboard": "partial", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No command palette and no global shortcuts. Nextcloud's unified search is a platform search of objects, not an action runner, and planninq registers no actions in it [col-unified-search].", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "high" }, { "id": "bkl-intake-triage", @@ -5687,12 +6116,22 @@ "kanboard": "source read at v1.2.54: searched app/ for 'triage', 'intake', 'inbox': none in core", "jira": "https://confluence.atlassian.com/adminjiraserver/creating-issues-and-comments-from-email-938847641.html 'Jira can receive emails from licensed users to create issues'; https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html issues move from Backlog to 'Selected for development': a triage status can be modelled, but there is no request queue with accept or decline; that is Jira Service Management (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "yes", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No intake schema in lib/Settings/planninq_register.json, no triage page in src/manifest.json pages, and tasks cannot be created in the UI [tsk-create-edit], so nothing can arrive to triage.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "backlog", + "featureConfidence": "high" }, { "id": "tsk-estimate-rollup", @@ -5708,12 +6147,22 @@ "kanboard": "source read at v1.2.54: app/Template/task/details.php:98-101 time estimated on the task; app/Model/SubtaskTimeTrackingModel.php:280-287 SUM of subtask time_estimated written to the task, called from app/Model/SubtaskModel.php:219", "jira": "JSWSERVER-9167 'Provide ability to automatically sum estimates from sub-tasks in user stories', Future Consideration, 1993 votes; https://confluence.atlassian.com/jirasoftwareserver/logging-work-on-issues-939938944.html 'Choosing to include sub-tasks displays the aggregated time': hours roll up, story points do not (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "yes", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "No parent and child tasks on any screen, and no sum of child estimates. The progress line at src/views/TaskDetail.vue:76-88 compares the task's own logged time with its own estimate.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "time-tracking", + "featureConfidence": "high" }, { "id": "col-threaded-comments", @@ -5729,12 +6178,22 @@ "kanboard": "source read at v1.2.54: searched app/Model/CommentModel.php for 'parent', 'reply': none; comments are a flat list", "jira": "https://jira.atlassian.com/browse/JRASERVER-3406 JRASERVER-3406 'Threaded Comments', Suggestion, Future Consideration, 1017 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "yes", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "built", + "evidence": "src/views/TaskDetail.vue:129-137 -> src/utils/taskHelpers.js:50-60 -> nextcloud-vue src/components/CnObjectSidebar/CnNotesTab.vue, a single NcListItem per note with no reply or thread. The flat list is built; threading is not.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/nextcloud-vue" + }, + "provider": "nextcloud-vue", + "providerHow": "read-from-code", + "feature": "task-collaboration", + "featureConfidence": "high" }, { "id": "tsk-clone-tree", @@ -5750,12 +6209,22 @@ "kanboard": "source read at v1.2.54: app/Template/task/dropdown.php:48 'Duplicate'; app/Model/TaskDuplicationModel.php:164 copies subtasks and :59 tags; child tasks joined by links are not copied", "jira": "JSWSERVER-7721 'When cloning an Epic, add the option to clone the linked Stories as well', Future Consideration, 1295 votes; https://confluence.atlassian.com/jirasoftwareserver/creating-issues-and-sub-tasks-939938925.html 'Clone sub-tasks to copy existing sub-tasks' (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "partial", - "jira": "partial" + "jira": "partial", + "built": { + "state": "none", + "evidence": "Neither the board card menu [src/views/ProjectBoard.vue:152-165, move targets only] nor the task detail page offers copy. No hierarchy to copy [tsk-subtasks].", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "col-group-mention", @@ -5771,12 +6240,25 @@ "kanboard": "source read at v1.2.54: app/Job/UserMentionJob.php:57-61 resolves @username to single users; searched it for 'group': none", "jira": "https://jira.atlassian.com/browse/JRASERVER-28225 JRASERVER-28225 'Mentions of groups', Suggestion, Future Consideration, 910 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "built", + "evidence": "src/views/TaskDetail.vue:129-137 listens only to update:open [:137]; nextcloud-vue CnNotesTab suggests users, not groups or teams, and emits a mention event nobody handles. No group expansion anywhere.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/nextcloud-vue", + "defects": [ + "src/views/TaskDetail.vue:129-137 has no @mention handler, so mentions never notify [same defect as tsk-mentions]" + ] + }, + "provider": "nextcloud-vue", + "providerHow": "read-from-code", + "feature": "task-collaboration", + "featureConfidence": "high" }, { "id": "tim-work-type", @@ -5792,12 +6274,22 @@ "kanboard": "source read at v1.2.54: app/Model/SubtaskTimeTrackingModel.php:263 tracks hours per subtask with no type; searched app/Model for 'activity type', 'work type': none", "jira": "https://jira.atlassian.com/browse/JRASERVER-1780 JRASERVER-1780 'Add type of work in Log work', Suggestion, Not Being Considered, 773 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "yes", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "Write path: src/views/TaskDetail.vue:91 -> src/dialogs/TimeEntryDialog.vue:7-32 -> src/store/timeEntries.js:149 create, payload task, duration, date, description. No work type field in dialog or schema.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "time-tracking", + "featureConfidence": "high" }, { "id": "tsk-merge", @@ -5813,12 +6305,26 @@ "kanboard": "source read at v1.2.54: app/Schema/Sqlite.php:964-965 'duplicates' and 'is duplicated by' links only; searched app/Controller and app/Model for 'merge' of tasks: none", "jira": "https://jira.atlassian.com/browse/JRASERVER-3592 JRASERVER-3592 'Merging of issues', Suggestion, Future Consideration, 533 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "The 'duplicates' enum value is a declaration, and even the blocks-editor that could set links is unmounted [grep for TaskDependencies across src/ finds only its own file]. No merge in src/ or lib/.", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq", + "nearCredit": "a 'duplicates' dependency type in the schema", + "defects": [ + "src/components/TaskDependencies.vue is mounted by no view, so dependency editing is unreachable [already recorded on pln-dependencies]" + ] + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "tsk-duplicate-warning", @@ -5834,12 +6340,22 @@ "kanboard": "source read at v1.2.54: searched app/Controller/TaskCreationController.php and assets/js for 'similar', 'duplicate' checks: none", "jira": "https://jira.atlassian.com/browse/JRASERVER-1633 JRASERVER-1633 'find similar feature to prevent creating duplicate issue', Suggestion, Gathering Interest, 175 votes (tracker REST API, read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "no", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "no", - "jira": "no" + "jira": "no", + "built": { + "state": "none", + "evidence": "Without a create path there is no point at which similar tasks could be suggested [tsk-create-edit].", + "reachedOn": "nothing reaches it", + "owner": "ConductionNL/planninq" + }, + "provider": "planninq", + "providerHow": "read-from-code", + "feature": "task-detail", + "featureConfidence": "high" }, { "id": "int-automation-guard", @@ -5855,12 +6371,24 @@ "kanboard": "source read at v1.2.54: app/ServiceProvider/AuthenticationProvider.php:80-82 only project managers may create automatic actions, one gate for every action; no per action restriction on the powerful ones", "jira": "https://confluence.atlassian.com/jirasoftware/jira-software-11-3-x-release-notes-1689288832.html 11.3 release notes 'Starting from Jira 11.3.3, you can use automation restrictions to decide who can create, edit, enable, or disable automation rules that use specific components'; 11.3.3 released 5 March 2026 (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "partial", "nextcloud-deck": "no", "openproject": "no", "plane": "no", "kanboard": "partial", - "jira": "yes" + "jira": "yes", + "built": { + "state": "built", + "evidence": "src/manifest.json:57 Flows menu -> src/manifest.json:223-236 Flows index and FlowDetail -> openregister lib/Controller/FlowController.php:167-182 denyUnless on named rights, :192-197 callerIsAdmin fails closed, :256 admins get the full catalog and others the user scope [development 7367d6d]. The docblock at :155-159 says the four rights are seeded @authenticated for an admin to tighten.", + "reachedOn": "Flows /flows [settings menu] -> FlowDetail /flows/:id", + "owner": "ConductionNL/openregister", + "consumesSibling": "yes, through the library flow pages", + "liveCheck": "find where an admin tightens the flow rights and confirm a non-admin planninq user sees the reduced node palette" + }, + "provider": "openregister", + "providerHow": "read-from-code", + "feature": "integrations", + "featureConfidence": "medium" }, { "id": "plt-security-insights", @@ -5876,12 +6404,23 @@ "kanboard": "source read at v1.2.54: searched app/Controller/ConfigController.php and app/Template/config for 'security', 'health', 'check': none", "jira": "https://www.atlassian.com/roadmap/data-center roadmap 'Security insights Get centralised, instance-level security insights for your Confluence and Jira Data Center in Admin Hub ... Released Q3 2026': it runs through the cloud Admin Hub, so a buyer without a cloud connection does not get it (read 2026-09-26)" }, - "planninq": "unknown", + "planninq": "yes", "nextcloud-deck": "partial", "openproject": "partial", "plane": "no", "kanboard": "no", - "jira": "partial" + "jira": "partial", + "built": { + "state": "built", + "evidence": "appinfo/info.xml:202-205 registers lib/Settings/AdminSettings.php in Nextcloud Administration, rendered by src/views/settings/AdminRoot.vue:1-19. The overview of installation risks with suggested fixes is Nextcloud's Administration Overview [Security and setup warnings], a platform page. planninq contributes nothing to it, so a planninq-specific risk such as a register made public would not be listed there.", + "reachedOn": "Nextcloud Administration, Overview", + "owner": "nextcloud/server", + "consumesSibling": "platform page only; planninq registers no setup check" + }, + "provider": "nextcloud", + "providerHow": "read-from-code", + "feature": "platform", + "featureConfidence": "medium" } ], "pending": [