Skip to content

fix(dev): eliminate three fixed startup log warnings so official examples boot clean (#3420)#3449

Merged
os-zhuang merged 4 commits into
mainfrom
claude/startup-log-noise-cleanup-qcofu3
Jul 24, 2026
Merged

fix(dev): eliminate three fixed startup log warnings so official examples boot clean (#3420)#3449
os-zhuang merged 4 commits into
mainfrom
claude/startup-log-noise-cleanup-qcofu3

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #3420. os dev on the stock showcase printed three fixed noise sources on every boot, with zero example-side changes — training users to ignore warnings (cry-wolf). This clears all three so an official example boots warning-free, adds regression guards so it stays clean, and makes the debug output discoverable — without weakening any real diagnostic.

Repro: pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin.

The three fixes

1. field-zoo password warning → field-level opt-out

ObjectSchema.create('showcase_field_zoo') warned that f_password uses password on a non-auth object (plaintext-at-rest, masked-on-read — ADR-0100). The text said "if this is intended … safe to ignore" but gave authors no way to express that intent.

  • Add a field-level ackPlaintextMasking: true opt-out (packages/spec/src/data/field.zod.ts). When set on a password field, warnGenericPasswordFields skips it; the warning text now points authors at the flag.
  • Set it on field-zoo's deliberately-exhaustive demo field.
  • Diagnostic-only: masking, the echoed-mask write guard, and the better-auth exemption are unchanged.

2. Better Auth well-known warning (printed twice) → silence the false positive

@better-auth/oauth-provider emitted "Please ensure /.well-known/oauth-authorization-server/api/v1/auth exists. Upon completion, clear with silenceWarnings.oauthAuthServerConfig." — but registerOidcDiscoveryRoutes already mounts those documents at the issuer root (RFC 8414 §3 requires them there, outside better-auth's own routing, so the plugin can't see them).

  • Pass the documented silenceWarnings: { oauthAuthServerConfig: true } to oauthProvider(...). Verified against @better-auth/oauth-provider@1.7.0-rc.1: the option is a member of OAuthOptions and gates the exact logger.warn.
  • Root cause of the double print (investigated): the notice fires in oauth-provider's init(ctx), run once per betterAuth() construction, and the auth instance is built more than once at boot — an initial lazy build, then a rebuild after boot-time auth settings are applied (applyConfigPatch nulls the cached instance so the next request rebuilds with the new policy). Gating the emitter covers every build path, so the count no longer matters.

3. Registry re-register output → debug level

[Registry] Overwriting package: … and Re-registering owned object: … are normal rebuild / HMR / seed-replay paths, but were emitted via console.warn (always on) and looked like errors.

  • Add a debug-only SchemaRegistry.debug() (emits only at logLevel === 'debug') and route both lines through it.
  • Make it discoverable: a new logLevel construction option resolved from OS_REGISTRY_LOG (unknown value → info), so a developer chasing a registration issue can surface the lines with OS_REGISTRY_LOG=debug.

Regression guards (keep the boot log at zero)

  • password — examples assert every generic (non-better-auth) password field affirms ackPlaintextMasking (examples/app-showcase/test/no-startup-warnings.test.ts; examples/app-crm/test/smoke.test.ts, future-proofing an example with none today).
  • better-authauth-manager.mcp-oauth.test.ts asserts oauthProvider is wired with silenceWarnings.oauthAuthServerConfig: true.
  • registryregistry-log-level.test.ts asserts the re-register / package-overwrite lines are silent at the default info level and only emit via console.debug at debug (never console.warn), plus the OS_REGISTRY_LOG resolution.

Other examples

Only showcase declared a generic password field; the better-auth and registry fixes are framework-level, so app-crm / app-todo inherit clean boots. app-crm now carries the same password guard; app-todo ships no password fields and uses the custom objectstack test runner (no vitest guard added there).

Docs

  • ADR-0100 §B5 records the ackPlaintextMasking opt-out and its rationale; the generated content/docs/references/data/field.mdx and the spec liveness ledger (field/ackPlaintextMasking) are updated; a changeset covers the three packages.

Verification (local, real test runner)

  • packages/specobject.test.ts + field.test.ts: 200 passed (incl. 3 new: ack suppresses, partial-ack still warns about the un-acked field, warning text names the flag).
  • packages/objectql — registry suites: 122 passed (incl. new registry-log-level.test.ts).
  • packages/plugins/plugin-auth — auth-manager suites (incl. mcp-oauth, which builds the real oauthProvider): 215 passed.
  • examples/app-showcase (1) + examples/app-crm (20) guards: pass — confirms ackPlaintextMasking survives ObjectSchema.create end-to-end.
  • Spec check:liveness + check:docs: green. ESLint on changed files: clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TXHXXHnquzVUjeQYPs9bmy

…ples boot clean (#3420)

`os dev` on the stock showcase printed three fixed noise sources on every
boot, training users to ignore warnings (cry-wolf). Clear all three:

1. field-zoo password warning — ObjectSchema.create() warned that
   showcase_field_zoo.f_password declares `password` on a non-auth object,
   yet offered no way to express the "this is intended" its own text invited.
   Add a field-level `ackPlaintextMasking: true` opt-out (ADR-0100) that skips
   the warning for a deliberately-masked field, and set it on field-zoo's demo
   field. The warning text now points authors at the flag.

2. Better Auth well-known warning (printed twice) — @better-auth/oauth-provider
   warned "Please ensure '/.well-known/oauth-authorization-server/api/v1/auth'
   exists…" even though registerOidcDiscoveryRoutes already mounts those
   documents at the issuer root (RFC 8414 §3). Silence the false positive with
   the documented `silenceWarnings.oauthAuthServerConfig` option; gating the
   emitter also removes the duplicate print.

3. Registry re-register output — `[Registry] Overwriting package…` and
   `Re-registering owned object…` are normal rebuild/HMR/seed-replay paths but
   were emitted via console.warn (always on). Route them through a new
   debug-only SchemaRegistry.debug() so they stay out of the default 'info'
   boot log while remaining available at logLevel 'debug'.

Adds spec tests for the ackPlaintextMasking opt-out (suppress, partial-ack,
warning-text hint); updates ADR-0100 §B5 to record the opt-out.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TXHXXHnquzVUjeQYPs9bmy
@vercel

vercel Bot commented Jul 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Canceled Canceled Jul 24, 2026 4:01pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests size/m and removed documentation Improvements or additions to documentation protocol:data tests labels Jul 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/objectql, @objectstack/plugin-auth, @objectstack/spec.

110 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/objectql, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via packages/objectql, @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/objectql)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/plugin-auth)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/objectql)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/objectql, @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/objectql)
  • content/docs/permissions/authentication.mdx (via @objectstack/objectql, @objectstack/plugin-auth)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/sso.mdx (via @objectstack/plugin-auth)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/objectql, @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/objectql, @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/objectql, @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/objectql, @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

