Skip to content

Commit 44929c3

Browse files
committed
Ethics: Integrate Tone-Damping into the background worker and database
1 parent 401b79f commit 44929c3

2 files changed

Lines changed: 29 additions & 13 deletions

File tree

src/core/database.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,23 @@ async def init_db():
2727
await conn.run_sync(SQLModel.metadata.create_all)
2828
logger.info("database_initialized", url=settings.DATABASE_URL)
2929

30-
async def get_user_reliability(user_id: str) -> tuple[float, str | None]:
30+
async def get_user_reliability(user_id: str) -> tuple[float, str | None, int]:
3131
"""
32-
Fetch the reliability score and slack_id for a given user using SQLModel.
32+
Fetch the reliability score, slack_id, and consecutive firm intervetions.
3333
"""
3434
async with AsyncSessionLocal() as session:
3535
statement = select(UserHistory).where(UserHistory.user_id == user_id)
3636
results = await session.execute(statement)
3737
user = results.scalar_one_or_none()
3838

3939
if user:
40-
return user.reliability_score, user.slack_id
41-
return 100.0, None
40+
return user.reliability_score, user.slack_id, user.consecutive_firm_interventions
41+
return 100.0, None, 0
4242

43-
async def update_user_reliability(user_id: str, was_failure: bool):
43+
44+
async def update_user_reliability(user_id: str, was_failure: bool, tone_used: str = "supportive"):
4445
"""
45-
Update historical stats using SQLModel/SQLAlchemy.
46+
Update historical stats and track ethical Tone-Damping status.
4647
"""
4748
async with AsyncSessionLocal() as session:
4849
statement = select(UserHistory).where(UserHistory.user_id == user_id)
@@ -61,11 +62,20 @@ async def update_user_reliability(user_id: str, was_failure: bool):
6162
if was_failure:
6263
user.failed_commitments += 1
6364

65+
# Ethical Counter Management
66+
if tone_used in ["firm", "confrontational"]:
67+
user.consecutive_firm_interventions += 1
68+
user.last_intervention_at = datetime.now().isoformat()
69+
else:
70+
# Cooling-off logic: Reset counter if a supportive/neutral tone is successfuly used
71+
user.consecutive_firm_interventions = 0
72+
6473
# Calculate new score
6574
user.reliability_score = ((user.total_commitments - user.failed_commitments) / user.total_commitments) * 100
6675

6776
await session.commit()
68-
logger.info("reliability_updated", user_id=user_id, new_score=user.reliability_score)
77+
logger.info("reliability_updated", user_id=user_id, new_score=user.reliability_score, consecutive_strict=user.consecutive_firm_interventions)
78+
6979

7080
async def set_slack_id(user_id: str, slack_id: str):
7181
"""

src/worker.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,18 @@ async def process_commitment_eval(
5252
burnout = await brain.detect_burnout(check_in)
5353
logger.info("burnout_detected", user_id=user_id, risk=burnout.is_at_risk)
5454

55-
# 4. Fetch Historical Reliability (State-aware context)
56-
reliability, slack_id = await get_user_reliability(user_id)
55+
# 4. Fetch Historical Reliability & Ethical Tracking status
56+
reliability, slack_id, consecutive_firm = await get_user_reliability(user_id)
5757

58-
# 5. Final Decision & Tone Adaptation (Behavioral calibration)
58+
# 5. Final Decision & Tone Adaptation (Behavioral + Ethical calibration)
5959
decision = await brain.adapt_tone(
60-
excuse, risk, burnout, reliability_score=reliability
60+
excuse,
61+
risk,
62+
burnout,
63+
reliability_score=reliability,
64+
consecutive_firm_calls=consecutive_firm
6165
)
66+
6267
logger.info(
6368
"agent_decision",
6469
user_id=user_id,
@@ -67,9 +72,10 @@ async def process_commitment_eval(
6772
message=decision.message,
6873
)
6974

70-
# 6. Persist results for Heatmap tracking
75+
# 6. Persist results for Heatmap tracking & Ethical Cooling-off state
7176
is_failure = excuse.category != ExcuseCategory.LEGITIMATE
72-
await update_user_reliability(user_id, was_failure=is_failure)
77+
await update_user_reliability(user_id, was_failure=is_failure, tone_used=decision.tone)
78+
7379

7480
# 7. Accountability Logic: Proactive Follow-up
7581
# Triggered based on calculated risk thresholds

0 commit comments

Comments
 (0)