GEMMA DEVELOPER AGENTSAVED EVIDENCE
← Dataset Exploration
ARCHIVED TRAINING / enthought/traits

enthought__traits-926

This is a preserved training example. Membership in the current training wave has not been verified.
enthought/traits · Task 66 of 169

Problem statement

on_trait_change: trailing comma in an extended name causes surprises
Decorating a `HasTraits` subclass method with `@on_trait_change('foo,bar,')` has the surprising side-effect of listening to everything. In most parts of Python, trailing commas are innocuous.

Example script:
```python
from traits.api import *

class A(HasTraits):
    foo = Int()
    bar = Int()
    baz = Int()

    @on_trait_change('foo,bar,')
    def _report_change(self, obj, name, old, new):
        print("{!r} trait changed from {!r} to {!r}".format(name, old, new))


a = A()
a.bar = 5  # expect a single notification; get two notifications
a.baz = 3  # expect no notification, but a notification occurs
```

On running this, I see the following output:
```
bash-4.4$ python bug.py 
'bar' trait changed from 0 to 5
'bar' trait changed from 0 to 5
'baz' trait changed from 0 to 3
```

With the trailing comma removed, I get:
```
bash-4.4$ python bug.py 
'bar' trait changed from 0 to 5
```

Labelling as a bug: even if this is working as intended behaviour (which seems possible), it's at least a usability bug, and I've seen it trip up newcomers on more than one occasion. I think we should fix this, even at the risk of possibly breaking existing code.

The fix I'd propose is making a trailing comma here an error: this would give a noisy early breakage for any projects that are intentionally or accidentally using this pattern, rather than the subtle late-discovered breakage that might occur if we simply allow the trailing comma but change the behaviour.

Training membership

opd_e4b_pure_v6b

Task issues extracted from preserved verified_rft_messages training examples. This is not a verified current RL wave manifest.

Task and snapshot provenance

Snapshot captured 2026-11-12T17:06:59.476467+00:00 · Autoresearch-Arena/gemma-4-developer-agent

{
  "datasets": [
    "opd_e4b_pure_v6b"
  ],
  "examples": 3,
  "instance_id": "enthought__traits-926",
  "problem_statement": "on_trait_change: trailing comma in an extended name causes surprises\nDecorating a `HasTraits` subclass method with `@on_trait_change('foo,bar,')` has the surprising side-effect of listening to everything. In most parts of Python, trailing commas are innocuous.\r\n\r\nExample script:\r\n```python\r\nfrom traits.api import *\r\n\r\nclass A(HasTraits):\r\n    foo = Int()\r\n    bar = Int()\r\n    baz = Int()\r\n\r\n    @on_trait_change('foo,bar,')\r\n    def _report_change(self, obj, name, old, new):\r\n        print(\"{!r} trait changed from {!r} to {!r}\".format(name, old, new))\r\n\r\n\r\na = A()\r\na.bar = 5  # expect a single notification; get two notifications\r\na.baz = 3  # expect no notification, but a notification occurs\r\n```\r\n\r\nOn running this, I see the following output:\r\n```\r\nbash-4.4$ python bug.py \r\n'bar' trait changed from 0 to 5\r\n'bar' trait changed from 0 to 5\r\n'baz' trait changed from 0 to 3\r\n```\r\n\r\nWith the trailing comma removed, I get:\r\n```\r\nbash-4.4$ python bug.py \r\n'bar' trait changed from 0 to 5\r\n```\r\n\r\nLabelling as a bug: even if this is working as intended behaviour (which seems possible), it's at least a usability bug, and I've seen it trip up newcomers on more than one occasion. I think we should fix this, even at the risk of possibly breaking existing code.\r\n\r\nThe fix I'd propose is making a trailing comma here an error: this would give a noisy early breakage for any projects that are intentionally or accidentally using this pattern, rather than the subtle late-discovered breakage that might occur if we simply allow the trailing comma but change the behaviour.",
  "repo": "enthought/traits",
  "source": "v2/experiments/train_data/opd_e4b_pure_v6b/verified_rft_messages.jsonl",
  "source_sha256": "0f62460a9706eea5e1605255896f191ab00cb5706c5f1f2e1c293e9a718218dc"
}
{
  "captured_at": "2026-11-12T17:06:59.476467+00:00",
  "membership": "archived training",
  "membership_evidence": "Task issues extracted from preserved verified_rft_messages training examples. This is not a verified current RL wave manifest.",
  "name": "Preserved post-training task archive",
  "source": "Autoresearch-Arena/gemma-4-developer-agent",
  "source_revision": "016496de222aaafca0d4ee4c18efc63ba616f76e",
  "sources": [
    {
      "path": "v2/experiments/train_data/opd_e4b_cispo_v5/verified_rft_messages.jsonl",
      "sha256": "a43610ad0dfb6ace95375cfae09000f41afc0338cc925af870a4ade7a9b20c4c"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_hybrid_v3/verified_rft_messages.jsonl",
      "sha256": "bd326303eb127e8e5e08f03daf97bb88d79d19709d59f3f93f348bc56686a8df"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_onpolicy_v3/verified_rft_messages.jsonl",
      "sha256": "960c680e797e823a0d3a22f4b1d5ef60a72971373d703b877340b0c9126aaf68"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v6a/verified_rft_messages.jsonl",
      "sha256": "f045b7ca5b3883a1e2eaee81e1c02a4a1b53dd7b7b36e98bacb2ba5823a15148"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v6b/verified_rft_messages.jsonl",
      "sha256": "0f62460a9706eea5e1605255896f191ab00cb5706c5f1f2e1c293e9a718218dc"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v7/verified_rft_messages.jsonl",
      "sha256": "e37f7bd675322f3f81500b73559d60d5f602ca0537bf19f5cb06332c728c7b72"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v7b/verified_rft_messages.jsonl",
      "sha256": "b864bdc8695183433eef6e31cb8d33fad44ba3aded2170c1ade4ad5b2944ce23"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_self_audit_v4/verified_rft_messages.jsonl",
      "sha256": "0026023745afb8f3dc1c176dc7f7171157b4ad5a66656b524af218e8e19ceee6"
    },
    {
      "path": "v2/experiments/train_data/rft_e4b_aligned_v2/verified_rft_messages.jsonl",
      "sha256": "92a4515fee9d152b0d4c510ee3ce4caaaffe2003ba7584469f8027f174aab18c"
    },
    {
      "path": "v2/experiments/train_data/rft_v1/verified_rft_messages.jsonl",
      "sha256": "a42453ccd7ac7680b0a03865e8e7080bc8bf74c8d9d193b440c441ed46f8512b"
    },
    {
      "path": "v2/experiments/train_data/rft_v2/verified_rft_messages.jsonl",
      "sha256": "18f4b3bd7e651f83c6acab479c9475e3fa50dc652a384f309e97146983ac85ba"
    }
  ]
}