…liveness, add changeset (#3420)

Follow-ups required by CI for the new field-level `ackPlaintextMasking` option:

- Regenerate content/docs/references/data/field.mdx (generated from FieldSchema).
- Classify field/ackPlaintextMasking as `live` in the spec liveness ledger — its
  consumer is warnGenericPasswordFields (object.zod.ts), proven by the ADR-0100
  author-warning suite in object.test.ts.
- Add the changeset for @objectstack/spec, @objectstack/objectql, @objectstack/plugin-auth.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TXHXXHnquzVUjeQYPs9bmy
@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling labels Jul 24, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review July 24, 2026 15:05
claude added 2 commits July 24, 2026 15:29
…nv seam (#3420)

Follow-ups so the startup log stays at zero warnings and the debug output is
discoverable:

1. Regression guards for all three noise sources:
   - password: examples assert every generic (non-better-auth) `password` field
     affirms `ackPlaintextMasking` (showcase no-startup-warnings.test.ts; crm
     smoke.test.ts — future-proofs an example with none today).
   - better-auth: auth-manager.mcp-oauth.test.ts asserts oauthProvider is wired
     with `silenceWarnings.oauthAuthServerConfig: true`.
   - registry: registry-log-level.test.ts asserts the re-register / package-
     overwrite lines are silent at the default `info` level and only emit via
     console.debug at `debug` (never console.warn).

2. Other examples: verified only showcase declared a generic password field; the
   better-auth and registry fixes are framework-level so crm/todo inherit them.
   crm now carries the same password guard. (todo ships no password fields and
   uses the custom `objectstack test` runner, so no vitest guard is added there.)

3. better-auth double-print root cause: the notice fires in oauth-provider's
   `init(ctx)`, run once per betterAuth() construction; auth is (re)built more
   than once at boot (initial lazy build, then a rebuild after boot-time auth
   settings apply — applyConfigPatch nulls the cached instance). silenceWarnings
   gates the emitter itself, so it is covered on every build path. Corrected the
   inaccurate inline comment accordingly.

4. Registry debug discoverability: add a `logLevel` option to
   SchemaRegistryOptions resolved from `OS_REGISTRY_LOG` (unknown → info), so a
   developer can surface the debug-gated housekeeping with OS_REGISTRY_LOG=debug.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TXHXXHnquzVUjeQYPs9bmy
@os-zhuang
os-zhuang merged commit cde1975 into main Jul 24, 2026
16 of 17 checks passed
@os-zhuang
os-zhuang deleted the claude/startup-log-noise-cleanup-qcofu3 branch July 24, 2026 15:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dev: 启动日志三种固定噪音(field-zoo password 警告 / Better Auth WARN×2 / Registry re-register)— 官方示例应零警告启动

2 participants