From 5ce4a4df07f1307aac0acf6641baa2825a86919c Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 31 Oct 2026 17:02:12 +0100 Subject: [PATCH 1/8] Protect feature intake structure and triage routing --- .github/tests/FeatureIntake.Tests.ps1 | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/tests/FeatureIntake.Tests.ps1 diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 new file mode 100644 index 0000000..0a6f12a --- /dev/null +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -0,0 +1,70 @@ +#Requires -Version 7.4 +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*' } +#Requires -Modules @{ ModuleName = 'powershell-yaml'; ModuleVersion = '0.4.12' } + +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', '', + Justification = 'Pester executes setup and test blocks in separate scopes.' +)] +[CmdletBinding()] +param() + +$ErrorActionPreference = 'Stop' + +BeforeAll { + $formPath = Join-Path -Path $PSScriptRoot -ChildPath '..\ISSUE_TEMPLATE\10-feature.yml' + $form = ConvertFrom-Yaml -Yaml ([IO.File]::ReadAllText($formPath)) + $configurationPath = Join-Path -Path $PSScriptRoot -ChildPath '..\ISSUE_TEMPLATE\config.yml' + $configuration = ConvertFrom-Yaml -Yaml ([IO.File]::ReadAllText($configurationPath)) +} + +Describe 'Organization feature intake' { + It 'preserves the feature identity and triage routing without assigning a native type' { + $form.name | Should -BeExactly "`u{1F680} [Feature]" + $form.description | Should -BeExactly 'Suggest/request a new feature' + $form.title | Should -BeExactly "`u{1F680}[Feature]: " + @($form.labels).Count | Should -Be 2 + $form.labels[0] | Should -BeExactly 'feature' + $form.labels[1] | Should -BeExactly 'triage' + $form.ContainsKey('type') | Should -BeFalse + } + + It 'uses valid GitHub form keys and markdown and textarea attributes' { + ($form.Keys | Sort-Object) -join ',' | Should -BeExactly 'body,description,labels,name,title' + @($form.body).Count | Should -Be 2 + + $introduction = $form.body[0] + $introduction.type | Should -BeExactly 'markdown' + ($introduction.Keys | Sort-Object) -join ',' | Should -BeExactly 'attributes,type' + @($introduction.attributes.Keys) | Should -Be @('value') + $introduction.attributes.value | Should -BeOfType ([string]) + $introduction.attributes.value | Should -Not -BeNullOrEmpty + + $field = $form.body[1] + $field.type | Should -BeExactly 'textarea' + ($field.Keys | Sort-Object) -join ',' | Should -BeExactly 'attributes,id,type,validations' + $field.id | Should -Match '^[A-Za-z0-9_-]+$' + ($field.attributes.Keys | Sort-Object) -join ',' | Should -BeExactly 'description,label' + $field.attributes.label | Should -BeOfType ([string]) + $field.attributes.label | Should -Not -BeNullOrEmpty + $field.attributes.description | Should -BeOfType ([string]) + $field.attributes.description | Should -Not -BeNullOrEmpty + @($field.validations.Keys) | Should -Be @('required') + $field.validations.required | Should -BeOfType ([bool]) + } + + It 'requires only the existing free-text description field' { + $fields = @($form.body | Where-Object { $_.type -ne 'markdown' }) + $fields.Count | Should -Be 1 + $fields[0].id | Should -BeExactly 'description' + $fields[0].type | Should -BeExactly 'textarea' + $fields[0].validations.required | Should -BeTrue + $fields[0].attributes.ContainsKey('value') | Should -BeFalse + } + + It 'keeps blank feedback intake available' { + @($configuration.Keys) | Should -Be @('blank_issues_enabled') + $configuration.blank_issues_enabled | Should -BeOfType ([bool]) + $configuration.blank_issues_enabled | Should -BeTrue + } +} From f0c68d5e45997d7776dd75e3ca97d9e92156d2dc Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 31 Oct 2026 17:04:36 +0100 Subject: [PATCH 2/8] Specify consumer-focused feature intake expectations --- .github/tests/FeatureIntake.Tests.ps1 | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 index 0a6f12a..284fd88 100644 --- a/.github/tests/FeatureIntake.Tests.ps1 +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -14,6 +14,8 @@ $ErrorActionPreference = 'Stop' BeforeAll { $formPath = Join-Path -Path $PSScriptRoot -ChildPath '..\ISSUE_TEMPLATE\10-feature.yml' $form = ConvertFrom-Yaml -Yaml ([IO.File]::ReadAllText($formPath)) + $guidance = ($form.body[0].attributes.value -replace '\s+', ' ').Trim() + $prompt = ($form.body[1].attributes.description -replace '\s+', ' ').Trim() $configurationPath = Join-Path -Path $PSScriptRoot -ChildPath '..\ISSUE_TEMPLATE\config.yml' $configuration = ConvertFrom-Yaml -Yaml ([IO.File]::ReadAllText($configurationPath)) } @@ -67,4 +69,41 @@ Describe 'Organization feature intake' { $configuration.blank_issues_enabled | Should -BeOfType ([bool]) $configuration.blank_issues_enabled | Should -BeTrue } + + It 'asks for the consumer need and who benefits' { + $form.body[1].attributes.label | Should -BeExactly 'Describe the need' + $prompt | Should -Match ([regex]::Escape('What are you trying to do, and who would benefit?')) + } + + It 'asks why the need matters' { + $prompt | Should -Match ([regex]::Escape('Why does this matter? Describe the problem or opportunity.')) + } + + It 'asks for a plain-language situation, action, and expected result' { + $scenario = 'What should happen? Give a short example of the situation, ' + + 'the action you take, and the result you expect.' + $prompt | Should -Match ([regex]::Escape($scenario)) + "$guidance $prompt" | Should -Not -Match '\b(Gherkin|Given|When|Then)\b' + } + + It 'links the canonical issue and planning guidance instead of copying it' { + $guidance | Should -Match ([regex]::Escape('See [MSX issues][issues] and [issue planning][planning].')) + $guidance | Should -Match ([regex]::Escape('[issues]: https://msx.no/docs/Ways-of-Working/Issues/')) + $planningLink = '[planning]: https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/' + $guidance | Should -Match ([regex]::Escape($planningLink)) + } + + It 'keeps external feedback separate from internal planning work' { + $routing = 'This form collects feedback. Maintainers will link any internal planning work separately.' + $guidance | Should -Match ([regex]::Escape($routing)) + } + + It 'does not require a technical solution or a special submission format' { + $reassurance = 'You do not need to propose a technical solution or use a special format.' + $guidance | Should -Match ([regex]::Escape($reassurance)) + } + + It 'does not solicit implementation choices or alternatives' { + $prompt | Should -Not -Match '\b(implement(?:ation|ed)?|alternatives?)\b' + } } From 7e7d92988e56a04e3446b2d790adff5c5f1bff1c Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 31 Oct 2026 17:12:15 +0100 Subject: [PATCH 3/8] Describe consumer needs in the shared feature intake --- .github/ISSUE_TEMPLATE/10-feature.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/10-feature.yml b/.github/ISSUE_TEMPLATE/10-feature.yml index 9d090e2..21c1898 100644 --- a/.github/ISSUE_TEMPLATE/10-feature.yml +++ b/.github/ISSUE_TEMPLATE/10-feature.yml @@ -8,16 +8,25 @@ body: - type: markdown attributes: value: | - Thank you for suggesting a new feature. Please provide as much - information as possible so we can understand your request better. + Thank you for suggesting a feature. Tell us what you need and what + you expect to happen. You do not need to propose a technical solution + or use a special format. + + See [MSX issues][issues] and [issue planning][planning]. + + This form collects feedback. Maintainers will link any internal + planning work separately. + + [issues]: https://msx.no/docs/Ways-of-Working/Issues/ + [planning]: https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/ - type: textarea id: description attributes: - label: Description + label: Describe the need description: | - Please describe your idea/request - Feel free to add suggestions how you would like to see this - implemented. - Are there alternatives you've considered? + What are you trying to do, and who would benefit? + Why does this matter? Describe the problem or opportunity. + What should happen? Give a short example of the situation, + the action you take, and the result you expect. validations: required: true From 1004e86180ec984992e77b1ff88a6e087274b9e7 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sat, 31 Oct 2026 17:12:15 +0100 Subject: [PATCH 4/8] Keep feature intake regressions free of extra parser dependencies --- .github/tests/FeatureIntake.Tests.ps1 | 91 ++++++++++++++------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 index 284fd88..f44a4ce 100644 --- a/.github/tests/FeatureIntake.Tests.ps1 +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -1,6 +1,5 @@ #Requires -Version 7.4 #Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*' } -#Requires -Modules @{ ModuleName = 'powershell-yaml'; ModuleVersion = '0.4.12' } [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSUseDeclaredVarsMoreThanAssignments', '', @@ -13,65 +12,63 @@ $ErrorActionPreference = 'Stop' BeforeAll { $formPath = Join-Path -Path $PSScriptRoot -ChildPath '..\ISSUE_TEMPLATE\10-feature.yml' - $form = ConvertFrom-Yaml -Yaml ([IO.File]::ReadAllText($formPath)) - $guidance = ($form.body[0].attributes.value -replace '\s+', ' ').Trim() - $prompt = ($form.body[1].attributes.description -replace '\s+', ' ').Trim() + $content = [IO.File]::ReadAllText($formPath) -replace '\r\n?', "`n" + $shape = @' +\A--- +# GitHub issue form syntax and schema\. +name: (?[^\n]+) +description: (?[^\n]+) +title: '(?[^'\n]+)' +labels: \['feature', 'triage'\] +body: + - type: markdown + attributes: + value: \| +(?<Guidance>(?: [^\n]*\n|\n)+) - type: textarea + id: description + attributes: + label: (?<Label>[^\n]+) + description: \| +(?<Prompt>(?: [^\n]*\n)+) validations: + required: true\n\z +'@ + $form = [regex]::Match($content, ($shape -replace '\r\n?', "`n")) + $introduction = $form.Groups['Guidance'].Value -replace '(?m)^ {8}', '' + $guidance = ($introduction -replace '\s+', ' ').Trim() + $prompt = ($form.Groups['Prompt'].Value -replace '\s+', ' ').Trim() $configurationPath = Join-Path -Path $PSScriptRoot -ChildPath '..\ISSUE_TEMPLATE\config.yml' - $configuration = ConvertFrom-Yaml -Yaml ([IO.File]::ReadAllText($configurationPath)) + $configuration = [IO.File]::ReadAllText($configurationPath) -replace '\r\n?', "`n" } Describe 'Organization feature intake' { It 'preserves the feature identity and triage routing without assigning a native type' { - $form.name | Should -BeExactly "`u{1F680} [Feature]" - $form.description | Should -BeExactly 'Suggest/request a new feature' - $form.title | Should -BeExactly "`u{1F680}[Feature]: " - @($form.labels).Count | Should -Be 2 - $form.labels[0] | Should -BeExactly 'feature' - $form.labels[1] | Should -BeExactly 'triage' - $form.ContainsKey('type') | Should -BeFalse + $form.Groups['Name'].Value | Should -BeExactly "`u{1F680} [Feature]" + $form.Groups['Description'].Value | Should -BeExactly 'Suggest/request a new feature' + $form.Groups['Title'].Value | Should -BeExactly "`u{1F680}[Feature]: " + $content | Should -Match "(?m)^labels: \['feature', 'triage'\]$" + $content | Should -Not -Match '(?m)^type:' } - It 'uses valid GitHub form keys and markdown and textarea attributes' { - ($form.Keys | Sort-Object) -join ',' | Should -BeExactly 'body,description,labels,name,title' - @($form.body).Count | Should -Be 2 - - $introduction = $form.body[0] - $introduction.type | Should -BeExactly 'markdown' - ($introduction.Keys | Sort-Object) -join ',' | Should -BeExactly 'attributes,type' - @($introduction.attributes.Keys) | Should -Be @('value') - $introduction.attributes.value | Should -BeOfType ([string]) - $introduction.attributes.value | Should -Not -BeNullOrEmpty - - $field = $form.body[1] - $field.type | Should -BeExactly 'textarea' - ($field.Keys | Sort-Object) -join ',' | Should -BeExactly 'attributes,id,type,validations' - $field.id | Should -Match '^[A-Za-z0-9_-]+$' - ($field.attributes.Keys | Sort-Object) -join ',' | Should -BeExactly 'description,label' - $field.attributes.label | Should -BeOfType ([string]) - $field.attributes.label | Should -Not -BeNullOrEmpty - $field.attributes.description | Should -BeOfType ([string]) - $field.attributes.description | Should -Not -BeNullOrEmpty - @($field.validations.Keys) | Should -Be @('required') - $field.validations.required | Should -BeOfType ([bool]) + It 'retains the supported whole-form metadata and markdown and textarea structure' { + $form.Success | Should -BeTrue + $guidance | Should -Not -BeNullOrEmpty + $form.Groups['Label'].Value | Should -Not -BeNullOrEmpty + $prompt | Should -Not -BeNullOrEmpty } It 'requires only the existing free-text description field' { - $fields = @($form.body | Where-Object { $_.type -ne 'markdown' }) - $fields.Count | Should -Be 1 - $fields[0].id | Should -BeExactly 'description' - $fields[0].type | Should -BeExactly 'textarea' - $fields[0].validations.required | Should -BeTrue - $fields[0].attributes.ContainsKey('value') | Should -BeFalse + [regex]::Matches($content, '(?m)^ - type: (?!markdown$)').Count | Should -Be 1 + $content | Should -Match '(?m)^ id: description$' + $content | Should -Match '(?m)^ required: true$' + $form.Success | Should -BeTrue } It 'keeps blank feedback intake available' { - @($configuration.Keys) | Should -Be @('blank_issues_enabled') - $configuration.blank_issues_enabled | Should -BeOfType ([bool]) - $configuration.blank_issues_enabled | Should -BeTrue + $configuration | Should -BeExactly "blank_issues_enabled: true`n" } It 'asks for the consumer need and who benefits' { - $form.body[1].attributes.label | Should -BeExactly 'Describe the need' + $form.Groups['Label'].Value | Should -BeExactly 'Describe the need' $prompt | Should -Match ([regex]::Escape('What are you trying to do, and who would benefit?')) } @@ -91,6 +88,12 @@ Describe 'Organization feature intake' { $guidance | Should -Match ([regex]::Escape('[issues]: https://msx.no/docs/Ways-of-Working/Issues/')) $planningLink = '[planning]: https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/' $guidance | Should -Match ([regex]::Escape($planningLink)) + + $html = (ConvertFrom-Markdown -InputObject $introduction).Html + $links = [regex]::Matches($html, '<a href="([^"]+)"') + $links.Count | Should -Be 2 + $links[0].Groups[1].Value | Should -BeExactly 'https://msx.no/docs/Ways-of-Working/Issues/' + $links[1].Groups[1].Value | Should -BeExactly 'https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/' } It 'keeps external feedback separate from internal planning work' { From f4216e800fc779ffb0664222f64478d56de5c5d8 Mon Sep 17 00:00:00 2001 From: Marius Storhaug <marstor@hotmail.com> Date: Sat, 31 Oct 2026 17:18:14 +0100 Subject: [PATCH 5/8] Specify frozen planning and routing correspondence --- .github/tests/FeatureIntake.Tests.ps1 | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 index f44a4ce..9bfff1b 100644 --- a/.github/tests/FeatureIntake.Tests.ps1 +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -83,17 +83,23 @@ Describe 'Organization feature intake' { "$guidance $prompt" | Should -Not -Match '\b(Gherkin|Given|When|Then)\b' } - It 'links the canonical issue and planning guidance instead of copying it' { - $guidance | Should -Match ([regex]::Escape('See [MSX issues][issues] and [issue planning][planning].')) - $guidance | Should -Match ([regex]::Escape('[issues]: https://msx.no/docs/Ways-of-Working/Issues/')) + It 'asks for a failure or boundary example only when it matters' { + $boundary = 'If a failure or limit changes what you expect, include that example too.' + $prompt | Should -Match ([regex]::Escape($boundary)) + } + + It 'links canonical planning and native routing instead of copying the guidance' { + $guidance | Should -Match ([regex]::Escape('See [issue planning][planning] and [issue routing][routing].')) $planningLink = '[planning]: https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/' $guidance | Should -Match ([regex]::Escape($planningLink)) + $routingLink = '[routing]: https://msx.no/docs/Ways-of-Working/Issues/Types/Hierarchy/' + $guidance | Should -Match ([regex]::Escape($routingLink)) $html = (ConvertFrom-Markdown -InputObject $introduction).Html $links = [regex]::Matches($html, '<a href="([^"]+)"') $links.Count | Should -Be 2 - $links[0].Groups[1].Value | Should -BeExactly 'https://msx.no/docs/Ways-of-Working/Issues/' - $links[1].Groups[1].Value | Should -BeExactly 'https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/' + $links[0].Groups[1].Value | Should -BeExactly 'https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/' + $links[1].Groups[1].Value | Should -BeExactly 'https://msx.no/docs/Ways-of-Working/Issues/Types/Hierarchy/' } It 'keeps external feedback separate from internal planning work' { From 5edc236cf2bc365931483487a5a0d471b3779629 Mon Sep 17 00:00:00 2001 From: Marius Storhaug <marstor@hotmail.com> Date: Sat, 31 Oct 2026 17:23:23 +0100 Subject: [PATCH 6/8] Align feature intake with frozen planning and native routing --- .github/ISSUE_TEMPLATE/10-feature.yml | 5 +++-- .github/tests/FeatureIntake.Tests.ps1 | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/10-feature.yml b/.github/ISSUE_TEMPLATE/10-feature.yml index 21c1898..8798e67 100644 --- a/.github/ISSUE_TEMPLATE/10-feature.yml +++ b/.github/ISSUE_TEMPLATE/10-feature.yml @@ -12,13 +12,13 @@ body: you expect to happen. You do not need to propose a technical solution or use a special format. - See [MSX issues][issues] and [issue planning][planning]. + See [issue planning][planning] and [issue routing][routing]. This form collects feedback. Maintainers will link any internal planning work separately. - [issues]: https://msx.no/docs/Ways-of-Working/Issues/ [planning]: https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/ + [routing]: https://msx.no/docs/Ways-of-Working/Issues/Types/Hierarchy/ - type: textarea id: description attributes: @@ -28,5 +28,6 @@ body: Why does this matter? Describe the problem or opportunity. What should happen? Give a short example of the situation, the action you take, and the result you expect. + If a failure or limit changes what you expect, include that example too. validations: required: true diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 index 9bfff1b..f517fcc 100644 --- a/.github/tests/FeatureIntake.Tests.ps1 +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -80,7 +80,7 @@ Describe 'Organization feature intake' { $scenario = 'What should happen? Give a short example of the situation, ' + 'the action you take, and the result you expect.' $prompt | Should -Match ([regex]::Escape($scenario)) - "$guidance $prompt" | Should -Not -Match '\b(Gherkin|Given|When|Then)\b' + "$guidance $prompt" | Should -Not -Match '\bGherkin\b|\bGiven\s*/\s*When\s*/\s*Then\b' } It 'asks for a failure or boundary example only when it matters' { From d879bd211cbc382bcc9f9c646ed8893ab4184aea Mon Sep 17 00:00:00 2001 From: Marius Storhaug <marstor@hotmail.com> Date: Wed, 4 Nov 2026 13:17:29 +0100 Subject: [PATCH 7/8] Use direct requests in the shared feature form --- .github/ISSUE_TEMPLATE/10-feature.yml | 16 ++++++++-------- .github/tests/FeatureIntake.Tests.ps1 | 16 +++++++++++----- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/10-feature.yml b/.github/ISSUE_TEMPLATE/10-feature.yml index 8798e67..19d6abb 100644 --- a/.github/ISSUE_TEMPLATE/10-feature.yml +++ b/.github/ISSUE_TEMPLATE/10-feature.yml @@ -8,14 +8,14 @@ body: - type: markdown attributes: value: | - Thank you for suggesting a feature. Tell us what you need and what - you expect to happen. You do not need to propose a technical solution + Describe what you need and the result you expect. + You do not need to propose a technical solution or use a special format. See [issue planning][planning] and [issue routing][routing]. - This form collects feedback. Maintainers will link any internal - planning work separately. + This form collects feedback. Maintainers record internal plans + in separate issues linked to the feedback. [planning]: https://msx.no/docs/Ways-of-Working/Issues/Process/Planning/ [routing]: https://msx.no/docs/Ways-of-Working/Issues/Types/Hierarchy/ @@ -24,10 +24,10 @@ body: attributes: label: Describe the need description: | - What are you trying to do, and who would benefit? - Why does this matter? Describe the problem or opportunity. - What should happen? Give a short example of the situation, + Describe what you need to do and who benefits. + Explain why this matters. Describe the problem or opportunity. + Describe the expected behavior. Give a short example of the situation, the action you take, and the result you expect. - If a failure or limit changes what you expect, include that example too. + If a failure or limit changes what you expect, include an example. validations: required: true diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 index f517fcc..c1bb2cd 100644 --- a/.github/tests/FeatureIntake.Tests.ps1 +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -67,24 +67,29 @@ Describe 'Organization feature intake' { $configuration | Should -BeExactly "blank_issues_enabled: true`n" } + It 'starts with a direct request without thanks or a future promise' { + $guidance | Should -Match '^Describe what you need and the result you expect\. ' + $guidance | Should -Not -Match '\b(thank(?:s|\s+you)|will)\b' + } + It 'asks for the consumer need and who benefits' { $form.Groups['Label'].Value | Should -BeExactly 'Describe the need' - $prompt | Should -Match ([regex]::Escape('What are you trying to do, and who would benefit?')) + $prompt | Should -Match ([regex]::Escape('Describe what you need to do and who benefits.')) } It 'asks why the need matters' { - $prompt | Should -Match ([regex]::Escape('Why does this matter? Describe the problem or opportunity.')) + $prompt | Should -Match ([regex]::Escape('Explain why this matters. Describe the problem or opportunity.')) } It 'asks for a plain-language situation, action, and expected result' { - $scenario = 'What should happen? Give a short example of the situation, ' + + $scenario = 'Describe the expected behavior. Give a short example of the situation, ' + 'the action you take, and the result you expect.' $prompt | Should -Match ([regex]::Escape($scenario)) "$guidance $prompt" | Should -Not -Match '\bGherkin\b|\bGiven\s*/\s*When\s*/\s*Then\b' } It 'asks for a failure or boundary example only when it matters' { - $boundary = 'If a failure or limit changes what you expect, include that example too.' + $boundary = 'If a failure or limit changes what you expect, include an example.' $prompt | Should -Match ([regex]::Escape($boundary)) } @@ -103,7 +108,8 @@ Describe 'Organization feature intake' { } It 'keeps external feedback separate from internal planning work' { - $routing = 'This form collects feedback. Maintainers will link any internal planning work separately.' + $routing = 'This form collects feedback. Maintainers record internal plans ' + + 'in separate issues linked to the feedback.' $guidance | Should -Match ([regex]::Escape($routing)) } From 589285cfb6c2ecc761c5308de4527d2dd2c54bd4 Mon Sep 17 00:00:00 2001 From: Marius Storhaug <marstor@hotmail.com> Date: Wed, 4 Nov 2026 13:22:29 +0100 Subject: [PATCH 8/8] Keep wording review evidence out of the intake test suite --- .github/tests/FeatureIntake.Tests.ps1 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/tests/FeatureIntake.Tests.ps1 b/.github/tests/FeatureIntake.Tests.ps1 index c1bb2cd..46d4a55 100644 --- a/.github/tests/FeatureIntake.Tests.ps1 +++ b/.github/tests/FeatureIntake.Tests.ps1 @@ -67,11 +67,6 @@ Describe 'Organization feature intake' { $configuration | Should -BeExactly "blank_issues_enabled: true`n" } - It 'starts with a direct request without thanks or a future promise' { - $guidance | Should -Match '^Describe what you need and the result you expect\. ' - $guidance | Should -Not -Match '\b(thank(?:s|\s+you)|will)\b' - } - It 'asks for the consumer need and who benefits' { $form.Groups['Label'].Value | Should -BeExactly 'Describe the need' $prompt | Should -Match ([regex]::Escape('Describe what you need to do and who benefits.'))