Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ac588f8
fix(process): preserve supported fake values
binaryfire Jul 19, 2026
50bc819
fix(process): reject empty process pipelines
binaryfire Jul 19, 2026
35acd69
fix(process): make invoked lifecycles failure-safe
binaryfire Jul 19, 2026
ea1d45d
test(process): cover lifecycle ownership and fake fidelity
binaryfire Jul 19, 2026
2968aa9
docs(process): record Laravel package provenance
binaryfire Jul 19, 2026
03ea63d
docs(process): document secure lifecycle usage
binaryfire Jul 19, 2026
a352b57
chore(audit): complete Process lifecycle review
binaryfire Jul 19, 2026
be817d3
docs(contributing): define incremental upstream updates
binaryfire Jul 19, 2026
81c3677
docs(audit): reference incremental upstream workflow
binaryfire Jul 19, 2026
ac28cef
fix(server-process): harden native process lifecycles
binaryfire Jul 19, 2026
d0d9d5c
refactor(server-process): clarify process registration
binaryfire Jul 19, 2026
88d37d9
test(server-process): avoid native handles in registry coverage
binaryfire Jul 19, 2026
1b6b7b6
docs(server-process): document custom server processes
binaryfire Jul 19, 2026
8eb159f
docs(audit): complete server process lifecycle audit
binaryfire Jul 19, 2026
9c9c565
docs(server-process): add application guide
binaryfire Jul 19, 2026
a9bae7c
fix(filesystem): harden native file I/O ownership
binaryfire Jul 20, 2026
79b11b8
fix(filesystem): complete safe adapter contracts
binaryfire Jul 20, 2026
ffd5ca9
perf(filesystem): stream cloud reads lazily by default
binaryfire Jul 20, 2026
05ae196
fix(filesystem): harden temporary file transfer routes
binaryfire Jul 20, 2026
8e234f3
fix(http): stop iterable streams after disconnect
binaryfire Jul 20, 2026
d50d9bf
fix(foundation): finalize request lifecycles exhaustively
binaryfire Jul 20, 2026
9783ba0
fix(filesystem): finalize streamed file resources explicitly
binaryfire Jul 20, 2026
46705db
test(filesystem): return truthful native write counts
binaryfire Jul 20, 2026
941e748
test(filesystem): align path helper coverage
binaryfire Jul 20, 2026
dd2064b
docs(filesystem): explain lazy streams and empty assertions
binaryfire Jul 20, 2026
a87c3f1
docs(audit): record filesystem lifecycle completion
binaryfire Jul 20, 2026
06c93b8
Merge branch '0.4' into audit/process-and-filesystem-lifecycles
binaryfire Jul 20, 2026
09e0a5c
fix(filesystem): preserve native MIME failure semantics
binaryfire Jul 20, 2026
189f8a7
fix(routing): frame multiline server-sent event data
binaryfire Jul 20, 2026
7fd315a
docs(filesystem): make storage assertions coherent
binaryfire Jul 20, 2026
1054be6
docs(audit): record filesystem review corrections
binaryfire Jul 20, 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
11 changes: 10 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,16 @@ Before editing, identify the work as one of:
- An update from an existing package's upstream.
- A new package port.

This determines which upstream source and tests to compare. Upstream updates and new ports follow the workflows under Porting Packages; bug fixes and enhancements follow the workflows below. The same rules apply to all four. In every case, read the package README for the upstream reference and read the relevant Hypervel source and tests before editing.
This determines which upstream source and tests to compare. Incremental updates from an existing upstream follow the workflow below together with the applicable Porting Policy and rules. New package ports follow the full workflow under Porting Packages. Bug fixes and enhancements follow the workflows below. In every case, read the package README for the upstream reference and the relevant Hypervel source and tests before editing.

### Incremental upstream updates

When bringing an existing upstream feature, fix, or API change into Hypervel:

