From 203c2bf3d6cb719f8dbea7219e58ec615dd962b8 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Mon, 12 Oct 2026 14:30:53 +0000 Subject: [PATCH 1/8] feat(metamodel): update dec_rec type with complete mandatory attributes - Add mandatory 'id' attribute with pattern validation - Add mandatory 'version' attribute - Make 'tracking' mandatory with eclipse-score/score issue URL pattern - Make 'consequences' mandatory - Constrain 'affects' link to requirement types only - Update tool_req__docs_dec_rec_type to version 2 - Update test file with new mandatory attributes --- docs/internals/requirements/requirements.rst | 13 ++++++++----- src/extensions/score_metamodel/metamodel.yaml | 14 ++++++++------ .../tests/rst/options/test_dec_rec.rst | 6 ++++++ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/docs/internals/requirements/requirements.rst b/docs/internals/requirements/requirements.rst index 5d0796475..3d405b1a4 100644 --- a/docs/internals/requirements/requirements.rst +++ b/docs/internals/requirements/requirements.rst @@ -1019,21 +1019,24 @@ Testing .. tool_req:: Decision Record Type :id: tool_req__docs_dec_rec_type :tags: Process / Other - :version: 1 + :version: 2 :implemented: YES :satisfies: gd_req__process_management_build_blocks_attr[version==1], gd_req__process_management_build_blocks_link[version==1], - Docs-as-Code shall support the Decision Record (dec_rec) need type with the following options: + Docs-as-Code shall support the Decision Record (dec_rec) need type with the following mandatory options: + * ``id`` (mandatory, pattern: ``dec_rec____``) * ``status`` (mandatory, one of: proposed, accepted, deprecated, rejected, superseded) * ``context`` (mandatory) * ``decision`` (mandatory) - * ``consequences`` (optional) - * ``tracking`` (optional, link to a GitHub issue) + * ``tracking`` (mandatory, link to a GitHub issue at https://github.com/eclipse-score/score/issues/) + * ``version`` (mandatory) + * ``consequences`` (mandatory) - A Decision Record shall be able to link to other needs via the optional ``affects`` link. + A Decision Record shall be able to link to other needs via the optional ``affects`` link + (allowed targets: stkh_req, feat_req, comp_req, tool_req, aou_req, gd_req). .. tool_req:: Restrict needextend usage diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index d4854b4e1..5c988f8b8 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1048,14 +1048,16 @@ needs_types: dec_rec: title: Decision Record mandatory_options: + id: ^dec_rec__(Platform|Feature|Component|arch|proc|strat|infra|int)__[0-9a-zA-Z_-]+$ status: ^(proposed|accepted|deprecated|rejected|superseded)$ - context: ^.+$ - decision: ^.+$ - optional_options: - consequences: ^.*$ - tracking: ^https://github\.com/[^/]+/[^/]+/issues/\d+$ + context: ^[\s\S]+$ + decision: ^[\s\S]+$ + tracking: ^https://github\.com/eclipse-score/score/issues/\d+$ + version: ^[0-9]+$ + consequences: ^[\s\S]+$ optional_links: - affects: ANY + affects: stkh_req, feat_req, comp_req, tool_req, aou_req, gd_req + parts: 3 # Extra link types, which shall be available and allow need types to be linked to each other. # We use a dedicated linked type for each type of a connection, for instance from diff --git a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst index f60175998..4a21e33ad 100644 --- a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst +++ b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst @@ -27,6 +27,9 @@ :status: accepted :context: A decision record is needed for the test. :decision: Use a dedicated decision record need type. + :tracking: https://github.com/eclipse-score/score/issues/123 + :version: 1 + :consequences: Provides traceability for decisions. :affects: dec_rec__test__decision_record_2 @@ -35,3 +38,6 @@ :status: proposed :context: This decision record is affected by another decision. :decision: Keep the relationship explicit. + :tracking: https://github.com/eclipse-score/score/issues/456 + :version: 1 + :consequences: Allows linking between related decisions. From 62951d4a66b4d9f5e2f6cb93c303eb70add0dbf9 Mon Sep 17 00:00:00 2001 From: FScholPer Date: Tue, 13 Oct 2026 07:43:56 +0000 Subject: [PATCH 2/8] fix(metamodel): remove duplicate version option from dec_rec The version option is already defined in global_base_opts.mandatory_options, causing an overlap error. Remove the duplicate from dec_rec directive. --- src/extensions/score_metamodel/metamodel.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index 5c988f8b8..ce9d13d12 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1053,7 +1053,6 @@ needs_types: context: ^[\s\S]+$ decision: ^[\s\S]+$ tracking: ^https://github\.com/eclipse-score/score/issues/\d+$ - version: ^[0-9]+$ consequences: ^[\s\S]+$ optional_links: affects: stkh_req, feat_req, comp_req, tool_req, aou_req, gd_req From 297143845d64313c7ab2654db834cdde4549c8ed Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Thu, 15 Oct 2026 13:03:30 +0000 Subject: [PATCH 3/8] extended to allow also prs not only issues --- docs/internals/requirements/requirements.rst | 2 +- src/extensions/score_metamodel/metamodel.yaml | 2 +- .../score_metamodel/tests/rst/options/test_dec_rec.rst | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/internals/requirements/requirements.rst b/docs/internals/requirements/requirements.rst index 5d0796475..64e223d66 100644 --- a/docs/internals/requirements/requirements.rst +++ b/docs/internals/requirements/requirements.rst @@ -1031,7 +1031,7 @@ Testing * ``context`` (mandatory) * ``decision`` (mandatory) * ``consequences`` (optional) - * ``tracking`` (optional, link to a GitHub issue) + * ``tracking`` (optional, link to a GitHub issue or pull request in the ``eclipse-score`` organization) A Decision Record shall be able to link to other needs via the optional ``affects`` link. diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index d4854b4e1..f49434c2d 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1053,7 +1053,7 @@ needs_types: decision: ^.+$ optional_options: consequences: ^.*$ - tracking: ^https://github\.com/[^/]+/[^/]+/issues/\d+$ + tracking: ^https://github\.com/eclipse-score/[^/]+/(?:issues|pull)/\d+$ optional_links: affects: ANY diff --git a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst index f60175998..5af135f34 100644 --- a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst +++ b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst @@ -18,8 +18,8 @@ :test_type: requirements_based :derivation_technique: requirements_based - Tests that the dec_rec need type with its mandatory attributes and the - affects link is supported. + Tests that the dec_rec need type supports its mandatory attributes and affects + link, and that its tracking option accepts GitHub issue and pull request links. .. dec_rec:: Test Decision Record 1 @@ -27,6 +27,8 @@ :status: accepted :context: A decision record is needed for the test. :decision: Use a dedicated decision record need type. + :tracking: https://github.com/eclipse-score/docs-as-code/issues/1 + :expect_not: dec_rec__test__decision_record_1.tracking (https://github.com/eclipse-score/docs-as-code/issues/1): does not follow pattern :affects: dec_rec__test__decision_record_2 @@ -35,3 +37,5 @@ :status: proposed :context: This decision record is affected by another decision. :decision: Keep the relationship explicit. + :tracking: https://github.com/eclipse-score/score/pull/2 + :expect_not: dec_rec__test__decision_record_2.tracking (https://github.com/eclipse-score/score/pull/2): does not follow pattern From 367e3ef8b9d34fa632963b63cb90db1b92e4f895 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Thu, 15 Oct 2026 13:49:13 +0000 Subject: [PATCH 4/8] fix(metamodel): preserve decision record compatibility --- docs/internals/requirements/requirements.rst | 11 ++-- src/extensions/score_metamodel/__init__.py | 6 ++- src/extensions/score_metamodel/metamodel.yaml | 9 ++-- .../tests/rst/options/test_dec_rec.rst | 38 ++++++++++--- .../tests/test_metamodel_load.py | 53 ++++++++++++++++++- 5 files changed, 99 insertions(+), 18 deletions(-) diff --git a/docs/internals/requirements/requirements.rst b/docs/internals/requirements/requirements.rst index c0d5b3900..8ffe1ad6f 100644 --- a/docs/internals/requirements/requirements.rst +++ b/docs/internals/requirements/requirements.rst @@ -1025,18 +1025,17 @@ Testing gd_req__process_management_build_blocks_attr[version==1], gd_req__process_management_build_blocks_link[version==1], - Docs-as-Code shall support the Decision Record (dec_rec) need type with the following mandatory options: + Docs-as-Code shall support the Decision Record (dec_rec) need type with the following options: - * ``id`` (mandatory, pattern: ``dec_rec____``) + * ``id`` (mandatory, pattern: ``dec_rec____``; category is case-insensitive) * ``status`` (mandatory, one of: proposed, accepted, deprecated, rejected, superseded) * ``context`` (mandatory) * ``decision`` (mandatory) - * ``tracking`` (mandatory, link to a GitHub issue or pull request in the ``eclipse-score`` organization) + * ``tracking`` (optional, link to a GitHub issue or pull request in the ``eclipse-score`` organization) * ``version`` (mandatory) - * ``consequences`` (mandatory) + * ``consequences`` (optional) - A Decision Record shall be able to link to other needs via the optional ``affects`` link - (allowed targets: stkh_req, feat_req, comp_req, tool_req, aou_req, gd_req). + A Decision Record shall be able to link to other needs via the optional ``affects`` link. .. tool_req:: Restrict needextend usage diff --git a/src/extensions/score_metamodel/__init__.py b/src/extensions/score_metamodel/__init__.py index 88db2a044..c39b35f09 100644 --- a/src/extensions/score_metamodel/__init__.py +++ b/src/extensions/score_metamodel/__init__.py @@ -39,6 +39,10 @@ logger = logging.get_logger(__name__) env = Environment() +GITHUB_TRACKING_LINK_REGEX = ( + r"(?Phttps://github\.com/eclipse-score/" + r"(?P[^/]+)/(?:issues|pull)/(?P\d+))" +) local_check_function = Callable[[Sphinx, NeedItem, CheckLogger], None] graph_check_function = Callable[[Sphinx, NeedsView, CheckLogger], None] @@ -282,7 +286,7 @@ def setup(app: Sphinx) -> dict[str, str | bool]: app.config.needs_string_links.setdefault( "github_issue_linker", { - "regex": r"(?Phttps://github\.com/[^/]+/(?P[^/]+)/issues/(?P\d+))", + "regex": GITHUB_TRACKING_LINK_REGEX, "link_url": "{{url}}", "link_name": "{{repo}}#{{number}}", "options": github_issue_options, diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index 5b87949b0..648f366b2 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1048,14 +1048,15 @@ needs_types: dec_rec: title: Decision Record mandatory_options: - id: ^dec_rec__(Platform|Feature|Component|arch|proc|strat|infra|int)__[0-9a-zA-Z_-]+$ + id: (?i)^dec_rec__(Platform|Feature|Component|arch|proc|strat|infra|int)__[0-9a-zA-Z_-]+$ status: ^(proposed|accepted|deprecated|rejected|superseded)$ context: ^[\s\S]+$ decision: ^[\s\S]+$ - tracking: ^https://github\.com/eclipse-score/[^/]+/(?:issues|pull)/\d+$ - consequences: ^[\s\S]+$ + optional_options: + tracking: ^https://github\.com/eclipse-score/[^/]+/(?:issues|pull)/\d+(?:#[A-Za-z0-9_-]+)?$ + consequences: ^[\s\S]*$ optional_links: - affects: stkh_req, feat_req, comp_req, tool_req, aou_req, gd_req + affects: ANY parts: 3 # Extra link types, which shall be available and allow need types to be linked to each other. diff --git a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst index a5b961efe..1826982f7 100644 --- a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst +++ b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst @@ -14,7 +14,7 @@ .. test_metadata:: Test Decision Record Type :id: test_metadata__dec_rec - :partially_verifies_list: tool_req__docs_dec_rec_type + :fully_verifies_list: tool_req__docs_dec_rec_type[version==2] :test_type: requirements_based :derivation_technique: requirements_based @@ -23,23 +23,49 @@ .. dec_rec:: Test Decision Record 1 - :id: dec_rec__test__decision_record_1 + :id: dec_rec__platform__feature_delivery :status: accepted :context: A decision record is needed for the test. :decision: Use a dedicated decision record need type. :tracking: https://github.com/eclipse-score/docs-as-code/issues/1 - :expect_not: dec_rec__test__decision_record_1.tracking (https://github.com/eclipse-score/docs-as-code/issues/1): does not follow pattern :version: 1 :consequences: Provides traceability for decisions. :affects: dec_rec__test__decision_record_2 .. dec_rec:: Test Decision Record 2 - :id: dec_rec__test__decision_record_2 + :id: dec_rec__feature__follow_up :status: proposed :context: This decision record is affected by another decision. :decision: Keep the relationship explicit. - :tracking: https://github.com/eclipse-score/score/pull/2 - :expect_not: dec_rec__test__decision_record_2.tracking (https://github.com/eclipse-score/score/pull/2): does not follow pattern + :tracking: https://github.com/eclipse-score/score/pull/2#discussion_r3 + :expect_not: dec_rec__test__decision_record_2.tracking (https://github.com/eclipse-score/score/pull/2#discussion_r3): does not follow pattern :version: 1 :consequences: Allows linking between related decisions. + + +.. dec_rec:: Decision Record without optional tracking or consequences + :id: dec_rec__component__no_tracking + :status: accepted + :context: Tracking and consequences are optional for existing decisions. + :decision: Preserve backward compatibility. + :version: 1 + :expect_not: does not follow pattern + + +.. dec_rec:: Decision Record with invalid tracking organization + :id: dec_rec__arch__invalid_tracking_org + :status: accepted + :context: Tracking links must belong to the eclipse-score organization. + :decision: Reject links owned by other organizations. + :tracking: https://github.com/other-org/score/pull/3 + :version: 1 + :expect: dec_rec__arch__invalid_tracking_org.tracking (https://github.com/other-org/score/pull/3): does not follow pattern + + +.. dec_rec:: Decision Record with missing status + :id: dec_rec__proc__missing_status + :context: The status is missing. + :decision: Required fields remain enforced. + :version: 1 + :expect: dec_rec__proc__missing_status: is missing required attribute: `status`. diff --git a/src/extensions/score_metamodel/tests/test_metamodel_load.py b/src/extensions/score_metamodel/tests/test_metamodel_load.py index 501ab313a..52fc2f9e9 100644 --- a/src/extensions/score_metamodel/tests/test_metamodel_load.py +++ b/src/extensions/score_metamodel/tests/test_metamodel_load.py @@ -10,16 +10,67 @@ # # SPDX-License-Identifier: Apache-2.0 # ******************************************************************************* +import re from pathlib import Path from unittest.mock import mock_open, patch import pytest from attribute_plugin import add_test_properties # type: ignore[import-untyped] -from score_metamodel import ProhibitedWordCheck, load_metamodel_data +from score_metamodel import ( + GITHUB_TRACKING_LINK_REGEX, + ProhibitedWordCheck, + load_metamodel_data, +) MODEL_DIR = Path(__file__).absolute().parent / "model" +@pytest.mark.parametrize( + ("url", "expected_url", "expected_repo", "expected_number"), + [ + ( + "https://github.com/eclipse-score/docs-as-code/issues/1", + "https://github.com/eclipse-score/docs-as-code/issues/1", + "docs-as-code", + "1", + ), + ( + "https://github.com/eclipse-score/score/pull/2", + "https://github.com/eclipse-score/score/pull/2", + "score", + "2", + ), + ( + "https://github.com/eclipse-score/score/pull/2#discussion_r3", + "https://github.com/eclipse-score/score/pull/2", + "score", + "2", + ), + ], +) +def test_github_tracking_link_regex_matches_issue_pr_and_review_urls( + url: str, expected_url: str, expected_repo: str, expected_number: str +) -> None: + match = re.search(GITHUB_TRACKING_LINK_REGEX, url) + + assert match is not None + assert match.groupdict() == { + "url": expected_url, + "repo": expected_repo, + "number": expected_number, + } + + +def test_github_tracking_link_regex_rejects_other_organizations() -> None: + assert ( + re.search( + GITHUB_TRACKING_LINK_REGEX, + "https://github.com/other-org/score/pull/2", + ) + is None + ) + + def load_model_data(model_file: str) -> str: print(f"Loading model data from {model_file}") model_path = Path(MODEL_DIR) / model_file From 5436c9d63a82463ab30647cec65090bc43696664 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Thu, 15 Oct 2026 13:54:44 +0000 Subject: [PATCH 5/8] fix(metamodel): scope decision record ID matching --- src/extensions/score_metamodel/metamodel.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index 648f366b2..32139a8d9 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1048,7 +1048,7 @@ needs_types: dec_rec: title: Decision Record mandatory_options: - id: (?i)^dec_rec__(Platform|Feature|Component|arch|proc|strat|infra|int)__[0-9a-zA-Z_-]+$ + id: (?i:^dec_rec__(Platform|Feature|Component|arch|proc|strat|infra|int)__[0-9a-zA-Z_-]+$) status: ^(proposed|accepted|deprecated|rejected|superseded)$ context: ^[\s\S]+$ decision: ^[\s\S]+$ From 7313311dbc7e9edbe68f695b9858011f10195d25 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Thu, 15 Oct 2026 14:10:12 +0000 Subject: [PATCH 6/8] fix(metamodel): accept legacy decision record IDs --- docs/internals/requirements/requirements.rst | 2 +- src/extensions/score_metamodel/metamodel.yaml | 2 +- .../score_metamodel/tests/rst/options/test_dec_rec.rst | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/internals/requirements/requirements.rst b/docs/internals/requirements/requirements.rst index 8ffe1ad6f..e7a4afef5 100644 --- a/docs/internals/requirements/requirements.rst +++ b/docs/internals/requirements/requirements.rst @@ -1027,7 +1027,7 @@ Testing Docs-as-Code shall support the Decision Record (dec_rec) need type with the following options: - * ``id`` (mandatory, pattern: ``dec_rec____``; category is case-insensitive) + * ``id`` (mandatory, pattern: ``dec_rec____``; category and slug contain letters, numbers, underscores, or hyphens) * ``status`` (mandatory, one of: proposed, accepted, deprecated, rejected, superseded) * ``context`` (mandatory) * ``decision`` (mandatory) diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index 32139a8d9..8b8a48ca4 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1048,7 +1048,7 @@ needs_types: dec_rec: title: Decision Record mandatory_options: - id: (?i:^dec_rec__(Platform|Feature|Component|arch|proc|strat|infra|int)__[0-9a-zA-Z_-]+$) + id: ^dec_rec__[0-9a-zA-Z_-]+__[0-9a-zA-Z_-]+$ status: ^(proposed|accepted|deprecated|rejected|superseded)$ context: ^[\s\S]+$ decision: ^[\s\S]+$ diff --git a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst index 1826982f7..c437b0ad7 100644 --- a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst +++ b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst @@ -45,7 +45,7 @@ .. dec_rec:: Decision Record without optional tracking or consequences - :id: dec_rec__component__no_tracking + :id: dec_rec__logging__no_tracking :status: accepted :context: Tracking and consequences are optional for existing decisions. :decision: Preserve backward compatibility. @@ -54,7 +54,7 @@ .. dec_rec:: Decision Record with invalid tracking organization - :id: dec_rec__arch__invalid_tracking_org + :id: dec_rec__dac__invalid_tracking_org :status: accepted :context: Tracking links must belong to the eclipse-score organization. :decision: Reject links owned by other organizations. From ca974508bb806591359f70ff388837bd0aad8c2b Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Thu, 15 Oct 2026 14:12:11 +0000 Subject: [PATCH 7/8] test(metamodel): align decision record fixture references --- .../score_metamodel/tests/rst/options/test_dec_rec.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst index c437b0ad7..e723fd27f 100644 --- a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst +++ b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst @@ -30,7 +30,7 @@ :tracking: https://github.com/eclipse-score/docs-as-code/issues/1 :version: 1 :consequences: Provides traceability for decisions. - :affects: dec_rec__test__decision_record_2 + :affects: dec_rec__feature__follow_up .. dec_rec:: Test Decision Record 2 @@ -39,7 +39,7 @@ :context: This decision record is affected by another decision. :decision: Keep the relationship explicit. :tracking: https://github.com/eclipse-score/score/pull/2#discussion_r3 - :expect_not: dec_rec__test__decision_record_2.tracking (https://github.com/eclipse-score/score/pull/2#discussion_r3): does not follow pattern + :expect_not: dec_rec__feature__follow_up.tracking (https://github.com/eclipse-score/score/pull/2#discussion_r3): does not follow pattern :version: 1 :consequences: Allows linking between related decisions. @@ -60,7 +60,7 @@ :decision: Reject links owned by other organizations. :tracking: https://github.com/other-org/score/pull/3 :version: 1 - :expect: dec_rec__arch__invalid_tracking_org.tracking (https://github.com/other-org/score/pull/3): does not follow pattern + :expect: dec_rec__dac__invalid_tracking_org.tracking (https://github.com/other-org/score/pull/3): does not follow pattern .. dec_rec:: Decision Record with missing status From 716a81a482566f8095c146e1814427d6d053b4f7 Mon Sep 17 00:00:00 2001 From: Frank Scholter Peres Date: Mon, 19 Oct 2026 10:42:08 +0000 Subject: [PATCH 8/8] fix(metamodel): require decision record tracking and consequences --- docs/internals/requirements/requirements.rst | 6 ++--- src/extensions/score_metamodel/metamodel.yaml | 3 +-- .../tests/rst/options/test_dec_rec.rst | 22 +++++++++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/docs/internals/requirements/requirements.rst b/docs/internals/requirements/requirements.rst index b0e96bea8..a18293ac1 100644 --- a/docs/internals/requirements/requirements.rst +++ b/docs/internals/requirements/requirements.rst @@ -1029,15 +1029,15 @@ Testing gd_req__process_management_build_blocks_attr[version==1], gd_req__process_management_build_blocks_link[version==1], - Docs-as-Code shall support the Decision Record (dec_rec) need type with the following options: + Docs-as-Code shall support the Decision Record (dec_rec) need type with the following mandatory options: * ``id`` (mandatory, pattern: ``dec_rec____``; category and slug contain letters, numbers, underscores, or hyphens) * ``status`` (mandatory, one of: proposed, accepted, deprecated, rejected, superseded) * ``context`` (mandatory) * ``decision`` (mandatory) - * ``tracking`` (optional, link to a GitHub issue or pull request in the ``eclipse-score`` organization) + * ``tracking`` (mandatory, link to a GitHub issue or pull request in the ``eclipse-score`` organization) * ``version`` (mandatory) - * ``consequences`` (optional) + * ``consequences`` (mandatory, non-empty) A Decision Record shall be able to link to other needs via the optional ``affects`` link. diff --git a/src/extensions/score_metamodel/metamodel.yaml b/src/extensions/score_metamodel/metamodel.yaml index 6abf64f4c..1cd16e1e8 100644 --- a/src/extensions/score_metamodel/metamodel.yaml +++ b/src/extensions/score_metamodel/metamodel.yaml @@ -1055,9 +1055,8 @@ needs_types: status: ^(proposed|accepted|deprecated|rejected|superseded)$ context: ^[\s\S]+$ decision: ^[\s\S]+$ - optional_options: tracking: ^https://github\.com/eclipse-score/[^/]+/(?:issues|pull)/\d+(?:#[A-Za-z0-9_-]+)?$ - consequences: ^[\s\S]*$ + consequences: ^[\s\S]+$ optional_links: affects: ANY parts: 3 diff --git a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst index e723fd27f..c2fbca1e5 100644 --- a/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst +++ b/src/extensions/score_metamodel/tests/rst/options/test_dec_rec.rst @@ -44,13 +44,24 @@ :consequences: Allows linking between related decisions. -.. dec_rec:: Decision Record without optional tracking or consequences +.. dec_rec:: Decision Record with missing tracking :id: dec_rec__logging__no_tracking :status: accepted - :context: Tracking and consequences are optional for existing decisions. - :decision: Preserve backward compatibility. + :context: The tracking link is missing. + :decision: Require tracking for every decision record. :version: 1 - :expect_not: does not follow pattern + :consequences: Decisions must refer to an issue or pull request. + :expect: dec_rec__logging__no_tracking: is missing required attribute: `tracking`. + + +.. dec_rec:: Decision Record with missing consequences + :id: dec_rec__logging__no_consequences + :status: accepted + :context: The consequences are missing. + :decision: Require consequences for every decision record. + :tracking: https://github.com/eclipse-score/score/pull/2 + :version: 1 + :expect: dec_rec__logging__no_consequences: is missing required attribute: `consequences`. .. dec_rec:: Decision Record with invalid tracking organization @@ -60,6 +71,7 @@ :decision: Reject links owned by other organizations. :tracking: https://github.com/other-org/score/pull/3 :version: 1 + :consequences: Tracking is restricted to the eclipse-score organization. :expect: dec_rec__dac__invalid_tracking_org.tracking (https://github.com/other-org/score/pull/3): does not follow pattern @@ -67,5 +79,7 @@ :id: dec_rec__proc__missing_status :context: The status is missing. :decision: Required fields remain enforced. + :tracking: https://github.com/eclipse-score/score/issues/1 :version: 1 + :consequences: Every decision record must declare its status. :expect: dec_rec__proc__missing_status: is missing required attribute: `status`.