Repository navigation
Integrate DataOps with the shared Cognito browser login #119
Description
Integrate DataOps with the shared Cognito browser login
Status: blocked — source is accepted, merged, and deployed; one HUMAN Google account-class check remains
Tags: enhancement, portal, frontend, backend, infra, testing, P1
Depends on: HUMAN access to one real @datatalks.club Google account and one real out-of-domain Google account
Blocks: None
Next owner: HUMAN identity verifier
Source owner if the HUMAN check fails: Orchestrator files a new bounded auth bug from sanitized evidence
Resume condition: verify the two real Google account classes against a steady-state deployed DataOps portal, then PM closes #119 without a source commit
Final source disposition
The shared Cognito relying-party integration is complete.
Accepted source history, all ancestors of current source and origin/main:
fbcbc1a/ mergee562000— Cognito authorization-code + S256 PKCE, token/JWKS validation, local User mapping, opaque server-side browser sessions, logout, machine-credential isolation, SAM parameters, and OIDC deployment contract.393a738/ merge2dc413a— scoped production Cognito configuration to the deploy job so browser tests remain deterministic.15643d9/ mergee6d3b25— fixed production cookie bootstrap; the canonical portal uses the HttpOnly browser session and cannot fall back to the retired password UI.
Tester and PM accepted the implementation and both hotfixes. On-Call deployed e6d3b25, verified the live authorize/callback/error/logout seams, and recorded a successful real hosted-password login, local User mapping, secure cookie, logout, and session-reuse denial.
Current canonical source still implements the accepted contract in:
backend/src/auth/browserAuth.tsbackend/src/docs/portal.tsbackend/src/router.tsbackend/src/db/sessions.tsbackend/src/db/users.tsinfra/template.full.yaml.github/workflows/deploy-dataops-v1.yml
There is no agent-verifiable code, test, infrastructure, migration, data, or deployment task remaining under #119.
Current authentication contract
- Signed-out pages redirect through local
/loginto the sharedauth.dtcdev.clickauthorization endpoint. - Authorization uses fresh state, nonce, and S256 PKCE. The one-time transaction is short-lived and server-side.
- Callback exchange validates the ID-token signature and issuer/JWKS, DataOps client audience, expiry/not-before, nonce, token use, normalized email, and verified-email claim.
- Exactly one existing enabled DataOps User must match the verified email. Unknown, disabled, or ambiguous users fail closed; there is no auto-provisioning.
- A successful browser login creates a bounded opaque server-side session. The browser holds only an
HttpOnly; Secure; SameSite=Lax; Path=/cookie. /api/meand route authorization derive identity from the verified browser session or separately verified API/device credential, never from a raw caller identity header.- Pages require the browser session; unauthenticated APIs return JSON 401. The retired production username/password form and
/api/auth/loginare unavailable. - Logout deletes the server-side session, expires the cookie, and redirects through the registered Cognito logout URI.
- Independent machine/webhook/device/API credentials retain their own route-specific checks and never become browser sessions.
- No Cognito client secret, Google secret, token, code, verifier, or session value belongs in this repository, GitHub Actions, logs, screenshots, or issue evidence.
Completed acceptance evidence
- Agent-verifiable Cognito/PKCE, callback, JWT/JWKS, replay, local-user, session, logout, page/API, machine-credential, SAM, and OIDC contracts passed focused and full review.
- The inbound identity-header exploit and multi-page normalized-email uniqueness gap found by Tester were fixed and independently retested.
- PM-requested return-target/open-redirect and callback-error privacy/UX gaps were fixed and independently retested.
- Production CI environment scoping was fixed, accepted, and deployed.
- Production canonical-portal cookie bootstrap was fixed, accepted, and deployed.
- On-Call verified live authorization parameters, fresh PKCE/state/nonce, secure transaction cookie, clean callback failure, branded error recovery, API 401, Cognito logout, TLS, and deployed configuration without recording secret material.
- A real administrator-created hosted-password identity completed login, mapped to an enabled DataOps User, rendered the workspace, logged out, and could not reuse the old session.
- Shared-auth infrastructure exposes Google for the DataOps client; the deployed domain guard passed synthetic in-domain allow and out-of-domain reject probes.
- [HUMAN] A real
@datatalks.clubGoogle account completes the hosted Google flow and maps to its existing enabled DataOps User. - [HUMAN] A real Google account outside
@datatalks.clubis rejected and receives no DataOps browser session.
HUMAN verification procedure
This issue authorizes no automated credential use or provider action. An authorized human performs the check in a clean/private browser and records only sanitized results.
In-domain allow
Given an existing enabled DataOps User whose normalized email matches the authorized real @datatalks.club Google account
When the human opens https://ops.dtcdev.click, chooses Google at the shared hosted login, and completes the provider flow
Then the callback returns to a clean DataOps URL, the canonical workspace renders, and /api/me represents the matching local User
Out-of-domain deny
Given a real Google account outside @datatalks.club
When the human attempts the same hosted Google flow
Then shared auth/domain enforcement rejects it, DataOps creates no browser session, protected API access remains 401, and the portal exposes no protected data or account-enumeration detail
Logout sanity
Given the successful in-domain session
When the human signs out and revisits a protected route
Then the old session cannot authorize the portal and the browser starts a fresh login
Evidence boundary
Record:
- UTC timestamp;
- deployed DataOps source identity if visible without an AWS call;
- pass/fail for in-domain allow, out-of-domain deny, and logout reuse;
- sanitized browser destination/status and whether the correct local display identity appeared;
- a private or sanitized screenshot reference, if useful.
Do not record or paste account addresses, provider profile data, passwords, authorization codes, state, nonce, PKCE values, JWTs, cookies, session IDs, request headers, private screenshots, or exact provider error payloads.
If either account-class check fails, leave #119 open and file a new needs grooming auth bug with the sanitized stage and observed safe behavior. Do not change Cognito, IAM, Lambda, users, sessions, or provider configuration from this tracker.
#166 publication sequencing
#119 source was merged to origin/main and deployed before #166; it is already an ancestor of the repaired #166 rollout chain. #119 must not add a commit to, modify, or be used to bypass the reviewed A/B/C/D cutover artifact.
The HUMAN Google check may run against the current steady-state live portal before #166 begins. Once any #166 transition phase is dispatched, pause this check until Phase D, canonical evidence, and accepted cleanup restore ordinary steady-state deployment. A pass against unchanged #119 auth source remains valid; any auth/config/source change after the pass requires ordinary On-Call regression evidence under its owning issue.
#166 does not reopen #119 implementation and is not a dependency for the source-complete tracker.
Historical evidence
- Tester PASS after security fixes: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Final implementation Tester PASS: Integrate DataOps with the shared Cognito browser login #119 (comment)
- PM acceptance: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Deployed shared Cognito evidence: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Cookie-bootstrap Tester PASS: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Cookie-bootstrap PM acceptance: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Cookie-bootstrap deployment PASS: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Real hosted-password PASS: Integrate DataOps with the shared Cognito browser login #119 (comment)
- Google infrastructure-only evidence: Integrate DataOps with the shared Cognito browser login #119 (comment)
Out of scope
- Any additional source implementation, repository verification, deployment, AWS/shared-auth mutation, provider configuration, credential handling, User/session/data mutation, or import/export/restore work.
- Auto-provisioning, Cognito-group role sync, broad user lifecycle, or changing route-specific machine credentials.
- Treating synthetic domain-guard evidence as the two-account HUMAN pass.
- Repeating the real hosted-password test.
- Closing Integrate DataOps with the shared Cognito browser login #119 without both real Google account-class results, or treating Replace the transitional Tasks table with the final cardId schema #166 transitional deployment as authorization to run them.
Activity
[-]Replace portal Basic auth with shared dtcdev Cognito login[/-][+]Integrate DataOps with the shared Cognito browser login[/+]alexeygrigorev commentedon Jul 14, 2026
Software Engineer handoff
Implementation is ready for Tester review in the uncommitted worktree
/home/alexey/git/dataops/.tmp/worktrees/worktree-issue-119on branchworktree-issue-119.Implemented
a short-lived one-time DynamoDB transaction, and a separate HttpOnly binding
cookie. Transaction records store hashes rather than the browser state or
binding value.
JWKS, including refresh on missing/rotated keys or signature failure;
validates algorithm/key use, signature, issuer, audience, expiry, not-before,
nonce, token use, email, and email verification.
Unknown, disabled, or ambiguous identities receive the same non-sensitive
403 and are never provisioned.
absolute expiry and DynamoDB TTL. The cookie is
HttpOnly; Secure; SameSite=Lax; Path=/; old bearer sessions without the newexpiry fields retain their prior contract.
/api/meand existing routeauthorization instead of the browser
portal-adminfallback.form;
/api/auth/loginremains unavailable in portal mode. Basic credentialscannot serve a browser page or authorize a portal API.
bearer clients, portal-broker credentials, and route-specific layered
authorization. Bookkeeping retains both bearer-session and ingestion-key
checks in portal mode. Bookkeeping, calendar, and newsletter importers now use
their existing bearer-session option instead of the removed Basic path.
issuer, JWKS, client, callback, logout, and session lifetime. No Cognito client
or Google secret is present, and no new AWS permission was added.
to
dataops-v1; it does not deploy or mutatedtcdev-shared-auth.assertions.
Changed files
backend/src/auth/browserAuth.ts,backend/src/db/sessions.ts,backend/src/db/users.ts,backend/src/docs/portal.ts,backend/src/router.ts,backend/src/types.tsbackend/scripts/import-bookkeeping.ts,backend/scripts/import-calendar.ts,backend/scripts/import-newsletter-slots.tsbackend/tests/browser-auth.test.ts,backend/tests/docs-portal.test.ts,backend/tests/portal-auth.test.ts,backend/tests/api-bookkeeping.test.ts,backend/tests/import-bookkeeping.test.ts,backend/tests/newsletter-slots.test.ts,backend/tests/calendar.test.ts,backend/tests/bookkeeping-production-frontend.test.ts,tests/infra/test_template.pyinfra/template.full.yaml,.github/workflows/deploy-dataops-v1.ymldocs/architecture.md,docs/calendar.md,docs/local-development.md,docs/v1-runtime-architecture.mdVerification run by SWE
npm --prefix backend test— exit 0; 1,190 tests passed, 0 failed.npm --prefix backend run typecheck— exit 0.npm --prefix backend run build— exit 0.npm --prefix backend run test:e2e— exit 0; 342 Playwright tests passed,0 failed.
uv run --with pytest python -m pytest tests/infra/test_template.py— exit0; 19 tests passed, 0 failed. This includes exact GitHub OIDC and all eight
shared-auth deploy-parameter assertions.
make sam-validate— exit 0;infra/template.full.yamlis a valid SAMtemplate.
make sam-build— exit 0;BackendFunctionpackage built successfully.failed.
git diff --check— exit 0.Acceptance status / remaining checks
are checked in the issue body.
signed-out auth-error and authenticated workspace screenshots. SWE did not
claim the Tester-only checkbox or create review screenshots.
exclusively through the GitHub Actions OIDC workflow after approved merge.
[HUMAN]hosted-login checks remain unchecked. After deployment, verifya real administrator-created Cognito password user, logout/reuse denial, an
allowed
@datatalks.clubGoogle account, and rejection of a Google accountoutside the domain without recording credentials, codes, tokens, or session
values.
humanlabel and remain open after code shipsuntil those checks are recorded.
No commit or push was made.
alexeygrigorev commentedon Jul 14, 2026
CHANGES REQUESTED
Independent Tester verification found one exploitable authorization failure and one incomplete uniqueness boundary. The implementation must return to SWE before PM acceptance. I did not commit, push, deploy, or check the Tester acceptance box.
Blocking security finding
In production portal mode,
/api/metrusts the inboundx-user-idheader before validating a bearer session:handlePortaldeliberately allows a request carrying any bearer-shaped header to continue to the legacy bearer validator. That means a caller can send a fabricated bearer value plus the ID of an existing user and receive that user's profile without a valid cookie, bearer session, or broker secret.Reproduction (local in-memory tables, portal mode, no auth bypass):
Actual: HTTP 200 with the
victim-adminadmin record.Expected: HTTP 401. A valid bearer session with a mismatched
x-user-idmust resolve to the bearer session's user, never the caller-supplied header.The reproduction command exited 0 and printed:
{"statusCode":200,"body":"{\"user\":{\"id\":\"victim-admin\",...\"role\":\"admin\"}}"}Required fix: derive
/api/meidentity only from (a)handlePortal's verified browseruserId, (b) a broker identity after the portal-secret check, or (c) a successfully loaded bearer session. Do not treat a raw inboundx-user-idas authenticated. Add regressions for a fabricated bearer plusx-user-id, and for a valid bearer plus a differentx-user-id.Additional identity-mapping gap
getUsersByNormalizedEmailperforms only one DynamoDBScanCommand. DynamoDB Scan pages at 1 MiB, so a matching or duplicate user beyondLastEvaluatedKeyis ignored. That does not prove the acceptance requirement that the verified email maps to exactly one existing user across the table. Paginate to exhaustion (or use an indexed normalized-email key) and add a multi-page duplicate regression.Required command evidence
npm --prefix backend test— exit 0; 1,190 tests, 1,190 passed, 0 failed.npm --prefix backend run typecheck— exit 0.npm --prefix backend run build— exit 0.npm --prefix backend run test:e2e— exit 0; 342 Playwright tests passed, 0 failed.make sam-validate— exit 0;infra/template.full.yamlvalid.make sam-build— exit 0;BackendFunctionbuild succeeded.uv run --with pytest python -m pytest tests/infra/test_template.py— exit 0; 19 passed, 0 failed.browser-auth,docs-portal,portal-auth, bookkeeping, calendar, and newsletter suites) — exit 0; 63 passed, 0 failed.git diff --check— exit 0.The green suites do not cover the spoofed-header case above, so they do not establish the affected acceptance criteria.
Screenshot evidence
.tmp/screenshots/issue-119/signed-out-auth-error.png— 1440x900, SHA-2565e74d7ffe504e4a5cd755e8afb67d9de8606aff440783fb75937a90c795765b7; inspected: HTTP 400 safe sign-in error, no 404, overlap, credential, code, token, or session value..tmp/screenshots/issue-119/authenticated-workspace.png— 1440x900, SHA-2566f9e1d3424ba2e107311b95e29793a450f2a33e343850a2e123819aaf2f743be; inspected: authenticated Tasks / Work Queue empty state,/api/mereturned the seeded local admin, no 404, error page, overlap, or leaked credential.The screenshot harness also verified signed-out
/-> 302/login, signed-out/api/tasks-> JSON 401, callback-without-state -> safe 400, authenticated workspace -> 200, and authenticated/api/me-> the mapped local user. The harness itself exited 0.Acceptance-criterion assessment
/api/mecan be spoofed as described.[HUMAN]and were not attempted by Tester.Please send the fixes back for an independent Tester rerun.
alexeygrigorev commentedon Jul 14, 2026
Software Engineer retest handoff
The Tester-requested changes are implemented in the uncommitted worktree
/home/alexey/git/dataops/.tmp/worktrees/worktree-issue-119on branchworktree-issue-119.Changes made
x-user-idtrust path. Outside the explicit test-only authbypass, every casing of this inbound header is deleted before authorization
and is replaced only after browser-session, signed portal-broker, or bearer-
session verification.
/api/menow resolves and returns an existing enabled DataOps user only froma verified browser/broker identity or a valid bearer session. A fabricated
bearer plus an existing user ID is rejected.
mismatched client-provided
x-user-idcannot override the session user.there is exactly one match, so identities on later pages are found and
duplicates split across pages still fail closed in the callback flow.
/api/me, another protected API route, beareridentity precedence, later-page matches, and cross-page ambiguity.
Verification after the fixes
npm --prefix backend test: 1,195 tests passed, 0 failed.npm --prefix backend run typecheck: passed.npm --prefix backend run build: passed.git diff --check: passed.No UI or infrastructure files changed as part of this retest fix, so the prior
green E2E (342/342), infrastructure tests (19/19), SAM validation, and SAM build
remain applicable. No commit or push was made.
alexeygrigorev commentedon Jul 14, 2026
TEST PASS
The two previously blocking findings are fixed and independently verified. All agent-verifiable acceptance criteria now pass. No commit, push, or deployment was performed.
Security retest
Authorization: Bearer fabricated-tokenplus rawx-user-id: victim-adminnow returns HTTP 401 JSON{"error":"Unauthorized"}. Reproduction command exit 0.x-user-idalso fails on another protected API route.x-user-idresolves to the bearer session's actual user, not the caller-supplied identity.LastEvaluatedKeyacross every Scan page. Focused tests prove both a unique match on a later page and duplicate matches split across pages; the latter reaches the callback as ambiguous and fails closed.Command evidence
NODE_ENV=test SKIP_AUTH=true node --import tsx --test tests/browser-auth.test.ts tests/portal-auth.test.ts tests/users.test.ts(frombackend/) — exit 0; 32 passed, 0 failed.npm --prefix backend test— exit 0; 1,195 passed, 0 failed, 173 suites.npm --prefix backend run typecheck— exit 0.npm --prefix backend run build— exit 0.npm --prefix backend run test:e2e— exit 0; 342 Playwright tests passed, 0 failed.uv run --with pytest python -m pytest tests/infra/test_template.py— exit 0; 19 passed, 0 failed.make sam-validate— exit 0;infra/template.full.yamlis a valid SAM template.make sam-build— exit 0;BackendFunctionbuild succeeded.npx tsx .tmp/tester-119/capture-auth-evidence.ts— exit 0; signed-out root 302 to/login, signed-out API JSON 401, missing-state callback safe 400, authenticated workspace 200, mapped/api/me200.git diff --check— exit 0.Screenshot evidence
.tmp/screenshots/issue-119/signed-out-auth-error.png— 1440x900, SHA-2565e74d7ffe504e4a5cd755e8afb67d9de8606aff440783fb75937a90c795765b7..tmp/screenshots/issue-119/authenticated-workspace.png— 1440x900, SHA-2566f9e1d3424ba2e107311b95e29793a450f2a33e343850a2e123819aaf2f743be.Both screenshots were regenerated and read after the fixes. The signed-out state is the safe local sign-in error with a retry link. The authenticated state is the DataOps Tasks / Work Queue empty state. Neither shows a 404, error page, broken layout, overlap, authorization code, token, session identifier, or credential.
Acceptance criteria
15-16. Real hosted password and Google flows remain
[HUMAN], were not attempted by Tester, and should keep the issue open with thehumanlabel after shipping.READY FOR PM ACCEPTANCE
alexeygrigorev commentedon Jul 14, 2026
REJECTED
The core Cognito integration, local identity mapping, session model, machine-credential compatibility, and GitHub Actions OIDC deployment contract are strong, and Tester supplied the required full-suite and screenshot evidence. PM acceptance is still blocked by two security/product-flow gaps in the relying-party journey.
1. Post-login return target is not guaranteed to stay on DataOps
safeReturnToaccepts any value beginning with one slash except//. It therefore accepts a decoded value such as/\evil.example. Browsers apply URL backslash normalization for HTTPS URLs:new URL('/\\evil.example', 'https://ops.dtcdev.click').hrefresolves tohttps://evil.example/. After a successful callback, the implementation copies this value directly into theLocationheader.This violates the test scenario requiring callback completion to redirect to a clean same-origin page and creates a post-authentication open redirect.
Required change:
return_toagainst the DataOps callback/origin, not only string prefixes.https://ops.dtcdev.click; fall back to/./\evil.example),//evil.example, absolute URLs, and valid same-origin paths.2. Failed callbacks leave the authorization code and state in the browser URL
When state/binding/token exchange/token validation/account mapping fails,
handleCallbackreturns the HTML error response directly from/auth/callback?code=...&state=.... The generic body does not print those values, but the completed error page remains on a URL containing them, and the error response lacks aReferrer-Policy: no-referrerheader. ClickingTry againcan consequently carry the callback URL as a same-origin referrer.This does not meet the unchecked acceptance criterion requiring authorization codes and session-sensitive values to be absent from URLs after callback completion.
Required change:
Cache-Control: no-storeandReferrer-Policy: no-referrerto the clean error journey.code,state, token, verifier, or session value.User-visible error state
The regenerated
signed-out-auth-error.pngis functional, but it is raw browser-default HTML on a blank page and visually reads like an unstyled server failure rather than part of DataOps. The authentication error state is explicitly within this issue's scope and the PM gate requires usable, coherent error states. Render a minimal DataOps-consistent error panel with clear retry action and accessible focus/heading treatment; do not expose technical provider details.Retest required
After the fixes, Tester must independently rerun the affected auth/security tests plus the issue's full required commands, regenerate and inspect the signed-out error screenshot, and reconfirm the authenticated workspace screenshot. The two
[HUMAN]hosted password/Google checks remain correctly deferred and should not block agent acceptance after these changes.I unchecked the affected ID-token/callback URL privacy criterion. I did not change code, commit, push, deploy, or add the
humanlabel.18 remaining items
Merge hotfix-issue-119-cookie-bootstrap: Fix packaged portal cookie b…
alexeygrigorev commentedon Jul 14, 2026
ON-CALL DEPLOYMENT PASS — cookie-bootstrap hotfix
e6d3b25The hotfix is deployed and the agent-verifiable production checks pass.
CI/CD evidence
dataops-v1isUPDATE_COMPLETE; deployment log reports 3 users processed and backend smoke passed on attempt 1 (root=302 login=302).Exact deployed artifact
Lambda package last modified
2026-07-14T11:03:57Z, code SHA-256mJ5Cyi3xZ/gRzsIy/u//93kGZhXB6lqYlc22O324wU0=.Read-only inspection of that package confirms:
dataops-auth-modemarker;browser-cookie(standalone remainslegacy-bearer);/api/me, and starts the workspace from the mapped backend user;/login, sign-out routes to/logout, and API requests do not attach a legacyAuthorizationheader;Live public probes
/→302 /loginthrough CloudFront./login→ sharedhttps://auth.dtcdev.click/oauth2/authorizewith the expected client, exact callback, authorization-code flow,openid email profile, PKCE S256, fresh state/nonce/challenge, anddataops_oauth_txcookie withHttpOnly; Secure; SameSite=Lax./api/mewithout a session → JSON401 {"error":"Unauthorized"}and no Basic challenge.303 /auth/error, empty body, no query leakage,no-store,no-referrer, and expired transaction cookie; following it ends at the branded 403 error page with a safe retry action./logout→ the configured Cognito logout URL with exact client/logout URI, expiresdataops_session, and usesno-store.auth.dtcdev.clickTLS certificate/SAN is valid for the custom domain (current validity through 2027-01-27).No production session was created or harvested during on-call verification. The new production-portal Playwright coverage proves the valid opaque backend-session bootstrap contract; one final real-account browser confirmation remains appropriately human-owned under this issue's
humanlabel.alexeygrigorev commentedon Jul 14, 2026
LIVE PASSWORD CHECK PASS (2026-07-14T11:08:03Z UTC). A temporary administrator-created @datatalks.club Cognito identity and matching enabled DataOps user completed the real hosted password form in headless Chromium, returned through the production callback, rendered the DataOps workspace with the mapped Auth E2E user and Sign out, and returned 200 from /api/me. The session cookie was HttpOnly, Secure, and SameSite=Lax. GET /logout returned the registered Cognito logout redirect; replaying the prior opaque session returned JSON 401. The Cognito and DynamoDB test records were deleted. No credential, authorization code, token, verifier, cookie value, or exact disposable address was recorded. Screenshot inspected locally at 1440x900; SHA-256: ab4d56f5a21e54923dacff4667323e43f3bfed0acee9eb4cc080bbf8f158379b.
alexeygrigorev commentedon Jul 14, 2026
GOOGLE INFRASTRUCTURE CHECK PASS: the deployed Cognito Google IdP is enabled for the DataOps client, the hosted UI exposes Google, and the production authorization endpoint hands off to accounts.google.com with the exact Cognito idpresponse URI. The deployed domain-guard Lambda independently accepts a synthetic member@datatalks.club federated event and rejects outsider@example.com. This is infrastructure evidence only; the remaining checked-off requirement still needs real Google accounts and no account credentials should be posted here.
alexeygrigorev commentedon Jul 14, 2026
FINAL CROSS-SERVICE AUTH EVIDENCE
SecureandHttpOnly; Datamailer also explicitly setsSameSite=Lax.COGNITOand Google identity providers.303 /auth/errorwithno-storeand no authorization code/state leakage.8dc5f3f.9252b88.No real Google sign-in E2E is claimed here. The remaining
[HUMAN]checks stay open: confirm an allowed@datatalks.clubGoogle account succeeds and a non-domain Google account is rejected.alexeygrigorev commentedon Jul 14, 2026
PM spec correction: updated the stale Dependencies statement to the current audited state. Google federation is enabled, and all five shared-auth clients support both COGNITO and Google. The unchecked [HUMAN] real in-domain/out-of-domain Google allow/deny criterion and the human label remain unchanged. No code or deployment state was changed.
alexeygrigorev commentedon Jul 31, 2026
PM TRACKER RECONCILIATION
The status now records that the agent scope is shipped and deployed. The checked criteria remain supported by the final cookie-bootstrap Tester PASS, PM acceptance, deployed hotfix
e6d3b25, successful On-Call checks, and the completed live hosted-password criterion.The
humanlabel remains. The real-Google criterion stays unchanged and unchecked: no real@datatalks.clubGoogle success or non-domain Google rejection is claimed. Resume only when a human can verify both account classes and record sanitized results without credentials or tokens.Evidence: Tester pass, PM acceptance, On-Call deployment, live password check, final cross-service evidence.
alexeygrigorev commentedon Aug 13, 2026
PM authentication lifecycle reconciliation complete.
Decision: #119 stays open and blocked only on the two-account HUMAN Google check. No agent-verifiable implementation remains.
Read-only findings:
fbcbc1a/e562000, CI-scoping hotfix393a738/2dc413a, and cookie-bootstrap hotfix15643d9/e6d3b25are all ancestors of current source andorigin/main.backend/src/auth/browserAuth.ts, portal middleware/router, session/User repositories, SAM configuration, and the OIDC deployment workflow.@datatalks.clubaccount is admitted and mapped to its existing enabled DataOps User; a real out-of-domain Google account is rejected and receives no DataOps session. Evidence must not include identities, credentials, codes, tokens, cookies, headers, or private provider payloads.#166 sequencing is now explicit. #119 was already published and deployed and must not add to or alter the reviewed A/B/C/D artifact. The human check may run against the current steady-state portal before transition begins; if any #166 phase starts first, wait until Phase D evidence and accepted cleanup restore steady-state deployment. #166 does not reopen #119 source work.
I restored the missing
humanlabel. On a HUMAN pass, PM may close #119 without any source commit or deployment. On a failure, leave it open and file a separate bounded auth bug from sanitized evidence.No repository file, test, AWS/provider action, credential, User/session/data mutation, import/export/restore path, deployment, commit, or push was touched.
Integrate DataOps with shared Cognito authentication
Merge worktree-issue-119: Integrate DataOps with shared Cognito authe…
Scope Cognito deployment environment to deploy job
Merge hotfix-issue-119-ci-auth-env: Scope Cognito deployment environm…
Fix packaged portal cookie bootstrap
Merge hotfix-issue-119-cookie-bootstrap: Fix packaged portal cookie b…