1. Find the originating implementation pull request and any corresponding documentation pull request. Use them to understand the reason for the change and identify the complete set of files changed when it was introduced.
2. Inspect every file changed by those pull requests, including source, contracts, tests, fixtures, configuration, package metadata, and documentation. Search the current upstream branch for the added symbols as well, since later changes may have introduced additional consumers or coverage.
3. Treat the historical pull-request diffs as discovery and history only. Port the actual source, tests, and documentation from the current checked-out upstream default or development branch. Follow-up fixes and documentation improvements may have changed the final implementation or coverage.
4. Compare that current upstream surface with the Hypervel implementation and apply the approved Hypervel adaptations under Porting Packages. If the upstream feature has no user-facing documentation, add proportionate Hypervel documentation at its natural public surface.

### Audit what you modify

Expand Down

Large diffs are not rendered by default.

33 changes: 19 additions & 14 deletions docs/plans/2026-07-12-framework-coroutine-state-lifecycle-audit.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ Use local sources rather than online lookup when available. In particular, inspe

Inspect a package README only for an upstream reference, a `Differences From Laravel` section, architecture notes, or package-specific constraints. Do not spend audit time reading badges, installation boilerplate, license text, or empty descriptions.

When the audit finds an upstream feature that Hypervel has not yet ported, use the originating pull request only to identify the complete changed-file surface and the reason for the change. Inspect every source file, test, fixture, configuration file, and documentation file named by that pull request, then port from the current checked-out upstream default/development branch rather than from the historical pull-request diff. Later upstream corrections may have changed the implementation or coverage. Search the corresponding current upstream documentation repository as part of the same work and port the user-facing documentation; if upstream has no documentation, add proportionate Hypervel documentation at the natural public surface.
When the audit finds an upstream feature that Hypervel has not yet ported, follow the **Incremental upstream updates** workflow in `AGENTS.md`. Record the originating implementation and documentation pull-request surface and the current-branch result in the package investigation and companion ledger so the completeness check remains auditable.

### Inherited upstream internals

Expand Down Expand Up @@ -990,9 +990,9 @@ An exceptionally large shared work unit may receive its own linked detail plan w

This compact index routes the completed-work history that must be consulted with the full plan after compaction. Detailed history remains in the [companion ledger](2026-07-12-framework-coroutine-state-lifecycle-audit-ledger.md).

- **Active package or work unit:** `process`
- **Ledger entries required for the active work:** None.
- **Pending revalidation carried into the active work:** None for Process. Later package revalidation remains tracked in the cross-package dependency index.
- **Active package or work unit:** `pipeline`
- **Ledger entries required for the active work:** `Normalize framework enum identifiers at string boundaries` (`support-02`).
- **Pending revalidation carried into the active work:** Revalidate `support-02` during the full Pipeline audit.

Update these three lines when a package starts, completes, or gains a cross-package dependency. Name exact work-unit headings or shared finding IDs from the companion ledger; never use “see recent entries” or require a full-ledger reread.

