diff --git a/Makefile b/Makefile
index 4f7ae52..1cec80d 100644
--- a/Makefile
+++ b/Makefile
@@ -28,7 +28,11 @@ compose-log:
docker-compose --env-file=stack.env logs -f --names
test:
- docker-compose --env-file=stack.env run --rm app sh -c ". /venv/bin/activate && python manage.py test $(MODULES) -v 2"
+ @if command -v docker-compose >/dev/null 2>&1; then \
+ docker-compose --env-file=stack.env run --rm app sh -c ". /venv/bin/activate && python manage.py test $(MODULES) -v 2"; \
+ else \
+ podman exec gia sh -lc "cd /code && . /venv/bin/activate && python manage.py test $(MODULES) -v 2"; \
+ fi
migrate:
docker-compose --env-file=stack.env run --rm app sh -c ". /venv/bin/activate && python manage.py migrate"
diff --git a/core/migrations/0030_chattasksource_settings.py b/core/migrations/0030_chattasksource_settings.py
new file mode 100644
index 0000000..850c734
--- /dev/null
+++ b/core/migrations/0030_chattasksource_settings.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.11 on 2026-03-02 12:55
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0029_answermemory_answersuggestionevent_chattasksource_and_more'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='chattasksource',
+ name='settings',
+ field=models.JSONField(blank=True, default=dict),
+ ),
+ ]
diff --git a/core/models.py b/core/models.py
index 8ff5630..d4a98e0 100644
--- a/core/models.py
+++ b/core/models.py
@@ -2045,6 +2045,7 @@ class ChatTaskSource(models.Model):
related_name="chat_sources",
)
enabled = models.BooleanField(default=True)
+ settings = models.JSONField(default=dict, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
diff --git a/core/tasks/engine.py b/core/tasks/engine.py
index 23fdb9b..8b23d9c 100644
--- a/core/tasks/engine.py
+++ b/core/tasks/engine.py
@@ -87,7 +87,7 @@ def _normalize_flags(raw: dict | None) -> dict:
"allowed_prefixes": _parse_prefixes(row.get("allowed_prefixes")),
"completion_enabled": _to_bool(row.get("completion_enabled"), True),
"ai_title_enabled": _to_bool(row.get("ai_title_enabled"), True),
- "announce_task_id": _to_bool(row.get("announce_task_id"), True),
+ "announce_task_id": _to_bool(row.get("announce_task_id"), False),
"min_chars": max(1, int(row.get("min_chars") or 3)),
}
@@ -108,7 +108,7 @@ def _normalize_partial_flags(raw: dict | None) -> dict:
if "ai_title_enabled" in row:
out["ai_title_enabled"] = _to_bool(row.get("ai_title_enabled"), True)
if "announce_task_id" in row:
- out["announce_task_id"] = _to_bool(row.get("announce_task_id"), True)
+ out["announce_task_id"] = _to_bool(row.get("announce_task_id"), False)
if "min_chars" in row:
out["min_chars"] = max(1, int(row.get("min_chars") or 3))
return out
@@ -327,7 +327,7 @@ async def process_inbound_task_intelligence(message: Message) -> None:
payload={"origin_text": text},
)
await _emit_sync_event(task, event, "create")
- if bool(flags.get("announce_task_id", True)):
+ if bool(flags.get("announce_task_id", False)):
try:
await send_message_raw(
message.source_service or "web",
diff --git a/core/templates/pages/tasks-settings.html b/core/templates/pages/tasks-settings.html
index da7b2c1..06a4461 100644
--- a/core/templates/pages/tasks-settings.html
+++ b/core/templates/pages/tasks-settings.html
@@ -13,7 +13,8 @@
Group Mapping: binds a chat channel (service + channel identifier) to a project and optional epic. Task extraction only runs where mappings exist.
Matching Hierarchy: channel mapping flags override project flags. Project flags are defaults; mapping flags are per-chat precision controls.
False-Positive Controls: defaults are safe: match_mode=strict, require_prefix=true, and prefixes task:/todo:. Freeform matching is off by default.
-
Task ID Announcements: when enabled, newly derived tasks post an in-chat confirmation containing the new task reference (for example #17).
+
Task ID Announcements: when enabled, newly derived tasks post an in-chat confirmation containing the new task reference (for example #17). Default is off.
+
Legacy Backfill: opening this page applies safe defaults to older project and mapping rows created before strict prefix-only matching.
Completion Phrases: explicit trigger words used to detect completion markers like done #12, completed #12, fixed #12.
Provider: external sync adapter toggle. In current setup, mock provider validates append-only sync flow and retry behavior.
Sync Event Log: audit of provider sync attempts and outcomes. Retry replays the event without mutating immutable task source records.
@@ -24,14 +25,14 @@
Quick Setup For Current Chat
Prefilled from compose for {{ prefill_service }} · {{ prefill_identifier }}. Create/update project + epic + channel mapping in one step.