Issue 1:
From the docs:

This is a special field "group", that creates two identical fields whose values must match (or a validation error is thrown). The most common use is when you need the user to repeat their password or email to verify accuracy.

In other words, the form should not be valid if values are mismatched. But when a form is submitted with mismatched values in a repeated type Form::isValid returns true. No validation error is thrown, and the value from the repeated field is null. The null value seems to be expected, but why is the form a valid submission?

There is the correct error in Form::$transformationFailure but it doesn't seem to impact the form errors.

Here is a little silex app with a repeated field to illustrate.

If this is expected behavior feel free to close. If that is the case the docs need some work to clear up expectations about what the repeated type does.

Issue 2:
I was using Silex with Symfony 2.5.7. Form validation broke when I updated to version 2.6.0.

Here's the buildForm method defined for my PasswordResetType:

function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => $this->app['translator']->trans('form_errors.pass_must_match'),
'required' => true,
'first_options' => array(
'constraints' => array(
new Assert\NotBlank()
),
),
'second_options' => array(
'constraints' => array(
new Assert\NotBlank()
)
)
))
;
}
}

The Twig template associated to my form:

{{ form_start(form) }}
{{ form_widget(form._token) }}
{{ form_errors(form) }}

<div class="form-group">
{{ form_label(form.password.first, 'user.new_password'|trans, {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.password.first) }}
{{ form_widget(form.password.first, {'attr': {'class': 'form-control', 'placeholder' : 'user.new_password'|trans}}) }}
</div>

<div class="form-group">
{{ form_label(form.password.second, 'user.new_password_confirmation'|trans, {'label_attr': {'class': 'control-label'}}) }}
{{ form_errors(form.password.second) }}
{{ form_widget(form.password.second, {'attr': {'class': 'form-control', 'placeholder' : 'user.new_password_confirmation'|trans}}) }}
</div>
<button type="submit" class="btn btn-primary btn-block">{{'user.reset_password'|trans}}</button>
{{ form_end(form) }}

The associated controllers:

$app->get('/{_locale}/reset_password/{token}', function(Request $request, $token) use ($app) {
/* ... */

$form = $app['form.factory']->create(new PasswordResetType($app), array());

return $app['twig']->render('password_reset.twig', array(
'title' => 'Page title',
'form' => $form->createView()
));
})->bind('reset_password');

$app->post('/{_locale}/reset_password/{token}', function(Request $request, $token) use ($app) {
/* ... */

$form = $app['form.factory']->create(new PasswordResetType($app), array());

$form->handleRequest($request);

if ($form->isValid()) {
$data = $form->getData();

$password = $data['password']; // this is line 113

/* ... */
}
});

This generates the following error when passwords don't match: Error: ContextErrorException in controllers_users.php line 113: Notice: Undefined index: password. This indicates $form->isValid() returned true while it shouldn't have, since the passwords don't match.