Expand All @@ -1004,7 +1004,7 @@ Add one row only for a shared finding or changed lower-level assumption that ano
|---|---|---|---|
| `validation-01` | `validation` | `contracts`; later full `validation` audit | `Harden framework contracts and request-scoped state`; shared finding `validation-01` |
| `view-01` | `view` | `contracts`, `foundation`; later full `view` and `foundation` audits | `Harden framework contracts and request-scoped state`; shared finding `view-01` |
| `filesystem-01` | `filesystem` | `contracts`; later full `filesystem` audit | `Harden framework contracts and request-scoped state`; shared finding `filesystem-01` |
| `filesystem-01` | `filesystem` | `contracts` and `filesystem` (revalidation complete) | `Harden framework contracts and request-scoped state`; shared finding `filesystem-01` |
| `queue-01` | `queue` | `contracts`; later full `queue` audit | `Harden framework contracts and request-scoped state`; shared finding `queue-01` |
| `testbench-01` | `testbench` | `foundation`; later full `testbench` and `foundation` audits | `Restore Conditionable proxy truthiness`; shared finding `testbench-01` |
| `http-01` | `http` | `macroable`, `testing`; later full `http` and `testing` audits | `Complete Macroable callable and test-state handling`; shared finding `http-01` |
Expand All @@ -1021,7 +1021,7 @@ Add one row only for a shared finding or changed lower-level assumption that ano
| `container-10` | `log` | `container` (revalidation complete); later full `log` audit | `Coordinate shared container construction and complete current contextual resolution`; finding `container-10` |
| `context-01` | `context` | `container` (revalidation complete), `foundation`; later full `foundation` audit | `Correct explicit coroutine context targeting`; finding `context-01` |
| `context-04` | `context` | `foundation`, `database`; later full consumer audits | `Correct explicit coroutine context targeting`; finding `context-04` |
| `coroutine-05` | `coroutine`, `filesystem` | later full `filesystem` audit | `Make coroutine creation and copied context failure-safe`; finding `coroutine-05` |
| `coroutine-05` | `coroutine`, `filesystem` | `filesystem` (revalidation complete) | `Make coroutine creation and copied context failure-safe`; finding `coroutine-05` |
| `coroutine-06` | `context`, `coroutine` | `concurrency`, `foundation`; later full consumer audits | `Make coroutine creation and copied context failure-safe`; finding `coroutine-06` |
| `foundation-02` | `foundation` | `coroutine`; later full `foundation` audit | `Make coroutine creation and copied context failure-safe`; finding `foundation-02` |
| `websocket-server-01` | `websocket-server` | later full `websocket-server` audit | `Make coroutine creation and copied context failure-safe`; finding `websocket-server-01` |
Expand All @@ -1038,8 +1038,12 @@ Add one row only for a shared finding or changed lower-level assumption that ano
| `database-01` | `database` | later full `database` audit | `Release cleared coordinator timers deterministically`; finding `database-01` |
| `redis-01` | `redis` | later full `redis` audit | `Release cleared coordinator timers deterministically`; finding `redis-01` |
| `di-02` | `di` | `foundation`, `sentry`, `telescope`; later full consumer audits | `Correct AOP proxy generation and publication`; finding `di-02` |
| `filesystem-02` | `filesystem` | `di` (revalidation complete); later full `filesystem` audit | `Correct AOP proxy generation and publication`; finding `filesystem-02` |
| `filesystem-03` | `filesystem` | `encryption` (revalidation complete), `support`; later full `filesystem` audit | `Harden encryption rotation, key publication, and global lifecycle state`; finding `filesystem-03` |
| `filesystem-02` | `filesystem` | `di` and `filesystem` (revalidation complete) | `Correct AOP proxy generation and publication`; finding `filesystem-02` |
| `filesystem-03` | `filesystem` | `encryption`, `support`, and `filesystem` (revalidation complete) | `Harden encryption rotation, key publication, and global lifecycle state`; finding `filesystem-03` |
| `filesystem-04` | `filesystem` | `cache`; later full `cache` audit | `Harden filesystem I/O, streaming, and response teardown`; finding `filesystem-04` |
| `http-02` | `http` | `filesystem` (revalidation complete), `http-server`, `foundation`; later full consumer audits | `Harden filesystem I/O, streaming, and response teardown`; finding `http-02` |
| `filesystem-07` | `filesystem`, `foundation`, `http-server` | `filesystem` (revalidation complete), `http`; later full `foundation`, `http-server`, and `http` audits | `Harden filesystem I/O, streaming, and response teardown`; finding `filesystem-07` |
| `foundation-04` | `foundation` | `filesystem` (revalidation complete), `http-server`; later full `foundation` and `http-server` audits | `Harden filesystem I/O, streaming, and response teardown`; finding `foundation-04` |
| `events-01` | `foundation` | `events` (revalidation complete); later full `foundation` audit | `Correct event dispatch, queued-consumer isolation, and queue interoperability`; finding `events-01` |
| `events-03` | `events`, `queue` | later full `queue` audit | `Correct event dispatch, queued-consumer isolation, and queue interoperability`; finding `events-03` |
| `events-04` | `events`, `foundation` | later full `foundation` audit | `Correct event dispatch, queued-consumer isolation, and queue interoperability`; finding `events-04` |
Expand All @@ -1048,11 +1052,12 @@ Add one row only for a shared finding or changed lower-level assumption that ano
| `queue-11` | `queue` | `events` (revalidation complete), `broadcasting`; later full `queue` and `broadcasting` audits | `Correct event dispatch, queued-consumer isolation, and queue interoperability`; finding `queue-11` |
| `queue-12` | `bus`, `queue` | `events` (revalidation complete), `broadcasting`; later full `bus`, `queue`, and `broadcasting` audits | `Correct event dispatch, queued-consumer isolation, and queue interoperability`; finding `queue-12` |
| `foundation-01` | `foundation` | `support`; later full `foundation` and `support` audits | `Correct event dispatch, queued-consumer isolation, and queue interoperability`; finding `foundation-01` |
| `support-02` | `support` | `auth`, `broadcasting`, `bus`, `cache`, `concurrency`, `console`, `container`, `contracts`, `cookie`, `database`, `events`, `filesystem`, `foundation`, `hashing` (revalidation complete), `horizon`, `inertia`, `jwt`, `log`, `mail`, `notifications`, `permission`, `pipeline`, `queue`, `redis`, `reverb`, `routing`, `sanctum`, `scout`, `session`, `socialite`, `telescope`, `testbench`, `translation`; later full consumer audits | `Normalize framework enum identifiers at string boundaries`; finding `support-02`; sibling findings `translation-01` and `reverb-03`; linked detail plan `2026-07-15-framework-enum-identifier-contracts.md` |
| `support-02` | `support` | `auth`, `broadcasting`, `bus`, `cache`, `concurrency`, `console`, `container`, `contracts`, `cookie`, `database`, `events`, `filesystem` (revalidation complete), `foundation`, `hashing` (revalidation complete), `horizon`, `inertia`, `jwt`, `log`, `mail`, `notifications`, `permission`, `pipeline`, `queue`, `redis`, `reverb`, `routing`, `sanctum`, `scout`, `session`, `socialite`, `telescope`, `testbench`, `translation`; later full consumer audits | `Normalize framework enum identifiers at string boundaries`; finding `support-02`; sibling findings `translation-01` and `reverb-03`; linked detail plan `2026-07-15-framework-enum-identifier-contracts.md` |
| `auth-01` | `support`, `auth` | later full `auth` audit | `Correct Support utility boundaries and authentication timing isolation`; finding `auth-01` |
| `encryption-03` | `encryption` | `contracts` and `support` (revalidation complete), `filesystem`, `foundation`; later full `filesystem` and `foundation` audits | `Harden encryption rotation, key publication, and global lifecycle state`; finding `encryption-03` |
| `encryption-03` | `encryption` | `contracts`, `support`, and `filesystem` (revalidation complete), `foundation`; later full `foundation` audit | `Harden encryption rotation, key publication, and global lifecycle state`; finding `encryption-03` |
| `sanctum-01` | `sanctum` | `encryption`; later full `sanctum` audit | `Harden encryption rotation, key publication, and global lifecycle state`; finding `sanctum-01` |
| `process-01` | `process` | later full `process` audit | `Expose process stopping through the contract`; finding `process-01` |
| `process-02` | `process` | `concurrency` (revalidation complete) | `Make Process callbacks and pools failure-safe`; finding `process-02` |
| `server-process-10` | `server-process` | `foundation`; later full `foundation` audit | `Make custom server processes failure-safe`; finding `server-process-10` |

