Skip to content

feat: add browser-local ContentSignal manual intake - #190

Merged
Ankit6149 merged 23 commits into
masterfrom
feat/content-signal-manual-intake
Aug 16, 2026
Merged

feat: add browser-local ContentSignal manual intake#190
Ankit6149 merged 23 commits into
masterfrom
feat/content-signal-manual-intake

Conversation

@Ankit6149

Copy link
Copy Markdown
Owner

Implements

Closes #152 end to end for the owner-first browser-local path. This replaces draft PR #189 using the exact same verified branch/head because the connector could not transition the draft state.

Product outcome

SignalFlow now has a real durable record before Campaign/opportunity generation:

manual thought/event/topic → ContentSignal → browser persistence → lifecycle/history

A ContentSignal remains evidence/context, not generated content. Creating one does not call AI, create a Campaign, score an opportunity, schedule, or publish anything.

Implemented

  • versioned workspace-owned ContentSignal domain record and schema;
  • manual/project-less and optional project-scoped signals;
  • canonical sourceArtifactIds[] / assetIds[] references rather than copied source business rules;
  • provenance, privacy classification, optional boundary note, occurred/observed timestamps;
  • lifecycle: new, interpreted, used, ignored, snoozed, archived;
  • workspace-scoped ContentSignal repository port;
  • memory, browser-local, and generic store-backed adapters;
  • browser refresh/reopen recovery with stable IDs and lifecycle state;
  • application-service commands for create/read/list/edit/ignore/snooze/archive/restore/project/source attachment;
  • cross-workspace ownership checks and duplicate-ID protection;
  • canonical source/asset existence/workspace validation when attaching references;
  • owner-facing /signals workspace with manual capture, edit, privacy/boundary controls, filters, snooze/ignore/archive/restore;
  • explicit UI truth: 0 automatic detections — Not implemented, No AI call, and no publishing/generation claim;
  • responsive/focus/reduced-motion behavior;
  • implementation documentation plus README/AGENTS/capability truth updates.

Scale boundary

The Personal Alpha adapter is browser-local today, but the domain and application contracts do not depend on localStorage. A future authenticated/Postgres adapter can replace the repository without replacing the signal model or UI/application contract.

ContentSignal history is intentionally not yet claimed as part of the portable campaign archive or cloud sync; that limitation is documented explicitly.

Non-goals preserved

This PR does not implement GitHub/webhook ingestion (#161), automatic event detection, ContentOpportunity scoring/ranking (#156), AI generation, editorial calendar, or automatic posting. The current Campaign generation path remains additive and independent.

Verification

Final standard CI on exact head 78b10ab4536db20acfff778bfd87c0948a746925 is green:

  • frontend npm test
  • production dependency audit ✅
  • Next build ✅
  • MCP tests ✅
  • Python tests ✅

Regression coverage includes schema/future-version failure, serialization safety, workspace isolation, duplicate IDs, manual create/read/list/update, project-less/project-scoped records, source/asset validation, lifecycle persistence, refresh/reopen recovery, adapter lifecycle, application-boundary/static truth, and Campaign independence.

Ankit6149 and others added 23 commits August 16, 2026 11:46
@vercel

vercel Bot commented Aug 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
signal-flow-studio Ready Ready Preview Aug 16, 2026 7:07pm

@Ankit6149
Ankit6149 merged commit 2f05ac4 into master Aug 16, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P0][Product Brain] Add canonical ContentSignal domain, provenance, and manual-signal intake

1 participant