Updates
Platform Updates
Public-facing release notes for meaningful changes across Furries PH operational systems.
First created Last updated
`partners.furries.ph` `fc8536e9` - docs(auth): reconcile production login recovery guidance <!-- fc8536e9f73ab2088423d17c6a5b02f7583f6f8c -->
partners.furries.phfc8536e9- docs(auth): reconcile production login recovery guidancepartners-api24fa4bad- docs(auth): align provider operations with published releasedocs.furries.ph73c28e7d- docs(auth): publish native Telegram selection correctionpartners.furries.ph82169a2a- docs(auth): record native Telegram chooser regressionpartners-api0c2d6d75- fix(auth): complete native Telegram account selectiondocs.furries.phf4de5ace- docs(auth): record published router startup exclusionssocial.furries.pheb91ebd1- fix(auth): preserve native Social router startupadmin.furries.ph091b8eb4- fix(auth): preserve native Admin router startuppartners.furries.ph096324b7- fix(auth): preserve native Partners router startupdocs.furries.ph59eb2571- docs(auth): record separate Telegram account choicespartners.furries.ph58ed8b5b- docs(auth): record published Telegram account chooserpartners.furries.phc3d5fbda- fix(auth): preserve separate historical Telegram account connectionspartners-api3c9f3499- fix(auth): let existing Telegram accounts keep separate connectionsdocs.furries.phaf769a79- docs(auth): record deployed provider account continuitypartners.furries.ph187da03b- fix(auth): preserve login for historical Telegram connectionspartners-api4316d785- fix(auth): recover historical Telegram links without relinkingpartners-api98bcc1f3- fix(deploy): keep provider linking release within Workers Free limitsdocs.furries.phc1e20d19- docs(auth): record shared provider connections and pending migrationpartners.furries.ph64ccda0c- feat(auth): migrate existing community links into login methodspartners.furries.ph38a50df7- fix(auth): confirm provider links against the original accountsocial.furries.ph7d567997- fix(auth): explain shared provider login connectionsadmin.furries.pha658e33f- fix(auth): describe shared provider connection behaviorrego.furries.ph531989ab- fix(auth): confirm each community account link before completionpartners-api0f57f2c2- fix(auth): preserve existing accounts across provider connections
`docs.furries.ph` `0d41d6c6` - docs(updates): publish Discord API-owned linking release evidence <!-- 0d41d6c60886947baf57475e2361e4c86c8aff99 -->
docs.furries.ph0d41d6c6- docs(updates): publish Discord API-owned linking release evidencepartners.furries.ph6cb042e5- docs(auth): record deployed Discord OIDC consent and account continuitypartners-apia71292fa- feat(auth): route Discord linking through API-owned OIDCpartners.furries.ph3621b360- feat(auth): preserve Discord accounts for API-owned OIDC linkingpartners.furries.pha28120d9- style(docs): preserve task index line endingspartners.furries.ph3f57d230- docs(release): record BIR and automatic messaging deployment proofpartners-api87a14fc3- docs(auth): clarify automatic messaging unlink behaviorpartners-apiba8d8964- feat(api): publish BIR badges and automatic provider messagingpartners.furries.ph66342bed- feat(settings): configure BIR badges and activate bot messagesadmin.furries.ph4af4a2d1- feat(admin): configure BIR registration seal and QR coderego.furries.ph94c32355- feat(rego): display published BIR registration badgesdocs.furries.phb948aa32- docs(updates): publish verified Discord API consentpartners.furries.phd6124bb6- docs(auth): record live Discord API consent and retained accountspartners-api347e7c9f- docs(auth): record hosted API-owned Discord consentpartners-api907d9156- fix(auth): retain login for existing Discord app grantspartners-api42c1ea03- fix(auth): accept equivalent OAuth scope representationspartners-apiea93154a- fix(auth): distinguish invalid Discord token fields safelypartners-api6e52e7a3- fix(auth): diagnose Discord consent failures without grant datapartners-api675331b0- fix(auth): show API hostname on Discord sign-in consentdocs.furries.ph8db307ab- docs(auth): record immediate branded provider sign-in controlssocial.furries.ph1ac12d1c- fix(auth): render branded Telegram and Discord buttons immediatelyadmin.furries.ph04e1cac4- fix(auth): render branded Telegram and Discord buttons immediatelyrego.furries.ph3200917a- fix(auth): render branded Telegram and Discord buttons immediatelypartners.furries.phe0681aae- fix(auth): render branded Telegram and Discord buttons immediately
`docs.furries.ph` `5dd748b3` - docs(auth): describe email instructions and explicit resend <!-- 5dd748b37d166feca484761c32519badd1f4b581 -->
docs.furries.ph5dd748b3- docs(auth): describe email instructions and explicit resendsocial.furries.ph476d5e50- fix(auth): keep email confirmation to instructions and resendadmin.furries.phf172b8f9- fix(auth): keep email confirmation to instructions and resendrego.furries.ph5bebca44- fix(auth): keep email confirmation to instructions and resendpartners.furries.ph854e2bef- fix(auth): keep email confirmation to instructions and resenddocs.furries.ph35c88e26- docs(auth): explain the confirmed daily email quota blockagepartners.furries.ph01387711- docs(auth): record confirmed Google mail quota blockagepartners-api0fe481fa- fix(mail): recognize the observed Google daily quota rejectiondocs.furries.ph76627a38- docs(auth): explain inbox choices and confirmation retryrego.furries.phe57afa4d- fix(auth): open inboxes and resend pending email confirmationpartners.furries.phe496f95c- fix(auth): open inboxes and resend pending email confirmationsocial.furries.phea4747c3- fix(auth): open inboxes and retry pending email on Socialadmin.furries.ph4187b04b- fix(auth): open email inboxes and recover pending confirmationpartners-api7fe9d171- fix(auth): retry pending email confirmation for the current accountdocs.furries.ph40c946a2- docs(auth): explain blocking inbox continuation for email linkingsocial.furries.ph5c8b8e7a- fix(auth): continue pending email linking from the inboxadmin.furries.ph07045d53- fix(auth): keep pending email setup in the inbox handoffrego.furries.phcf596c43- fix(auth): block profile continuation until email link confirmationpartners.furries.phaaf3e46f- fix(auth): require inbox continuation while linking emaildocs.furries.phb377e45e- docs(auth): publish current verification and email delivery limitspartners-apif6ec9670- docs(auth): describe deployed Telegram and pending email behaviorpartners.furries.ph9358155f- docs(auth): reconcile hosted provider and pending email evidencerego.furries.ph9c807ae9- test(auth): recognize reviewed email confirmation navigationdocs.furries.phf1ddde27- docs(auth): publish verified profile email and complete legal readerspartners.furries.ph27fa9f20- docs(auth): record hosted profile email and legal reader proofrego.furries.ph9d942791- fix(profile): show complete terms and privacy documentssocial.furries.phbcbe33b9- fix(auth): keep expired provider feedback consistentadmin.furries.ph9dbc9119- fix(auth): keep expired provider feedback consistentrego.furries.phcf4373a2- fix(auth): keep expired provider feedback consistentpartners.furries.phe444e8a6- fix(auth): show expired provider attempts before access checkspartners.furries.ph07976adb- docs(auth): record free Telegram API flow and consent brandingpartners-apid8aef4ec- feat(auth): route Telegram OIDC through the platform APIdocs.furries.phf5103a0d- docs(auth): publish staged Discord and Telegram release notespartners.furries.ph4b14e98b- docs(auth): track staged provider release and remaining account checkspartners-apic36165c9- docs(auth): record hosted provider availability and pending inbox proofsocial.furries.phb2c13738- feat(auth): add provider and passwordless email sign-inadmin.furries.ph2034dc2c- feat(auth): add provider login and profile email enrollmentpartners-apifa3ce354- fix(auth): reject redirects through a Worker-compatible transportpartners-apia03ec1c9- fix(auth): retain callback referrer protection through middlewarepartners-apif853686f- fix(deploy): reserve Auth secret capacity within Workers Free limitsrego.furries.phd689f1b8- feat(auth): add provider sign-in and same-account email setuppartners.furries.pha48392fb- feat(auth): add provider sign-in and profile email enrollmentpartners-api256cb1a7- feat(auth): support Discord and Telegram with same-account email login
`partners.furries.ph` `e4d6b254` - fix(profile): accept country-code phone formats in setup and editing <!-- e4d6b254b10bffb8cb3e392f208de33d659cff20 -->
partners.furries.phe4d6b254- fix(profile): accept country-code phone formats in setup and editingrego.furries.ph1ee3999f- fix(profile): preserve country-code phone entry and canonical savespartners-apib8ab68c7- fix(profile): normalize international phone formats before saving
`docs.furries.ph` `94b436f1` - docs(rego): publish group redemption and paid-value fixes <!-- 94b436f186e7c69a507cae9f78516779a3269740 -->
docs.furries.ph94b436f1- docs(rego): publish group redemption and paid-value fixespartners.furries.ph8e86f0a6- docs(rego): record verified group registration releasepartners.furries.ph9d87532d- feat(rego): configure shared purchases and member completionrego.furries.ph85429527- feat(rego): let members redeem paid group registrationspartners-apie95a70a6- feat(rego): enable member redemption and preserve paid values
`rego.furries.ph` `7ab67f36` - fix(rego): show configured group discounts throughout checkout <!-- 7ab67f365ee25387015fcc192ae49a9a11bc85a2 -->
-
rego.furries.ph7ab67f36- fix(rego): show configured group discounts throughout checkout -
rego.furries.phf219d993- fix(friends): show requests immediately and refresh connections -
partners-api620721e7- fix(notifications): support Cloudflare request redirect handling -
partners-apicc2aa8ae- fix(notifications): classify failed internal wake-ups -
partners-apie1685533- feat(notifications): dispatch email and bot alerts immediately -
partners.furries.ph1a3e64db- feat(notifications): add scoped instant delivery claims -
rego.furries.ph9e9d3c65- feat(profiles): apply shared single-line bio policy in Rego -
partners.furries.ph943d8ac8- feat(profiles): default dashboard bios to a single line -
admin.furries.ph2e515ac0- feat(profiles): add Admin bio line-break setting -
partners-api7cae2429- feat(profiles): enforce default single-line bio policy -
docs.furries.ph35e30c57- docs(eps): explain submission details and browser evidence viewing -
partners.furries.ph7cd551e4- feat(eps): show submission details and browser evidence previews -
partners-api9df75990- feat(eps): expose authorized submission revision details
`docs.furries.ph` `a01b84f7` - docs(eps): record verified requirement progress controls <!-- a01b84f7bfb82cdc4a3a27c39f3a21895c8741d6 -->
docs.furries.pha01b84f7- docs(eps): record verified requirement progress controlspartners.furries.ph1e383864- fix(eps): add missing requirement progress controls to My Workpartners-apid89f7649- fix(eps): enable assigned requirement work status updatesdocs.furries.phede5a7f2- docs(eps): record Responsible and Accountable task control releasepartners.furries.ph21efffe3- fix(eps): restore responsible and accountable My Work controlspartners-api80051791- fix(eps): permit assigned accountable and responsible task updatespartners.furries.ph7afc9b87- fix(security): patch dashboard diagram and build dependenciespartners.furries.ph40c16113- test(security): retain real setup operation scope in owner fixturepartners.furries.ph56580286- fix(security): cancel obsolete profile setup savespartners.furries.ph26f78949- fix(security): cancel obsolete profile setup savespartners.furries.phd2500386- fix: bound asset register bookmark page allocationpartners-api4efaf9b8- fix: proxy payment QR images across API responsespartners-api1ae12dd0- fix: protect report image links in new audit revisionspartners-api9da5d253- fix: retry protected media reads while Sanity publishes assetspartners-api501937ce- fix: enable Worker cache controls for private image migrationpartners-apiaadff420- fix: migrate legacy incident images to protected deliverypartners.furries.ph4d7a37c6- fix: stop stale roster attachment downloadspartners-api507034e- fix: block legacy public uploads for saved reportspartners.furries.phad80a65d- fix: stop stale planning exports after owner changespartners.furries.ph85997395- test: capture synthetic protected report image previewpartners.furries.ph2d52bc0d- test: capture protected report image previewpartners.furries.phd267ec56- fix: protect pasted incident report imagespartners-apiff503402- test: cover report image admin and shared viewer accesspartners-apia426f6d7- fix: encrypt newly pasted incident imagespartners.furries.ph6350cdd1- fix: stop stale EMS exports after account or event changespartners.furries.ph3b038928- fix: stop stale finance downloads after owner changespartners.furries.ph47fdeeb2- fix: reject insecure Discord webhook settingspartners-apia5661f01- fix: require HTTPS for partner Discord webhookspartners.furries.phb7c0bb7d- fix: stop forwarding Admin link queriespartners-api115ec3d5- test: restore partner permission certification
`partners-api` `9618a2b1` - fix(auth): issue partner OTP callbacks in URL fragments <!-- 9618a2b19ba42b5ab9ccd99eb55d46acfb1d887a -->
partners-api9618a2b1- fix(auth): issue partner OTP callbacks in URL fragmentspartners.furries.phdfc9363a- fix(auth): clear one-time dashboard link credentialspartners.furries.phba3ba217- test(security): qualify asset authorization fixture updatespartners.furries.ph6245ce92- fix(security): align asset RPC authorization with dashboard permissionspartners.furries.phe351eee7- fix(security): keep campaign share links on Regopartners-api3a84dbc- fix(security): reject off-site campaign landing pathspartners.furries.ph9a9f4da8- fix(security): bound planning ZIP browser memorypartners.furries.ph94820274- fix(security): refresh cross-tab sessions and scope meeting note actionspartners-apib78cc8d- fix(security): honor explicit cross-department meeting invitespartners-apif90123a- fix(security): scope meeting notes and bind minutes approvalspartners.furries.ph48cf711d- chore: reconcile published statement metrics migrationpartners.furries.ph2b642795- fix: publish email link expiry from auth source configpartners.furries.ph8fb0725c- fix: isolate delayed session failures and shorten email linkspartners-api42da0818- fix: enforce source access on planning record mutationspartners.furries.phb5327f96- fix: restrict service-only security definer RPC grantspartners.furries.ph0446efa6- fix: isolate dashboard accounts and protect partner exportspartners-apic8a2ec4a- fix: enforce planning resource visibility and safe survey CSVdocs.furries.ph4027fdbb- docs: describe partner security safeguards pending releasepartners-api48122247- fix(tooling): bound Apps Script pattern depthcms.furries.phb3e2576e- fix(security): require scoped CMS capabilitiespartners.furries.ph1b6abf41- fix(database): enforce cross-event ownership guardspartners-apif0649249- fix(security): enforce tenant and capability boundaries
`partners-api` `5ba36811` - fix(access): retain FPH admin authority in partner scopes <!-- 5ba36811db056bebfad4d368b9f7b50a32e54fcf -->
-
partners-api5ba36811- fix(access): retain FPH admin authority in partner scopes -
partners.furries.ph6a48550d- fix(planning): expose inherited FPH partner-admin controls -
docs.furries.phcdde9664- docs(eps): publish staff-directory expiry choices -
partners.furries.phd8f424cd- feat(planning): offer staff-directory credential expiry choices -
partners-api1423f2f1- feat(planning): support staff-directory expiry up to three years -
docs.furries.ph010db037- docs(eps): explain FPH admin staff-directory access -
partners.furries.phc1892305- fix(planning): show staff-directory controls to FPH admins -
partners-apiff432157- fix(planning): allow FPH admins to manage staff-directory credentials -
partners-api6fffffd2- docs(publishing): record isolated queue live acceptance -
partners-apie96ecdef- fix(publishing): isolate delivery and cleanup queue budgets -
partners-api7aa14b2d- docs(publishing): record X connection and payment gate -
partners-api9f3938e8- docs(publishing): record X connection and payment gate -
partners-api22dd9076- docs(publishing): record independent X account linking readiness -
fph-social-docs-release-d712788aaf5444a6a4fb22afd5034a3efe4493b4- docs(publishing): record Instagram access and X setup readiness -
partners-api52a465e1- fix(publishing): verify AAC profile and channels for X videos -
partners-apiddce6ca4- fix(publishing): verify AAC profile and channels for X videos -
partners-api46bdff2a- fix(publishing): verify AAC profile and channels for X videos -
fph-social-docs-release-d712788aaf5444a6a4fb22afd5034a3e8ed2f287- docs(publishing): record verified links and Instagram setup -
partners-apif1bff332- fix(publishing): use verified Facebook feed permalinks -
partners-api2e2bf38b- fix(publishing): use verified Facebook feed permalinks -
fph-social-docs-release-d712788aaf5444a6a4fb22afd5034a3eff33e916- docs(publishing): record live Page deletion and audio validation -
partners-apif3c53323- fix(publishing): validate measured Reel audio before delivery -
fph-social-docs-release-d712788aaf5444a6a4fb22afd5034a3e82c2f165- docs(publishing): record receipt bounds and immediate test cleanup -
partners-api87907177- fix(publishing): bound sends and enforce current cleanup bindings -
fph-social-docs-release-d712788aaf5444a6a4fb22afd5034a3e3401923f- docs(publishing): record bounded cleanup and Page deletion gates -
partners.furries.ph7b520a72- feat(publishing): admit verified Facebook Page cleanup jobs -
partners-apiae43b74b- fix(publishing): bound cleanup and verify Facebook Page deletions -
docs.furries.phf7b3364a- docs(publishing): record measured media release and verified test cleanup -
partners-api0dd58399- feat(publishing): validate measured source and outgoing media -
partners.furries.phefcba133- feat(publishing): show measured media and explicit video checks -
docs.furries.phe7416657- docs(publishing): record reusable Discord styles and live bot proof -
partners-api42b736e9- test(publishing): verify inherited schedule races on PostgreSQL -
partners-api89d0f8ff- fix(publishing): validate Discord card links and style database writes -
partners.furries.ph24db3d1f- fix(publishing): preserve Discord editor state and shared styles -
partners.furries.ph50c4b94a- fix(publishing): allow reusable Discord styles in brand saves -
partners.furries.ph27e9295d- feat(publishing): add friendly Discord embeds and reusable styles -
partners-apieddea3b4- feat(publishing): add Discord card icons and reusable client styles -
partners-apicedb25be- docs(publishing): record live bot scheduling and cancellation -
docs.furries.ph92e13269- docs(social): record bot selection and live scheduling proof -
partners.furries.pha30f523d- fix(publishing): guard inherited and legacy destination schedules -
partners-api77a44ace- fix(publishing): keep inherited schedules aligned with post time -
partners.furries.ph5f7de03e- feat(social): select Discord bot servers and channels -
partners-apiedbf85f0- feat(social): publish Discord posts through the platform bot -
docs.furries.ph904b29eb- docs(social): publish verified author approval and provider delivery -
partners.furries.ph2bf39d4b- docs(social): record author approval and live publishing proof -
partners.furries.ph6267e91b- fix(social): let authorized authors approve their publishing content -
partners-api1dff4bac- fix(social): allow authorized authors to review publishing content -
partners-api71e2b0c8- fix(social): restore Worker provider and media transport -
partners.furries.phefad9eb1- fix(social): retain destination forms after confirmed save failures -
partners-api7ce1ef9e- fix(social): reject redirects without following provider credentials -
partners-api0f81f519- fix(social): identify Discord connection failure stages -
partners.furries.phf204445d- docs(social): update publishing acceptance status -
partners.furries.phf84ff204- docs(social): track deployed authentication removal -
docs.furries.phe175f5a3- docs(social): record inherited access and sign-in changes -
admin.furries.ph3ee75a0- fix(social): align administration guidance with signed-in access -
partners.furries.ph198a581e- fix(social): explain inherited publishing access -
partners-apib49b4c26- fix(social): remove repeated authentication from publishing actions -
partners-api9c280ee0- fix(publishing): honor super-admin and operational role access -
partners.furries.phc5edb701- fix(publishing): grant management to operational partner roles -
docs.furries.ph6216e321- docs(publishing): report published Facebook app configuration -
partners-api49282f97- docs(publishing): record configured Facebook app and credential bundle
`docs.furries.ph` `1f49126a` - docs(publishing): clarify approved-media acceptance prerequisite <!-- 1f49126aa215c70fa9b2ab6f46420f1e57410630 -->
-
docs.furries.ph1f49126a- docs(publishing): clarify approved-media acceptance prerequisite -
partners-api666a1acd- docs(publishing): correct deployed CMS acceptance guidance -
docs.furries.phdfc65142- docs(publishing): explain existing-member owner promotion -
admin.furries.phace5b598- fix(publishing): promote existing members during owner setup -
partners-apid221f36d- test(publishing): verify existing-member first-owner promotion -
docs.furries.ph14a007eb- docs(publishing): explain rich cards and first-owner setup -
partners.furries.ph26fcf511- feat(publishing): author Discord cards with approved media -
partners-apiaa09561c- docs(publishing): specify supported TikTok domain verification -
cms.furries.ph6b3131fb- docs(publishing): record the deployed Studio schema foundation -
admin.furries.phd8695c99- feat(publishing): configure the first client owner in Admin -
partners-api31094a60- fix(publishing): retain rich embeds and recover verifiable receipts -
docs.furries.ph333c40b1- docs(publishing): publish coordinated release and verification notes -
cms.furries.ph0117c4ac- fix(cms): deploy schemas to the registered external Studio -
partners.furries.phdd7e7d39- docs(publishing): record production foundation and remaining acceptance gates -
partners.furries.ph61f94eec- feat(publishing): ship approved multi-network authoring and recovery -
admin.furries.pha4438531- feat(publishing): add audited client support to Admin -
partners-api43fcff91- test(publishing): cover missing OAuth foundation recovery -
partners-apifa96a045- feat(publishing): deliver approved client posts with recoverable receipts -
cms.furries.ph229e1df2- feat(cms): require video duration for social publishing -
rego.furries.ph00815cd0- feat(profile): add optional bios and automatically branded links -
partners.furries.phb1420b4b- feat(profile): add bios, links and scoped EPS staff sharing -
partners-api7c830c58- feat(profile): expose scoped EPS staff directories and personal links -
rego.furries.phc6c7490c- perf(rego): overlap home code and shop catalog startup -
rego.furries.phbc57e53b- perf(rego): settle security verification and group invites before readback -
rego.furries.ph6704f5ed- perf(rego): keep profile saves mounted and start receipt reads earlier -
rego.furries.ph721e92ba- perf(rego): overlap startup reads and trim optional downloads -
partners.furries.phf7c9e9ec- perf: retain My Work navigation while its page opens -
rego.furries.ph31d5f629- perf(rego): defer browsing code and keep saves responsive -
partners-api0738f86f- fix(rego): expose friendship generations for responsive saves -
partners.furries.phe4f060eb- docs: record hosted automatic save verification -
partners-api9c46e992- perf: reuse scoped requirements on My Work entry -
partners-api45189fe2- perf: shorten Asset capability checks -
partners.furries.phb78926e2- fix: keep saved-state checks automatic through delayed reads -
rego.furries.ph0dfb222e- fix(rego): load page styles before hydration -
docs.furries.pha92fb8c0- docs(rego): explain public application introductions -
rego.furries.ph9eb7991d- fix(rego): keep event and application introductions public