User support, and the third thing found modelled and inert

The corpus imports sixteen functions from the user service, and reading them decided the shape before any code was written: a title asks for a name by identifier, enumerates who is signed in, and keys save data on which user. A single user_name field answers none of those, so the shell now holds a list of users with stable identifiers.

sceUserServiceGetUserName is the payoff and the reason it was worth doing first. It is the one call in that crate answering a console setting unencoded - every other one hands back a number whose meaning is a measurement, while a name is a string somebody typed into the shell and the guest reads as-is. The morning's argument for settings, with a caller at the end of it.

Where the care went

The size argument. That it is third is an assumption, and a wrong argument position writes past a caller's buffer - the failure sceUserServiceGetInitialUser already warns about. It is believed only up to sixty-four bytes; outside that the call is refused, because a refusal is recoverable and a smashed stack is not. The test asserts the refusal and that the buffer is untouched while refusing, not that the success path works.

Three inert things, and one bug a test found first

console::configure had never been called. Written that morning, so every setting a person chose stopped at the window and the guest read defaults - the third thing this session found built and connected to nothing, after the pad shim's implementations and Focus.

sceUserServiceGetInitialUser answered a constant; it now answers whoever is signed in, and the placeholder when the signed-in account has been deleted.

And the identifier allocator was wrong in a way only the test caught: deriving the next number from the highest live identifier reuses one the moment its holder is deleted, and save data is keyed on it - so a new person would silently inherit somebody else's saves. A stored high-water mark now, the same shape as HandleAllocator. Written test-first, failed, fixed. That is the third bug today found by writing the assertion before the code.

The guard was right and I was wrong

Claiming found_by = "static" for the name failed the_shipped_files_account_for_everything

Automatic recording filed a scratch directory as a title

Listing compat/ rather than assuming what was in it turned up New folder (2).toml - a tracked record describing a loader payload, outcome = "0x7ff61e175ee3" (a host address), three imports, 34% standing. Auto-recording derives the title from the module's containing directory, so anything run from a scratch folder gets filed as a compatibility claim.

Automation turned a latent looseness into pollution. While a person typed compat record, the directory name was their problem and they would not have typed it; taking the person out removed the judgement that had been quietly doing the filtering. That is a cost of automating something, not a bug in the automation, and worth naming as such.

A title id is now required to be an identifier, and a refusal is printed rather than skipped (D347). Watched refusing a real New folder (2), with no record written.

The tree, honestly

The gui doc link that blocked the full gate is fixed - the other session landed it. The full gate then failed anyway on orbistoun-service: DataBlocks::build has a new signature and its caller has not caught up, in crates this session has not touched. Scoped gate over the eight crates it did touch is what stands.

The scoped gate was not scoping

A scoped run failed on crates/orbistoun-libc, a crate the scope excluded. clippy lints every workspace crate it compiles from source, so -p orbistoun-cli - a shim depending on nearly everything - linted most of the tree and attributed another session's finding to the scoped crates.

That is worse than not scoping: it puts somebody else's failure under your name, and the previous message here had already said "my crates are clean" while the run was failing on theirs. --no-deps confines it, verified, and is applied only when a scope is given.

What stays whole-tree is deliberate. The static gates are facts about the repository, so a scoped run that skipped them would claim something it had not checked - and can therefore still be blocked by a file nobody in the scope touched. Written into D319 as a known edge rather than left to be rediscovered.

The honest description of --only: the cargo steps scope, the repository checks do not.