{% extends "base.html" %} {% block content %}

Task Settings

Project defaults flow into channel overrides. Use Quick Setup for normal operation; open Advanced Setup for full controls.

How Matching Works

Safe default behavior: strict matching, required prefixes, completion parsing enabled, and task-id announcements disabled.

Hierarchy: Project flags are defaults. A mapped channel can override those defaults without changing project-wide behavior.

Matching modes: strict (prefix only), balanced (prefix + limited hints), broad (more permissive, higher false-positive risk).

Quick Setup

Creates or updates project + optional epic + channel mapping in one submission.

After setup, view tasks in Tasks Hub{% if prefill_service and prefill_identifier %} or this group task view{% endif %}.

{% csrf_token %}

Platform to watch for task extraction.

Exact chat/group id where messages are monitored.

Top-level container for derived tasks.

Optional sub-container within a project.

strict = safest, balanced = moderate, broad = permissive.

Click to add:

Minimum length after prefix.

Require Prefix: only prefixed messages can create tasks. Derivation Enabled: master on/off for extraction. Completion Enabled: parse completion phrases like done #12. AI Title Enabled: normalize task titles using AI. Announce Task ID: send bot confirmation on creation.

Advanced Setup

Manual controls for creating hierarchy entities, mapping channels, and overriding behavior.

Projects

Create projects and review their effective defaults.

{% csrf_token %}

Project names should describe a long-running stream of work.

{% for row in projects %} {% empty %} {% endfor %}
ProjectDefaults
{{ row.name }} mode={{ row.settings_effective.match_mode }}, prefixes={{ row.allowed_prefixes_csv }}, announce_id={{ row.settings_effective.announce_task_id }}
No projects.

Epics

Epics are optional subdivisions under a project.

{% csrf_token %}

Choose the parent project first, then add the epic name.

Group Mapping

Map a channel to a project/epic. Channel flags can later override project defaults.

{% csrf_token %}

Service/platform for this mapping.

Exact identifier for the chat/group.

Project receiving derived tasks.

Optional epic within that project.

{% for row in sources %} {% empty %} {% endfor %}
ChatProjectEpicMatchAnnounce
{{ row.service }} · {{ row.channel_identifier }} {{ row.project.name }} {{ row.epic.name }} {{ row.settings_effective.match_mode }}{% if row.settings_effective.require_prefix %} +prefix{% endif %} {{ row.settings_effective.announce_task_id }}
{% csrf_token %}
No mappings.

Project Defaults (All Mapped Chats)

Set baseline extraction behavior for a project. Every mapped chat inherits this unless overridden below.

{% csrf_token %}

Require Prefix: allow task creation only with configured prefixes. Derivation Enabled: turn extraction on/off for this project. Completion Enabled: enable completion phrase parser. Announce Task ID: emit confirmation messages on task creation.

Channel Override Flags

Channel-level override. Use only where this chat should behave differently from the project default.

{% csrf_token %}

Require Prefix: enforce prefixes in this channel. Derivation Enabled: extraction on/off for this channel only. Completion Enabled: completion phrase parser in this channel. AI Title Enabled: AI title normalization in this channel. Announce Task ID: confirmation message in this channel.

Completion Phrases

Add parser phrases for completion statements followed by a task reference, e.g. done #12.

{% csrf_token %}
    {% for row in patterns %}
  • {{ row.phrase }}
  • {% empty %}
  • No phrases.
  • {% endfor %}

Providers

Controls outbound sync to external tracking systems. If disabled, tasks are still derived and visible inside GIA only.

{% csrf_token %}

Mock provider logs sync events without writing to a real third-party system.


{% csrf_token %}

Codex task-sync runs in a dedicated worker (python manage.py codex_worker).

This provider config is global per-user and shared across all projects/chats. This phase is task-sync only (no full transcript mirroring by default).

Open Codex Status

Codex Compact Summary

Health: {% if codex_compact_summary.healthcheck_ok %} online {% else %} offline {% endif %} {% if codex_compact_summary.healthcheck_error %} {{ codex_compact_summary.healthcheck_error }} {% endif %}

Worker heartbeat: {% if codex_compact_summary.worker_heartbeat_at %} {{ codex_compact_summary.worker_heartbeat_at }} ({{ codex_compact_summary.worker_heartbeat_age }}) {% else %} no worker activity yet {% endif %}

pending {{ codex_compact_summary.queue_counts.pending }} waiting_approval {{ codex_compact_summary.queue_counts.waiting_approval }} failed {{ codex_compact_summary.queue_counts.failed }} ok {{ codex_compact_summary.queue_counts.ok }}
{% for run in codex_compact_summary.recent_runs %} {% empty %} {% endfor %}
WhenStatusTaskSummary
{{ run.created_at }} {{ run.status }} {% if run.task %}#{{ run.task.reference_code }}{% else %}-{% endif %} {{ run.result_payload.summary|default:"-" }}
No runs yet.

Browse all derived tasks in Tasks Hub.

External Chat Links

Map one GIA contact to one Codex thread for task-sync routing.

More info

This is task-sync only. It does not mirror full chat history. The link tells the Codex worker which Codex conversation/session should receive updates for tasks from that contact/group.

{% if external_link_scoped %} {% endif %}
{% csrf_token %}
{% for row in external_chat_links %} {% empty %} {% endfor %}
ProviderPersonIdentifierExternal ChatEnabled
{{ row.provider }} {% if row.person %}{{ row.person.name }}{% else %}-{% endif %} {% if row.person_identifier %}{{ row.person_identifier.service }} · {{ row.person_identifier.identifier }}{% else %}-{% endif %} {{ row.external_chat_id }} {{ row.enabled }}
{% csrf_token %}
No external chat links.
{% endblock %}