From a98a7633a7e2de84554764cc11a441cfd5146df1 Mon Sep 17 00:00:00 2001 From: iancooper Date: Sat, 22 Aug 2026 14:53:13 +0100 Subject: [PATCH] =?UTF-8?q?spec:=20010=20Task=2011.2=20=E2=80=94=20the=20t?= =?UTF-8?q?railing=20newline=20on=20the=20last=2014=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P2-1, deferred from spec 011 so the banner diff contained nothing but banners, and landed here for the same reason in reverse: a whitespace-only sweep is safe when no content PR is in flight. 14 files, not the 17 the task recorded. Re-derived twice — once when the phase opened and again at the head this cut from, because the phase's own five PRs had edited 17 pages in between. Both returned 14: those edits were to link targets and headings, and none of them is a file's last line. The diff is provably nothing but newlines. Each file grew by exactly one byte, asserted as after == before + b"\n" before the next file was touched, and `git diff -U0` re-adds all 14 removed lines verbatim, compared as lists. A whitespace sweep is the one change nobody reads closely, which is the argument for asserting it rather than reviewing it. No line count in this spec moves. A page's length is len(text.splitlines()), which a trailing newline does not change — asserted per file. Under wc -l all 14 would have gained a line, which is the instrument design §16 finding 1 ruled out. Co-Authored-By: Claude Opus 5 --- contents/AzureBlobConfiguration.md | 2 +- contents/AzureServiceBusConfiguration.md | 2 +- contents/ClaimCheck.md | 2 +- contents/CustomScheduler.md | 2 +- contents/DynamoInbox.md | 2 +- contents/HealthChecks.md | 2 +- contents/ImplementingExternalBus.md | 2 +- contents/MSSQLOutbox.md | 2 +- contents/MongoDBInbox.md | 2 +- contents/MySQLOutbox.md | 2 +- contents/PostgresOutbox.md | 2 +- contents/S3LuggageStore.md | 2 +- contents/SqliteOutbox.md | 2 +- contents/TickerQScheduler.md | 2 +- spec/010-information_architecture/tasks.md | 17 ++++++++++++++++- 15 files changed, 30 insertions(+), 15 deletions(-) diff --git a/contents/AzureBlobConfiguration.md b/contents/AzureBlobConfiguration.md index da6efb0..8eff616 100644 --- a/contents/AzureBlobConfiguration.md +++ b/contents/AzureBlobConfiguration.md @@ -30,4 +30,4 @@ For the archiver to work the calling credential will require the role **Storage - message_type - timestamp - content_type -* **StorageLocationFunc** : The function to provide the location to store the message inside of the Blob container, default location : The Id of the message at the root of the **BlobContainerUri** \ No newline at end of file +* **StorageLocationFunc** : The function to provide the location to store the message inside of the Blob container, default location : The Id of the message at the root of the **BlobContainerUri** diff --git a/contents/AzureServiceBusConfiguration.md b/contents/AzureServiceBusConfiguration.md index 22a7cda..43eec43 100644 --- a/contents/AzureServiceBusConfiguration.md +++ b/contents/AzureServiceBusConfiguration.md @@ -127,4 +127,4 @@ We use ASB's *Subscription* to surscribe to a Topic on a namespace. When we Complete a message, in response to a handler chain completing, we Complete the message on ASB using **messageReceiver.CompleteMessageAsync**. Note that we only Complete a message once we have completed running the chain and only if AckOnRead is set to false (as the messages is removed from the queue otherwise). -When we Dead Letter a message (see [Handler Failure](/contents/HandlerFailure.md) for more on failure) then we use **messageReceiver.DeadLetterMessageAsync** to delete the message, and move it to a DLQ. \ No newline at end of file +When we Dead Letter a message (see [Handler Failure](/contents/HandlerFailure.md) for more on failure) then we use **messageReceiver.DeadLetterMessageAsync** to delete the message, and move it to a DLQ. diff --git a/contents/ClaimCheck.md b/contents/ClaimCheck.md index 5ff1ab8..49ff8e1 100644 --- a/contents/ClaimCheck.md +++ b/contents/ClaimCheck.md @@ -72,4 +72,4 @@ The *luggage store* is where we store the body of the message for later retrieva We provide the following implementations of **IAmAStorageProviderAsync: -* [S3LuggageStore](/contents/S3LuggageStore.md) \ No newline at end of file +* [S3LuggageStore](/contents/S3LuggageStore.md) diff --git a/contents/CustomScheduler.md b/contents/CustomScheduler.md index 0efc964..c23a818 100644 --- a/contents/CustomScheduler.md +++ b/contents/CustomScheduler.md @@ -168,4 +168,4 @@ The **request scheduler** is used by `IAmACommandProcessor` when methods like `S Use a consistent format (e.g., JSON) for `RequestData` in `FireRequestMessage`. -**Note**: Replace `CustomSchedulerAPI`, `CustomSchedulerObject`, and serialization logic with your actual implementation details. \ No newline at end of file +**Note**: Replace `CustomSchedulerAPI`, `CustomSchedulerObject`, and serialization logic with your actual implementation details. diff --git a/contents/DynamoInbox.md b/contents/DynamoInbox.md index 340e52c..fa38ee5 100644 --- a/contents/DynamoInbox.md +++ b/contents/DynamoInbox.md @@ -42,4 +42,4 @@ private static void ConfigureBrighter(HostBuilderContext hostContext, IServiceCo } ... -``` \ No newline at end of file +``` diff --git a/contents/HealthChecks.md b/contents/HealthChecks.md index 1cb55c2..01ed77b 100644 --- a/contents/HealthChecks.md +++ b/contents/HealthChecks.md @@ -81,4 +81,4 @@ The following will be produced | Some Message Pumps are running | Degraded | | No Message Pumps are running | Unhealthy | -In the event on a Degraded status the /health/details page can be used to find out which Dispatchers have failed pumps \ No newline at end of file +In the event on a Degraded status the /health/details page can be used to find out which Dispatchers have failed pumps diff --git a/contents/ImplementingExternalBus.md b/contents/ImplementingExternalBus.md index 7a17607..cb865f3 100644 --- a/contents/ImplementingExternalBus.md +++ b/contents/ImplementingExternalBus.md @@ -112,4 +112,4 @@ public class MailTaskReminderHandler : RequestHandler return base.Handle(command); } } -``` \ No newline at end of file +``` diff --git a/contents/MSSQLOutbox.md b/contents/MSSQLOutbox.md index 16e74a6..11fd87d 100644 --- a/contents/MSSQLOutbox.md +++ b/contents/MSSQLOutbox.md @@ -170,4 +170,4 @@ public void ConfigureServices(IServiceCollection services) } ``` -> **Running more than one instance?** Configure a [distributed lock](/contents/DistributedLock.md) so only one Sweeper (and Archiver) runs at a time — see [MS SQL Distributed Lock](/contents/MsSqlDistributedLock.md). \ No newline at end of file +> **Running more than one instance?** Configure a [distributed lock](/contents/DistributedLock.md) so only one Sweeper (and Archiver) runs at a time — see [MS SQL Distributed Lock](/contents/MsSqlDistributedLock.md). diff --git a/contents/MongoDBInbox.md b/contents/MongoDBInbox.md index e53f694..36d12fe 100644 --- a/contents/MongoDBInbox.md +++ b/contents/MongoDBInbox.md @@ -180,4 +180,4 @@ The MongoDB Inbox requires the following NuGet packages: ````powershell dotnet add package Paramore.Brighter.Inbox.MongoDb dotnet add package Paramore.Brighter.MongoDb -```` \ No newline at end of file +```` diff --git a/contents/MySQLOutbox.md b/contents/MySQLOutbox.md index 7243353..7e9fcdd 100644 --- a/contents/MySQLOutbox.md +++ b/contents/MySQLOutbox.md @@ -171,4 +171,4 @@ public void ConfigureServices(IServiceCollection services) } ``` -> **Running more than one instance?** Configure a [distributed lock](/contents/DistributedLock.md) so only one Sweeper (and Archiver) runs at a time — see [MySQL Distributed Lock](/contents/MySqlDistributedLock.md). \ No newline at end of file +> **Running more than one instance?** Configure a [distributed lock](/contents/DistributedLock.md) so only one Sweeper (and Archiver) runs at a time — see [MySQL Distributed Lock](/contents/MySqlDistributedLock.md). diff --git a/contents/PostgresOutbox.md b/contents/PostgresOutbox.md index a7951bd..8431aa1 100644 --- a/contents/PostgresOutbox.md +++ b/contents/PostgresOutbox.md @@ -171,4 +171,4 @@ public void ConfigureServices(IServiceCollection services) } ``` -> **Running more than one instance?** Configure a [distributed lock](/contents/DistributedLock.md) so only one Sweeper (and Archiver) runs at a time — see [Postgres Distributed Lock](/contents/PostgresDistributedLock.md). \ No newline at end of file +> **Running more than one instance?** Configure a [distributed lock](/contents/DistributedLock.md) so only one Sweeper (and Archiver) runs at a time — see [Postgres Distributed Lock](/contents/PostgresDistributedLock.md). diff --git a/contents/S3LuggageStore.md b/contents/S3LuggageStore.md index 3a4e083..2824962 100644 --- a/contents/S3LuggageStore.md +++ b/contents/S3LuggageStore.md @@ -65,4 +65,4 @@ In addition we set the following properties on the bucket, which can be controll We set *Tags* on the bucket if they are provided in the **Tags** property. -We default the **ACLs** for the bucket to **S3CannedACL.Private, but you can choose to override this with another policy as described in [**S3CannedACL**](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html#RESTCannedAccessPolicies). \ No newline at end of file +We default the **ACLs** for the bucket to **S3CannedACL.Private, but you can choose to override this with another policy as described in [**S3CannedACL**](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html#RESTCannedAccessPolicies). diff --git a/contents/SqliteOutbox.md b/contents/SqliteOutbox.md index d06c5e7..bd62ac7 100644 --- a/contents/SqliteOutbox.md +++ b/contents/SqliteOutbox.md @@ -168,4 +168,4 @@ public void ConfigureServices(IServiceCollection services) .UseOutboxSweeper() // Optionally add the background sweeper service .AutoFromAssemblies(); // Scan for handlers and mappers } -``` \ No newline at end of file +``` diff --git a/contents/TickerQScheduler.md b/contents/TickerQScheduler.md index eef03ae..cfa00e4 100644 --- a/contents/TickerQScheduler.md +++ b/contents/TickerQScheduler.md @@ -238,4 +238,4 @@ TickerQ integration for Brighter offers a modern, high-performance scheduling op - **Standard**: Fully implements Brighter's `IMessageScheduler` interface. Use TickerQ when you want a lightweight, modern scheduler without the legacy footprint of older libraries. - \ No newline at end of file + diff --git a/spec/010-information_architecture/tasks.md b/spec/010-information_architecture/tasks.md index a79d14e..31a9c80 100644 --- a/spec/010-information_architecture/tasks.md +++ b/spec/010-information_architecture/tasks.md @@ -2881,13 +2881,28 @@ unchecked rather than approved. **Gates after:** linkcheck **144 files, clean**; pagelint 0 errors / **791** warnings / 142 pages; `--check-shape` 0; `--check-redirects` 0 at 77 entries. -- [ ] **Task 11.2:** P2-1 — normalise the files with no trailing newline — **14**, re-derived +- [x] **Task 11.2:** P2-1 — normalise the files with no trailing newline — **14**, re-derived - Input: the 14 files (measured at `3178d68`; it was 18 of 105 before the Phase 6 splits, and 17 when this task was written) - Output: every file under `contents/` ends with a newline - Notes: Deliberately deferred from 011 so the banner diff contained nothing but banners. It lands here for the same reason in reverse — a whitespace-only sweep is safe once no content PR is in flight. **Re-derive the count**; it has moved once already. + - **Done 2026-08-22.** **14 files**, re-derived twice: once when the phase opened and again + at the head the sweep cut from, because the phase's own five PRs had edited 17 pages in + between. Both returned 14 — the edits were to link targets and headings, none of which is + a file's last line. + + **The diff is provably nothing but newlines.** Each file grew by **exactly one byte**, + asserted as `after == before + b"\n"` before the next file was touched, and `git diff -U0` + re-adds all 14 removed lines verbatim — 14 removed, 14 added, compared as lists and equal. + A whitespace sweep is the one change nobody reads closely, which is the argument for + asserting it rather than reviewing it. + + **No line count in this document moves**, and that is a property of the convention rather + than luck: a page's length is `len(text.splitlines())`, which is unchanged by a trailing + newline. Asserted per file during the sweep. Under `wc -l` all 14 would have gained a line, + which is exactly the instrument design §16 finding 1 ruled against. - [x] **Task 11.3:** P2-3 — echo the changed-range count from `docs.yml` - Input: `.github/workflows/docs.yml`