## Package checklist

Expand Down Expand Up @@ -1103,9 +1108,9 @@ The order is lower-level first where practical. Hypervel has cross-cutting depen
- [x] `signal`
- [x] `pool`
- [x] `object-pool`
- [ ] `process`
- [ ] `server-process`
- [ ] `filesystem`
- [x] `process`
- [x] `server-process`
- [x] `filesystem`

### Framework dispatch and runtime

Expand Down
1 change: 1 addition & 0 deletions src/boost/docs/documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
- [Notifications](/docs/{{version}}/notifications)
- [Package Development](/docs/{{version}}/packages)
- [Processes](/docs/{{version}}/processes)
- [Server Processes](/docs/{{version}}/server-process)
- [Queues](/docs/{{version}}/queues)
- [Rate Limiting](/docs/{{version}}/rate-limiting)
- [Search](/docs/{{version}}/search)
Expand Down
18 changes: 15 additions & 3 deletions src/boost/docs/filesystem.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ If you need to configure a Google Cloud Storage filesystem manually, you may use
'visibility_handler' => null,
'metadata' => ['cacheControl' => 'public,max-age=86400'],
'throw' => false,
'stream_reads' => false,
'stream_reads' => true,
'pool' => [
'min_retained_objects' => 1,
'max_objects' => 10,
Expand Down Expand Up @@ -281,6 +281,8 @@ $result = Storage::disk('s3')->withClient(function ($client) {

`Storage::forgetDisk()` only removes the manager's cached disk wrapper; an equivalent wrapper can continue using the shared pool. `Storage::purge()` removes the wrapper and closes its current pool, deriving the same pool identity even when the named disk has not been resolved yet or is composed from nested scoped disks. Other disks converging on that pool transparently create a fresh one on their next operation. Streams returned by `readStream()` retain their client lease until the stream is closed or destroyed.

S3 and Google Cloud Storage streams are read lazily by default, which keeps memory usage bounded and makes data available before the entire file has downloaded. This applies to `readStream()` and `readStreamRange()`; methods such as `get()` retain their normal behavior. Streaming requests close their HTTP connection after the read, so applications that open many small streams may prefer connection reuse and set the disk's `stream_reads` option to `false`.

<a name="scoped-and-read-only-filesystems"></a>
### Scoped and Read-Only Filesystems

Expand Down Expand Up @@ -918,6 +920,9 @@ use Hypervel\Support\Facades\Storage;
test('albums can be uploaded', function () {
Storage::fake('photos');

// Assert that the disk contains no files...
Storage::disk('photos')->assertEmpty();

$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
Expand All @@ -934,8 +939,10 @@ test('albums can be uploaded', function () {
// Assert that the number of files in a given directory matches the expected count...
Storage::disk('photos')->assertCount('/wallpapers', 2);

Storage::disk('photos')->makeDirectory('/empty');

// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
Storage::disk('photos')->assertDirectoryEmpty('/empty');
});
```

Expand All @@ -954,6 +961,9 @@ class ExampleTest extends TestCase
{
Storage::fake('photos');

// Assert that the disk contains no files...
Storage::disk('photos')->assertEmpty();

$response = $this->json('POST', '/photos', [
UploadedFile::fake()->image('photo1.jpg'),
UploadedFile::fake()->image('photo2.jpg')
Expand All @@ -970,8 +980,10 @@ class ExampleTest extends TestCase
// Assert that the number of files in a given directory matches the expected count...
Storage::disk('photos')->assertCount('/wallpapers', 2);

Storage::disk('photos')->makeDirectory('/empty');

// Assert that a given directory is empty...
Storage::disk('photos')->assertDirectoryEmpty('/wallpapers');
Storage::disk('photos')->assertDirectoryEmpty('/empty');
}
}
```
Expand Down
Loading