From dc3cd2d547565c12fd9df26d89cb813bf64c3083 Mon Sep 17 00:00:00 2001 From: Doc Reo Date: Thu, 10 Sep 2026 16:43:12 -0700 Subject: [PATCH 1/6] SignalFlow Mini V1 RD3: add modern oval voice overlay template --- tools/ModernVoiceOverlay.cs.txt | 343 ++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 tools/ModernVoiceOverlay.cs.txt diff --git a/tools/ModernVoiceOverlay.cs.txt b/tools/ModernVoiceOverlay.cs.txt new file mode 100644 index 0000000..01ceb80 --- /dev/null +++ b/tools/ModernVoiceOverlay.cs.txt @@ -0,0 +1,343 @@ + // __MARKER__ + // Presentation-only replacement for AudioOverlayForm. + // F8, microphone capture, local Whisper, clipboard/paste, target-focus, and timing logic remain outside this class. + internal sealed class AudioOverlayForm : Form + { + private const int WS_EX_TRANSPARENT = 0x00000020; + private const int WS_EX_TOOLWINDOW = 0x00000080; + private const int WS_EX_NOACTIVATE = 0x08000000; + private const int WM_NCHITTEST = 0x0084; + private const int HTTRANSPARENT = -1; + + private readonly System.Windows.Forms.Timer _timer = new System.Windows.Forms.Timer(); + private OverlayMode _mode = OverlayMode.Listening; + private int _tick; + private int _autoHideTick = -1; + + public AudioOverlayForm() + { + Text = "__PRODUCT_NAME__ Activity"; + FormBorderStyle = FormBorderStyle.None; + ShowInTaskbar = false; + TopMost = true; + StartPosition = FormStartPosition.Manual; + Width = 388; + Height = 76; + BackColor = System.Drawing.Color.FromArgb(34, 96, 178); + ForeColor = System.Drawing.Color.White; + Opacity = 0.985; + DoubleBuffered = true; + + _timer.Interval = 40; + _timer.Tick += delegate + { + _tick++; + if (_autoHideTick >= 0 && _tick >= _autoHideTick) + { + HideOverlay(); + return; + } + Invalidate(); + }; + } + + protected override bool ShowWithoutActivation { get { return true; } } + + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= WS_EX_NOACTIVATE | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW; + return cp; + } + } + + protected override void OnHandleCreated(EventArgs e) + { + base.OnHandleCreated(e); + ApplyPillRegion(); + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + if (IsHandleCreated) ApplyPillRegion(); + } + + protected override void WndProc(ref Message m) + { + if (m.Msg == WM_NCHITTEST) + { + m.Result = (IntPtr)HTTRANSPARENT; + return; + } + base.WndProc(ref m); + } + + public void ShowListening(IntPtr targetWindow) + { + _mode = OverlayMode.Listening; + ShowState(targetWindow, -1); + } + + public void ShowProcessing(IntPtr targetWindow) + { + _mode = OverlayMode.Processing; + ShowState(targetWindow, -1); + } + + public void ShowOutcome(IntPtr targetWindow, bool pasted, bool error) + { + _mode = error ? OverlayMode.Error : (pasted ? OverlayMode.Pasted : OverlayMode.Copied); + ShowState(targetWindow, error ? 1200 : (pasted ? 420 : 950)); + } + + public void ShowNoSpeech(IntPtr targetWindow) + { + _mode = OverlayMode.NoSpeech; + ShowState(targetWindow, 700); + } + + private void ShowState(IntPtr targetWindow, int autoHideMilliseconds) + { + PositionNearTarget(targetWindow); + _autoHideTick = autoHideMilliseconds > 0 + ? _tick + Math.Max(1, autoHideMilliseconds / _timer.Interval) + : -1; + if (!Visible) Show(); + _timer.Start(); + Invalidate(); + } + + private void PositionNearTarget(IntPtr targetWindow) + { + Screen screen = targetWindow != IntPtr.Zero && Native.IsWindow(targetWindow) + ? Screen.FromHandle(targetWindow) + : Screen.PrimaryScreen; + System.Drawing.Rectangle work = screen.WorkingArea; + Left = work.Left + Math.Max(0, (work.Width - Width) / 2); + Top = work.Bottom - Height - 24; + } + + public void HideOverlay() + { + _autoHideTick = -1; + _timer.Stop(); + if (Visible) Hide(); + } + + private static System.Drawing.Drawing2D.GraphicsPath CreatePillPath(System.Drawing.RectangleF rect) + { + System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath(); + float d = Math.Max(2f, rect.Height); + path.AddArc(rect.Left, rect.Top, d, d, 90f, 180f); + path.AddLine(rect.Left + (d / 2f), rect.Top, rect.Right - (d / 2f), rect.Top); + path.AddArc(rect.Right - d, rect.Top, d, d, 270f, 180f); + path.AddLine(rect.Right - (d / 2f), rect.Bottom, rect.Left + (d / 2f), rect.Bottom); + path.CloseFigure(); + return path; + } + + private void ApplyPillRegion() + { + if (Width <= 1 || Height <= 1) return; + using (System.Drawing.Drawing2D.GraphicsPath path = CreatePillPath(new System.Drawing.RectangleF(0f, 0f, Width, Height))) + { + System.Drawing.Region nextRegion = new System.Drawing.Region(path); + System.Drawing.Region previousRegion = Region; + Region = nextRegion; + if (previousRegion != null) previousRegion.Dispose(); + } + } + + private static void DrawRoundBar( + System.Drawing.Graphics graphics, + System.Drawing.Pen pen, + float x, + float centerY, + float height) + { + float half = Math.Max(1.0f, (height - pen.Width) / 2.0f); + graphics.DrawLine(pen, x, centerY - half, x, centerY + half); + } + + private void GetPalette( + out System.Drawing.Color top, + out System.Drawing.Color bottom, + out System.Drawing.Color edge, + out System.Drawing.Color glow) + { + switch (_mode) + { + case OverlayMode.Listening: + top = System.Drawing.Color.FromArgb(57, 143, 230); + bottom = System.Drawing.Color.FromArgb(27, 91, 181); + edge = System.Drawing.Color.FromArgb(122, 214, 242, 255); + glow = System.Drawing.Color.FromArgb(92, 169, 220, 255); + break; + case OverlayMode.Processing: + top = System.Drawing.Color.FromArgb(92, 105, 122); + bottom = System.Drawing.Color.FromArgb(49, 60, 73); + edge = System.Drawing.Color.FromArgb(92, 220, 229, 240); + glow = System.Drawing.Color.FromArgb(66, 192, 213, 240); + break; + case OverlayMode.Pasted: + top = System.Drawing.Color.FromArgb(62, 145, 120); + bottom = System.Drawing.Color.FromArgb(35, 103, 84); + edge = System.Drawing.Color.FromArgb(88, 222, 255, 241); + glow = System.Drawing.Color.FromArgb(52, 188, 240, 218); + break; + case OverlayMode.Copied: + top = System.Drawing.Color.FromArgb(76, 119, 165); + bottom = System.Drawing.Color.FromArgb(43, 78, 116); + edge = System.Drawing.Color.FromArgb(86, 224, 241, 255); + glow = System.Drawing.Color.FromArgb(52, 180, 218, 255); + break; + case OverlayMode.NoSpeech: + top = System.Drawing.Color.FromArgb(143, 121, 79); + bottom = System.Drawing.Color.FromArgb(91, 74, 49); + edge = System.Drawing.Color.FromArgb(86, 255, 239, 199); + glow = System.Drawing.Color.FromArgb(42, 255, 226, 160); + break; + default: + top = System.Drawing.Color.FromArgb(150, 73, 82); + bottom = System.Drawing.Color.FromArgb(100, 43, 52); + edge = System.Drawing.Color.FromArgb(86, 255, 224, 226); + glow = System.Drawing.Color.FromArgb(42, 255, 190, 198); + break; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + System.Drawing.Graphics graphics = e.Graphics; + graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; + + System.Drawing.Color top; + System.Drawing.Color bottom; + System.Drawing.Color edge; + System.Drawing.Color glow; + GetPalette(out top, out bottom, out edge, out glow); + + System.Drawing.RectangleF outerRect = new System.Drawing.RectangleF(1.5f, 1.5f, Width - 3f, Height - 3f); + using (System.Drawing.Drawing2D.GraphicsPath outerPath = CreatePillPath(outerRect)) + using (System.Drawing.Drawing2D.LinearGradientBrush fill = new System.Drawing.Drawing2D.LinearGradientBrush( + outerRect, + top, + bottom, + System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + using (System.Drawing.Pen border = new System.Drawing.Pen(edge, 1.1f)) + { + graphics.FillPath(fill, outerPath); + graphics.DrawPath(border, outerPath); + } + + // Quiet upper-face lighting gives the control depth without old desktop chrome. + System.Drawing.RectangleF highlightRect = new System.Drawing.RectangleF(7f, 5f, Width - 14f, Math.Max(13f, Height * 0.42f)); + using (System.Drawing.Drawing2D.GraphicsPath highlightPath = CreatePillPath(highlightRect)) + using (System.Drawing.Drawing2D.LinearGradientBrush highlight = new System.Drawing.Drawing2D.LinearGradientBrush( + highlightRect, + System.Drawing.Color.FromArgb(40, 255, 255, 255), + System.Drawing.Color.FromArgb(0, 255, 255, 255), + System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + { + graphics.FillPath(highlight, highlightPath); + } + + // Subtle moving inner glow behind the waveform. + float pulse = 0.5f + 0.5f * (float)Math.Sin(_tick * 0.14); + int glowAlpha = 18 + (int)(pulse * 24f); + using (System.Drawing.SolidBrush glowBrush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(glowAlpha, glow))) + { + graphics.FillEllipse(glowBrush, 16f, 9f, 160f, Height - 18f); + } + + int barCount = 11; + float barWidth = 5f; + float gap = 10.5f; + float firstX = 31f; + float centerY = Height / 2f; + + using (System.Drawing.Pen barPen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(244, 249, 252, 255), barWidth)) + { + barPen.StartCap = System.Drawing.Drawing2D.LineCap.Round; + barPen.EndCap = System.Drawing.Drawing2D.LineCap.Round; + + for (int i = 0; i < barCount; i++) + { + double energy; + if (_mode == OverlayMode.Listening) + { + double p1 = (_tick * 0.33) + (i * 0.82); + double p2 = (_tick * 0.18) + (i * 1.39); + energy = 0.22 + (0.58 * Math.Abs(Math.Sin(p1))) + (0.20 * Math.Abs(Math.Sin(p2))); + } + else if (_mode == OverlayMode.Processing) + { + double sweep = (_tick * 0.22) % (barCount + 4); + double distance = Math.Abs(i - sweep); + energy = 0.22 + (0.78 * Math.Exp(-(distance * distance) / 3.4)); + } + else + { + energy = 0.34 + (0.14 * Math.Abs(Math.Sin((_tick * 0.18) + i))); + } + + energy = Math.Max(0.0, Math.Min(1.0, energy)); + float height = 9f + (float)(30f * energy); + DrawRoundBar(graphics, barPen, firstX + (i * gap), centerY, height); + } + } + + float dotsLeft = firstX + (barCount * gap) + 8f; + for (int d = 0; d < 4; d++) + { + int alpha = 156 - (d * 28); + float dot = 4.0f - (d * 0.45f); + using (System.Drawing.SolidBrush dotBrush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(alpha, 255, 255, 255))) + { + graphics.FillEllipse(dotBrush, dotsLeft + (d * 10f), centerY - (dot / 2f), dot, dot); + } + } + + string label; + switch (_mode) + { + case OverlayMode.Listening: label = "Listening"; break; + case OverlayMode.Processing: label = "Transcribing locally"; break; + case OverlayMode.Pasted: label = "Pasted"; break; + case OverlayMode.Copied: label = "Copied to clipboard"; break; + case OverlayMode.NoSpeech: label = "No speech detected"; break; + default: label = "__PRODUCT_NAME__ error"; break; + } + + System.Drawing.RectangleF textRect = new System.Drawing.RectangleF(207f, 0f, Width - 225f, Height); + using (System.Drawing.Font font = new System.Drawing.Font("Segoe UI", 10.5f, System.Drawing.FontStyle.Bold)) + using (System.Drawing.SolidBrush textBrush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(250, 255, 255, 255))) + using (System.Drawing.StringFormat format = new System.Drawing.StringFormat()) + { + format.Alignment = System.Drawing.StringAlignment.Near; + format.LineAlignment = System.Drawing.StringAlignment.Center; + format.Trimming = System.Drawing.StringTrimming.EllipsisCharacter; + format.FormatFlags = System.Drawing.StringFormatFlags.NoWrap; + graphics.DrawString(label, font, textBrush, textRect, format); + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _timer.Dispose(); + if (Region != null) + { + Region.Dispose(); + Region = null; + } + } + base.Dispose(disposing); + } + } From 4743425e593f687d4fd481aaac5c03d43af4b698 Mon Sep 17 00:00:00 2001 From: Doc Reo Date: Thu, 10 Sep 2026 16:54:25 -0700 Subject: [PATCH 2/6] SignalFlow Mini V1 RD3: add guarded overlay applicator --- tools/Apply-ModernVoiceOverlay.ps1 | 108 +++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 tools/Apply-ModernVoiceOverlay.ps1 diff --git a/tools/Apply-ModernVoiceOverlay.ps1 b/tools/Apply-ModernVoiceOverlay.ps1 new file mode 100644 index 0000000..3d86f12 --- /dev/null +++ b/tools/Apply-ModernVoiceOverlay.ps1 @@ -0,0 +1,108 @@ +param( + [Parameter(Mandatory = $true)] + [string]$SourcePath, + + [Parameter(Mandatory = $true)] + [string]$ProductName, + + [string]$Marker = 'SIGNALPROOF-MODERN-VOICE-OVERLAY-RD3' +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +function Stop-OverlayPatch { + param([string]$Message) + throw ('Modern voice overlay patch stopped: ' + $Message) +} + +if (-not (Test-Path -LiteralPath $SourcePath -PathType Leaf)) { + Stop-OverlayPatch ('source file not found: ' + $SourcePath) +} +if ([string]::IsNullOrWhiteSpace($ProductName)) { + Stop-OverlayPatch 'product name is empty' +} + +$templatePath = Join-Path $PSScriptRoot 'ModernVoiceOverlay.cs.txt' +if (-not (Test-Path -LiteralPath $templatePath -PathType Leaf)) { + Stop-OverlayPatch ('overlay template not found: ' + $templatePath) +} + +$sourceFullPath = [System.IO.Path]::GetFullPath($SourcePath) +$sourceText = [System.IO.File]::ReadAllText($sourceFullPath) +if ([string]::IsNullOrWhiteSpace($sourceText)) { + Stop-OverlayPatch 'source file is empty' +} + +$protectedMarkers = @( + 'VK_F8 = 0x77', + 'WH_KEYBOARD_LL', + 'MemoryStream _pcm', + 'whisper-cli.exe', + 'Clipboard.SetText(text)', + '_overlay.ShowListening(_targetWindow)', + '_overlay.ShowProcessing(_targetWindow)' +) +foreach ($protectedMarker in $protectedMarkers) { + if ($sourceText.IndexOf($protectedMarker, [System.StringComparison]::Ordinal) -lt 0) { + Stop-OverlayPatch ('protected behavior marker missing before patch: ' + $protectedMarker) + } +} + +if ($sourceText.IndexOf($Marker, [System.StringComparison]::Ordinal) -ge 0) { + Write-Host ('Modern voice overlay already present: ' + $Marker) + return +} + +$classAnchor = 'internal sealed class AudioOverlayForm : Form' +if ($sourceText.IndexOf($classAnchor, [System.StringComparison]::Ordinal) -lt 0) { + Stop-OverlayPatch 'AudioOverlayForm class was not found' +} + +$templateText = [System.IO.File]::ReadAllText($templatePath) +if ($templateText.IndexOf('__PRODUCT_NAME__', [System.StringComparison]::Ordinal) -lt 0 -or + $templateText.IndexOf('__MARKER__', [System.StringComparison]::Ordinal) -lt 0) { + Stop-OverlayPatch 'overlay template placeholders are incomplete' +} + +$replacement = $templateText.Replace('__PRODUCT_NAME__', $ProductName).Replace('__MARKER__', $Marker) +$pattern = '(?s) internal sealed class AudioOverlayForm : Form\s*\{.*?(?= internal sealed class [A-Za-z0-9_]+HostForm : Form)' +$overlayRegex = New-Object System.Text.RegularExpressions.Regex($pattern) +$overlayMatches = $overlayRegex.Matches($sourceText) +if ($overlayMatches.Count -ne 1) { + Stop-OverlayPatch ('expected exactly one AudioOverlayForm block; found ' + $overlayMatches.Count) +} + +$patchedText = $overlayRegex.Replace( + $sourceText, + [System.Text.RegularExpressions.MatchEvaluator]{ param($match) $replacement + [Environment]::NewLine }, + 1 +) + +if ([string]::Equals($patchedText, $sourceText, [System.StringComparison]::Ordinal)) { + Stop-OverlayPatch 'patch produced no source change' +} +if ($patchedText.IndexOf($Marker, [System.StringComparison]::Ordinal) -lt 0) { + Stop-OverlayPatch 'modern overlay marker missing after patch' +} +foreach ($protectedMarker in $protectedMarkers) { + if ($patchedText.IndexOf($protectedMarker, [System.StringComparison]::Ordinal) -lt 0) { + Stop-OverlayPatch ('protected behavior marker was lost by patch: ' + $protectedMarker) + } +} +foreach ($requiredVisual in @( + 'CreatePillPath', + 'DrawRoundBar', + 'Transcribing locally', + 'LineCap.Round', + 'barCount = 11' +)) { + if ($patchedText.IndexOf($requiredVisual, [System.StringComparison]::Ordinal) -lt 0) { + Stop-OverlayPatch ('modern overlay visual marker missing: ' + $requiredVisual) + } +} + +$utf8NoBom = New-Object System.Text.UTF8Encoding($false) +[System.IO.File]::WriteAllText($sourceFullPath, $patchedText, $utf8NoBom) +Write-Host ('Applied modern oval voice overlay: ' + $Marker) +Write-Host ('Product label: ' + $ProductName) From 84c4cc7a8a3219b38daee98981a02bc26e5a3d47 Mon Sep 17 00:00:00 2001 From: Doc Reo Date: Thu, 10 Sep 2026 16:56:23 -0700 Subject: [PATCH 3/6] SignalFlow Mini V1 RD3: bump public candidate version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 04ac7cb..b34f15e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -SIGNALFLOW-MINI-V1-RD2-PUBLIC +SIGNALFLOW-MINI-V1-RD3-PUBLIC From f6a69b8f0d7d9e17c1301803a89a11e03ca472fb Mon Sep 17 00:00:00 2001 From: Doc Reo Date: Thu, 10 Sep 2026 16:56:34 -0700 Subject: [PATCH 4/6] SignalFlow Mini V1 RD3: apply modern overlay during build --- build.ps1 | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/build.ps1 b/build.ps1 index 3ffe245..91aa1f3 100644 --- a/build.ps1 +++ b/build.ps1 @@ -10,27 +10,31 @@ New-Item -ItemType Directory -Force $out | Out-Null if (!(Test-Path -LiteralPath $src)) { if (!(Test-Path -LiteralPath $srcGz)) { throw 'Neither src\Program.cs nor src\Program.cs.gz exists.' } - $input = [System.IO.File]::OpenRead($srcGz) + $inputStream = [System.IO.File]::OpenRead($srcGz) try { - $gzip = New-Object System.IO.Compression.GzipStream($input, [System.IO.Compression.CompressionMode]::Decompress) + $gzipStream = New-Object System.IO.Compression.GzipStream($inputStream, [System.IO.Compression.CompressionMode]::Decompress) try { - $output = [System.IO.File]::Create($src) - try { $gzip.CopyTo($output) } finally { $output.Dispose() } - } finally { $gzip.Dispose() } - } finally { $input.Dispose() } + $outputStream = [System.IO.File]::Create($src) + try { $gzipStream.CopyTo($outputStream) } finally { $outputStream.Dispose() } + } finally { $gzipStream.Dispose() } + } finally { $inputStream.Dispose() } } +$overlayApplicator = Join-Path $root 'tools\Apply-ModernVoiceOverlay.ps1' +if (!(Test-Path -LiteralPath $overlayApplicator)) { throw 'Modern voice overlay applicator is missing.' } +& $overlayApplicator -SourcePath $src -ProductName 'SignalFlow Mini' -Marker 'SIGNALFLOW-MINI-MODERN-VOICE-OVERLAY-V1-RD3' + $exe = Join-Path $out 'SignalFlow-Mini.exe' if (Test-Path $exe) { Remove-Item -Force $exe } $refs = @('System.dll','System.Core.dll','System.Drawing.dll','System.Windows.Forms.dll') -$addType = Get-Command Add-Type -ErrorAction Stop +$addTypeCommand = Get-Command Add-Type -ErrorAction Stop $compile = @{ Path = $src ReferencedAssemblies = $refs OutputAssembly = $exe OutputType = 'WindowsApplication' } -if ($addType.Parameters.ContainsKey('CompilerOptions')) { $compile['CompilerOptions'] = '/optimize+' } +if ($addTypeCommand.Parameters.ContainsKey('CompilerOptions')) { $compile['CompilerOptions'] = '/optimize+' } Add-Type @compile if (!(Test-Path $exe)) { throw 'SignalFlow-Mini.exe was not produced.' } $hash = (Get-FileHash $exe -Algorithm SHA256).Hash.ToLowerInvariant() From 5813b883e0294dc03319d068d3c71c2e4e6636a3 Mon Sep 17 00:00:00 2001 From: Doc Reo Date: Thu, 10 Sep 2026 16:56:51 -0700 Subject: [PATCH 5/6] SignalFlow Mini V1 RD3: extend public verification for modern overlay --- verify/verify_package.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/verify/verify_package.py b/verify/verify_package.py index 462d6ca..9b2af0f 100644 --- a/verify/verify_package.py +++ b/verify/verify_package.py @@ -14,10 +14,10 @@ def program_source(): return '' with gzip.open(gz,'rt',encoding='utf-8') as fh: return fh.read() -required=['src/Program.cs.gz','build.ps1','install.ps1','uninstall.ps1','SignalFlow-Mini.ps1','INSTALL-SIGNALFLOW-MINI.cmd','BUILD-AND-INSTALL.cmd','README.md','VERSION','LICENSE','NOTICE','THIRD-PARTY-NOTICES.md','docs/ORIGIN-AND-LINEAGE.md','docs/TESTING.md','docs/SOURCE.md','ROADMAP.md','CHANGELOG.md','CONTRIBUTING.md','SECURITY.md','assets/Signalproof.ico'] -program=program_source(); installer=text('install.ps1'); build=text('build.ps1'); readme=text('README.md') +required=['src/Program.cs.gz','build.ps1','install.ps1','uninstall.ps1','SignalFlow-Mini.ps1','INSTALL-SIGNALFLOW-MINI.cmd','BUILD-AND-INSTALL.cmd','README.md','VERSION','LICENSE','NOTICE','THIRD-PARTY-NOTICES.md','docs/ORIGIN-AND-LINEAGE.md','docs/TESTING.md','docs/SOURCE.md','ROADMAP.md','CHANGELOG.md','CONTRIBUTING.md','SECURITY.md','assets/Signalproof.ico','tools/ModernVoiceOverlay.cs.txt','tools/Apply-ModernVoiceOverlay.ps1'] +program=program_source(); installer=text('install.ps1'); build=text('build.ps1'); readme=text('README.md'); overlay=text('tools/ModernVoiceOverlay.cs.txt'); applicator=text('tools/Apply-ModernVoiceOverlay.ps1') check('01 required public package files', all((ROOT/p).is_file() for p in required)) -check('02 public version identity', text('VERSION').strip()=='SIGNALFLOW-MINI-V1-RD2-PUBLIC') +check('02 public version identity', text('VERSION').strip()=='SIGNALFLOW-MINI-V1-RD3-PUBLIC') check('03 public UI rebranded', 'SignalFlow Mini - Ready' in program and 'ReoFlow - Ready' not in program) check('04 executable rebranded', 'SignalFlow-Mini.exe' in build and 'SignalFlow-Mini.exe' in installer) check('05 selectable install path', 'FolderBrowserDialog' in installer and '[string]$InstallPath' in installer) @@ -45,11 +45,13 @@ def program_source(): check('27 ReoSpeak lineage documented', 'ReoSpeak' in text('docs/ORIGIN-AND-LINEAGE.md') and 'ReoFlow' in text('docs/ORIGIN-AND-LINEAGE.md')) check('28 giveaway language present', 'free, open-source' in readme and 'giveaway' in readme) check('29 Clarity Core CTA present', 'https://signalproof.com/cccore' in readme) -check('30 upcoming update disclosed', 'refinement update soon' in readme.lower()) +check('30 RD3 modern oval overlay template', all(marker in overlay for marker in ['CreatePillPath','DrawRoundBar','LineCap.Round','barCount = 11','Listening','Transcribing locally'])) +check('31 RD3 build applies sanitized public overlay', "-ProductName 'SignalFlow Mini'" in build and 'SIGNALFLOW-MINI-MODERN-VOICE-OVERLAY-V1-RD3' in build) +check('32 RD3 applicator protects speech path', all(marker in applicator for marker in ['VK_F8 = 0x77','WH_KEYBOARD_LL','MemoryStream _pcm','whisper-cli.exe','Clipboard.SetText(text)','_overlay.ShowListening(_targetWindow)','_overlay.ShowProcessing(_targetWindow)'])) joined='\n'.join(text(p) for p in required if (ROOT/p).suffix.lower() in {'.ps1','.md','.cmd','.json','.txt'}) secrets=re.findall(r'(?i)(api[_-]?key|secret|token)\s*[=:]\s*["\'][^"\']{8,}',joined) -check('31 no embedded secret assignments', not secrets) -check('32 no internal public-control files', all(not (ROOT/p).exists() for p in ['AGENTS.md','SOUL.md','LOCK.json','evidence.json','OWNER-TEST-CHECKLIST.md','verification.txt'])) +check('33 no embedded secret assignments', not secrets) +check('34 no internal public-control files', all(not (ROOT/p).exists() for p in ['AGENTS.md','SOUL.md','LOCK.json','evidence.json','OWNER-TEST-CHECKLIST.md','verification.txt'])) failed=[n for n,ok in checks if not ok] print(f'\nRESULT: {len(checks)-len(failed)}/{len(checks)} checks passed') if failed: From 5bab3725a7c049bc906ce061233134fb55fb8965 Mon Sep 17 00:00:00 2001 From: Doc Reo Date: Thu, 10 Sep 2026 16:56:58 -0700 Subject: [PATCH 6/6] SignalFlow Mini V1 RD3: document modern overlay and rollback --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e190770..f98cdb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## V1 / RD3 - modern voice overlay candidate + +- Replaced the old rectangular listening/transcribing presentation with a modern oval/pill activity surface at build time. +- Added smooth rounded waveform bars with distinct listening and local-transcription motion. +- Listening uses the blue SignalFlow treatment; transcription uses a graphite/blue-grey treatment. +- Preserved the visible state words: Listening, Transcribing locally, Pasted, Copied to clipboard, and No speech detected. +- Preserved F8 push-to-talk, microphone capture, local whisper.cpp transcription, clipboard recovery, guarded paste, focus protection, and the existing timing path. +- Kept this public candidate sanitized; no owner-specific ReoFlow identity or private control material is introduced. +- The V1/RD2 public source is preserved on the rollback branch `rollback/signalflow-mini-v1-rd2-public-2026-09-10`. + ## Public cleanup release - Prepared SignalFlow Mini as a free Apache 2.0 giveaway.