b91a230f12
Works through the optional CCIP ideas + the "keep moving even if I forget" ask:
AUTOMATION (no button needed):
- Hourly beat auto-enqueues CCIP backfill — new images get embedded (and errored
ones retried) on their own; the queue never goes idle waiting for a click.
- CCIP auto-apply: a daily sweep tags confident matches (source='ccip_auto') so
identity tags keep flowing. ON by default (opt-out, like head auto-apply);
ml_settings.ccip_auto_apply_enabled + _threshold (0.92, above the suggest cut),
migration 0064. Vectorized (one matmul + reduceat per image), reversible, skips
already-applied/rejected. Switch + threshold in the GPU agent card; GET/PATCH
/api/ml/settings; auto_applied count in /api/ccip/overview.
REFERENCE QUALITY (the over-fire root cause):
- character_references now draws ONLY from single-character images — on a
multi-character image the tag is image-level, so every figure would otherwise
pollute each character's prototypes (a 2-char image tagged 'Velma' made
Daphne's figure a Velma reference). This is the contamination behind residual
over-firing.
- Cached on a cheap signature (char-tag count + ccip-region count/max-id) so the
reference load isn't redone on every modal open.
Tests: multi-character image not used as a reference; auto-apply tags a confident
match as ccip_auto.
NEXT (not done, confirmed): comic-panel cropping + SigLIP concept crops ("spot
interesting content").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
"""ml_settings: CCIP auto-apply switch + threshold (#114)
|
|
|
|
Confident CCIP character matches auto-tag (source='ccip_auto') on a daily sweep,
|
|
so identity tags keep flowing without pressing a button. ON by default (opt-out,
|
|
like head auto-apply); the high threshold (0.92, above the 0.85 suggest cut) +
|
|
single-character references keep it safe, and every auto-tag is reversible.
|
|
|
|
Revision ID: 0064
|
|
Revises: 0063
|
|
Create Date: 2026-06-30
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0064"
|
|
down_revision: Union[str, None] = "0063"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column(
|
|
"ml_settings",
|
|
sa.Column(
|
|
"ccip_auto_apply_enabled", sa.Boolean(), nullable=False,
|
|
server_default=sa.true(),
|
|
),
|
|
)
|
|
op.add_column(
|
|
"ml_settings",
|
|
sa.Column(
|
|
"ccip_auto_apply_threshold", sa.Float(), nullable=False,
|
|
server_default="0.92",
|
|
),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("ml_settings", "ccip_auto_apply_threshold")
|
|
op.drop_column("ml_settings", "ccip_auto_apply_enabled")
|