Silence routine diagnostic noise; fix a real CRLF double-submit bug

Two separate fixes, found and closed together after task 3.9/prompt-
format landed (Captain Bob: "finish the work first then we'll do
cleanup before 3.10 begins").

1. Logging noise (confirmed live via QMP screendump): three sources
   were cluttering ordinary interactive console sessions.
   - INFERENCE "Output validation failed, ignoring results"
     (vm_runtime.c, kernel; vm_time.c, hosted mirror) and xhci "CSW
     status = FAILED"/"unit not ready -- retrying" (xhci.c) were
     already log_message(LOG_WARN/LOG_ERROR, ...) calls, just visible
     at the default runtime LOG_WARN level -- downgraded to LOG_INFO,
     all three fire routinely and self-resolve (xhci.c's own existing
     comment already documents the retry as expected SCSI UNIT
     ATTENTION behavior, not a driver defect).
   - Stadium: dispatch cell=... (stadium.c's stadium_dispatch()) was a
     genuine defect: an unconditional console_puts()/console_println()
     sequence with no level gating at all, printing on every single
     dispatch. Rewritten through log_message(LOG_DEBUG, ...).

2. CRLF double-submit (found while investigating why the cleaned-up
   noise still didn't look like a normal single-VM session):
   sk_console_readline() (repl.c) breaks on '\r' OR '\n' as independent
   terminators, so a line sent as both bytes submits twice -- the real
   line, then an immediate empty-line submit on the second byte, each
   printing its own " ok". Pre-dates Stage D entirely, not an async-
   relay artifact. Fixed with a single non-blocking peek-and-discard
   for the paired byte right where the line terminates.

Verified live on all three architectures for both fixes: zero UNKNOWN
WORD, dict_hash identical to every prior acceptance run in this
document (both changes are display/interaction-only).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-09-22 16:33:29 -04:00
co-authored by Claude Sonnet 5
parent 5c07745c18
commit d4f8a568ee
22 changed files with 73490 additions and 17 deletions
+17 -13
View File
@@ -37,6 +37,7 @@
#include "starkernel/kmalloc.h"
#include "starkernel/pmm.h"
#include "starkernel/console.h"
#include "starkernel/log.h" /* log_message() -- stadium_dispatch()'s own trace, LOG_DEBUG */
#include "starkernel/hal/hal.h"
#include "starkernel/q48_16.h" /* Q48_ONE -- item 4.1's reservoir starts each VM's quota at 1.0 */
#include "vm.h" /* VM_MEMORY_SIZE -- the per-VM footprint stadium_max_vm_count() budgets against */
@@ -366,33 +367,36 @@ uint8_t *stadium_header_bitmap(void) {
* integration of any kind exists yet (FABRIC-2.md §B).
*/
void stadium_dispatch(size_t cell_index, StadiumBehaviour behaviour) {
console_puts("Stadium: dispatch cell=");
console_put_u64((uint64_t)cell_index);
console_puts(" behaviour=");
/* 2026-09-22: was an unconditional console_puts()/console_println()
* sequence -- the only Stadium trace with no level gating at all,
* printing on every single dispatch regardless of log level
* (confirmed live: interleaves visibly with ordinary interactive
* console sessions). Routed through log_message(LOG_DEBUG, ...)
* instead, matching every other diagnostic trace in this codebase --
* silent at the default LOG_WARN runtime level, available with
* --log-level=debug. */
switch (behaviour) {
case STADIUM_BEHAVIOUR_MIGRATE: {
uint32_t lbn = (uint32_t)stadium_cell_array[cell_index].header.identity;
console_puts("MIGRATE lbn=");
console_put_u64((uint64_t)lbn);
console_println("");
log_message(LOG_DEBUG, "Stadium: dispatch cell=%zu behaviour=MIGRATE lbn=%u",
cell_index, (unsigned)lbn);
blk_flush(lbn);
break;
}
case STADIUM_BEHAVIOUR_DELIVER: {
uint64_t msg_idx = stadium_cell_array[cell_index].header.identity;
console_puts("DELIVER msg_idx=");
console_put_u64(msg_idx);
console_println("");
log_message(LOG_DEBUG, "Stadium: dispatch cell=%zu behaviour=DELIVER msg_idx=%llu",
cell_index, (unsigned long long)msg_idx);
break;
}
case STADIUM_BEHAVIOUR_EXPIRE:
console_println("EXPIRE (stub)");
log_message(LOG_DEBUG, "Stadium: dispatch cell=%zu behaviour=EXPIRE (stub)",
cell_index);
break;
case STADIUM_BEHAVIOUR_COOL: {
uint64_t identity = stadium_cell_array[cell_index].header.identity;
console_puts("COOL identity=");
console_put_u64(identity);
console_println("");
log_message(LOG_DEBUG, "Stadium: dispatch cell=%zu behaviour=COOL identity=%llu",
cell_index, (unsigned long long)identity);
break;
}
}
+6 -1
View File
@@ -677,7 +677,12 @@ void vm_tick_inference_engine(VM* vm)
/* 3. Validate outputs */
if (!inference_outputs_validate(vm->last_inference_outputs))
{
log_message(LOG_WARN,
/* 2026-09-22: downgraded from LOG_WARN -- fires routinely
* during normal operation and the runtime self-recovers
* every time (the whole point of "ignoring results"), so it
* does not warrant default-visible attention. Still
* available with --log-level=info/debug. */
log_message(LOG_INFO,
"INFERENCE: Output validation failed, ignoring results");
}