|
3434 | 3434 | }, |
3435 | 3435 | { |
3436 | 3436 | "id": "access-security.anonymous-floor-v18-doors", |
3437 | | - "title": "The anonymous floor answers 401 FIRST on the doors v18 added to it — /notifications (was 501), non-POST /keys (was 405), share-link management (was 501), /openapi.json and /docs, every /i18n face and the settings family — while the token faces and the public-form submit stay anonymous and the submit echoes only {id}", |
| 3437 | + "title": "The anonymous floor answers 401 FIRST on the doors v18 added to it — /notifications (was 501), non-POST /keys (was 405), share-link management (was 501), /openapi.json, every /i18n face and the settings family — while the token faces and the public-form submit stay anonymous and the submit echoes only {id}", |
3438 | 3438 | "since": "v18", |
3439 | 3439 | "status": "active", |
3440 | | - "revision": 2, |
| 3440 | + "revision": 3, |
3441 | 3441 | "priority": "P1", |
3442 | 3442 | "surface": "api", |
3443 | 3443 | "personas": [ |
|
3456 | 3456 | ] |
3457 | 3457 | }, |
3458 | 3458 | "steps": [ |
3459 | | - "with NO credentials call: GET /api/v1/notifications, GET /api/v1/keys, GET /api/v1/share-links, GET /api/v1/openapi.json, GET /api/v1/docs, GET /api/v1/i18n/locales, GET /api/settings/branding", |
| 3459 | + "with NO credentials call: GET /api/v1/notifications, GET /api/v1/keys, GET /api/v1/share-links, GET /api/v1/openapi.json, GET /api/v1/i18n/locales, GET /api/settings/branding", |
| 3460 | + "with NO credentials, then as admin, call the retired viewer path GET /api/v1/docs, and a path nothing serves (GET /api/v1/this-route-does-not-exist) as the control", |
3460 | 3461 | "with no credentials call a token face: GET /api/v1/share-links/BOGUS/resolve", |
3461 | 3462 | "with no credentials POST /api/v1/forms/contact-us/submit with the four whitelisted fields plus a forged owner_id and a non-whitelisted status", |
3462 | 3463 | "repeat two of the 401 calls as admin to prove the door itself serves" |
|
3474 | 3475 | "verify": "status + error.code per door, anonymous", |
3475 | 3476 | "evidence": "one status+code line per door" |
3476 | 3477 | }, |
| 3478 | + { |
| 3479 | + "clause": "the retired viewer path GET /api/v1/docs is routed nowhere: to the anonymous caller and to the admin it answers 404 with the same body the never-served control path answers on that boot — never 401 (a door is back) and never 200 or text/html (the page is back)", |
| 3480 | + "oracle": "api", |
| 3481 | + "verify": "status + content-type + body of GET /api/v1/docs, anonymous and as admin, compared with the control path's", |
| 3482 | + "evidence": "one status+code line per call, the control included" |
| 3483 | + }, |
3477 | 3484 | { |
3478 | 3485 | "clause": "the share-link token face is NOT behind the floor (it answers its own invalid-token refusal, not 401)", |
3479 | 3486 | "oracle": "api", |
|
3496 | 3503 | ], |
3497 | 3504 | "automated": { |
3498 | 3505 | "kind": "dogfood", |
3499 | | - "ref": "packages/qa/dogfood/test/anonymous-door-sweep.dogfood.test.ts + packages/rest/src/rest-api-description-anonymous-deny.test.ts + packages/runtime/src/domains/i18n-anonymous-deny.test.ts + packages/services/service-settings/src/settings-routes.anonymous-floor.pin.test.ts + packages/rest/src/public-form-submit-answer.test.ts" |
| 3506 | + "ref": "packages/qa/dogfood/test/anonymous-door-sweep.dogfood.test.ts + packages/rest/src/rest-api-description-anonymous-deny.test.ts + packages/rest/src/rest-docs-viewer-retired.pin.test.ts + packages/runtime/src/domains/i18n-anonymous-deny.test.ts + packages/services/service-settings/src/settings-routes.anonymous-floor.pin.test.ts + packages/rest/src/public-form-submit-answer.test.ts" |
3500 | 3507 | }, |
3501 | 3508 | "source": [ |
3502 | 3509 | "packages/core/src/security/anonymous-deny.ts#shouldDenyAnonymous", |
|
3516 | 3523 | "date": "2026-10-19", |
3517 | 3524 | "change": "fixtures.knownGaps[1] marked CLOSED — a checklist-accuracy finding of the 18.0 QA sweep (QA run #24559, access-security.anonymous-floor-v18-doors; wave anchor #24579 §3): the gap said a non-POST /keys never reaches the floor on a stock boot and answers 405; since #23909 the dispatcher registers /keys for every verb (packages/runtime/src/dispatcher-plugin.ts) and the run measured anonymous GET /api/v1/keys → 401. No clause changed: acceptance[1] already demanded 401", |
3518 | 3525 | "ref": "#24632" |
| 3526 | + }, |
| 3527 | + { |
| 3528 | + "revision": 3, |
| 3529 | + "date": "2026-10-21", |
| 3530 | + "change": "re-pointed for the retirement of GET /api/v1/docs, the OpenAPI document's HTML viewer page (no consumer; the API origin serves no HTML viewer). /docs left the title and the floored-door step, so acceptance[1] no longer demands 401 of it; a new step and acceptance[2] drive the retired path anonymously and as admin and demand the host's ordinary 404, the never-served control path's body, on that boot. automated.ref gains packages/rest/src/rest-docs-viewer-retired.pin.test.ts, the registrar-level not-served pin on both route shapes. /openapi.json stays on the floor, unchanged", |
| 3531 | + "ref": "#25104" |
3519 | 3532 | } |
3520 | 3533 | ] |
3521 | 3534 | }, |
|
0 commit comments