ワンクリックで
Use when sending email from RI C# services — notifications, daily reports, or log files as attachments.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Use when sending email from RI C# services — notifications, daily reports, or log files as attachments.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Anthropic API rate limit handling - retry logic, backoff, throttling for batch workloads against Claude models
Use when building an automated test → issue → fix loop with Claude Code and GitHub issues — overnight auto-fixing, regression loops, self-healing CI.
Use when creating, editing, publishing, or deleting posts on Cyril's Workshop blog or the steponnopets.net devblog.
Use when writing or contributing a boofuzz network-protocol fuzzer in this repo — layout, formatting rules, and reading results.
Use when a task needs real-time control of a connected browser via the Browser Bridge Broker — submit JS jobs over HTTP that browsers eval and return.
Use when training a character LoRA (Chroma/Flux or Pony/SDXL) on a RunPod GPU and wiring it into the ComfyUI + pony_web render stack.
| name | |
| description | Use when sending email from RI C# services — notifications, daily reports, or log files as attachments. |
Log files are held open by the running logging process; a normal File.OpenRead throws IOException: The process cannot access the file.... Open with FileShare.ReadWrite to read (and zip) them anyway:
public static string ZipSingleFileFromStream(string filePath, string? outputPath = null)
{
string zipPath = outputPath ?? Path.ChangeExtension(filePath, ".zip");
if (File.Exists(zipPath)) File.Delete(zipPath);
using (var zipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Create))
{
var entry = zipArchive.CreateEntry(Path.GetFileName(filePath), CompressionLevel.Optimal);
using var entryStream = entry.Open();
using var fileStream = new FileStream(
filePath, FileMode.Open, FileAccess.Read,
FileShare.ReadWrite); // <-- reads files another process has open for writing
fileStream.CopyTo(entryStream);
}
return zipPath;
}
smtp.nisainternational.local (no auth) — new SmtpClient("smtp.nisainternational.local")services@ramsden-international.comUTF8Writer.GetCurrentLogFilePath() (see the Logging skill)using, and create Attachment objects inline (mailMessage.Attachments.Add(new Attachment(path)) — no variable). Undisposed MailMessage/Attachment objects hold file handles until GC, so the zip cleanup in the finally block fails with the file "in use" — this persisted for 10+ minutes in production despite retry loops.string? zippedPath = null;
try
{
using var mailMessage = new MailMessage(from, to, subject, body); // using is load-bearing
zippedPath = ZipSingleFileFromStream(logPath);
mailMessage.Attachments.Add(new Attachment(zippedPath)); // inline, owned by message
foreach (var extra in additionalAttachments.Where(File.Exists))
mailMessage.Attachments.Add(new Attachment(extra));
new SmtpClient("smtp.nisainternational.local").Send(mailMessage);
}
catch (Exception)
{
return Send(from, logPath); // fallback: uncompressed original
}
finally
{
if (zippedPath != null && File.Exists(zippedPath))
try { File.Delete(zippedPath); } catch { /* log only */ }
}