From cdda0b9311ef6b1db9aacf4f7537fef57a8643aa Mon Sep 17 00:00:00 2001 From: d93317 Date: Mon, 2 Mar 2026 10:38:46 +0100 Subject: [PATCH 1/9] Bring PR https://github.com/score-json/nlohmann_json/pull/24 content onto upstream/main This commit ports the content of score-json/nlohmann_json (https://github.com/score-json/nlohmann_json/pull/24) onto a fresh upstream/main baseline. Why this is one commit: - The downstream and upstream histories diverged significantly. - Replaying the full original chain would cause many unrelated conflicts. - This keeps the upstream PR diff clean and reviewable while preserving provenance below. Combined original commits from downstream branch: - 18e1f0dd2 Halnasri resolve tt confidence feedback (#21) - caefeaeae Resolve TT-CONSTRUCTION Feedback (#23) - 28c4ccc8f Erikhu1 add missing links (#25) - 748b55a45 Resolve TT-PROVENANCE Feedback (#14) - df946d2d1 halnasri-Revisit TT-RESULTS (#17) - 6ec3d20d8 added TA-Releases -> JLS-53 link (#27) - ad3d3e99e Erikhu1 sync with prod (#31) - 2ddacb3e0 Removed multiple validators from statements by splitting them up (#35) - 849f85570 Erikhu1 sync with prod (#38) - 8f0d8cd18 Resolve TA-Analysis comments (#39) - afccbfb54 started with TA-Misbehaviours - 3ba909841 Filled out Checklist for TA-Behaviours - 8c9508f9f filled out checklist for TA-Misbehaviours - df823a3c7 added additional context information - b6a6227f2 added checklist answers for TA-Behaviours and TA-Constraints - c11a9789f cosmetic changes to TA-BEHAVIOURS - 693adb11d small updates to TA-Misbehaviours - 544f6d0ce created JLS-54 to JLS-60 - 20ff2b7ac cosmetic change to JLS-54 - 379c5429a update - 65bc51c4d improved checklist and evidence for TA-Behaviour - e181ee7cc worked on TA-Misbehaviours - bf67eecfe added JLS-70 and JLS-71 - 1baed1190 added JLS-72 - b5895e731 Worked on Context file of TA-Constraints - 603a56399 worked on misbehaviours context file - 225e46a27 halnasri-Revisit_TT_INDICATORS (#28) - 03d7107b0 remove references to parent workflow for JLS-54 and JLS-55 - a5a6349b5 Added TODOs/Comments to TA-Behaviours and TA-Constraints Context files - c63350444 created JLS-56 - 4d0ded3b6 resolved TODOs in TA-Behaviours - 3ce7f40be edited JLS 71 - 70cfb5f1c JLS-70 and JLS-72 - c19d5260c documented misunderstandings - 14dc8ade3 added https validator to JLS 70 and 71 - e153c07da added JLS-73 - 08ae742a4 small fix - ff1df9e64 added references to JLS 24 and 31 - 1282ceee4 edited zthe checklist of TA-Misbehaviour - 025d035fd added https validator to JLS-24 - 169546206 typos - 00a8c8157 fix pr count gate and coverage gate and add check_artifact_exists evidence to statements JLS-54 and JLS-55 - e9f910915 edited artifact output for the coverage gate - ee4b7a735 version control for PR and coverage gate workflow - b919c7d25 fix file naming in workflows - af24784e3 fix answers to the checklist of TA-CONSTRAINTS - 4f3420975 edited JLS 72 - b0faaaa1c edited references for JLS 56 - fea0fd7de TA-constraints edited checklist - f8e265722 set pr count gate to 15 open PRs - 38dd6fa14 small fixes - ef31e3d94 exception handling tests evidence - c82acbc6c TA-Misbehaviours stress tests - fb306b230 TA-Misbehaviours list of misbehaviours - f78941e01 edited answer about risk analyses in TA-INDICATORS - b8c9aa81b added JLS-76 and comments to TT-Misbehaviours - 17cf293e8 removed JLS-69, its link and replace context answer with JLS-11. - 5650e9210 replaced JLS-69 by JLS-11 in TA-Indicators context file - 40bb11a3b added link of TA-Misbehaviours to JLS-11 - d63579055 added explanation of why there are no incentives to manipulate information - 6b0a4f1ee added answer for undiscovered expectations - b0bedd992 answered new expectation identification question - f3ba14f18 added test data to answer - cbc454631 test repo renaming effects - 2cdda569f filled out remaining answer in TA-Constraints - 02a2ca6da answered to TA-Behaviours - 995183dd9 answered result evaluation question in TA-Misbehaviours - 2ff3f1047 added answer to fault induction test misbehaviour - c2fd098cd answered ta-misbehaviour question, added evidence to JLS-76 - 80f4108cc add risk analysis - daa774b0e small fixes - 438687e0b rewrite steps overview - 1e8025fa4 replace - with comma in TA-Behaviours context file - 68e8252f7 Change phrasing of JLS-24 - 4c1ff692a changed risk analysis AOU-07 formulation - f4e3fec80 delete unnecessary section in risk analysis - 22d926b06 deleted unnecessary section in risk analysis - f202d6bc5 changed naming of first risk analysis step - 840152bb8 changed referrals to risk_analysis in ta-indicators and ta-misbehaviours - 67900e5b7 changed links from legacy gitlab TSF documentation to new ecplise TSF documentation. - 440a1eab6 Added a control structure diagram both as drawio/png and embedded it in the risk_analysis. - f5a002185 Change risk_analysis headers and structure to fit expected steps of RAFIA STPA procedure. - 398a02c96 Remade part 4 Unsafe Control Actions to fit review. - 8fa739460 Add step 5 Controller Constraints. - 802ec9d74 Add step 6 Control loops to risk_analysis - 8975d49c3 Add step 8 Causal Scenario Constrains to risk analysis - 59f4e69af Add step 10 Review of STPA results to risk analysis. - 780b7972e Reworked step 9 Misbehaviours and Expectations in risk analysis to be in line with the STPA review guide. - 0a820ce9c Update markdown tables of risk_analysis to follow column names and order of STPA results schema in TSF documentation. - bb554eaf2 Add additional Controller Functional Constraints under 5) Device Cotroller Constraints for risk_analysis to fulfill STPA review requirements. - 38fc8fafd Updated step 7) Causal Scenarios to follow review guidelines in risk_analysis - ce036172b TA-Constraints: add AOU-31 resource/time budget assumption - c7d94f355 Removed typos and irregularities for review changes. - 5c0eb1012 Replace legacy UCA IDs with current combined IDs as in review. - 48d149d0b Changed minor remarks from review. - 1bd7fa334 Changed failure description in 6) Control Loops and Sequences in risk_analysis - dfc804dcc Changed minor errors in STPA diagram. --- .dotstop.dot | 24 +- .dotstop_extensions/references.py | 14 +- .github/workflows/coverage_gate.yml | 81 +++ .github/workflows/parent-workflow.yml | 24 +- .github/workflows/pr_count_gate.yml | 78 +++ TSF/docs/STPA_diagram_nlohmann.drawio | 174 ++++++ TSF/docs/STPA_diagram_nlohmann.png | Bin 0 -> 68112 bytes TSF/docs/risk_analysis.md | 589 ++++++++++++++++++ .../assertions/TA-BEHAVIOURS-CHECKLIST.md | 2 +- .../assertions/TA-BEHAVIOURS_CONTEXT.md | 37 +- .../assertions/TA-CONSTRAINTS-CHECKLIST.md | 2 +- .../assertions/TA-CONSTRAINTS_CONTEXT.md | 32 +- .../assertions/TA-INDICATORS-CHECKLIST.md | 2 +- .../assertions/TA-INDICATORS_CONTEXT.md | 42 +- .../assertions/TA-METHODOLOGIES-CHECKLIST.md | 2 +- .../assertions/TA-MISBEHAVIOURS-CHECKLIST.md | 2 +- .../assertions/TA-MISBEHAVIOURS_CONTEXT.md | 48 +- TSF/trustable/assumptions-of-use/AOU-31.md | 7 + TSF/trustable/statements/JLS-04.md | 16 +- TSF/trustable/statements/JLS-24.md | 16 +- TSF/trustable/statements/JLS-54.md | 22 + TSF/trustable/statements/JLS-55.md | 22 + TSF/trustable/statements/JLS-56.md | 21 + TSF/trustable/statements/JLS-70.md | 16 + TSF/trustable/statements/JLS-71.md | 20 + TSF/trustable/statements/JLS-72.md | 20 + TSF/trustable/statements/JLS-73.md | 24 + TSF/trustable/statements/JLS-76.md | 19 + 28 files changed, 1251 insertions(+), 105 deletions(-) create mode 100644 .github/workflows/coverage_gate.yml create mode 100644 .github/workflows/pr_count_gate.yml create mode 100644 TSF/docs/STPA_diagram_nlohmann.drawio create mode 100644 TSF/docs/STPA_diagram_nlohmann.png create mode 100644 TSF/docs/risk_analysis.md create mode 100644 TSF/trustable/assumptions-of-use/AOU-31.md create mode 100644 TSF/trustable/statements/JLS-54.md create mode 100644 TSF/trustable/statements/JLS-55.md create mode 100644 TSF/trustable/statements/JLS-56.md create mode 100644 TSF/trustable/statements/JLS-70.md create mode 100644 TSF/trustable/statements/JLS-71.md create mode 100644 TSF/trustable/statements/JLS-72.md create mode 100644 TSF/trustable/statements/JLS-73.md create mode 100644 TSF/trustable/statements/JLS-76.md diff --git a/.dotstop.dot b/.dotstop.dot index 596103586c..fe5f072f56 100644 --- a/.dotstop.dot +++ b/.dotstop.dot @@ -31,6 +31,7 @@ digraph G { "AOU-28" [sha="76887b683a1e5a2f36a029bf80c7489226d1728e6f148f69f7b2167211f1f443"]; "AOU-29" [sha="cb3302e313dae237d67bf249c61419232a83aa6245af30a0f33c795ab1b3a8f5"]; "AOU-30" [sha="ee747671350441b0ca2438c651e0c30a90ac9b126540308415e1645eeea2707a"]; +"AOU-31" [sha="e6dfb726b06bf38ff27602695bdfafee64605da7ab6540b2ec0ae479ab73f3dc"]; "JLEX-01" [sha="1cd16efee6db392909248a77c773e0c5aa76b4c05001ab0b981201004f2162b0"]; "JLEX-02" [sha=f40046dae47252d62f28c935db90460772263ced0fa9ed1a5e1383436b89daa9]; "JLS-01" [sha=dce41089598ceff4a3ce3df7a8d3d16183346b785d791d60c8292f51c055946d]; @@ -82,8 +83,9 @@ digraph G { "JLS-51" [sha="190e17d59795c9ed3b25a0a8bf57497de1e0d06ab90b3f6ba47b543c95edea43"]; "JLS-52" [sha="8539f924c31974a2722615d2410a25336a5d6a9f399f16dc485be83f7f87a5ff"]; "JLS-53" [sha="d9f7e732e34b0ec79305dde4c5b3d60906559ef1d90bc3ce2906e28a90293844"]; -"JLS-57" [sha="6261b6cf44be2e742af1e1d687f1233161ab7cdaf6f1c0a6e31e671a7451adc5"]; -"JLS-58" [sha="dbdb83427fd82fd3be5e90ab761945a0346b33740b9ea80fd37122dfa6baaa60"]; +"JLS-54" [sha="f1ff5d3aff697980bcf072e27e00f9916052aceb4796fe1417486ddc80d5e241"]; +"JLS-55" [sha="321c775e2acf0267ac1753eb772fedf1bcca18029714071c6e55d999f6dd008a"]; +"JLS-56" [sha="6fdd3ab1172c1df5658f140d104d51559080aa32389a5a842b93cfbd394593b3"]; "JLS-61" [sha="151f1cda2384ae4935d29d300c3424bca710378fa3689bbcff69b06dc86bb692"]; "JLS-62" [sha="60848232c2989d0282b64792d7da7a57c04ff368d2ac9deae09c3743251dfc79"]; "JLS-63" [sha="2b50e79c3b43c6815b5dc15c7909ce5fb513e98fadb28ddfa40938f20f5d0427"]; @@ -91,6 +93,11 @@ digraph G { "JLS-65" [sha="e413de6c831c1c019c67c3e3477b9dc9302cc79433ec894beaee0c95e053b545"]; "JLS-66" [sha="cf57eaf55654ef52589b1879c7294de13ddf1258ecdff4f6371178c6e8e6975b"]; "JLS-74" [sha="c161214f0f206f3c0826750978fcc4c99e2765a0c3333592e1293b323434ca34"]; +"JLS-70" [sha="5958335832f06baaa624a093c06ce9abc2ee88c8034819ace3be2c5fff0e0a74"]; +"JLS-71" [sha="83bb8658b1b8914e0f37cdd0333d5f9351a75763486565ce7804a240d9a418ac"]; +"JLS-72" [sha="0b061840170a819c7daf1005b2eee53d121e04e921413935f5eed4fec98a8726"]; +"JLS-73" [sha="42d8dd90dc4a321923567287216e216a30c55ede8836824e19fba046a2121a97"]; +"JLS-76" [sha="ebcfc023f88ef50a3c804cb72318428e7566dc44c3539c54742e25f261ff3249"]; "NJF-01" [sha="548dc86014e093974f68660942daa231271496a471885bbed092a375b3079bd8"]; "NJF-02" [sha="6ea015646d696e3f014390ff41612eab66ac940f20cf27ce933cbadf8482d526"]; "NJF-03" [sha="4bd1f8210b7bba9a248055a437f377d9da0b7576c5e3ed053606cf8b5b2febe3"]; @@ -407,6 +414,7 @@ digraph G { "TA-BEHAVIOURS" -> "JLEX-02" [sha=cb26451e31a56b1eb51a4d45283ba4a7c6e898efbd045b59cba10d3c6aa093de]; "TA-BEHAVIOURS" -> "JLS-03" [sha=cf9211c07452914cb2d0b455f859b26cb2724423eae5187e8cbfdff06d1b5ba3]; "TA-BEHAVIOURS" -> "JLS-27" [sha="880ec996ed026258b58299c356aab7d02652ae55cbf1f98494e2a7770fd96275"]; +"TA-BEHAVIOURS" -> "JLS-56" [sha="96132477a8b2090f75ca56db2af3ac142a26423915a2f76e328734ae3347a5dd"]; "TA-CONFIDENCE" -> "JLS-08" [sha="506164051180023c8533ea1f6dedf1bad894c3ee6020ff16b002e33b109c2791"]; "TA-CONFIDENCE" -> "JLS-09" [sha="80bbde95fc14f89acf3dad10b3831bc751943fe4a1d79d5cbf4702416c27530f"]; "TA-CONFIDENCE" -> "JLS-20" [sha="1bfd214ab8186a3c095262ae503451b8d71ada8db5b13ecc7b906739a05bc102"]; @@ -438,6 +446,11 @@ digraph G { "TA-CONSTRAINTS" -> "AOU-10" [sha="54e2cf65bcc7544eda66fd5aca9763008a094dd7389db2463b28c81e1c586375"]; "TA-CONSTRAINTS" -> "AOU-11" [sha="376c75481202bdc4c6d8f9073f5173ab307859b0495735b204de05e58ef2742c"]; "TA-CONSTRAINTS" -> "AOU-30" [sha="28a722163059e712168605d165311d28bbb6e0d88f34e4b8b317f18d47d02843"]; +"TA-CONSTRAINTS" -> "JLS-70" [sha="8672df0fe5ac8addb8adfb527e2735606966e66d45c112b87c23cf4e57f34909"]; +"TA-CONSTRAINTS" -> "JLS-71" [sha="06bc97101b9f4119cb3f5bdac28ec3f25f35bb51a593893fcfe1fc5d67cd17a3"]; +"TA-CONSTRAINTS" -> "JLS-72" [sha="ed3451acf602f0f25d33250a55bfe6311a47d6e5f7bd2b1b7d5beb08ca781094"]; +"TA-CONSTRAINTS" -> "JLS-73" [sha="4e3de24e57b1865345cebeb654b0b29d89558f3fddb0c76f8b26db0d4ff92993"]; +"TA-CONSTRAINTS" -> "AOU-31" [sha="858726a396aa2b29254e4f84a815ac07b0cddfd13d3f69b9e520cf8ebe5c0172"]; "TA-DATA" -> "JLS-18" [sha=af2567d28552ab32643e995a9c9c9fd73b2208ce3d5255fba333c8ddd28f72a6]; "TA-DATA" -> "JLS-45" [sha="9cc0a42711c2d7c03dab3a2d633abf41a7451c375f68bed9907429a86077d2d8"]; "TA-FIXES" -> "JLS-05" [sha="7264d31fb391f7ab77e3719a732b06a366579f7ee8b398d185daa4431aee4224"]; @@ -448,6 +461,11 @@ digraph G { "TA-FIXES" -> "JLS-28" [sha="0adb7ec9c6cc4338fa810442d22c8e4ca2a39cf33f0efaf859457ab32946991d"]; "TA-FIXES" -> "JLS-33" [sha="56b526e261afa2da0793ec172850d227e4ed1d8c8a06e616c680c3db29648d45"]; "TA-FIXES" -> "JLS-57" [sha="ada11447792ac70d2f87b81253379dd31d73eefa57554c9f0b1e067bf995812c"]; +"TA-INDICATORS" -> "JLS-54" [sha="b8d659e9fa897e4f13ceace28a2c71e38d41be22a52ca34162ca907c82e160fc"]; +"TA-INDICATORS" -> "JLS-55" [sha="0d048eab93d9d675bf346fb93b80a5af1b7752352b28e1b80b4b9e8b85e5fc3d"]; +"TA-INDICATORS" -> "JLS-56" [sha="a27def8655040fb7b0feb8c88ce79962442cd8f7fab0e64ec7a7ff576ff1b7e6"]; +"TA-INDICATORS" -> "JLS-59" [sha="cb6fadb815da01e8cf5624d69ddcb9d6dd0b6e9d9df2cc2f0c40810741cffe46"]; +"TA-INDICATORS" -> "JLS-60" [sha="fe0fdac1036e4ff8557ae5151f1516b4127644b03c778e8fff95e00b7aa6381c"]; "TA-INPUTS" -> "JLS-04" [sha="262db6d430e99ef3a23645c93a1cc5bda1270ceba90b4d8cccb40b1eb85e9860"]; "TA-INPUTS" -> "JLS-47" [sha="b2da62290125ecc680f953dde166bb5f22e7f8c6e7e53a73136102e01dd013a7"]; "TA-INPUTS" -> "JLS-34" [sha="b39b1a808b02bfcd5450ffea835179c862c19f7759de0508bac9249c02db58c1"]; @@ -469,6 +487,8 @@ digraph G { "TA-MISBEHAVIOURS" -> "JLS-24" [sha=e8de01ff7c316debcd96afa4b3b6b62be73522e4531214c18b3ad7eec826275e]; "TA-MISBEHAVIOURS" -> "JLS-25" [sha="56ba396580f90e5a10fd5adfe33864921537d47e21b215a8faf531855af40ecd"]; "TA-MISBEHAVIOURS" -> "JLS-31" [sha="ff3352e20146a81904da6d8d94b003b4e0acbc2a8a63a73ea017ea0535e45e79"]; +"TA-MISBEHAVIOURS" -> "JLS-76" [sha="7528c4228bbe5a1d4ccfcd7efe4254b2f2443c9746b28de5903d2a925dba8436"]; +"TA-MISBEHAVIOURS" -> "JLS-11" [sha="d03c18218f8e022c1210c63a6dcea2729a0584bc3b31aba1370e5f5037b0ef94"]; "TA-RELEASES" -> "JLS-14" [sha="1202b9934353436fba927de6762cf62a8fc23ab0815a3c06f9d0a77b55830720"]; "TA-RELEASES" -> "JLS-38" [sha="ed0d250c8c191ac4fc03712a321bf399d26e932edabb13067fbcffae1640cb90"]; "TA-RELEASES" -> "JLS-10" [sha="33c316a9040c7d27c830ca453e39d3bb423acf42e14d1d561c952291ba66078b"]; diff --git a/.dotstop_extensions/references.py b/.dotstop_extensions/references.py index 999b6fdd83..85b98da8b6 100644 --- a/.dotstop_extensions/references.py +++ b/.dotstop_extensions/references.py @@ -36,16 +36,19 @@ class CPPTestReference(BaseReference): section declaration, and the closing brace `}` must have the same indentation as the opening brace. This is the case for the tests from nlohmann_json. """ - def __init__(self, name: str, path: str) -> None: + def __init__(self, name: str, path: str, description: str = "") -> None: """ Initialize CPPTestReference. Args: - name: Section name, use colon-separated for nested sections (e.g., "testcase1:section1:section2") + name: Section name, use colon-separated for nested sections + (e.g., "testcase1:section1:section2") path: Relative path from project root to the file + description: Optional human-readable description of the test section """ self._name = name self._path = Path(path) + self._description = description @classmethod def type(cls) -> str: @@ -167,13 +170,16 @@ def content(self) -> bytes: def as_markdown(self, filepath: None | str = None) -> str: content = self.content.decode('utf-8') content = self.remove_leading_whitespace_preserve_indentation(content) - return format_cpp_code_as_markdown(content) + md = format_cpp_code_as_markdown(content) + + if self._description: + return f"Description: {self._description}\n\n{md}" + return md def __str__(self) -> str: # this is used as a title in the trudag report return f"cpp-test: [{self._name}]\n({self._path})" - class JSONTestsuiteReference(CPPTestReference): """ Represents a reference to one or more JSON testsuite files, where the CPP test diff --git a/.github/workflows/coverage_gate.yml b/.github/workflows/coverage_gate.yml new file mode 100644 index 0000000000..1462ec2c4e --- /dev/null +++ b/.github/workflows/coverage_gate.yml @@ -0,0 +1,81 @@ +name: Coverage Gate + +on: + workflow_call: + inputs: + artifact_id: + description: "Artifact name for the coverage-gate result" + required: true + type: string + +jobs: + coverage_gate: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Download coverage HTML artifact + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: code-coverage-report + path: coverage_html + + - name: Debug list coverage files + run: | + echo "=== coverage_html contents ===" + ls -R coverage_html + + - name: Enforce coverage threshold + run: | + THRESHOLD=99.19 + + echo "=== Extracting line coverage for 'Lines:' from index.html ===" + + HEADER_BLOCK=$(grep -A1 'Lines:' coverage_html/index.html || true) + echo "$HEADER_BLOCK" + + LINE_COV=$(echo "$HEADER_BLOCK" | grep -oE "[0-9]+(\.[0-9]+)?" | head -n1 || true) + echo "Extracted Line coverage: '${LINE_COV}'" + + if [ -z "$LINE_COV" ]; then + echo "Could not extract line coverage for 'Lines:' from index.html" + exit 1 + fi + + COMPARE=$(awk -v cov="$LINE_COV" -v thr="$THRESHOLD" 'BEGIN { if (cov < thr) print "lt"; else print "ge"; }') + + if [ "$COMPARE" = "lt" ]; then + echo "Coverage below threshold, failing job." + exit 1 + fi + + echo "Coverage is above threshold." + + - name: Create coverage-gate result + if: always() + run: | + mkdir -p coverage_gate + + THRESHOLD=99.19 + + LINE_COV="" + if [ -f coverage_html/index.html ]; then + HEADER_BLOCK=$(grep -A1 'Lines:' coverage_html/index.html || true) + LINE_COV=$(echo "$HEADER_BLOCK" | grep -oE "[0-9]+(\.[0-9]+)?" | head -n1 || true) + fi + + { + echo "status=${{ job.status }}" + echo "line_coverage=${LINE_COV}" + echo "threshold=${THRESHOLD}" + } > coverage_gate/coverage_gate.txt + + + - name: Upload coverage-gate artifact + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ inputs.artifact_id }} + path: coverage_gate/coverage_gate.txt diff --git a/.github/workflows/parent-workflow.yml b/.github/workflows/parent-workflow.yml index 775d88e6c0..e44efd2c3f 100644 --- a/.github/workflows/parent-workflow.yml +++ b/.github/workflows/parent-workflow.yml @@ -10,6 +10,7 @@ on: permissions: contents: read + pull-requests: read jobs: labeler: @@ -63,6 +64,21 @@ jobs: with: artifact_id: "ubuntu-${{ github.sha }}" + coverage_gate: + name: Run Coverage Gate Workflow + needs: [ubuntu] + if: ${{ github.event_name == 'pull_request' && github.base_ref == 'main' + || github.event_name == 'schedule' }} + uses: ./.github/workflows/coverage_gate.yml + with: + artifact_id: "coverage_gate-${{ github.sha }}" + + pr_count_gate: + name: Run PR Count Gate Workflow + uses: ./.github/workflows/pr_count_gate.yml + with: + artifact_id: "pr_count_gate-${{ github.sha }}" + dependency_review: name: Run dependency_review Workflow if: ${{ github.event_name == 'pull_request' }} # only run dependency_review for PRs @@ -73,11 +89,11 @@ jobs: collect_artifacts_pr: name: "Collect Results & Deploy (PR)" if: github.event_name == 'pull_request' - needs: [labeler, SME_review_checker, check_amalgamation, test_trudag_extensions, dependency_review, codeql, ubuntu] + needs: [labeler, SME_review_checker, check_amalgamation, test_trudag_extensions, dependency_review, codeql, ubuntu, coverage_gate, pr_count_gate] runs-on: ubuntu-latest strategy: matrix: - target: [labeler, SME_review_checker, check_amalgamation, test_trudag_extensions, dependency_review, codeql, ubuntu] + target: [labeler, SME_review_checker, check_amalgamation, test_trudag_extensions, dependency_review, codeql, ubuntu, coverage_gate, pr_count_gate] steps: - name: Checkout code @@ -106,11 +122,11 @@ jobs: collect_artifacts_non_pr: name: "Collect Results & Deploy (Non-PR)" if: github.event_name != 'pull_request' - needs: [labeler, test_trudag_extensions, codeql, ubuntu] # no check_amalgamation, dependency_review or SME_review_checker if non PR + needs: [labeler, test_trudag_extensions, codeql, ubuntu, coverage_gate, pr_count_gate] # no check_amalgamation, dependency_review or SME_review_checker if non PR runs-on: ubuntu-latest strategy: matrix: - target: [labeler, test_trudag_extensions, codeql, ubuntu] + target: [labeler, test_trudag_extensions, codeql, ubuntu, coverage_gate, pr_count_gate] steps: - name: Checkout code diff --git a/.github/workflows/pr_count_gate.yml b/.github/workflows/pr_count_gate.yml new file mode 100644 index 0000000000..02f5fdbc3c --- /dev/null +++ b/.github/workflows/pr_count_gate.yml @@ -0,0 +1,78 @@ +name: PR Count Gate + +on: + workflow_call: + inputs: + artifact_id: + required: true + type: string + +jobs: + pr_count_gate: + runs-on: ubuntu-latest + + steps: + - name: Count open pull requests + id: pr-count + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { owner, repo } = context.repo; + const per_page = 100; + let page = 1; + let total = 0; + + while (true) { + const { data } = await github.rest.pulls.list({ + owner, + repo, + state: 'open', + base: 'main', + per_page, + page, + }); + if (data.length === 0) break; + total += data.length; + if (data.length < per_page) break; + page++; + } + + core.info(`Open pull requests: ${total}`); + core.setOutput('open_prs', total.toString()); + + - name: fail if too many open PRs + id: gate + shell: bash + run: | + MAX=15 + OPEN="${{ steps.pr-count.outputs.open_prs }}" + + echo "Open PRs: ${OPEN}" + echo "Max allowed: ${MAX}" + + if [ "$OPEN" -gt "$MAX" ]; then + echo "Gate failed: too many open PRs (${OPEN} > ${MAX})" + exit 1 + fi + + echo "Gate passed: (${OPEN} <= ${MAX})" + + - name: Write PR count result + if: always() + run: | + mkdir -p pr_count_gate + echo "status=${{ job.status }}" > pr_count_gate/pr_count_gate.txt + echo "open_prs=${{ steps.pr-count.outputs.open_prs }}" >> pr_count_gate/pr_count_gate.txt + echo "max_open_prs=15" >> pr_count_gate/pr_count_gate.txt + echo "sha=${{ github.sha }}" >> pr_count_gate/pr_count_gate.txt + echo "run_id=${{ github.run_id }}" >> pr_count_gate/pr_count_gate.txt + + - name: Upload PR count gate artifact + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ inputs.artifact_id }} + path: pr_count_gate/pr_count_gate.txt + + diff --git a/TSF/docs/STPA_diagram_nlohmann.drawio b/TSF/docs/STPA_diagram_nlohmann.drawio new file mode 100644 index 0000000000..f44ab57c21 --- /dev/null +++ b/TSF/docs/STPA_diagram_nlohmann.drawio @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TSF/docs/STPA_diagram_nlohmann.png b/TSF/docs/STPA_diagram_nlohmann.png new file mode 100644 index 0000000000000000000000000000000000000000..fea2efb348a7723b4c3156e524c3f55e5b856d7f GIT binary patch literal 68112 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 Date: Mon, 2 Mar 2026 14:40:18 +0100 Subject: [PATCH 2/9] Fix legacy links in trudag dotstop.dot --- .dotstop.dot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.dotstop.dot b/.dotstop.dot index fe5f072f56..6008c0d3ad 100644 --- a/.dotstop.dot +++ b/.dotstop.dot @@ -86,6 +86,8 @@ digraph G { "JLS-54" [sha="f1ff5d3aff697980bcf072e27e00f9916052aceb4796fe1417486ddc80d5e241"]; "JLS-55" [sha="321c775e2acf0267ac1753eb772fedf1bcca18029714071c6e55d999f6dd008a"]; "JLS-56" [sha="6fdd3ab1172c1df5658f140d104d51559080aa32389a5a842b93cfbd394593b3"]; +"JLS-57" [sha="6261b6cf44be2e742af1e1d687f1233161ab7cdaf6f1c0a6e31e671a7451adc5"]; +"JLS-58" [sha="dbdb83427fd82fd3be5e90ab761945a0346b33740b9ea80fd37122dfa6baaa60"]; "JLS-61" [sha="151f1cda2384ae4935d29d300c3424bca710378fa3689bbcff69b06dc86bb692"]; "JLS-62" [sha="60848232c2989d0282b64792d7da7a57c04ff368d2ac9deae09c3743251dfc79"]; "JLS-63" [sha="2b50e79c3b43c6815b5dc15c7909ce5fb513e98fadb28ddfa40938f20f5d0427"]; @@ -464,8 +466,6 @@ digraph G { "TA-INDICATORS" -> "JLS-54" [sha="b8d659e9fa897e4f13ceace28a2c71e38d41be22a52ca34162ca907c82e160fc"]; "TA-INDICATORS" -> "JLS-55" [sha="0d048eab93d9d675bf346fb93b80a5af1b7752352b28e1b80b4b9e8b85e5fc3d"]; "TA-INDICATORS" -> "JLS-56" [sha="a27def8655040fb7b0feb8c88ce79962442cd8f7fab0e64ec7a7ff576ff1b7e6"]; -"TA-INDICATORS" -> "JLS-59" [sha="cb6fadb815da01e8cf5624d69ddcb9d6dd0b6e9d9df2cc2f0c40810741cffe46"]; -"TA-INDICATORS" -> "JLS-60" [sha="fe0fdac1036e4ff8557ae5151f1516b4127644b03c778e8fff95e00b7aa6381c"]; "TA-INPUTS" -> "JLS-04" [sha="262db6d430e99ef3a23645c93a1cc5bda1270ceba90b4d8cccb40b1eb85e9860"]; "TA-INPUTS" -> "JLS-47" [sha="b2da62290125ecc680f953dde166bb5f22e7f8c6e7e53a73136102e01dd013a7"]; "TA-INPUTS" -> "JLS-34" [sha="b39b1a808b02bfcd5450ffea835179c862c19f7759de0508bac9249c02db58c1"]; From 13e4dafc74e1cde286be247f560c1ed484948211 Mon Sep 17 00:00:00 2001 From: d93317 Date: Wed, 11 Mar 2026 10:56:46 +0100 Subject: [PATCH 3/9] Changes in TA-BEHAVIOURS_CONTEXT because of review comments. --- TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md b/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md index 6de015f13d..52e4702906 100644 --- a/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md +++ b/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md @@ -78,11 +78,11 @@ and that the resulting system and tests are validated by appropriate strategies. - How confident can we be that this list covers all critical requirements? - **Answer**: We are very confident that this list covers all critical requirements. - How comprehensive is the list of tests? - - **Answer**: Currently, the branch coverage is 93.865% and the line coverage is 99.186%, cf. JLS-27. Therefore, we deem the list of tests to be very comprehensive. + - **Answer**: Currently, branch coverage is 93.865% and line coverage is 99.186% (JLS-27). Deviation from 100% branch coverage is expected for this kind of template-heavy library due to known factors such as tooling artifacts, defensive/unreachable paths (e.g., LCOV-excluded branches), and configuration-dependent code paths. Coverage is continuously monitored in CI and reviewed in pull requests and maintainers have documented concrete coverage-artifact cases (e.g., https://github.com/nlohmann/json/pull/4595). In addition to raw percentages, we use statement-level traceability from Expectations JLEX-01/02 to concrete CI tests (JLS-74). Therefore, we deem the test set very comprehensive for the intended scope. - Is every Expectation covered by at least one implemented test? - **Answer**: Yes, both of the Expectations are covered by at least one implemented test. - Are there any Expectations where we believe more coverage would help? - - **Answer**: No, the coverage is already on a high level and no further gains are expected by further increasing the coverage. + - **Answer**: No additional top-level Expectation is currently missing. Extra tests would mainly increase confidence for already identified boundary cases (especially around WFJ-06), rather than reveal a gap in the Expectation set. - How do dependencies affect Expectations, and are their properties verifiable? - **Answer**: The nlohmann/json library does not have any external dependencies apart from the testing pipeline, so there are no dependencies that could possibly affect the Expectations. - Are input analysis findings from components, tools, and data considered in relation to Expectations? From 92884b8b2e9175b0f5e931cda2685f2ebb8edc8e Mon Sep 17 00:00:00 2001 From: d93317 Date: Wed, 11 Mar 2026 10:58:07 +0100 Subject: [PATCH 4/9] Additional Changes in TA-BEHAVIOURS_CONTEXT because of review comments. --- TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md b/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md index 52e4702906..676790b6d1 100644 --- a/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md +++ b/TSF/trustable/assertions/TA-BEHAVIOURS_CONTEXT.md @@ -78,9 +78,9 @@ and that the resulting system and tests are validated by appropriate strategies. - How confident can we be that this list covers all critical requirements? - **Answer**: We are very confident that this list covers all critical requirements. - How comprehensive is the list of tests? - - **Answer**: Currently, branch coverage is 93.865% and line coverage is 99.186% (JLS-27). Deviation from 100% branch coverage is expected for this kind of template-heavy library due to known factors such as tooling artifacts, defensive/unreachable paths (e.g., LCOV-excluded branches), and configuration-dependent code paths. Coverage is continuously monitored in CI and reviewed in pull requests and maintainers have documented concrete coverage-artifact cases (e.g., https://github.com/nlohmann/json/pull/4595). In addition to raw percentages, we use statement-level traceability from Expectations JLEX-01/02 to concrete CI tests (JLS-74). Therefore, we deem the test set very comprehensive for the intended scope. + - **Answer**: Currently, branch coverage is 93.865% and line coverage is 99.186% (JLS-27). Deviation from 100% branch coverage is expected for this kind of template-heavy library due to known factors such as tooling artifacts, defensive/unreachable paths (e.g., LCOV-excluded branches), and configuration-dependent code paths. Coverage is continuously monitored in CI and reviewed in pull requests and maintainers have documented concrete coverage-artifact cases (e.g., https://github.com/nlohmann/json/pull/4595). In addition to raw percentages, we use statement-level traceability from Expectations JLEX-01/02 to concrete CI tests (JLS-74). Therefore, we deem the test set very comprehensive for the intended scope. - Is every Expectation covered by at least one implemented test? - - **Answer**: Yes, both of the Expectations are covered by at least one implemented test. + - **Answer**: Yes, both Expectations (JLEX-01, JLEX-02) are covered by a broad set of implemented tests across their supporting statements (WFJ-, PJD-, NJF-, NPF-, TIJ-). Evidence is assessed through Trustable traceability and SME reviews (JLS-74), with direct CI-test links provided where available. In addition, completeness is assessed against the upstream basic_json API (JLS-72) with evidence of tests of a comprehensive set of arguments (JLS-31). - Are there any Expectations where we believe more coverage would help? - **Answer**: No additional top-level Expectation is currently missing. Extra tests would mainly increase confidence for already identified boundary cases (especially around WFJ-06), rather than reveal a gap in the Expectation set. - How do dependencies affect Expectations, and are their properties verifiable? From aa336886624cc1e81807389a8913d9acbd885071 Mon Sep 17 00:00:00 2001 From: d93317 Date: Wed, 11 Mar 2026 10:59:46 +0100 Subject: [PATCH 5/9] Changes in TA-INDICATORS_CONTEXT because of review comments. --- TSF/trustable/assertions/TA-INDICATORS_CONTEXT.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/TSF/trustable/assertions/TA-INDICATORS_CONTEXT.md b/TSF/trustable/assertions/TA-INDICATORS_CONTEXT.md index 6bed2e7efc..c294d60326 100644 --- a/TSF/trustable/assertions/TA-INDICATORS_CONTEXT.md +++ b/TSF/trustable/assertions/TA-INDICATORS_CONTEXT.md @@ -103,4 +103,8 @@ monitoring mechanisms have been implemented to collect the required data. - **Answer**: Yes, the CI data from the AWIs is useful to prevent regressions in the tested behaviour of the library and possible issues introduced due to a large number of open PRs from entering protected branches. - Are indicators from code, component, tool, or data inspections taken into consideration? - - **Answer**: Yes, all types of indicator are taken into consideration. + - **Answer**: All indicator types are considered in scope and in the analysis rationale, with different level of implementation in this repository. +For code inspections, we use CI-derived code evidence (JLS-54) and related CI analysis evidence. +For component inspections, no separate component-inspection AWI is implemented in this repository context because the library has no external components (JLS-34), and component-related runtime/system monitoring is therefore expected at integration level (AOU-19). +For tool inspections, tools are explicitly assessed (JLS-50), and a monitored CI/process indicator is implemented via the PR-count gate (JLS-55). +For data inspections, indicator data is collected and traceable for the implemented CI AWIs (JLS-54 and JLS-55), while continuous production/runtime monitoring is not implemented in this repository and is delegated to the integrator (AOU-09 and AOU-19). From 1a3bc5d58147d51510a19ad0dbd2335ebf4084b9 Mon Sep 17 00:00:00 2001 From: d93317 Date: Wed, 11 Mar 2026 11:13:07 +0100 Subject: [PATCH 6/9] Add changes in TA-MISBEHAVIOURS_CONTEXT because of review. --- TSF/trustable/assertions/TA-MISBEHAVIOURS_CONTEXT.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TSF/trustable/assertions/TA-MISBEHAVIOURS_CONTEXT.md b/TSF/trustable/assertions/TA-MISBEHAVIOURS_CONTEXT.md index b48d8973bb..17f06e3e4a 100644 --- a/TSF/trustable/assertions/TA-MISBEHAVIOURS_CONTEXT.md +++ b/TSF/trustable/assertions/TA-MISBEHAVIOURS_CONTEXT.md @@ -89,7 +89,7 @@ established and reusable solutions. **Suggested evidence** - List of identified Misbehaviours - - **Answer**: See JLS-11. + - **Answer**: A list of Misbehaviours was identified through STPA risk analysis (risk_analysis.md). Upstream bug tracking (JLS-11 and nlohmann_misbehaviours_comments.md) is used as complementary empirical evidence to confirm coverage and update the list where needed. - List of Expectations for mitigations addressing identified Misbehaviours - **Answer**: Mitigation expectations are expressed implicitly through (a) documented Quality assurance (https://json.nlohmann.me/community/quality_assurance) requirements and (b) concrete mitigation mechanisms captured by existing Statements: JLS-02 (fuzzing), JLS-31 (static analysis), JLS-25 (review/security policy), JLS-24 (defined failure mode via exceptions), and WFJ-06 (input validation via accept()). - Risk analysis @@ -127,9 +127,9 @@ considered against the list of Expectations. - Can we identify some new misbehaviours, right now? - **Answer**: No, currently no new misbehaviors can be identified. - Is every misbehaviour represented by at least one fault induction test? - - **Answer**: The expected behaviour of nlohmann/json is described by JLS-24 and its substatements in the trustable graph. For a random subset of 10 of these substatements (TIJ-01.1, TIJ-01.2, TIJ-05.1, TIJ-05.3, NPF-01.2, NPF-01.3, NPF-07.2, TIJ-02.4, TIJ-02.5, TIJ-02.2) we checked whether possible misbehaviours (like wrong inputs) are tested using fault induction tests. For all of these 10 substatements, at least one fault induction test is performed. We therefore conclude that most misbehaviours are represented by at least one fault induction test. + - **Answer**: The expected behaviour of nlohmann/json is described by JLS-24 and its substatements in the trustable graph. For every substatement at least one fault induction test is performed. Thus, every misbehaviour is represented by at least one fault induction test. - Are fault inductions used to demonstrate that tests which usually pass can and do fail appropriately? - - **Answer**: Yes. The project uses several forms of fault induction (malformed JSON, invalid API usage, simulated allocation failures, and fuzzing). Dedicated tests assert that these induced faults cause the library to fail in a well‑defined, expected way (e.g. by throwing specific exceptions). CI then confirms that these “failure‑expecting” tests keep behaving as specified. See JLS-76. + - **Answer**: The project uses several forms of fault induction on the library-behaviour level (malformed JSON, invalid API usage, simulated allocation failures, and fuzzing). Dedicated tests assert that these induced faults cause the library to fail in a well‑defined, expected way (e.g. by throwing specific exceptions). While the test framework itself is not tested by fault induction, there are some statements where positive and negative tests actively show expected failure behaviour of the library under induced faulty input, that pass with well-formed data (e.g., TIJ-04.1, evidence: nst's JSONTestSuite). CI then confirms that these "failure‑expecting" tests keep behaving as specified (JLS-76.). Due to the very comprehensive general fault induction testing employed, we see the instances of explicitly failing tests that usually pass rather as representative evidence than requiring a one-to-one matching to every graph leaf. - Are all the fault induction results actually collected? - **Answer**: Partially. For Unit / regression tests: their results are only captured as normal test pass/fail status and CI logs; there is no separate, persistent database of all induced faults and outcomes in the repository. For Fuzz tests (OSS‑Fuzz): the fuzzing infrastructure stores crashing inputs, logs, and statistics on the OSS‑Fuzz side, not in the nlohmann/json repo itself. See JLS-76 for further information. - Are the results evaluated? From 2d52efcf1efe55e374e10ee395a55d81d27b6750 Mon Sep 17 00:00:00 2001 From: d93317 Date: Wed, 11 Mar 2026 11:22:24 +0100 Subject: [PATCH 7/9] Fix bug in publish_documentation workflow to correctly use context files from the branch that is updated and not outdated files from save_historical_data branch. --- .github/workflows/publish_documentation.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_documentation.yml b/.github/workflows/publish_documentation.yml index ec8e55757a..b0059dda28 100644 --- a/.github/workflows/publish_documentation.yml +++ b/.github/workflows/publish_documentation.yml @@ -189,6 +189,8 @@ jobs: TSF_SCORING_DB: ${{ steps.select_db.outputs.db_path }} run: | set -euo pipefail + git checkout "$branch_name" + git checkout save_historical_data -- "$TSF_SCORING_DB" TSF/misbehaviours.md echo "[verify] TSF_SCORING_DB='$TSF_SCORING_DB'" test -n "$TSF_SCORING_DB" test -f "$TSF_SCORING_DB" @@ -200,9 +202,13 @@ jobs: - name: Checkout data storage branch run: | - git stash push --include-untracked -- . ':(exclude)TSF/data_storage' ':(exclude)TSF/data_storage/**' ':(exclude)TSF/TrustableScoring.db' + set -euo pipefail + temp_db="$RUNNER_TEMP/$(basename "$TSF_SCORING_DB").working" + cp "$TSF_SCORING_DB" "$temp_db" + git stash push --include-untracked -- . git checkout save_historical_data git pull + cp "$temp_db" "$TSF_SCORING_DB" - name: Store persistent data run: | @@ -221,7 +227,8 @@ jobs: - name: Recover stash run: | - git checkout $branch_name + set -euo pipefail + git checkout "$branch_name" git stash apply - name: Upload trudag artifact From 2a64dba12ebae0311c5bfd664f6f86ff71adea05 Mon Sep 17 00:00:00 2001 From: d93317 Date: Wed, 11 Mar 2026 12:10:21 +0100 Subject: [PATCH 8/9] Delete risk analysis and related graph files from current PR. --- TSF/docs/STPA_diagram_nlohmann.drawio | 174 -------- TSF/docs/STPA_diagram_nlohmann.png | Bin 68112 -> 0 bytes TSF/docs/risk_analysis.md | 589 -------------------------- 3 files changed, 763 deletions(-) delete mode 100644 TSF/docs/STPA_diagram_nlohmann.drawio delete mode 100644 TSF/docs/STPA_diagram_nlohmann.png delete mode 100644 TSF/docs/risk_analysis.md diff --git a/TSF/docs/STPA_diagram_nlohmann.drawio b/TSF/docs/STPA_diagram_nlohmann.drawio deleted file mode 100644 index f44ab57c21..0000000000 --- a/TSF/docs/STPA_diagram_nlohmann.drawio +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/TSF/docs/STPA_diagram_nlohmann.png b/TSF/docs/STPA_diagram_nlohmann.png deleted file mode 100644 index fea2efb348a7723b4c3156e524c3f55e5b856d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68112 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 Date: Fri, 13 Mar 2026 13:44:09 +0100 Subject: [PATCH 9/9] Fix bug in parent workflow to not skip coverage gate workflow when pushing to main. --- .github/workflows/docs.yml | 2 +- .github/workflows/parent-workflow.yml | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 1345f58914..11fe19d552 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -81,7 +81,7 @@ jobs: - name: Download trudag report artifact uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: trudag-report-${{ github.event.pull_request.head.sha || github.sha }} + name: trudag-report-${{ github.sha }} path: TSF/docs/generated/ - name: Build documentation diff --git a/.github/workflows/parent-workflow.yml b/.github/workflows/parent-workflow.yml index e44efd2c3f..a46c144083 100644 --- a/.github/workflows/parent-workflow.yml +++ b/.github/workflows/parent-workflow.yml @@ -67,8 +67,9 @@ jobs: coverage_gate: name: Run Coverage Gate Workflow needs: [ubuntu] - if: ${{ github.event_name == 'pull_request' && github.base_ref == 'main' - || github.event_name == 'schedule' }} + if: ${{ github.event_name == 'pull_request' && github.base_ref == 'main' + || github.event_name == 'push' && github.ref == 'refs/heads/main' + || github.event_name == 'schedule' }} uses: ./.github/workflows/coverage_gate.yml with: artifact_id: "coverage_gate-${{ github.sha }}" @@ -105,7 +106,7 @@ jobs: result="${{ needs[matrix.target].result }}" echo "${{ matrix.target }} workflow result: $result" - if [[ "$result" != "success" ]]; then + if [[ "$result" != "success" && "$result" != "skipped" ]]; then echo "❌ ${{ matrix.target }} workflow failed! Exiting..." exit 1 fi