Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f944300
📝 document first-push PR behavior
aicia-bot Oct 2, 2026
e8a1593
♻️ update git-remote-pr contract
aicia-bot Oct 2, 2026
05c44a9
🔨 support first-push publication
aicia-bot Oct 2, 2026
65d7b07
💬 add 0.11.2 changelog entry
aicia-bot Oct 3, 2026
89cc864
📝 update README skill summaries
aicia-bot Oct 3, 2026
3b0d8aa
♻️ refine yolo changelog behavior
aicia-bot Oct 3, 2026
96bdea8
♻️ resolve NuGet release note ranges
aicia-bot Oct 3, 2026
ed8a602
🔨 validate release-note skill contracts
aicia-bot Oct 3, 2026
d70fe89
♻️ require complete NuGet release blocks
aicia-bot Oct 3, 2026
09a7930
🔨 validate complete NuGet package coverage
aicia-bot Oct 3, 2026
e7a1d80
📝 document complete NuGet release coverage
aicia-bot Oct 3, 2026
fbd4a9c
📝 clarify Unicode emoji selection across git skills
aicia-bot Oct 3, 2026
9eb1ed5
🦺 accept Unicode symbols in commit subject validation
aicia-bot Oct 3, 2026
a292408
✅ cover extended Unicode commit emoji validation
aicia-bot Oct 3, 2026
80b8d5d
💬 expand release notes for version 0.11.2
aicia-bot Oct 3, 2026
4982d2a
🦺 distinguish emoji from ordinary symbols in commit subjects
aicia-bot Oct 3, 2026
7f64500
📝 document Unicode emoji data used by subject validation
aicia-bot Oct 3, 2026
8e9f1ea
✅ split pr regressions into their own suite
aicia-bot Oct 3, 2026
07593a7
👷 schedule pr regressions in ci
aicia-bot Oct 3, 2026
651967a
📝 document the pr validation suite
aicia-bot Oct 3, 2026
39fe4a4
✅ stabilize progress coalescing regression test
aicia-bot Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/validate-skill-templates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ jobs:
timeout-minutes: 5
strategy:
fail-fast: false
max-parallel: 13
max-parallel: 14
matrix:
include:
- { name: templates, script: scripts/validate-skill-templates.ps1, suite: Templates }
- { name: pr, script: scripts/validate-skill-templates.ps1, suite: Pr }
- { name: preparation, script: scripts/validate-skill-templates.ps1, suite: Preparation }
- { name: runners, script: scripts/validate-skill-templates.ps1, suite: Runners }
- { name: docfx, script: scripts/validate-skill-templates.ps1, suite: Docfx }
Expand Down
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.11.2] - 2026-10-03

This is a patch release that supports PR publication from branches without upstream tracking, refines changelog and NuGet release-note workflows, and allows Unicode emoji choices beyond the bundled commit-language tables.

### Added

- `git-remote-pr` supports publishing clean feature branches without tracking to GitHub `origin` or the sole GitHub remote under the exact current branch name; the preview and approval ID bind upstream setup, execution establishes tracking with a normal push, and post-push checks verify the published branch and tracking before PR metadata writes.

### Changed

- `git-keep-a-changelog` yolo/auto mode requires an explicit version or version-prefixed branch and omits the `Unreleased` heading and footer link on creation, updates, and reruns; existing entries must be reconciled into the concrete release, with unresolved content blocking edits,
- `git-nuget-release-notes` defaults to the full branch delta against the integration-branch merge-base, treats same-named tracking branches as synchronization targets, honors explicit ranges, and regenerates existing target-version drafts without narrowing scope to unpushed commits,
- `git-nuget-release-notes` covers every packable `src/` project by default, including unchanged packages, requiring a complete version and availability block with non-empty ALM; it uses the prescribed default ALM text when no package-specific ALM outcomes survive and verifies coverage while preserving older blocks,
- `git-visual-commits` and `git-visual-squash-summary` emoji guidance treats bundled tables as examples and honors user choices and repository conventions; commit-subject validation accepts a single Unicode emoji or symbol sequence beyond those tables while retaining spacing, lowercase, prefix, and length checks,
- Expanded deterministic repository assertions, commit-subject and PR regression tests, and versioned eval cases for the revised publication, changelog, NuGet coverage, and emoji-selection contracts.

## [0.11.1] - 2026-09-29

This is a patch release delivering validation hardening for `git-remote-release` with stricter em-dash and alert-block enforcement, comprehensive test coverage for format compliance, Microsoft.Testing.Platform test runner support in `dotnet-remote-testing`, clarified yolo/auto approval behavior in `git-remote-pr`, and visual skill identification with hero images.
Expand Down Expand Up @@ -747,6 +763,7 @@ This is a minor release that introduces two complementary git workflow skills, e

- Improved scaffold fidelity with hidden `.bot` asset preservation, explicit UTF-8 and BOM handling, and checks aimed at preventing mojibake or incomplete generated output.

