diff --git a/frontend/src/components/settings/PostAssociationsCard.vue b/frontend/src/components/settings/PostAssociationsCard.vue
index 141d789..c267fde 100644
--- a/frontend/src/components/settings/PostAssociationsCard.vue
+++ b/frontend/src/components/settings/PostAssociationsCard.vue
@@ -6,9 +6,10 @@
>
Some creators post a cropped fragment on Patreon to say the real thing has
- landed in their Discord. FC proposes those pairs; nothing is linked until
- you accept one. A wrong link would tell you two different pieces are the
- same, so this stays a suggestion.
+ landed in their Discord. When the creator's own file name settles it —
+ the same working name on both posts and nowhere else in their library —
+ FC links the pair for you. Anything less certain waits here, because a
+ wrong link would tell you two different pieces are the same.
+
+
+ Off, every pair waits for you here — including the ones there is nothing
+ left to decide about.
+
+
- A pair always needs two reasons — being close in time
- and the post itself mentioning Discord. Neither is enough alone at any
- setting at or above 0.55, which is what stops a busy posting day from
- producing false pairs.
+ A pair needs two reasons — close in time, the post
+ mentioning Discord or the server, or a marker the creator uses on
+ both and almost nowhere else. None is enough alone at any setting at
+ or above 0.45, which is what stops a busy posting day from producing
+ false pairs. A shared working name is weighed separately: it says the
+ two are the same piece rather than that they happened near each
+ other.
@@ -57,8 +72,9 @@
- Nothing proposed. That is the expected state most of the time — pairs only
- appear when a post both lands near a drop and says it is about Discord.
+ Nothing waiting. That is the expected state most of the time — a pair the
+ file names settle is linked without asking, and everything else needs a
+ post to both land near a drop and point at Discord.
+ · shared marker {{ Math.round(p.signals.marker * 100) }}%
+
+
+
+
+ both call it
+ {{ p.signals.identity_token }}
+ ({{ Math.round((p.signals.identity ?? 0) * 100) }}% — shared with
+ another post of theirs, so not conclusive on its own)
Link
@@ -98,10 +127,12 @@ import SettingNumberField from '../common/SettingNumberField.vue'
const store = usePostAssociationsStore()
const enabled = ref(true)
+const auto = ref(true)
const threshold = ref(0.6)
const windowHours = ref(24)
watch(() => store.enabled, (v) => { enabled.value = v }, { immediate: true })
+watch(() => store.auto, (v) => { auto.value = v }, { immediate: true })
watch(() => store.threshold, (v) => { threshold.value = v }, { immediate: true })
watch(() => store.windowHours, (v) => { windowHours.value = v }, { immediate: true })
diff --git a/frontend/src/stores/postAssociations.js b/frontend/src/stores/postAssociations.js
index e8a2027..b98cc55 100644
--- a/frontend/src/stores/postAssociations.js
+++ b/frontend/src/stores/postAssociations.js
@@ -6,14 +6,18 @@ import { useAsyncAction } from '../composables/useAsyncAction.js'
import { toast } from '../utils/toast.js'
// Backs the announcement review queue (#388 E5): "this Patreon post announced
-// that Discord drop". Confirm-only, deliberately — a wrongly-asserted link
-// tells the operator two different pieces are one, which is worse than no link
-// at all, so accept is the ONLY thing that makes a link real. Mirrors
-// seriesSuggestions (FC-6.3), which is the same shape for the same reason.
+// that Discord drop". A wrongly-asserted link tells the operator two different
+// pieces are one, which is worse than no link at all — so what reaches this
+// queue is everything FC is NOT sure enough about to act on by itself.
+//
+// A pair the creator's own working name identifies, where that name is on
+// these two posts and nowhere else in their library, is linked without asking
+// (`auto`). Mirrors seriesSuggestions (FC-6.3) in shape.
export const usePostAssociationsStore = defineStore('postAssociations', () => {
const api = useApi()
const proposals = ref([])
const enabled = ref(true)
+ const auto = ref(true)
const threshold = ref(0.6)
const windowHours = ref(24)
const { loading, error, run } = useAsyncAction({ errorAs: 'message' })
@@ -28,6 +32,7 @@ export const usePostAssociationsStore = defineStore('postAssociations', () => {
async function loadSettings () {
const s = await api.get('/api/settings/import')
enabled.value = s.discord_link_enabled
+ auto.value = s.discord_link_auto
threshold.value = s.discord_link_threshold
windowHours.value = s.discord_link_window_hours
}
@@ -41,6 +46,11 @@ export const usePostAssociationsStore = defineStore('postAssociations', () => {
await saveSettings({ discord_link_enabled: v })
}
+ async function setAuto (v) {
+ auto.value = v
+ await saveSettings({ discord_link_auto: v })
+ }
+
async function setThreshold (v) {
threshold.value = v
await saveSettings({ discord_link_threshold: v })
@@ -76,8 +86,8 @@ export const usePostAssociationsStore = defineStore('postAssociations', () => {
}
return {
- proposals, enabled, threshold, windowHours, loading, error,
- load, loadSettings, setEnabled, setThreshold, setWindowHours,
+ proposals, enabled, auto, threshold, windowHours, loading, error,
+ load, loadSettings, setEnabled, setAuto, setThreshold, setWindowHours,
accept, dismiss, rescan
}
})