[0.11.2]: https://github.com/codebeltnet/agentic/compare/v0.11.1...v0.11.2
[0.11.1]: https://github.com/codebeltnet/agentic/compare/v0.11.0...v0.11.1
[0.11.0]: https://github.com/codebeltnet/agentic/compare/v0.10.1...v0.11.0
[0.10.1]: https://github.com/codebeltnet/agentic/compare/v0.10.0...v0.10.1
Expand Down
15 changes: 9 additions & 6 deletions README.md

Large diffs are not rendered by default.

89 changes: 72 additions & 17 deletions scripts/eval-runners/tests/test-progress-coalescing.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,23 @@ function Get-RelayLogEvents {
<# Relay events in JSONL (origin=relay). #>
param([object[]]$Events)
return @($Events | Where-Object { [string]$_.origin -eq 'relay' })
}
}

function Invoke-CapturedHeartbeatTick {
param([Parameter(Mandatory = $true)][object]$Child)

$operatorErrorWriter = [System.IO.StringWriter]::new([Globalization.CultureInfo]::InvariantCulture)
$originalErrorWriter = [Console]::Error
try {
[Console]::SetError($operatorErrorWriter)
Invoke-RunnerChildHeartbeatTick -Child $Child
} finally {
try { [Console]::Error.Flush() } catch { }
[Console]::SetError($originalErrorWriter)
}

return @(($operatorErrorWriter.ToString() -split "`r?`n") | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
}

try {
# ------------------------------------------------------------------
Expand Down Expand Up @@ -158,22 +174,61 @@ for ($i = 0; $i -lt 14; $i++) {
}
[Console]::Out.Write('{"status":"completed"}')
'@
$activeRelay = Invoke-CoalescingChild -ScriptPath $activeRelayScript -WorkerId 'arm-3-active-relay' -HeartbeatSeconds 0.25
Assert-Equal 0 $activeRelay.ExitCode 'Test 3: active relay child exits cleanly'
$activeRelayConsoleLines = @(Get-RelayConsoleLines -Lines $activeRelay.OperatorLines)
$activeParentPeriodicLines = @(Get-ParentPeriodicLines -Lines $activeRelay.OperatorLines)
Assert-True ($activeRelayConsoleLines.Count -ge 8) "Test 3: relay events appear on console (got $($activeRelayConsoleLines.Count))"
# With relay emitting every 80ms and heartbeat at 250ms, parent heartbeats
# during active relay should be sparse: at most 1-2 (possibly 1 at launch
# before relay arrives, possibly 1 after relay stops).
Assert-True ($activeParentPeriodicLines.Count -le 3) "Test 3: parent periodic heartbeats suppressed during active relay (console count=$($activeParentPeriodicLines.Count), relay count=$($activeRelayConsoleLines.Count))"
# JSONL must still have parent periodic events even when console-suppressed.
$activeParentLogEvents = @(Get-ParentPeriodicLogEvents -Events $activeRelay.Events)
$activeRelayLogEvents = @(Get-RelayLogEvents -Events $activeRelay.Events)
Assert-True ($activeParentLogEvents.Count -ge 2) "Test 3: parent periodic events still in JSONL even when console-suppressed (got $($activeParentLogEvents.Count))"
Assert-True ($activeRelayLogEvents.Count -ge 8) "Test 3: relay events in JSONL (got $($activeRelayLogEvents.Count))"

# ------------------------------------------------------------------
$activeRelay = Invoke-CoalescingChild -ScriptPath $activeRelayScript -WorkerId 'arm-3-active-relay' -HeartbeatSeconds 0.25
Assert-Equal 0 $activeRelay.ExitCode 'Test 3: active relay child exits cleanly'
$activeRelayConsoleLines = @(Get-RelayConsoleLines -Lines $activeRelay.OperatorLines)
Assert-True ($activeRelayConsoleLines.Count -ge 8) "Test 3: relay events appear on console (got $($activeRelayConsoleLines.Count))"
# The async child reader can be delayed by host load. Heartbeats emitted
# before its first relay is observed are correct, so test the policy below
# with controlled activity timestamps instead of asserting a wall-clock line
# count for this subprocess scenario.
$activeParentLogEvents = @(Get-ParentPeriodicLogEvents -Events $activeRelay.Events)
$activeRelayLogEvents = @(Get-RelayLogEvents -Events $activeRelay.Events)
Assert-True ($activeParentLogEvents.Count -ge 2) "Test 3: parent periodic events are retained in JSONL (got $($activeParentLogEvents.Count))"
Assert-True ($activeRelayLogEvents.Count -ge 8) "Test 3: relay events in JSONL (got $($activeRelayLogEvents.Count))"

# Test 3b - Deterministic coalescing policy: a recent relay suppresses only
# the console heartbeat while retaining JSONL evidence; once relay activity
# is stale, the parent heartbeat is visible again.
$policyStartedUtc = [DateTime]::UtcNow.AddSeconds(-5)
$policyLogPath = Join-Path $testRoot 'coalescing-policy.jsonl'
$policyChild = [pscustomobject]@{
Runner = 'relay-test'
WorkerId = 'arm-3-policy'
EvalId = 1
Configuration = 'with_skill'
ProcessId = 12345
Phase = 'model-cli'
Turn = $null
ProgressLogPath = $policyLogPath
HeartbeatSeconds = 0.25
ProgressEnabled = $true
StartedUtc = $policyStartedUtc
DeadlineUtc = $policyStartedUtc.AddSeconds(30)
StdoutActivity = $null
StderrActivity = $null
LastHeartbeatUtc = [DateTime]::UtcNow.AddSeconds(-1)
LastRelayActivityUtc = [DateTime]::UtcNow
FirstStdoutSeen = $true
FirstStderrSeen = $true
LifecycleState = 'running'
}
$recentRelayConsoleLines = @(Invoke-CapturedHeartbeatTick -Child $policyChild)
Assert-Equal 0 $recentRelayConsoleLines.Count 'Test 3b: recent relay activity suppresses the console heartbeat'
$recentRelayLogEvents = @(Get-Content -LiteralPath $policyLogPath | ForEach-Object { $_ | ConvertFrom-Json })
$recentRelayParentEvents = @(Get-ParentPeriodicLogEvents -Events $recentRelayLogEvents)
Assert-Equal 1 $recentRelayParentEvents.Count 'Test 3b: suppressed heartbeat remains in JSONL'

$policyChild.LastHeartbeatUtc = [DateTime]::UtcNow.AddSeconds(-1)
$policyChild.LastRelayActivityUtc = [DateTime]::UtcNow.AddSeconds(-1)
$staleRelayConsoleLines = @(Invoke-CapturedHeartbeatTick -Child $policyChild)
$staleRelayParentLines = @(Get-ParentPeriodicLines -Lines $staleRelayConsoleLines)
Assert-Equal 1 $staleRelayParentLines.Count 'Test 3b: heartbeat resumes on the console after relay activity goes stale'
$allPolicyLogEvents = @(Get-Content -LiteralPath $policyLogPath | ForEach-Object { $_ | ConvertFrom-Json })
$allPolicyParentEvents = @(Get-ParentPeriodicLogEvents -Events $allPolicyLogEvents)
Assert-Equal 2 $allPolicyParentEvents.Count 'Test 3b: visible heartbeat also remains in JSONL'

# ------------------------------------------------------------------
# Test 4 - Relay stops, parent resumes: after relay goes quiet, parent
# periodic heartbeat lines must resume on the console.
# ------------------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions scripts/test-validation-suites.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ foreach ($script in @('scripts/validate-skill-templates.ps1', 'scripts/eval-runn
$attribute = @($parameter.Attributes | Where-Object { $_.TypeName.Name -eq 'ValidateSet' })[0]
$expected = @($attribute.PositionalArguments | ForEach-Object { $_.SafeGetValue() } | Where-Object { $_ -ne 'All' })
if ($script -eq 'scripts/validate-skill-templates.ps1') {
$prCheck = @($ast.FindAll({ param($node) $node -is [Management.Automation.Language.CommandAst] -and $node.GetCommandName() -eq 'Add-ValidationResult' -and $node.Extent.Text.Contains("-Name 'Git remote PR routing and deterministic workflow stay integrated'") }, $true))
if ($prCheck.Count -ne 1 -or $prCheck[0].Extent.Text -notmatch "-Group 'Pr'") { throw 'PR workflow regressions must run exactly once in their own Pr suite so template builds can execute concurrently in CI and locally.' }
# These two aggregate groups are expanded into their own test suites.
$expected = @($expected | Where-Object { $_ -notin @('Conformance', 'Integrity') })
$groups = @($ast.FindAll({ param($node) $node -is [Management.Automation.Language.CommandAst] -and $node.GetCommandName() -eq 'Add-ValidationResult' }, $true) | ForEach-Object {
Expand Down
1 change: 1 addition & 0 deletions scripts/tests/test-validate-local.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,7 @@ try {
Assert-True -Condition ($LASTEXITCODE -eq 0) -Message 'expected suite listing to succeed'
$entries = @($listed | Where-Object { [string]$_ -match ' -> ' })
Assert-True -Condition ($entries.Count -ge 1) -Message 'expected at least one CI suite'
Assert-True -Condition ($entries -contains 'pr -> scripts/validate-skill-templates.ps1 -Suite Pr') -Message 'expected PR regressions to be independently scheduled locally as in CI'
foreach ($entry in $entries) {
$parts = [string]$entry -split ' -> '
$scriptArguments = $parts[1] -split ' -Suite '
Expand Down
Loading
Loading